Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск скомпилированного приложения на С++ 6.0 
:(
    Опции темы
OlgaKor
Дата 8.1.2003, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.1.2003

Репутация: нет
Всего: нет



Помогите пожалуйста разобраться в следующей проблеме:

Есть диалоговое приложение.
На компьютере, на котором оно было сделано, все отлично.
На любых других компьютерах (вне зависимости от того, есть там С++ или нет) оно запускается, но потом при выполнении различных действий вылетает ошибка "Программа выполнила недопустимую опрецию и будет закрыта" (В Сведениях пишет, что сбой произошел при обращении к странице памяти в модуле MSVCRTD.DLL)

Насколько я понимаю для скомпилированного модуля нужны 3 библиотеки: msvcrtd.dll, mfc42d.dll, mfco42d.dll. Я права?

Скажите, в чем может быть дело?
PM MAIL   Вверх
Baa
Дата 8.1.2003, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



А если установить среду разработки на другой комп есть ошибка?
А какие ОСи на компах?
А ошибку выдает релиз или дебаг?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vaulter
Дата 8.1.2003, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 2
Всего: 22



ошибка "Программа выполнила недопустимую опрецию и будет закрыта"
появляется может изза неправильной работы с памятью, например не создаеться окно, проверки этого нет, и далее по коду оно открывается - обращение к нулевой памяти. проверь код - все ли там учтено. на твоей машине может и вызывается какаято функция, а на другой надо проверить - успех или нет. выдать ошибку.


--------------------
PM MAIL WWW ICQ   Вверх
OlgaKor
Дата 9.1.2003, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.1.2003

Репутация: нет
Всего: нет



На компах с VС++ эта ошибка повторяется, ее нет только на моем компе. Системы разные - Wind-ы 98,2000,M, на все ошибка есть. При ошибке на компе со средой разработки предлагает дебагить и выдает asm.
PM MAIL   Вверх
suborg
Дата 9.1.2003, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Чтобы узнать, какие именно библиотеки нужны для _твоей_ программы воспользуйся средствами, позволяющими посмотреть таблицу импорта, например программой showdep, там сразу будет видно, от каких dll твой файл зависит.
Чтобы найти ошибку влоб, принеси весь свой проект на комп, где ошибка вылетает, запусти и посмотри в отладчике когда выскочит асм, контекст ошибки, там как бы иерархия отображается, где именно ошибка вылетела, ну допустим в функции такой-то в библиотеке такой-то, а можно копнуть глубже, окажется, что эта функция была вызвана твоей программой в такой-то строчке, сразу всё станет понятнее.
PM MAIL WWW ICQ   Вверх
Temnozor
Дата 10.1.2003, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 27.6.2002
Где: Тюмень

Репутация: нет
Всего: нет



Цитата(OlgaKor @ 08.1.2003, 02:28)
Насколько я понимаю для скомпилированного модуля нужны 3 библиотеки: msvcrtd.dll, mfc42d.dll, mfco42d.dll. Я права?

К сожалению, не права. На самом деле эти библиотеки тебе... не нужны. То есть совсем не нужны. На любом компьютере они уже есть, только... без буквы "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.
PM   Вверх
dim
Дата 11.1.2003, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 24.12.2002

Репутация: нет
Всего: нет



Однозначно это ошибка в твоей программе. Почему на твоем компе ее нет, а на других есть - вероятно в программе не учтены какие-то детали, которые имеют место на других компах и отсутсвуют на твоем (тут могут быть сотни причин - например жесткая привязка к кол-ву дисков, резервирование недостачоной области памяти под
что-то и т.д., можно перечислять долго, но тебе лучше знать). Как найти ошибку - простейший вариант если на том компе на котором падает, установлено Visual Studio, перенести туда проект и найти отладчиком. Второй вариант - это отладочные сообщения.
--------------------
that's all
PM MAIL   Вверх
OlgaKor
Дата 12.1.2003, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.1.2003

Репутация: нет
Всего: нет



Всем огромное спасибо , ошибку устранила, как ни странно, но она оказалась в функции itoa().
Там, в качестве одного из параметров, я использлвала char*, а он требовал char.  
До сих пор не понимаю, почему у меня идут оба варианта, а на других компах только с char.
И, вообще, расскажите (или скажите где можно прочитать) про работу со строковыми переменными в VC++ : разницу между  const char, char, CString, char*, const char*, что такое strcpy(), и как конвертировать одно в другое, в каких случаях чем пользоваться. Например, в функциях типа itoa() и atoi() VC требует строгого соответствия с типом, описанном в MSDN, хотя по логике могут подходить и другие. :hehe
PM MAIL   Вверх
suborg
Дата 13.1.2003, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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".
PM MAIL WWW ICQ   Вверх
suborg
Дата 13.1.2003, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



Ой, очепятка вышла, извини, strcpy(b,a) наоборот копирует a в b
PM MAIL WWW ICQ   Вверх
OlgaKor
Дата 13.1.2003, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.1.2003

Репутация: нет
Всего: нет



Все поняла, по ходу еще вопрос:
я бы с удовольствием всегда пользовалась CString, но например, в функции itoa(int, char *, int); средний параметр не может быть
CString (пишет: cannot convert parameter 2 from 'class CString' to 'char')
почему?
И еще, что такое LPCTSTR.
Заранее благодарно.
(И спасибо SUBORQ за такое трудоемкое объяснение. Очень помогло)
PM MAIL   Вверх
suborg
Дата 13.1.2003, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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 окна.

Желаю успехов :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 13.1.2003, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
Long Pointer to a Char STRing


Сомневаюсь. Скорее Long Pointer to Const String.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Vaulter
Дата 13.1.2003, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 2
Всего: 22



suborg не LPCSTR, а LPCTSTR


--------------------
PM MAIL WWW ICQ   Вверх
suborg
Дата 14.1.2003, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



По натуре :)))
Спасибо за поправки.
PM MAIL WWW ICQ   Вверх
OlgaKor
Дата 14.1.2003, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.1.2003

Репутация: нет
Всего: нет



Всем еще раз спасибо и спасибо.
Понимаете,  уже где-то два года пишу на Fox-е, а тут диплом случился, и говорят: "Не гоже какие-то там базы данных к методам оптимизации применять. Все-таки генетические алгоритмы, а не отгрузки\загрузки\таблички вам какие-нибудь". Но пересаживаться с Fox-a на Си. Ох, если бы вы знали каково (хотя собственно, наверное знаете), как с самоката на самолет. Так что, с понятиями: венгерская нотация, указатели и даже классы - знакома, но вот детали (хотя может это и основа) остались для меня пока закрытыми. Поэтому всем спасибо за помощь, если бы не вы - рыться мне и рыться в этом MSDN. Таком понятном там, где ты все знаешь, и таком туманном там, где ни черта не понимаешь. Это было лирическое отступление (уж очень благодарна, даже не ожидала). Думаю мои вопросы на этом не закончатся. Спасибо
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.