Hi all.

First of all, I speak french so you might see some french comments in my code, just don't pay attention to it.

I'm having some trouble with a program of mine I'm trying to create.

I have an array of struct having each some nested struct inside. Code of the structs definition (I really don't think there is any problem in this code yet):

I have a main which declare this struct (it is called "sys") and then pass a pointer to this struct to various function:Code://ncorps_definitions.h #include<stdio.h> #include<stdlib.h> #include <math.h> #include <time.h> #define square(a) ((a)*(a)) //#define min(a, b) ((a) < (b) ? (a) : (b)) //#define max(a, b) ((a) < (b) ? (b) : (a)) #define N 100 //nombres de particule dans la simulation #define CONDINIT 1 //chois des conditions initial parmis les différents presets (1: sphere uniforme avec acc=0 et vit=0, 2: coquille etc.. #define TI 0 //temps initial #define TF 100 //temps final #define DELTA 10 //coefficient du pas de temps #define EPSILON 0.06 //longueur d'adoucissement pour 10 000 particules (à calculer dans les conditions initiales éventuellement) #define NOUT 1 //fréquence des ouputs #define SIGMA 0.2 typedef struct { double x; double y; double z; }Dimension; typedef struct //décrit une particule { double m; //masse de la particule, pourra être négative ou positive Dimension a; //accélération des particules Dimension v; //vitesse des particules au début du pas de temps Dimension vm; //vitesse des particules au milieu du pas de temps Dimension r; //position des particules au début du pas de temps Dimension rm; //position des particules au milieu du pas de temps }Point; typedef struct { Point aP[N]; }allPoint;

My program crash when it tries to do the function. So here are details of the function.Code:#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include "ncorps_fonctions.h" int main(void) { //déclaration des variables ATENTION: remplacer potentiellement les valeurs par quelque chose de mieu et remplacer p-e les float par des double allPoint sys; //un array de structure contenant tout les points du système ainsi que toute leur propriété FILE * pOutput; // pointeur sur le fichier d'output double t; //temps double tOld; //temps précédent long int istep; //nombre de cycle double dt = 10; //pas de temps long int i = 0; //chargement des conditions initiales des particules conditionsInitiales(&sys); //ouverture du fichier d'output pOutput = fopen("ncorps.output","w"); //évolution du système t = TI; istep = 0; do { //1: Calcul les accélérations accelerationsCalcul(&(sys.aP->r), &(sys.aP->a), &(sys.aP->m)); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //PROBLEME INSIDE THIS FUNCTION HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! . . .

header of the functions:

The functions themself (You don't need to understand it all!!! see below where it crash exactly):Code://ncorps_fonctions.h #include "ncorps_definitions.h" /***************************************************************************** Description: cette fonction initialise les particules (via leur structure de type Point) *****************************************************************************/ void conditionsInitiales(allPoint *pt); /***************************************************************************** Description: cette fonction calcul la nouvelle accélération de chaque particule selon leur position *****************************************************************************/ void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]); /***************************************************************************** Description: cette fonction calcul la valeur du nouveau pas de temps et la retourne *****************************************************************************/ double pasDeTemps(Dimension (*v)[N], Dimension (*a)[N]);

Code://ncorps_functions.c #include "ncorps_fonctions.h" /***************************************************************************** Description: cette fonction initialise les particules (via leur structure de type Point) *****************************************************************************/ void conditionsInitiales(allPoint* pt) { //variables long int i = 0; switch(CONDINIT) { case 1: //sphere uniforme avec acc=0, vit=0 et masses à moitier négative { srand ( time(NULL) ); //initialisation de rand //ajouter éventuellement un paramètre scale dans cette fonction (le scale sera calculer dans le main au début et sera fonction de ce qui est dit dans les notes de cours) for (i = 0; i < N; i++) { //accélérations pt->aP[i].a.x = 0; pt->aP[i].a.y = 0; pt->aP[i].a.z = 0; //vitesses pt->aP[i].v.x = rand() / (float) RAND_MAX * 2 - 1; pt->aP[i].v.y = rand() / (float) RAND_MAX * 2 - 1; pt->aP[i].v.z = rand() / (float) RAND_MAX * 2 - 1; //positions pt->aP[i].r.x = rand() / (float) RAND_MAX * 2 - 1; pt->aP[i].r.y = rand() / (float) RAND_MAX * 2 - 1; pt->aP[i].r.z = rand() / (float) RAND_MAX * 2 - 1; //masses pt->aP[i].m = rand() / (float) RAND_MAX * 2 - 1; } } break; case 2: //coquille avec acc=0 et vit=0.. etc.. { } break; } } /***************************************************************************** Description: cette fonction calcul la nouvelle accélération de chaque particule selon leur position *****************************************************************************/ void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]) { //déclaration des variables long int i, j = 0; double xi,yi,zi,xj,yj,zj,denom,cmi,cmj,dx,dy,dz,r2; xi=yi=zi=xj=yj=zj=denom=cmi=cmj=dx=dy=dz=r2 = 0; //initialise les accélérations à 0 for (i = 0; i < N; i++) { a[i]->x = 0; a[i]->y = 0; a[i]->z = 0; } //calcul la force entre toute les paires de particules for (i =0; i < (N - 1); i++) { xi = r[i]->x; yi = r[i]->y; zi = r[i]->z; for (j = (i + 1); j < N; j++) { xj = r[j]->x; yj = r[j]->y; zj = r[j]->z; dx = xi - xj; dy = yi - yj; dz = zi - zj; r2 = square(dx) + square(dy) + square(dz); denom = pow((r2 + square(EPSILON)),(15.0 / 10.0)); cmj = *m[j] / denom; cmi = *m[i] / denom; a[i]->x = a[i]->x - cmj*dx; a[i]->y = a[i]->y - cmj*dy; a[i]->z = a[i]->z - cmj*dz; a[j]->x = a[j]->x - cmi*dx; a[j]->y = a[j]->y - cmi*dy; a[j]->z = a[j]->z - cmi*dz; } } }

The program crash exactly at this line into the function "accelerationsCalcul":

but my program seems to work fine when it calls the first function "conditionsInitiales"Code:a[i]->x = 0;

so this tells me there is something wrong when I declared the function or when I tried to pass the struct as a pointer to the function.

so to kind of make it short, I think there is a prolem somewhere in those lines:

function header

or actual function codeCode:void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]);

or function into main.cCode:void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N])

What did I do wrong in this process? I know how to usualy pass Struct as a function parameter, but I'm totaly lost when it comes to array of structs and even more when i have to pass only part of an array of struct (Code:accelerationsCalcul(&(sys.aP->r), &(sys.aP->a), &(sys.aP->m));)Code:&(sys.aP->r)

thank you very much (going to bed now o.O, I will answer anything tomorrow..)