2012-03-31 251 views
0

以下是我写如何在keil uvision 4中使用复杂的头文件?

#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包含文件夹到keil/c51/inc文件夹。

回答

0

你需要做四件事情使你的程序的编译采用Keil uVision:

  1. 开关--c99添加到编译器的参数。其原因是,armcc运 使用Keil uVision 4使用C90模式的* .c文件,可在 调用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. 做,因为它没有在<math.h>它随 与armcc定义了自己的PI定义。您可以使用例如

    #define M_PI 3.1415926535897932384626433832795

在这些步骤之后,代码将至少编译。然而,有几个问题:

  1. 你在该行

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

    由于Vpol[i][0]使用%f输出复杂的值,而不是一个浮动的是一个复杂的幅度号码和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]);  
    }  
} 
相关问题