Arrays an Funktionen übergeben



  • Hallo,
    ich habe vor kurzem damit angefangen C zu lernen. Ich hatte vor ein (Verständnis-)Programm zu schreiben mit folgendem Code:

    #include <stdio.h>

    //Arrays an Funktionen übergeben

    void array (int a[],int max)
    {
    int i;
    for(i=0;i<max;i++);
    {
    printf("Welche Zahl soll auf %d abegelegt werden?",i);
    scanf("%d",&a[i]);
    printf("Es wurde in dem array a mit dem index %d der Wert %d abgelegt!",i,a[i]);
    }
    }

    int main ()
    {
    int maxwert;
    int arra[maxwert],i;
    printf("Wie groß soll das array sei ?");
    scanf("%d",&maxwert);
    array(arra,maxwert);
    do{
    printf("Welcher Wert soll abgerufen werden?");
    scanf("%d",&i);
    printf("Das Array mit dem index %d enthält den Wert %d\n",i,arra[i]);
    }while(i<maxwert);

    return 0;
    }

    Das Problem ist, wenn ich es dann ausführen will, bekomme ich folgendes zurück:

    Segmentation fault
    logout

    [Prozess beendet]

    Kann mir vllt jemand helfen?

    Mfg Domme



  • int main ()
    {
    int maxwert;
    int arra[maxwert],i;
    ...
    

    was steht denn in 'maxwert', das die grösse des arrays angeben soll?
    ich glaube das wissen wir nicht.
    🙂



  • fricky schrieb:

    int main ()
    {
    int maxwert;
    int arra[maxwert],i;
    ...
    

    was steht denn in 'maxwert', das die grösse des arrays angeben soll?
    ich glaube das wissen wir nicht.
    🙂

    Außerdem:

    Dadurch, dass du "maxwert" nicht initalisierst, wird maxwert zur Kompilierzeit irgendein Wert vom Compiler zugewiesen. Abgesehen davon, ist deine for-Schleife in deiner Funktion array() irgendwie sinnlos. Und dadurch, dass deine array Deklaration sinnbefreit ist, kannst du auch im weiteren Verlauf des Programms Probleme mit Speicherzugriffsverletzungen bekommen, weil du nicht kontrollierst, ob die Benutzereingaben sich innerhalb der Zulässigkeit bewegen.



  • Berufspenner schrieb:

    Dadurch, dass du "maxwert" nicht initalisierst, wird maxwert zur Kompilierzeit irgendein Wert vom Compiler zugewiesen.

    nö, 'maxwert' wird garnichts zugewiesen. maxwert wird irgendeinen wert haben, der sich aus dem inhalt der speicherzellen zusammensetzt, der vorher auch schon da war. und der ist womöglich riesengross. deshalb kracht es.
    🙂



  • geht das überhaupt, die Array größe über ne variable bestimmen?
    dachte diese wert muss konstanz sein bzw. zu compilerzeit definiert sein.



  • geht das überhaupt, die Array größe über ne variable bestimmen?
    dachte diese wert muss konstanz sein bzw. zu compilerzeit definiert sein.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-218213-and-highlight-is-.html



  • MiP schrieb:

    geht das überhaupt, die Array größe über ne variable bestimmen?
    dachte diese wert muss konstanz sein bzw. zu compilerzeit definiert sein.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-218213-and-highlight-is-.html

    Der verlinkte Thread bezieht sich auf C++, nicht auf C. In C (genauer ab C99) geht das aber was der OP macht (natürlich muss die Variable irgendwie initialisiert werden). Nenn sich VLA, variable length array.



  • Das geht auch in C90. Du mußt dir nur entsprechend Speicher anfordern und dann mit Pointern darauf zugreifen.

    int main (void)
    {
      int a = 50;
      int *pA;
      pA = malloc (a * sizeof(int));  /*fordert Speicher für ein Array der Länge "a" aus integern an*/
      *(pA + 5) = 20; /*schreibt in Array "pA" an Index "5" den Wert "20"*/
      a = 60;
      pA = realloc(pA, a * (sizeof(int))); /*Vergrößert das Array auf die neue Länge "a"*/
      return 0;
    }
    


  • Nagila Hawa schrieb:

    Das geht auch in C90. Du mußt dir nur entsprechend Speicher anfordern und dann mit Pointern darauf zugreifen.

    int main (void)
    {
      int a = 50;
      int *pA;
      pA = malloc (a * sizeof(int));  /*fordert Speicher für ein Array der Länge "a" aus integern an*/
      *(pA + 5) = 20; /*schreibt in Array "pA" an Index "5" den Wert "20"*/
      a = 60;
      pA = realloc(pA, a * (sizeof(int))); /*Vergrößert das Array auf die neue Länge "a"*/
      return 0;
    }
    

    und wo ist das VLA?



  • Ist das nicht ganz, aber er kann damit sein Problem lösen.

    In der Wikipedia steht auch folgendes Beispiel:

    float read_and_process(int n)
    {
        float   vals[n];
    
        for (int i = 0; i < n; i++)
            vals[i] = read_val();
        return process(vals, n);
    }
    

    Kann man das nicht umschreiben?

    float read_and_process(int n)
    {
        float   *vals;
        vals = malloc(n * sizeof(float));     
    
        for (int i = 0; i < n; i++)
            *(vals + i) = read_val();
        rueckgabewert = process(vals, n);
        free(vals);
        return rueckgabewert;
    }
    

Anmelden zum Antworten