Re[3]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 02.05.11 19:12
Оценка:
Здравствуйте, dilmah, Вы писали:

D>ни close ни flush не гарантируют запись.

D>fflush флашит буфера libc.
D>Для гарантии записи fsync

Задача: найти fsync для Visual Studio. Флаг FILE_FLAG_WRITE_THROUGH для CreateFile не предлагать.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: Неск. глупых вопросов
От: dilmah США  
Дата: 02.05.11 19:46
Оценка: +1
ГВ>То есть? Ты хочешь сказать, что fclose не сбрасывает буферы перед закрытием потока?

fclose сбрасывает буферы libc.
Буферы ОС и буферы самого диска -- нет.
Re[3]: Неск. глупых вопросов
От: Erop Россия  
Дата: 02.05.11 21:49
Оценка:
Здравствуйте, dilmah, Вы писали:

D>да не сбрасывает close ничего на диск (ну разве что в виндоуз какое-то спецповедение).


Есть ещё несколько промежуточных слоёв, на каждом из которых возможна буферизация.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Неск. глупых вопросов
От: Erop Россия  
Дата: 02.05.11 21:54
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Если это обычный (релизный) malloc, то значения могут быть абсолютно любыми.

ДД>При использовании отладочных версий malloc может заполнять распределяемую память каким-нибудь фиксированным значением, например 0xDEADBEEF.

В консольных прогах нет мышей. Из-за этого от запуска к запуску мусор может не отличаться...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 00:43
Оценка:
Здравствуйте, Erop, Вы писали:

E>В консольных прогах нет мышей. Из-за этого от запуска к запуску мусор может не отличаться...


Эммм. Не понял, какие мыши имеются ввиду
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 07:41
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Эммм. Не понял, какие мыши имеются ввиду


Компьютерные...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Неск. глупых вопросов
От: Sorc17 Россия  
Дата: 03.05.11 08:53
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> — Зачем необходимо закрывать файл?


MZ>Чтобы данные этого файла физически сохранились на диске. Если ты не закроешь

MZ>файл или не вызовиш для этого файла функцию flush(), запись файлов физически
MZ>на диск не гарантируется.
MZ>И по той же причине, что освобождать память -- файлы -- такой же ресурс, как
MZ>и память, кол-во файлов открытых в системе не бесконечно.

Добавлю. Не знаю как для Windows, но если в Linux этот файл — блокирующийся fifo, который служит для общения между двумя процессами, то не закрыв его вы можете подвесить процесс с другой стороны. А закрывая файл вы как бы говорите другому процессу "всем спасибо, все свободны".
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[5]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 09:02
Оценка:
Здравствуйте, Erop, Вы писали:

ДД>>Эммм. Не понял, какие мыши имеются ввиду


E>Компьютерные...


Тогда не ясно, какое отношение они имеют к распределению памяти.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 09:47
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Тогда не ясно, какое отношение они имеют к распределению памяти.


А про какие ясно?..

Обычно в GUI-based приложении ловится куча каких-то асинхронных сообщений, в первую очередь мышинных, они все обрабатываются, при этом могут происходить аллокации, и состояние кучи обычно возмущается. А в консольном приложении обычно всё стабильно от пуска к пуску...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: Неск. глупых вопросов
От: Sorc17 Россия  
Дата: 03.05.11 10:36
Оценка: +2
Здравствуйте, dilmah, Вы писали:


ГВ>>То есть? Ты хочешь сказать, что fclose не сбрасывает буферы перед закрытием потока?


D>fclose сбрасывает буферы libc.

D>Буферы ОС и буферы самого диска -- нет.

Сбрасывает не сбрасывает, суть того о чём идёт речь в том, что после fclose по идее должен срабатывать некий механизм завершения работы с файлом. В любой ОС

fopen
fwrite
fclose
fopen
fread

позволит прочитать из файла то, что в него было записано, а

fopen
fwrite
fread

не обязательно, потому что работа с файлом не была завершена.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[7]: Неск. глупых вопросов
От: ДимДимыч Украина http://klug.org.ua
Дата: 03.05.11 12:11
Оценка: :)
Здравствуйте, Erop, Вы писали:

