Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод на экран программой собственного исходника

18K
10 января 2007 года
Mind Maker
25 / / 11.12.2006
Всем, наверное, известна такая вот задачка:

Написать программу, которая может распечатать (в консоли вывести на экран) собственный исходный код.
Так вот, знает ли кто, возможно ли это сделать, если да то как?

P.S. Варианты типа: "Прочитать исходный код из файла и вывести на экран" не решают поставленную задачу.
Т.е., по идее, исходник после компиляции должен содержаться в бинарике.
63
10 января 2007 года
Zorkus
2.6K / / 04.11.2006
Я не спец в этом, но мне кажется, вопрос скорее по низкоуровневому программированию. И потом - разные исходники могут генерить одинаковые бинарники, зависит от компилятора и его настроек оптимизации.
18K
10 января 2007 года
Mind Maker
25 / / 11.12.2006
Нет не бинарник вывести на экран а именно исходный текст программы.
11K
10 января 2007 года
.nornad
125 / / 04.01.2007
Всё можно сделать несколько проще - добавляем исходники в ресурсы и наслаждаемся. Правда, после правки исходников скорее всего каждый раз придётся обновлять ресурсник, но задача, в принципе, будет решена.

Если не секрет - а зачем такая штука нужна?
18K
10 января 2007 года
Mind Maker
25 / / 11.12.2006
В качестве головоломки.
63
10 января 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Mind Maker
Нет не бинарник вывести на экран а именно исходный текст программы.


Да я понял, что исходник надо вывести. Я имел в виду, что дизассемблированием однозначный сорс не получить.

18K
10 января 2007 года
Mind Maker
25 / / 11.12.2006



Спасибо за ссылку. :)

Вот, что у меня получается:

Код:
#include <stdio.h>
#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();\
}\
)
2
10 января 2007 года
squirL
5.6K / / 13.08.2003
 
Код:
#include <stdio.h>
main(char* a){printf(a,34,a="main(char* a){printf(a,34,a=%c%s%c,34);}",34);}

вот так устроит? :)
18K
10 января 2007 года
Mind Maker
25 / / 11.12.2006
Цитата: squirL
 
Код:
#include <stdio.h>
main(char* a){printf(a,34,a="main(char* a){printf(a,34,a=%c%s%c,34);}",34);}

вот так устроит? :)



Дело в том, что твой вариант дублирует в printf(..); весь исходный код программы и просто перепечатывает его 2 раза.
Фактически приходится писать 2-е копии программы.

Вариант

Код:
#include <stdio.h>
#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();
}
)


мне кажется более удачным и решает поставленную задачу полностью.
Я думаю вряд ли найдется более удачное решение.........;)
11K
10 января 2007 года
.nornad
125 / / 04.01.2007
Цитата: Mind Maker
Дело в том, что твой вариант дублирует в printf(..); весь исходный код программы и просто перепечатывает его 2 раза.
Фактически приходится писать 2-е копии программы.


А разве приведённый тобою вариант не емеет той же проблемы? Хотя да, не имеет - он печатает не ВЕСЬ свой исходник. ;)

9
10 января 2007 года
Lerkin
3.0K / / 25.03.2003
Я написал пример, а только потом увидел, что это уже было предложено. :) .nornad - респект!

Ну, да ладно. Позвольте, так сказать, внести лепту :)
Код, само собой, для Windows.
Код:
#include <windows.h>
#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
3
10 января 2007 года
Green
4.8K / / 20.01.2000
Не... так не интересно.
Уточним задачу: пользуясь исключительно средствами языка.
Т.е. никакого внешнего API, никакой работы с файлами и т.п.
9
11 января 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: Green
Не... так не интересно.
Уточним задачу: пользуясь исключительно средствами языка.
Т.е. никакого внешнего API, никакой работы с файлами и т.п.



Ну, хоть бы намек, в какую сторону думать :)
Здесь посмотрел, но... как-то не очень... если программа действительно, еще и что-то полезное делает, то в одну строку - её проблематично написать...

18K
11 января 2007 года
Mind Maker
25 / / 11.12.2006
Народ!
Вот вам расширенное решение для тех, кто не верит,
что эта прога не может себя напечатать полностью и (или)
может делать что-то полезное,
не использует внешние ресурсы и т.д. и т.п.

Так вот эта прога может все!:)

P.S. не верите..., скомпилируйте.

Код:
#include <stdio.h>
#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:
5
11 января 2007 года
hardcase
4.5K / / 09.08.2005
Не читал тему пока не написал код на C#,
как оказалось, OlgaKr уже кидала ссылку на паскалевскую программу.
Фактически это тоже самое
Код:
using System;
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();
        }
    }
}
338
22 января 2007 года
chigevara
529 / / 29.09.2003
читал, плакал, продолжаю рыдать. Наро, это ж классика...

char*f=”char*f=%c%s%c;main() {printf(f,34,f,34,10);}%c”; main(){printf(f,34,f,34,10);}
2
22 января 2007 года
squirL
5.6K / / 13.08.2003
боян :)
3
22 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: chigevara
читал, плакал, продолжаю рыдать. Наро, это ж классика...

