Array aus Funktion an die Main übergeben



  • Hallöchen,

    Ich möchte gern ein Array aus einer Funktion übergeben.
    Sehe ich das richtig, dass ich dies mit einem sogenannten Zeiger machen kann?
    Kann mir jemand einmal ein kurzes Beispiel schreiben, wie das funktioniert?

    int Funktion(int a)//Welcher Rückgabewert muss definiert werden?
    {
        int i;
        int[a];
    
        for(i = 0; i < a - 1; i++)
        {
            int[i] = i; 
        }
    }
    
    int main(int argc , char *argv[])
    {
    // welche Variablen braucht es hier und wie definiere ich die Übergabe?
    }
    


  • Der einfachste Weg ist, das Array schon an die Funktion zu übergeben.



  • Du hast kein Array in deinem Programm, hast du das überhaupt mal getestet?

    int[a];
    

    Erstens gibt es schon eine Variable namens a und zweitens definiert man so kein Array.

    int[i] = i;
    

    Hier das gleiche.
    Das hier ist ein Array:

    int c[10];
    

    Verrain schrieb:

    //Welcher Rückgabewert muss definiert werden?

    Wenn du int a wieder zurückgeben willst, dann muss der Rückgabewert natürlich auch vom Typ int sein.

    Diese Grundlegenden Dinge werden aber alle in einem Buch/Tutorial erklärt.



  • - VLA benutzen nur Deppen (Zeile 4)
    - Zeile 8 kompiliert nicht

    int *f(int a[],int n)
    {
        int i;
        for(i = 0; i < n; i++)
        {
            a[i] = i;
        }
        return a;
    }
    
    int main()
    {
      int n = 55;
    
      int *a = f( calloc(sizeof*a,n), n );
    
      ...
    
      free(a);
      return 0;
    }
    


  • Wutz schrieb:

    - Zeile 8 kompiliert nicht

    Zeile 4 auch nicht.



  • Ohja, dass waren 2 schnelle Tippfehler.

    Danke Wutz für das Beispiel. Das kann ich dann problemlos auf andere Problemstellungen ummünzen.

    Grüße
    Verrain



  • Vielleicht noch eine kurze Anmerkung, falls jemand anderes auf diesen Thread stößt:

    Laut dieser Dokumentation:
    http://www.tutorialspoint.com/c_standard_library/c_function_calloc.htm

    Wird die Callocfunktion andersherum definiert:
    int *a = f( calloc(n, sizeof*a), n );

    anstatt falscherweise:
    int *a = f( calloc(sizeof*a, n), n );



  • Es ist unerheblich in welcher Reihenfolge die Parameter kommen.

    Beide sind vom Typ size_t und die Größe des Speichers ist das Produkt aus beiden Werten.



  • Ich bekomme folgende Fehlermeldung aus dem Compiler:

    t.c: In function 'int main()':
    t.c:24:26: error: invalid conversion from 'void*' to 'int' [-fpermissive]
       *a = calloc(n, sizeof*a);
    

    Was soll ich tun?


  • Mod

    Verrain schrieb:

    Was soll ich tun?

    Keine Veränderungen an Quelltexten vornehmen, die du nicht verstehst. Vielleicht hilft es auch, ein gutes Anfängerbuch zu lesen, Kapitel Pointer. Denn dann verstehst du die gegebenen Hilfestellungen auch.



  • Ich habe den obigen Beispielcode 1 zu 1 kopiert und er hat NICHT kompiliert!

    Ich habe nichts daran verändert. Alles was ich brauche ist ein funktionierendes Beispiel!


  • Mod

    Verrain schrieb:

    Ich habe den obigen Beispielcode 1 zu 1 kopiert und er hat NICHT kompiliert!

    Aha.

    Wutz schrieb:

    int *a = f( calloc(sizeof*a,n), n );

    vs.

    Verrain schrieb:

    *a = calloc(n, sizeof*a);



  • int *a = f( calloc(sizeof*a,n), n );
    

    ist etwas anderes als:

    int *a;
    *a = f( calloc(sizeof*a,n), n );
    

    oder

    int a;
    *a = f( calloc(sizeof*a,n), n );
    


  • Okay, dass kam nach einigem rumprobieren raus.

    Dennoch hat er vergessen, dass calloc einen void* Typ zurück gibt, er in der Funktion aber an der Stelle ein int* deklariert hat....



  • Er hat nichts vergessen.
    Du hast vergessen, dich über die Grundlagen von C zu informieren.


  • Mod

    Verrain schrieb:

    Dennoch hat er vergessen, dass calloc einen void* Typ zurück gibt, er in der Funktion aber an der Stelle ein int* deklariert hat....

    Hat er nicht. Falls du ein Problem mit den Pointerumwandlungen haben solltest, dann bedeutet dies, dass du einen C++-Compiler für deinen C-Code benutzt hast. Bevor du anderen Leuten Missinformation vorwirfst, solltest du vielleicht erst einmal sicherstellen, ob du überhaupt weißt, von welcher Sprache du überhaupt redest.


Anmelden zum Antworten