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");
}
}