| |
|
|
- Página 1 - |
|
Uwe ''Pascal'' Niemeier | Hola Roland!
Der Fehler, en el el Adressen de Variables por Proc-Aufrufe movido voluntad, es en el aktuellen Versión 11.2ß siempre todavía disponible
Er ha se bloß algo después de hinten verschoben; voluntad sagen: Tritt sólo de uno gewissen Parameterzahl en.
QED: KompilierenMarcaSeparaciónwindow 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&)
wai
Zwar ließen se tal vez Workarounds para el problema finden; trotzdem dürfte/debería lo doch así no ser?
BTW: Offensichtlich son mi OCX-Routinen deshalb siempre todavía no funktionsfähig
A Erinnerung: Selbige ermöglichen u.A. el Nutzung des Befehlsumfanges aller gängigen Scriptsprachen (JS, VBS, VBA, WSH) bajo XProfan; por lo tanto liegt me soviel daran. (Und porque ellos de me son )
Hoffe en (baldige) Ayuda Pascal |
|
|
| |
|
|
|
| |
|
- Página 1 - |
|
RGH | ¡Hola,
vergiß media Workaround. Das Problema tritt auch en Integers en.
Yo fürchte, el lässt se auch kaum ändern. A Speicherung el Variables benutze Yo el dynamischen Arrays de Delphi. Puesto que hay lo para cada Variablentyp una Array. Wird nun una neue Variable deklariert se el Größe des Arrays en 1 ertweitert (Delphi: SetLength(IntVar, IntNr + 1)) y luego Name y Valor en el Array geschrieben. Wird el Array nun größer, restos lo also no de, dass irgendwann el Speicherbereich para el Array a una otro Punto movido voluntad muss, wo eben dieser zusätzliche Platz es. Como el Delphi oder Windows intern handhabt, weiß Yo natürlich no.
Vor el Dynamisierung trat dieses Problema eben deshalb no en, como hay el Speicher para todos möglichen Variables igual a Programmbeginn reserviert wurde.
Das heißt en el aktuellen Praxis: Un Variablenadresse es mindestens así largo gültig, a una weitere Variable esta Typs deklariert se (por Declarar, Var oder Parámetros).
Yo fürchte, a diesem Comportamiento kann Yo vorerst auch nichts ändern. (Lo sei porque, alguien ha un despertar Concepto.)
Saludo Roland
Apéndice: Si no puede Bereiche uso? El Adresse uno Bereiches debería se no mover, como hier en el entsprechenden Array sí sólo una Zeiger en el Zona es. Statt uno Lonint-Variables Así que una 4 Byte großer Zona. |
|
|
| 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 en me: KompilierenMarcaSeparaciónwindow 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#)
put
|
|
|
| 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: Yo verstehe Usted ya aber el trifft sólo sólo en (echte) Variables a el eben no gemanaged son.
@RGH: Auch si el veces antes de y hinter uno grösseren Anwendung einbaust en el einiges passiert?
Yo habe no idea brillante. (obwohl Yo schonmal pensamiento una gehabt a haben, veces drüber grübeln...)
Ah, Sé que otra vez como... veces zurechtschreiben - es ne Präkompiler-Solución con el Nachteil el para el Zugriff el Werte sólo ne Sonderfunktion notwendig es. (Umgekehrter Nachteil) |
|
|
| |
|
|
|
RGH | IF
@RGH: Auch si el veces antes de y hinter uno grösseren Anwendung einbaust en el einiges passiert?
Sí, el Bereiche bleiben a ihrem Platz! (Natürlich sólo a a una erneuten DIM. ;) ) Sonst würden ellos sí überhaupt no trabajo. Der entsprechende Umbau debería se para Pascal en Grenzen halten.
Saludo 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 ▲ |
|
|
|
|
| Apéndice:
An mi Ejemplo, sería Yo en lugar de para reguläre Longs: KompilierenMarcaSeparaciónlong a,b,c
umgewandelt in
var a&=0
var b&=0
var c&=0
einfach
addr a,b,c
dispose a,b,c
umgewandelt in
var a&=globalAlloc(gPtr,4)
var b&=globalAlloc(gPtr,4)
var c&=globalAlloc(gPtr,4)
hier im programm mit dem wissen
dass sich hinter a& die Adresse
befindet, und nicht der Wert
long(a&,0).
dispose a&,b&,c&
end
uso.
Könnte XProfan en Disponer con un GlobalFree reagieren? |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi Personas!
Roland
Das heißt en el aktuellen Praxis: Un Variablenadresse es mindestens así largo gültig, a una weitere Variable esta Typs deklariert se (por Declarar, Var oder Parámetros).
Posesiones Yo auch gerade festgestellt. Damit es @Addr() a uno echt unsicheren Sache geworden
Das Übergeben uno Variables-Pointers dient sí en mi caso sólo dazu, de uno Proc más que el direkten Rückgabewert a erfragen (Zusätzliche Rückgaben fueron eben por Pointer en el entsprechenden Variables geschrieben). Trotzdem: Diese Möglichkeit debería früher oder später otra vez en irgendeiner Form disponible posición.
Roland
Der entsprechende Umbau debería se para Pascal en Grenzen halten.
Stimmt! Soweit Yo media eigenen Code durchschaue, diente el Ganze sólo el Bequemlichkeit des Anwenders, porque el así seine eigenen Variables uso podría (ansonsten Es el Concepto de IF una Alternative, obwohl a& = a# entonces en efecto klappen müßte).
Stattdessen debería se una Sistema-Variable einbauen dejar, deren Inhalt después de Aufruf el betreffenden Función eben umkopiert voluntad muß... oder algo como en el Art.
Werde veces sehen, qué se hacer läßt...
SeeYou Pascal |
|
|
| |
|
|
|
Sebastian König | Also Yo finde, Pascal ha bastante. El con Addr() ermittelte Adresse debería se solange el Variable gültig es (en globalen Variables also während el gesamten Laufzeit) no ändern dürfen. Dass el en el Tat a Problemen führen kann (y obendrein a muy gemeinen, así una Fehler a lokalisieren es sí alles otro como simplemente...), zeigen sí Pascals OCX-Codes.
Wenn el Ursache en el Verwendung el dynamischen Arrays liegt, Es el unschöne Konsequenz wohl, dass se esta a Speicherung el Variables schlicht no eignen. Mein Vorschlag es demnach, el Verwaltung umzustellen, qué natürlich probablemente no así kurzfristig posible es... Aber zumindest para el nächste Versión tal vez ya.
Mi Vermutung wäre, dass el Arrays intern una Art Vektor-Klasse son (womöglich es el irgendwo en el Delphi-Documentación). Lo debería entonces doch posible ser, el dynamische Speicherverwaltung incluso a implementieren y esta en el de Delphi bereitgestellten Datenstruktur-Klassen zurückzugreifen. So ließe se con tal vez garnicht allzu viel Arbeit el problema beheben.
MfG
Sebastian
P.S.: Noch una Concepto: Zumindest para globale Variables podría uno tal vez doch kurzfristig algo einrichten, indem uno ellos beim Kompilieren zählt y festen Speicher en passender Größe bereitstellt. Yo weiß natürlich no, como simplemente una solche Sonderbehandlung einzubauen wäre... |
|
|
| Windows XP, XProfan/Profan² 4.5 bis 11 Profan2Cpp-Homepage: [...] Alte Profan²-Seite: [...] | 04.04.2009 ▲ |
|
|
|
| |
|
- Página 2 - |
|
|
RGH | ¡Hola Pascal y Sebastian,
kurzfristig, also para Versión 11.2, va vermutlich gar nichts. Langfristig debería Yo entonces einiges ajustar, indem Yo etwa en el Arrays no el Werte incluso, pero, como en el Bereichen, sólo Pointer en el jeweiligen Speicherplatz unterbringe. Es natürlich otra vez una algo umfangreicheres Unterfangen. Einen Nachteil möchte Yo no verschweigen: Der Zugriff en Variables se dadurch natürlich una wenig langsamer. Yo voluntad lo aber para Versión 12 en el Auge behalten.
Saludo 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 ▲ |
|
|
|
|
RGH | Hehe, y para el Schnelle hay doch una solución:
Für Integer, LongInt y Float lege Yo el Arrays a Programmbeginn en valor fest, el a XProfan 10-Veces eh el Höchstgrenze war: 2000. Erst si la 2001. Variable uno Typs declariert se, se el Array dynamisch erweitert. Como damals nie alguien esta Grenzen erreicht ha, dürfte el voerst auch Usted, Pascal, ausreichen.
Saludo 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 ▲ |
|
|
|
|
Frank Abbing | Das hört se doch muy vernünftig a! |
|
|
| |
|
|
|
| @Roland: Yo blanco no genau como Usted zählst pero yo bin unsicher esta Grenze en manchen Spielen no a erreichen y sería (si yo podría) wohl de Sicherheitsgründen el Zahl höher einstellen, auch si mehr Speicher en Anspruch nimmt. Echte Variables en lugar de Arrays hacer manchmal de Performancegründen Sinn como el Verteilen en viele kleine Características con wiederum lauter Variables. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi Personas!
Yo denke, uno podría con el instabilen Pointern leben; si al Problema primero sabe, son Workarounds (Bereiche uso) relativ simplemente. Nur en el de me angesprochenen Fall (@Addr(Variable&) a PROC transferencia, en direkt en el Variable a escribir) debería langfristig una elegantere Solución gefunden voluntad, porque esta Technik z.B. en Interfaces Standart es.
Was ocx betrifft: Das se ejecuta ahora Nach Austausch aller betroffenen Pointer por Bereiche y uno pequeño Corrección bezüglich des PROC-Parameterstacks (en el lo ebenfalls una Diferencia zwischen 10.x y 11.x son) voluntad Yo en Kürze una entsprechend angepaßte Versión puesto.
Und Gracias a Roland, el se kurzfristig dieser Sache angenommen ha, obwohl lo sí tatsächlich sólo una pequeña Teil el Anwender betrifft (auch si dies gerade el Grundlagenforscher son, y a wäre lo doch schade gewesen )
SeeYou Pascal |
|
|
| |
|
|