Deutsch
Forum

XPSE - nProc seltsame Rückgabe

 
- Seite 1 -



Georg
Teles
Guten Abend,

nun bastel ich an meinem Cryptsystem & unter Anderem wollte ich ein Quellcode zu etwas Ähnlichem hier posten und stelle fest, dass mit XPSE kompilierte Programme in nativen Prozeduren mit Schleifen einen Wert immer um 7 größer zurückgeben als er sein sollte...

hier 2 Beispiele als Quelltexte:

mit XProfan kompilierter Text, Prozedur gibt richtigen Wert zurück (55619):
KompilierenMarkierenSeparieren
Declare dat#,dat&,res&
Declare wert$
Dim dat#,8
CLS 0
Word dat#,0 = 9812,3484,60000,22315
res& = cryrst_(dat#,8)
wert$ = Str$(res&)
print wert$
Waitinput

Proc cryrst_

    Parameters ber#,ps&
    Declare s&,res&

    If ps& MOD 2 = 0

        s& = (ps&\2)-1

    Else

        s& = (ps&\2)

    EndIf

    WhileLoop 0,s&

        res& = res&+word(ber#,&loop*2)

        If res& > 20000

            res& = (res&-20000)

        Endif

    EndWhile

    res& = (res&+ps&)
    Return res&

EndProc


haargenau selber Code in XPSE, gibt den richtigen Wert der um 7 größer ist (also 55626):
KompilierenMarkierenSeparieren
 {$cleq}
Declare dat#,dat&,res&
Declare wert$
Dim dat#,8
CLS 0
Word dat#,0 = 9812,3484,60000,22315
res& = cryrst_(dat#,8)
wert$ = Str$(res&)
print wert$
Waitinput

nProc cryrst_

    Parameters ber#,ps&
    Declare s&,res&

    If ps& MOD 2 = 0

        s& = (ps&\2)-1

    Else

        s& = (ps&\2)

    EndIf

    WhileLoop 0,s&

        res& = res&+word(ber#,&loop*2)

        If res& > 20000

            res& = (res&-20000)

        Endif

    EndWhile

    res& = (res&+ps&)
    Return res&

EndProc


gibt es hierfür eine Erklärung ?
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

04.09.2014  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »

In nProcs mit declare deklarierte Variablen haben nicht gleich den Wert 0,
die Variable wird zwar deklariert aber es wird ihr kein Wert zugewiesen und der Wert
kommt dann aus dem Speicher und kann beliebig sein.

Anders ist es (natürlich) wenn man innerhalb nProcs mit var deklariert z.B.
KompilierenMarkierenSeparieren
var a&=20

oder kürzer:
KompilierenMarkierenSeparieren
long a=20
 
17.09.2014  
 



Bereichsvariablenparameter sind kein nativ unterstützer Typ,
übermittle mal die Adresse als Long. (also addr(ber#) statt (ber).

Nach logischen Fehlern habe ich beim Überfliegen nicht geschaut.
 
05.09.2014  
 




Georg
Teles
Ging schnell mit der Antwort

probiert, also
KompilierenMarkierenSeparieren
res& = cryrst_(   Addr(dat#)   ,8)
...
nProc
Parameters    ber&   ,...

das Ergebnis bleibt gleich
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

05.09.2014  
 




Georg
Teles
Problem gelöst:

ich merke, dass es bei XPSE es sehr wichtig ist, definierte Variablen, mit denen man arbeitet, auf 0 oder einen Wert zu setzen, den man braucht...
KompilierenMarkierenSeparieren
nProc
Parameters a#,b&
Declare c&,d&
c& = 0'auf 0 setzen
d& = 0'und hier auch
c& = c&+b&
...

nun liefert sowohl mit XProfan kompilierte & gelinkte Quelltext als auch mit XPSE den selben korrekten Wert
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

17.09.2014  
 




E.T.
Hm, das verwundert mich doch etwas:
Sollten den neu declarierte Variablen >Declare c&,d& < nicht eigentlich auf "0", d.h. leer sein ??

Ach, sehe gerade:
Im Eingans-Posting declarierst du res&  2x, einmal beim Programm-Start und dann nochmal in der Proc / nProc.

Bei "Problem gelöst" declarierst du dann im "nProc-Schnipsel" c&  und b& , also neue Variablen.
Ich denke mal, im "Doppel-Declare" liegt der Hase begraben (ungetestet).

Was mich wundert ist, das XProfan bei deinem ersten Beispiel im ersten Post nicht meckert, das die Variable bereits declariert ist .

In der Hilfe ist nur zu lesen


Alle Variablen, die in Prozeduren deklariert werden, sind nur dort lokal gültig. Der verwandte Speicherplatz wird bei Verlassen der Prozedur wieder freigegegen


Was passiert, wenn in der Proc Variablen declariert werden, welche schon im Hauptprogramm decl. wurden, das kann uns wohl Roland beantworten

Frag jetzt bitte nicht, warum genau "um 7 mehr"...
... vlt. hat IF ja für diesen Fall "Die glorreichen Sieben"  in XPSE eingebaut
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
17.09.2014  
 




Georg
Teles
E.T. (17.09.14)
Ach, sehe gerade:
Im Eingans-Posting declarierst du res& 2x, einmal beim Programm-Start und dann nochmal in der Proc / nProc.
...
Ich denke mal, im "Doppel-Declare" liegt der Hase begraben (ungetestet).


Negativ, habe gerade mit anderen Variablen getestet, selbes Ergebnis, exakt um 7 größer wenn ich die Variablen nach dem Declare nicht nulle

möglicherweise darf keine Variable 0 sein und das Declare der "leeren Variable" den Wert 7 zuweist ?

E.T. (17.09.14)
Was passiert, wenn in der Proc Variablen declariert werden, welche schon im Hauptprogramm decl. wurden, das kann uns wohl Roland beantworten


das würde mich aber auch interessieren, meiner Erfahrung nach geht lokal vor global, habe in meinen Programmen aber nie diesen Fehler gemacht, nur in Codesnippets getestet
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

17.09.2014  
 




RGH
Wenn in einer Prozedur Variablen deklariert werden, die auch schon im Hauptprogramm deklariert sind, dann sind die im Hauptprogramm deklarierten Variablen in der Prozedur nicht sichtbar, d.h. sie können in der Prozedur weder gelesen noch geändert werden.

Gruß
Roland
 
XProfan X2
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
17.09.2014  
 



In nProcs mit declare deklarierte Variablen haben nicht gleich den Wert 0,
die Variable wird zwar deklariert aber es wird ihr kein Wert zugewiesen und der Wert
kommt dann aus dem Speicher und kann beliebig sein.

Anders ist es (natürlich) wenn man innerhalb nProcs mit var deklariert z.B.
KompilierenMarkierenSeparieren
var a&=20

oder kürzer:
KompilierenMarkierenSeparieren
long a=20
 
17.09.2014  
 




Georg
Teles
Ahh, vielen Dank ! Nun sind beide Fragen geklärt worden.
Das mit Declare erklärt auch, dass in jedem Beispielcode Ende% vor der Whilenot-Schleife tradiztionell mit Clear gelöscht bzw als var ende% = 0 deklariert und zur Sicherheit auf 0 gesetzt wird.
Dies ist seit Programmiertanfang an bei mir zum Standard geworden weil bei meinen Programmen oft selbe Variablen mehrmals verwendet werden, zB. temporäre, aber genauer darauf habe ich nur noch nie geschaut
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

17.09.2014  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.611 Betrachtungen

Unbenanntvor 0 min.
Normann Strübli31.03.2020
funkheld09.02.2016
Georg Teles07.01.2016
iF01.06.2015
Mehr...

Themeninformationen

Dieses Thema hat 4 Teilnehmer:

Georg Teles (5x)
iF (2x)
RGH (1x)
E.T. (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie