Неполадки с exe фаилом
Если я ее компилирую в среде Builder-а, все работает нормально. Но если запускаю этот же эгзешник,с того же места, в не Builder то работает не совсем так как надо. Хотя и не выдает исключений, и не виснет. В начале идет все нормально, а потом перепыгивает через ряд операций, и выдает конечный результат.
Если можете подскажите, пожалусто, в чем причина. Возможна какято ошибка линковки?
Я написал довольно большую программу.
Если я ее компилирую в среде Builder-а, все работает нормально. Но если запускаю этот же эгзешник,с того же места, в не Builder то работает не совсем так как надо. Хотя и не выдает исключений, и не виснет. В начале идет все нормально, а потом перепыгивает через ряд операций, и выдает конечный результат.
Если можете подскажите, пожалусто, в чем причина. Возможна какято ошибка линковки?
Такие темы лучше создавать в "Юморе". Там оценят.
Такие темы лучше создавать в "Юморе". Там оценят.
Спасибо тебе за совет. В юмористическом форуме он был бы весьма актуален. Но я нуждаюсь в совете, который помог бы мне решить мою задачу, и она мне отнють не кажется смешной.
Спасибо тебе за совет. В юмористическом форуме он был бы весьма актуален. Но я нуждаюсь в совете, который помог бы мне решить мою задачу, и она мне отнють не кажется смешной.
совет отличный. если ты хочешь, чтобы тебе помогли, сформулируй по человечески вопрос. пока - он годится только в "Юмор". или в раздел "Как не надо задавать вопросы"
совет отличный. если ты хочешь, чтобы тебе помогли, сформулируй по человечески вопрос. пока - он годится только в "Юмор". или в раздел "Как не надо задавать вопросы"
Моя программа считывает с диска фаилы объем которых около 500 кб, разжимает их в оперативке до 3.7 Мбаит, и на основе этих данных строит карты. Так вот, когда я открываю последовательно фаилы они нормально открываются, что со среды билдера, что в небилдера. В любом количестве.
Если я задаю автоматическое последовательное, открытие 5 и более фаилов,(на подобие AVI), и запускаю с билдера(F9), то все работает нормально. Последовательно открывается любое заданное количество фаилов. Но если запускаю в не билдера(сам запускаю exe), то идет открытие нескольких фаилов(3-4), потом происходит искожении формы, через некоторое время открывается последний фаил (промежуточные не отоброжаются).
Не мого понять в чем тут дело. На утечку памяти не похоже. Ни чего не перемищал. Думаю что проблема в процессе линковки. Возможно в опциях настроил что-то не так.
За ранее благодарен всем кто хотя бы попытается мне помочь.
Моя программа считывает с диска фаилы объем которых около 500 кб, разжимает их в оперативке до 3.7 Мбаит, и на основе этих данных строит карты. Так вот, когда я открываю последовательно фаилы они нормально открываются, что со среды билдера, что в небилдера. В любом количестве.
Если я задаю автоматическое последовательное, открытие 5 и более фаилов,(на подобие AVI), и запускаю с билдера(F9), то все работает нормально. Последовательно открывается любое заданное количество фаилов. Но если запускаю в не билдера(сам запускаю exe), то идет открытие нескольких фаилов(3-4), потом происходит искожении формы, через некоторое время открывается последний фаил (промежуточные не отоброжаются).
Не мого понять в чем тут дело. На утечку памяти не похоже. Ни чего не перемищал. Думаю что проблема в процессе линковки. Возможно в опциях настроил что-то не так.
За ранее благодарен всем кто хотя бы попытается мне помочь.
lol :)
Перед загрузкой следующего файла - проверяй загрузился ли предыдущий или устанавливай задержку или установи события. Скорее всего у тебя просто происходит наложение.
lol :)
Перед загрузкой следующего файла - проверяй загрузился ли предыдущий или устанавливай задержку или установи события. Скорее всего у тебя просто происходит наложение.
Спасибо тебе за ответ.
Я попробовал поставить задержку функцией Sleep, но это не изменило ситуации. Хотя я зодержку ставил до полутора секунд. Да в принципе там такой нюанс, что в билдере, как я уже говорил идет нормально.
У меня еще подозрения на один из классов. У меня в програмке созданна иерархия классов форм и карт, т.е создан базовый класс TFBaseMap, и наследующие ему классы канкретных карт (формы на которых происходит везуальная реализация, конкретных карт).И класс TMap, в наследующих ему классах произходит расчеты конкретных карт.
У меня в программе предусмотренна возможность, открытия до 4 карт одновременно, поэтому я вынужден был создать еще один сомостоятельный класс- диспетчер, т.е он задает размер окон для открытых карт, месторасположение на экране и т.д.
Именно он и вызывает у меня подозрение:
//--------------------------------------------
vArrayOfMap- вектор в котором содержатся укозатели на открытые в данный момент карты.
void TWindows :: OnCreate(TFBaseMap* BaseMap)
{
if(vArrayOfMap.size()< 4)
{
GetSizeOfWindows(BaseMap);
}
}
//-------------------------------------------
void TWindows :: OnClose(TFBaseMap* BaseMap)
{
for(UINT i=0; i<vArrayOfMap.size(); i++)
{
if(vArrayOfMap == BaseMap)
vArrayOfMap.erase(vArrayOfMap.begin()+i);
}
GetSizeOfWindows(NULL);
}
void TWindows:: GetSizeOfWindows(TFBaseMap* BaseMap)
{
if(BaseMap != 0)
vArrayOfMap.push_back(BaseMap);
int s = vArrayOfMap.size();
switch(s)
{
case 0: vArrayOfMap.clear(); break;
case 1:
if(BaseMap != 0)
vArrayOfMap[0] = BaseMap;
vArrayOfMap[0]->BorderStyle = bsSizeable;
vArrayOfMap[0]->Align = alClient;
vArrayOfMap[0]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[0]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
break;
case 2:
if(BaseMap != 0)
vArrayOfMap[1] = BaseMap;
vArrayOfMap[0]->BorderStyle = bsSizeToolWin;
vArrayOfMap[1]->BorderStyle = bsSizeToolWin;
vArrayOfMap[1]->Align = alNone;
vArrayOfMap[0]->Align = alNone;
vArrayOfMap[1]->Left = FAsuMRL->Width;
vArrayOfMap[1]->Top = 0;
vArrayOfMap[1]->Height = Screen->Height*0.5;
vArrayOfMap[1]->Width = Screen->Width - FAsuMRL->Width;
vArrayOfMap[0]->Left = FAsuMRL->Width;
vArrayOfMap[0]->Top = Screen->Height*0.5;
vArrayOfMap[0]->Height = vArrayOfMap[1]->Height;
vArrayOfMap[0]->Width = vArrayOfMap[1]->Width;
vArrayOfMap[0]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[0]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
break;
case 3:
if(BaseMap != 0)
vArrayOfMap[2] = BaseMap;
vArrayOfMap[0]->BorderStyle = bsSizeToolWin;
vArrayOfMap[1]->BorderStyle = bsSizeToolWin;
vArrayOfMap[2]->BorderStyle = bsSizeToolWin;
vArrayOfMap[0]->Align = alNone;
vArrayOfMap[1]->Align = alNone;
vArrayOfMap[2]->Align = alNone;
vArrayOfMap[2]->Left = FAsuMRL->Width;
vArrayOfMap[2]->Top = 0;
vArrayOfMap[2]->Width = Screen->Width - FAsuMRL->Width;
vArrayOfMap[2]->Height = Screen->Height * 0.5;
vArrayOfMap[0]->Left = FAsuMRL->Width;
vArrayOfMap[0]->Top = Screen->Height*0.5;
vArrayOfMap[0]->Height = Screen->Height*0.5;
vArrayOfMap[0]->Width = (Screen->Width - FAsuMRL->Width)*0.5;
vArrayOfMap[1]->Left = vArrayOfMap[0]->Width + FAsuMRL->Width;
vArrayOfMap[1]->Top = Screen->Height*0.5;
vArrayOfMap[1]->Height = Screen->Height*0.5;
vArrayOfMap[1]->Width = (Screen->Width - FAsuMRL->Width)*0.5;
vArrayOfMap[0]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[0]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[2]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[2]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
break;
case 4:
if(BaseMap != 0)
vArrayOfMap[3] = BaseMap;
vArrayOfMap[0]->BorderStyle = bsSizeToolWin;
vArrayOfMap[1]->BorderStyle = bsSizeToolWin;
vArrayOfMap[2]->BorderStyle = bsSizeToolWin;
vArrayOfMap[3]->BorderStyle = bsSizeToolWin;
vArrayOfMap[0]->Align = alNone;
vArrayOfMap[1]->Align = alNone;
vArrayOfMap[2]->Align = alNone;
vArrayOfMap[3]->Align = alNone;
vArrayOfMap[0]->Left = FAsuMRL->Width;
vArrayOfMap[0]->Top = 0;
vArrayOfMap[0]->Height = Screen->Height*0.5;
vArrayOfMap[0]->Width = (Screen->Width - FAsuMRL->Width)*0.5;
vArrayOfMap[1]->Left = FAsuMRL->Width + vArrayOfMap[0]->Width;
vArrayOfMap[1]->Top = 0;
vArrayOfMap[1]->Height = Screen->Height * 0.5;
vArrayOfMap[1]->Width = vArrayOfMap[0]->Width;
vArrayOfMap[2]->Left = FAsuMRL ->Width;
vArrayOfMap[2]->Top = Screen->Height * 0.5;
vArrayOfMap[2]->Width = vArrayOfMap[0]->Width;
vArrayOfMap[2]->Height = vArrayOfMap[0]->Height;
vArrayOfMap[3]->Left = FAsuMRL->Width + vArrayOfMap[0]->Width;
vArrayOfMap[3]->Top = vArrayOfMap[2]->Top;
vArrayOfMap[3]->Width = vArrayOfMap[2]->Width;
vArrayOfMap[3]->Height = vArrayOfMap[2]->Height;
vArrayOfMap[0]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[0]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[1]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[2]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[2]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
vArrayOfMap[3]->ScrollBox1->VertScrollBar->Range= 26*GridS;
vArrayOfMap[3]->ScrollBox1->HorzScrollBar->Range= 26*GridS;
break;
}
}
//--------------------------------------------
void TWindows :: OnSinhrMshtb()
{
int PositionX;
int PositionY;
for(int i=0; i<vArrayOfMap.size(); i++)
{
if(vArrayOfMap->Active == true)
{
PositionX= vArrayOfMap->ScrollBox1->HorzScrollBar->Position;
PositionY= vArrayOfMap->ScrollBox1->VertScrollBar->Position;
}
}
for(int i=0; i<vArrayOfMap.size(); i++)
{
vArrayOfMap->ScrollBox1->HorzScrollBar->Position= PositionX;
vArrayOfMap->ScrollBox1->VertScrollBar->Position= PositionY;
}
}
//------------------------------------------
void TWindows :: OnIncrMshtb()
{
for(int i=0; i<vArrayOfMap.size(); i++)
{
if(vArrayOfMap != 0)
{
vArrayOfMap->ScrollBox1->VertScrollBar->Range = 27*GridS;
vArrayOfMap->ScrollBox1->HorzScrollBar->Range = 27*GridS;
vArrayOfMap->ScrollBox1->VertScrollBar->Position *=2;
vArrayOfMap->ScrollBox1->HorzScrollBar->Position *=2;
vArrayOfMap->ScrollBox1->VertScrollBar->Position +=vArrayOfMap->ScrollBox1->Height/2;
vArrayOfMap->ScrollBox1->HorzScrollBar->Position +=vArrayOfMap->ScrollBox1->Width/2;
vArrayOfMap->PaintBox->Repaint();
}
}
}
//--------------------------------------------
void TWindows :: OnDecrMshtb()
{
for(int i=0; i<vArrayOfMap.size(); i++)
{
if(vArrayOfMap != 0)
{
vArrayOfMap->ScrollBox1->VertScrollBar->Range = 27*GridS;
vArrayOfMap->ScrollBox1->HorzScrollBar->Range = 27*GridS;
vArrayOfMap->ScrollBox1->VertScrollBar->Position /=2;
vArrayOfMap->ScrollBox1->HorzScrollBar->Position /=2;
vArrayOfMap->ScrollBox1->VertScrollBar->Position -=vArrayOfMap->ScrollBox1->Height/4;
vArrayOfMap->ScrollBox1->HorzScrollBar->Position -=vArrayOfMap->ScrollBox1->Width/4;
vArrayOfMap->PaintBox->Repaint();
}
}
}
//------------------------------------------
int TWindows:: GetNmbrOfMap()
{
return vArrayOfMap.size();
}
//----------------------------------------------void TWindows:: OnManyFilesOpen( AnsiString FileName)
{
for(int i=0; i<vArrayOfMap.size(); i++)
{
\\
pData->ZapisInArrayOfOtr(FileName.c_str());
pMap->CreateMapVectors();
vArrayOfMap->OnShow(NULL);
}
}
//----------------------------------------------
void TWindows:: OnWanFileOpen()
{
for(int i=0; i<vArrayOfMap.size(); i++)
vArrayOfMap->OnShow(NULL);
//вызывает SectionCreate() и AllFileDraw() для каждой открытой карты
}
Как вы видите в некоторых функциях в качестве входного параметра задается укозатель на базовый класс, а это не совсем хорошо.
Если я в настроиках устонавливаю Relese и компелирую, то при изменении масштаба
выдает сообшение об ошибке. А при FallDebug нет.
Но по любому при запуске в не билдера при обращении к ManyFilesOpen происходит то о чем я говорил.
Мне сложно что либо посоветовать тебе - потому что я не знаю на чем базировался ты когда создавал проект, требования и т.д., но по приведенному коду у меня есть пару замечаний. Во первых, самое главное - вот этот момент:
vArrayOfMap[0] = BaseMap;[/color]
vArrayOfMap[0]->BorderStyle = bsSizeable;
vArrayOfMap[0]->Align = alClient;
...
т.е. если BaseMap равно NULL что будет?
Второе - ну это в принципе не замечание, скорее предрассудок :) - если case должно выполнять более чем одно действие - я предпочитаю заключать этот участок в фигурные скобки . Т.е.
if(BaseMap != 0)
vArrayOfMap[0] = BaseMap;
...
break;
}
по крайней мере мне приходилось сталкиваться с абсолютно неоправданными глюками именно в борланде.
Ну и второе замечание - если данный класс должен выполнять функции менеджера - я бы не стал передавать ему вектор. Во первых это нафиг не надо (по крайней мере, такой вывод можно сделать из приведенного кода), ведь его задача - вывод конкретного объекта - нафига ему весь вектор? Передавай ему указатель на базовый класс - или создай его как шаблон - все зависит от твоего опыта - и пусть работает с конкретным обектом - выводит его в окна и т.д..
Естественно - чистка массива - тоже не к нему.
Ну и третье - раздели загрузку и графику. Определи отдельный класс-загрузчик. И не используй Sleep - это не басик :) Я на твоем бы месте считал бы названия файлов куда-нибудь, и создал бы что нибудь типа стека(очереди) - т.е. загрузил бы минимум необходимых файлов и по мере необходимости дочитывал бы с диска по заданному событию (сообщению, семафору - нуное выбери).
Естественно все вышенаписанное исключительно ИМХО, за исключением первого абзаца :), и к применению не обязательно.
Будь добр - не стесняйся использовать средства форматирования для кода - ничего сложного нет, а читать чужой код все же немного проще.
Мне сложно что либо посоветовать тебе - потому что я не знаю на чем базировался ты когда создавал проект, требования и т.д., но по приведенному коду у меня есть пару замечаний. Во первых, самое главное - вот этот момент:
vArrayOfMap[0] = BaseMap;[/color]
vArrayOfMap[0]->BorderStyle = bsSizeable;
vArrayOfMap[0]->Align = alClient;
...
т.е. если BaseMap равно NULL что будет?
Второе - ну это в принципе не замечание, скорее предрассудок :) - если case должно выполнять более чем одно действие - я предпочитаю заключать этот участок в фигурные скобки . Т.е.
if(BaseMap != 0)
vArrayOfMap[0] = BaseMap;
...
break;
}
по крайней мере мне приходилось сталкиваться с абсолютно неоправданными глюками именно в борланде.
Ну и второе замечание - если данный класс должен выполнять функции менеджера - я бы не стал передавать ему вектор. Во первых это нафиг не надо (по крайней мере, такой вывод можно сделать из приведенного кода), ведь его задача - вывод конкретного объекта - нафига ему весь вектор? Передавай ему указатель на базовый класс - или создай его как шаблон - все зависит от твоего опыта - и пусть работает с конкретным обектом - выводит его в окна и т.д..
Естественно - чистка массива - тоже не к нему.
Ну и третье - раздели загрузку и графику. Определи отдельный класс-загрузчик. И не используй Sleep - это не басик :) Я на твоем бы месте считал бы названия файлов куда-нибудь, и создал бы что нибудь типа стека(очереди) - т.е. загрузил бы минимум необходимых файлов и по мере необходимости дочитывал бы с диска по заданному событию (сообщению, семафору - нуное выбери).
Естественно все вышенаписанное исключительно ИМХО, за исключением первого абзаца :), и к применению не обязательно.
Спасибо тебе за ответ.
С твоего раздрешения, я начну отвечать со второго вопроса. Вектор я передаю, потому что может быть открыто несколько карт, нужно чтобы они при открытии и закрытии перераспределялись на экране. И любые деиствия, применялись сразу ко всем открытым картам. (Увелечени масштаба, уменш. масштаба, синхронизация, перераспределение).
Функция GetSizeOfWindows(TFBaseMap* BaseMap), принимет указатель на базовый класc(BaseMap) карту, с учетом этого происходит перераспределение на экране. Если принимает значение NULL, это происходит при закрытии одной из карт- OnClose(TFBaseMap* BaseMap), происходит удолениеиз вектора, карты и происходит перераспределение оставшихся карт, на экране.
Графика и загрузка у меня так-же разделена. В классе TData у меня происходит считывание, с фаила и разжатие в оперативку. В производных класу TMap, классах происходит расчет карт. В производных классу TFBaseMap, происходит прорисовка карт.
Фаилы у меня добовляются в определеную деректорию каждые 3 минуты, которые сразу же отображаются в ChekListBox, откуда я с ними и работаю. Имено в нем я и задаю цикл, открытия фаилов.Т.е отмечаю птичками фаилы которые должны по очередно открываться. У меня SDI приложение, поэтому мне и нобходим класс диспетчера, который и вызывает у меня подозрения.
При компеляции выдает [Link Error] Akses violation. Link terminated.
И [Link Warning] Unable to perform incremental link-performing full link…
При опциях Release- при некоторых опирациях выдает сообщение “Access violation
At address 00405A03 in module (моя програмка). Read of address 190002F4”.
Спасибо тебе за ответ.
С твоего раздрешения, я начну отвечать со второго вопроса. Вектор я передаю, потому что может быть открыто несколько карт, нужно чтобы они при открытии и закрытии перераспределялись на экране.
...
У меня SDI приложение, поэтому мне и нобходим класс диспетчера, который и вызывает у меня подозрения.
При компеляции выдает [Link Error] Akses violation. Link terminated.
И [Link Warning] Unable to perform incremental link-performing full link…
При опциях Release- при некоторых опирациях выдает сообщение “Access violation
At address 00405A03 in module (моя програмка). Read of address 190002F4”.
Я опять же подчеркиваю - все сказанное ИМХО - хотябы потому, что только ты знаешь почему делал только так :)
Но мне кажется - для работы на самом деле тебе масив не нужен. Тебе нужны координаты относительно которого располагается текущий - и собственно текущий объект - это что касается этого класса. Класс диспечера не должен управлять выводом - он должен уведомлять остальные объекты (потоки?), о том что работа может быть возобновлена (остановлена, окно перерисовано). И все. Если это у тебя действительно класс-диспечер. А код который привел ты, говорит почти по пушкину - "Смешались в кучу кони, люди ..." :) и вобщем то неудивительно что у тебя появляются ошибки доступа к памяти. Удивительно что программа вобще работает :)
Я бы на твоем месте сделал следующее - простым русским языком описал последовательность действий - и ты сам заметишь, где у тебя ошибки. Они проявятся там - где невозможно будет внятно и однозначно определить что здесь происходит. А ошибки при некоторых операциях скорее вылетают по причине которую я указал в предыдущем посте красным цветом.
Я опять же подчеркиваю - все сказанное ИМХО - хотябы потому, что только ты знаешь почему делал только так :)
Но мне кажется - для работы на самом деле тебе масив не нужен. Тебе нужны координаты относительно которого располагается текущий - и собственно текущий объект - это что касается этого класса. Класс диспечера не должен управлять выводом - он должен уведомлять остальные объекты (потоки?), о том что работа может быть возобновлена (остановлена, окно перерисовано). И все. Если это у тебя действительно класс-диспечер. А код который привел ты, говорит почти по пушкину - "Смешались в кучу кони, люди ..." :) и вобщем то неудивительно что у тебя появляются ошибки доступа к памяти. Удивительно что программа вобще работает :)
Я бы на твоем месте сделал следующее - простым русским языком описал последовательность действий - и ты сам заметишь, где у тебя ошибки. Они проявятся там - где невозможно будет внятно и однозначно определить что здесь происходит. А ошибки при некоторых операциях скорее вылетают по причине которую я указал в предыдущем посте красным цветом.
Спасибо за ответ.:)
Я проанализировал все сказанное тобой,и провел анализ своей программы, в результате я пришол к выводу что Ты, не вник в суть проблемы.:)
Принцип взаимодействия состовных частей своей программы я описал в прошлый раз, тама же ответы на замечания ( для чего мне нужен вектор, и почему я без него не могу обойтись, и на выделенное красным цветом). Я вижу что ты хороший программист, но возможно тебе просто лень читать все что я тебе пишу.:)
Прошу тебя поытаться вникнуть в суть дела. У тебя наверняка большой опыт программирования, и ты не мог не сталкиваться с подобного рода сообщениями. В каких случаях они появляются?
Спасибо за ответ.:)
Я проанализировал все сказанное тобой,и провел анализ своей программы, в результате я пришол к выводу что Ты, не вник в суть проблемы.:)
Принцип взаимодействия состовных частей своей программы я описал в прошлый раз, тама же ответы на замечания ( для чего мне нужен вектор, и почему я без него не могу обойтись, и на выделенное красным цветом). Я вижу что ты хороший программист, но возможно тебе просто лень читать все что я тебе пишу.:)
Прошу тебя поытаться вникнуть в суть дела. У тебя наверняка большой опыт программирования, и ты не мог не сталкиваться с подобного рода сообщениями. В каких случаях они появляются?
Естественно не всегда есть время анализировать и разбирать чужой код.
Может и не вник. Может и не заметил существенного. Опиши еще раз - или приведи прошлие ответы - из всего вышесказанного(просто мне приходится часто работать с STL и файлами), мне пока не понятно, во первых - почему так нужно делать, во вторых - причин для ошибки в приведенном тобой коде достаточно - у меня к примеру, возникли бы вопросы если бы код работал. :) То что он не работает - это нормально, твой стиль программирования недопустим с точки зрения языка.
Как бы там ни было, неоднозначностей у тебя возникает очень много - т.е. код потенциально небезопасен (хотя бы те фрагменты что отмечены).
По поводу того что ты возражал - так диспечеру все равно, скоко карт открыто - в твоем коде он может работать ТОЛЬКО С ОДНОЙ - потому смысл совать ему массив - если он с ним в принципе работать не может? Карта то одна - которую он обрабатывает???? Понятно что их может быть много - но реально класс диспечера работает с одной!!!!! Он же не в потоке их обрабатывает, не последовательно, и твой код это ясно демострирует. И отсюда и ошибки - ты посути не проверяешь - есть ли данный элемент массива, и что с ним происходит.
что это за глюк в алгоритме на форуме??
РЕРЕРЕРЕРЕРЕ...:D
ну, у человека-то ведь все работает через отладку??
значит может быть не в организации дело..
Мурат, попробуй скомпилить ехе-файл ПОЛНОСТЬЮ..
т.е. в настройках проекта сними флаг с Build with runtime packages.. может покатит..
________________
что это за глюк в алгоритме на форуме??
РЕРЕРЕРЕРЕРЕ...:D
ну, у человека-то ведь все работает через отладку??
значит может быть не в организации дело..
Мурат, попробуй скомпилить ехе-файл ПОЛНОСТЬЮ..
т.е. в настройках проекта сними флаг с Build with runtime packages.. может покатит..
Угу. Прочти молитвы, окропи святой водой, спляши шаманский танец.
Falcao - первый раз предупредил через ПМ - второй раз сейчас +++++++++++.
________________
что это за глюк в алгоритме на форуме??
РЕРЕРЕРЕРЕРЕ...:D
ну, у человека-то ведь все работает через отладку??
значит может быть не в организации дело..
Мурат, попробуй скомпилить ехе-файл ПОЛНОСТЬЮ..
т.е. в настройках проекта сними флаг с Build with runtime packages.. может покатит..
Спасибо за ответ.
Я, делал то что ты мне посоветовал но не помогает.:)
Скажи пожалусто если знаеш в каих случаях возникает предупреждение
[Link Error] Akses violation. Link terminated.
И [Link Warning] Unable to perform incremental link-performing full link
и исключение
“Access violation At address 00405A03 in module (моя програмка). Read of address 190002F4”.
Естественно не всегда есть время анализировать и разбирать чужой код.
Может и не вник. Может и не заметил существенного. Опиши еще раз - или приведи прошлие ответы - из всего вышесказанного(просто мне приходится часто работать с STL и файлами), мне пока не понятно, во первых - почему так нужно делать, во вторых - причин для ошибки в приведенном тобой коде достаточно - у меня к примеру, возникли бы вопросы если бы код работал. :) То что он не работает - это нормально, твой стиль программирования недопустим с точки зрения языка.
Как бы там ни было, неоднозначностей у тебя возникает очень много - т.е. код потенциально небезопасен (хотя бы те фрагменты что отмечены).
По поводу того что ты возражал - так диспечеру все равно, скоко карт открыто - в твоем коде он может работать ТОЛЬКО С ОДНОЙ - потому смысл совать ему массив - если он с ним в принципе работать не может? Карта то одна - которую он обрабатывает???? Понятно что их может быть много - но реально класс диспечера работает с одной!!!!! Он же не в потоке их обрабатывает, не последовательно, и твой код это ясно демострирует. И отсюда и ошибки - ты посути не проверяешь - есть ли данный элемент массива, и что с ним происходит.
Спасибо за ответ.
Я исправил то что Ты, выделял красным цветом, -т.е теперь в GetSizeOfWindows() не чего не передается, но это не как не отразилось на работе мей программы.
Я может быть не достаточно хорошо объяснил, что это за клас и какие он должен выполнять функции, это класс не совсем тот диспетчер как Ты это понимаеш.:)
Я его так условрно назвал , ибо у него имеются сходства с диспетчером, в надежде что эта аналогия прояснит картиную.:)
Фактически это класс работы с окнами, поэтому он и называется TWindows;
Для чего он мне нужен?!
1-При отккрытии новой карты, она занимает свое положениие на экране автоматически а следовательно должна проходить перегрупперовка, уже существующих окон(Все окна должны в сумме занимать экран полностью).
Поэтому я создаю вектор, в котором содержаться ссылки на все открытые карты (не более 4).
void TWindows :: OnCreate(TFBaseMap* BaseMap)
{
if(vArrayOfMap.size()< 4)
{
vArrayOfMap.push_back(FBaseMap);
GetSizeOfWindows();
}
}
в GetSizeOfWindous- задается размер окна и его расположение на экранею
2-При закрытии одной из карт -опять-же происходит перегрупперовка оставшихся карт.
Для Этого из массива удаляется карта и опять же вызывется GetSizeOfWindous.
void TWindows :: OnClose(TFBaseMap* BaseMap)
{
for(UINT i=0; i<vArrayOfMap.size(); i++)
{
if(vArrayOfMap == BaseMap)
vArrayOfMap.erase(vArrayOfMap.begin()+i);
}
GetSizeOfWindows();
}
Это деиствие говорит, функции что просто надо перегрупперовать оставшиеся карты на экране.
Помоги мне избавится от этого злополучного класса.
Скажи пожалусто если знаеш в каих случаях возникает предупреждение
[Link Error] Akses violation. Link terminated.
И [Link Warning] Unable to perform incremental link-performing full link
и исключение
“Access violation At address 00405A03 in module (моя програмка). Read of address 190002F4”.
Может быть созать по этому поводу новую тему?
Уфф... Ребят, хватит, я уже смеяться устал... murat777, да у тебя талант!!! Меня даже не обломило прочесть каждый твой пост от и до. Ладно... Косяк у тебя в том, что ты где-то обращаешься по неинициализированному указателю к некоторому блоку данных. В энвайронменте у тебя всё канает, потому, что старый добрый отладчик оказывает медвежью услугу - обнуляет все используемые тобой данные, в том числе и этот указатель. Затем где-нибудь в программе ты проверяешь: if (p == NULL) {... return, к примеру ...}. Вот и получили: под дебагером у тебя всё работает, а вне дебагера уже никто этот указатель обнулять не будет. И будет храниться в этом указателе хз что (и вряд ли это будет NULL). Программа проходит дальше, пытается прочесть данные через указатель - и вот тебе нарушение защиты памяти (Access violation). ВСЕГДА ИНИЦИАЛИЗИРУЙ УКАЗАТЕЛИ ПРИ СОЗДАНИИ! Если нету пока для него канкретного значения - обнуляй! int * p = NULL - трудно, что ли? И всегда обращай внимание на ВСЕ ворнинги и хотя бы пытайся понять их смысл. Не продолжай разработку проекта, если хоть один ворнинг остался неликвидированным
Спасибо за ответ.
Проблему с AcseesViolation заключалась не в том что я не обнулял указатель,
а в векторе(скорее недоработка Buildera), когда я перенес функции уменшения и увеличения
масштаба, в базовый класс TFBaseMap, и компилировал с опциями Release то выдовало то самое сообщение AcsessViolation.
Я чисто случайно, переберая уже всевозможные варианты, помнял обращение к элементу вектору, с vArrayOfMap на vArrayOfMap.at(i)
и теперь это исключение не возникает.:)
Но проблема с которой я начинал тему, как была так и осталась.:)
При поочередном открытии и отображении фаилов, (на подобии AVI), со среды Buildera все работает нормально, открывается поочередно любое количество файлов, но если я запускаю в не среды, то открываются несколько
файлов потом происходит искажение форм(края становятся белыми, и выходят немного наружу), идет внутренний пересчет
и открывется последний файл.
Да к стати у меня возникла еще одна проблема, если это можно назвать проблемой.
Интуиция мне подсказывает что в этом вопросе Ты сумееш мне помочь.
При передаче фаилов через сокеты, c одного компа на другой, я использую очень нехороший
но необходимый класс, TFileStream у меня все работает нормально, но я боюсь у меня идет утечка памяти, ибо на клиенте
я не удоляю объект класса ТFileStream. А не удоляю я его потому, что если, я его удоляю то возникает исключение. Хотя на сервере
спокоино удоляю, объект этого же класса. Я подумал может быть проблема в обнуление указателей, но нет. Возможно при удалении
объекта этого класса на серваке он автомотически удаляет его на клиенте? Посоветуй пожалусто как мне быть.
Собшения при удолении с клиента оператором delete;
Project Conection Raised Exception EAcsessViolation и т.д
Приэтом в любом случае выдовал предупреждения при компиляции.
Програмка отдельная.
[Linker Error] Fatal: Access violation. Link terminated.
[Linker Warning] Unable to perform incremental link - performing full link...
[Linker Warning] Public symbol 'operator delete(void *)' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CG32.LIB|delete and C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MT.LIB|del
[Linker Warning] Public symbol 'operator new[](unsigned int)' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CG32.LIB|newa and C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MT.LIB|newarray
[Linker Warning] Public symbol 'operator delete[](void *)' defined in both module C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CG32.LIB|deletea and C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MT.LIB|delarray
Выложи фрагмент кода с созданием и удалением TFileStream. Ворнинги говорят о том, что в какой-то из библиотек у тебя переопределяются операторы new и delete. Может быть проблема в этом. И ещё меня сильно смущают [Linker Error] Fatal: Access violation. Link terminated и [Linker Warning] Unable to perform incremental link - performing full link... Отчего может выскочить первая ошибка - ума не приложу. А вторая говорит о том, что невозможно было выполнить инкрементиальный линк (суть его в том, чтобы не перелинковывать заново весь проект, а линковать отдельными кусками - скорость компоновки увеличивается раз в десять). Где-то ты, наверное, намутил со свойствами проекта. И поодключай всё лишнее (я об C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CG32.LIB и т. п.). А ещё сделай rebuild, и посмотри, не стало ли меньше ворнингов (всё-таки не пойму, откуда Access violation при компоновке?!)
Спасибо за ответ.
Меня также смущяет эта ошибка. Она у меня и в главной прогамме повторяется.
Но главная программа у меня деиствительно довольно большая, там возможно где то я
и пропустил ошибку. Но здесь не должно буть.Хотя как не странно та работае более стабильно.
Возможно у меня Builder моросит?
Или я его не грамотно как то утанавливаю? Или WinXP глючит?
Build All Project деиствительно убрал
[Linker Error] Fatal: Access violation. Link terminated.
[Linker Warning] Unable to perform incremental link - performing full link...
Но остальные так и остались. Там как мне кажится в програмке происходит какое то смещение.
Т.к при подключение DialUp и при его вызове, он иногда выплывал при нажатии не той кнопки.
А сеичас вообше не выплывает, мне пришлось обходится без него, по краиней мере,
пока не разбирусь с основными проблемами.:)
Да обрташаю твое внимание что если работает как сервак то все удоляется нормально. Программа одна для сервака, и клиента.
Поэтому не привожу код сервака, и общий код.
__fastcall TFConection::TFConection(TComponent* Owner)
: TForm(Owner)
{
FStrClient=NULL;
FStrServer=NULL;
TIniFile* Ini = new TIniFile(GetCurrentDir()+"\\IniInet.ini");
itsDirectory=Ini->ReadString("Directory","itsDirectory", "D:\\Radar\\Send");
itsServer= Ini->ReadString("Adress", "IPAdress", "192.168.0.73");
delete Ini;
Ini=0;
}
//Client
//---------------------------------------------------------------------------
void __fastcall TFConection::ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
MenuSend->Enabled=true;
TBSend->Enabled=true;
FConection->TBConDiscon->ImageIndex=1;
FConection->TBConDiscon->Hint="Соединение с удаленным компьютером";
FConection->StatusBar1->Panels->Items[0]->Text = "Соединение с: " + Socket->RemoteHost;
}
//---------------------------------------------------------------------------
void __fastcall TFConection::ClientSocketDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
FileListenItemClick(NULL);
}
//---------------------------------------------------------------------------
void __fastcall TFConection::ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
ErrorCode = 0;
TBConDisconClick(NULL);
}
//-----------------------------------------
void __fastcall TFConection::Timer1Timer(TObject *Sender)
{
ffblk F1;
//находит первый фаил в каталоге itsPath
String Dir=itsDirectory+"\\*.*";
if(findfirst(Dir.c_str(), &F1, 0) == 0)
{
Timer1->Enabled=false;
TBSend->Enabled=false;
MenuSend->Enabled=true;
String FName=AnsiString(F1.ff_name);
itsFileName=itsDirectory+"\\"+FName;
try{
[COLOR=crimson] FStrClient= new TFileStream(itsFileName, fmOpenRead);[/COLOR]
FStrClient->Position=0;
int s= FStrClient->Size;
ClientSocket->Socket->SendText(IntToStr(s)+";"+FName);
Label1->Caption=FName;
Time1=Time();
}
catch(...)
{
delete FStrClient;
FStrClient=NULL;
ClientSocket->Socket->SendText("Error");
}
}
findclose(&F1);
TBSend->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TFConection::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Text=Socket->ReceiveText();
if(Text=="End")
{
[COLOR=deeppink] delete FStrClient; FStrClient=NULL;[/COLOR]
if(DeleteFile(itsDirectory+"\\"+itsFileName)==0)
ShowMessage("Не удалось удалить: " +itsFileName);
ProgressBar1->Visible=false;
StatusBar1->Panels->Items[1]->Text="послано 100 %";
Animate1->Active=false;
Timer1->Enabled=true;
FConection->Caption="Время пересылки:"+TimeToStr(Time()-Time1);
}
else
{
if(Text=="Error")
{
[COLOR=deeppink] delete FStrClient; FStrClient=NULL;[/COLOR]
}
else
{
if(Text=="Send")
{
try
{
Socket->SendStream(FStrClient);
}
catch (...)
{
Socket->SendText("Error");
[COLOR=deeppink] delete FStrClient; FStrClient=NULL;[/COLOR]
}
}
else
{
ProgressBar1->Visible=true;
Animate1->Active=true;
try{
ProgressBar1->Position=StrToInt(Text);
}
catch(...){}
StatusBar1->Panels->Items[1]->Text="Отправлено: "+Text+"%";
}
}
}
}
1. При удалении неверного указателя
2. При удалении уже удалённого объекта.
Поскольку в коде указатель ты не меняешь (по крайней мере, я этого не заметил :)), постольку, вероятнее всего, действует второй вариант. В котором из delete у тебя возникает эксепшн? И, кстати, всегда избегай повторения кода. В данном случае я бы тебе посоветовал весь код обработки из функции ClientSocketRead() поместить в try/catch, и в случае, когда нужно будет удалить TFimeStream, метать эксепшн с помощью throw. Тогда отпадёт необходимость три раза подряд писать delete и обнулять указатель. И ещё: как уже было сказано, сохраняй табуляцию, когда приводишь код, а для этого заключай его в тэг {CODE}. Токда твой исходник прочитают быстрее и быстрее ответят на твой пост...
Опыт подсказывает, что исключение в операторе delete возникает, обычно, в двух случаях:
1. При удалении неверного указателя
2. При удалении уже удалённого объекта.
Поскольку в коде указатель ты не меняешь (по крайней мере, я этого не заметил :)), постольку, вероятнее всего, действует второй вариант. В котором из delete у тебя возникает эксепшн? И, кстати, всегда избегай повторения кода. В данном случае я бы тебе посоветовал весь код обработки из функции ClientSocketRead() поместить в try/catch, и в случае, когда нужно будет удалить TFimeStream, метать эксепшн с помощью throw. Тогда отпадёт необходимость три раза подряд писать delete и обнулять указатель. И ещё: как уже было сказано, сохраняй табуляцию, когда приводишь код, а для этого заключай его в тэг {CODE}. Токда твой исходник прочитают быстрее и быстрее ответят на твой пост...
Спасибо за ответ.
Извини за отсутствие табуляции, в предь буду окуратнее.:)
Я проводил пошаговый анализ своего кода, и уверен что выдается исключение при 1 удалении.
Да к стати я после удаления обнуляю указатель, а это позволяет удолять его бесконечное кол-во раз.
У меня наверное не большой опыт, но он говорит о том что исключение так- же возникает, при удалении массива,(а класс в первом приближении можно расматривать как массив), если обращался за пределы этого массива.
А в моей програмке есть как я тебе писал выше как буд-то какое-то смещение, кода.
Хотя я боее склонен пологать, что этот объект уничтожается с сервака, автоматически при удалении родственного ему объекта.
Во первых, код гард не вылавливает ошибок при нормальном ходе программы, если я вообще не удаляю объект, FStrClient. А во вторых я тебе указывал на странность, с dial-up.
Но в этом, мне видимо придется разбиратся, методом проб и ошибок.
Но те 36 однотипных сообшений типа
[Linker Warning] Public symbol 'operator new[](unsigned int)' defined in both module
C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CG32.LIB|newa and
C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MT.LIB|newarray
говоят о том что возникают какие-то конфликты, судя по всему м/у глобальными объектами. Вопрос в том м/у какими? Что это за библиотеки CG32.LIB, CP32MT.LIB и почему они конфликтуют? Возмож-но в этом кроется ответ на мой вопрос.