Dynamischem Array Werte über Zwischenvariable zuweisen



  • Oke, zur Übersichtlichkeit hier nochmal der aktuelle Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
        typedef struct {
            int objektnr;
            char bezeichnung [20];
        } messobjekt;
    
        typedef struct {
            messobjekt *objekt;
            int messnr;
            double messwert;
        } messwert;
    
    int main () {
        int size = 3;
        messwert *dynfeld;
        dynfeld = (messwert*)calloc(size, sizeof(messwert));
        dynfeld->objekt = (messobjekt*)calloc(size, sizeof(messobjekt));
    
        FILE * file;
        file = fopen("messungen.txt", "r");
    
        int tempmessnr;
        double tempmesswert;
        int tempobjektnr;
        char tempbezeichnung [20];
        int zaehler = 0;
        int wieoftdurchlaufen = 0;
        //fseek(file, 50L, SEEK_SET);
        fscanf(file, "%*[^\n]");
        while (feof(file)==0) {
        //while (fscanf(file, "%d %*c %19[^,] %*c%d %*c%lf\n", &tempobjektnr, tempbezeichnung, &tempmessnr, &tempmesswert ) == 4) {
                fscanf(file, "%d %*c %19[^,] %*c%d %*c%lf\n", &tempobjektnr, tempbezeichnung, &tempmessnr, &tempmesswert);
                //fscanf(file, "%d %c %19[^,] %c%d %c%lf\n", &tempobjektnr, &c, tempbezeichnung, &c, &tempmessnr, &c, &tempmesswert);
                //fscanf(file, "%d%c%[^,]%c%d%c%lf\n", &tempobjektnr, &c, tempbezeichnung, &c, &tempmessnr, &c, &tempmesswert);
                //fscanf(file, "%d%c%[^,]%c%d%c%lf\n", &dynfeld[zaehler].objekt->objektnr, &c, &dynfeld[zaehler].objekt->bezeichnung, &c, &(dynfeld[zaehler].messnr), &c, &(dynfeld[zaehler].messwert));
                printf("\nWerte: %d,%s,%d,%lf", tempobjektnr, tempbezeichnung, tempmessnr, tempmesswert);
                //*(dynfeld+zaehler)->objekt->objektnr = tempobjektnr;
    //            dynfeld[zaehler].objekt->objektnr = tempobjektnr;
    //            strcat(dynfeld[zaehler].objekt->bezeichnung, tempbezeichnung);
    //            dynfeld[zaehler].messnr = tempmessnr;
    //            dynfeld[zaehler].messwert = tempmesswert;
                //printf("\nWerte: %d,%s,%d,%lf", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
    
                zaehler++;
                //Rechnung noch nicht richtig? evtl wieoftdurchlaufne-1
                if (zaehler == 3*pow(2, wieoftdurchlaufen)) {
                //if (zaehler == 3*(2^(wieoftdurchlaufen)) ) {
                    dynfeld = (messwert*)realloc(dynfeld, 2*zaehler*sizeof(messwert));
                    if (dynfeld == NULL) {
                        printf("Speicher reservieren fehlgeschlagen!");
                        return 1;
                    }
                    wieoftdurchlaufen = 0;
                    printf("\nSpeicher erfolgreich verdoppelt!");
                    wieoftdurchlaufen++;
                }
                //zaehler++;
        }
    
    //    int zaehler2 = 0;
    //    int feldLaenge = sizeof(dynfeld)/sizeof(messwert);
    //    for (; zaehler2 < feldLaenge; zaehler++) {
    //        printf("\n%d,%s,%d,%f", dynfeld[zaehler].objekt->objektnr, dynfeld[zaehler].objekt->bezeichnung, dynfeld[zaehler].messnr, dynfeld[zaehler].messwert);
    //    }
        return 0;
    }
    

    Wenn ich

    while (fscanf(file, "%d %*c %19[^,] %*c%d %*c%lf\n", &tempobjektnr, tempbezeichnung, &tempmessnr, &tempmesswert ) == 4) {
    

    benutze werden wirklich nicht alle Werte eingelesen, mit

    while (feof(file)==0) {
    

    allerdings schon und das auch ohne einen Wert doppelt zu haben. Habs ja ausprobiert indem ich mir in die Zwischenvariablen in der Schleife ausgeben lasse.

    Das weist auf undefinierten Speicherzugriff hin.
    Wenn du unsicher bei malloc & Co. bist, dann nimm erstmal ein statisches Array

    Ich muss nur ein dynamisches Array benutzen.



  • Welche werte werden denn nicht eingelesen?



  • DirkB schrieb:

    Welche werte werden denn nicht eingelesen?

    Eingelesen werden:

    1,tower,2,17.410
    1,tower,4,18.342
    1,tower,6,17.523
    1,tower,7,17.683
    3,building,1,101.334
    3,building,2,107.128
    3,building,3,99.987
    3,building,3,105.821
    2,bridge,3,247.521
    2,bridge,4,248.731
    2,bridge,5,249.008
    

    Insgesamt gibt es:

    objektnummer,objektbezeichnung,messnummer,messwert
    1,tower,1,17.334
    1,tower,2,17.410
    1,tower,3,16.986
    1,tower,4,18.342
    1,tower,5,15.999
    1,tower,6,17.523
    2,bridge,1,249.121
    1,tower,7,17.683
    1,tower,8,18.001
    3,building,1,101.334
    1,tower,9,17.332
    3,building,2,107.128
    1,tower,10,18.019
    3,building,3,99.987
    3,building,3,110.320
    3,building,3,105.821
    2,bridge,2,251.988
    2,bridge,3,247.521
    1,tower,11,16.891
    2,bridge,4,248.731
    2,bridge,5,249.008
    

    Also wird jeder zweite und der letzte Wert gespeichert.



  • Wenn du Zeile 35 aktivierst, musst du auch Zeile 36 auskommentieren.
    Sonst liest du zwei Zeilen ein.



  • Oke das stimmt natürlich.
    Nur hat jemand noch einen Tipp, wie ich die Werte in das Array speichere?



  • Fang erstmal einfach an.

    typedef struct {
            int objektnr;
            char bezeichnung [20];
        } messobjekt;
    
        typedef struct {
            messobjekt objekt;  // mach hier das Objekt rein. Keinen Zeiger.
            int messnr;
            double messwert;
        } messwert;
    

    Das mit dem Speicher verdoppeln solltest du dir nochmal überlegen.
    Warum das 3*pow ?

    In size steht die Größe des Speichers.
    In zaehler der aktuelle Bedarf.
    Wann musst du den Speicher vergrößern?
    Welchen Wert bekommt size danach?



  • In dem Struct soll aber ein Zeiger sein. Ich kann ja nicht einfach die Aufgabe ändern 😃
    Ebenso wie den Speicher verdoppeln.
    Die if-Bedingung hab ich jetzt allerdings verändert.

    if (zaehler == size) {
                //if (zaehler == 3*pow(2, wieoftdurchlaufen)) {
                    dynfeld = (messwert*)realloc(dynfeld, 2*zaehler*sizeof(messwert));
                    if (dynfeld == NULL) {
                        printf("Speicher reservieren fehlgeschlagen!");
                        return 1;
                    }
                    size = 2*size;
                    printf("\nSpeicher erfolgreich verdoppelt!");
                }
    

    War wohl vorher ein bisschen zu kompliziert gedachte. Danke schon mal 😉



  • mezzix schrieb:

    In dem Struct soll aber ein Zeiger sein. Ich kann ja nicht einfach die Aufgabe ändern 😃

    Dann musst du vor jedem Zugriff auf objekt auch dafür Speicher mit malloc besorgen.



  • DirkB schrieb:

    mezzix schrieb:

    In dem Struct soll aber ein Zeiger sein. Ich kann ja nicht einfach die Aufgabe ändern 😃

    Dann musst du vor jedem Zugriff auf objekt auch dafür Speicher mit malloc besorgen.

    Vielen Dank! Da lag der Fehler 👍



  • Sorry, dass das nicht verständlicher war.
    Aber das meinte ich am 13:34:46 15.04.2014 mit "Du musst für jeden messwert auch ein objekt besorgen. "


Anmelden zum Antworten