Pascal - несовместимый тип: получен «Array Of Extended», ожидаемое «QWord» / ошибка - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь отсортировать массив из 100000 расширенных чисел с помощью алгоритма быстрой сортировки, но я продолжаю получать следующие ошибки при вызове процедуры:

  • source.pas (69,26) Ошибка:Несовместимый тип для arg no.1: Получен «Массив [1..100000] Of Extended», ожидаемое «QWord»
  • source.pas (69,36) Ошибка: несовместимый тип для аргумента №.1: Получил «Массив [1..100000] Of Extended», ожидаемое «QWord»

    program test;
    
    type
    TVector = array of double;
    
    var
    N,M,i,x:longint;
    a,b,c,apod,af: Array[1..100000] of extended;
    
    procedure QuickSort(var apod: TVector; iLo, iHi: Integer) ;
    var Lo, Hi: Integer;
    pivot,t: double;
    begin
    if (iHi-iLo) <= 0 then exit;
    
    Lo := iLo;
    Hi := iHi;
    Pivot := apod[(Lo + Hi) div 2];
    
    repeat
    while A[Lo] < Pivot do Inc(Lo);
    while A[Hi] > Pivot do Dec(Hi);
    
    if Lo <= Hi then
    begin
     T := apod[Lo];
     apod[Lo] := apod[Hi];
     apod[Hi] := T;
     Inc(Lo) ;
     Dec(Hi) ;
    end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(apod, iLo, Hi) ;
    if Lo < iHi then QuickSort(apod, Lo, iHi) ;
    end;
    
    begin
            {a[i],b[i],c[i],af[i],N,M are initialiazed here}      
            apod[i]:=(a[i]-((a[i]*b[i])/3000)-((c[i]*a[i])/40));
    end;
    
    begin
    QuickSort(apod, Lo(apod), Hi(apod)) ;    
    end;
    end.
    

    Как это исправить?

1 Ответ

0 голосов
/ 08 декабря 2018

В вашем коде несколько синтаксических ошибок.Я не проверял, правильная ли ваша быстрая сортировка.Вы можете отладить это.

Типы массивов

Вы путаете несколько разных вещей:

  • динамические массивы (например, type array of double),
  • статические массивы (например, тип array[a..b] of double) и, возможно,
  • параметры открытого массива ( параметр array of double).

Ваш параметр имеет тип динамического массива (TVector), но вы передаете статический массив.Они не совместимы.

Чтобы передавать как динамический, так и статический массив, вы можете использовать упомянутые параметры открытого массива (обратите внимание, что они выглядят, но не совпадают с динамическими массивами).

procedure QuickSort(var apod: array of Double; iLo, iHi: Integer);

Подробнее о параметрах открытого массива в моей статье: Параметры открытого массива и массив const .

Var (опорные) параметры

Но есть еще одна проблема: var Параметры должны иметь точный тип (или базовый тип).Конверсия не состоится.Так что ваши a , b , c , apod и af должны содержать Doubles тоже:

var
  a, b, c, apod, af: array[1..100000] of Double;

Несвязанные блоки

Тогда свободные блоки begin end после функции QuickSort не имеют смысла.Это не Паскаль.Скорее сделайте что-то подобное в главном блоке (последний begin ... end. - обратите внимание на последний .):

begin
  for i := Low(apod) to High(apod) do
    apod[i] := (a[i] - ((a[i] * b[i]) / 3000) - ((c[i] * a[i]) / 40));
  QuickSort(apod, Low(apod), High(apod));
end.

Но обратите внимание, что приведенный выше код не имеет большого смысла.Вероятно, все значения в apod будут равны 0, поскольку a , b , c и т. Д. Еще не инициализированы (поэтому a[i] и т. д., вероятно, все 0).

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

Lo и Hi

Обратите внимание, что вы должны использовать Low и High.Lo и Hi - это нечто совершенно иное: они получают младший и старший байт 16-битного слова соответственно.Low и High получают границы массивов, наборов и типов.

...