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

Вниз

SetLength дла массива Record - в.   Найти похожие ветки 

 
learner ©   (2006-09-22 15:46) [0]

Здравствуйте !
Помогите разобраться.
Меняю длину динамического массива и получаю AccessViolation.
Как можно исправить ?
type
TTestData = record
   Attr: DWord;
   Name: string;
   Size: Int64;
 end;

TDataArr = array of TTestData;

function Test_SetLength(var LenArr: TDataArr): DWord;
const
StandartLen = 2;
var
GetNext: Boolean;
aCount: integer;
begin
aCount:=0;
Result:=0;
GetNext:=True;
try
 if Length(LenArr) < StandartLen then SetLength(LenArr, StandartLen);
  while GetNext do
   begin
    if Length(LenArr) < aCount then SetLength(LenArr, aCount + StandartLen);
    LenArr[aCount].Attr:=6 + aCount;
    LenArr[aCount].Name:="DataName" + IntToStr(aCount);
    LenArr[aCount].Size:=aCount * 2;
    Result:=Result + LenArr[aCount].Size;
    inc(aCount);
    if aCount > 25 then GetNext:=False;
   end;
finally
end;
if Length(LenArr) <> aCount then SetLength(LenArr, aCount);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
DataArr: TDataArr;
begin
DataArr:=nil;
Test_SetLength(DataArr);
end;

Project Project1.exe raised exception class EAccessViolation with message
"Access violation at address 77124874 in module "oleaut32.dll". Read of address 00000008".

Project Project1.exe raised exception class EAccessViolation with message
"Access violation at address 00403F3E in module "Project1.exe". Read of address FFFFFFF9".


 
clickmaker ©   (2006-09-22 15:49) [1]


> получаю AccessViolation

на какой строке?


 
learner ©   (2006-09-22 15:59) [2]

>на какой строке?
Все время на разных. От расположения планет зависит :)
Уже и в отдельный проект это перенесла. То же самое :((


 
Zeqfreed ©   (2006-09-22 16:12) [3]

 if Length(LenArr) < aCount then SetLength(LenArr, aCount + StandartLen);

В этой строчке заменить < на <=. Много думать.

P.S. Во всех строчках заменить Standart на Standard, а ещё лучше Default. ;)


 
Kolan ©   (2006-09-22 16:15) [4]

Ну пройдитесь отладчиком, посмотрите как там и что в Watches...


 
Галинка ©   (2006-09-22 16:22) [5]

Я конечно могу ошибаться. Но тут недавно про это уже спрашивали. тут путается понятия динамического и открытого массивов. Попробуй завести внутри поцедуры переменную динамического массива, а потом присвой этот динам открутомы. Может так лучше будет.


 
Zeqfreed ©   (2006-09-22 16:23) [6]

А вообще, это какие-то извращения. Зачем делать цикл while если кол-ва итераций заранее известны? Зачем постоянно перераспределять память?


 
Anatoly Podgoretsky ©   (2006-09-22 16:23) [7]

Какой то странно бессмысленный код, да и ошибка наверно в другом месте.


 
Галинка ©   (2006-09-22 16:24) [8]

Открытые массивы используются как параметры функций и у них нельзя вроде назначать длину ))


 
Dmitrij_K   (2006-09-22 16:25) [9]


> Открытые массивы используются как параметры функций и у
> них нельзя вроде назначать длину ))

Точно.
Но к этой проблеме это не относится


 
learner ©   (2006-09-22 16:26) [10]

