Seg Fault 11,(GMP问题和初始化??)

时间:2013-04-01 21:45:57

标签: c++ segmentation-fault gmp

我在这段代码中有一个分段错误11(编辑:不再显示)。

在被告知要获得一个调试器并对我的阵列进行排序之后,我已经编辑了代码来修复数组从0开始。我还安装了valgrind并运行它但在OSX上工作时它是有限的。我已经运行了gbd,问题如下所述。

如果这看起来非常不祥,或者代码需要取得任何进展,请告诉我,我可以按照论坛期望的格式编辑问题。

在我的代码上运行gdb:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00007fff5e4c27c8
0x0000000100001048 in main () at TammesA3.cc:23
23    mpf_set_default_prec(1024);

代码如下,问题是在我的循环开始之前甚至开始之前引起的!

#include <stdio.h> 
#include <string.h>
#include <math.h>
#include <iostream>
#include <iomanip>
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include <sstream>
#include <gmpxx.h>
using namespace std;
#define PI 3.14159265358979323846

mpf_t E[100000];

int main()
{

  int a,b,c,d,f,i,j,k,m,n,s,Success,Fails;
  double p,theta,phi,Time,Averagetime,Distance,Length,DotProdForce,
         Forcemagnitude,ForceMagnitude[200],Force[200][3],Epsilon[3],
         x[200][3],new_x[200][3],y[200][3],A[200],alpha[200][200],degree,bestalpha[500];
  unsigned long int t;

  mpf_set_default_prec(1024);

  mpf_t Energy,energy,Power,D,En[500],Ep,e;

  mpf_init(Power);
  mpf_init(D);
  mpf_init(Ep);
  mpf_init(e);
  mpf_init(Energy);
  mpf_init(energy);

  for(i=0;i<100000;i++){
   mpf_init(E[i]);
  }

  for(i=0;i<500;i++){
    mpf_init(En[i]);
  }

  mpf_set_d(e,0.00000000000000000000000000000000000000000000000000000000001);

  clock_t t1,t2;
  t1=clock();

t=1000;

while(t<1001){

n=20;

while(n<21){

cout << "N=" << n << "\n";

  b=1;
  Time=0.0;

  while(b<2){

    clock_t t3,t4;
    t3=clock();

    if(n>200){
      cout << n << " is too many points for me :-( \n";
      exit(0);
    }

    srand((unsigned)time(0));  

    for (i=0;i<n;i++){
      x[i][0]=((rand()*1.0)/(1.0*RAND_MAX)-0.5)*2.0;
      x[i][1]=((rand()*1.0)/(1.0*RAND_MAX)-0.5)*2.0;
      x[i][2]=((rand()*1.0)/(1.0*RAND_MAX)-0.5)*2.0;

      Length=sqrt(pow(x[i][0],2)+pow(x[i][1],2)+pow(x[i][2],2));

      for (k=0;k<3;k++){
        x[i][k]=x[i][k]/Length;
      }
    }

    for(i=0;i<n;i++){
      for(j=0;j<3;j++){
        cout << "x[" << i << "][" << j << "]=" << x[i][j] << "\n";
      }
    }

    /* Points distributed randomly and normalised so they sit on unit sphere */

    mpf_set(Energy,0);

    for(i=0;i<n;i++){
      for(j=i+1;j<n;j++){
        Distance=sqrt(pow(x[i][0]-x[j][0],2)+pow(x[i][1]-x[j][1],2)
                     +pow(x[i][2]-x[j][2],2));

        mpf_set_d(D,Distance);

        mpf_pow_ui(Power,D,t);      
        mpf_ui_div(Power,1.0,Power);
        mpf_add(Energy,Energy,Power);

      }
    } etc.

在此之后,我的代码进入循环,但是注释中的代码真的很长,所以除非请求,否则不要再将其放入。

1 个答案:

答案 0 :(得分:1)

剩下的问题(1)是(三行)

mpf_set(Energy,0);

它的原型是

void mpf_set (mpf_t ROP, mpf_t OP)

mpf_t是一个数组,

typedef __mpf_struct mpf_t[1];

所以你传递一个空指针来读取值。取消引用空指针是分段错误的另一个典型原因(除了访问数组边界之外)。

您打算在那里使用mpf_set_dmpf_set_uimpf_set_si(您使用哪一个并不重要)。


(1)我复制了修订版2中的代码,并将两个大数组Ealpha移动到文件范围,以减轻该负担的堆栈,并且在第94,147和271行修复了三个mpf_set(variable,0),它就完成了。

这并不一定意味着代码是正确的,在我读到的输出结尾

Successes=0 Failures=1
Success Rate=0.00000

暗示了代码逻辑中可能存在的问题,但我不知道期望什么输出。