Чтобы выполнить программу несколько раз на основе пользовательского ввода, мне нужно изменить массив arglist, отправляемый в функцию выполнения.По большей части у меня это работает, за исключением установки конечного флага, чтобы указать, какую функцию разделения использовать из коэффициента получения информации, первого индекса и коэффициента Джини
Эта программа имеет три различные функции разделения для создания дерева решенийна основе набора данных для обучения и тестирования.Я настроил arglist для имитации традиционного ввода CLI, поэтому это допустимые входные данные:
./decision voting 5
./decision -train voting-train-1 -test voting-test-1 -out voting.out -[i, s, g]
То, что делает первая команда, выполняет все трифункции разделения для всех голосующих файлов - - от 1 до 5, тогда как вторая делает это с единичным набором данных.
У меня есть массив временных аргументов, который строится в зависимости от итерации, икогда приходит время добавить последний флаг, вот что я сделал:
//flag pointers
char *igFlag= "-i";
char *faFlag= "-s";
char *giFlag= "-g";
//copy temp array to specific arglist
igInput= cli;
faInput= cli;
giInput= cli;
//set information gain flag and null
igInput[7]= igFlag;
igInput[8]= '\0';
//set first attribute flag and null
faInput[7]= faFlag;
faInput[8]= '\0';
//set gini coefficient and null
giInput[7]= giFlag;
giInput[8]= '\0';
Проблема здесь в том, что когда faInput[7]= faFlag
выполняется, он меняет igInput[7]
на соответствие, а затем, когда giInput[7]= giFlag
выполняется, все три массива имеют совпадающие указатели [7].
Я сталкивался с подобной проблемой при использовании одного и того же временного указателя для целочисленного массива, но эта проблема была исправлена с помощью переменных с разными именами.Эта проблема возникает, даже если у меня есть разные переменные, которые не имеют ничего общего друг с другом.
решено
В ответ на запрос AusCBloke, чтобы узнать, как я решил эту проблему, вот так.
Во-первых, я решил, что мне не нужно несколько входных строк, только та, где должен быть изменен последний слот.Поэтому я вырезал две строки xxInput и использовал только одну.
В итоге мне понадобилось больше флагов в конце, и вместо того, чтобы получить дублирующийся код, я создал char flag[5]
, содержащий флаги, которые должны бытьиспользуемый.Затем они были вызваны из цикла for, где используемым флагом было текущее значение индекса.
В целом, этот подход закончил тем, что удалил около 30 строк ненужного кода.