Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.035 c
14-1122762702
DillerXX
2005-07-31 02:31
2005.08.21
Космические рейнджеры 2


14-1122795759
Kerk
2005-07-31 11:42
2005.08.21
С днем рожденья! 31 июля


3-1121234219
leonidus
2005-07-13 09:56
2005.08.21
ADO с провайдером Microsoft.Jet.OLEDB.4.0 не хочет делать INSERT


1-1123017490
iskatel
2005-08-03 01:18
2005.08.21
прокси, попытка 2 ))


3-1121085353
Извращенец2
2005-07-11 16:35
2005.08.21
Курсоры в MSSQL




   Наверх