Parser



  • Also am sscanf liegts nicht wenn irgendwas nicht funktioniert.
    Wenn du immer noch den laufzeitfehler "floating point not loaded" bekommst dann musst du wahrscheinlich irgend ein library dazulinken.
    Kurt



  • Könnte der Fehler in Verbindung mit MS Visual Studio .NET stehen?

    Ich habe vorher immer mit Version 6 gearbeitet. Allerdings wüsste ich auch nicht welche Bibliothek ich noch einbinden muss. Das merkwürdige an dem Problem ist, dass die Anweisungen funktionierten, sobald ich aus der double-Variable y einen int-Wert gemacht habe.





  • Hallo Kurt,

    noch eine letzte Frage zu Deinem Code:

    sscanf(str, "%[^:]:%lf [%[^]]", name, &value, unit )
    

    Könntest Du bitte noch einmal erklären was Du mit den Ausdrücken "%[^:]:" und "[%[^]]" erreichst.

    Vielen Dank.



  • der Ausdruck "%[12345abcd]" bedeutet lese solange in einen string solange irgend ein zeichen vorkommt das zwischen den '[' und ']' steht.
    das ^ invertiert die Bedeutung.
    "%[^:]" lese solange in den string bis ein ':' gefunden wird.
    Kurt



  • int parse(char *string, char *name, double *value, char *unit) {    
    	if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) {
    		if (name[strlen(name)-1] == ' ' ) {
    			name[strlen(name)-1]='\0';
    		}
    		return 1;
        } else {
           printf("> Error parsing. ");
    	   return 0;
        }
    }
    

    Hi,

    wenn ich versuche über den nachfolgenden Aufruf eine Zeile in *string zu parsen, bricht das Programm immer mit einem Ausnahmefehler zusammen.

    // Textzeile auslesen
    fgets(string, max, fPtr);
    // string = STATIC PRESSURE                  : 55790.0230145 [Pa] (not reduced quantity)
    RetVal = parse(string, name, &value, unit);
    

    Ich weiß nicht so recht wonach ich suchen soll, denn ich erhalte nicht einmal eine Fehlermeldung...

    Gruß,

    W2K2005



  • In meinem Beispiel war name nur 30 zeichen lang. Wenn das noch immer so ist dan krachts.
    BTW du hast jetzt mehrere lehrzeichen vor dem ':' dann wäre wahrscheinlich

    int parse(char *string, char *name, double *value, char *unit) {    
        if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) {
            while ( strlen(name) && (name[strlen(name)-1] == ' ' ))
                name[strlen(name)-1]='\0';
            return 1;
        } else {
           printf("> Error parsing. ");
           return 0;
        }
    }
    

    Kurt



  • Hey,

    Du bist echt gut!
    Also, mittlerweile läuft das Programm - nur der Wert in value kommt noch nicht an...
    Mal gucken, wer schneller drauf kommt! 🙂

    P.S.:

    Die Leerzeichen waren eigentlich schon die ganze Zeit dabei - diese werden aber vom Forum geschluckt!!!
    Ich hatte nur etwas andere Zeilen als erstes gepostet.
    Allgemein sieht mein Inhalt so aus:

    STATIC PRESSURE                  : 55790.0230145 [Pa]
    STATIC PRESSURE                  : 55790.0230145 [Pa] (not reduced quantity)
    STATIC PRESSURE                  : 94192.1555228 [Pa] (reduced quantity)
    ABSOLUTE MACH NUMBER             : 0.318594727252 [-] (not reduced quantity)
    


  • Seh gerade value ist jetzt ein pointer

    int parse(char *string, char *name, double *value, char *unit) {    
        if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, &value, unit)) {
    

    dann mach's so

    int parse(char *string, char *name, double *value, char *unit) {    
        if (3 == sscanf(string, "%[^:]:%lf [%[^]]", name, value, unit)) {
    

    Kurt



  • Es geht!

    Lag am VS6!

    Aber irgend etwas klappt mit dem Datenfeld noch nicht, welches ich aufgespannt habe.

    double **dataBag = (double**) malloc(sizeof(double *) * ydim);
    for (i = 0; i < ydim; ++i) {
       dataBag[i] = (double*) malloc(sizeof(*dataBag) * xdim);
    }
    
    i=0;
    do {
        printf("> Scanne %d. Datei: %s\n", i+1, pLIST[i].filename);
    
        fPtr = fopen(pLIST[i].filename, "r");
        if (fPtr != NULL) {
    	// Spaltenindex zurücksetzen
    	j=0;
    	while (!feof(fPtr)) {
    	        // Textzeile auslesen
    		fgets(string, max, fPtr);
    		RetVal = parse(string, name, &value, unit);
    		if (RetVal == 1) {
    			// Daten ins Feld speichern
    			dataBag[i][j] = value;
    			j = j + 1;
    		}
    	}
    	fclose(fPtr);
        } else {
    		/// !!! Umlaute suchen
    		printf("> Die Datei: %s konnte nicht ge%cffnet werden. Weiter...\n", pLIST[i].filename, 123);
        } 
        i=i+1;
    } while (i < nums);
    

    Solange ich nur eine Datei einlese (aus meiner Liste pLIST) funktioniert das Programm - SUPER!!! Genau wie es soll.
    Sobald ich aber mehrere Dateien nacheinander Scanne - also in mehreren Zeilen von dataBag einen Wert ablegen will - stehen in der Matrix dataBag schwachsinnige Werte.



  • fehler liegt da

    for (i = 0; i < ydim; ++i) {
       dataBag[i] = (double*) malloc(sizeof(*dataBag) * xdim);
    }
    

    *dataBag ist ein pointer auf double ( bei mir 4 byte gross )
    sollte aber double sein ( bei mir 8 bytes gross ).
    Mach's so

    for (i = 0; i < ydim; ++i) {
       dataBag[i] = (double*) malloc(sizeof(double) * xdim);
    }
    

    Kurt



  • Leider nicht?!

    Es kommt immer noch zum Ausnahmefehler.



  • wüde es mal so probieren Vielleicht sind mehr Werte in einer Datei als du annimmst

    while (!feof(fPtr) && j < xdim ) {
    

    BTW du solltest IMMER auf Überlauf überprüfen.

    Kurt


Anmelden zum Antworten