2016-10-01 8 views
0

Я хочу реализовать простую симуляцию N-тела и управлять всеми попарными взаимодействиями. Я хотел использовать связанный список для вычисления только взаимодействия между соседями. Это код:Выделите структуру, которая включает в себя трехмерный связанный список

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

#define V 20 
#define N_P 100 

typedef struct _node{ 
    int id; 
    struct _node *next; 
} node; 

typedef struct _particle{ 
    double r[3]; 
    node* n; 
    int coor[3]; 
} particle; 

typedef struct _simulation_struct{ 
    int N; 
    particle *system; 
    double L[3]; 
    double s[3]; 

    int nc[3]; 
    node*** cell; 
} simulation_struct; 

    simulation_struct *new_simulation(int N, double Lx, double Ly,double Lz,double R); 

int main() 
{ 
    simulation_struct *simulation=new_simulation(N_P,V,V,V,2); 

    return 0; 
} 

simulation_struct *new_simulation(int N, double Lx, double Ly, double Lz,double R) 
{ 
    simulation_struct *simulation; 
    int i, j,k; 

    simulation =(simulation_struct*) malloc(1*sizeof(simulation)); 

    simulation->N = N; 

    simulation->L[0] = Lx; 
    simulation->L[1] = Ly; 
    simulation->L[2] = Lz; 

    simulation->nc[0] = (int) (Lx/R)+1; 
    simulation->nc[1] = (int) (Lx/R)+1; 
    simulation->nc[2] = (int) (Lx/R)+1; 

    simulation->s[0] = Lx/simulation->nc[0]; 
    simulation->s[1] = Ly/simulation->nc[1]; 
    simulation->s[2] = Lz/simulation->nc[2]; 

    simulation->system = (particle*)malloc(N*sizeof(particle)); 

    simulation->cell =(node***) malloc ((simulation->nc[0])*sizeof(node **)); 
    for (i=0; i < simulation->nc[0]; i++) 
    { 
    simulation->cell[i] = (node**)malloc((simulation >nc[1])*sizeof(node*)); 
    for (j=0; j < simulation->nc[1];j++) 
    { 
     simulation->cell[i][j] = (node*)malloc((simulation->nc[2])*sizeof(node)); 

     for (k=0; k < simulation->nc[2];k++) 
     { 
      simulation->cell[i][j][k].id = -1; 
      simulation->cell[i][j][k].next = NULL; 
     } 
    } 
    } 

    for (i=0; i < simulation->nc[0]; i++) 
    { 
     simulation->system[i].n = (node*)malloc(1*sizeof(node)); 
     simulation->system[i].n->id = i; 
    } 

    return simulation; 
} 

я могу скомпилировать его, и если параметры V и N_p невелики (например, V = 10 N_p = 20) программа работает отлично, но если параметры немного больше, когда Я выполняю программу, я нахожу ошибку ошибки сегментации. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Заранее благодарен !!!!

+0

Опечатка здесь: 'симуляция> nc [1]' –

+1

Просто для вашей информации, будучи названным [программисты трех звезд] (http://c2.com/cgi/wiki?ThreeStarProgrammer), обычно * не * комплимент , –

+1

Do * NOT * отбрасывает возврат 'malloc', это не нужно. См.: [** Я приведу результат malloc? **] (http://stackoverflow.com/q/605845/995714) для подробного объяснения. –

ответ

0

Запуск через отладчик аварий на

simulation->system = (particle*)malloc(N*sizeof(particle)); 

Там нет ничего плохого в том, что malloc, поэтому проблема должна исходить из предыдущих команд, которые кажутся хорошо, ну, то есть, если предыдущий malloc ОК. Но это не так:

simulation =(simulation_struct*) malloc(1*sizeof(simulation)); 

Бинго: sizeof(simulation) должен быть sizeof(simulation_struct) или не хватает мем для структуры (simulation является указателем, размером 4 или 8, ...): повреждение памяти.

Исправлено:

simulation = malloc(sizeof(simulation_struct)); 

Я проверил исправленную версию и не врезаться больше.

Примечание: в качестве simulation_struct мал, он должен быть еще лучше, чтобы избежать распределения, и использовать & возвращающие simulation_struct: немного больше накладных расходов, но меньше таНос.

и C++ & vector или хорошие шаблоны матрицы также может исправить сложную структуру node ***, которая обычно приводит к утечкам памяти коррупции/памяти при попытке скопировать один в другой.