Как использовать сложный заголовочный файл в Keil Uvision 4? - PullRequest
0 голосов
/ 31 марта 2012

Ниже приведена программа, которую я написал

#include <stdio.h>
#include<complex.h>
#include<math.h>

int main()
{   
unsigned char i,j,p,q;
complex arr[3][2]={{60 ,0},{80 ,-120},{100, -240}};
complex fabcr[3][1]={60+0i,-40-69.2820i,-50+86.6025i};
complex fa012[3][1], D[3][1],B[3][1],Vbal[3][1];
complex Vpol[3][2];
complex sum,l;
complex A[3][3]={{1  , 1 ,  1}, {1 ,-0.5+0.866i ,-0.5-0.866i}, {1 ,-0.5-0.866i, -0.5+0.866i}};
complex invA[3][3]=  {{0.3333 - 0.0000i ,  0.3333 + 0.0000i,   0.3333},          
                    {0.3333 ,-0.1667 - 0.2887i,  -0.1667 + 0.2887i},
                   { 0.3333 + 0.0000i , -0.1667 + 0.2887i , -0.1667 - 0.2887i}};
complex a=-0.5+0.866i;
//a^2 =-0.5-0.866i
printf("%f +i %f \n  %f %f",creal(a),cimag(a),cabs(a),(180/M_PI)*carg(a));
printf("\n line voltage fabcr \n\n");
for(i=0;i<3;i++)
{            
       for(j=0;j<1;j++)
            {
            printf( "%f +i %f ",creal(fabcr[i][j]),cimag(fabcr[i][j]));
            }
       printf("\n"); 
}
printf("\n A matrix \n\n");

for(i=0;i<3;i++)
{            
       for(j=0;j<3;j++)
            {
            printf( "%f +i %f ",creal(A[i][j]),cimag(A[i][j]));
            }
       printf("\n"); 
}
printf("\ninvA matrix\n\n");
for(i=0;i<3;i++)
{            
       for(j=0;j<3;j++)
            {
            printf( "%f +i %f ",creal(invA[i][j]),cimag(invA[i][j]));
            }
       printf("\n \n"); 
}

//matrix multiplication
for(p=0;p<3;p++)
    {
         sum=0;       
         for(q=0;q<3;q++)
         {
           l=fabcr[q][0]*A[p][q];
           sum=sum+l;

              }      
           printf("%f i %f \n", creal(sum),cimag(sum));   
          //fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum); 
          fa012[p][0]=sum*0.33;

     }
    printf("\n symmetrical componenet fa012\n \n"); 
    for(p=0;p<3;p++)
    {
        printf("%f i %f \n", creal(fa012[p][0]),cimag(fa012[p][0]));
    }

D[0][0]=-fa012[0][0];
D[1][0]=0;
D[2][0]=-fa012[2][0];
printf("\n matrix D \n \n");
 for(p=0;p<3;p++)
    {
        printf("%f i %f \n", creal(D[p][0]),cimag(D[p][0]));
    }
printf("\n\nzero and negative sequence component in line voltage terms\n\n");
 for(p=0;p<3;p++)
    {
         sum=0;       
         for(q=0;q<3;q++)
         {
           l=D[q][0]*invA[p][q];
           sum=sum+l;

              }      
           printf("%f i %f \n", creal(sum),cimag(sum));   
          //fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum); 
          B[p][0]=sum*3;

     }
printf("\n\nfinal balanced voltage \n\n")   ;  
for(p=0;p<3;p++)
    {
     Vbal[p][0]=fabcr[p][0]+B[p][0];
     printf("\n %f i %f \n %f %f \n", creal( Vbal[p][0]),cimag(Vbal[p][0]),cabs(Vbal[p][0]),(180/M_PI)*carg(Vbal[p][0])); 
      }

   printf("\n\n conversion to polar cordinates \n\n") ;
for(i=0;i<3;i++)
{            
    Vpol[i][0]= cabs(Vbal[i][0]);
    Vpol[i][1]= (180/M_PI)*carg(Vbal[i][1]);
    printf("%f  %f \n",Vpol[i][0],Vpol[i][1]  );    

}     

getch();
}

Если я хочу использовать это в keil, это показывает ошибку.Подскажите пожалуйста, как делать сложные манипуляции?Я также скопировал complex.h и _mingw.h из папки devcpp include в папку keil / c51 / inc.

1 Ответ

0 голосов
/ 19 июля 2012

Вам нужно сделать четыре вещи, чтобы ваша программа компилировалась с помощью Keil uVision:

  1. Добавьте ключ --c99 к аргументам компилятора. Причина в том, что armcc отправлен с Keil uVision 4 использует режим C90 для файлов * .c, что видно при вызове armcc в терминал без аргументов:

    --c90 Switch to C mode (default for .c files)

  2. Измените все вхождения complex в вашем коде на float complex или double complex так как это имена для сложных типов данных в C99. Смотрите также здесь , например.

  3. Определения комплексных чисел, такие как -0.5+0.866i, не работают. Изменить эти до -0.5+0.866*I.

  4. Сделайте свое собственное определение PI, поскольку оно не определено в <math.h>, который поставляется с armcc. Вы можете сделать это, например, с помощью

    #define M_PI 3.1415926535897932384626433832795

