Самореплицирующийся код, как реализовать различное поведение в первой итерации по сравнению со следующими? - PullRequest
0 голосов
/ 02 марта 2019

Так что мне тяжело со школьным проектом.Цель состоит в том, чтобы создать самовоспроизводящийся код с именем Sully.c.Эта программа должна вывести свой собственный исходный код (это квинну) в программу с именем Sully_x.c, где x - целое число в исходном коде, затем скомпилировать указанную программу и выполнить ее, если x> 0. x должен уменьшиться с одной копии доследующий, но не от оригинального Sully.c до Sully_5.c.

Вот мой код на данный момент:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int k = 5;
#define F1 int main(void){int fd = open("Sully_5.c", 0);if(fd != -1){close(fd);k-=1;}char buff[62];(sprintf)(buff, "Sully_%d.c", k);FILE *f = fopen(buff, "w");fprintf(f, "#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\nint k = %d;\n#define F1 %s\n#define F2(x) #x\n#define F3(x) F2(x)\nconst char *s = F3(F1);\nF1\n", k, s);fclose(f);(sprintf)(buff, "gcc -Wall -Wextra -Werror Sully_%d.c -o Sully_%d", k, k);system(buff);if (k != 0){(sprintf)(buff, "./Sully_%d", k);system(buff);}return 0;}
#define F2(x) #x
#define F3(x) F2(x)
const char *s = F3(F1);
F1

Этот код работает и проверяет все требования к программе,Тем не менее, я использую метод, который проверяет что-то, кроме самого кода -> я проверяю, существует ли уже sully_5.c или нет.Если это не так, х не двигается, если он делает, то это уменьшается.Другим методом было бы использовать argv [0] или макрос __FILE__, но обе эти опции явно запрещены для назначения и считались обманом.

Но, очевидно, есть другие методы, которые не требуютлюбой из вышеперечисленных методов.Я не могу думать ни о чем, потому что, если Sully.c и Sully_5.c требуют различного поведения, но одного и того же исходного кода, тогда должна существовать внешняя переменная, которая должна влиять на поведение кода, или моя гипотеза такова.

Я прав?Неправильно?Как еще это можно сделать?

1 Ответ

0 голосов
/ 02 марта 2019

... должна существовать внешняя переменная, которая должна влиять на поведение кода

Как еще это можно сделать?

  • Вы можете определить или нет некоторые переменные предварительной обработки (например, -Daze или -Daze=12 и т. Д.) Для генерации другого кода с использованием условной компиляции без изменения источника

  • При выполнении также может использоваться аргумент(и) передается программе при запуске для изменения ее поведения

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