Я написал функцию, которая определяет, следует ли присваивать значения по умолчанию (присваивает значения по умолчанию, если флаг отсутствует, и присваивает значения, которые пользователь передает, если флаг присутствует). И я пытаюсь проверить свою функцию с помощью строки, чтобы узнать, дали ли она правильные номера. Я продолжаю получать «Ошибка сегментации», когда я пытаюсь запустить тесты, он компилируется, но тесты просто не работают. 🙁
Вот мой заголовочный файл:
#ifndef COMMANDLINE_H #define COMMANDLINE_H #include "data.h" #include struct point eye; /* The variable listed above is a global variable */ void eye_flag(int arg_list, char *array[]); #endif
Вот мой файл реализации:
#include #include "commandline.h" #include "data.h" #include "string.h" /* Used global variables for struct point eye */ void eye_flag(int arg_list, char *array[]) { eye.x = 0.0; eye.y = 0.0; eye.z = -14.0; /* The values listed above for struct point eye are the default values. */ for (int i = 0; i <= arg_list; i++) { if (strcmp(array[i], "-eye") == 0) { sscanf(array[i+1], "%lf", &eye.x); sscanf(array[i+2], "%lf", &eye.y); sscanf(array[i+3], "%lf", &eye.z); } } }
И вот мои тестовые примеры:
#include "commandline.h" #include "checkit.h" #include void eye_tests(void) { char *arg_eye[6] = {"a.out", "sphere.in.txt", "-eye", "2.4", "3.5", "6.7"}; eye_flag(6, arg_eye); checkit_double(eye.x, 2.4); checkit_double(eye.y, 3.5); checkit_double(eye.z, 6.7); char *arg_eye2[2] = {"a.out", "sphere.in.txt"}; eye_flag(2, arg_eye2); checkit_double(eye.x, 0.0); checkit_double(eye.y, 0.0); checkit_double(eye.z, -14.0); } int main() { eye_tests(); return 0; }
Ошибки здесь:
for (int i = 0; i <= arg_list; i++) { ///^^ if (strcmp(array[i], "-eye") == 0) { sscanf(array[i+1], "%lf", &eye.x); //^^^ sscanf(array[i+2], "%lf", &eye.y); sscanf(array[i+3], "%lf", &eye.z); } }
i <= arg_list
, так как вы проходите в 6, индекс массива начинается с 0, максимальное значение равно 5 i+1, i+2,i+3
выдаст вам индекс за пределы, когда вы перейдете от 0 до 5. Самый простой способ решить эту проблему – запустить его в отладчике. Вам, вероятно, даже не нужно будет узнать, как пройти через свой код или что-то еще – просто запустите, запустите и прочитайте строку.
Если вы находитесь в системе * nix:
-g
. gdb a.out
. (gdb) run
. bt
или where
должна указываться трассировка стека – и точная строка, вызывающая вашу проблему. Я уверен, что вы можете решить это оттуда, чтобы опубликовать это как ответ; но если нет, зная точную линию, она будет намного легче исследовать и решать.
Условие вашего цикла неверно. Он должен быть i < arg_list
.
Подумайте, что произойдет, когда i == arg_list
.