>В этой строчке заменить < на <=. Много думать.
!!! А ведь часа два смотрела и не видела :((
Спасибо !


 
Галинка ©   (2006-09-22 16:29) [11]

Дима, точно? Я щас поищу тему. Но там как раз такая ошибка и была вроде.


 
Dmitrij_K   (2006-09-22 16:30) [12]

...
   if Length(LenArr)<=aCount then
     SetLength(LenArr, aCount + StandartLen);

...


 
Dmitrij_K   (2006-09-22 16:30) [13]

Опаздал.


 
Zeqfreed ©   (2006-09-22 16:31) [14]

> [10] learner ©   (22.09.06 16:26)

На самом деле ошибка там действительно может проявляться на разных итерациях, т.к. в некоторых «особо счастливых» раскладах, память оказывается доступной для записи и AV не выскакивает на третьей итерации, как ему полагается.

Советую все-таки пересмотреть подход, т.к. текущий код очень-очень некрасивый и кривоватый :) Для чего он используется?


 
umbra ©   (2006-09-22 16:32) [15]

2 Галинка ©   (22.09.06 16:24) [8]

здесь нет открытых массивов


 
Kolan ©   (2006-09-22 16:32) [16]


> Галинка ©   (22.09.06 16:24) [8]

Тут не открытый массив:
var LenArr: TDataArr


 
Zeqfreed ©   (2006-09-22 16:33) [17]

> [11] Галинка ©   (22.09.06 16:29)

Тут нет открытых массивов.


 
Галинка ©   (2006-09-22 16:36) [18]

а в чем смысл строки
if Length(LenArr) < aCount

если aCount равно нулю? Проверка на отрицательную длину входного массива? Странно...


 
Zeqfreed ©   (2006-09-22 16:38) [19]

> [18] Галинка ©   (22.09.06 16:36)

Это помещено в цикл, в котором значение aCount изменяется.


 
Галинка ©   (2006-09-22 16:38) [20]

Спасибо. Я тоже часто пропускаю такие вещи. Но зачем проверять на отрицательность длины массива? Разве такое вообще может быть?


 
Kolan ©   (2006-09-22 16:39) [21]

Код я так и не понял, но чтобы не получаать AV работая с массивами полезно писат так:
for I := Low(Arr) to High(Arr) do


 
Zeqfreed ©   (2006-09-22 16:43) [22]

> [21] Kolan ©   (22.09.06 16:39)

Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)

> Код я так и не понял, но чтобы не получаать AV работая с
> массивами полезно писат так:
> for I := Low(Arr) to High(Arr) do

Как ни пиши, AV можно словить :)


 
Галинка ©   (2006-09-22 16:51) [23]

А если массив равен нил, то он пустой или его вообще нет?


 
Anatoly Podgoretsky ©   (2006-09-22 16:52) [24]

Смысл кода в том, чтобы заполнить 26 элементов начальными значениями в очень извращенной форме :)

И для этого такие извращения с кодом? Почему бы сразу не сделать SetLength , 26 и потом обычный цикл, без всякой этой ерунды.


 
Zeqfreed ©   (2006-09-22 16:57) [25]

> [24] Anatoly Podgoretsky ©   (22.09.06 16:52)

Вы меня спрашиваете? :) Я примерно о том же говорил в [6].


 
learner ©   (2006-09-22 17:08) [26]

>Смысл кода в том, чтобы заполнить 26 элементов начальными
>значениями вочень извращенной форме :)
Это специально сделаный и вынесенный в новый проект код для воссознания
ошибки. Он не предназаначен для работы :))


 
Галинка ©   (2006-09-22 17:18) [27]

Автор, помогло исправление на <=? Там просто пропускался один элемент массива?


 
Zeqfreed ©   (2006-09-22 17:22) [28]

> [27] Галинка ©   (22.09.06 17:18)

Нет, там было обращение к несуществующему элементу.



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

Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.053 c
2-1158769175
vegarulez
2006-09-20 20:19
2006.10.08
Не появляется контекстная справка-выбиралка, после точки...


8-1142329007
hgd
2006-03-14 12:36
2006.10.08
Восстановление проекции по двум фотографиям


15-1158643456
шаааа
2006-09-19 09:24
2006.10.08
Что такое u08 в с++?


2-1158414145
olevacho_
2006-09-16 17:42
2006.10.08
последовательность вывода band-ов


2-1158843472
arhis
2006-09-21 16:57
2006.10.08
Как узнать количество знаков после запятой?





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