<invalid float value> unter KDevelop



  • Hallo Leute,

    Programm zum einlesen einer Datei sieht so aus:

    int main()
    {
    	long double x=0.0L, y=0.0L, z=0.0L;
    
    	char* filename = "ebene.xyz";
    	FILE* fp = fopen ( filename, "r" );
    
    	if ( fp == NULL ) return 1;
    
    	while ( 0 == feof ( fp ) )
    	{
    		if ( 3 != fscanf ( fp, "%lf %lf %lf\n", &x, &y, &z ) )
    		{
    			printf ( "Koordinatendatei fehlerhaft\n" );
    			printf ( "Zeile : %d", pcount+1 );
    			return 1;
    		}
    		else pcount++;
    	}
    
    	fclose(fp);
    
    }
    

    Unter Windows funktioniert es einwandfrei. Unter Linux bringt KDevelop mir andauernd "<invalid float value>" für die x,y,z.

    Die Datei sieht so aus:

    11.146747 10.827060 -0.002419
    11.190383 10.873155 -0.245195
    11.107672 10.960262 -0.245166
    11.081999 11.002660 -0.282117
    11.081929 11.002573 -0.286694
    11.085049 10.999032 -0.282102
    .............................
    .............................
    

    Woran könnte es liegen und wie könnte man es beheben?
    Ich bin ein blutiger C Anfänger.. könnte man das einlesen besser(sicherer) gestalten?
    Danke im Voraus.



  • probier mal so:

    long double x=0.0L, y=0.0L, z=0.0L;
    

    ^^also mit 'L' dahinter.
    übrigens haste die zeile doppelt drin, das geht auch nicht.
    🙂



  • ;fricky schrieb:

    probier mal so:

    long double x=0.0L, y=0.0L, z=0.0L;
    

    ^^also mit 'L' dahinter.
    übrigens haste die zeile doppelt drin, das geht auch nicht.
    🙂

    Danke für den Hinweis, ist beim copy and paste passiert.

    long double x=0.0L, y=0.0L, z=0.0L; hat leider auch nicht geholfen. habs denoch im code aktualisiert



  • setz' mal ins 'scanf' auch grosse 'L's
    🙂



  • ;fricky schrieb:

    setz' mal ins 'scanf' auch grosse 'L's
    🙂

    Geht auch nicht. Der Compiler meckert.
    error: 'yL' undeclared (first use in this function)



  • ich meinte sowas: fscanf (fp, "%Lf %Lf %Lf\n", &x, &y, &z)
    nicht 'yL'
    🙂



  • ;fricky schrieb:

    ich meinte sowas: fscanf (fp, "%Lf %Lf %Lf\n", &x, &y, &z)
    nicht 'yL'
    🙂

    Danke es hat funktioniert.

    Nun schreibt mir KDevelop:

    x = 11.146746999999999999837740904951033

    für die anderen Zahlen kommt am Ende auch Usinn. Wie kann ich es unterbinden ohne auf long double verzichten zu müssen?



  • darkfate schrieb:

    Nun schreibt mir KDevelop:
    x = 11.146746999999999999837740904951033
    für die anderen Zahlen kommt am Ende auch Usinn. Wie kann ich es unterbinden ohne auf long double verzichten zu müssen?

    in der datei müssen 'long doubles' genau in dem format sein, das dein programm erwartet. ist da irgendwas anderes, dann musste es beim einlesen umwandeln.
    🙂



  • ;fricky schrieb:

    darkfate schrieb:

    Nun schreibt mir KDevelop:
    x = 11.146746999999999999837740904951033
    für die anderen Zahlen kommt am Ende auch Usinn. Wie kann ich es unterbinden ohne auf long double verzichten zu müssen?

    in der datei müssen 'long doubles' genau in dem format sein, das dein programm erwartet. ist da irgendwas anderes, dann musste es beim einlesen umwandeln.
    🙂

    Naja im Prinzip weiß ich ja nicht welche Koordinaten gefüttert werden. Diese sollen ja in beliebiger Genauigkeit eingelesen werden können.

    Wenn es long double erwartet warum setzt der compiler logischweise nicht den rest auf 0?

    So habe ich schon beim einlesen Fehler generiert.

    Der Intel Compiler speichert: 11.312378000000001000000000000000 ab.



  • Jetzt habe ich ein anderes Problem.
    Ich bekomme keine Werte in die Arrays arrx, arry, arrz.
    sumx,sumy,sumz klappt einwandfrei.

    long double arrx[pcount+1];
    long double arry[pcount+1];
    long double arrz[pcount+1];
    
    long unsigned i = 0;
    
    ...
    ...
    ...
    
    while ( 0 == feof ( fp ) )
    {
    	if ( 3 != fscanf ( fp, "%Lf %Lf %Lf\n", &x, &y, &z ) )
    	{
    		printf ( "Koordinatendatei fehlerhaft\n" );
    		printf ( "Zeile : %d\n" , pcount+1 );
    		return 1;
    	}
    	else
    	{
    		arrx[i] = x;
    		arry[i] = y;
    		arrz[i] = z;
    
    		sumx += x;
    		sumy += y;
    		sumz += z;
    
    		i++;
    	}
    }
    

    Kann mir jemand weiterhelfen?
    Danke!



  • darkfate schrieb:

    Wenn es long double erwartet warum setzt der compiler logischweise nicht den rest auf 0?

    wie ein compiler mit long-doubles hantiert, ist ihm weitestgehend selbst überlassen. oft wird das IEEE-format verwendet, muss aber nicht. wenn du ein programm hast, das long doubles speichert und mit einem anderen einliest, das mit einem anderen compiler compiliert wurde, muss es nicht zwangsläufig passen.
    🙂


Log in to reply