Динамичен масив
14 отговора
423 прегледа
Динамичен масив
Здравейте,
Моля да ми помогнете за следният ми проблем:Искам да създам динамичен масив и правя следното:
var
mas:array of Double;
n:integer;
......
begin
n:=3;
SetLength(mas,n);
......
end
Компилаторът не дава грешка, но когато се пробвам да пълня масива ми излиза грешка.
Благодаря предварително
Моля да ми помогнете за следният ми проблем:Искам да създам динамичен масив и правя следното:
var
mas:array of Double;
n:integer;
......
begin
n:=3;
SetLength(mas,n);
......
end
Компилаторът не дава грешка, но когато се пробвам да пълня масива ми излиза грешка.
Благодаря предварително
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;
Проблема май е в начина по който пълниш данните ? Точно това не си сложил в примера.
---

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;
Проблема май е в начина по който пълниш данните ? Точно това не си сложил в примера.
---
Re: Динамичен масив
Как пълниш масива, каква грешка ти дава? Дай повече инфо за да можем да ти помогнем!
При така зададените параметри, валидните обръщения са mas[0]..mas[2]. Ако опиташ нещо като mas[3]:=5, ще се получи грешка "Index out of bounds".
Mixy
При така зададените параметри, валидните обръщения са mas[0]..mas[2]. Ако опиташ нещо като mas[3]:=5, ще се получи грешка "Index out of bounds".
Mixy
Пример
Пълня го по този начин:
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
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
Re: Пример
Вместо read(f,mas[ i ]);
пиши read(f,mas[ i-1 ]);
Отговори си сам на въпроса Защо?
пиши read(f,mas[ i-1 ]);
Отговори си сам на въпроса Защо?
Re: Пример
Когато търсиш помощ, опитай се да формулираш добре проблема си. Много често това е достатъчно за да намериш решение.
1. Като не става, какво става
2. Отговори си на въпроса ЗАЩО?
3. RTFM
1. Като не става, какво става
2. Отговори си на въпроса ЗАЩО?
3. RTFM
Re: Пример
Виж, както каза Mixy трябва да използваш индекси от 0 до брой - 1. Само че грешка "Index out of bounds" ще получиш май само ако ти е пуснат range checking-а на компилатора. Иначе той няма да се усети и ти ще се опиташ да четеш/пишеш от елемент на индекс 3 (който се явява 4-ти!, а ти нямаш такъв), съответно това е в някаква памет, за която нямащ права и получаваш access violation.
А сега обясни по-подробно какво означава "пак не става" щото иначе друг отговор освен "ми хубаво" трудно ще получиш.
А сега обясни по-подробно какво означава "пак не става" щото иначе друг отговор освен "ми хубаво" трудно ще получиш.
Re: Пример
Изключвай възможностите една по една: виж какви данни четеш от файла(чети ги първо в отделна променлива.). Другото място от където може да имаш грешка е индексацията - както са ти подсказали колегите - при динамичните масиви индексите са от 0 (както в C) за разлика от статичните масиви. Тo май за друго не се сещам.
Успех!
P.S. NDeu, какво е това RTFM?????
Светът е малък нека си помагаме.
Успех!
P.S. NDeu, какво е това RTFM?????
Светът е малък нека си помагаме.
Re: Пример
Да, това, което казваш за "Index out of bounds" и Range checking е напълно вярно. Момчето трябва да си го включи, за да види дали това е проблема. Другия вариант е с постъпково изпълнение - при 3 цикъла е лесно. Щом му дава AV, най-вероятно променливата му broi е доста по-голяма от 3 и for-цикъла омазва други данни или код след края на масива.
Mixy
Mixy
Re: Пример - OFF
Много яка иконка!
Разрешаваш ли да си я препиша, за да я ползвам в проектите си?
Mixy
Разрешаваш ли да си я препиша, за да я ползвам в проектите си?
Mixy
Re: Пример - OFF
Ползвай на воля.
Аз самия съм я взел от някакъв руски сайт и не видях да има ограничения
Аз самия съм я взел от някакъв руски сайт и не видях да има ограничения
Благодаря
Благодаря за съдействието, а също така и за критиките. Грешката се оказа доста елементарна(опитвал съм да пълня масива преди да съм задал дължината му)