@viqking

Как заполняются многомерные массивы?

Переписываю программу с delphi на c#, опыта работы с delphi нет. Столкнулся с проблемой,не пойму, как заполняется массив mkts и msh. Буду признателен любой помощи.

mkts = array [0..3, 1..6, 1..16] of SmallInt;
msh = array[1..392] of SmallInt;

TPmkts = ^mkts;
TPmsh = ^msh;

Pkts: array[1..Blocks, 1..RTParts] of TPmkts = ( (nil, nil),
                                (nil, nil), (nil, nil), (nil, nil) );
Psh: array[1..4, 1..2] of TPmsh = ( (nil, nil),
                                (nil, nil), (nil, nil), (nil, nil) );
...
Df: array[1..4, 1..2] of integer;

{------------------------------------------------------------------------}

function OpenA(FileName: ShortString; Mode: LongWord): integer;
begin
  Result:= FileOpen(FileName, Mode);
end;

{------------------------------------------------------------------------}

function ReadA(Df: integer; Pmas: Pointer; L: word): boolean;
begin
  Result:= false;
  if FileSeek(Df, 0, 0) = 0 then
    if FileRead(Df, Pmas^, L) > 0 then
      Result:= true;
end;
...

{------------------------------------------------------------------------}

Df[BlNum, ROTO]:= OpenA(ShifrFileName, fmShareDenyNone);

{ Выделение памяти }
New(Psh[4, 1]);

if not ReadA(Df[4, 1], Psh[4, 1], 784) then
begin
  CloseA(Df[4, 1]);
  Dispose(Psh[4, 1]);
  Exit;
end;

Pkts[4, 1]:= @Psh[4, 1]^[9];
  • Вопрос задан
  • 201 просмотр
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
New(Psh[4, 1]);
Переводим на C#. Правда, тут есть одна загвоздка. Массивы в c# начинаются только с 0, и надо смотреть: либо заводить холостой 0-й элемент, либо корректировать индексы. Так что перед нами два варианта.
Psh[4][1] = new short[393];
Psh[3][0] = new short[392];
(для примера работаю со вторым)

function OpenA(FileName: ShortString; Mode: LongWord): integer;
Stream OpenA(string FileName, FileAccess access);


Как перевести ReadA? Это не так просто. Дело в том, что языки со стандартным промежуточным кодом (к ним относятся в первую очередь языки семейства Java и .NET) обычно пишут в порядке байтов Motorola. На Delphi файл писался в порядке Intel. Так что мы считываем 392 word’а, а затем смотрим, что делать: либо обернуть байты, либо сказать: теперь у нас новый стандарт — Motorola!

if (!ReadA(Df[3][0], Psh[3][0], 392) {
  CloseA(Df[3, 0]);
  Psh[3][0] = null;
  return;
}


И последний рывок.
Pkts[4, 1]:= @Psh[4, 1]^[9];
Из-за отсутствия указателей (точнее, есть они, но мы же не хотим unsafe-кода) придётся Pkts разбивать на две части: ссылку на массив и смещение в массиве.
Pkts[3][0].array = Psh[3][0];
Pkts[3][0].offset = 8;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы