Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Странно, но почему-то не работает

Ответить
Настройки темы
Странно, но почему-то не работает

Старожил


Сообщения: 163
Благодарности: 0

Профиль | Отправить 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

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

-------
"Сколь бы сложной ни казалась проблема на первый взгляд, она, если правильно к ней подойти, окажется еще более сложной" - Пол Андерсон


Отправлено: 01:39, 03-12-2003 | #3


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

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

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

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 03:40, 03-12-2003 | #4


Старожил


Сообщения: 163
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

-------
"Сколь бы сложной ни казалась проблема на первый взгляд, она, если правильно к ней подойти, окажется еще более сложной" - Пол Андерсон


Отправлено: 04:08, 03-12-2003 | #5


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 05:26, 03-12-2003 | #6


Старожил


Сообщения: 163
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

-------
"Сколь бы сложной ни казалась проблема на первый взгляд, она, если правильно к ней подойти, окажется еще более сложной" - Пол Андерсон


Отправлено: 22:54, 03-12-2003 | #7


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 03:40, 04-12-2003 | #8

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 15:17, 08-12-2003 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Странно, но почему-то не работает

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
винт работает странно bruder Непонятные проблемы с Железом 12 15-11-2007 15:35
странно, но почему? E-mail Вебмастеру 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




 
Переход