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

Вниз

Ошибка доступа к памяти, при использовании динамического массива   Найти похожие ветки 

 
Gogerman   (2003-08-06 12:58) [0]

И что делать?


 
Zergling   (2003-08-06 12:59) [1]

Каод сюды. Телепатов нет.


 
PVOzerski   (2003-08-06 13:00) [2]

А как массив-то используется? Главное, как длина задается/проверяется?


 
dez   (2003-08-06 13:01) [3]

сто пудофф за границы вылез


 
Digitman   (2003-08-06 13:02) [4]


> что делать


либо самому устранить причину возникновения ошибки либо спросить у Чернышевского - он знает


 
Толик   (2003-08-06 13:16) [5]

Сначала ответить на вопрос "Кто виноват?". :-)
Не, я серьёзно, сначала надо понять причину, а потом уже думать как с неё бороться.


 
Gogerman   (2003-08-06 13:43) [6]

Ошибка возникает только после неоднократной работы функции
Setlength(Array,Length(Array)+1);, причём ошибка возникает на строке типа i:=1;.
Если случается, что массив я не расширяю и не редактирую елементы, программа работает нормально.


 
clickmaker   (2003-08-06 13:50) [7]

типа i:=1 ? Может все-таки Array[i] := 1 ?
Значит i вылез за Length. По-другому никак


 
Толик   (2003-08-06 13:52) [8]

>>Ошибка возникает только после неоднократной работы функции
А случаем не OutOfMemory вылезает?


 
Digitman   (2003-08-06 13:52) [9]


> ошибка возникает на строке типа i:=1


быть того не может


 
PVOzerski   (2003-08-06 13:56) [10]

Дурацкий вопрос: а Вы учитываете, что в динамических массивах начальный элемент имеет индекс 0, а последний - length(...)-1?


 
Gogerman   (2003-08-06 14:28) [11]

Ошибка выглядит так:
Project tipa.exe failted with message: "access violation at 0x77e8b98f:write of address 0x00030ffc".
Причём вылезает на строке типа I:=1;

.....................................................
Кстати щас поменял строчки i:=1; и j:=1; и ошибка не выдавалась...
Так что извеняйте за беспокойство. Это похоже глюка дельфёвый был, а не моё ламерство...


 
Владислав   (2003-08-06 14:35) [12]

> Gogerman © (06.08.03 14:28)

"...Это похоже глюка дельфёвый был..."

Вот за такие слова "злой" Борланд (Инпрайз) уготовил тебе новый "сюрприз". И ты о нем еще услышишь ;)


 
Digitman   (2003-08-06 14:44) [13]


> Причём вылезает на строке типа I:=1;


не верю


 
Gogerman   (2003-08-06 14:46) [14]

нда...
но стала выдаваться ошибка "Invalid pointer operation" на "нцатом
проходе кода этой процедуры.

procedure TWebModule1.AddContent(var Response: TWebResponse; strContent: string);
begin
Response.Content:= Response.Content + strContent;
end;

И если раньше выдавалась тупая ошибка на строке типа i:=1;, то теперь выдается ошибка на "нцатое дополнение Response.

Сюрприз??


 
Digitman   (2003-08-06 14:51) [15]


> procedure TWebModule1.AddContent(var Response: TWebResponse;
> strContent: string);
> begin
> Response.Content:= Response.Content + strContent;
> end;


> раньше выдавалась тупая ошибка на строке типа i:=1


где ж здесь указанная строка "типа" ?) ... и в помине нет даже)... ни тупой ни острой)


 
Smithson   (2003-08-06 14:56) [16]

Ты где-то в НЕВЕРНЫХ операциях с динамическим массивом портишь память других структур. Вот это у тебя и вылезает.


 
PVOzerski   (2003-08-06 14:59) [17]

IMHO, это уже перешло в пустопорожний флейм. Либо код в студию, либо ветку в "Потрепаться" с последующим съезжанием вниз по причине неинтересности!


 
Palladin   (2003-08-06 15:00) [18]


> Gogerman © (06.08.03 14:46)

ты когданибудь код приведешь, или так и будешь дальше приколы читать?


 
Gogerman   (2003-08-06 15:10) [19]

Код:

VagonQ.Open;
VagonQ.First;

