Viele Bäume - wo ist der Wald (fortgeschrittener Anfänger)



  • Hallo Leute,

    ich habe ein Problem, dass ich eigentlich nicht beschreiben kann, daher einfach mal der Code (es geht um die Funktion PrintElement):

    double CalcTriAngle(double x1, double x2, double x3, double y1, double y2, double y3, double z1, double z2, double z3){
    	double A1, A2, A3;
    	A1 = acos(((x2-x1)*(x3-x1) + (y2-y1)*(y3-y1) + (z2-z1)*(z3-z1))/(sqrt(pow(x2-x1,2)+pow(y2-y1,2)+pow(z2-z1,2)) * sqrt(pow(x3-x1,2)+pow(y3-y1,2)+pow(z3-z1,2))));
    	A2 = acos(((x3-x2)*(x1-x2) + (y3-y2)*(y1-y2) + (z3-z2)*(z1-z2))/(sqrt(pow(x3-x2,2)+pow(y3-y2,2)+pow(z3-z2,2)) * sqrt(pow(x1-x2,2)+pow(y1-y2,2)+pow(z1-z2,2))));
    
    //Fehlermeldung zeigt auf folgende Zeile (Zeile 1481)
    	A3 = PI - (A1 + A2);
    	return(fmin(A1, fmin(A2, A3))*(180/PI));
    }
    
    void PrintElements(TNode * fpNode, TBar * fpBar, TTri * fpTri, TQuad * fpQuad, int nBar, int nTri, int nQuad){
    	int i;
    	TQuad * fpQuadStart = fpQuad;
    	TTri * fpTriStart = fpTri;
    
    	//Writing header
    	printf("Writing information for %d elements\n", (nBar + nTri + nQuad));
    	printf("+--------+--------+--------+--------+--------+--------+--------+\n");
    	printf("| number |  type  |family #|   N1   |   N2   |   N3   |   N4   |\n");
    	printf("+--------+--------+--------+--------+--------+--------+--------+\n");
    
    	//Output Bar information
    	if (nBar > 0){
    		for (i=0; i<nBar; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|   --   |   --   |\n", fpBar->number, "  Bar   ", fpBar->family, fpBar->P1, fpBar->P2);
    			fpBar++;
    		}
    	}
    
    	//Output Tri information
    	if (nTri > 0){
    		for (i=0; i<nTri; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|%8d|   --   |\n", fpTri->number, "  Tri   ", fpTri->family, fpTri->P1, fpTri->P2, fpTri->P3);
    			fpTri++;
    		}
    	}
    
    	//Output Quad information
    	if (nQuad > 0){
    		for (i=0; i<nQuad; i++){
    
    //Diese Stelle verursacht den Fehler!!!
    			printf("|%8d|%s|%8d|%8d|%8d|%8d|%8d|\n", fpQuad->number, "  Quad  ", fpQuad->family, fpQuad->P1, fpQuad->P2, fpQuad->P3, fpQuad->P4);
    //Ende
    
    			fpQuad++;
    		}
    	}	printf("+--------+--------+--------+--------+--------+--------+--------+\n\n\n");
    }
    

    Ich habe die Problemstelle isolieren können. Sie ist mit //Es geht um diese Stelle bis //Ende gekennzeichnet.

    Die Fehlermeldung lautet:
    Error "Dateipfad" 1481 syntax error; found 'end of input' expecting '}'

    Wenn ich die Fehlermeldng doppelklicke, zeigt er mir die Zeile 1481. Das ist die Zeile in der Funktion CalcTriAngle und zwar wo steht A3 = ...

    Wenn ich den Code wie folgt schreibe, funktioniert alles (einziger Unterschied ist die Deklaration von P4 in der Funktion PrintElements):

    void PrintElements(TNode * fpNode, TBar * fpBar, TTri * fpTri, TQuad * fpQuad, int nBar, int nTri, int nQuad){
    	int i;
    //Einzige Änderung ist diese Deklaration
    	unsigned long P4;
    	TQuad * fpQuadStart = fpQuad;
    	TTri * fpTriStart = fpTri;
    
    	//Writing header
    	printf("Writing information for %d elements\n", (nBar + nTri + nQuad));
    	printf("+--------+--------+--------+--------+--------+--------+--------+\n");
    	printf("| number |  type  |family #|   N1   |   N2   |   N3   |   N4   |\n");
    	printf("+--------+--------+--------+--------+--------+--------+--------+\n");
    
    	//Output Bar information
    	if (nBar > 0){
    		for (i=0; i<nBar; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|   --   |   --   |\n", fpBar->number, "  Bar   ", fpBar->family, fpBar->P1, fpBar->P2);
    			fpBar++;
    		}
    	}
    
    	//Output Tri information
    	if (nTri > 0){
    		for (i=0; i<nTri; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|%8d|   --   |\n", fpTri->number, "  Tri   ", fpTri->family, fpTri->P1, fpTri->P2, fpTri->P3);
    			fpTri++;
    		}
    	}
    
    	//Output Quad information
    	if (nQuad > 0){
    		for (i=0; i<nQuad; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|%8d|%8d|\n", fpQuad->number, "  Quad  ", fpQuad->family, fpQuad->P1, fpQuad->P2, fpQuad->P3, fpQuad->P4);
    			fpQuad++;
    		}
    	}
    	printf("+--------+--------+--------+--------+--------+--------+--------+\n\n\n");
    
    }
    

    Der Unterschied ist, dass ich zu Beginn der Funktion "PrintElements" die Variable P4 als unsigned long noch deklariert habe - diese Variable wird nie verwendet.

    Noch ein paar Background Informationen: fpQuad ist ein Pointer auf eine Array mit einer Benutzerdefinierten Variablen. Diese soll Vierecke (Elemente) repräsentieren, wobei fpQuad->P1 den ersten Eckpunkt, fpQuad->P2 den zweiten Eckpunkt etc. repräsentieren. fpQuad->number beinhaltet die Nummer des Elements, fpQuad->family die Nummer der Gruppe, zu dieser dieses Element gehört.

    Ich kann damit leben, dass ich diese Variable noch deklariere aber ich denke, der Fehler muss ja irgendwo liegen und vielleicht auch ganz wo anders. Evtl. sehe ich den Wald vor lauter Bäumen nicht.

    Ach ja, wenn ich anstatt %8d %8i schreibe, ändert das nichts.

    Ich benutze lcc32 zum Programmieren/Komplilieren. Der gesamte Code ist etwa 2000 Zeilen lang - das wollte ich Euch ersparen.

    Vielen Dank schonmal, dass Ihr Euch meinem Problem annehmt.



  • Anbei noch die benutzerdefinierten Variablentypen:

    typedef struct {
    	double x, y, z;
    	double Variables[NVariables];
    } TMidNode;
    
    typedef struct {
    	unsigned long P1, P2;
    	unsigned long number;
    	unsigned int family;
    	TMidNode midnode;
    	unsigned long E1;
    	unsigned long E12, E23;
    } TBar;
    
    typedef struct {
    	unsigned long P1, P2, P3;
    	unsigned long number;
    	unsigned int family;
    	TMidNode midnode;
    	double area;
    	unsigned long E12, E23, E31;
    	unsigned long E1, E2, E3;
    } TTri;
    
    typedef struct {
    	unsigned long P1, P2, P3, P4;
    	unsigned long number;
    	unsigned int family;
    	TMidNode midnode;
    	double area;
    	unsigned long E12, E23, E34, E41;
    	unsigned long E1, E2, E3, E4;
    } TQuad;
    


  • Der Fehler kann auch in den 1480 Zeilen vorher sein.
    Wo kommt denn das PI her?
    (Bitte Kopie aus dem Quelltext mit Copy&Paste)



  • Hallo Dirk,

    das PI habe ich am Anfang deklariert.

    #define PI 3.14159265 //Pi number
    

    Wie gesagt, der Quellcode ist über 2000 Zeile lang. Ich kann das nicht alles kopieren.
    Komisch doch nur, dass die Fehlermeldung verschwindet, wenn ich in der Funktion danach eine Variable deklariere. Auch verschwindet der Fehler, wenn ich einmal das %8d lösche und fpQuad->P4 wegnehme.
    fpQuad->P4 beinhaltet allerdings einen korrekten Wert, was ich mit

    printf"%i\n",fpQuad->P4);
    

    getestet habe.

    Der Quelltext, der Euch vorliegt ist direkt aus dem Programm mit Copy&Paste entnommen.



  • %d und %i stehen für (signed) int und haben bei printf die gleiche Funktion.
    Der Formatspecifier für unsigned long bei printf ist %lu.



  • Sogar das hier funktioniert (anstatt des Codes, bei dem der Fehler auftritt):

    //Output Quad information
    if (nQuad > 0){
         for (i=0; i<nQuad; i++){
    			printf("|%8d|%s|%8d|%8d|%8d|%8d|", fpQuad->number, "  Quad  ", fpQuad->family, fpQuad->P1, fpQuad->P2, fpQuad->P3);
    			printf("%8d|\n", fpQuad->P4);
    			fpQuad++;
    		}
    	}
    

    Hab also einfach die printf-Anweisung auf zwei Zeilen erweiter...



  • Und was du als Deklaration bezeichnest ist in eine Definition.

    Es kann auch sein, dass sich irgendwo in deinem Code ein Steuerzeichen versteckt hat.



  • Danke, mit %8lu funktioniert es.

    Ich verstehe es nicht. Ich habe diese Funktion vor etwa zwei Monaten geschrieben - und sie hat immer gut funktioniert.

    Aber ok, der Computer ist kein Zufallsgenerator... 🙂



  • Das hätte dir der Compiler als Warnung melden sollen.
    Wenn nicht, schalte den Warnlevel höher.

    Oder wechsel auf einen aktuelleren Compiler.



  • Ich nutze lcc32.

    Was ist denn aktuell? Ich habe auch Visual Studio C++, aber ich programmiere nur C und das Programm hat mich einfach erschlagen. Will einfach nur schnelle Kommandozeilenprogramme schreiben.


  • Mod

    CJens schrieb:

    Ich nutze lcc32.

    Was ist denn aktuell?

    Kommt drauf an, welche Version des ICC. Wahrscheinlich hast du gar keine Warnungen aktiviert, der ICC warnt sonst nämlich sehr, sehr viel (meiner Meinung nach sogar zu viel), das hättest du sicher schon bemerkt.



  • SeppJ schrieb:

    CJens schrieb:

    Ich nutze lcc32.

    Was ist denn aktuell?

    Kommt drauf an, welche Version des ICC. Wahrscheinlich hast du gar keine Warnungen aktiviert, der ICC warnt sonst nämlich sehr, sehr viel (meiner Meinung nach sogar zu viel), das hättest du sicher schon bemerkt.

    Vorsicht, beim lcc handelt es sich nicht um den Intel C-Compiler, sondern um den hier, beschrieben im Buch A Retargetable C Compiler: Design and Implementation. Da er explizit von lcc32 spricht, vermute ich, dass er den Fork lcc-win32 mit mitgelieferter Entwicklungsumgebung von Jacob Navia meint.

    http://www.cs.virginia.edu/~lcc-win32/


Anmelden zum Antworten