【发布时间】:2021-02-03 14:27:50
【问题描述】:
我正在尝试模拟 2000 个粒子的随机游走,而一个边界能够使粒子绑定在其上并且仅执行有偏差的步骤。
当然有绑定解除绑定等的概率... 下面我有整个代码。 但是我收到段错误错误。 我在代码中放了一些打印语句,看看问题出在哪里。但什么都没有。但我发现奇怪的是,虽然种子是固定的,但输出语句的长度决定了循环,代码被压碎的地方。
我对这些问题完全没有经验,所以如果您对我能做什么有任何想法,将不胜感激。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
using namespace std;
const int pi=6;
const int epsilon=10;
const int X=3000;
const int Y=30; //length
const int time_steps=100000;
const int N=2000; // number of molecules
int kinesins[N][3]={0};//[X,Y,bound or not]
int grid[X][Y][2]={0};
void place_kinesins(){
for (int i=0; i<N;i++){
int x= rand()%X;
int y= (rand()%(Y-2))+2;
if (grid[x][y][0]==0){
kinesins[i][0]=x;
kinesins[i][1]=y;
kinesins[i][2]=0;
grid[x][y][0]=1;
}else{i--;}
}
}
void create_boundaries(){
for(int i=0;i<Y;i++){
grid[0][i][1]=-1;
grid[X-1][i][1]=-3;
}
for (int i=0; i<X; i++){
grid[i][Y-1][1]=-2;
}
}
void create_filament(){ //in order to create binding affinity.
for(int i=0; i<X;i++){
grid[i][1][1]=pi;
}
}
void step(int kinesin, int x_step, int y_step){
int x=kinesins[kinesin][0];
int y=kinesins[kinesin][1];
int x_end=x+x_step;
int y_end=y+y_step;
if (grid[x_end][y_end][0]==0){
grid[x][y][0]=0;
kinesins[kinesin][0]=x_end;
kinesins[kinesin][1]=y_end;
grid[x_end][y_end][0]=1;
}
}
void bound(int kinesin){
int roll=rand()%10000 ;
if (roll<epsilon){
kinesins[kinesin][2]=0;
step(kinesin,0,1);
}else{
if (roll%63==0){ //controls the binding rate speed
step(kinesin, 1,0);
};
}
}
void unbound(int kinesin){
cout<<"1";
int x= kinesins[kinesin][0];
int y= kinesins[kinesin][1];
int type= grid[x][y][1];
switch(type){
case 0:{
cout<<"2";
int roll=rand()%4;
switch(roll){
case 0:
step(kinesin,-1,0);
break;
case 1:
step(kinesin,1,0);
break;
case 2:
step(kinesin,0,1);
break;
case 3:
step(kinesin,0,-1);
break;
}
break;
}
case -1:
step(kinesin,1,0);
break;
case -2:
step(kinesin,0,-1);
break;
case -3:
step(kinesin,-1,0);
break;
default:
int roll=rand()%10000;
if(roll<grid[x][y][1]){kinesins[kinesin][2]=1;}
else{ if(roll%2==0){step(kinesin,0,1);}}
}
}
void kinesin_move(int kinesin){
cout<<" "<<kinesins[kinesin][0]<<kinesins[kinesin][1];
if (kinesins[kinesin][2]==0){
unbound(kinesin);
}else{
cout<<"3";
bound(kinesin);
}
}
void simulation(){
for(int j=7000; j<time_steps;j++){
cout<<endl<< j<<" "<<endl;
for (int kin=0; kin<N; kin++){
cout<<kin;
kinesin_move(kin);
cout<<"E " ;
}
}
}
void programm(){
srand(1);
create_boundaries();
create_filament();
cout<<"Filament done"<<endl;
place_kinesins();
cout<<"Kines placed"<<endl;
simulation();
}
int main(){
programm();
return 0;
}
【问题讨论】:
-
分段错误发生在哪个函数中?
-
1) 您是否尝试过逐行逐行查看代码,查看每个变量的值,并将它们与您的期望值进行比较,每个执行步骤? 2)“我在代码中放了一些打印语句来看看问题出在哪里。但是什么都没有。”是什么意思?也许您将打印语句放在错误的位置?
-
全局变量的使用使代码难以阅读。也使用
std::array或std::vector会有所帮助。这就是我首先要解决的问题,之后错误很明显或消失的可能性很高 -
@GaryNLOL "顺便说一句,我无法重现段错误" 分段错误是代码中某处未定义行为的标志。由于未定义行为的性质:任何分钟和不相关的更改(在不同的机器上运行,再次运行等)都会影响行为:并且“似乎工作正常”是未定义行为的可能表现之一。
标签: c++ segmentation-fault montecarlo random-walk