| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Запуск скомпилированного приложения на С++ 6.0 |
| Автор: OlgaKor 8.1.2003, 08:28 |
| Помогите пожалуйста разобраться в следующей проблеме: Есть диалоговое приложение. На компьютере, на котором оно было сделано, все отлично. На любых других компьютерах (вне зависимости от того, есть там С++ или нет) оно запускается, но потом при выполнении различных действий вылетает ошибка "Программа выполнила недопустимую опрецию и будет закрыта" (В Сведениях пишет, что сбой произошел при обращении к странице памяти в модуле MSVCRTD.DLL) Насколько я понимаю для скомпилированного модуля нужны 3 библиотеки: msvcrtd.dll, mfc42d.dll, mfco42d.dll. Я права? Скажите, в чем может быть дело? |
| Автор: Baa 8.1.2003, 09:52 |
| А если установить среду разработки на другой комп есть ошибка? А какие ОСи на компах? А ошибку выдает релиз или дебаг? |
| Автор: Vaulter 8.1.2003, 17:22 |
| ошибка "Программа выполнила недопустимую опрецию и будет закрыта" появляется может изза неправильной работы с памятью, например не создаеться окно, проверки этого нет, и далее по коду оно открывается - обращение к нулевой памяти. проверь код - все ли там учтено. на твоей машине может и вызывается какаято функция, а на другой надо проверить - успех или нет. выдать ошибку. |
| Автор: OlgaKor 9.1.2003, 09:20 |
| На компах с VС++ эта ошибка повторяется, ее нет только на моем компе. Системы разные - Wind-ы 98,2000,M, на все ошибка есть. При ошибке на компе со средой разработки предлагает дебагить и выдает asm. |
| Автор: suborg 9.1.2003, 09:26 |
| Чтобы узнать, какие именно библиотеки нужны для _твоей_ программы воспользуйся средствами, позволяющими посмотреть таблицу импорта, например программой showdep, там сразу будет видно, от каких dll твой файл зависит. Чтобы найти ошибку влоб, принеси весь свой проект на комп, где ошибка вылетает, запусти и посмотри в отладчике когда выскочит асм, контекст ошибки, там как бы иерархия отображается, где именно ошибка вылетела, ну допустим в функции такой-то в библиотеке такой-то, а можно копнуть глубже, окажется, что эта функция была вызвана твоей программой в такой-то строчке, сразу всё станет понятнее. |
| Автор: Temnozor 10.1.2003, 23:19 | ||
К сожалению, не права. На самом деле эти библиотеки тебе... не нужны. То есть совсем не нужны. На любом компьютере они уже есть, только... без буквы "d" на конце. Т.е. msvcrt.dll и т.д. Все дело в том, что эти файлы нужны только запуска отладочной версии программы (Debug). Откомпилируй Release-версию (путь в меню VC++ 6: Build\Set Active Configuration...) и ее уже копируй на другие компы. Впрочем, я не уверен, что это решит твою проблему. |
| Автор: dim 11.1.2003, 00:57 |
| Однозначно это ошибка в твоей программе. Почему на твоем компе ее нет, а на других есть - вероятно в программе не учтены какие-то детали, которые имеют место на других компах и отсутсвуют на твоем (тут могут быть сотни причин - например жесткая привязка к кол-ву дисков, резервирование недостачоной области памяти под что-то и т.д., можно перечислять долго, но тебе лучше знать). Как найти ошибку - простейший вариант если на том компе на котором падает, установлено Visual Studio, перенести туда проект и найти отладчиком. Второй вариант - это отладочные сообщения. |
| Автор: OlgaKor 12.1.2003, 23:16 |
| Всем огромное спасибо , ошибку устранила, как ни странно, но она оказалась в функции itoa(). Там, в качестве одного из параметров, я использлвала char*, а он требовал char. До сих пор не понимаю, почему у меня идут оба варианта, а на других компах только с char. И, вообще, расскажите (или скажите где можно прочитать) про работу со строковыми переменными в VC++ : разницу между const char, char, CString, char*, const char*, что такое strcpy(), и как конвертировать одно в другое, в каких случаях чем пользоваться. Например, в функциях типа itoa() и atoi() VC требует строгого соответствия с типом, описанном в MSDN, хотя по логике могут подходить и другие. |
| Автор: suborg 13.1.2003, 03:01 |
| Глобально: делим все функции на два типа: те, что работают с массивом символов (классика) и те, что работают с классом (от 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 13.1.2003, 03:02 |
| Ой, очепятка вышла, извини, strcpy(b,a) наоборот копирует a в b |
| Автор: OlgaKor 13.1.2003, 03:39 |
| Все поняла, по ходу еще вопрос: я бы с удовольствием всегда пользовалась CString, но например, в функции itoa(int, char *, int); средний параметр не может быть CString (пишет: cannot convert parameter 2 from 'class CString' to 'char') почему? И еще, что такое LPCTSTR. Заранее благодарно. (И спасибо SUBORQ за такое трудоемкое объяснение. Очень помогло) |
| Автор: suborg 13.1.2003, 06:21 |
| Насчет проблем при конвертации 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 13.1.2003, 13:12 | ||
Сомневаюсь. Скорее Long Pointer to Const String. |
| Автор: Vaulter 13.1.2003, 13:51 |
| suborg не LPCSTR, а LPCTSTR |
| Автор: suborg 14.1.2003, 04:24 |
| По натуре Спасибо за поправки. |
| Автор: OlgaKor 14.1.2003, 08:37 |
| Всем еще раз спасибо и спасибо. Понимаете, уже где-то два года пишу на Fox-е, а тут диплом случился, и говорят: "Не гоже какие-то там базы данных к методам оптимизации применять. Все-таки генетические алгоритмы, а не отгрузки\загрузки\таблички вам какие-нибудь". Но пересаживаться с Fox-a на Си. Ох, если бы вы знали каково (хотя собственно, наверное знаете), как с самоката на самолет. Так что, с понятиями: венгерская нотация, указатели и даже классы - знакома, но вот детали (хотя может это и основа) остались для меня пока закрытыми. Поэтому всем спасибо за помощь, если бы не вы - рыться мне и рыться в этом MSDN. Таком понятном там, где ты все знаешь, и таком туманном там, где ни черта не понимаешь. Это было лирическое отступление (уж очень благодарна, даже не ожидала). Думаю мои вопросы на этом не закончатся. Спасибо |