如何在keil uvision 4中使用复杂的头文件?

时间:2012-03-31 08:35:04

标签: file header

以下是我写的程序

#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 :(得分:0)

您需要做四件事来使用Keil uVision编译程序:

  1. 将开关--c99添加到编译器参数中。原因是armcc已发货 使用Keil uVision 4在* .c文件中使用C90模式,可以在调用armcc时看到 没有参数的终端:

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

  2. 将代码中complex的所有出现更改为float complexdouble complex因为这些是C99中复杂数据类型的名称。还看 例如here

  3. -0.5+0.866i等复数的定义不起作用。改变这些  到-0.5+0.866*I

  4. 制作您自己的PI定义,因为它未在<math.h>中定义 与armcc。您可以使用例如

    #define M_PI 3.1415926535897932384626433832795

  5. 在这些步骤之后,代码至少会编译。但是,还有一些问题:

    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

    4. 希望有所帮助!

      #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]);    
          }     
      }