简体   繁体   English

Xcode 错误:“EXC_BAD_ACCESS”

[英]Xcode Error: “EXC_BAD_ACCESS”

I am attempting to compile and run a C program in Xcode.我正在尝试在 Xcode 中编译和运行 C 程序。 This program requires a text file for reading input and another text file for writing the data.该程序需要一个用于读取输入的文本文件和另一个用于写入数据的文本文件。 I have put the program, and these two text files in the Source folder.我已经把程序和这两个文本文件放在Source文件夹中。 The program builds successfully, but when I try to run the program I get the error: GDB: Program received signal: "EXC_BAD_ACCESS"程序构建成功,但是当我尝试运行程序时出现错误: GDB: Program received signal: "EXC_BAD_ACCESS"

What could be causing this?这可能是什么原因造成的?

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

Sample Input:样本输入:

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

The program works almost properly.该程序几乎可以正常工作。 I got this output:我得到了这个 output:

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

The last line might be the only problem.最后一行可能是唯一的问题。 What the system("PAUSE") was supposed to do? system("PAUSE")应该做什么?

EXC_BAD_ACCESS appears in the following line: EXC_BAD_ACCESS 出现在以下行中:

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

Setting a breakpoint in it showed that fr was NULL, and that's the problem.在其中设置断点表明fr是NULL,这就是问题所在。 The path to the files were set relatively to the executable location, but notice that the executable goes to a build folder, which does not contain the input and output files (these are located in your project folder).文件的路径是相对于可执行文件位置设置的,但请注意,可执行文件转到构建文件夹,其中不包含输入和 output 文件(这些文件位于您的项目文件夹中)。

In Xcode, select targets and then right click on your program.在 Xcode、select 目标中,然后右键单击您的程序。 Choose the "Show in Finder" item, which will open a folder where the program is located.选择“在Finder中显示”项,这将打开程序所在的文件夹。 Drop your input file there and it should work.将您的输入文件放在那里,它应该可以工作。


To clarify the arguments:澄清 arguments:

In your main function, change the parameters to match this:在您的主 function 中,更改参数以匹配此:

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

In short, there are two parameters.简而言之,有两个参数。 Every executable can receive arguments on its launch, and these parameter capture those arguments.每个可执行文件都可以在启动时收到 arguments,这些参数捕获那些 arguments。 For example, consider when you launch your program from the command line:例如,考虑从命令行启动程序时:

$ ./myprogram file1.txt file2.txt

The file1.txt and file2.txt are arguments, they will be passed to main. file1.txtfile2.txt是 arguments,它们将被传递给 main。 The main function has two arguments: argc and argv .主要的 function 有两个 arguments: argcargv The first is an int, holds the number of arguments, and the second is an array of strings, the arguments themselves.第一个是 int,保存 arguments 的数量,第二个是字符串数组,arguments 本身。

In the example I gave, argc is set to 3, as the first argument will be the program name (that's a little detail).在我给出的示例中, argc设置为 3,因为第一个参数将是程序名称(这是一个小细节)。 So:所以:

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

To do it in Xcode, first modify your main function to accept parameters.要在 Xcode 中执行此操作,首先修改您的主 function 以接受参数。 Then, modify this line:然后,修改这一行:

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

To this:对此:

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

Now, considering you're on Xcode4 choose the "Product > Edit Scheme..." menu item.现在,考虑到您在 Xcode4 上,选择“Product > Edit Scheme...”菜单项。 In the run configuration (side bar), choose the arguments tab and add a path to the desired input file in the "Arguments passed on Launch" section.在运行配置(侧栏)中,选择 arguments 选项卡并在“启动时传递的参数”部分中添加所需输入文件的路径。

That's it.而已。 Your program will now run as before, but when you need to use another file, you don't need to recompile the program.您的程序现在将像以前一样运行,但是当您需要使用另一个文件时,您不需要重新编译程序。 Just change the path in the argument list.只需更改参数列表中的路径即可。 This may appear to be more work, but once you have larger programs and starting using the command line, it will make more sense.这可能看起来需要更多的工作,但是一旦你有更大的程序并开始使用命令行,它就会更有意义。

Now go read a good book on C and another on Unix that explain the details I didn't:-)现在 go 读了一本关于 C 的好书和另一本关于 Unix 的好书,这些书解释了我没有解释的细节:-)

In most cases you try to send a message or access an instance, which has been deallocated previously.在大多数情况下,您会尝试发送消息或访问先前已被释放的实例。

Work with breakpoints to identify the exact spot where your application crashes.使用断点来确定应用程序崩溃的确切位置。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM