PI Annaeherung durch Dartpfeile Hilfe



  • Meine void funktion funktioniert nicht?! der counter c wird nicht verändert? Er bleibt 0.

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>

    struct wurf{
    double x,y;
    int io;
    };

    wurf wuerfeln( wurf );
    wurf inCircle( wurf );
    void count (int *c, wurf);

    int main ()
    {
    float pi;
    wurf w;
    int c, i, n;
    c=0;

    printf("Programm zur PI-Annaeherung\n");
    printf("Wieviele Wuerfe wollen Sie taetigen?\n");
    scanf("%i", &n);

    for(i=0; i<n; i++){
    w=wuerfeln(w);
    w=inCircle(w);
    count(&c, w);
    }

    pi=9.0*(c/n);
    printf("Die Pi-Annaeherung durch die Dartscheibe ergibt fuer PI: %f\n",pi);

    getch();
    return 0;
    }

    wurf wuerfeln(wurf w){
    w.x=(rand()/RAND_MAX)*3-1.5;
    w.y=(rand()/RAND_MAX)*3-1.5;
    return w;
    }

    wurf inCircle(wurf w){
    if(w.x*w.x+w.y*w.y<=1)
    w.io=1;
    else w.io=0;
    return w; }

    void count(int *c,wurf w){
    int p;
    p=*c;
    if(w.io==1)
    p=p+1;
    c=&p;
    }



  • p ist eine Stack-Variable in count. Ein Zeiger auf p gilt nach der Rückkehr von count nicht, also darfst Du nicht c die Adresse von p zuzuweisen, sondern:

    (*c)=p;
    


  • Klingt logisch,hab i probiert funktioniert aber dennoch nicht? Die Anfangszuweisung von *c auf P ist doch in ordnung,o nicht?



  • Ja, das ist sie. Aber am Ende mußt du auch wieder "*c=p" anwenden, um das Ergebnis zurückzuliefern.

    Spezi L schrieb:

    Ein Zeiger auf p gilt nach der Rückkehr von count nicht, also darfst Du nicht c die Adresse von p zuzuweisen

    Noch schlimmer - auch c ist nur eine lokale Variable, damit ist die Zuweisung an c letztendlich wirkungslos 😉



  • Hmm wie krieg ich nun die Schleife hin,die mir in main c erhöht?



  • in count ist c ein Parameter der auf int zeigt, deshalb sollte es gehen.

    #include <iostream>
    using namespace std;
    
    void count(int *counter)
    {
    	++(*counter);
    }
    
    void count2(int *counter)
    {
    	int p = *counter;
    	++p;
    	(*counter) = p;
    }
    
    int main()
    {
        int c = 0;
    
        count(&c);
        count(&c);
        cout << c << endl;
    
        count2(&c);
        count2(&c);
        cout << c << endl;
    
        cin.get();
    }
    


  • Vielen Dank,dann werde ich das mal probieren.Dachte es geht allerdings kürzer.
    Gruß rees



  • Schon mal was von Referenzen gehört?

    void count(int& c, const wurf&);
    
    void count(int& c, const wurf& w)
    {
        c += w.io;
    }
    

    Daran kannst du sehen, dass deine count Funktion momentan vollkommen unnütz ist, denn du kann in main auch gleich

    c += w.io;
    

    schreiben.


Anmelden zum Antworten