char*f=”char*f=%c%s%c;main() {printf(f,34,f,34,10);}%c”; main(){printf(f,34,f,34,10);}



Но ведь вывод в данном случае не идентичен исходнику. Нет кавычек, нет #include.

2
22 января 2007 года
squirL
5.6K / / 13.08.2003
не...
Цитата:
пользуясь исключительно средствами языка.

это уж совсем нереал какой то...

 
Код:
#include<stdio.h>
char*i="[URL="file://\\#include<stdio.h>&quot;,n='\n',q='&quot;',*p=&quot;%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c&quot;,*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);}

вот так: печатает с инклюдами и всем остальным :)
563
23 января 2007 года
MrLinker
249 / / 17.09.2006
А я лично не верю в возможность такого средствами самого языка.
Эта задача не имеет конца)))

Стоит нам подготовить строку для вывода инструкций языка:
A = "B",
так сразу появится необходимость вывести строку:
С = "A = "B"",
но в этом случае потребуется еще и выводить:
В = "C = "A = "B""",
что в последствии вынудит вывести:
D = "B = "C = "A = "B"""",
и так задача не имеет решения.

:)))))))))))
338
23 января 2007 года
chigevara
529 / / 29.09.2003
Цитата: MrLinker
А я лично не верю в возможность такого средствами самого языка.

и так задача не имеет решения.

:)))))))))))


Это или провокация или слова неадекватного чела - весь мир решает эту задачу - и ничего - решается. Постом выше даже решение лежит - или на сях мы читать не умеем?

squirL, извини, за этими портянками кода тебя и не приметил :D

563
24 января 2007 года
MrLinker
249 / / 17.09.2006
Все решения выше не являются решениями.
Выше я пояснил почему.
Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?
Так вот, ее можно под этот случай интерпретировать:
Ни одна система не может быть описаная средствами ее же самой (в оригинале - доказа)
Весь мир потому, якобы и решает ее, что не решается она.
563
24 января 2007 года
MrLinker
249 / / 17.09.2006
В дополнение:
Ни одна система не может быть описаная средствами ее же самой,
т.к. само ее описание должно быть тоже выведено программой, ибо является тоже кодом программы, что не возможно.
2
24 января 2007 года
squirL
5.6K / / 13.08.2003
Цитата: MrLinker
Все решения выше не являются решениями.
Выше я пояснил почему.
Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?
Так вот, ее можно под этот случай интерпретировать:
Ни одна система не может быть описаная средствами ее же самой (в оригинале - доказа)
Весь мир потому, якобы и решает ее, что не решается она.


но факт остается фактом :) программа, которую я привел (последний вариант) выводит себя полностью ;)

338
26 января 2007 года
chigevara
529 / / 29.09.2003
Цитата: squirL
но факт остается фактом :) программа, которую я привел (последний вариант) выводит себя полностью ;)



>>Теорему о неполноте формальный систем (2 теорема Гёделя) не учили?

нет, не учили... Зато хорошо знаем работу функции printf()
И если разобраться в том. что делает printf(pattern, pattern); то глядишь и теорема Гёделя не нужна будет...

63
26 января 2007 года
Zorkus
2.6K / / 04.11.2006
2 MrLinker
Ну давай посмотрим. (http://ru.wikipedia.org/wiki/Теорема_Гёделя_о_неполноте) Как ты тут ухитрился применить вторую теорему о неполноте?
[quote=Курт Гёдель]
Во всякой достаточно богатой непротиворечивой теории первого порядка (в частности, во всякой непротиворечивой теории, включающей формальную арифметику), формула, утверждающая непротиворечивость этой теории, не является выводимой в ней.
[/quote]
Несколько замечаний. Во-первых - где ты тут определил, что данная теория достаточно богата, и что она первого порядка?;)
Во-вторых - мы не ставим задачу написав требуемую программу, утвердить непротиворечивость теории (теории чего, кстати?).
563
27 января 2007 года
MrLinker
249 / / 17.09.2006
Спорить не буду, недооценил работу функции printf.
И эта теория не может быть интерпретирована применимо к нашей задаче.
Я просто поленился прочитать предыдущие 3 страницы.
18K
29 января 2007 года
Mind Maker
25 / / 11.12.2006
Народ,
я вижу много решений, но нет из них тех, что могли бы делать что нибудь полезное кроме вывода себя на экран.
1.9K
29 января 2007 года
[*]Frosty
278 / / 17.06.2006
2 Mind Maker
Стоп. См. выше. Там приведены решения - это классика. Ты сам привел его)
3
29 января 2007 года
Green
4.8K / / 20.01.2000
Цитата: Mind Maker
Народ,
я вижу много решений, но нет из них тех, что могли бы делать что нибудь полезное кроме вывода себя на экран.


Ты читал условие, которое сам же и размещал тут?
Программа делает то, что ей надо делать по условию.
В условии сказано про что-нибудь кроме вывода себя на экран?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог