Alle Dateien dieses Themas
| Dateiname | Dateigröße | geschrieben von | Datum | |
|---|---|---|---|---|
| Speak.pas | 10.5KB | Flachsmeer | 20.01.09 18:58 | Nachricht lesen |
| Speak1_Test.txt | 1.1KB | Flachsmeer | 20.01.09 18:58 | Nachricht lesen |
| Muell.pas | 565 bytes | Horst | 21.01.09 14:20 | Nachricht lesen |
| Konsole.txt | 1.6KB | Samolex | 22.01.09 16:16 | Nachricht lesen |
| Build.pas | 9.7KB | Flachsmeer | 24.01.09 23:51 | Nachricht lesen |
| Test.pas | 1KB | Horst | 20.06.10 16:10 | Nachricht lesen |
1 Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 18. Jan. 2009 21:59
Hi
Ich hab mal eine Frage:
Ist es möglich eine Prozedur zu schriben, die eine andere Prozedur ausführt?
Die Prozedur, die ich schreiben will, kommt in eine Unit und die Prozedur, die ich ausführen will steht in dem Programm. Ich stelle mir die Prozedur in der Unit ca. so vor:
Procedure Starteprozedur (beliebige_prozedur: Procedure); // ???
Begin
beliebige_Prozedur;
End;
Im Programm sieht das dann ungefähr so aus:
Starteprozedur (meine_Prozedur);
und dann wird die Prozedur "meine_Prozedur" ausgeführt...
Wäre über jeden Hinweis/Hilfe dankbar.
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
2 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 19. Jan. 2009 07:31
Hallo,
man kann functionen und procedure als Type definieren:
[www.webplain.de]
type
comp_func = function(CONST A,B:datarec):integer;
sort_proc = procedure(f:comp_func);
Dort siehst Du, das innerhalb der sort_proc eine Vergleichsfunktion übergeben wird.
Wenn Du den Thread durchackerst, siehst Du wie man dann nach beliebigen Mitgliedern einer Verbundvariable ( eines records) Feldern sortieren kann.
Gruß Horst
Gruß Horst
3 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 20. Jan. 2009 18:58
Hi
Ich hab den Thread ein paar mal durchgearbeitet, aber ich glaube, dass das nicht so ganz das ist, was ich beabsichtige. Ich plane ja, einfach nur eine Prozedur, die eine andere Startet, also ca. so etwas:
uses crt;
Type
Start_Proc = Procedure;
Procedure Rechne (x,y:integer);
var z:integer;
begin
z:=x+y;
write (z);
readkey;
end;
Begin
Start_Proc (Rechne);
end.
das klappt so nicht..
Ich plane im Moment nämlich ein Programmteil, das Text einliest, bestimmte Kommandos erkennt und daraufhin in einen brauchbaren Text umwandelt (s. Anhang)
Dort gibt es einen Befehl $Link$Procedure~text; welcher eine Prozedur im Hauptprogramm ausführen soll, welche dann mit Mausklick ausgeführt werden soll (kommt alles noch)
Ich hoffe, das das einigermaßen verständlich ist, was ich vorhabe.
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
Anhänge:
4 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 21. Jan. 2009 14:24
Hallo,
so wie angehängt funktioniert es bei mir mit freepascal.
Gruß Horst
P.S.
//Falls keine Ziffern in control, dann ist test=> True
For z:= 1 to a do
if (Control[z]<>'1') and (Control[z]<>'2') and
(Control[z]<>'3') and (Control[z]<>'4') and
(Control[z]<>'5') and (Control[z]<>'6') and
(Control[z]<>'7') and (Control[z]<>'8') and
(Control[z]<>'9') and (Control[z]<>'0')
then test:=true;
lieber leserlicher
For z:= 1 to a do
if NOT ( control[z] in ['0'..'9'] )then
test:= true;
oder manchmal schneller, weil vorzeitig abgebrochen
For z:= 1 to a do
begin
test := control[z] in ['0'..'9'];
if test then
break;
end;
2 mal bearbeitet. Zuletzt am 21.01.09 14:31 von Horst.
Anhänge:
5 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 21. Jan. 2009 17:58
Hi
Ja, das Angehängte funzt bei mir auch, ich wollt nur zeigen woran ich arbeite...
Dein Anhang hat mir sehr geholfen.
Muss man in der Prozedur Rechne(...); immer eine Prozedur angeben oder kann man das ach mit einer Variable übergeben, sodass der Benutzer zB die Prozedur, die er starten will als String (bei dir zB 'Addiere') eingibt und dann wird die Prozedur gestartet?
Was sagst du zu dem ganzen Projekt (mit dem Wenn, Zufall etc., ist ja alles im Textdokument)?
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
6 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 21. Jan. 2009 22:55
Hallo,
da musst Du schon einen mathematischen Parser nutzen um einen String übergeben zu können.
Du kannst ja mal [delphi.zsg-rottenburg.de] lesen und verstehen.
Wenn Du es richtig eilig hast ( schneller als kompiliert ) [www.delphipraxis.net]
Gruß Horst
7 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 22. Jan. 2009 15:47
Hi
Ich hab jetzt auch mal nach Parsern Gegoogelt und hab soviel verstanden, dass durch den Parser ein String in seine einzelnen Stücke zerlegt wird und dann so verändert wird, dass er so vorliegt, als wenn es eine Anweisung in Quellcode wäre...
Problem ist nur, dass ich nur etwas gefunden habe, wo ein Term (also zB 1*(2-34)^5) auseinandergenommen wird. Ich brauche für mein Programm aber ja einen Parser, der zB den String 'Addiere' in die Anweisung Addiere überträgt. Über einen solchen Parser hab ich leider nihcts gefunden...
Und ehrlich gesagt hab ich auch nicht so wirklich verstanden, wie ein Parser den String umwandelt. Einlesen und zerteilen kann ich einen String auch, aber dann auch noch umwandeln...keine Idee, wie das geht
Wenn ich das also richtig verstanden hab, ist mein Programm, welches ich oben angehängt habe, auch sozsagen die erste Stufe eines Parsers...
Ich hoffe ihr könnt mir noch einmal helfen.
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
8 Re: Prozedur mit Prozedur ausführen
Autor: Samolex
(R)
(IP bekannt)
Datum: 22. Jan. 2009 16:26
Hi,
Ich hänge dir mal ein Teil meiner Cheatconsole von meinem Spiel "Allianz" an.
Hier wird ein String in 3 Teile zerlegt und ausgewertet.
Die Eingabe Lautet zum Beispiel : "Schilde = 100"
Im ersten Schritt zerlegt er den String in drei teile (ich habe vereinbart, das ein Befehl aus Maximal 3 teile Besteht, wobei der 3. Teil ein Zahlenwert sein muss)
Raus kommt also
Teil0 = 'Schilde'
Teil1 = '='
Teil2 = '100'
Im Zweiten Schritt wird das ganze nun ausgewertet.
Der Teil2 wird in ein Interger umgewandelt. Das Ergebnis ist also 100
Nun wird geprüft ob der Teil1 ein '=' ist wenn ja wird geschaut was in Teil0 steht und dann dem entsprechend gehandelt.
Die Procedure habe ich für dich noch ein Wenig vereinfacht.
Ich hoffe ich habe mich verständlich ausgedrückt.
MfG
Samolex
--
Computer helfen uns Probleme zu lösen,
die wir vorher nicht hatten.
Retrokuhn
Hey du, isch mach dich Zweierkomplement...
Anhänge:
9 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 22. Jan. 2009 21:58
Hi
Ok, das ist das mit einen String in eine Integer-Zahl umwandeln.
Aber ich hab noch eine Frage offen:
uses crt;
Type
trech_proc = procedure(const x,y:integer);
Var Proc_start : Array [1..3] of tRech_Proc;
procedure Addiere(const x,y:integer);
begin
writeln (x+y);
Writeln('Taste druecken');readkey;
end;
procedure Rechne(f:tRech_Proc;x,y:integer);
Begin
f(x,y);
end;
begin
Proc_start[1]:=@Addiere; // <- hierzu ist die Frage
Rechne(Proc_start[1],1,4);
end.
Kann man in diesem Beispiel Addiere als String einlesen und dann in einen Variablentyp übergeben, den man dann mit einem @ an die Variable Proc_start übergibt?
Danke schon mal für die Hilfe
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
10 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 23. Jan. 2009 07:43
Hallo,
das hat Samolex schon gesagt.
IF UpCase(Analyse[0]) = 'Addiere' then
Rechne(@Addiere,Wert1,Wert2);
IF UpCase(Analyse[0]) = '*' then
Rechne(@Multipliziere,Wert1,Wert2);
....
Der Parser von Rottenburg kann aber mit Vorrang (a là /,*,+,- ) und Klammern rechnen.
Gruß Horst
11 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 23. Jan. 2009 14:29
Hi
ach ja...^^
da hätt ich auch selber drauf kommen können...mit If-Anweisungen
Danke nochmal...
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
12 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 24. Jan. 2009 23:51
Hi nochmal
Ich plan das ganze Projekt da oben ja "nur" als Teil für mein Spiel TownbuilderII.
Das Spiel Programmiere ich in der Vgfx Grafikunit. Ich wollte in dem Spiel, in dem man eine Stadt bauen muss Berater einbauen, die einem helfen, die Stadt zu errichten. Dafür brauch ich natürlich viel Text, da die Berater ja auch nicht immer das gleiche sagen sollen...dahen kann ich nicht alles im Programm speichern und brauche daher die Prozeduren, die weiter oben angehängt sind.
Nun wollte ich die Textausgabe von dem Dos-Fenster auf die Vgfx-Routinen übertragen (also anstatt "write" "outtextxy"...) doch ich krieg immer nach dem Start des Programmes, welches sich ohne Probleme Compilieren lässt, eine Fehlermeldung angezeigt, mit der ich nicht wirklich etwas anfangen kann...
Ich hab mal den relevanten Teil des Quellcodes angehängt und hoffe, dass ihr mir noch einmal helfen könnt...
Ich denke, dass der Fehler in dem Teil liegt, wo der Text aus der Datei eingelesen wird, da ich, wenn ich vor der Codestelle einen anderen Text (also zB einfach die Zahl "3"), den Text angezeigt bekomme, danach gibts dann ne Fehlermeldung und das Programm verabschiedet sich.
Danke schon mal
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
Anhänge:
13 Re: Prozedur mit Prozedur ausführen
Autor: Samolex
(R)
(IP bekannt)
Datum: 25. Jan. 2009 12:51
Hi,
Ich denke mal dass der Fehler beim Reset(Datei) liegt. Warscheinlich findet er die Datei nicht und gibt dewegen einen Fehler zurück. Diesen Fehler kannst du aber ganz einfach abfangen, indem du die Compilerschalter {$I-} und {$I+} verwendest.
{$I-}
Reset (Datei);
{$i+}
// Fehlermedung Ausgeben
IF IOResult <> 0 Then Begin
Outtextxy (StdFont,10,10,'Fehler beim lesen der Datei...');
ReadKey;
end;
y:=0;
Repeat
Readln (Datei,Lesen); // Irgendwo hier muss der Fehler liegen
Until (Lesen=Part)or EOF;
Readln (Datei,Lesen);
MfG
Samolex
PS: Wre schön, wenn du uns den genauen Wortlaut der Fehlermeldung mitteilen würdes, den dann brauchen wir nicht so viel raten ^^
--
Computer helfen uns Probleme zu lösen,
die wir vorher nicht hatten.
Retrokuhn
Hey du, isch mach dich Zweierkomplement...
14 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 25. Jan. 2009 14:28
Hi
Ich hab den Compilerschalter nun eingebaut, aber der Fehler tritt immer noch auf.
Die Fehlermeldung ist folgende:
An unhandled exception occurred at 0x0040B3EB :
File not open
0x0040B3EB
0x0040C6E9
0x00410819
Als Button gibt es nur "OK". Wenn ich auf OK klicke kommt noch eine Fehlermeldung:
Runtime error 216 at 00002B94
Als Button gibt es wieder einmal nur "OK". Wenn man draufklickt verabschiedet sich das Programm.
Zitat:
IF IOResult <> 0 Then Begin
Outtextxy (StdFont,10,10,'Fehler beim lesen der Datei...');
ReadKey;
end;
Das geht so nicht, da in der Vgfx-Unit erst das Fenster, dann die x und y Position, dann mit drei Zahlen die Farbe (RGB) und dann der String benötigt werden...
MfG
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
15 Re: Prozedur mit Prozedur ausführen
Autor: Heinz
(R)
(IP bekannt)
Datum: 25. Jan. 2009 15:12
Hallo,
assign (Datei,Link);
Reset (Datei);
y:=0;
Repeat
Readln (Datei,Lesen); // Irgendwo hier muss der Fehler liegen
Until (Lesen=Part)or EOF; // eventuell hier?
Readln (Datei,Lesen);
schreib Statt EOF einfach mal EOF(Datei) .
16 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 25. Jan. 2009 16:08
HI
Jaaaa, danke, das war der Fehler.
jetzt läuft's, ich dachte schon ich hätte den ganzen Teil mit dem Einlesen von dem Text und den ganzen Befehlen umsonst programmiert.
Vielen Dank!
Bis bald
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
17 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 20. Jun. 2010 15:25
Hi
Ich hab diesen alten Thread grad mal wieder ausgebuddelt, da es wieder an einer ähnlichen Stelle nicht ganz so läuft, wie ich das möchte. Ich habe ein Record:
Proc = Procedure;
RWndData = Record
SizX,SizY : Word; // Größe des aktuellen Fensters
PosX,PosY : Integer; // Position des Fensters auf Bildschirm
MaxX,MaxY : Word; // Maximalgröße des Fensters
MinX,MinY : Word; // Minimalgröße des Fensters
PrcDraw : Proc;
End;
Und ein Objekt gebastelt:
Type
GraphWND = Object
Data : rWndData;
Constructor Create (WndWidth,WndHeight : Word);
Procedure DrawResult;
Destructor Done;
End;
Constructor GraphWND.Create (WndWidth,WndHeight : Word);
Begin
With Data do
Begin
Posx:=10;
Posy:=10;
SizX:=200;
SizY:=200;
Maxx:=WndWidth;
Maxy:=WndHeight;
Minx:=100;
Miny:=100;
PrcDraw:=@DrawResult; // <-- hier ist die fehlermeldung
End;
End;
Procedure GraphWND.DrawResult;
Begin
End;
Destructor GraphWnd.Done;
Begin
End;
doch compilieren kann ich das ganze nicht. Ich bekomme eine Fehlermeldung, mit der ich nichts anfangen kann:
Error: Method (variable) and Procedure (variable) are not compatible
Ich weiß nicht, was da nicht kompatibel sein soll, ist als Type (also 'Proc') eine normale Prozedur ohne Parameter und GraphWND.DrawResult auch.
Weiß von euch jemand, warum das nicht geht?
Lg
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
18 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 20. Jun. 2010 16:12
Hallo,
Meine Fehlermeldung mit fpc 2.4.1
program Test;
{$MODE objFPC}
type
Proc = Procedure;
.......
Test.pas(37,14) Error: Incompatible types: got "<procedure variable type of procedure of object;Register>" expected "<procedure variable type of procedure;Register>"
Also erwartet wird bei create also ein "procedure variable type of procedure of object"
Keine Fehlermeldung mit
Proc = Procedure of object;
Aber ob dies jetzt funktioniert?????
Gruß Horst
Anhänge:
19 Re: Prozedur mit Prozedur ausführen
Autor: Flachsmeer
(R)
(IP bekannt)
Datum: 20. Jun. 2010 17:03
Moin
Danke für die schnelle Antwort.
Damit klappt es tatsächlich. Darauf, dass man dort dann Procedure of Object nehmen muss, wär ich alleine nie gekommen, weil ich so etwas noch nie gesehen habe, naja, schon wieder was gelernt...
Lg
Enno
--
----------------------------------------------WOL-Soft---------------------------------------------------
aktuelle Arbeit:
Computer-Algebra-System,KonsolenAdventure
20 Re: Prozedur mit Prozedur ausführen
Autor: Horst
(R)
(IP bekannt)
Datum: 20. Jun. 2010 17:08
Hallo,
es leuchtet vielleicht ein, weil ein Objekt oder Klasse eine Selbstreferenz mitschicken muss.
Ich habe es nie benutzt.
Ich bin einfach zu prozedural und nicht objektiv
Gruß Horst
Hinweise
- Das hier ist kein Hausaufgabenservice. Konkrete Fragen werden natürlich gerne beantwortet.
- Probieren Sie doch zuerst die Suchfunktion aus und werfen Sie einen Blick in die FAQ.
- Ein aussagekräftiger Betreff ist wichtig, unter »HILFE!!!« kann man sich nichts vorstellen. Bitte nicht nur Großbuchstaben.
- Anhänge zu Ihrem Projekt (max. 250 KB) können helfen, das Problem schnell zu lösen.
- HTML-Tags sind aus Sicherheitsgründen nicht möglich.
- Quelltext können Sie mit
[code]Quelltext[/code]formatieren. - Alle weiteren möglichen Forum-Tags können Sie hier nachlesen.
Nach oben
© 2000-2010 Clemens Weiß | Webplain.de
Link zu dieser Seite | Letzte Änderung: 26. Okt. 2008