После этих шагов код будет по крайней мере компилироваться. Однако есть еще несколько проблем:

  1. Вы используете %f для вывода комплексного значения вместо числа с плавающей запятой в строке

    printf("%f %f \n",Vpol[i][0],Vpol[i][1] );

    Поскольку Vpol[i][0] является величиной комплексного числа, а Vpol[i][1] его аргумент, вы могли бы также вывести cabs(Vpol[i][0]) и creal(Vpol[i][1]).

    Конечно, было бы еще лучше изменить определение на float Vpol[3][2]; поскольку вы храните только реальные значения в этом массиве.

  2. Функция getch() может не входить в <stdio.h>, т. Е. Возможно, вам придется предоставьте свою реализацию перед установкой ссылки.

  3. (На самом деле это не «проблема»). Переменная arr никогда не используется.

Надеюсь, это поможет!

#include <stdio.h>
#include <complex.h>
#include <math.h>

#define M_PI 3.1415926535897932384626433832795

int main()
{   
    unsigned char i,j,p,q;
    float complex fabcr[3][1] = {60+0*I,-40-69.2820*I,-50+86.6025*I};
    float complex fa012[3][1], D[3][1],B[3][1],Vbal[3][1];
    float Vpol[3][2];
    float complex sum,l;
    float complex A[3][3] = {{1, 1,            1}, 
                             {1, -0.5+0.866*I, -0.5-0.866*I}, 
                             {1, -0.5-0.866*I, -0.5+0.866*I}};
    float complex invA[3][3] 
        = {{0.3333 - 0.0000*I, 0.3333 + 0.0000*I,  0.3333},          
           {0.3333,            -0.1667 - 0.2887*I, -0.1667 + 0.2887*I},
           {0.3333 + 0.0000*I, -0.1667 + 0.2887*I, -0.1667 - 0.2887*I}};
    float complex a = -0.5+0.866*I;
    //a^2 =-0.5-0.866i
    printf("%f +i %f \n  %f %f", creal(a), cimag(a), 
                                 cabs(a), (180/M_PI) * carg(a));
    printf("\n line voltage fabcr \n\n");
    for(i=0; i<3; i++)
    {            
        for(j=0; j<1; j++)
        {
            printf( "%f +i %f ",creal(fabcr[i][j]),cimag(fabcr[i][j]));
        }
        printf("\n"); 
    }
    printf("\n A matrix \n\n");

    for(i=0; i<3; i++)
    {            
        for(j=0;j<3;j++)
        {
            printf( "%f +i %f ",creal(A[i][j]),cimag(A[i][j]));
        }
        printf("\n"); 
    }
    printf("\ninvA matrix\n\n");
    for(i=0; i<3; i++)
    {            
        for(j=0;j<3;j++)
        {
            printf( "%f +i %f ",creal(invA[i][j]),cimag(invA[i][j]));
        }
        printf("\n \n"); 
    }

    // matrix multiplication
    for(p=0; p<3; p++)
    {
        sum=0;       
        for(q=0; q<3; q++)
        {
            l=fabcr[q][0]*A[p][q];
            sum=sum+l;
        }      
        printf("%f i %f \n", creal(sum),cimag(sum));   
        // fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum); 
        fa012[p][0]=sum*0.33;
    }
    printf("\n symmetrical component fa012\n \n"); 
    for(p=0; p<3; p++)
    {
        printf("%f i %f \n", creal(fa012[p][0]),cimag(fa012[p][0]));
    }

    D[0][0] = -fa012[0][0];
    D[1][0] = 0;
    D[2][0] = -fa012[2][0];
    printf("\n matrix D \n \n");
    for(p=0; p<3; p++)
    {
        printf("%f i %f \n", creal(D[p][0]),cimag(D[p][0]));
    }
    printf("\n\nzero and negative sequence component in line voltage terms\n\n");
    for(p=0; p<3; p++)
    {
        sum=0;       
        for(q=0; q<3; q++)
        {
            l=D[q][0]*invA[p][q];
            sum=sum+l;
        }      
        printf("%f i %f \n", creal(sum),cimag(sum));   
        //fa012[p][1]=(1/3)*creal(sum)+i*(1/3)*cimag(sum); 
        B[p][0]=sum*3;
    }
    printf("\n\nfinal balanced voltage \n\n")   ;  
    for(p=0; p<3; p++)
    {
        Vbal[p][0] = fabcr[p][0]+B[p][0];
        printf("\n %f i %f \n %f %f \n", 
               creal(Vbal[p][0]), cimag(Vbal[p][0]),
               cabs(Vbal[p][0]), (180/M_PI) * carg(Vbal[p][0])); 
    }

    printf("\n\n conversion to polar cordinates \n\n") ;
    for(i=0; i<3; i++)
    {            
        Vpol[i][0] = cabs(Vbal[i][0]);
        Vpol[i][1] = (180/M_PI) * carg(Vbal[i][1]);
        printf("%f  %f \n", Vpol[i][0], Vpol[i][1]);    
    }     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...