title: Translating array pointer access from C++ to Delphi
body: <p>I'd like to know if I translated a piece of code correctly from C++ to Delphi.
  It looks like it is working, but I have a feeling that I'm reading and writing into memory that I'm not supposed to using Delphi.</p>
  
  <p>Given C++ code:</p>
  
  <pre><code>struct tile_map
  {
      int32 CountX;
      int32 CountY;
  
      uint32 *Tiles;
  };
  
  inline uint32
  GetTileValueUnchecked(tile_map *TileMap, int32 TileX, int32 TileY)
  {
      uint32 TileMapValue = TileMap-&gt;Tiles[TileY*TileMap-&gt;CountX + TileX];
      return(TileMapValue);
  }
  
  uint32 Tiles00[9][17] =
      {
          {1, 1, 1, 1,  1, 1, 1, 1,  0, 1, 1, 1,  1, 1, 1, 1, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1},
          {1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1, 1},
      };
  // More tile map declarations ...   
  // uint32 Tiles01[9][17] = ...
  // uint32 Tiles10[9][17] = ...
  // uint32 Tiles11[9][17] = ...  
  
      tile_map TileMaps[2][2];
      TileMaps[0][0].CountX = 17;
      TileMaps[0][0].CountY = 9;
      TileMaps[0][0].Tiles = (uint32 *)Tiles00;
  
      TileMaps[0][1] = TileMaps[0][0];
      TileMaps[0][1].Tiles = (uint32 *)Tiles01;
  
      TileMaps[1][0] = TileMaps[0][0];
      TileMaps[1][0].Tiles = (uint32 *)Tiles10;
  
      TileMaps[1][1] = TileMaps[0][0];
      TileMaps[1][1].Tiles = (uint32 *)Tiles11;
  
  // Usage
      int32 PlayerTileX = 2;
      int32 PlayerTileY = 2;
      uint32 TileMapValue = GetTileValueUnchecked(&amp;TileMap[1][1], PlayerTileX, PlayerTileY);
  </code></pre>
  
  <p>Delphi translation:</p>
  
  <pre><code>program Project1;
  
  {$APPTYPE CONSOLE}
  
  type
      Puint32 = ^uint32;
  
      tile_map = record
          CountX : int32;
          CountY : int32;
  
          Tiles : Puint32;
      end;
      Ptile_map = ^tile_map;
  
  {$POINTERMATH ON}   
  function GetTileValueUnchecked(TileMap : Ptile_map; TileX, TileY : int32) : uint32; inline;
  begin
      result := TileMap^.Tiles[TileY * TileMap^.CountX + TileX];
  end;
  
  
  const //in the future these will be read from file, so const for now
      Tiles00:  array [0..8, 0..16] of uint32 =
      (
          (1, 1, 1, 1,  1, 1, 1, 1,  0, 1, 1, 1,  1, 1, 1, 1, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0,  0, 0, 0, 0, 1),
          (1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1, 1)
      );
      // More tile map declarations ...
      //Tiles01:  array [0..8, 0..16] of uint32 = ...
      //Tiles10:  array [0..8, 0..16] of uint32 = ...
      //Tiles11:  array [0..8, 0..16] of uint32 = ...
  var 
      TileMaps : array [0..1, 0..1] of  tile_map;
      PlayerTileX, PlayerTileY : int32;
      TileMapValue : uint32;
  begin
  
      TileMaps[0][0].CountX := 17;
      TileMaps[0][0].CountY := 9;
      TileMaps[0][0].Tiles := Addr(Tiles00);
  
      TileMaps[0][1] := TileMaps[0][0];
      TileMaps[0][1].Tiles := Addr(Tiles01);
  
      TileMaps[1][0] := TileMaps[0][0];
      TileMaps[1][0].Tiles := Addr(Tiles10);
  
      TileMaps[1][1] := TileMaps[0][0];
      TileMaps[1][1].Tiles := Addr(Tiles11);
  
      // Usage
      PlayerTileX := 2;
      PlayerTileY := 2;
      TileMapValue = GetTileValueUnchecked(@TileMaps[1][1], PlayerTileX, PlayerTileY);
  end.
  </code></pre>