2011-04-12 110 views
3

什么是'总线错误?'什么是'总线错误?'

以下是我的代码。

非常感谢您的时间!

PROGRAM numbersgen 
     IMPLICIT NONE 

      !Variable declaration 
      INTEGER, DIMENSION(:,:),ALLOCATABLE::numarray 
      INTEGER, DIMENSION(:),ALLOCATABLE::temparray 
      INTEGER:: numrolls, numexps 
      INTEGER:: i=0, j=0 
      REAL:: avg=0, sdv=0, variance=0, sum=0 
      INTEGER:: k, min, pos, temp 


      PRINT*, "Enter the number of experiments to simulate: " 
      READ*, numexps 

      PRINT*, "Enter the number of rolls per experiment: " 
      READ*, numrolls 



    ALLOCATE(numarray(numexps,numrolls)) 

      ----- 

    ALLOCATE(temparray(numrolls)) 


      -----  



     END PROGRAM 

回答

4

你在这里得到的总线错误是通过从numarray复制到临时阵列发出的,然后再分配临时阵列。在进入循环之前,只需移动线 ALLOCATE(temparray(numrolls)) 。

有关总线错误的好评,请参见Segmentation fault

+0

我把它移到循环上面,它现在可以工作。非常感谢!我的另一个问题是你知道我怎样才能修复部分PRINT *,“Experiment”,我在分配语句正下方的循环中,以便它打印实验1和实验2等等?这是我调试过程中出现的另一个问题。 – EuropaDust 2011-04-13 00:59:49

+1

修改子程序PrintStats中的格式字符串以处理整数(类似'(1x,A,I)' - 这意味着1个空格,一个字符串字段和一个整数字段 - 或适合您的问题的东西)。格式化语句在fortran中非常常见,所以在编译器手册中熟悉一下。 – ifeitosa 2011-04-13 04:11:20

4

看起来好像在分配之前使用了temparray

要回答你的问题"what is a bus error?":它通常意味着你的程序试图访问一个不存在的地址或地址不适当对齐 该架构(例如试图读取从一个32位的值地址不在4字节的倍数上对齐)。

4

您的temparray分配为时已晚。试试这个:

ALLOCATE(numarray(numexps,numrolls), temparray(numrolls)) 

并删除第二个ALLOCATE

要自己调试它下一次,与-g选项编译,就像这样:

$ gfortran -g code.f95 

,并在调试器下运行它:

$ gdb a.out 
gdb> run 

它就会给你崩溃的位置。