Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Крыша едет с динмаическими массивами...   Найти похожие ветки 

 
Asteroid ©   (2005-08-02 01:12) [0]

Предвижу град камней в мою сторону за такой код %)

type
 TLayer = array of Word;
 TField = packed array [ 0..7, 0..7 ] of TLayer;
 TServerMap = packed array [ 0..255, 0..255 ] of TField;
 PServerMap = ^TServerMap;

var
 ServerMap, ObjectMap: PServerMap;
...
procedure MapsInit;
var i, j, k, l: Integer;
begin
 GetMem( ServerMap, sizeof( TServerMap ) );
 GetMem( ObjectMap, sizeof( TServerMap ) );
 for i := 0 to 255 do
   for j := 0 to 255 do
     for k := 0 to 7 do
       for l := 0 to 7 do
         begin
         SetLength( ServerMap^[ i, j ][ k, l ], 1 );
         SetLength( ObjectMap^[ i, j ][ k, l ], 1 ); // (*)
         end;

end;


Суть в том, что он вылетает на строчке (*). Отдельно для ServerMap работает, отдельно для ObjectMap - нет. Памяти выше крыши, все выделяется...
У меня уже крыша съехала...но Дельфи куда за мной пошла???


 
lookin ©   (2005-08-02 01:31) [1]

Я сам ничего в этом не понимаю... Но

type
TLayer = array of Word;
TField = packed array [ 0..7, 0..7 ] of TLayer;
TServerMap = packed array [ 0..255, 0..255 ] of TField;
PServerMap = ^TServerMap;

var
ServerMap, ObjectMap: PServerMap;
...
procedure MapsInit;
var i, j, k, l: Integer;
begin
GetMem( ServerMap, sizeof( TServerMap ) );
GetMem( ObjectMap, sizeof( TServerMap ) ); //почему не TObjectMap?
for i := 0 to 255 do
  for j := 0 to 255 do
    for k := 0 to 7 do
      for l := 0 to 7 do
        begin
        SetLength( ServerMap^[ i, j ][ k, l ], 1 );
        SetLength( ObjectMap^[ i, j ][ k, l ], 1 ); // (*)
        end;

end;


 
Asteroid ©   (2005-08-02 01:33) [2]

Они одного типа - PServerMap.


 
lookin ©   (2005-08-02 01:35) [3]

[2] Asteroid ©   (02.08.05 01:33)

Это так, и я сморозил глупости....


 
Asteroid ©   (2005-08-02 01:54) [4]

Фуууухххх...разобрался!
Надо было после GetMem заполнить нулями выделенную память. А то SetLength пытается обратиться по адресу того мусора, который там был...


 
Mx ©   (2005-08-02 02:06) [5]


> Asteroid ©   (02.08.05 01:54) [4]
> Надо было после GetMem заполнить нулями выделенную память

Либо юзать AllocMem


 
TUser ©   (2005-08-02 07:26) [6]

Либо вообще - New


 
tesseract ©   (2005-08-02 11:16) [7]

Вообще GetMem=NEW
FreeMem=Dispose
Размер выделяемой памяти игнорируется
AllocMem - тот же GetMem только область памяти забивается нулями.


 
Asteroid ©   (2005-08-02 12:53) [8]

А вообще по ночам спать надо, тогда и ошибок таких не будет %)
Всем спасибо :)



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

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
14-1122722534
Knight
2005-07-30 15:22
2005.08.21
Нужен "шпиён" за 1с...


14-1122377821
Knight
2005-07-26 15:37
2005.08.21
Астрономы есть?


9-1114777401
Chevrt
2005-04-29 16:23
2005.08.21
Повороот сцены


1-1122895028
Arrows
2005-08-01 15:17
2005.08.21
Мигающая кнопка на панели задач


1-1122368423
Dust
2005-07-26 13:00
2005.08.21
Создание логов