Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Сникерс
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 2
#1

Ошибка Record Array Of Variant

24.05.2013, 00:34. Просмотров 650. Ответов 3
Метки нет (Все метки)

Здравствуйте уважаемые форумчане. Есть задание переписать процедуру, осуществляющую БПФ из С++ в Делфи.
Но возникла проблема при реализации процедуры union
Исходный код С++
Код
union { double af[2048*2]; complex ac[2048]; } a;
Аналог написанный в Делфи
Код
procedure FFT(var nn:integer);
   Type
 b=Record
 case byte of
 0: (a1: record af: Array[0..2048*2] Of double; end);
 1: (a2: record ac: Array[0..2048] Of Variant; end);
  end;
на попытку компиляции выдает такую ошибку, ругаясь на строку
Код
1: (a2: record ac: Array[0..2048] Of Variant; end);
Ошибка
[DCC Error] курсач.pas(89): E2154 Type 'Variant' needs finalization - not allowed in variant record
Массив Array[0..2048] Of Variant нужен чтобы потом объявить массив комплексных чисел.
Исходная процедура на С++:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//#include <stdafx.h>
//#include "realfft.h"
 
#include <complex.h>
#include <conio.h>
 
union { double af[2048*2]; complex ac[2048]; } a;
 
void FFT(int nn)
{ int i, j, n, m, mmax, istep;
  double tempr, tempi, wtemp, theta, wpr, wpi, wr, wi, aw, fw;
  int isign = -1;
 
    n=nn << 1;
    j=1;
    i=1;
    while (i<n)
    { if (j>i)
      { tempr=a.af[i  ]; a.af[i  ] = a.af[j  ]; a.af[j  ] = tempr;
        tempr=a.af[i+1]; a.af[i+1] = a.af[j+1]; a.af[j+1] = tempr; }
      m=n>>1;
      while ((m>=2) && (j>m))
      { j=j-m;
        m=m>>1; }
      j=j+m;
      i=i+2; }
    mmax=2;
    while (n > mmax)
    { istep=2 * mmax;
      theta=2.0*M_PI/(isign*mmax);
      wtemp=sin(0.5*theta);
      wpr  =-2.0*wtemp*wtemp;
      wpi  =sin(theta);
      wr   =1.0;
      wi   =0.0;
      m    =1;
      while (m<mmax)
      { i=m;
        while (i<n)
        { j        =i + mmax;
          tempr    =wr * a.af[j  ] - wi * a.af[j+1];
          tempi    =wr * a.af[j+1] + wi * a.af[j  ];
          a.af[j  ]=a.af[i  ]-tempr;
          a.af[j+1]=a.af[i+1]-tempi;
          a.af[i  ]=a.af[i  ]+tempr;
          a.af[i+1]=a.af[i+1]+tempi;
          i        =i + istep; }
        wtemp=wr;
        wr   =wtemp*wpr - wi   *wpi + wr;
        wi   =wi   *wpr + wtemp*wpi + wi;
        m    =m+2; }
      mmax = istep; }
 
    for (i=0; i<(nn/2); i++)
    { aw=sqrt(a.af[i*2]*a.af[i*2] + a.af[i*2+1]*a.af[i*2+1]);
      if(a.af[i*2]!=0)
        fw=(180-atan2(a.af[i*2+1],a.af[i*2])*180./M_PI);
      else
       { if(a.af[i*2+1]>0)
           fw=+90;
         if(a.af[i*2+1]<0)
           fw=-90; }
      if(i==0) aw/=nn;
      else     aw/=nn/2;
      a.ac[i]=complex(aw, fw); }
}
 
void main(void)
{ int i,j, tn=2048;
  double am;
   textmode(C4350);
   clrscr();
 
   for(i=0; i<tn; i++)
   { a.ac[i]=complex( 0, 00.+
             16.*sin(1.0*(2*M_PI)/tn*i)+
             32.*sin(4.0*(2*M_PI)/tn*i)+
             64.*sin(9.0*(2*M_PI)/tn*i));
     //gotoxy(1,i+1);
     //cprintf("%02d %+06.2f %+06.2f %+06.2f %+06.2f",
     //     i, real(a.ac[i]), imag(a.ac[i]), a.af[i<<1], a.af[i<<1+1]);
   }
   //getch();
 
   FFT(tn);
   for(i=0; i<tn/2; i++)
   { if(i<40)
     { gotoxy(40,i+1);
       cprintf("%02d A%+07.3f F%+07.3f",
        i-1, a.af[(i<<1)], a.af[(i<<1)+1]); } }
   getch(); }

Полный листнг моей попытки перевода:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
   //БПФ с С++
   procedure FFT(var nn:integer);
   Type
 b=Record
 case byte of
 0: (a1: record af: Array[0..2048*2] Of double; end);
 1: (a2: record ac: Array[0..2048] Of Variant; end);  {Тут ошибки выдает}
  end;
 
var
  i, j, n, m, mmax, istep, isign: Integer;
  tempr, tempi, wtemp, theta, wpr, wpi, wr, wi, aw, fw: Double;
  a: b;
 
  const
  TwoPi = 6.283185307179586;
