[Knobelaufgabe] Programm, dass seinen Quellcode ausgibt

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

my pb stuff..
Bild..jedenfalls war das mal so.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag 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 ...
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag 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:
Bild + Bild

Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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:
a²+b²=mc²
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag 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:
Bild + Bild

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Mal so am Rande...
ist das einbiden einer Headerdatei nicht genaugenommen auch ein Dateizugriff?!
Antworten