Wo ist der Fehler im Programm?

  • Hallo. bitte helft mir, ich hab morgen Prüfung im C-Programmieren!!
    Ich hab grad ein Programm egschrieben, funktioniert aber noch nicht ganz richtig, wer kann mir büdde sagen, was da falsch ist?? :engel:

    Das Programm liest n orte ein(x und y Koordinaten), die in eine Liste eingelesen werden sollen. Dann in untere Matrix die Entfernungen zwischen allen Orten.. Danach sollen die Koord. in eine binäre Datei gespeichert werden, und von da wieder gelesen und ausgegeben werden:

    /*-----------------------------------------------------------------------
    SS 2005 - Aufgabe 35 (Listen, Dateien und Matrizen)
    -------------------------------------------------------------------------*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define maxN 5

    typedef struct ORT {
    float x,y;
    struct ORT *n;
    } ort;

    struct ORT *n=NULL;

    void EntfMatrix(ort *LA, int *N, float A[maxN][maxN])
    { int i,j; float x[maxN],y[maxN];
    struct ORT *anfang=NULL;
    printf("Anzahl Orte: "); scanf("%d",N);
    if (*N>maxN) *N=maxN;
    for (i=0;i<*N;i++)
    { if((LA=(struct ORT*)malloc(sizeof(struct ORT)))!=NULL)
    {n=(struct ORT*)malloc(sizeof(struct ORT));
    printf("Ort %d - x-Wert: ",i+1); scanf("%f",&LA->x);
    x[i]=LA->x;
    printf(" y-Wert: "); scanf("%f",&LA->y);
    y[i]=LA->y;
    LA->n=anfang;
    anfang=LA;
    }
    }

    for (i=0;i<*N;i++)
    {for (j=0;j<i;j++)
    {A[i][j]=sqrt( ( fabs((x[i])*(x[i]) - (x[j])*(x[j])) ) +
    ( fabs((y[i])*(y[i]) - (y[j])*(y[j])) ) );
    printf("%.2f ",A[i][j]);
    }
    printf("\n");
    }
    }

    //------------------------------------------------------------------------
    void SpeichAufDatei(ort *LA, char datname[])
    {FILE *ausdatei; ort *LA_Ausgabe=NULL;
    ausdatei=fopen(datname,"wb");
    LA_Ausgabe=LA;
    while(LA_Ausgabe!=NULL)
    {fwrite(&LA_Ausgabe->x,sizeof(ort),1,ausdatei);
    printf("\n%f ",LA->x);
    fwrite(&LA_Ausgabe->y,sizeof(ort),1,ausdatei);
    printf("%f",LA_Ausgabe->y);
    LA_Ausgabe=LA_Ausgabe->n;
    }
    fclose(ausdatei);
    }
    //------------------------------------------------------------------------
    ort *BildeListeAusDatei(char datname[])
    {FILE *eindatei; ort *LA,*LL,*vorg=NULL;
    int anz=0;
    printf("eingelesen: \n");
    eindatei=fopen(datname,"rb");
    if (eindatei==NULL) {printf("Datei nicht gefunden\n"); return NULL;}
    while (fread(&LA,sizeof(LA),1,eindatei) != NULL)
    {printf("x[%d]= %f y[%d]= %f\n",anz,LA->x,anz,LA->y);
    anz++;
    LL=malloc(sizeof(ort));
    LL->n=NULL;
    if (anz>1) vorg->n=LL; //Vorg.mit neuem Listelem. verknuepfen
    vorg=LL;
    if (anz==1) LA=LL; //Adr.des 1.Elem.ist Listadr.
    LL->ort=ort; //Datensatz zum Ort in Listelem. einfuegen
    }
    fclose(eindatei);
    return LA;
    }

    //------------------------------------------------------------------------
    void main()
    { float A[maxN][maxN];
    int N,anz;
    char datname[33]="C:/DJGPP/bin/pruef35.bin";
    ort *LA=NULL;
    clrscr();
    EntfMatrix(LA,&N,A);
    SpeichAufDatei(LA,datname);
    LA=BildeListeAusDatei(datname);
    getche();
    }

  • Na, ich weiß auch nicht so recht.. ich hab das Gefühl, dass die Werte nicht richtig in der Datei gespeichert werden. und deswegen wird auch nichts ausgegeben, wenn ich von der Datei lesen will.

  • zum Posten von Code bitte die "code" Tags verwenden


    typedef struct ORT {
    float x,y;
    struct ORT *n;
    } ort;

    sieht dann so aus:

    Code
    typedef struct ORT {
      float x,y;
      struct ORT *n;
    } ort;

    Informatik @ TU Wien (1998 - 2005)

  • geschrieben wird mit

    fwrite(&LA_Ausgabe->x,sizeof(ort),1,ausdatei);
    fwrite(&LA_Ausgabe->y,sizeof(ort),1,ausdatei);

    richtig wäre:

    fwrite(&LA_Ausgabe->x,sizeof(LA_Ausgabe->x),1,ausdatei);
    fwrite(&LA_Ausgabe->y,sizeof(LA_Ausgabe->y),1,ausdatei);

    ---
    gelesen wird mit

    fread(&LA,sizeof(LA),1,eindatei)

    Achtung: &LA ist da vom Typ ort**

    d.h du liest einen pointer aus dem file aus

    richtiger wäre;

    fread(LA, sizeof(ort) ,1,eindatei)

    danz richtig aber, wenn
    es analog zum schreiben wäre:

    fread(&LA_Ausgabe->x,sizeof(LA_Ausgabe->x),1,eindatei);
    fread(&LA_Ausgabe->y,sizeof(LA_Ausgabe->y),1,eindatei);

    mich wunderts nicht, wenn nichts richtig gelesen wird


    Weiters würde ich mir an deiner Stelle anschauen:
    Pointer oder nicht Pointer, wie reagiert der sizeof operator

    einfach mal testen

    printf("%i %i %i\n", sizeof(ort), sizeof(ort*), sizeof(ort**));

    ort *LA = allocORT();
    printf("%i %i\n", sizeof(LA), sizeof(&LA));

    Was anderes: auch in C kann man strukturiert programmieren:

    z.b:

    statt hundert mal im code

    (struct ORT*)malloc(sizeof(struct ORT))

    zu verwenden macht man sich eine Funktion:

    Code
    struct ORT *allocORT(void)
    {
     return (struct ORT*)malloc(sizeof(struct ORT));
    }



    MfG, Michael

    PS.: finde ich es schlimm, daß Programmier-Anfänger gleich mit C anfangen
    und sich dadurch einen schauerlichen Programmierstiel angewöhnen weils ihen diesbezüglich in C sehr leicht gemacht wird.

    Informatik @ TU Wien (1998 - 2005)

  • Also erst mal vielen Dank!!! ich hab jetzt die ganze Zeit hin und her probiert. und es werden trotzdem keine Werte in die Datei geschrieben, die ist immer leer. Ich weiß mir jetzt keinen Rat mehr

  • geschrieben wird deswegen nichts weil der an SpeichAufDatei übergebene Parameter 'LA' (immer) ein NULL-Pointer ist
    Schau dir dazu die Parameterübergabe von EntfMatrix genau an, insbesondere die von LA:

    Informatik @ TU Wien (1998 - 2005)

  • Zitat von Baerchen1

    LA=(struct ORT*)malloc(sizeof(struct ORT))


    malloc gibt ein void * zurück, und dieser Typ wird in C automatisch in alle anderen Pointertypen (außer Funktionszeiger) konvertiert. Der Cast ist also nicht notwendig.

    Zitat

    void main()


    main muß laut C-Standard einen int zurückgeben.

    Zitat


    clrscr();
    getche();


    Das sind keine (Standard-)C-Funktionen, und du inkludierst anscheinend nichtmal einen Header, der sie deklariert. Eventunnel solltest du deinem Lehrer unter die Nase reiben, daß er euch kein richtiges C beibringt. (Oder wenn du dich nicht traust, gib mir seine Mailadresse :devil: )
    No jedenfalls ist es prinzipiell deine Sache, ob du Nichtstandard-Funktionen verwendest, aber wenn du hier um Hilfe bittest, solltest du sie entfernen; denn wenn jemand nicht den gleichen (möglicherweise Uralt-)Compiler hat wie du und den Code nicht kompilieren kann, fördert das die Hilfsbereitschaft nicht unbedingt. (Mal ganz abgesehen davon, daß diese beiden Aufrufe auch echt unnötig sind.)

    *plantsch*

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!