Problem z działaniem programu (prawdopodobnie coś z pamięcią)

0

Próbuję przerobić model Isinga z javy na C (taki projekt ;/). Wszystko wydawało się w porządku aż do momentu zwiększenia tablicy. Program się kompiluje, ale po prostu w pewnym momencie przestaje działać i wywala "Process returned -1073741819 (0xC0000005)". Spróbowałem też na ubuntu, tam to nawet nie uruchamia się i pisze coś o pamięci. Mógłby ktoś uświadomić co takiego strasznego tutaj robię?

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


int main()
{
    double J=1.0;
    int **spin;
    spin = spinGen();
    MTdependence(spin, J);
    //drawSpinMatrix(spin, J);
    return 0;
}
#pragma once
#define N 10

int ** spinGen();
double magnetization(int (**spin));
double site_energy(int i, int j, int(**spin), double J);
double total_energy(int(**spin), double J);
void step(int i, int j, int(**spin), double J, double kT);
void phase(int(**spin), double J, double kT);

void test(int (**spin), double J);
void MTdependence(int (**spin), double J);
void drawSpinMatrix(int (**spin), double J);
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#include "ising.h"

int ** spinGen(){
    srand((unsigned) time(NULL));
    int **out;
    out = malloc(sizeof(int) * N);
    for (int i = 0; i < N; ++i) {
        out[i] = malloc(sizeof(int) * N);
    }
    for(int i=0; i<N; ++i)
    {
        for(int j=0; j<N; ++j)
        {
            out[i][j] = rand()%2;
        }
    }
    return out;
}

double magnetization(int (**spin))
{
    int M = 0;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
        if (spin[i][j]) M++;
        else M--;
        }
    }
    return 1.0 * M / (N * N);
}

double site_energy(int i, int j, int(**spin), double J)
{
    double E = 0.0;
    if (spin[i][j] == spin[(i+1)%N][j]) E++;
    else E--;
    if (spin[i][j] == spin[i][(j+1)%N]) E++;
    else E--;
    if (spin[i][j] == spin[(i-1+N)%N][j]) E++;
    else E--;
    if (spin[i][j] == spin[i][(j-1+N)%N]) E++;
    else E--;
    return -J * E;
}

double total_energy(int(**spin), double J)
{
    double E = 0.0;
    for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++)
        E += 0.5 * site_energy(i, j, spin, J);
    return E;
}

void step(int i, int j, int(**spin), double J, double kT)
{
    double deltaE = -2 * site_energy(i, j, spin, J);
    if ((deltaE <= 0) || ((double)rand()/RAND_MAX <= exp(-deltaE / kT)))
        if(spin[i][j]==0) spin[i][j]=1;
        else spin[i][j]=0;
}

void phase(int(**spin), double J, double kT)
{
    for (int steps = 0; steps < N*N; steps++)
        {
        int i = (int) ((double)rand()/RAND_MAX * N);
        int j = (int) ((double)rand()/RAND_MAX * N);
        step(i, j, spin, J, kT);
        }
}

void test(int (**spin), double J)
{
    double mag=magnetization(spin);
    double sene=site_energy(12,11,spin,J);
    double tene=total_energy(spin, J);
    printf("Srednia magnetyzacja:%f\nEnergia wybranego miejsca:%f\nEnergia ukladu:%f\n", mag, sene, tene);
    phase(spin,J,1.0);
}

void MTdependence(int (**spin), double J)
{
    double temp[]={1.0,1.25,1.5,1.75,2.0,2.25,2.5,2.75,3.0,3.25,3.5,3.75,4.0};
    double mag[13][10];
    double kT=0;
    for(int k=0; k<13; k++)
    {
        kT=temp[k];
        printf("\nkT=%f\n", kT);
        for(int t=0; t<10; t++)
        {
           mag[k][t] = magnetization(spin);
           phase(spin, J, kT);
           printf("M=%f ", mag[k][t]);
        }
    }
}

void drawSpinMatrix(int (**spin), double J)
{
    double kT = 1.0 + 3.0*((double)rand()/RAND_MAX);
    char spinmatrix[N][N];
    phase(spin, J, kT);
    for(int i=0; i<N; ++i)
    {
        for(int j=0; j<N; ++j)
        {
            if(spin[i][j]) spinmatrix[i][j]='^';
            else spinmatrix[i][j]='v';
            printf("%d ", spinmatrix[i][j]);
        }
        printf("\n");
    }
}

1
int **out;
out = malloc(sizeof(int) * N);

Tu powinieneś dać rozmiar tablicy wskaźników na int a nie tablicy int'ów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1