ДД>>Тогда не ясно, какое отношение они имеют к распределению памяти.

E>А про какие ясно?..

Мало ли, может какие ментальные мыши, которые память грызут

E>Обычно в GUI-based приложении ловится куча каких-то асинхронных сообщений, в первую очередь мышинных, они все обрабатываются, при этом могут происходить аллокации, и состояние кучи обычно возмущается. А в консольном приложении обычно всё стабильно от пуска к пуску...


Ну я бы не стал рассчитывать на такие эффекты. Очень уж специфичные должны быть условия, чтобы наличие обработчиков асинхронных событий детерминированно влияло на состояние динамически выделяемой памяти.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[8]: Неск. глупых вопросов
От: Erop Россия  
Дата: 03.05.11 12:44
Оценка: +1
Здравствуйте, ДимДимыч, Вы писали:

ДД>Ну я бы не стал рассчитывать на такие эффекты. Очень уж специфичные должны быть условия, чтобы наличие обработчиков асинхронных событий детерминированно влияло на состояние динамически выделяемой памяти.


Тем не менее факт, при отладке проги с развитым GUI часто от запуска к запуску работа аллокаторов немного меняется. Из-за этого труднее воспроизводить ошибки, кстати...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Неск. глупых вопросов
От: YourLastSong  
Дата: 03.05.11 17:45
Оценка:
Спасибо за ответы.

Надеюсь, что я вам ещё не надоел, потому что я хотел бы задать вам ещё неск. вопросов.

— Что означает array<System::String ^> ^args? С int argc, char* argv[] и int argc, char **argv вроде как разобрался (насколько я понял, первое значение отвечает за кол-во параметров, которое было передано приложению, второе — это массив символов, из которых состоят данные параметры). Правильно?

— Правильно ли я понял, что даже в том случае, если тип возвращаемого значения у функции main () присутствует, то писать return 0 вовсе необязательно? Компилятор выдаёт сообщение, однако программа запускается и завершается точно так же, как и с return 0. Это грубая ошибка или такое делать можно?

— Почему убрали возможность писать примерно такое:

int value (a, b) int a, b;
{
c = a + b;
return c;
}

Разве это не было бы удобным в функции, где много раз пришлось бы писать int value (double a, double b, double c, double d) вместо int value (a, b, c, d) double a, b, c, d или как?

— Как можно сделать проверку на то, что пользователь вводит в переменную, например, типа int — число или символ?

— Можно ли изменять адрес ячейки памяти для переменных, которые уже были объявлены в программе? Где вообще можно более подробно почитать про адреса ячеек памяти и какие интересные свойства у них есть?

Заранее благодарю за возможные ответы.
Re[2]: Неск. глупых вопросов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.05.11 03:03
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>- Что означает array<System::String ^> ^args?


Это C++/CLI, ^ — ссылка на managed-объект. Очень сильно Microsoft-specific. Читай про .Net.

YLS>С int argc, char* argv[] и int argc, char **argv вроде как разобрался (насколько я понял, первое значение отвечает за кол-во параметров, которое было передано приложению, второе — это массив символов, из которых состоят данные параметры). Правильно?


Да. Эти параметры означают ровно то же самое, что и в программе на C.

YLS>- Правильно ли я понял, что даже в том случае, если тип возвращаемого значения у функции main () присутствует, то писать return 0 вовсе необязательно? Компилятор выдаёт сообщение, однако программа запускается и завершается точно так же, как и с return 0. Это грубая ошибка или такое делать можно?


В принципе, так делать можно, но не нужно. Код, возвращаемый из main может анализироваться запускающим процессом. Посмотри, например, здесь.

YLS>- Почему убрали возможность писать примерно такое:


YLS>int value (a, b) int a, b;

YLS>{
YLS>c = a + b;
YLS>return c;
YLS>}

YLS>Разве это не было бы удобным в функции, где много раз пришлось бы писать int value (double a, double b, double c, double d) вместо int value (a, b, c, d) double a, b, c, d или как?


"Архаичный стиль" объявления параметров не поддерживается в C++. Особых страданий по этому поводу никто, вроде, не испытывает (это я об удобстве).

YLS>- Как можно сделать проверку на то, что пользователь вводит в переменную, например, типа int — число или символ?


