![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| OlgaKor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.1.2003 Репутация: нет Всего: нет |
Помогите пожалуйста разобраться в следующей проблеме:
Есть диалоговое приложение. На компьютере, на котором оно было сделано, все отлично. На любых других компьютерах (вне зависимости от того, есть там С++ или нет) оно запускается, но потом при выполнении различных действий вылетает ошибка "Программа выполнила недопустимую опрецию и будет закрыта" (В Сведениях пишет, что сбой произошел при обращении к странице памяти в модуле MSVCRTD.DLL) Насколько я понимаю для скомпилированного модуля нужны 3 библиотеки: msvcrtd.dll, mfc42d.dll, mfco42d.dll. Я права? Скажите, в чем может быть дело? |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
А если установить среду разработки на другой комп есть ошибка?
А какие ОСи на компах? А ошибку выдает релиз или дебаг? -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
ошибка "Программа выполнила недопустимую опрецию и будет закрыта"
появляется может изза неправильной работы с памятью, например не создаеться окно, проверки этого нет, и далее по коду оно открывается - обращение к нулевой памяти. проверь код - все ли там учтено. на твоей машине может и вызывается какаято функция, а на другой надо проверить - успех или нет. выдать ошибку. |
|||
|
||||
| OlgaKor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.1.2003 Репутация: нет Всего: нет |
На компах с VС++ эта ошибка повторяется, ее нет только на моем компе. Системы разные - Wind-ы 98,2000,M, на все ошибка есть. При ошибке на компе со средой разработки предлагает дебагить и выдает asm.
|
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Чтобы узнать, какие именно библиотеки нужны для _твоей_ программы воспользуйся средствами, позволяющими посмотреть таблицу импорта, например программой showdep, там сразу будет видно, от каких dll твой файл зависит.
Чтобы найти ошибку влоб, принеси весь свой проект на комп, где ошибка вылетает, запусти и посмотри в отладчике когда выскочит асм, контекст ошибки, там как бы иерархия отображается, где именно ошибка вылетела, ну допустим в функции такой-то в библиотеке такой-то, а можно копнуть глубже, окажется, что эта функция была вызвана твоей программой в такой-то строчке, сразу всё станет понятнее. |
|||
|
||||
| Temnozor |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 134 Регистрация: 27.6.2002 Где: Тюмень Репутация: нет Всего: нет |
К сожалению, не права. На самом деле эти библиотеки тебе... не нужны. То есть совсем не нужны. На любом компьютере они уже есть, только... без буквы "d" на конце. Т.е. msvcrt.dll и т.д. Все дело в том, что эти файлы нужны только запуска отладочной версии программы (Debug). Откомпилируй Release-версию (путь в меню VC++ 6: Build\Set Active Configuration...) и ее уже копируй на другие компы. Впрочем, я не уверен, что это решит твою проблему. --------------------
Take a ride on, ride on, on your rotting horse on that deadly ground Take a ride, ride on, on your rotting horse with a pounding sound. |
|||
|
||||
| dim |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 106 Регистрация: 24.12.2002 Репутация: нет Всего: нет |
Однозначно это ошибка в твоей программе. Почему на твоем компе ее нет, а на других есть - вероятно в программе не учтены какие-то детали, которые имеют место на других компах и отсутсвуют на твоем (тут могут быть сотни причин - например жесткая привязка к кол-ву дисков, резервирование недостачоной области памяти под
что-то и т.д., можно перечислять долго, но тебе лучше знать). Как найти ошибку - простейший вариант если на том компе на котором падает, установлено Visual Studio, перенести туда проект и найти отладчиком. Второй вариант - это отладочные сообщения. --------------------
that's all |
|||
|
||||
| OlgaKor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.1.2003 Репутация: нет Всего: нет |
Всем огромное спасибо , ошибку устранила, как ни странно, но она оказалась в функции itoa().
Там, в качестве одного из параметров, я использлвала char*, а он требовал char. До сих пор не понимаю, почему у меня идут оба варианта, а на других компах только с char. И, вообще, расскажите (или скажите где можно прочитать) про работу со строковыми переменными в VC++ : разницу между const char, char, CString, char*, const char*, что такое strcpy(), и как конвертировать одно в другое, в каких случаях чем пользоваться. Например, в функциях типа itoa() и atoi() VC требует строгого соответствия с типом, описанном в MSDN, хотя по логике могут подходить и другие. |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Глобально: делим все функции на два типа: те, что работают с массивом символов (классика) и те, что работают с классом (от Microsoft это CString).
Там, где ты работаешь с массивом символов, ты должна заботиться о выделении, и очистке памяти если используешь динамическое выделение (например char *s=new char[25]), если работаешь с CString, то все проблемы с памятью решает он сам. Дальше при работе с массивами символов тебе придется использовать стандартные функции, для этого предназначеные типа strcpy, strdup, strcmp и т.п. При работе с CString нужно по возможности использовать его встроенные методы. Если пишешь на MSVC с использованием MFC, лучше использовать по возможности CString, если хочешь что-то сделать, не знаешь, как это делать в CString, не спеши переводить его в массив байтов и делать там, почитай документацию, может чего ни будь подходящее найдёшь. strcpy(b,a) копирует строку из массива символов b в массив символов a, при этом длина массива b должна быть не меньше длины массива a, иначе будет ошибка работы с памятью. Вообще когда не используешь CString, нужно следить за длинами строк и за тем, что бы в конце строки был нуль-терминатор '\0', он означает конец строки, если его нет, многие функции будут работать не правильно. Вообще char - это один символ, char * или char [] - массив символов, то есть массив симолов может представлять строку. const - это то, что не должно изменяться, поэтому в функции strcpy первый аргумент обычный, он будет изменен в результате копирования строки, второй - const потому что он остается не изменным - его копируют, он не меняется. const пишется не потому что ты обязана передать в роли аргумента константные параметр (можно передать и обычный), а чтобы четко тебе обозначить, что в результате работы функции эти данные не будут изменены. Что касается atoi - эта функция интерпретирует строку в число и возвращает то число, которое она смогла уловить в предложенной ей строке. Работает с целыми числами. atof - то же самое, но для дробных. Обратное конвертирование в стандартном С через fcvt сделано довольно неудобно и имеет кучу параметров, которые не всегда нужны, поэтому часто удобно воспользоваться другими способами для преобразования строки в число. Например функции sprintf (позволяет заполнить массив символов строкой, изображающей что либо, в том числе циферки, например sprintf(str,"%d",intVal), где str - массив символов char * или char [], intVal - целочисленная int переменная, %d - спец. код, указывающий функции на то, что сюда надо вставить число из дальнейших параметров. Для CString объекта аналогично можно воспользоваться методом CString::Format, например CString s; s.Format("единица: %d",1); даст тебе то, что в s окажется строка вида "единица: 1". |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Ой, очепятка вышла, извини, strcpy(b,a) наоборот копирует a в b
|
|||
|
||||
| OlgaKor |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 8.1.2003 Репутация: нет Всего: нет |
Все поняла, по ходу еще вопрос:
я бы с удовольствием всегда пользовалась CString, но например, в функции itoa(int, char *, int); средний параметр не может быть CString (пишет: cannot convert parameter 2 from 'class CString' to 'char') почему? И еще, что такое LPCTSTR. Заранее благодарно. (И спасибо SUBORQ за такое трудоемкое объяснение. Очень помогло) |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
Насчет проблем при конвертации CString в char - воспользуйся методом CString::GetBuffer, он возвращает тебе указатель на массив символов, представляющий собой то, что в этом стринге лежит, если в нем что-то изменить, то в стринге тоже изменится, удалять его не нужно, а в твоем случае ты можешь написать
CString s; itoa(чего-то там, s.GetBuffer(34), чего-то там); таким образом в s окажется число, показанное в виде строки. LPCSTR - это тип данных, придуманный Microsoft по правилам Венгерской нотации. Венгерская нотация - это когда в название вкладывают смысл при помощи аббривиатуры. LPCSTR расшифровывается как Long Pointer to a Char STRing, то есть длинный указатель на строку символов. Так вот, если переменная или аргумент имеет тип LPCSTR, значит это - по сути char * Еще венгерская нотация используется например в названиях переменных: szName - значит переменная содержит какое-то там имя в формате String terminated with Zero, то есть строка в виде массива символов, в конце которой стоит нуль-символ '\0' hWnd - значит переменная содержит Handle окна. Желаю успехов |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Сомневаюсь. Скорее Long Pointer to Const String. -------------------- Волны гасят ветер... |
|||
|
||||
| Vaulter |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1724 Регистрация: 30.12.2002 Где: бункер Репутация: 2 Всего: 22 |
suborg не LPCSTR, а LPCTSTR
|
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
По натуре
Спасибо за поправки. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |