Übergabe von Arrays



  • Hallo,

    ich muss für die Uni etwas programmieren und komme gerade nicht weiter.
    Ich erzeuge in einer FKT(1) ein Array.
    Dieses will ich dann in eine andere Fkt(2) geben und die Arrays ändern. Wurden sie in Fkt(2) geändert sollen sie dann aus Fkt(1) ind Fkt(3) gegeben werden von dieser dann in Fkt(4) in Fkt(4) will ich die werte dann nur noch auslesen können.

    Hier ein ausschnitt aus meinem Programm :

    IN ITERATION.C
    
    void iteration(
    ...)
    
    double 
    flaechen_oef[2][n],
    flaechen_sch[2][n];
    
    ...
    
    for (i=0; i<n; i++)
    {
    flaechen_oef[0][i]=i;
    flaechen_oef[1][i]=i+0.5;    
    }
    
    z = flaechen(...,*flaechen_oef);
    
    ...
    
    rwp(...
    *flaechen_oef,
    *flaechen_sch);
    
    IN FLAECHE.C
    
    int flaechen(
    ...
    double **flaechen_oef)
    
    IN RWP.C
    
    void rwp(
    ...             
    double **flaechen_oef,
    double **flaechen_sch)
    
    awp(
    ...
    *flaechen_oef,
    *flaechen_sch);
    
    IN AWP.C
    
    void awp(
    ...
    double **flaechen_oef,
    double **flaechen_sch)
    

    So wie man sieht möchte ich in iteration das Feld erstellen und das erste mal befüllen. Dann möchte ich es in flaechen verändern. Wenn ich das getan habe möchte ich es über rwp in awp geben.
    Soweit compiliert er auch. Nur wenn ich in flaechen sowas wie

    flaechen_oef[1][100]=100;
    

    eingebe bricht das Programm bei der ausführung sofort ab.
    Wenn ich in flaechen nichts mit flaechen_oef mache läuft er bis zum Aufruf von rwp und bricht dann ab. Ich kann ich flaechen auch keine Werte von flaechen_oef anzeigen lassen.

    Freue mich über jede Hilfe !
    Bin auch leider in c ziemlich unerfahren. Hoffe das das Thema hier richtig ist.
    Danke schonmal.



  • Vielleicht noch ein Nachtrag : n ist ein bekannter int Wert.



  • Lex_Lex schrieb:

    Vielleicht noch ein Nachtrag : n ist ein bekannter int Wert.

    Soll das heissen der n-Wert ist beim Erstellen bekannt ?
    😕



  • da gibts zwei Möglichkeiten:

    1. Du machst es nach C-Style und üergibst deiner Funktion nicht nur den Array sondern auch seine Länge. Es wird nämlich nicht wirklich das Array übergeben sondern ein Pointer auf sein erstes Element, und C kann in keinster Weise wiessen, wie lang denn das Array wirklich ist, es sei denn du sagst es ihm.
    void foo(int* arr, unsigned char len)
    {
     //...
    }
    
    int main()
    {
      int myArray[10];
      foo(myArray, 10); 
    }
    
    1. du machst es echt OOP, verzichtest auf ordinäre Arrays und benutzt Containerklassen wie z.B. std::vector, bei denen die Länge abgefragt werden kann.

    Normale Arrays sind zwar meist schneller, aber dafür um so unsicherer, du wärst nicht der erste der sich beim Umgang mit den Dingern einen segmentation fault oder ähnliches einhalndelt. Und was die ständige Diskussion angeht, was schneller ist und was langsamer: erstmal das Programm zum laufen bringen, dann gucken wo der Flaschenhals ist, wenns zu langsam ist. Wenn man sich in der Laufzeit ne hundersttel Sekunde einspart auf Kosten der Sicherheit ist das doch fragwürdig...



  • Soll das heissen der n-Wert ist beim Erstellen bekannt ?

    In der Funktion in der ich die beiden arrays das erste mal definiere (iteration.c) und in alles Unterfunktionen ist n als globale Variable bekannt.

    zu pumuckl :
    Aber was mache ich dann mir

    unsigned char len
    

    in meiner funktion foo? Also wo muss ich dann das

    len
    

    einsetzten, damit er weiß das es die Länge des Array ist? Und die mache ich das für 2D Arrays?
    Könntest du mir vlt ein kleines Beispiel für mein 2 dimensionales Array geben? Wäre echt super nett! 🙂



  • Lex_Lex schrieb:

    Soll das heissen der n-Wert ist beim Erstellen bekannt ?

    In der Funktion in der ich die beiden arrays das erste mal definiere (iteration.c) und in alles Unterfunktionen ist n als globale Variable bekannt.

    zu pumuckl :
    Aber was mache ich dann mir

    unsigned char len
    

    in meiner funktion foo? Also wo muss ich dann das

    len
    

    einsetzten, damit er weiß das es die Länge des Array ist? Und die mache ich das für 2D Arrays?
    Könntest du mir vlt ein kleines Beispiel für mein 2 dimensionales Array geben? Wäre echt super nett! 🙂

    Ist die 2. Dimension für alle Elemente gleich lang? Wenn ja dann brauchst du nur die 2. Dimension mit übergeben.

    void foobar(int* array, unsigned int dim1, unsigned int dim2)
    {
        // mache was
        array[1][2] = 3;
    }
    
    int main()
    {
        int array[10][20]
        foobar(array,10,20);
        return 0;
    }
    


  • Hmm irgendwie klappt das alles nicht. Habe es jetzt mal so probiert :

    in iteration.c
    
    void iteration(...)  
    {
    
    [...]
    double **oef_flaechen;
    double **sch_flaechen;
    [...]
    mallocmat(1,2,
    &oef_flaechen, 2, n,
    &sch_flaechen, 2, n); //So wird in dem Programm standartmäßig Speicherplatz allokiert
    [...]
    int blabla=0;
    for (i=0; i<n; i++){
        oef_flaechen[0][n]=5;
        oef_flaechen[1][n]=8;
    
    z = flaechen(...,oef_flaechen);
    
    //Ausgabe des Arrays
    for (i=0; i<n; i++){
        blabla++;
        //if (blabla==50) blabla=0;
        //if (blabla==0)
        printf("%.5lf %.5lf\n",oef_flaechen[0][n],oef_flaechen[1][n]);
    }
    
    in flaeche.c
    
    int flaechen(
    ...,double **flaechen_oef)
    {
    [...]
    flaechen_oef[1][v]=357.159;
    flaechen_oef[2][v]=gesamtlaenge;
    [...]
    rwp(...,oef_flaechen,sch_flaechen);
    
    in rwp.c
    void rwp(...,double **flaechen_oef,double **flaechen_sch)
    [...]
    awp(,flaechen_oef,flaechen_sch);
    [...]
    
    in awp.c
    void awp(,double **flaechen_oef,double **flaechen_sch)
    

    Zur Erklärung:
    in iteration.c definiere ich mir meine Matrix (eigentlich sind es zwei, aber wenn ich es für die eine kann dannsicher auch für die andere da genau das selbe damit passiert). Ich allokiere den Speicherplatz und fülle die Matrix. Ich rufe die Fkt flaechen auf und übergebe meine Matrix. In der Fkt flaechen will ich die Werte meiner Matrix ändern. Danach möchte ich die Werte in der Fkt Iteration ausgeben.

    So wie in diesem Beispiel oben beschreiben gibt er mir dann auch Werte aus. Allerdings schriebt er mir für oef_flaechen[0][n] 357.159 hin. Für oef_flaechen[1][n] schreibt er 0.00000 obwohl die Variable gesamtlaenge ein Wert hat. Würde ich jetzt die Zeile flaechen_oef[2][v]=gesamtlaenge; z.B. in laechen_oef[2][v]=10.12345 ändern schreibt er mir diesen Wert bei der Ausgabe in iteration unter oef_flaechen[1][n] auch 10.12345 ausgeben. Gesamtlaenge ist aber auch ein double.

    Wenn dieses umschreiben in fleachen.c dann mal funktionieren sollte möchte ich die beiden Matrizen (mit sch_flaechen passiert genau das selbe) an rwp übergeben und weiter an awp in awp möchte ich meine Werte dann am besten in der Form oef_flaechen[a][b] zu weiteren Berechnungen nutzen.

    VIELEN DANK schonmal für eure Hilfe.



  • Hallo nochmal,

    habe das jetzt auch mal mit nem int Array probiert. War aber das selbe Ergebniss 😞

    Hat den niemand eine Lösung für mich ?

    Gruß


Anmelden zum Antworten