array übergabe



  • Hi Leute,

    ich habe ein kleines Problem, ich finde aber den Fehler nicht 😞

    typedef float  PROBABILITY[MAX_GENES];
    
    void calc_genetics(..., PROBABILITY *child)
    {
       ...
       **(child+i) = value;
       ...
    }
    
    main()
    {
    PROBABILITY Child;
    calc_genetics(..., &Child);
    ...
    }
    

    Funktioniert beim Compilieren einwandfrei, jedoch wenn ich in main die Werte aus Child auslesen will, habe ich da nur Müll rumstehen.
    Ich habe einige andere Schreibweisen ausprobiert, einige gehen, andere nicht, jedenfalls bei den gehenden kommt nur Müll zurück, definiere ich Child als Pointer auf PROBABILITY und übergebe das ohne den &-Operator, dann steigt das Programm zur Laufzeit mit einem Segmentation fault aus.
    Nach meinem Pointerverständniss müßte das so gehen, wie ich das geschrieben habe und aus main dann einfach mit Child[i] auf die Felder zugreifen können...



  • moin

    **(child+i) = value;

    Das geht so nicht. **child = value ginge für das erste Element des arrays auf das child zeigt. Anschließend machst du mit zB **(child+1) oder **(++child) einen Sprung um 4*MAX_GENES bytes und schreibst dort den nächsten Wert. Das nächste Element des arrays ist aber nur 4 bytes entfernt.

    Wie wärs damit:

    #include <stdio.h>
    
    #define MAX_GENES 2
    
    typedef float PROBABILITY[MAX_GENES];
    
    void calc_genetics(PROBABILITY *child)
    {
      **child = 2.22;
      *(*child+1) = 3.33;
    }
    
    void calc_genetics_1(float *child)
    {
      child[0] = 7.77;
      *(child+1) = 5.55;
    }
    
    void calc_genetics_2(PROBABILITY child)
    {
      *child = 3.33;
      child[1] = 4.44;
    }
    
    int main(void)
    {
      PROBABILITY Child;
    
      Child[0] = 1.23;
      Child[1] = 6.54;
    
      printf("%f\n%f\n",Child[0],Child[1]);
    
      calc_genetics_1(Child);
      printf("%f\n%f\n",Child[0],Child[1]);
    
      calc_genetics_2(Child);
      printf("%f\n%f\n",Child[0],Child[1]);
    
      calc_genetics(&Child);
      printf("%f\n%f\n",Child[0],Child[1]);
    
      return 0;
    }
    

    [ Dieser Beitrag wurde am 30.10.2002 um 04:12 Uhr von stahl editiert. ]



  • warum nicht leserlich?

    *(child[i])=bla;

    so kann man es doch viel besser lesen 😉



  • war aber sehr früh heut morgen..

    @Shade Of Mine

    willst du

    **(child+i)

    durch

    *(child[i])

    ersetzten? das funktioniert doch ebenso wenig?!



  • nein, ich will
    *(*child+i)
    durch
    *(child[i])
    ersetzen!

    Ich mag den ganzen Kaese mit dereferenzieren nicht so... da verwende ich lieber indeces, das sieht dann gleich viel schnuckeliger aus.



  • so wie ich das momentan sehe ist es aber nicht dasselbe.

    *(*child+i) funktioniert, *(child[i]) nicht. Letzteres wäre ja ((child+i)), wobei man das Erste auch so schreiben könnte: *((*child)+i).

    Ich steig da jetzt aber selber nicht mehr durch..



  • Original erstellt von stahl:
    **so wie ich das momentan sehe ist es aber nicht dasselbe.
    **

    Argh, sorry!
    ich meinte
    (*child)[i]

    wo hab ich nur meinen kopf?



  • Hi,

    void calc_genetics_2(PROBABILITY child)
    {
      *child = 3.33;
      child[1] = 4.44;
    }
    

    Muß ich das nicht als Pointer übergeben, damit ich innerhalb der Funktion die Werte ändern kann? Oder ist das schon ein Pointer, da PROBABILITY schon ein Pointer ist, da es sich um ein Array handelt??

    Auf jeden Fall schon mal Danke für die Infos, bringt mich doch schon ein gutes Stück weiter!



  • da PROBABILITY ein Array ist (und ein Array ist im Grunde auch nur ein Zeiger) musst du natuerlich nicht einen Zeiger auf PROBABILTY uebergeben...

    und schreibe statt
    *child
    besser
    child[0]

    😉



  • Hi,

    super! Danke!
    Ich glaube, jetzt habe ich Zeigeroperationen einigermaßen komplett verstanden!


Anmelden zum Antworten