2012-03-31 9 views
0

Im Anschluss an das Programm, das ichWie benutzt man komplexe Header-Datei in 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(); 
} 

geschrieben haben, wenn ich das in keil Fehler zeigt verwenden möchten. Bitte schlagen Sie vor, wie man komplexe Manipulationen durchführt? Ich habe auch complex.h und _mingw.h aus dem Ordner devcpp include in den Ordner keil/c51/inc kopiert.

Antwort

0

Sie müssen vier Dinge tun, um Ihr Programm Kompilierung mit Keil uVision zu machen:

  1. den Schalter --c99 den Compiler Argumente hinzufügen. Der Grund dafür ist, dass armcc mit Keil uVision ausgeliefert 4 verwendet C90-Modus für * .c Dateien wie man sehen kann, wenn armcc in ein Terminal ohne Argumente aufrufen:

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

  2. ändern alle Vorkommen von complex in Ihr Code lautet float complex oder double complex, da dies die Namen für komplexe Datentypen in C99 sind. Schauen Sie auch here, zum Beispiel.

  3. Die Definitionen komplexer Zahlen wie -0.5+0.866i funktionieren nicht. Ändern Sie diese zu -0.5+0.866*I.

  4. Machen Sie Ihre eigene Definition von PI, da es nicht in <math.h> definiert ist, die mit armcc ausgeliefert wird. Sie können dies mit z.

    #define M_PI 3.1415926535897932384626433832795

Nach diesen Schritten der Code zumindest kompilieren. Allerdings gibt es noch ein paar Probleme:

  1. Sie verwenden %f zur Ausgabe eines komplexen Wert anstelle eines Schwimmers in der Linie

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

    Wie Vpol[i][0] die die Größe eines komplexen Nummer und Vpol[i][1] sein Argument, könnten Sie auch cabs(Vpol[i][0]) und creal(Vpol[i][1]) ausgeben.

    Natürlich wäre es noch besser, die Definition in float Vpol[3][2]; zu ändern, da Sie nur echte Werte in diesem Array speichern.

  2. Die Funktion getch() möglicherweise nicht vor dem Verbindungsteil von <stdio.h>, das heißt Sie möglicherweise müssen geben Sie Ihre eigene Implementierung sein.

  3. (Nicht wirklich ein "Problem"). Die Variable arr wird niemals verwendet.

Hoffe, dass hilft!

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