![]() |
Пишу в Visual C++ 6.0 под Windows 2000. Точнее пытаюсь :). Пока не совмещал еще. Так вот вроде достаточно простой код. Заполняю структуру нужными мне данным и запускаю.
Первая ошибка выполнения - Unhandling .... linfind .exe at 0xC00000005 На месте, где я копирую в structOPENFILENAME.lpstrFile значение * *cFileBase (эта переменная глобальная в пределах файла и объявлена как char cFileBase[]="c:\\base") Вторая ошибка при закомментированной первой строке заключается в том, что GetSaveFileName не реагирует. Присваиваю переменной значение, возвращаемое функцией, а потом поптыкта вывести его вызывают ту же ошибку, так же как и попытка вывести значение ошибки, которую я получаю вызывая GetLast/////забыл В Общем ошибка всегда одна и та же, из чего я делаю вывод, что непорядок затаился где-то в самом начале и вызван неправильным высвобождением памяти или ее резервированием. Только где? Вдруг кто использовал эту функцию или знает где рабочий пример лежит пжл дайте линк Код:
void CLinfindDlg::OnSetbasename() [s]Исправлено: Crew, 22:23 4-12-2003[/s] |
Тот номер ошибки, который ты указал означает, что ты залез в чужую память. Сам подумай:
strcpy( "9 simbols", "12 symbols xxxxxxxxxx.....") вылезет за пределы результата. sizeof("c:\\base") = 6! 1. используй lstrcpyn(LPSTR, LPSTR, int maxNumberOfBytes) 2. используй sizeof(dest)=MAX_FILENAME + 1 |
char *strcpy( char *strDestination, const char *strSource );
т.е. копирую я в первый параметр, а это указатель на char, который хранится в структуре, которую я объявляю статической переменной. Или я уже совсем все забыл и для строки, входящей в структурную переменную тоже надо память выделять? Напомните пожалуйста |
Crew
Это зависит от объявления твоей структуры. Если это что-то типа: struct myStruct { *... *char myStr[20]; *... }; , то при создании объекта структуры внутри него выделяется 20 байт под строку. А если так: struct myStruct { *... *char *myStr; *... }; , то внутри обекта выделяется место под адрес строки. И прежде, чем ее использовать, необходимо выделить нужное количество байт под строку.:) |
Вот бяка, :biglaugh: значит вылетало начиная со строки
structOPENFILENAME.lpstrFilter = cFilter; что-то я обленился после 1С не то что память выделять, а даже переменные описывать :) |
Crew
А что такое cFilter? Если тоже указатель на уже существующую строку, то здесь все в порядке. Если только память под нее была выделена динамически и после уничтожена, то пользоваться копией указателя уже нельзя. В таких случаях лучше всего пользоваться функцией strdup. Она и память выделяет под копию строки и указатель на нее возвращает. :) |
shurikan
про strdup не знал, спасибо. а cFilter это из того участка кода, что я в первом сообщении написал. Появился новый вопрос. Оказывается есть функции, которых я не знаю. Когда этот стандарт успел появиться новый (для меня новый)? Вот так гляну иногда в MSDN, когда говорят есть такая-то функция, а там что-то новое, причем именно для операций с базовыми типами данных. Это от самого Visual C++ или все-таки уже новый стандарт? Если знаете, ответьте пожалуйста |
Crew
Насколько я знаю MS к strdup никакого отношения не имеет, она входит в библиотеки боьшинства (если не всех) C-компиляторов.:) |
Обосновываю своё утверждение:
char cFileBase[]="1234567" создаёт строку длиной 8 символов. Это почти то же самое, что char* cFileBase = new char[length("1234567")+1]; strcpy(cFileBase, "1234567"); если сделать strcpy(cFileBase, "12345678"), вы вылезете за границы cFileBase и повредите первый байт следующей структуры в памяти. |
pva
Про strcpy никто не спорит. Я говорю о strdup. Она сама во всем разберется.:) |
Время: 03:33. |
Время: 03:33.
© OSzone.net 2001-