А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?

YLS>- Можно ли изменять адрес ячейки памяти для переменных, которые уже были объявлены в программе?


Адрес объекта поменять нельзя. Но можно сделать копию объекта, которая будет размещена по адресу, отличному от адреса исходного объекта.

YLS>Где вообще можно более подробно почитать про адреса ячеек памяти и какие интересные свойства у них есть?


"Ячейки памяти" в C++ — это то же самое, что и "ячейки памяти" C. Соответственно, никаких новых свойств у них не появилось, указатели в C++ имеют тот же самый смысл, что и в C.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Неск. глупых вопросов
От: YourLastSong  
Дата: 04.05.11 10:13
Оценка:
ГВ>А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?

Например, вот так:

int a;
cin >> a;
cout << a;
_getch ();

В данном случае пользователь может ввести абсолютно любое значение a, в том числе и символ. Как можно реализовать проверку и можно ли вообще?

Кстати, почему я так редко видел использование register перед указанием типа переменной, и почему вообще он не стоит изначально? Было бы ведь гораздо удобнее, я считаю, если бы он стоял у переменных изначально.
Re[4]: Неск. глупых вопросов
От: Chorkov Россия  
Дата: 04.05.11 12:38
Оценка:
Здравствуйте, YourLastSong, Вы писали:

ГВ>>А как ты бы сделал это на C? Остальные вопросы будут такими: как организован ввод данных и какова, вообще говоря, задача, которую ты решаешь?


YLS>Например, вот так:



YLS>int a;
YLS>cin >> a;
if(cin)
  YLS>cout << a;
else
  cerr<<"Error";
YLS>_getch ();


YLS>В данном случае пользователь может ввести абсолютно любое значение a, в том числе и символ. Как можно реализовать проверку и можно ли вообще?


YLS>Кстати, почему я так редко видел использование register перед указанием типа переменной, и почему вообще он не стоит изначально? Было бы ведь гораздо удобнее, я считаю, если бы он стоял у переменных изначально.


Компиляторы гораздо умнее чем ты дуваешь... Он и так, имеет право поместить в регистры почти любую переменую.
Практика показывает, что бездумное использование register только мешает оптимизатору.
Re[5]: Неск. глупых вопросов
От: YourLastSong  
Дата: 04.05.11 13:00
Оценка:
int a;
cin >> a;
if(cin)
cout << a;
else
cerr<<"Error";
_getch ();

В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".
Re[6]: Неск. глупых вопросов
От: vladtronko  
Дата: 15.05.11 12:34
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>int a;

YLS>cin >> a;
YLS>if(cin)
YLS>cout << a;
YLS>else
YLS>cerr<<"Error";
YLS>_getch ();

YLS>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


Берем шприц (cin), набираем в него крЭм (читаем значение из консоли например), и заполняем крЭмом пирожное (int a)...

А что проверяем то? if(шприц)? Дык это ж инструмент, и непростой, как там что проверять, да и зачем тебе это? if(a) было бы понятнее проверять, т.е. не равно ли случайно значение а нулю? А если надо проверить его "умещаемость" в заранее заданные пределы — то так и пишем if((крЭм > минимум) &&(крэм < максимум)) {пирожное заполнено нормально} else {варианты неправильного заполнения пирожного крЭмом}. Как-то так, чтоли
Re[6]: Неск. глупых вопросов
От: Centaur Россия  
Дата: 16.05.11 04:14
Оценка:
Здравствуйте, YourLastSong, Вы писали:

YLS>cin >> a;


YLS>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


Ошибка как бы намекает, что кто-то забыл какой-то #include. Вероятнее всего — <istream>. И нет, <iostream> включить недостаточно.
Re[7]: Неск. глупых вопросов
От: vladtronko  
Дата: 16.05.11 10:50
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, YourLastSong, Вы писали:


YLS>>cin >> a;


YLS>>В данном случае выдаётся ошибка "error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)".


C>Ошибка как бы намекает, что кто-то забыл какой-то #include. Вероятнее всего — <istream>. И нет, <iostream> включить недостаточно.


А не попытка приведения (cin) к boolean типу не срабатывает ли?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.