Größe eines Arrays während der Laufzeit bestimmen ...Help ^^



  • Hallo zusammen ich versuche während der Eingabe die Größe eines Arrays zu bestimmen und Float Werte einzulesen .
    Mein Problem: Die Werte werden nicht in das Feld übernommen ...
    Wer kann mir helfen ? Bin im Bezug auf Pointer dynamischer Speicher ein absoluter Anfänger .
    MfG Gioco 😃

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
    int anzahl,index;
    float* feld;
    
    printf("Wie viele Elemente soll das Feld enthalten?");
    scanf("%i",&anzahl);
    
    feld=(float*)malloc(anzahl*sizeof(float));
    
    for (index=0;index<anzahl;index++)
    {
    printf("Eingabe Wert %i: ",index+1);
    scanf("%f",&feld[index]);
    fflush(stdin);
    }
    
    free(feld);
    return (1);
    }
    


  • Funktioniert doch, oder?

    feld=(float*)malloc(anzahl*sizeof(float));   // btw: lieber nicht casten
    for (index=0;index<anzahl;index++)
    {
    printf("Eingabe Wert %i: ",index+1);
    scanf("%f",&feld[index]);
    fflush(stdin);        // btw: das ist Wahnsinn
    }
    
    for (index=0;index<anzahl;index++)
        printf("Eingabe Wert %i: %f\n",index+1, feld[index]);
    
    // Gibt wie erwartet alle Werte aus.
    // Wo ist das Problem?
    


  • Huhu µngbd,

    feld=(float*)malloc(anzahl*sizeof(float));   // btw: lieber nicht casten
    

    Würde mich sehr über eine kleine Begründung freuen. 'malloc' gibt doch einen void* Zeiger zurück. Muss man den nicht casten? - Hatte zuvor noch nicht viel mit den void* Zeigern zu tun.

    Wäre dir dankbar.



  • 'malloc' gibt doch einen void* Zeiger zurück.

    Ganz richtig. void gab es noch nicht im K&R-C, damals musste man malloc() casten. Ein Cast in C bedeutet so viel wie: "wandle das einfach um, ich weiss schon, was ich tue". So könnte man schwer zu findende Fehler produzieren. Deshwegen hat man wohl später den Typ void* als "Zeiger auf irgendwas" eingeführt. Ein Void-Zeiger wird vom Compiler implizit in jeden anderen Zeigertyp umgewandelt, da sollte man ihm nicht dreinpfuschen. Ausserdem spart man sich die reduntante Angabe des Typs.

    Die FAQ lassen sich auch drüber aus:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-206606.html

    Ärgerlich ist, dass man malloc() in C++ sehr wohl casten muss. Das ergibt seltsame Auswüchse, wenn man ein Programm schreibt, das sowohl gültiges C als auch gültiges C++ sein soll. Neulich mal im Lua-Quellcode gefunden:

    cast(struct CallS *, ud)
    

    Wobei cast ein Makro sein kann, das je nach Compiler-Sprache einen erwünschten Ausdruck erzeugt. Lustig, oder?
    🙂



  • ... funktioniert tatsächlich 😃
    Ich frage mich nur warum mein Debugger die Werte des Feldes nicht anzeigt(nur die adresse). Naja egal dankeschön ^^



  • Huhu µngbd,

    bin echt froh, dass ich nachgefragt habe und du mir eine ausführliche Antwort gegeben hast.

    Das mit der impliziten Konvertierung wusste ich nicht - Vielen Dank!

    Werde mir mal den Link zur FAQ durchlesen. Danke nochmal! :xmas1:



  • Gioco schrieb:

    ... funktioniert tatsächlich 😃
    Ich frage mich nur warum mein Debugger die Werte des Feldes nicht anzeigt(nur die adresse). Naja egal dankeschön ^^

    Manche Debugger sind so schlau, dass sie bemerken, dass man mit malloc() einen Bereich angelegt hat, den man als Array verwendet. Aber nicht alle. Das ist schon halbwegs in Ordnung so, weil man ja mit dem Bereich machen kann was man will, man muss ja kein Array dort anlegen.



  • Sunny31 schrieb:

    bin echt froh, dass ich nachgefragt habe und du mir eine ausführliche Antwort gegeben hast.

    Wenn ich mal Zeit habe: immer gerne.

    Früher war malloc() übrigens vom Typ char * , und ist immer gecastet worden (ausser vielleicht für char-Arrays). Ob man damit wohl Probleme mit der Portabilität bekommen könnte?


Anmelden zum Antworten