Войти

Показать полную графическую версию : Странно, но почему-то не работает


Crew
03-05-2003, 22:07
Пишу в 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);
}



Исправлено: Crew, 22:23 4-12-2003

pva
01-12-2003, 16:11
Тот номер ошибки, который ты указал означает, что ты залез в чужую память. Сам подумай:
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
char *strcpy( char *strDestination, const char *strSource );
т.е. копирую я в первый параметр, а это указатель на char, который хранится в структуре, которую я объявляю статической переменной. Или я уже совсем все забыл и для строки, входящей в структурную переменную тоже надо память выделять? Напомните пожалуйста

shurikan
03-12-2003, 03:40
Crew
Это зависит от объявления твоей структуры. Если это что-то типа:
struct myStruct
{
*...
*char myStr[20];
*...
};
, то при создании объекта структуры внутри него выделяется 20 байт под строку.
А если так:
struct myStruct
{
*...
*char *myStr;
*...
};
, то внутри обекта выделяется место под адрес строки. И прежде, чем ее использовать, необходимо выделить нужное количество байт под строку.:)

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

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

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

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

pva
08-12-2003, 13:48
Обосновываю своё утверждение:

char cFileBase[]="1234567"

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

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

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

shurikan
08-12-2003, 15:17
pva
Про strcpy никто не спорит. Я говорю о strdup. Она сама во всем разберется.:)




© OSzone.net 2001-2012