Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 275
от 19.12.2005, 23:06

Администратор:Калашников О.А.
В рассылке:Подписчиков: 253, Экспертов: 39
В номере:Вопросов: 3, Ответов: 7


Вопрос № 31469: Здравствуйте. Неудаётся прочитать данные из файла функцией ReadFile. GetLastError возвращает ошибку: "Неверная попытка доступа к адресу памяти." Нужно всё содержимое файла затолкать в буфер, что не так? (делаю в BC 5)...
Вопрос № 31483: Здравствуйте!! Мне нужно в С++ под ДОС организовать таймер в миллисекундах. Есть ли какие-нибудь библиотечные функции по этому поводу или прийдется работать с прерываниями и асмовскими вставками??...
Вопрос № 31491: Привет всем! В универе задание получил разработать программу на борланде, а как делать - не знаю, всю голову уже сломал. Условия программы: "Падающий текст. Из текстового файла читаются символы, которые «сыплются» с правого верхнего угла...

Вопрос № 31.469
Здравствуйте.
Неудаётся прочитать данные из файла функцией ReadFile. GetLastError возвращает ошибку: "Неверная попытка доступа к адресу памяти."
Нужно всё содержимое файла затолкать в буфер, что не так?
(делаю в BC 5)

Приложение:

Отправлен: 14.12.2005, 15:33
Вопрос задал: nicholasal (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: estiGi
Здравствуйте, nicholasal!
Ты объявляешь указатель LPDWORD lpNumberOfBytesRead; и передаешь его в функцию. А куда по твоему запишутся данные? Указатель-то невалидный, непроинициализированый :) То же самое кстати и насчет буфера. Куда ты читать собираешься? Причем выводить в cout указатель на void как то странно :)))
Попробуй так :) -

DWORD NumberOfBytesRead;
char * buffer = NULL;
...
FileSi = GetFileSize(hFile,NULL);
buffer = new char [FileSi];
...
bResult = ReadFile (hFile,
(void*)buffer,
FileSi,
&NumberOfBytesRead,
NULL);
...
cout << buffer;
...
delete [] buffer;

низзя тупо копировать из МСДН
Ответ отправил: estiGi (статус: 9-ый класс)
Отправлен: 14.12.2005, 15:50
Оценка за ответ: 5
Комментарий оценки:
Конечно низзя, я для того чтобы копировать умно нуна знато что копируешь))

Отвечает: koshi
Здравствуйте, nicholasal!
Проблема в том, что объявив указатель на lpBuffer вы обявляете всего лишь указатель))) При поптыке записать по адресу, на кот. ссылается данный указатель разумеется происходит ошибка, потому что ссылается он черти куда) Короче нужно выделить память для данных и потом все будет чики-пики.
Просто добавь перед ReadFile
lpBuffer = new char[FileSi] и все будет круто.
---------
Don't worry by groovy
Ответ отправил: koshi (статус: 2-ой класс)
Отправлен: 14.12.2005, 18:05
Оценка за ответ: 4

Отвечает: RedDevil
Здравствуйте, nicholasal!

Естественно все правильно он говорит. А вы совершаете ошибку, прибегая к применению дурацкой венегерской нотации.
LPVOID lpBuffer = char * lpBuffer;
А потом вы в указатель пытаетесь запихнуть строку. Конечно ошибка. Нужно либо статически выделять память либо динамеcчки.

char * lpBuffer;
...
FileSi = GetFileSize(hFile,NULL);
lpBuffer = new char[FileSi+1];
ReadFile(hFile, lpBuffer, FileSi, &FileSi, NULL);
cout<<lpBuffer;
delete [] lpBuffer;

Другое дело, что LPVOID любой тип данных и туда можно запихать и int и double и все что угодно, но в данном случае, как я понял читаем текстовый файл, поэтому используем char.

Насчет венгерской нотации, как бы меня не убеждали, пользуюсь только HANDLE из них, в отличие от остальных переопределенных типов с ним действительно удобно и приятно работать. Все остальное привожу к стандартным типам, точнее использую вместо них, так как в них такие ошибки совершить сложнее. При чтении кода сразу внимание падает на "*", потому что это указатель и с ним надо работать аккуратно, а когда LP... только захламляют код и делают его менее читабельным. Это все мое ИМХО, на вкус и цвет товарщей нет.

Приложение:

Ответ отправил: RedDevil (статус: 2-ой класс)
Отправлен: 14.12.2005, 20:45
Оценка за ответ: 5

Отвечает: Raptor1
Здравствуйте, nicholasal!
lpNumberOfBytesRead должен указывать на реальную переменную,
поэтому надо добовить перед вызовом ReadFile строку
lpNumberOfBytesRead=&nNumberOfBytesToRead;
Ответ отправил: Raptor1 (статус: Студент)
Отправлен: 14.12.2005, 23:10
Оценка за ответ: 4


Вопрос № 31.483
Здравствуйте!!

Мне нужно в С++ под ДОС организовать таймер в миллисекундах. Есть ли какие-нибудь библиотечные функции по этому поводу или прийдется работать с прерываниями и асмовскими вставками??
Отправлен: 14.12.2005, 17:49
Вопрос задал: Orlando (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: PROD
Здравствуйте, Orlando!
как реализовать именно таймер незнаю, есть две (как минимум) функции для создания задержки. В принципе если взять цикл
for (int i=0;i<10;i++){
sleep(1);
}
то это и будет простейший таймер.
в приложении функции задержки времени

удачи, может кто что более разумное подскажет

Приложение:

Ответ отправил: PROD (статус: 1-ый класс)
Отправлен: 14.12.2005, 18:12

Отвечает: azat
Здравствуйте, Orlando!
Вот, надеюсь поможет:
http://sources.ru/cpp/tips/console_timer.shtml
Удачи!
Ответ отправил: azat (статус: 5-ый класс)
Отправлен: 14.12.2005, 23:11


Вопрос № 31.491
Привет всем!
В универе задание получил разработать программу на борланде, а как делать - не знаю, всю голову уже сломал.
Условия программы: "Падающий текст. Из текстового файла читаются символы, которые «сыплются» с правого верхнего угла экрана. Начальная скорость варьируется в некоторых пределах. Символы «отскакивают» от нижнего края экрана (неупругое соударение)."
Помогите реализовать, а то блин выкинут из универа :(

Приложение:

Отправлен: 14.12.2005, 19:41
Вопрос задал: Пахомов Антон Сергеевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: PROD
Здравствуйте, Пахомов Антон Сергеевич!
ты уж извени, но мы программу за тебя писать не будем.
задавай конкретные вопросы - может быть получишь конкретные ответы :)
Ответ отправил: PROD (статус: 1-ый класс)
Отправлен: 15.12.2005, 12:01


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное