Warning: printf argument mismatch for format f. Expected struct long double _Complex got double (Fortgeschr. Anfänger)
-
Hallo.
Wie meine Überschrift schon sagt, bekomme ich eine Warnung vom Compiler, was wohl bedeutet, dass ich irgendwo ShitBull gebaut habe
Hier nochmal die Warnung:
"printf argument mismatch for format f. Expected struct long double _Complex got double"Anbei der Code:
int CalcINPF(double **InterpolationFactors, unsigned long * fpInternalNodes, unsigned long **fpElementsOnNode, TNode * fpNode, TQuad * fpQuad, TTri * fpTri, unsigned long fnNode, unsigned long fnQuad, unsigned long fnTri, unsigned long fnInternalNodes, unsigned long fMEPN, unsigned int AreaInfluence){ unsigned long fi=0, fj=0, fk=0, fl=0, EN=0; double * Areas = (double *)calloc(fMEPN+1, sizeof(double)); double * Dist = (double *)calloc(fMEPN+1, sizeof(double)); double * fINPF = (double *)calloc((fMEPN * fnNode), sizeof(double)), * fINPF_Start = fINPF; double xP=0., yP=0., zP=0., SArea=0., SDist=0., MaxDist=0.; double DummyFaktor = 0.; for (fi=1;fi<=fnInternalNodes;fi++){ xP = fpNode[fpInternalNodes[fi]-1].x; yP = fpNode[fpInternalNodes[fi]-1].y; zP = fpNode[fpInternalNodes[fi]-1].z; while(fpElementsOnNode[fj][fpInternalNodes[fi]]!=0){ if(fpElementsOnNode[fj][fpInternalNodes[fi]]<=fnQuad){ Areas[fj] = fpQuad[fpElementsOnNode[fj][fpInternalNodes[fi]]-1].area; Dist[fj] = sqrt(pow(fpQuad[fpElementsOnNode[fj][fpInternalNodes[fi]]-1].midnode.x - xP,2) + pow(fpQuad[fpElementsOnNode[fj][fpInternalNodes[fi]]-1].midnode.y - yP,2) + pow(fpQuad[fpElementsOnNode[fj][fpInternalNodes[fi]]-1].midnode.z - zP,2)); SArea+=Areas[fj]; SDist+=(1./Dist[fj]); } else { Areas[fj] = fpTri[fpElementsOnNode[fj][fpInternalNodes[fi]]-fnQuad-1].area; Dist[fj] = sqrt(pow(fpTri[fpElementsOnNode[fj][fpInternalNodes[fi]]-fnQuad-1].midnode.x - xP,2) + pow(fpTri[fpElementsOnNode[fj][fpInternalNodes[fi]]-fnQuad-1].midnode.y - yP,2) + pow(fpTri[fpElementsOnNode[fj][fpInternalNodes[fi]]-fnQuad-1].midnode.z - zP,2)); SArea+=Areas[fj]; SDist+=(1./Dist[fj]); } fj++; } SArea/=fj; for (fk=0;fk<fj;fk++){ if (AreaInfluence == 1){ DummyFaktor = (((1./Dist[fk]))/(SDist))*(Areas[fk]/SArea); } else { DummyFaktor = (1./Dist[fk])/SDist; } fINPF[fl++] = DummyFaktor; Areas[fk] = 0.; Dist[fk] = 0.; printf("Index: %lu, Value: %f\n", fl, DummyFaktor); } SArea = 0.; SDist = 0.; fj=0; DummyFaktor = 0.; } for (fi=0;fi<fj;fi++){ printf("Index: %lu, Value: %f\n", fi, fINPF[fi]); } *InterpolationFactors = fINPF_Start; return 0; }
Die Warnung bezieht sich auf die Zeilen 39 und 46. Bei Zeile 39 wird die Variable "DummyFaktor" jedoch korrekt ausgegeben. In Zeile 46 sollte der gleiche Output erfolgen, da der jeweilige Wert von DummyFaktor in das Array fINPF geschrieben wird. Jedoch gibt die Ausgabe aus Zeile 46 stets den Wert 0.000000 zurück.
Ich habe hier gelesen, dass der korrekte Platzhalter für eine double-Variable in C %lf ist.
http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output
Allerdings löst das mein Problem nicht.Ich arbeite mit LCC32.
Also, kurz zusammengefasst: Die printf-Anweisung macht Probleme. Die Werte, die mit DummyFaktor ausgegeben werden sind i.O., wenngleich sich die Fehlermeldung ebenfalls darauf bezieht. Die Werte von fINPF aus Zeile 46 sind nicht mehr i.O. sondern alle 0.000000.
Sieht jemand den Fehler?
Bin für jeden Tipp dankbar.
Grüße aus Berlin,
CJens.
-
Der Formatspecifier für double (und float) bei printf ist %f.
Dein Compiler scheint da aber eine
struct long double _Complex
zu erwarten.
Bekommz aber (richtigerweise) ein double.Da solltest du mal die Compileroptionen durchsehen oder RTFM machen.
-
...auf Arbeit habe ich den TCC. Werde es mal damit versuchen.
-
Hallo.
Also, konnte den Fehler nicht beheben und er taucht jetzt immer wieder auf. Anbei der Code, bei dem der Fehler ebenfalls auftaucht:
typedef struct{ double x; double y; }TPoint; typedef struct{ double vx; double vy; }TVector; typedef struct{ TPoint P; unsigned long P1; unsigned long P2; unsigned long P3; unsigned long P4; unsigned long E1; unsigned long E2; unsigned long E3; unsigned long E4; double Value; double Area; TPoint xs1; TPoint xs2; TPoint xs3; TPoint xs4; TPoint xs1t; TPoint xs2t; TPoint xs3t; TPoint xs4t; TVector n1; TVector n2; TVector n3; TVector n4; }TQuad; int CalcQuadSpec(TQuad *fpQuad, TBar * fpBar, TNode * fpNode, unsigned long fnQuad){ unsigned long fi=0; do{ printf("Quad number: %lu\n Centerpoint position x = %f\n y = %f\n\n", fi+1, fpQuad[fi].P.x, fpQuad[fi].P.y); }while(++fi<fnQuad); }
Ich bekomme folgende Warnung:
printf argument mismatch for format f. Expected struct long double _Complex got doubleBei der Ausgabe erhalte ich für Position x und Position y stets 0.00000, was aber nicht korrekt ist (siehe drittes Beispiel mit fpQuad++ weiter unten).
Auf der Einsatz des Zuweisungsoperators "->" statt "." nutzt nichts.
Der Fehler liegt an den . zur Verbindung der typedef ebenen. Wenn ich mir die Variable E1 anzeigen lasse, also via:
int CalcQuadSpec(TQuad *fpQuad, TBar * fpBar, TNode * fpNode, unsigned long fnQuad){ unsigned long fi=0; do{ printf("Quad number: %lu\n E1: %lu\n\n", fi+1, fpQuad[fi].E1); }while(++fi<fnQuad); }
...funktioniert alles.
Was auch funktioniert ist folgendes:
int CalcQuadSpec(TQuad *fpQuad, TBar * fpBar, TNode * fpNode, unsigned long fnQuad){ unsigned long fi=0; do{ printf("Quad number: %lu\n Centerpoint position x = %f\n y = %f\n\n", fi+1, fpQuad->P.x, fpQuad->P.y); fpQuad++; }while(++fi<fnQuad); }
Das bringt mich aber nicht weiter, weil ich über den Index auf das Feld fpQuad zugreifen muss.
Ich muss langsam wissen, woran das liegt, denn ich habe diesen Fehler jetzt doch schon oft bekommen...
Vielen Dank,
CJens
-
Hallo.
Ja, leider halten sich die Anworten in Grenzen. Vielleicht liegt das daran, dass ich bisher hier kein nachvollziehbares Beispiel gepostet habe. Das möchte ich hiermit nachholen:
#include <stdio.h> #include <stdlib.h> typedef struct{ double x; double y; }TPoint; typedef struct{ TPoint P; unsigned long number; }TQuad; void LoadData(TQuad * fpQuad, unsigned long * nQuad); void PrintData(TQuad * fpQuad, unsigned long fnQuad); int main(){ TQuad * pQuad; unsigned long nQuad=0; pQuad = (TQuad *)calloc(2, sizeof(TQuad)); LoadData(pQuad, &nQuad); PrintData(pQuad, nQuad); system("PAUSE"); return 0; } void LoadData(TQuad * fpQuad, unsigned long * nQuad){ fpQuad->P.x = 1.; fpQuad->P.y = 1.; fpQuad->number = 1; fpQuad++; fpQuad->P.x = 2.; fpQuad->P.y = 2.; fpQuad->number = 2; *nQuad = 2; printf("Loading data complette\n\n"); } void PrintData(TQuad * fpQuad, unsigned long fnQuad){ unsigned long i=0; for (i=0;i<fnQuad; i++){ printf("Quad %lu\n x coordinate: %f\n y coordinate: %f\n number: %lu\n\n", i, fpQuad[i].P.x, fpQuad[i].P.y, fpQuad[i].number); } }
Dies ist ein ganz einfaches Beispiel, das für sich läuft.
Die Ausgabe in Zeile 47 ist hier aber korrekt - der Compiler spuckt aber trotzdem die Warnung: " printf argument mismatch for format f. Expected struct long double _Complex got double" aus.
Ich habe langsam das Gefühl, dass das alles an den benutzerdefinierten Variablen TPoint und TQuad liegt.Danke,
CJens
-
Der gcc kompiliert den Code ohne zu meckern. Keinerlei Warnungen.
-
Die wenigen Antworten kommen sicher deswegen, weil es kein C-Problem ist, sondern eins deines Compilers.
Geht dennprintf("Quad %lu\n x coordinate: %f\n y coordinate: %f\n number: %lu\n\n", i, (fpQuad+i)->P.x, *(fpQuad+i).P.y, fpQuad[i].number);
Beachte die 2 verschiedenen Versuche (bei x und y). Evtl. geht bei dir auch nur einer.
Möglicherweise ist das noch eine Einschränkung vom TCC.
Dann probier doch mal einen anderen Compiler.
-
Also getestet unter XP:
mit free bcc 5.5
mit dmc 8.52
mit gcc höher als 4.6.x
mit tcc 0.9.25kann ich die Warnung nicht bestätigen.
Hast du noch bestimmte Compiler-Schalter gesetzt?
Oder kannst du die Warnung nur auf dem LCC produzieren?
-
Es ist ein Fehler von LCC32 und liegt beim %lu. Es kommt keine Warnung mehr, wenn Du die Ausgabe auseinanderreißt:
printf("Quad %lu\n",i); printf(" x coordinate: %f\n y coordinate: %f\n number: %lu\n\n",fpQuad[i].P.x, fpQuad[i].P.y, fpQuad[i].number);
viele grüße
ralph