Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Странно, но почему-то не работает (http://forum.oszone.net/showthread.php?t=30105)

Crew 03-05-2003 22:07 207278

Пишу в 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]

pva 01-12-2003 16:11 207279

Тот номер ошибки, который ты указал означает, что ты залез в чужую память. Сам подумай:
strcpy( "9 simbols", "12 symbols xxxxxxxxxx.....") вылезет за пределы результата. sizeof("c:\\base") = 6!

1. используй lstrcpyn(LPSTR, LPSTR, int maxNumberOfBytes)
2. используй sizeof(dest)=MAX_FILENAME + 1

Crew 03-12-2003 01:39 207280

char *strcpy( char *strDestination, const char *strSource );
т.е. копирую я в первый параметр, а это указатель на char, который хранится в структуре, которую я объявляю статической переменной. Или я уже совсем все забыл и для строки, входящей в структурную переменную тоже надо память выделять? Напомните пожалуйста

shurikan 03-12-2003 03:40 207281

Crew
Это зависит от объявления твоей структуры. Если это что-то типа:
struct myStruct
{
*...
*char myStr[20];
*...
};

, то при создании объекта структуры внутри него выделяется 20 байт под строку.
А если так:
struct myStruct
{
*...
*char *myStr;
*...
};

, то внутри обекта выделяется место под адрес строки. И прежде, чем ее использовать, необходимо выделить нужное количество байт под строку.:)

Crew 03-12-2003 04:08 207282

Вот бяка, :biglaugh: значит вылетало начиная со строки
structOPENFILENAME.lpstrFilter = cFilter;
что-то я обленился после 1С не то что память выделять, а даже переменные описывать :)

shurikan 03-12-2003 05:26 207283

Crew
А что такое cFilter? Если тоже указатель на уже существующую строку, то здесь все в порядке. Если только память под нее была выделена динамически и после уничтожена, то пользоваться копией указателя уже нельзя. В таких случаях лучше всего пользоваться функцией strdup. Она и память выделяет под копию строки и указатель на нее возвращает. :)

Crew 03-12-2003 22:54 207284

shurikan
про strdup не знал, спасибо.
а cFilter это из того участка кода, что я в первом сообщении написал.
Появился новый вопрос. Оказывается есть функции, которых я не знаю. Когда этот стандарт успел появиться новый (для меня новый)? Вот так гляну иногда в MSDN, когда говорят есть такая-то функция, а там что-то новое, причем именно для операций с базовыми типами данных. Это от самого Visual C++ или все-таки уже новый стандарт? Если знаете, ответьте пожалуйста

shurikan 04-12-2003 03:40 207285

Crew
Насколько я знаю MS к strdup никакого отношения не имеет, она входит в библиотеки боьшинства (если не всех) C-компиляторов.:)

pva 08-12-2003 13:48 207286

Обосновываю своё утверждение:

char cFileBase[]="1234567"

создаёт строку длиной 8 символов. Это почти то же самое, что

char* cFileBase = new char[length("1234567")+1];
strcpy(cFileBase, "1234567");

если сделать
strcpy(cFileBase, "12345678"), вы вылезете за границы cFileBase и
повредите первый байт следующей структуры в памяти.

shurikan 08-12-2003 15:17 207287

pva
Про strcpy никто не спорит. Я говорю о strdup. Она сама во всем разберется.:)


Время: 03:33.

Время: 03:33.
© OSzone.net 2001-