|
|
|
Forum Member
      
участник
Last Login: 30.12.2008 10:13
Сообщ.: 39,
Visits: 324
|
|
Есть вот такой код:
...
var
MessGn: array of array of array of real;
...
Z:=1; Imax:=4; Jmax:=4;
SetLength(MessGn,Z,Imax+1,Jmax+1);
for I:=1 to Imax do
for J:=1 to Jmax do
MessGn[Z,I,J]:=StrToFloat(MatrixGrid.Cells[I,J]); <вот на этой строке, в первом же круге цикла возникает ошибка EAccessViolation. Ячейки заполнены в соответствии с real.
Пробовал ставить Z:=100, вроде проходит весь цикл. Но мне так нельзя - Z должно быть совсем не 100, а 1.
Если SetLength не ставить (так вообще можно делать, кажися), выбивает на ту же самую ошибку.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 18.12.2007 11:03
Сообщ.: 121,
Visits: 1 203
|
|
| есть такая функция StrToFloatDef нужно обрабатывать тот случай, если у тебя в ячейке не число, или ты думаешь, что число а оно все таки не число :)
|
|
|
|
|
Forum Member
      
участник
Last Login: 30.12.2008 10:13
Сообщ.: 39,
Visits: 324
|
|
| Трабла не в сответствии типов, а в размере массива или памяти, которая выделяется под него.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 18.12.2007 11:03
Сообщ.: 121,
Visits: 1 203
|
|
| а, ну тогда смотри внимательно на свою строчку SetLength(MessGn,Z,Imax+1,Jmax+1); чем первая размерность отличается от второй и треттей принципиально, ведь ничем? для второй и третьей ты правильно написал длинну+1 (потому что ты не используешь значения массива с индексом 0, а первый индекс тут всегда 0). а вот для первой размерности - неправильно указал длинну. если Z=1 то первый (и он же последний) индекс будет 0, а ты обращаешься к индексу 1 (а его нету, при динне массива 1) сделай по аналогии +1
|
|
|
|
|
Forum Member
      
участник
Last Login: 30.12.2008 10:13
Сообщ.: 39,
Visits: 324
|
|
Ай, хороший человек! Спасибо! Все заработало!
|
|
|
|