while not VagonQ.Eof do
begin
Dat_sled:=VagonQ.FieldByName("Dat_sled").AsDateTime;
Fl_sled:=VagonQ.FieldByName("Fl_sled").AsInteger;
Snvesr:=VagonQ.FieldByName("Snvesr").AsString;
Kgp:=VagonQ.FieldByName("Kgp").AsString;
Dat_prib:=VagonQ.FieldByName("Dat_prib").AsDateTime;
Esr_prib:=VagonQ.FieldByName("Esr_prib").AsString;
Dat_iskl:=VagonQ.FieldByName("Dat_iskl").AsDateTime;
Dat_pod:=VagonQ.FieldByName("Dat_pod").AsDateTime;
Dat_wygr:=VagonQ.FieldByName("Dat_wygr").AsDateTime;
if Length(Klients)<>0 then
begin
for I := 0 to Length(Klients)-1 do
if Klients[I].Kod=Kgp then break;
end
else I:=0;
if (I=Length(Klients)-1) or (I=0) then
begin
Setlength(Klients,Length(Klients)+1);
I:=Length(Klients)-1;
Klients[I].kod:=Kgp;
Klients[I].rasf:=Dat_iskl-Dat_prib;
Klients[I].ojpod:=Length(Klients)-1;
Klients[I].podacha:=Length(Klients)-1;
Klients[I].ojubor:=Length(Klients)-1;
Klients[I].Koltwo:=Fl_sled;
end
else
begin
Klients[I].rasf:=Length(Klients)-1;
Klients[I].ojpod:=Length(Klients)-1;
Klients[I].podacha:=Length(Klients)-1;
( Klients)
Код:

VagonQ.Open;
VagonQ.First;

while not VagonQ.Eof do
begin
Dat_sled:=VagonQ.FieldByName("Dat_sled").AsDateTime;
Fl_sled:=VagonQ.FieldByName("Fl_sled").AsInteger;
Snvesr:=VagonQ.FieldByName("Snvesr").AsString;
Kgp:=VagonQ.FieldByName("Kgp").AsString;
Dat_prib:=VagonQ.FieldByName("Dat_prib").AsDateTime;
Esr_prib:=VagonQ.FieldByName("Esr_prib").AsString;
Dat_iskl:=VagonQ.FieldByName("Dat_iskl").AsDateTime;
Dat_pod:=VagonQ.FieldByName("Dat_pod").AsDateTime;
Dat_wygr:=VagonQ.FieldByName("Dat_wygr").AsDateTime;
if Length(Klients)<>0 then
begin
for I := 0 to Length(Klients)-1 do
if Klients[I].Kod=Kgp then break;
end
else I:=0;
if (I=Length(Klients)-1) or (I=0) then
begin
Setlength(Klients,Length(Klients)+1);
I:=Length(Klients)-1;
Klients[I].kod:=Kgp;
Klients[I].rasf:=Dat_iskl-Dat_prib;
Klients[I].ojpod:=Length(Klients)-1;
Klients[I].podacha:=Length(Klients)-1;
Klients[I].ojubor:=Length(Klients)-1;
Klients[I].Koltwo:=Fl_sled;
end
else
begin
Klients[I].rasf:=Length(Klients)-1;
Klients[I].ojpod:=Length(Klients)-1;
Klients[I].podacha:=Length(Klients)-1;
Klients[I].ojubor:=Length(Klients)-1;
Klients[I].Koltwo:=Fl_sled;
end;
VagonQ.Next;
end;
VagonQ.Close;
VagonC.Connected:=False;


 
Gogerman   (2003-08-06 15:11) [20]

это кусок в котором наполняется массив. дальше только чтение.


 
paxer   (2003-08-06 15:18) [21]

Поставь в свойствах проекта Compile-Range cheking
Может помочь узнать, где вылез за границы массива.


 
Palladin   (2003-08-06 15:29) [22]

а если найденый элемент будет с индексом 0 или последний?
пробуй вот что...

i2:=-1;
for I := 0 to Length(Klients)-1 do
if Klients[I].Kod=Kgp then
begin
i2:=i;
( I2=-1) а если найденый элемент будет с индексом 0 или последний?
пробуй вот что...

i2:=-1;
for I := 0 to Length(Klients)-1 do
if Klients[I].Kod=Kgp then
begin
i2:=i;
break;
end;
if (I2=-1) then
...
else
...


 
Anatoly Podgoretsky   (2003-08-06 15:31) [23]

I за пределами цикла неопределено!!!!


 
han_malign   (2003-08-06 15:32) [24]

if (I=Length(Klients)-1) or (I=0) then
- вообще то, по завершению for, i = Length(Klients) - теорию надо учить, а если не знаешь как работает цикл for - пользуйся while do или repeat until.


 
Digitman   (2003-08-06 15:33) [25]


> Gogerman © (06.08.03 15:10)
> Код:


так и хочется ИванАндреича помянуть ... "мартышка к старости слаба глазами стала..") ... вот хоть убей - не вижу в тексте никаких "типа i := 1" !

)


 
Nikolay M.   (2003-08-06 15:38) [26]


