|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Странно, но почему-то не работает |
|
Странно, но почему-то не работает
|
Старожил Сообщения: 163 |
Профиль | Отправить PM | Цитировать Пишу в Visual C++ 6.0 под Windows 2000. Точнее пытаюсь . Пока не совмещал еще. Так вот вроде достаточно простой код. Заполняю структуру нужными мне данным и запускаю.
Первая ошибка выполнения - Unhandling .... linfind .exe at 0xC00000005 На месте, где я копирую в structOPENFILENAME.lpstrFile значение * *cFileBase (эта переменная глобальная в пределах файла и объявлена как char cFileBase[]="c:\\base" Вторая ошибка при закомментированной первой строке заключается в том, что GetSaveFileName не реагирует. Присваиваю переменной значение, возвращаемое функцией, а потом поптыкта вывести его вызывают ту же ошибку, так же как и попытка вывести значение ошибки, которую я получаю вызывая GetLast/////забыл В Общем ошибка всегда одна и та же, из чего я делаю вывод, что непорядок затаился где-то в самом начале и вызван неправильным высвобождением памяти или ее резервированием. Только где? Вдруг кто использовал эту функцию или знает где рабочий пример лежит пжл дайте линк void CLinfindDlg::OnSetbasename() { *char cFilter[] = "*.TXT;*.*"; *char cTitle[] = "Выберете имя для базы данных файлов"; *OPENFILENAME structOPENFILENAME; *structOPENFILENAME.lpstrFilter = cFilter; *structOPENFILENAME.nMaxFile = 256; *strcpy ( structOPENFILENAME.lpstrFile, * *cFileBase ); *structOPENFILENAME.lpstrTitle = cTitle; *structOPENFILENAME.lpstrInitialDir = NULL; * *structOPENFILENAME. Flags = OFN_EXPLORER|OFN_CREATEPROMPT|OFN_ENABLESIZING| * * * * * * * * *OFN_LONGNAMES|OFN_NONETWORKBUTTON|OFN_NOREADONLYRETURN| * * * * *OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST|OFN_SHAREAWARE; int y; if ( GetSaveFileName( &structOPENFILENAME ) ) strcpy(cFileBase,structOPENFILENAME.lpstrFile); TRACE("y=%n",y); } [s]Исправлено: Crew, 22:23 4-12-2003[/s] |
|
------- Отправлено: 22:07, 03-05-2003 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Тот номер ошибки, который ты указал означает, что ты залез в чужую память. Сам подумай:
strcpy( "9 simbols", "12 symbols xxxxxxxxxx....." вылезет за пределы результата. sizeof("c:\\base" = 6! 1. используй lstrcpyn(LPSTR, LPSTR, int maxNumberOfBytes) 2. используй sizeof(dest)=MAX_FILENAME + 1 |
Отправлено: 16:11, 01-12-2003 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 163
|
Профиль | Отправить PM | Цитировать char *strcpy( char *strDestination, const char *strSource );
т.е. копирую я в первый параметр, а это указатель на char, который хранится в структуре, которую я объявляю статической переменной. Или я уже совсем все забыл и для строки, входящей в структурную переменную тоже надо память выделять? Напомните пожалуйста |
------- Отправлено: 01:39, 03-12-2003 | #3 |
Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать Crew
Это зависит от объявления твоей структуры. Если это что-то типа: struct myStruct { *... *char myStr[20]; *... }; , то при создании объекта структуры внутри него выделяется 20 байт под строку. А если так: struct myStruct { *... *char *myStr; *... }; , то внутри обекта выделяется место под адрес строки. И прежде, чем ее использовать, необходимо выделить нужное количество байт под строку. |
------- Отправлено: 03:40, 03-12-2003 | #4 |
Старожил Сообщения: 163
|
Профиль | Отправить PM | Цитировать Вот бяка, значит вылетало начиная со строки
structOPENFILENAME.lpstrFilter = cFilter; что-то я обленился после 1С не то что память выделять, а даже переменные описывать |
|
------- Отправлено: 04:08, 03-12-2003 | #5 |
Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать Crew
А что такое cFilter? Если тоже указатель на уже существующую строку, то здесь все в порядке. Если только память под нее была выделена динамически и после уничтожена, то пользоваться копией указателя уже нельзя. В таких случаях лучше всего пользоваться функцией strdup. Она и память выделяет под копию строки и указатель на нее возвращает. |
------- Отправлено: 05:26, 03-12-2003 | #6 |
Старожил Сообщения: 163
|
Профиль | Отправить PM | Цитировать shurikan
про strdup не знал, спасибо. а cFilter это из того участка кода, что я в первом сообщении написал. Появился новый вопрос. Оказывается есть функции, которых я не знаю. Когда этот стандарт успел появиться новый (для меня новый)? Вот так гляну иногда в MSDN, когда говорят есть такая-то функция, а там что-то новое, причем именно для операций с базовыми типами данных. Это от самого Visual C++ или все-таки уже новый стандарт? Если знаете, ответьте пожалуйста |
------- Отправлено: 22:54, 03-12-2003 | #7 |
Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать Crew
Насколько я знаю MS к strdup никакого отношения не имеет, она входит в библиотеки боьшинства (если не всех) C-компиляторов. |
------- Отправлено: 03:40, 04-12-2003 | #8 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Обосновываю своё утверждение:
char cFileBase[]="1234567" создаёт строку длиной 8 символов. Это почти то же самое, что char* cFileBase = new char[length("1234567"+1]; strcpy(cFileBase, "1234567" если сделать strcpy(cFileBase, "12345678", вы вылезете за границы cFileBase и повредите первый байт следующей структуры в памяти. |
Отправлено: 13:48, 08-12-2003 | #9 |
Старожил Сообщения: 240
|
Профиль | Отправить PM | Цитировать pva
Про strcpy никто не спорит. Я говорю о strdup. Она сама во всем разберется. |
------- Отправлено: 15:17, 08-12-2003 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
винт работает странно | bruder | Непонятные проблемы с Железом | 12 | 15-11-2007 15:35 | |
странно, но почему? | Вебмастеру | 7 | 13-07-2006 13:04 | ||
Странно работает autologon | DenchikK | Автоматическая установка Windows 2000/XP/2003 | 6 | 12-03-2005 02:48 | |
net send странно работает | Surround | Сетевые технологии | 2 | 29-01-2005 08:01 | |
Странно работает автоидентификация. | IRV | О сайте и форуме | 10 | 11-01-2004 10:50 |
|