for schleife



  • Hi,

    kann mir jemand einen Tip geben.
    Die erste for Schleife in der Funktion wird nicht richtig initialisiert. d wird nicht auf null gesetzt.

    Stephan

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    const int DIM=1;
    
    typedef struct Particle {
    	double	m;
    	double  x[DIM];
    	double  F[DIM];
    } ;
    
    struct Particle p[1], pp[1];
    #define sqr(x) ((x)*(x))
    
    void force(struct Particle *i, struct Particle *j ) {
    	double r=0;
    	for (int d=0; d<DIM; d++)
    		r += (j->x[d]-i->x[d]);
    	double f=i->m*j->m/(sqrt(r)*r);
    	for (int d=0; d<DIM; d++)
    		i->F[d]+=f*(j->x[d]-i->x[d]);
    }
    
    int main() {
    
    p[0].m=1.0; p[0].x[0]=0; p[0].x[1]=0;
    p[1].m=3e-6; p[1].x[0]=0; p[1].x[1]=1;
    
    force(&p[0],&p[1]);
    return(0);
    }
    


  • Der erste offensichtliche Fehler, der mir auffällt, ist, dass DIM zu klein gesetzt ist. Je nach Aufbau des Stacks kann sich da locker Kram gegenseitig überschreiben. Setz DIM auf 2 und kuck obs dann läuft.



  • Hallo,

    1. wenn du schon

    typedef struct Particle....
    

    schreibst, dann kannst du auch zur Deklaration

    Particle p[1], pp[1];
    

    verwenden!

    So wie du die Variable d in der for-Schleife definierst, geht es glaub ich nur in C++, in C ist das kein Standard!??

    int d;
    for (d=0;.....);
    

    docu schrieb:

    struct Particle p[1], pp[1]; //du legst speicher für 1 struct an, also nur 
                                 //p[0] ist gültig
    
    int main() {
    
    p[0].m=1.0; p[0].x[0]=0; p[0].x[1]=0;
    p[1].m=3e-6; p[1].x[0]=0; p[1].x[1]=1; // du hast kein speicherplatz für p[1]
    
    force(&p[0],&p[1]);
    return(0);
    }
    

    du meinst wohl

    int main() {
    
    p[0].m=1.0; p[0].x[0]=0; p[0].x[1]=0;
    pp[0].m=3e-6; pp[0].x[0]=0; pp[0].x[1]=1;
    
    force(&p[0],&pp[0]);
    return(0);
    }
    

    Über den Algo. hab ich mir noch keine Gedanken gemacht. Fals ich falsch liege, dann lass es mich wissen! Ich wollte doch nur helfen! 👍 😃

    Chiao



  • Oh, ja.

    typedef struct Particle {
        double    m;
        double  x[DIM];
        double  F[DIM];
    } ;
    

    Ist auch Bogus, da kein Name, unter dem das typedef laufen soll, angegeben wird. Es mag sein, dass manche Compiler das akzeptieren, aber richtig wäre entweder

    struct Particle {
      double m;
      double x[DIM];
      double F[DIM];
    };
    
    /* ... */
    
    struct Particle p;
    

    Oder

    typedef struct {
      double m;
      double x[DIM];
      double F[DIM];
    } Particle;
    
    /* ... */
    
    Particle p;
    


  • der Fehler war die Variableninitialisierung in dem Kopf. Die anderen Tips habe ich auch ausprobiert. Der Code läuft jetzt bestens. Danke 0xdeadbeef und /bin/bash0R


Anmelden zum Antworten