> for I := 0 to Length(Klients)-1 do
> if Klients[I].Kod=Kgp then break;
> end
> ( Klients,Length(Klients)

> for I := 0 to Length(Klients)-1 do
> if Klients[I].Kod=Kgp then break;
> end
> else I:=0;

У тебя на этот код компилятор не ругается? Типа, мол переменная I может быть непроинициализирована после цикла, да и I может быть нулевым в случае, когда Klients[0].Kod=Kgp.
Да и вообще при Setlength(Klients,Length(Klients)+1) может произойти перераспределение памяти, если условия позволяют, задавай лучше сразу длину массива.


 
han_malign   (2003-08-06 15:40) [27]

Anatoly Podgoretsky © (06.08.03 15:31)
- определено, но не всегда и не во всех компиляторах, поэтому корректней пользоваться While...

i:=0; while((i<Length(Klients))and(Klients[I].Kod<>Kgp))do inc(i);
if(i<Length(Klients))then begin//нашли Kod=Kgp
Klients[I].rasf :=High(Klients);
Klients[I].ojpod :=High(Klients);
Klients[I].podacha:=High(Klients);
Klients[I].ojubor :=High(Klients);
Klients[I].Koltwo :=Fl_sled;
end else begin//не нашли Kod=Kgp
Setlength(Klients,Length(Klients)+1);
( Klients)
Anatoly Podgoretsky © (06.08.03 15:31)
- определено, но не всегда и не во всех компиляторах, поэтому корректней пользоваться While...

i:=0; while((i<Length(Klients))and(Klients[I].Kod<>Kgp))do inc(i);
if(i<Length(Klients))then begin//нашли Kod=Kgp
Klients[I].rasf :=High(Klients);
Klients[I].ojpod :=High(Klients);
Klients[I].podacha:=High(Klients);
Klients[I].ojubor :=High(Klients);
Klients[I].Koltwo :=Fl_sled;
end else begin//не нашли Kod=Kgp
Setlength(Klients,Length(Klients)+1);
I:=High(Klients);
Klients[I].kod :=Kgp;
Klients[I].rasf :=Dat_iskl-Dat_prib;
Klients[I].ojpod :=I;
Klients[I].podacha:=I;
Klients[I].ojubor :=I;
Klients[I].Koltwo :=Fl_sled;
end;

- и всех делов то


 
Gogerman   (2003-08-06 15:44) [28]

Пусть строка-
i:=1;
равна строке-
Dat_iskl:=VagonQ.FieldByName("Dat_iskl").AsDateTime;


 
Gogerman   (2003-08-06 16:09) [29]

Спасибо за ваше внимание и советы! Особеннно han_malign, за то что напомнил азы!!! На самом деле ошибка в том была, что я массив не обнулял при выходе из процедуры и память засорял.
Не хватало только -
Klients := Nil ;
Finalize(Klients);
при выходе из процедуры.


 
Anatoly Podgoretsky   (2003-08-06 16:09) [30]

han_malign © (06.08.03 15:40)
Мы вроде бы про Дельфи, а в ней одназначно сказано неопределено

Cghfdrf? ntvf For statements
After the for statement terminates, the value of counter is undefined. Когда будем размбирать цикл FOR из другого языка, тогда будем отдельно говорить об переменной цикла в том языке.


 
Digitman   (2003-08-06 16:15) [31]


> Gogerman © (06.08.03 15:44)
> Пусть строка-
> i:=1;
> равна строке-
> Dat_iskl:=VagonQ.FieldByName("Dat_iskl").AsDateTime;


что значит "пусть" ??? вообще ничего общего !

все, что я пытаюсь "выудить" из тебя - на основании чего ты утверждаешь, что именно на строке, содержащей "i:= ... ", возбуждается исключение ? Ход твоих мыслей ? Аргументы ?


 
Владислав   (2003-08-06 16:23) [32]

> Gogerman © (06.08.03 16:09)

Будешь ждать следующего сюрприза? ;)


 
Gogerman   (2003-08-06 16:32) [33]

Владислав © (06.08.03 16:23)
буду копить опыт...



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

Форум: "Потрепаться";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.009 c
14-68491
aga
2003-08-05 20:09
2003.08.21
Редактор...


3-68167
Mypp
2003-07-29 09:46
2003.08.21
Хранимые процедуры


3-68154
abc
2003-07-28 14:27
2003.08.21
как обновить только одну запись


1-68319
IGoRka
2003-08-08 17:58
2003.08.21
как узнать завершение роботи программи ...


1-68337
DM.OMen
2003-08-08 16:09
2003.08.21
TTreeNode ?????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский