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):
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;
I have a main which declare this struct (it is called "sys") and then pass a pointer to this struct to various 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!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.
.
.
My program crash when it tries to do the function. So here are details of the function.
header of the functions:
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]);
The functions themself (You don't need to understand it all!!! see below where it crash exactly):

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

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
Code:
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N]);
or actual function code
Code:
void accelerationsCalcul(Dimension (*r)[N], Dimension (*a)[N], double (*m)[N])
or function into main.c
Code:
accelerationsCalcul(&(sys.aP->r), &(sys.aP->a), &(sys.aP->m));
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:
&(sys.aP->r)
)

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