2012-03-31 48 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]);  
    }  
} 
相關問題