Главная страница
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.047 c
4-1119683912
Grief
2005-06-25 11:18
2005.08.21
как нарисовать Cursor на DC?


4-1119986951
Ванечка
2005-06-28 23:29
2005.08.21
Права админа


1-1122999811
reg24r
2005-08-02 20:23
2005.08.21
Объектно-ориентированное программирование


11-1105695193
DmiSb
2005-01-14 12:33
2005.08.21
Печать страницы Excel не показывая самого Excel ?


1-1122938741
mangoost
2005-08-02 03:25
2005.08.21
function для точки