Xcode错误:“EXC_BAD_ACCESS”

时间:2011-05-31 13:42:14

标签: c xcode

我正在尝试在Xcode中编译和运行C程序。该程序需要一个用于读取输入的文本文件和另一个用于写入数据的文本文件。我把程序和这两个文本文件放在Source文件夹中。程序构建成功,但是当我尝试运行程序时,我收到错误:GDB:程序收到信号:“EXC_BAD_ACCESS”

导致这种情况的原因是什么?

 int main() {

     FILE *fp; 
     FILE *fr;

     //Declare and intialize all variables to be used
     float ax = 0, ay = 0, x = 0, y = 0, vx = 0, vy = 0; 
     float time = 0, deltaTime = .001; 
     float timeImpact = 0, vyImpact = 0, vxImpact = 0, xImpact = 0, yImpact = 0; 

     int numBounces = 0;

     //Coefficient of Restitution; epsilon = ex = ey
     float ex = .5;
     float ey = .5;

     fr = fopen("input_data.txt", "rt"); //Open file for reading

     fp = fopen( "output_data.txt", "w" ); // Open file for writing

     if(fr == NULL){ printf("File not found");} //if text file is not in directory...

     if(fp == NULL){ printf("File not found");} //if text file is not in directory...

     fscanf(fr, "ax: %f ay: %f x: %f y: %f vx: %f vy: %f\n", &ax, &ay, &x, &y, &vx, &vy); 

     while (time < 5) {

          //time = time + deltaTime
          time = time + deltaTime;
          //velocity[new] = velocity[old] + acc * deltaTime
          vx = vx + ax*deltaTime;
          vy = vy + ay*deltaTime;
          //position[new] = position[old] + velocity*deltaTime + .5*acc*(deltaTime)^2
          x = x + vx*deltaTime + (.5*ax*deltaTime*deltaTime);
          y = y + vy*deltaTime + (.5*ay*deltaTime*deltaTime);  

          //fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);

               //Collision occurs; implement collision response
               if (y < 0) {

                  //Find time of collision by solving for t in equation vy*t + .5*ay*t^2 + y = 0
                  timeImpact = (-vy + sqrt((vy*vy) - (2*ay*y)) / (2*.5*ay)); //Collision time = 3.7?

                  //velocity = -epsilon*velocity[Impact] + acc*time
                  vy = (-1*ey)*vyImpact + ay*((deltaTime - time) - timeImpact);
                  vx = (-1*ex)*vxImpact + ay*((deltaTime - time) - timeImpact);                            

                  //Position = position[Impact] - epsilon*velocity[Impact]*time + 1/2*acc*time^2
                  x = xImpact - ex*vxImpact*((deltaTime - time) - timeImpact) + .5*ax*       ((deltaTime - time) - timeImpact) * ((deltaTime - time) - timeImpact);
                  y = yImpact - ey*vyImpact*((deltaTime - time) - timeImpact) + .5*ay*((deltaTime - time) - timeImpact) * ((deltaTime - time) - timeImpact);

                  //velocity = v[o] + ay(time)
                  vyImpact = vy + ay*(timeImpact - time);
                  vxImpact = vx + ax*(timeImpact - time); 

                  //position = position[o] + velocity(time) + 1/2*acc*time^2
                  xImpact = x + vx*(timeImpact - time) + .5*ax*(timeImpact - time)*(timeImpact - time);  
                  //yImpact = y + vy*(timeImpact - time) + .5*ay*(timeImpact - time)*(timeImpact - time); 

                  numBounces++; //Increment number of bounces ball takes

                  //fprintf(fp, "%f\t%f\t%f\t%f\t%f\t%f\t%f\t\n", ax, ay, x, y, vx, vy, time);
                  printf("timeImpact: %f\nxImpact: %f\nyImpact: %f\nvxImpact: %f\nvyImpact: %f\n", timeImpact, xImpact, yImpact, vxImpact, vyImpact);
                  printf("Number of Bounce(s): %d\n\n", numBounces); 
               }
     }

     fclose(fp); //Close output file
     fclose(fr); //Close input file

     system ("PAUSE"); 
     return 0;
  }

示例输入:

ax:0 ay:-9.8 x:0 y:50 vx:8.66 vy:5

2 个答案:

答案 0 :(得分:3)

该程序几乎正常工作。我得到了这个输出:

timeImpact: 28.457277
xImpact: 7798.595703
yImpact: 0.000000
vxImpact: 315.561859
vyImpact: 73.370865
Number of Bounce(s): 1

timeImpact: -315.561096
xImpact: 984718.250000
yImpact: 0.000000
vxImpact: -3213.589600
vyImpact: 36.704834
Number of Bounce(s): 2

timeImpact: 3088.760254
xImpact: 94468824.000000
yImpact: 0.000000
vxImpact: 31913.345703
vyImpact: 55.056641
Number of Bounce(s): 3

timeImpact: -30290.189453
xImpact: 9086046208.000000
yImpact: 0.000000
vxImpact: -312763.843750
vyImpact: 45.875000
Number of Bounce(s): 4

timeImpact: 296834.687500
xImpact: 872571076608.000000
yImpact: 0.000000
vxImpact: 3065398.750000
vyImpact: 50.500000
Number of Bounce(s): 5

timeImpact: -2908993.750000
xImpact: 83802579795968.000000
yImpact: 0.000000
vxImpact: -30040802.000000
vyImpact: 48.000000
Number of Bounce(s): 6

timeImpact: 28507292.000000
xImpact: 8047926899113984.000000
yImpact: 0.000000
vxImpact: 294391936.000000
vyImpact: 64.000000
Number of Bounce(s): 7

timeImpact: -279371488.000000
xImpact: 772922520746590208.000000
yImpact: 0.000000
vxImpact: -2885036544.000000
vyImpact: 0.000000
Number of Bounce(s): 8

timeImpact: 2737840640.000000
xImpact: 74231486855715487744.000000
yImpact: 0.000000
vxImpact: 28273358848.000000
vyImpact: 0.000000
Number of Bounce(s): 9

timeImpact: -26831695872.000000
xImpact: 7129642377640744583168.000000
yImpact: 0.000000
vxImpact: -277087289344.000000
vyImpact: 0.000000
Number of Bounce(s): 10

timeImpact: nan
xImpact: nan
yImpact: 0.000000
vxImpact: nan
vyImpact: nan
Number of Bounce(s): 11

sh: PAUSE: command not found

最后一行可能是唯一的问题。 system("PAUSE")应该做什么?

EXC_BAD_ACCESS出现在以下行中:

fscanf(fr, "ax: %f ay: %f x: %f y: %f vx: %f vy: %f\n", &ax, &ay, &x, &y, &vx, &vy);

在其中设置断点显示fr为NULL,这就是问题所在。文件的路径是相对于可执行文件位置设置的,但请注意,可执行文件会转到build文件夹,该文件夹不包含输入和输出文件(这些文件位于项目文件夹中)。

在Xcode中,选择目标,然后右键单击您的程序。选择“在Finder中显示”项,该项将打开程序所在的文件夹。删除你的输入文件,它应该工作。


澄清论点:

在主函数中,更改参数以匹配:

int main (int argc, char *argv[])

简而言之,有两个参数。每个可执行文件都可以在其启动时接收参数,这些参数捕获这些参数。例如,考虑从命令行启动程序时:

$ ./myprogram file1.txt file2.txt

file1.txtfile2.txt是参数,它们将被传递给main。 main函数有两个参数:argcargv。第一个是int,保存参数的数量,第二个是字符串数组,参数本身。

在我给出的示例中,argc设置为3,因为第一个参数将是程序名称(这是一个小细节)。所以:

argv[1] == "file1.txt"
argv[2] == "file2.txt"

要在Xcode中执行此操作,请先修改主函数以接受参数。然后,修改此行:

fr = fopen("input_data.txt", "rt"); //Open file for reading

对此:

fr = fopen(argv[1], "rt"); //Open file for reading

现在,考虑到您使用的是Xcode4,请选择“Product&gt; Edit Scheme ...”菜单项。在运行配置(侧栏)中,选择参数选项卡,并在“启动时传递的参数”部分中添加所需输入文件的路径。

就是这样。您的程序现在将像以前一样运行,但是当您需要使用其他文件时,您不需要重新编译该程序。只需更改参数列表中的路径即可。这可能看起来更有效,但是一旦你有更大的程序并开始使用命令行,它将更有意义。

现在去读一本关于C的好书,另一本关于Unix的解释我没有的细节: - )

答案 1 :(得分:0)

在大多数情况下,您尝试发送消息或访问先前已取消分配的实例。

使用断点来确定应用程序崩溃的确切位置。