Frage zu Structs und FUnktionen



  • Und statt *(ptr+i+1)).preis kannst du (ptr+i+1)->preis oder besser ptr[i+1].preis schreiben.
    Liest sich besser.



  • ok hab das nun geändert in:

    sortiment = (struct artikel *) malloc(sizeof(*sortiment) * length);
    

    wie meinst du das genau mit dem doppezeiger?



  • Du willst deinen Funktionen mitteilen, wo der Speicher für die struct ist.
    Dazu brauchst du die Adresse wo der Speicher steht. Einen Zeiger.

    Dein globales sortiment ist so ein Zeiger.

    Beim Aufruf der Funktion mit dem Adressoperator vor dem Zeiger, übergibst du an die Funktion die Adresse von dem Zeiger selber. Also da wo die Adresse vom Speicherbereich abgespeichert wird.
    Dann hast du einen Zeiger auf einen Zeiger -> Doppelzeiger.

    Lass einfach das & beim Aufruf deiner Funktionen weg.
    Und den cast auch. Der ist in C überflüssig und hilft dir ja auch nicht.



  • ja aber den cast brauche ich doch, da ich ja den benutzer fragen will, wieviele preise er eingeben will, oder?
    also es geht nun:

    #include <stdio.h>
    #include <stdlib.h>
        struct artikel   {
                        char datum[11];
                        float preis;
                        };
    
    void einlesen(struct artikel *sortiment, int length){
        int i=0;
    
        for(i=0;i<length;i++)
        {
        fflush(stdin);
        printf("Bitte geben Sie nun den %d. Preis ein: ", i+1);
        scanf("%f", &sortiment[i].preis);
        fflush(stdin);
        printf("Und nun das dazugehoerige Datum: ");
        fgets(sortiment[i].datum,11,stdin);
        }
    
    }
    
    void sortieren(struct artikel *ptr, int length){
    
        int i, j, temp;
    
        for (j=0;j<length;j++)
            for(i=0;i<length-1;i++)
            {
              if((*(ptr+i)).preis>(*(ptr+i+1)).preis)
                {
                  temp = (*(ptr+i)).preis;
                  (*(ptr+i)).preis = (*(ptr+i+1)).preis;
                  (*(ptr+i+1)).preis=temp;
    
                }
            }
    
    }
    
    void ausgabe(struct artikel *sortiment, int length){
        int i;
        for(i=0;i<length;i++){
        printf("%s  %f\n", (*(sortiment+i)).datum, (*(sortiment+i)).preis);
        }
    
    }
    
    int main()
    {
    
        int length;
        printf("Bitte geben Sie die gewuenschte Anzahl an Preisen an:");
        scanf("%d", &length);
        struct artikel *sortiment;
        sortiment = (struct artikel *) malloc(sizeof(*sortiment) * length);
        fflush(stdin);
        einlesen(sortiment, length);
    
        sortieren(sortiment, length);
    
        ausgabe(sortiment, length);
        return 0;
    }
    


  • Der cast wandelt nur explizit den void-Zeiger von malloc in einen Zeiger auf die struct.
    Das passiert aber schon implizit (in C).

    Du schreibst ja auch
    double f = 2; und nicht double f = (double)2; obwohl die 2 ein int ist. 😉



  • Ach ja, der Preis.
    Rechne bei Preisen besser ganzzahlig in Cent.
    Wenn es ums Geld geht hört der Spaß bei Rundungsfehlern auf. 🙂

    Und wenn du das nicht magst, nimm double. Da sind die Rundungsfehler kleiner.
    Der Spaß aber nicht.



  • struct artikel *sortiment; 
        sortiment = (struct artikel *) malloc(sizeof(*sortiment) * length);
    

    Wusste gar nicht das sowas funktioniert - jedenfalls ist es umständlich & unleserlich. Ich rate dir zu folgendem:

    struct artikel *sortiment = malloc(sizeof(struct artikel) * length);
    

    //edit: ...zu langsam



  • ok, habs nun so deklariert ohne den malloc...

    struct artikel sortiment[length];
    

    und habe dann die & Operatoren wieder bei den funktionen hingemacht, da ja so sortiment kein pointer mehr ist..

    andere frage... bei der ausgabe zeigt es mir nur bei einer zahl die nachkommastellen an, bei den anderen zahlen macht er immer .00000 und nicht das was ich eingegeben habe,

    wieso das?



  • ok läuft nun danke!!
    temp variable war als int deklariert, muss aber float sein



  • Das mit dem malloc war doch soweit in Ordnung.
    VLA sind auch nicht unbedingt das Beste.
    Und mit dem & bei Arrays täuscht du dich.


Anmelden zum Antworten