Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Вниз

Ошибка   Найти похожие ветки 

 
Ann   (2003-11-03 14:12) [0]

Мне очень нужна Ваша помощь. Разбираюсь с чужой программой, написанной на делфи3, парадоксовская база.
И вылетает следующая ошибка при расчете "Access violation at address 00583731 in module PrProgram.exe"
вылетает на следующих строках
Zc:=dim.GetData(0,i);
if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;
if ZcArtTableUp.Value<>Null then Zc^.Typ:=ZcArtTableUp.Value else Zc^.Typ:=0;
if ZcArtTableProcent.Value<> Null then Zc^.Proc:=ZcArtTableProcent.Value else Zc^.Proc:=0;
Уже полдня воюю с этой ошибкой и никак, а трассировкой не проверить, данных очень много, да и расчет жутко громоздкий. А вылетает не сразу, а к концу рассчета.
Понимаю, что дать совет на такие "абстрактные" вопросы трудно, но буду рада любым предположениям!


 
Zacho   (2003-11-03 14:15) [1]

А что такое dim и Zc ? Приведи объявления.


 
Romkin   (2003-11-03 14:21) [2]

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


 
Romkin   (2003-11-03 14:24) [3]

Кстати, насчет трассировки:
http://www.gexperts.org/download.html
у них есть внешний трассировщик, ставишь в коде выдачу сообщений, вроде assert, и смотришь, что происходит.


 
Ann   (2003-11-03 14:26) [4]


> [2] Romkin © (03.11.03 14:21)
> Поубывав бы...

кого? :(
и еще прикол в том, что этот же расчет проходит за предыдущий месяц, а в этом ругается .. вот и понять не могу почему..

> [1] Zacho © (03.11.03 14:15)
> А что такое dim и Zc ? Приведи объявления.

type
ColorRec=record Color:integer;Proc:double;end;
_ColorRec=^ColorRec;
var
ZC:_ColorRec;

а dim
var
dim:TDinArray;
заганяет в массив данные для расчета... там расчет продукции по цветам..


 
Romkin   (2003-11-03 14:30) [5]

Ann © (03.11.03 14:26) [4]

>> [2] Romkin © (03.11.03 14:21) > Поубывав бы...
>кого? :(
Автора этого неповторимого кода :)))
Под ZC где-то память не выделяется или наоборот, рано освободилась. Ловить трудно, если освободилась, она может еще и не быть занятой, тогда без AV пройдет
А что такое TdinArray?


 
Anatoly Podgoretsky   (2003-11-03 14:33) [6]

А меня смущает это Null почему Variant, так и должно быть? Но к ошибке наверно это не имеет отношения.


 
Romkin   (2003-11-03 14:40) [7]

Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде должно быть в D3. А так - может быть, хотя вряд ли, была бы ошибка насчет конвертации варианта


 
Ann   (2003-11-03 14:42) [8]


> [5] Romkin © (03.11.03 14:30)
> А что такое TdinArray?

unit DinArray;
{ DINAMIC ARRAY OBJECT IMPLEMENTATION MODULE
работает с элементами фиксированной длины
interface

type
TDADimension=(DAD_1D,DAD_2D);

TDinArray=class(TObject)
private
FPtr:pointer;
FDim:TDADimension;
FMaxX:integer;
FMaxY:integer;
FGran:integer;
procedure SetGranularity(Value:integer);
procedure SetMaxX(Value:integer);
procedure SetMaxY(Value:integer);
procedure SetDim(Value:TDADimension);
procedure Resize;
public
constructor Create;
destructor Destroy;override;
property Granularity:integer read FGran write SetGranularity;
property NumCols:integer read FMaxX write SetMaxX;
property NumRows:integer read FMaxY write SetMaxY;
property Dimension:TDADimension read FDim write SetDim;
function GetData(X,Y:integer):pointer;
function GetByte(X,Y:integer):byte;
function GetWord(X,Y:integer):word;
function GetInteger(X,Y:integer):integer;
procedure SetData(X,Y:integer;D:pointer);
procedure SetByte(X,Y:integer;D:Byte);
procedure SetWord(X,Y:integer;D:Word);
procedure SetInteger(X,Y:integer;D:Integer);
procedure Clear;
end;
и т.д. :)


 
Anatoly Podgoretsky   (2003-11-03 14:44) [9]

Romkin © (03.11.03 14:40) [7]
Варианты вообще то немного капризная штука, особенно в младщих версиях. Для полей isNULL правильнее.


 
Ann   (2003-11-03 14:45) [10]


> [7] Romkin © (03.11.03 14:40)
> Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде
> должно быть в D3. А так - может быть, хотя вряд ли, была
> бы ошибка насчет конвертации варианта

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


 
Romkin   (2003-11-03 14:49) [11]

Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
Уточнить строку нельзя? А то как-то стремно.


 
Ann   (2003-11-03 14:51) [12]


> [11] Romkin © (03.11.03 14:49)
> Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
> Уточнить строку нельзя? А то как-то стремно.

не поняла.. какую строку уточнить? вернее, весь код привести?


 
Romkin   (2003-11-03 14:54) [13]

Нет,
1. в SetData выполняется копирование памяти или просто присвоение значения FPtr? Если второе, надо смотреть, что присваивается и когда освобождается.
2. Поставить лог внутри GetData, пусть сбрасывает, что указатель выдан.
Хотя хотелось бы на код этих методов глянуть.
Уточнить строку, в которой AV выпадает


 
Ann   (2003-11-03 14:59) [14]

AV вылетает на if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;

код GetData следующий
function TDinArray.GetData(X,Y:integer):pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
end;

а на счет первого (SetData) ..
procedure TDinArray.SetData(X,Y:integer;D:pointer);
var p:pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
move(D^,p^,FGran);
end;


 
Romkin   (2003-11-03 15:11) [15]

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


 
Ann   (2003-11-03 15:14) [16]


> [15] Romkin © (03.11.03 15:11)
> Мда... Кошмар...
> Совсем мне это не нравится. Код надо бы менять, с дополнительными
> проверками. Память, как я вижу, копируется.
> То, что вылетает на указанной тобой строке - не факт, скорее
> всего именно на GetData, есть такое свойство, останов происходит
> на следующей строке.
> Трассировать надо, однако...

мда.. действительно кошмар, а времени переписывать сейчас нет, другая задача весит. :(
Спасибо большое за помощь :)
пошла трассировать..............


 
Ann   (2003-11-03 16:41) [17]

А можно еще один глупый вопрос(мозги уже закипают :( )?
А вот что должна вернуть в качестве результата например такая процедура:
procedure setzc(ColorCount:word);
var i:word;ZC:_Rec;
begin
With DataModule1 do begin{with}
dim:=TDinArray.Create;
dim.Granularity:=sizeof(TRec);
dim.Dimension:=DAD_2D;
dim.NumRows:=ColorCount;
dim.NumCols:=1;
dim.Clear;
i:=0;
ZcArtTable.First;
While not ZcArtTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcArtTableColor.Value;
Zc^.Typ:=ZcArtTableUp.Value;
Zc^.Proc:=ZcArtTableProcent.Value;
i:=i+1;
ZcArtTable.Next;end;{ZcArtTable}
i:=0;
dim.Clear;
ZcRazTable.First;
While not ZcRazTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcRazTableColor.Value;
Zc^.Typ:=ZcRazTableUp.Value;
Zc^.Proc:=ZcRazTableProcent.Value;
i:=i+1;
ZcRazTable.Next;end;{ZcArtTable}
dim.Destroy;
end;//with
end;
уже минут тридцать тупо на нее смотрю и не понимаю чего она вернет..
Простите, за глупые вопросы и не ругайте сильно....


 
VAleksey   (2003-11-03 16:47) [18]

Она ничего не вернет.
Просто выполнит код внутри себя.
;-)


 
Ann   (2003-11-03 16:49) [19]

не.. я не к тому..
извините, я уже разобралась..


 
Sandman25   (2003-11-03 16:54) [20]

[19] Ann © (03.11.03 16:49)

Перед тем, как разбираться, рекомендую исправить форматирование текста, поставив отступы, где надо. Тогда мозги перестанут помнить лишний контекст (while еще выполняется, из if еще не вышли, зашли в case...) и не будут кипеть :)


 
NAlexey   (2003-11-03 16:55) [21]

Вот так вот... Посмотришь посмотришь вот так как люди мучаются, и начинаешь в два, нет, в три раза лучше форматировать и оттачивать код, сколько бы времени не уходило. Лучшеуж день потерять, потом за пять минут долететь.:)


 
Ann   (2003-11-03 16:55) [22]


> [21] NAlexey © (03.11.03 16:55)
> Вот так вот... Посмотришь посмотришь вот так как люди мучаются,
> и начинаешь в два, нет, в три раза лучше форматировать и
> оттачивать код, сколько бы времени не уходило. Лучшеуж день
> потерять, потом за пять минут долететь.:)

легко долетать на своей программе..


 
ЮЮ   (2003-11-04 02:32) [23]

Т.к. GetData может возвращать nil, то в коде это следует учесть:

if Zc <> nil then begin
...
end;

если же такая ситуация не должна возникать, то поставь точки останова в строках типа
if (X>=FMaxX) or (FPtr=nil) then
result:=nil <здесь Break Point>
и анализируй как туда попали


 
MORA   (2003-11-04 04:38) [24]

Проверь типы данных, они могут отличаться от 3 версии - Integer: -1 и $FFFFFFFF одно и то же. Real {$REALCOMPATIBILITY ON}


 
Ann   (2003-11-04 09:52) [25]


> [23] ЮЮ © (04.11.03 02:32)
> Т.к. GetData может возвращать nil, то в коде это следует
> учесть:
>
> if Zc <> nil then begin
> ...
> end;

Спасибо большое за совет!
Помогло.. после следующего все прошло нормально
Zc:=dim6.GetData(0,i);
if Zc <> nil then Zc^.Color:=ZcArtTableColor.Value;
if Zc <> nil then Zc^.Typ:=ZcArtTableUp.Value;
if Zc <> nil then Zc^.Proc:=ZcArtTableProcent.Value;



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.009 c
11-78869
savva
2003-03-11 15:26
2003.11.24
object и interface


3-78803
h010d
2003-11-05 09:51
2003.11.24
Нужен пример UDF на C Builder


1-78885
Виталя
2003-11-12 16:25
2003.11.24
Прочитать из Word при помощи OLE


1-79025
Jiurasdg45
2003-11-13 22:14
2003.11.24
А как сделать прокручиваемую картинку?


8-79058
ildar
2003-07-22 09:40
2003.11.24
вхождение одного звукового фрагмента в другой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский