Seite 2 von 4

Verfasst: 28.01.2009 15:49
von Kaeru Gaman
dabei ist nicht so etwas billiges wie PHP gemeint, wo ein Befehl zur ausgabe des eigenen Quellcodes existiert.

die Knobelaufgabe ist schon etwas älter.
hatte vor längerem mal verschiedene Lösungen in verschiedenen Sprachen gesehen,
hab mir aber weder gemerkt wo noch wie die aussahen, so sehr hat's mich nicht interessiert.

das Kernproblem ist die logische Rekursivität:

Angenommen, ich schreibe ein Programm, dass seinen Quellcode in einer Datasection enthält.
dann brauche ich eine Schleife, um diese Datasection auszulesen,
also muss in der Datasection eine Schleife drinstehen und ein Abbild der Datasection.

das ist eine Katze die sich in den Schwanz beißt, ein Paradoxon...

Verfasst: 28.01.2009 15:58
von #NULL

Verfasst: 28.01.2009 16:18
von Dare Devil
@Kaeru Gaman
Absolut richtig erfasst.
Dabei ist halt wichtig, dass der gesamte Code wiedergegeben wird, den man auch in der IDE stehen hat.

@#NULL
Ich seh dort keine (sinnvollen) Loesungen :wink:


Die Loesung in C++ sieht uebrigens so aus:

Code: Alles auswählen

/* Das Programm listet sich selbst */
#include <string>
#include <iostream>
using namespace std;
char AS = 34;
char BS = 92;
char NZ = 10;
void c(const string& t) {
  cout << t << AS;
  unsigned int i = 0;
  while (i < t.length()) {
    if (t[i] == NZ) cout << BS << 'n' << AS << t[i] << AS;
    else cout << t[i];
    ++i;
  }
  cout << AS << ')' << ';' << 'c' << '(' << 's' << ')' << ';' << ')' << NZ;
}
int main() { string s("/* Das Programm listet sich selbst */\n"
"#include <string>\n"
"#include <iostream>\n"
"char AS = 34;\n"
"char BS = 92;\n"
"char NZ = 10;\n"
"void c(const string& t) {\n"
"  cout << t << AS;\n"
"  unsigned int i = 0;\n"
"  while (i < t.length()) {\n"
"    if (t[i] == NZ) cout << BS << 'n' << AS << t[i] << AS;\n"
"    else cout << t[i];\n"
"    ++i;\n"
"  }\n"
"  cout << AS << ')' << ';' << 'c' << '(' << 's' << ')' << ';' << ')' << NZ;\n"
"}\n"
"int main() { string s("); c(s);}
Finde ich wirklich genial. Nach kompilierung des Codes bekommt man ein exaktes Abbild des Codes wiedergegeben.
Und genau das versuch ich schon seit gestern in PB hinzukriegen ...

Verfasst: 28.01.2009 16:25
von Kaeru Gaman
Dare Devil hat geschrieben:@#NULL
Ich seh dort keine (sinnvollen) Loesungen :wink:
dann musst du hingucken:

Code: Alles auswählen

s$="s$= : Debug Mid(s$,1,3)+Chr(34)+s$+Chr(34)+Mid(s$,4,100)" : Debug Mid(s$,1,3)+Chr(34)+s$+Chr(34)+Mid(s$,4,100)
das erfüllt doch alle Bedingungen...

Verfasst: 28.01.2009 16:28
von STARGÅTE
@Dare Devil

das ist doch auch keine gute lösung, schließlich wird einfach der geschriebene Code noch mal als String hinten rangehangen, also das was NULL auch gepostet hat.


MeinerMeinung nach ist das das schnellste in PB:

Code: Alles auswählen

ReadFile(1,#PB_Compiler_File) : Debug ReadString(1) : CloseFile(1)

Verfasst: 28.01.2009 16:34
von Dare Devil
@Kaeru Gaman
ups, gar nich so gesehen. Wow, ziemlich einfach, wenn man das so unter der Lupe nimmt - darauf waer ich aber nich gekommen :D

@STARGATE
Hm, ja, moeglich (greift der Compiler hier nich auf die Source-Datei zu?). Aber wohl etwas unfaehr gegenueber anderen Sprachen :mrgreen:

Verfasst: 28.01.2009 16:36
von Kiffi
Dare Devil hat geschrieben:@STARGATE
Hm, ja, moeglich (greift der Compiler hier nich auf die Source-Datei zu?).
datt gildet nich:
Dare Devil hat geschrieben:Wie bereits erwaehnt: Dateizugriff nicht gestattet :wink:

Verfasst: 28.01.2009 16:39
von Dare Devil
Kiffi hat geschrieben:
Dare Devil hat geschrieben:@STARGATE
Hm, ja, moeglich (greift der Compiler hier nich auf die Source-Datei zu?).
datt gildet nich:
Dare Devil hat geschrieben:Wie bereits erwaehnt: Dateizugriff nicht gestattet :wink:
Ja richtig, hab grad nochma in der PB_Hilfe wegen der Konstante nachgeschaut.
War grad etwas verwirrt :mrgreen:

Verfasst: 28.01.2009 16:39
von STARGÅTE
Interessanters Phänomen :

Code: Alles auswählen

Macro Q : "
EndMacro

Macro CreateCode(Source)
 SourceCode$ = "Source"
 Source 
EndMacro
 
CreateCode( Debug SourceCode$ )
Sollte ich hier nicht als Ausgabe
Source
bekomme ?

Der Trick ist das einzelne " oben im Macro, das verleitet wahrscheinlich den Compiler das auch Variablen in Strings ersetzt werden, oder kanns jemand anders erklären wie das zu stande kommt ?

Verfasst: 28.01.2009 16:44
von D@nte
Mal so am Rande...
ist das einbiden einer Headerdatei nicht genaugenommen auch ein Dateizugriff?!