Deutsch
Bugs und vermeintliche

Erledigt: PROC / Pointer-Bug in 11.2 noch vorhanden

 

Uwe
''Pascal''
Niemeier
Hallo Roland!

Der Fehler, bei dem die Adressen von Variablen durch Proc-Aufrufe verschoben werden, ist in der aktuellen Version 11.2ß immer noch vorhanden

Er hat sich bloß etwas nach hinten verschoben; will sagen: Tritt erst ab einer gewissen Parameterzahl auf.

QED:
KompilierenMarkierenSeparieren
window 500,400

proc Demo-------------------------------------------------------------

    parameters x1&,x2&,x3&,x4&,x5&,x6&--Ohne Parameters klappt es
    endproc---------------------------------------------------------------
    declare Wert&,Test&--bei Weglassen der 2. Deklaration klappt es
    print Addr 1 ,addr(Wert&)
    Demo(1,2,3,4,5,6)
    print Addr 2 ,addr(Wert&)
    waitinput

Zwar ließen sich vielleicht Workarounds für das Problem finden; trotzdem dürfte/sollte es doch so nicht sein?

BTW: Offensichtlich sind meine OCX-Routinen deshalb immer noch nicht funktionsfähig

Zur Erinnerung: Selbige ermöglichen u.A. die Nutzung des Befehlsumfanges aller gängigen Scriptsprachen (JS, VBS, VBA, WSH) unter XProfan; darum liegt mir soviel daran. (Und weil sie von mir sind )

Hoffe auf (baldige) Hilfe
Pascal
 
04.04.2009  
 



Ich hatte es so verstanden, dass weil es kein Bug ist nichts daran geändert wird.

Auch wegen der Desktopsymbole bei Roland  [...]  habe ich ein Brett vor Augen, ob es daran liegt.
 
04.04.2009  
 




RGH
Hallo,

ein ganz einfacher Workaround scheint zu sein, statt LongInt (&) auf Integer (%) umzusteigen. Da beide im 32-Bit-Programm gleich groß sind, macht das keinen Unterschied. Wenn ich das recht sehe, tritt das Problem nur bei LongInts auf. Ich schaue aber natürlich, ob ich das gefixt bekomme, auch wenn es für die normale Verwendung von Variablen keine Rolle spielt.

Gruß
Roland
 
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
04.04.2009  
 




Uwe
''Pascal''
Niemeier
Hi iF!


Ich hatte es so verstanden, dass weil es kein Bug ist nichts daran geändert wird.


Wenn die Adresse einer globalen Variablen sich durch einen Prozedur-Aufruf (an dem die Variable nicht mal selbst beteiligt ist) ändert und dies unter nicht näher bekannten Bedingungen (abhängig von vorherigen Deklarationen, Parameterzahl der Proc, Art der Auswertung der Parameter usw) , dann ist das IMHO definitiv ein Bug.

Denn: Was nützt @Addr(), wenn die Rückgabe ein paar Programmzeilen weiter ungültig ist, weil zwischendurch eine Prozedur aufgerufen wurde?

Außerdem ist diese Art der Verwendung von Pointern sowohl bei Windows selbst als auch bei anderen Programmiersprachen Gang und Gäbe..

Hoffen wir also das Beste...

PS: Mir brennt in Sachen HTML auch die Zeit unter den Nägeln; falls ich tatsächlich irgendeinen Workaround basteln muß, lasse ich es dich wissen!

SeeYou
Pascal

Nachtrag @Roland: War wieder mal zu langsam beim Schreiben!
Danke für den Tipp! Wird sofort getestet!
 
04.04.2009  
 



Ein Workaround ist Reboos ProAx, geladen mit einem z.B. 8x1 Pixel Flashfilm auf einem DC der abgepixelt wird wobei der Flashfilm halt 8 Bit anzeigen kann als Kommunikationskanal. Der Flashfilm wiederum kann js auslösen und wiederum mit dem body kommunizieren.

Bitte nicht lachen, das funktioniert und ich könnte das bei bedarf herauskrahmen.

Dennoch empfand ich diese Lösung als unentsprechend... (und langsam...)
 
04.04.2009  
 




RGH
Hallo,

vergiß meinen Workaround. Das Problem tritt auch bei Integers auf.

Ich fürchte, das lässt sich auch kaum ändern. Zur Speicherung der Variablen benutze ich die dynamischen Arrays von Delphi. Da gibt es für jeden Variablentyp ein Array. Wird nun eine neue Variable deklariert wird die Größe des Arrays um 1 ertweitert (Delphi: SetLength(IntVar, IntNr + 1)) und dann Name und Wert in das Array geschrieben. Wird das Array nun größer, bleibt es also nicht aus, dass irgendwann der Speicherbereich für das Array an eine andere Stelle verschoben werden muss, wo eben dieser zusätzliche Platz ist. Wie das Delphi oder Windows intern handhabt, weiß ich natürlich nicht.

Vor der Dynamisierung trat dieses Problem eben deshalb nicht auf, da dort der Speicher für alle möglichen Variablen gleich zu Programmbeginn reserviert wurde.

Das heißt in der aktuellen Praxis: Eine Variablenadresse ist mindestens so lange gültig, bis eine weitere Variable diesen Typs deklariert wird (durch Declare, Var oder Parameters).

Ich fürchte, an diesem Verhalten kann ich vorerst auch nichts ändern. (Es sei denn, jemand hat eine zündende Idee.)

Gruß
Roland

Nachtrag: Kannst Du nicht Bereiche verwenden? Die Adresse eines Bereiches sollte sich nicht verschieben, da hier im entsprechenden Array ja nur ein Zeiger auf den Bereich steht. Statt einer Lonint-Variablen also ein 4 Byte großer Bereich.
 
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
04.04.2009  
 




RGH
Das klappt bei mir:
KompilierenMarkierenSeparieren
window 500,400

proc Demo-------------------------------------------------------------

    parameters x1#, x2#, x3#,x4#, x5#, x6#
    print x1#, x2#
    endproc---------------------------------------------------------------
    declare wert#, test#
    dim wert#, 2
    dim test#, 2
    print Addr 1 ,addr(Wert#)
    Demo(wert#,wert#,wert#,wert#,wert#,wert#)
    print Addr 2 ,addr(Wert#)
    waitinput
 
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
04.04.2009  
 



@Pascal: Ich verstehe Dich schon aber das trifft halt nur auf (echte) Variablen zu die eben nicht gemanaged sind.

@RGH: Auch wenn Du das mal vor und hinter einer grösseren Anwendung einbaust in der einiges passiert?

Ich habe keine zündende Idee. (obwohl ich schonmal dachte eine gehabt zu haben, mal drüber grübeln...)

Ah, ich weiss wieder wie... mal zurechtschreiben - ist ne Präkompiler-Lösung mit dem Nachteil das für den Zugriff der Werte halt ne Sonderfunktion notwendig ist. (Umgekehrter Nachteil)
 
04.04.2009  
 




RGH
iF
@RGH: Auch wenn Du das mal vor und hinter einer grösseren Anwendung einbaust in der einiges passiert?


Ja, die Bereiche bleiben an ihrem Platz! (Natürlich nur bis zu einem erneuten DIM. ;) )
Sonst würden sie ja überhaupt nicht funktionieren.
Der entsprechende Umbau sollte sich für Pascal in Grenzen halten.

Gruß
Roland
 
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
04.04.2009  
 



Nachtrag:

An meinem Beispiel, würde ich statt für reguläre Longs:
KompilierenMarkierenSeparieren
verwenden.

Könnte XProfan bei Dispose mit einem GlobalFree reagieren?
 
04.04.2009  
 




Uwe
''Pascal''
Niemeier
Hi Leute!

Roland
Das heißt in der aktuellen Praxis: Eine Variablenadresse ist mindestens so lange gültig, bis eine weitere Variable diesen Typs deklariert wird (durch Declare, Var oder Parameters).


Habe ich auch gerade festgestellt. Damit ist @Addr() zu einer echt unsicheren Sache geworden

Das Übergeben eines Variablen-Pointers dient ja in meinem Fall nur dazu, von einer Proc mehr als den direkten  Rückgabewert zu erfragen (Zusätzliche Rückgaben wurden eben per Pointer in die entsprechenden Variablen geschrieben).
Trotzdem: Diese Möglichkeit sollte früher oder später wieder in irgendeiner Form zur Verfügung stehen.

Roland
Der entsprechende Umbau sollte sich für Pascal in Grenzen halten.


Stimmt!
Soweit ich meinen eigenen Code durchschaue, diente das Ganze nur der Bequemlichkeit des Anwenders, weil der so seine eigenen Variablen verwenden konnte (ansonsten ist die Idee von iF eine Alternative,
obwohl a& = a# dann ja auch klappen müßte).

Stattdessen sollte sich eine System-Variable einbauen lassen, deren Inhalt nach Aufruf der betreffenden Funktion eben umkopiert werden muß... oder sowas in der Art.

Werde mal sehen, was sich machen läßt...

SeeYou
Pascal
 
04.04.2009  
 




Sebastian
König
Also ich finde, Pascal hat recht. Die mit Addr() ermittelte Adresse sollte sich solange die Variable gültig ist (bei globalen Variablen also während der gesamten Laufzeit) nicht ändern dürfen. Dass das in der Tat zu Problemen führen kann (und obendrein zu sehr gemeinen, so einen Fehler zu lokalisieren ist ja alles andere als einfach...), zeigen ja Pascals OCX-Codes.

Wenn die Ursache in der Verwendung der dynamischen Arrays liegt, ist die unschöne Konsequenz wohl, dass sich diese zur Speicherung der Variablen schlicht nicht eignen. Mein Vorschlag ist demnach, die Verwaltung umzustellen, was natürlich wohl nicht so kurzfristig möglich ist... Aber zumindest für die nächste Version vielleicht schon.

Meine Vermutung wäre, dass die Arrays intern eine Art Vektor-Klasse sind (womöglich steht das irgendwo in der Delphi-Dokumentation). Es müsste dann doch möglich sein, die dynamische Speicherverwaltung selbst zu implementieren und dabei auf die von Delphi bereitgestellten Datenstruktur-Klassen zurückzugreifen. So ließe sich mit vielleicht garnicht allzu viel Arbeit das Problem beheben.

MfG

Sebastian

P.S.: Noch eine Idee: Zumindest für globale Variablen könnte man vielleicht doch kurzfristig etwas einrichten, indem man sie beim Kompilieren zählt und festen Speicher in passender Größe bereitstellt. Ich weiß natürlich nicht, wie einfach eine solche Sonderbehandlung einzubauen wäre...
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
04.04.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

8.647 Betrachtungen

Unbenanntvor 0 min.
H.Brill18.09.2024
Member 166302407.05.2019
Georg Teles14.10.2014
iF19.01.2011

Themeninformationen



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