Динамичен масив

14 отговора 423 прегледа
#1

Динамичен масив

Здравейте,
Моля да ми помогнете за следният ми проблем:Искам да създам динамичен масив и правя следното:
var
mas:array of Double;
n:integer;

......
begin
n:=3;
SetLength(mas,n);
......
end
Компилаторът не дава грешка, но когато се пробвам да пълня масива ми излиза грешка.
Благодаря предварително

Отговор
в отговор на Locolito #2

Re: Динамичен масив

Е те точно този код работи ;-)
var
mas:array of Double;
n:integer;
begin
n:=3;
SetLength(mas,n);
for n:=0 to 2 do
mas[n] := n*1232.123;
end;

Проблема май е в начина по който пълниш данните ? Точно това не си сложил в примера.

---
Отговор
в отговор на Locolito #3

Re: Динамичен масив

Как пълниш масива, каква грешка ти дава? Дай повече инфо за да можем да ти помогнем!

При така зададените параметри, валидните обръщения са mas[0]..mas[2]. Ако опиташ нещо като mas[3]:=5, ще се получи грешка "Index out of bounds".

Mixy
Отговор
в отговор на Locolito #4

Пример

Пълня го по този начин:
if OpenDialog1.Execute then
begin
AssignFile(f,OpenDialog1.FileName);
Reset(f);
readln(f,broj);
for i:=1 to broj do
read(f,mas);
............
, а грешката която получавам е:
Project Proba.exe raised exception class EAccessViolation with message "Access violation at address 04630d5 in module 'Proba.exe'. Write of address 00000008.
Използвам Delphi 6

Отговор
в отговор на Locolito #5

Re: Пример

Вместо read(f,mas[ i ]);
пиши read(f,mas[ i-1 ]);

Отговори си сам на въпроса Защо?

Отговор
в отговор на NDeu #6

Re: Пример

Пак не става с read(f,mas[ i-1 ]);

Отговор
в отговор на Locolito #7

Re: Пример

Когато търсиш помощ, опитай се да формулираш добре проблема си. Много често това е достатъчно за да намериш решение.

1. Като не става, какво става
2. Отговори си на въпроса ЗАЩО?
3. RTFM

Отговор
в отговор на Locolito #8

Re: Пример

Виж, както каза Mixy трябва да използваш индекси от 0 до брой - 1. Само че грешка "Index out of bounds" ще получиш май само ако ти е пуснат range checking-а на компилатора. Иначе той няма да се усети и ти ще се опиташ да четеш/пишеш от елемент на индекс 3 (който се явява 4-ти!, а ти нямаш такъв), съответно това е в някаква памет, за която нямащ права и получаваш access violation.

А сега обясни по-подробно какво означава "пак не става" щото иначе друг отговор освен "ми хубаво" трудно ще получиш.

Отговор
в отговор на NDeu #9

Re: Пример

Изключвай възможностите една по една: виж какви данни четеш от файла(чети ги първо в отделна променлива.). Другото място от където може да имаш грешка е индексацията - както са ти подсказали колегите - при динамичните масиви индексите са от 0 (както в C) за разлика от статичните масиви. Тo май за друго не се сещам.
Успех!


P.S. NDeu, какво е това RTFM?????

Светът е малък нека си помагаме.
Отговор
в отговор на Vermax #10

Re: Пример

Read The Fuc*** Manuals

Отговор
в отговор на andrew_nikoloff #11

Re: Пример

Да, това, което казваш за "Index out of bounds" и Range checking е напълно вярно. Момчето трябва да си го включи, за да види дали това е проблема. Другия вариант е с постъпково изпълнение - при 3 цикъла е лесно. Щом му дава AV, най-вероятно променливата му broi е доста по-голяма от 3 и for-цикъла омазва други данни или код след края на масива.

Mixy
Отговор
в отговор на NDeu #12

Re: Пример - OFF

Много яка иконка!

Разрешаваш ли да си я препиша, за да я ползвам в проектите си?

Mixy
Отговор
в отговор на NDeu #13

:)



Светът е малък нека си помагаме.
Отговор
в отговор на Mixy #14

Re: Пример - OFF

Ползвай на воля.
Аз самия съм я взел от някакъв руски сайт и не видях да има ограничения

Отговор
в отговор на Locolito #15

Благодаря

Благодаря за съдействието, а също така и за критиките. Грешката се оказа доста елементарна(опитвал съм да пълня масива преди да съм задал дължината му)

Отговор