begin
 
  isign := -1;
  n:=nn  Shl 1;
  j:=1;
    i:=1;
  while (i<n) do
  begin
   if (j>i) then
   begin
    tempr:=a.a1.af[i  ];
     a.a1.af[i  ] := a.a1.af[j  ]; a.a1.af[j  ] := tempr;
        tempr:=a.a1.af[i+1]; a.a1.af[i+1] := a.a1.af[j+1]; a.a1.af[j+1] := tempr;
   end;
   m:=n Shr 1;
   while ((m>=2) and (j>m)) do
    begin
       j:=j-m;
        m:=m Shr 1;
    end;
   j:=j+m;
      i:=i+2;
  end;
   mmax:=2;
   while (n > mmax) do
   begin
     istep:=2 * mmax;
      theta:=TwoPi/(isign*mmax);
      wtemp:=sin(0.5*theta);
      wpr  :=-2.0*wtemp*wtemp;
      wpi  :=sin(theta);
      wr   :=1.0;
      wi   :=0.0;
      m    :=1;
    while (m<mmax) do
    begin
      i:=m;
          while (i<n)   do
        begin
      j        :=i + mmax;
          tempr    :=wr * a.a1.af[j  ] - wi * a.a1.af[j+1];
          tempi    :=wr * a.a1.af[j+1] + wi * a.a1.af[j  ];
          a.a1.af[j  ]:=a.a1.af[i  ]-tempr;
          a.a1.af[j+1]:=a.a1.af[i+1]-tempi;
          a.a1.af[i  ]:=a.a1.af[i  ]+tempr;
          a.a1.af[i+1]:=a.a1.af[i+1]+tempi;
          i        :=i + istep;
        end;
    wtemp:=wr;
        wr   :=wtemp*wpr - wi   *wpi + wr;
        wi   :=wi   *wpr + wtemp*wpi + wi;
        m    :=m+2;
    end;
    mmax := istep;
   end;
    for i:=0 to  round((nn/2)) do
    begin
    aw:=sqrt(a.a1.af[i*2]*a.a1.af[i*2] + a.a1.af[i*2+1]*a.a1.af[i*2+1]);
      if(a.a1.af[i*2]<>0) then
        //fw:=(180-ArcTan(a.a1.af[i*2+1], a.a1.af[i*2])*180./pi)
    else
    begin
    if(a.a1.af[i*2+1]>0) then
           fw:=+90;
         if(a.a1.af[i*2+1]<0)  then
           fw:=-90;
    end;
    if(i=0) then aw := aw / nn
   else aw:=aw/nn/2;
   // a.a2.ac[i]:=VarComplexCreate;
    //a.a2.ac[i].Real:=aw;              {Тут ошибки выдает}
    //a.a2.ac[i].Imaginary:=fw;
    //a.a1.ac[i]:=complex(aw, fw);
    end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 00:34
Ответы с готовыми решениями:

Не выполняется процедура ("Variant of save array index out of bounds")
Ребят что то я затупил. Подскажите почему не выполняется процедура. Ниже код...

Ошибка Invalid variant type
Код procedure TForm1.Button1Click(Sender: TObject); var DERMATOLOGY_TABLE...

Динамический массив of variant, почему ошибка?
ребята привет,объясни пожалуйста почему так нельзя делать function...

Как создать record внутри которого есть динамический массив с record-ами?
Упрощу код, чтоб не писать полные record-ы: type TSec = record vSize...

Ошибка. Record.end
Ошибка 39 и 40 строки. Пишет, что types of actual and formal var parameters...

3
Arcor
4882 / 1834 / 382
Регистрация: 20.11.2009
Сообщений: 5,888
Записей в блоге: 1
24.05.2013, 01:07 #2
ошибку выдает, что в данном случае нельзя использовать вариантную запись.....
ну, а что туда должно записаться то? не числа ли какие-то? там же же все равно будут числа храниться.. вот и числовой тип туда присобачить
1
Сникерс
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 2
24.05.2013, 01:18  [ТС] #3
Не уверен, можно числовой тип прикрутить. Туда ведь комплексные числа должны записываться, а это два числа-мнимая и реальная часть.
C++
1
a.ac[i]=complex(aw{мнимая}, fw{целая части});
Delphi
1
2
3
 a.a2.ac[i]:=VarComplexCreate;
    //a.a2.ac[i].Real:=aw;             
    //a.a2.ac[i].Imaginary:=fw;
Думаете, что в данном случае можно обойтись простым числовой типом?
0
Arcor
4882 / 1834 / 382
Регистрация: 20.11.2009
Сообщений: 5,888
Записей в блоге: 1
24.05.2013, 01:21 #4
Delphi
1
2
3
4
type TLala = record
  RealTeil: Real; // реальная часть
  ImaginaerTeil: Real; // мнимая часть
end;
так нельзя объявить структуру для мнимой и реальной части?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 01:21

Ошибка Record, object or class type required
unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Ошибка: Record object or class type required
{$WARN SYMBOL_PLATFORM OFF} unit FormMain; interface uses Windows,...

Ошибка: Record, object or class type required
Код программы: unit UnitZakazch; interface uses Winapi.Windows,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru