Программа работает почти правильно. Я получил этот вывод:
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, которая объясняет детали, которые я не сделал: -)