1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Wo ist der Fehler im Programm?

  • Baerchen1
  • 27. November 2005 um 11:59
  • Unerledigt
  • Baerchen1
    2
    Baerchen1
    Mitglied
    Punkte
    20
    Beiträge
    3
    • 27. November 2005 um 11:59
    • #1

    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();
    }

  • sauzachn
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    Punkte
    3.101
    Beiträge
    606
    • 27. November 2005 um 12:11
    • #2

    Zuerst mal muß man wissen, WAS nicht richtig funktioniert. Niemand wird sich durch diesen unformatierten Kot durchwühlen wollen.

    Dipper dipper dii dipper dii dipper dii duuu

  • Baerchen1
    2
    Baerchen1
    Mitglied
    Punkte
    20
    Beiträge
    3
    • 27. November 2005 um 12:21
    • #3

    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.

  • MichiK
    9
    MichiK
    Mitglied
    Reaktionen
    1
    Punkte
    786
    Beiträge
    153
    • 27. November 2005 um 12:31
    • #4

    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)

  • MichiK
    9
    MichiK
    Mitglied
    Reaktionen
    1
    Punkte
    786
    Beiträge
    153
    • 27. November 2005 um 12:38
    • #5

    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)

  • Baerchen1
    2
    Baerchen1
    Mitglied
    Punkte
    20
    Beiträge
    3
    • 27. November 2005 um 13:44
    • #6

    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

  • MichiK
    9
    MichiK
    Mitglied
    Reaktionen
    1
    Punkte
    786
    Beiträge
    153
    • 27. November 2005 um 14:43
    • #7

    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:

    Code
    entweder du machst das so
     
    ort *blabla(was anderes)
    {
       return xyz;
    }
     
    oder so
     
    void blabla(ort **abc, was anderes)
    {
      *abc = xyz;
    }
    Alles anzeigen

    Informatik @ TU Wien (1998 - 2005)

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 27. November 2005 um 15:01
    • #8
    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*

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern