Aktuelle Zeit: 21.08.2019 06:59

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 15:20 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Man kann auch den Fehler/Status als Rückgabewert, und Funktionsergebnisse über Ausgabeparameter zurückgeben.
Code:
Procedure.i f(x.i, *out.Integer)
  If x <= 100
    *out\i = 2 * x
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

Define xx.i

If f(3, @ xx)
  Debug "xx: " + xx
Else
  Debug "error"
EndIf

If f(300, @ xx)
  Debug "xx: " + xx
Else
  Debug "error"
EndIf


Oder auch andersherum, oder beides über Ausgabeparameter. Oder auch beides in einer Struktur (\result, \error) als Rückgabewert. Ändert aber nichts am grundlegend C-like error handling. Ich würde aber lokales handling gegenüber irgendwelchen globalen flags vorziehen.
Gab es nicht auch mal eine try/catch lib für PB? Kommt aber wahrscheinlich am Ende aufs Selbe raus.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 15:23 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Deutschland::Berlin()
#NULL hat geschrieben:
Gab es nicht auch mal eine try/catch lib für PB?

Meinst du diesen Code? viewtopic.php?f=8&t=20370

_________________
BildBildBildBild(Update: 17.08.2019 (+196 Dateien, +1392 MB)) BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 15:37 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Was ich in Erinnerung hatte war wahrscheinlich eher was hier in der purearea gelistet ist. Ich sehe aber im englischen Forum gab es da einige Versuche. Ich hab sowas selbst aber nie verwendet.

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 17:17 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
Danke mal für eure zahlreichen Antworten:

@juergenkulow
Interessanter Code. Hab mich schon mal ein bisschen damit rumgespielt, damit ich überhaupt kapiere um was es da geht. Ob ich es dann auch so mache, kann ich noch nicht sagen, auf jeden Fall will ich mal ein paar Tests machen.
Code:
MOV rsp,rsp_reg
MOV rax,rip_reg
JMP rax ; Springe zur Fehlerbehandlung
Was ich noch nicht verstehe, warum stellst du die Sprungadresse zuerst in ein Register? Würde der folgende Code nicht das gleiche machen?
Code:
MOV rsp,rsp_reg
JMP rip_reg


@GPI
Ja, das war mir schon klar geworden, dass ohne EndProcedure / ProcedureReturn ein paar Probleme auftauchen könnten. Ich muss mir mein eigenes Programm mal genauer ansehen, ich glaube, dass in den betroffenen Prozeduren keine Array, Lists und Maps erstellt werden. Da wird nur Daten aus der bereits geöffneten Datei gelesen und diese Daten dann in aufbereiteter Form in globale Listen und Maps gestellt. Lokale Variablen dürften nach meiner Meinung ja kein Speicherleck hinterlassen, wenn ich die Prozedur ohne EndProcedure bzw. ProcedureReturn verlasse (Wichtig: Falls ihr anderer Meinung seid, bitte posten). Zur Zeit habe ich das auch über ein Macro gelöst, um die Rücksprünge möglichst übersichtlich zu halten. Wie schon zu Jürgen gesagt, ich muss mir das ganze mit ASM erst mal ansehen.


@¯\_(ツ)_/¯
Bitte erschlag mich nicht, wenn es nicht stimmt. Habe auch keine Ahnung von ASM und hab mich auch erst ein wenig einlesen müssen:
Code:
MOV rsp,rsp_reg ; Setzt den Stackpointer auf die vorher gemerkte Adresse zurück
MOV rax,rip_reg ; Stellt die Sprungadresse ins Register rax
JMP rax         ; Springe zur Fehlerbehandlung


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 17:40 
Offline
Benutzeravatar

Registriert: 29.08.2004 08:37
Bei sowas wäre ich allerdings sehr vorsichtig, denn Speicherbereiche und Objekte werden ggf. nicht mehr automatisch durch PB aufgeräumt. Man stelle sich sowas vor:

Code:
Procedure C()
  Throw ; Springe zu A zurück
EndProcedure

Procedure B()
  ; Die Variablen liegen dann auf dem Stack, der aber einfach wieder zurückgesetzt wird, und Pointer auf Heapobjekte sind dann für immer verloren:
  Protected *Memory = AllocateMemory(1024)
  Protected String.s = "Ich weiß nicht" + #LF$ + "was mit solchen Strings passieren würde"
  Protected Font.i = LoadFont(#PB_Any, "Arial", 16)
 
  C()
EndProcedure

Procedure A()
  Try
  B()
  Catch
  ; Hier wurde nun einfach der Stack und Instruction Pointer zurückgesetzt.
  ; - *Memory wurde nicht freigegeben und der Pointer ist auch verloren.
  ; - Es ist mir unklar was mit dem String passiert (kenne die Internas aktuell nicht)
  ; - Der Font wäre auch verloren, genau wie andere PB Objekte.
  EndTry
EndProcedure

A()

_________________
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 18:45 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Ich finde #NULLs Methode mit den Rückgabewert als Status noch am besten.
Ist eigentlich oft auch bei API-Funktionen so oder bei Objektprogrammierung als Result #S_OK oder der Fehlercode.

Man muss sich nur daran gewöhnen das man bei PB nicht mehr Strings verwendet, sondern String-Pointer...
Code:

#P_Ok = 0

Enumeration Errors $80000000 Step 1
  #Err_OutOfMemory
  #Err_Pointer
  ; etc
EndEnumeration

Define LastError

Procedure Foo(Var.i, *Result.String)
  Shared LastError 
  If *Result = 0
    LastError = #Err_Pointer
    ProcedureReturn LastError
  EndIf
 
  *Result\s + Str(Var)
 
  ProcedureReturn #P_Ok
EndProcedure

Define t1.String\s ; = "Value = "

r1 = Foo(100, @t1)
If r1 = #P_Ok
  Debug t1\s
Else
  Debug "Errorcode: " + Hex(r1)
EndIf

r1 = Foo(100, @t1)
If foo(200, 0)
  Debug "LastError: " + Hex(LastError)
Else
  Debug t1\s
EndIf

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 21:02 
Offline

Registriert: 29.08.2004 13:18
Josh hat geschrieben:
@GPI
Ja, das war mir schon klar geworden, dass ohne EndProcedure / ProcedureReturn ein paar Probleme auftauchen könnten. Ich muss mir mein eigenes Programm mal genauer ansehen, ich glaube, dass in den betroffenen Prozeduren keine Array, Lists und Maps erstellt werden.


Ich kann mir vorstellen, das Strings auch Probleme machen. Wie gesagt, keiner hier weis, wie PB das alles intern behandelt. Und ich bin noch nie ein großer Fan davon gewesen, Assembler a) so tiefgreifend zu benutzen und b) wenn man Assembler nicht selber kann :)

_________________
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rücksprung über mehrere Prozeduraufrufe
BeitragVerfasst: 05.10.2018 21:50 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
Ja, ihr habt natürlich recht, Strings würden Probleme machen, da bin ich mir fast zu 100% sicher. Also ist das ganze mit dem Zurücksetzen des Stacks hinfällig.

Danke allen für die Antworten, war trotzdem interessant ein bisschen reinzugucken, was man mit ASM alles machen kann.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye