Ошибка XCode: "EXC_BAD_ACCESS" - PullRequest
1 голос
/ 31 мая 2011

Я пытаюсь скомпилировать и запустить программу на C в Xcode.Эта программа требует текстовый файл для чтения ввода и другой текстовый файл для записи данных.Я поместил программу и эти два текстовых файла в папку 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 ]

3 голосов
/ 31 мая 2011

Программа работает почти правильно. Я получил этот вывод:

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 был НЕДЕЙСТВИТЕЛЕН, и в этом проблема. Путь к файлам был задан относительно расположения исполняемого файла, но обратите внимание, что исполняемый файл идет в папку сборки, которая не содержит входных и выходных файлов (они находятся в папке вашего проекта).

В Xcode выберите цели, а затем щелкните правой кнопкой мыши на вашей программе. Выберите пункт «Показать в Finder», который откроет папку, в которой находится программа. Удалите туда свой входной файл, и он должен работать.


Чтобы уточнить аргументы:

В вашей основной функции измените параметры в соответствии с этим:

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

Короче говоря, есть два параметра. Каждый исполняемый файл может получить аргументы при запуске, и эти параметры захватывают эти аргументы. Например, рассмотрим, когда вы запускаете вашу программу из командной строки:

$ ./myprogram file1.txt file2.txt

file1.txt и file2.txt являются аргументами, они будут переданы в main. Основная функция имеет два аргумента: argc и argv. Первый - это 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> Edit Scheme ...». В конфигурации запуска (боковая панель) выберите вкладку «Аргументы» и добавьте путь к нужному входному файлу в разделе «Аргументы переданы при запуске».

Вот и все. Ваша программа теперь будет работать, как раньше, но когда вам нужно использовать другой файл, вам не нужно перекомпилировать программу. Просто измените путь в списке аргументов. Это может показаться более трудоемким, но как только у вас появятся большие программы и вы начнете использовать командную строку, это будет иметь больше смысла.

Теперь прочитайте хорошую книгу по Си и другую по Unix, которая объясняет детали, которые я не сделал: -)

0 голосов
/ 31 мая 2011

В большинстве случаев вы пытаетесь отправить сообщение или получить доступ к экземпляру, который был ранее освобожден.

Работа с точками останова для определения точного места, где происходит сбой приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...