Zum Navigations-Menü
Kein Layout? Lesen Sie hier, warum...

Turbo Pascal

Forum



Alle Dateien dieses Themas

Dateiname Dateigröße geschrieben von Datum
Speak.pas10.5KBFlachsmeer20.01.09 18:58Nachricht lesen
Speak1_Test.txt1.1KBFlachsmeer20.01.09 18:58Nachricht lesen
Muell.pas565 bytesHorst21.01.09 14:20Nachricht lesen
Konsole.txt1.6KBSamolex22.01.09 16:16Nachricht lesen
Build.pas9.7KBFlachsmeer24.01.09 23:51Nachricht lesen
Test.pas1KBHorst20.06.10 16:10Nachricht 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

Antworten | Zitieren

2 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

3 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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:

Antworten | Zitieren

4 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/1 positiv

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:

Antworten | Zitieren

5 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

6 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

7 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

8 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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:

Antworten | Zitieren

9 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

10 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

11 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

12 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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:

Antworten | Zitieren

13 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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... ;-)

Antworten | Zitieren

14 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

15 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/1 positiv

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) .

Antworten | Zitieren

16 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

17 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

18 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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:

Antworten | Zitieren

19 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

20 Re: Prozedur mit Prozedur ausführen

Bewertungen: 0 negativ/0 positiv

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

Antworten | Zitieren

Hinweise

  1. Das hier ist kein Hausaufgabenservice. Konkrete Fragen werden natürlich gerne beantwortet.
  2. Probieren Sie doch zuerst die Suchfunktion aus und werfen Sie einen Blick in die FAQ.
  3. Ein aussagekräftiger Betreff ist wichtig, unter »HILFE!!!« kann man sich nichts vorstellen. Bitte nicht nur Großbuchstaben.
  4. Anhänge zu Ihrem Projekt (max. 250 KB) können helfen, das Problem schnell zu lösen.
  5. HTML-Tags sind aus Sicherheitsgründen nicht möglich.
  6. Quelltext können Sie mit [code]Quelltext[/code] formatieren.
  7. Alle weiteren möglichen Forum-Tags können Sie hier nachlesen.
Neuen Beitrag erstellen










Datei anhängen
  • Folgende Dateitypen können angehängt werden:
    asm, bgi, bmp, c, cc, cpp, gif, inc, jpg, obj, pas, pdf, png, rar, rtf, tpu, txt, zip, frm, vbp
  • Die Dateien dürfen jeweils nicht größer sein als 250KB.
  • 3 zusätzliche Dateien können an den Beitrag angehängt werden.



Nach oben
© 2000-2010 Clemens Weiß | Webplain.de
Link zu dieser Seite | Letzte Änderung: 26. Okt. 2008