Andere Lösung als ein VLA???



  • Hallo!

    Ich bin leider ein absoluter Newbie auf dem Gebiet von C.

    Ich kämpfe derzeit mit einem Problem, und ich kann es nicht anders lösen. Solltet ihr da eine Alternativlösung anbieten können, wäre ich euch sehr dankbar.

    Also, das Problem: Der Anwender soll eine Zahl eingeben, anhand derer dann die Größe eines Arrays festgelegt wird (sprich ein VLA).

    int maxExp = 0;
    printf("Bitte geben Sie den höchsten Exponenten Ihrer Funktion ein: -->");
    scanf("%d",&maxExp);
    double koeff[maxExp];
    

    Leider ergeben sich folgende Probleme:

    1. Der Compiler (gcc unter SUSE) meldet einen error.

    2. Wenn ich dem Array dann Werte zuweise (auch über Benutzereingaben) dann erscheinen manchmal undefinierte Werte, meistens sind aber alle abgerufenen Werte 0.00000.

    Vielleicht liegt es ja auch an der Beuntzereingabe?

    int i = maxExp;
    for (i;i>=0;i--)
    	{
    	printf("\a\nBitte geben Sie den Koeffizienten zu x^%d%s",i," an --->");
    	scanf("%f",&koeff[i]);
    	printf("\n\n%f\n",koeff[i]);
    	}
    

    Ich weiß, dass gcc standardmäßig nicht C99 unterstützt (was für VLA wohl nötig ist), aber mir fällt keine Möglichkeit ein, die Aufgabe anders zu lösen, schließlich kann ich die Arraylänge nicht vorher wissen und fest einstellen.

    Kann mir jemand helfen?

    - stevieboy -



  • welche gcc version?
    probiers mal mit "gcc -std=c99"

    alternativ kannst du natürlich auch über dynamische arrays gehen:

    double* d=malloc(sizeof(double) * n);
    und dann das
    free(d);
    nicht vergessen.



  • Man, das geht ja schnell!

    1. Die gcc-Version weiß ich nicht (und weiß auch nicht, wie ich die herausfinde *schäm*).

    2. Ich weiß, wie man C99 anwendet. Da es aber eine Belegarbeit ist und die eben streng nach Profs Vorschriften gestaltet werden muss, darf ich diesen Parameter (wahrscheinlich -> prüfe ich nochmal) nicht verwenden.

    3. Gibt es denn noch eine andere Möglichkeit als ein VLA? Malloc hatten wir noch nicht erklärt bekommen. Nach dem ersten Blick auf den Code dazu, hatte ich aber das Gefühl, dass es nicht ganz zu meinem Prog passt. Ist denn da die Reihenfolge nicht anders herum? Ich muss doch erst deklarieren und kann dann das Array mit Eingaben füllen. Hier scheint es so, dass ich erst den Benutzer die Werte eingeben lasse und dann die Anzahl der Werte ermittle. Nach meinem derzeitigen "Wissens"stand ergeben sich daraus aber 2 Probleme:

    3a) Da die Größe des Arrays nicht festgelegt wurde, wurde auch kein Speicherplatz reserviert und daher kann es passieren, dass andere Werte überschrieben werden. (zzgl. Punktabzug bei Benotung!)

    3b) Da ich den Benutzer ja so einiges eingeben lassen will, aber nicht weiß, wie viele Werte kommen, muss ich irgendeine Abbruchmöglichkeit herumbauen (was mir widerstrebt).

    Ich bin wirklich nicht neunmalklug oder so, ich möchte es bloß verstehen und schreibe deswegen so ausführlich meine Gedankengänge auf, damit jemand kommt und sie korrigert.

    Danke!

    - stevieboy -



  • stevieboy schrieb:

    1. Die gcc-Version weiß ich nicht (und weiß auch nicht, wie ich die herausfinde *schäm*).

    gcc --ver

    3. Gibt es denn noch eine andere Möglichkeit als ein VLA? Malloc hatten wir noch nicht erklärt bekommen. Nach dem ersten Blick auf den Code dazu, hatte ich aber das Gefühl, dass es nicht ganz zu meinem Prog passt. Ist denn da die Reihenfolge nicht anders herum? Ich muss doch erst deklarieren und kann dann das Array mit Eingaben füllen. Hier scheint es so, dass ich erst den Benutzer die Werte eingeben lasse und dann die Anzahl der Werte ermittle.

    Ne, entweder VLA oder malloc/calloc/realloc
    uU kannst du auch die nicht standard Funktion alloca() verwenden.

    3a) Da die Größe des Arrays nicht festgelegt wurde, wurde auch kein Speicherplatz reserviert und daher kann es passieren, dass andere Werte überschrieben werden. (zzgl. Punktabzug bei Benotung!)

    Ja, wenn die größe erst dynamisch fest steht, dann kann man mit statischen Werten in Teufels Küche geraten

    3b) Da ich den Benutzer ja so einiges eingeben lassen will, aber nicht weiß, wie viele Werte kommen, muss ich irgendeine Abbruchmöglichkeit herumbauen (was mir widerstrebt).

    Ich glaube es wäre aber recht einfach zu sagen, dass man nur Zahlen von 0 - 1000 oder so eingeben darf. Kommt halt darauf an, ob das der Prof erlaubt.



  • stevieboy schrieb:

    int maxExp = 0;
    printf("Bitte geben Sie den höchsten Exponenten Ihrer Funktion ein: -->");
    scanf("%d",&maxExp);
    double koeff[maxExp];
    

    Damit liest du doch ein wieviele Elemente dein Array haben soll. Wo ist dann das Problem mit malloc() 😕



  • @AJ

    Mein Problem mit malloc?

    Ich kenne es einfach nicht. Wenn es mir jemand erklärt (Schritt für Schritt) dann verstehe ich es vielleicht. Wie gesagt, bisher verstehe ich darunter nur soviel wie breits oben geschrieben.

    - stevieboy -



  • Beispiel mit malloc():

    double *zahlen;
    unsigned int anz=0, i;
    
    printf("Wieviele Zahlen sollen eingegeben werden? ");
    scanf("%u", &anz);
    zahlen = malloc((anz) * sizeof(double)); //Speicher für anz Zahlen reservieren
    
    printf("Eingabe:\n");
    for(i=0;i<anz;++i)
    {
       scanf("%lf", zahlen+i); //geht auch &zahlen[i] falls besser verständlich
    }
    
    ...
    
    free(text);
    

    Fragen??

    [Edit]schlechte Benennung einer variablen[/Edit]



  • Vielen Dank an alle erstmal für die schnellen Antworten!

    Ich werde mich heute abend noch einmal ransetzen und versuchen,dass zu verstehen.

    - stevieboy -

    PS: Bei Fragen werde ich natürlich euch nochmal nerven.


Anmelden zum Antworten