Не удается найти, что не так с объявлением массива - PullRequest
1 голос
/ 23 марта 2019

Там написано

фатально: синтаксическая ошибка, ожидаемый OF, но [найдено »для переменной" lo "

Но я действительно не вижу, что не так сэто.
Я пытался изменить имя переменной, но, кажется, не работает.

procedure reg(     index, gen : char; 
                   fname, sname, loginname, passwords, pid : string; 
               var lo : array [1..26,1..1025] of bucket ; 
               var main : array[1..1025] of detail);
var
  convertedindex, i, j : integer;
  found, found2 : boolean;

Это должно быть без ошибок, но он говорит синтаксическая ошибка.

Ответы [ 3 ]

3 голосов
/ 23 марта 2019

Вы не можете определить массив, пока вы находитесь в процессе объявления параметров процедуры (или функции). Вам нужно заранее определить тип массива, выполнив что-то вроде этого:

program arraydecl;

type
  Bucket = integer;
  Detail = integer;

type
  BucketArray = array [1..26,1..1025] of Bucket;
  DetailArray = array[1..1025] of Detail;

procedure reg(index, gen : char; fname, sname, loginname, passwords, pid : string ; var lo :  BucketArray; var main : DetailArray);
begin
end; 
2 голосов
/ 23 марта 2019

Списки параметров

В некоторых версиях Pascal, таких как FreePascal или Delphi , списки параметров функций или процедур не могут содержать тип объявления , только тип технические характеристики .

Итак, чтобы указать такой массив в качестве параметра, вы должны сначала объявить его тип перед объявлением функции / процедуры:

type 
  // Type declarations
  Bucket = ... 
  Detail = ...
  TBuckets = array[1..26, 1..1025] of Bucket;
  TDetails = array[1..1025] of Detail;

procedure Reg(Index, Gen: Char; FName, SName, LoginName, Passwords, PID: string; 
  var Lo: TBuckets; var Main: TDetails);

Обратите внимание, что другие Паскали (включая ISO Pascal, если я правильно помню) разрешают эти специальные (на месте) объявления даже в списках параметров. Но, очевидно, ваш диалект Паскаля не так.

Параметры открытого массива

Теперь, если вы видите спецификации параметров, такие как x: array of Integer или аналогичные, то вы имеете дело с параметрами открытого массива. Это не объявление, и оно не определяет один единственный тип, оно принимает все виды одномерных массивов этого базового типа. Подробнее об этом в моей статье Параметры открытого массива и массив const .

Это объясняет сообщение об ошибке: только of может следовать за array в списке параметров, чтобы указать параметр открытого массива.


Для чего это стоит: если вы используете FreePascal или Delphi, то вы должны иметь привычку передавать строки как const, если это возможно: const FName, SName, etc...: string.

2 голосов
/ 23 марта 2019

В сообщении об ошибке говорится, что компилятор ожидал ключевое слово of, но вместо этого он нашел открывающую скобку [.

Причина в том (я думаю), что в объявлениях процедур вы не можете определить границы массива. Например, вы не можете сказать main: array[1..2] of integer, вы можете сказать только main: array of integer.

Вы можете попытаться определить тип массива, а затем использовать этот тип в качестве параметра процедуры:

type TwoInts = array[1..2] of integer;

procedure PrintTwoInts(ti: TwoInts)
begin
  WriteLn(ti[1], ti[2])
end;

Я давно не программировал на Паскале, поэтому вышеперечисленное может работать или не работать. Я не помню, будет ли ti передаваться по значению или по ссылке, и будут ли индексы массива внутри процедуры всегда начинаться с 0. Вот некоторые вещи, которые вам необходимо выяснить.

...