Вывод на экран программой собственного исходника
Написать программу, которая может распечатать (в консоли вывести на экран) собственный исходный код.
Так вот, знает ли кто, возможно ли это сделать, если да то как?
P.S. Варианты типа: "Прочитать исходный код из файла и вывести на экран" не решают поставленную задачу.
Т.е., по идее, исходник после компиляции должен содержаться в бинарике.
Если не секрет - а зачем такая штука нужна?
Да я понял, что исходник надо вывести. Я имел в виду, что дизассемблированием однозначный сорс не получить.
Спасибо за ссылку. :)
Вот, что у меня получается:
#include <conio.h>
#define D(x) char*t=#x;x
D(\
int main(int c,char**v)\
{\
printf("#include <stdio.h>\n#include <conio.h>\n#define D(x) char*t=#x;x\nD(%s)\n",t);\
getch();\
}\
)
main(char* a){printf(a,34,a="main(char* a){printf(a,34,a=%c%s%c,34);}",34);}
вот так устроит? :)
main(char* a){printf(a,34,a="main(char* a){printf(a,34,a=%c%s%c,34);}",34);}
вот так устроит? :)
Дело в том, что твой вариант дублирует в printf(..); весь исходный код программы и просто перепечатывает его 2 раза.
Фактически приходится писать 2-е копии программы.
Вариант
#include <conio.h>
#define D(x) char*t=#x;x
D(
int main(int c,char**v)
{
printf("My Source:\n\n#include <stdio.h>\n#include <conio.h>\n#define D(x) char*t=#x;x\nD(%s)\n\nEnd of my Source!\n",t);
printf("Этот текст тоже будет напечатан....\n");
printf("И этот тоже :-) \n");
getch();
}
)
мне кажется более удачным и решает поставленную задачу полностью.
Я думаю вряд ли найдется более удачное решение.........;)
Фактически приходится писать 2-е копии программы.
А разве приведённый тобою вариант не емеет той же проблемы? Хотя да, не имеет - он печатает не ВЕСЬ свой исходник. ;)
Ну, да ладно. Позвольте, так сказать, внести лепту :)
Код, само собой, для Windows.
#include <iostream>
using namespace std;
#define IDR_SOURCE1 101
int main(int argc, char** argv)
{
char* mysource = (char* )LoadResource( NULL, FindResource( NULL, MAKEINTRESOURCE(IDR_SOURCE1), "SOURCE" ) );
cout << mysource << endl;
return 0;
}
В свойствах проекта установлено Not Using Precompiled Headers, дабы ничего не скрывать. Добавляем ресурс типа SOURCE под названием IDR_SOURCE1, и в него копируем, собственно, исходник.
Вообщем все... :)
Добавил: А что бы постоянно не вставлять измененный код, можно прописать имя исходника в файле xxx.rc
Уточним задачу: пользуясь исключительно средствами языка.
Т.е. никакого внешнего API, никакой работы с файлами и т.п.
Уточним задачу: пользуясь исключительно средствами языка.
Т.е. никакого внешнего API, никакой работы с файлами и т.п.
Ну, хоть бы намек, в какую сторону думать :)
Здесь посмотрел, но... как-то не очень... если программа действительно, еще и что-то полезное делает, то в одну строку - её проблематично написать...
Вот вам расширенное решение для тех, кто не верит,
что эта прога не может себя напечатать полностью и (или)
может делать что-то полезное,
не использует внешние ресурсы и т.д. и т.п.
Так вот эта прога может все!:)
P.S. не верите..., скомпилируйте.
#include <conio.h>
#include <iostream>
#define D(x) char*t=#x;x
D(
using namespace std;
int sum(int i)
{
int another_variable;
printf("Enter integer value... \n");
printf("another_variable = ");
cin >> another_variable;
printf("\tanother_variable = %d\n", another_variable);
return i + another_variable;;
}
int main(int c,char**v)
{
int some_variable = 100;
int selection;
printf("This prigram can write own source code.\n");
selection = 0;
while (1)
{
printf("\n\nChoose one of the following:\n");
printf("\ttype 1 - to print source code;\n");
printf("\ttype 2 - to show my features;\n");
printf("\ttype 3 - to exit;\n");
cin >> selection;
cout << "selection = " << selection << "\n" ;
switch(selection)
{
case 1: printf("My Source:\n\n\
#include <stdio.h>\n\
#include <conio.h>\n\
#include <iostream>\n\
#define D(x) char*t=#x;x\n\
D(%s)\n\nEnd of my Source!\n",t);
break;
case 2: some_variable = sum(99);
printf("some_variable = %d", some_variable);
break;
case 3: printf("\n\nExit.\n press any key....");
getch();
return 0;
default:;
}
}
}
)
:cool:
как оказалось, OlgaKr уже кидала ссылку на паскалевскую программу.
Фактически это тоже самое
using System.Text;
namespace SelfPrint
{
class Program
{
static string[] TEXT = {
"using System;",
"using System.Text;",
"",
"namespase SelfPrint",
"{",
" class Program",
" {",
" static string[] TEXT = {",
" };",
"",
" const string printerLine = @",
"",
" static void Main(string[] args)",
" {",
" string[] TEXT1 = (string[])TEXT.Clone();",
" TEXT[10] += \u0022\\u0022\u0022 + printerLine + \u0022\\u0022;\u0022;",
" for (int i = 0; i < TEXT.Length; i++) {",
" if (i == 8)",
" for (int j = 0; j < TEXT.Count; j++)",
" System.Console.WriteLine(\u0022 \\u0022{0}\\u0022{1}\u0022, TEXT1[j], j < TEXT1.Length - 1 ? \u0022,\u0022 : \u0022\u0022);",
" System.Console.WriteLine(TEXT);",
" }",
" System.Console.ReadLine();",
" }",
" }",
"}"
};
const string printerLine = @"System.Console.WriteLine(\u0022 \\u0022{0}\\u0022{1}\u0022, TEXT1[j], j < TEXT1.Length - 1 ? \u0022,\u0022 : \u0022\u0022);";
static void PrintLine(params object[] prms)
{
System.Console.WriteLine("\u0022{0}\u0022", prms);
}
static void Main(string[] args)
{
string[] TEXT1 = (string[])TEXT.Clone();
TEXT[10] += "\u0022" + printerLine + "\u0022;";
for (int i = 0; i < TEXT.Length; i++) {
if(i==8)
for (int j = 0; j < TEXT1.Length; j++)
System.Console.WriteLine(" \u0022{0}\u0022{1}", TEXT1[j], j < TEXT1.Length - 1 ? "," : "");
System.Console.WriteLine(TEXT);
}
System.Console.ReadLine();
}
}
}
char*f=”char*f=%c%s%c;main() {printf(f,34,f,34,10);}%c”; main(){printf(f,34,f,34,10);}
char*f=”char*f=%c%s%c;main() {printf(f,34,f,34,10);}%c”; main(){printf(f,34,f,34,10);}
Но ведь вывод в данном случае не идентичен исходнику. Нет кавычек, нет #include.
это уж совсем нереал какой то...
char*i="[URL="file://\\#include<stdio.h>",n='\n',q='"',*p="%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m"]\\#include<stdio.h>",n='\n',q='"',*p="%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c",*m[/URL]=
"int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}";
int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}
вот так: печатает с инклюдами и всем остальным :)
Эта задача не имеет конца)))
Стоит нам подготовить строку для вывода инструкций языка:
A = "B",
так сразу появится необходимость вывести строку:
С = "A = "B"",
но в этом случае потребуется еще и выводить:
В = "C = "A = "B""",
что в последствии вынудит вывести:
D = "B = "C = "A = "B"""",
и так задача не имеет решения.
:)))))))))))
и так задача не имеет решения.
:)))))))))))
Это или провокация или слова неадекватного чела - весь мир решает эту задачу - и ничего - решается. Постом выше даже решение лежит - или на сях мы читать не умеем?
squirL, извини, за этими портянками кода тебя и не приметил :D
Выше я пояснил почему.
Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?
Так вот, ее можно под этот случай интерпретировать:
Ни одна система не может быть описаная средствами ее же самой (в оригинале - доказа)
Весь мир потому, якобы и решает ее, что не решается она.
Ни одна система не может быть описаная средствами ее же самой,
т.к. само ее описание должно быть тоже выведено программой, ибо является тоже кодом программы, что не возможно.
Выше я пояснил почему.
Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?
Так вот, ее можно под этот случай интерпретировать:
Ни одна система не может быть описаная средствами ее же самой (в оригинале - доказа)
Весь мир потому, якобы и решает ее, что не решается она.
но факт остается фактом :) программа, которую я привел (последний вариант) выводит себя полностью ;)
>>Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?
нет, не учили... Зато хорошо знаем работу функции printf()
И если разобраться в том. что делает printf(pattern, pattern); то глядишь и теорема Гёделя не нужна будет...
Ну давай посмотрим. (http://ru.wikipedia.org/wiki/Теорема_Гёделя_о_неполноте) Как ты тут ухитрился применить вторую теорему о неполноте?
[quote=Курт Гёдель]
Во всякой достаточно богатой непротиворечивой теории первого порядка (в частности, во всякой непротиворечивой теории, включающей формальную арифметику), формула, утверждающая непротиворечивость этой теории, не является выводимой в ней.
[/quote]
Несколько замечаний. Во-первых - где ты тут определил, что данная теория достаточно богата, и что она первого порядка?;)
Во-вторых - мы не ставим задачу написав требуемую программу, утвердить непротиворечивость теории (теории чего, кстати?).
И эта теория не может быть интерпретирована применимо к нашей задаче.
Я просто поленился прочитать предыдущие 3 страницы.
я вижу много решений, но нет из них тех, что могли бы делать что нибудь полезное кроме вывода себя на экран.
Стоп. См. выше. Там приведены решения - это классика. Ты сам привел его)
я вижу много решений, но нет из них тех, что могли бы делать что нибудь полезное кроме вывода себя на экран.
Ты читал условие, которое сам же и размещал тут?
Программа делает то, что ей надо делать по условию.
В условии сказано про что-нибудь кроме вывода себя на экран?