Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 12.05.2010, 17:09 Titel: Beliebigen Datentyp (SINGLE oder INTEGER) übergeben |
|
|
Hallo,
ich möchte all meine LOCATE-Anweisungen (SEHR viele!) eines alten QB-Codes ein offset-Wert hinzuaddieren. Dafür habe ich eine neue SUB locate2 geschrieben. Das Problem: Ich übergebe sowohl INTEGER als auch SINGLES (kein Schema - mal so mal so). Da ich nicht weiß, was übergeben wird, habe ich es mit AS ANY versucht (siehe Beispiel), habe aber nun keine Ahnung, wie ich zuverlässig meine übergebenen Werte wiedererhalte. Wenn ich eine INTEGER als SINGLE einlese (wie im Beispiel) kommt natürlich was anderes raus.
Code: | #LANG "qb"
x=5
y%=2
DECLARE SUB locate2(x AS ANY, y AS ANY)
LOCATE2 x, y%
SLEEP
SUB locate2 (x AS SINGLE, y AS SINGLE)
PRINT "Ergebnis: LOCATE";x;",";y 'Hier soll LOCATE 5, 2 ausgeführt werden!
END SUB |
OVERLOAD wäre ne Möglichkeit, geht leider nicht mit -lang qb, auch nicht als __OVERLOAD.
Wie kann ich das jetzt geschickt realisieren, ohne in jeder LOCATE-Anweisung einen einheitlichen Datentyp verwenden zu müssen? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 12.05.2010, 17:58 Titel: |
|
|
Du kannst doch einer SUB, die SINGLE verlangt, auch INTEGER übergeben?
Code: | declare sub locate2 (x as single, y as single)
dim x as integer = 4, y as short = 5
locate2 x, y
sub locate2 (x as single, y as single)
print x, y
end sub |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 12.05.2010, 19:18 Titel: |
|
|
Leider nicht, wenn -lang qb verwendet wird
error 55: Type mismatch, at parameter 1 of LOCATE2()
locate2 x, y |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 12.05.2010, 19:28 Titel: |
|
|
Mist, ich habe es extra noch getestet und in der Konsole compiliert, und dann doch -lang qb vergessen  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 12.05.2010, 19:28 Titel: |
|
|
Also bei mir läuft das auch unter -lang qb problemlos durch. Welche Version des Compilers hast du denn?
Edit: Nein doch nicht, hab vergessen, dass die temporäre Ausgabe bei mir immer -lang fb ist
Naja, -lang qb sollte man sich eh so schnell wie möglich abgewöhnen, es ist halt eine Zwischenlösung zwischen dem beschränkten QB und dem ziemlich starken FB. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 12.05.2010, 19:44 Titel: |
|
|
Evtl. mal -lang fblite probieren - da könnte auch noch eine Menge QB-spezifisches durchgehen.
edit: hmm nee, geht auch nicht - aber vielleicht geht da OVERLOAD? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 12.05.2010, 20:18 Titel: |
|
|
es muss leider zwingend mit -lang qb funktionieren. Handelt sich um ca. 30.000 Zeilen Code, den kann ich nicht mal eben so abändern, dass er mit fblite funzt... |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 12.05.2010, 21:57 Titel: |
|
|
Was mich wundert is:
Code: |
tpm@lara:~/data/work/code/fb/test/test9$ ./test
Ergebnis: LOCATE 5,-2.896786e-05
tpm@lara:~/data/work/code/fb/test/test9$ ./test
Ergebnis: LOCATE 5,-2.920628e-05
tpm@lara:~/data/work/code/fb/test/test9$ ./test
Ergebnis: LOCATE 5,-2.861023e-05
tpm@lara:~/data/work/code/fb/test/test9$ ./test
Ergebnis: LOCATE 5,-2.932549e-05
tpm@lara:~/data/work/code/fb/test/test9$ ./test
Ergebnis: LOCATE 5,-2.992154e-05
|
Warum ändert sich der wert?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 12.05.2010, 22:27 Titel: |
|
|
Was sollen Fließkommazahlen bei Locate eigentlich bewirken? Es gibt keine Zeile oder Spalte 2,43 oder sonstige.
Aber eine Lösung hätte ich auch noch anzubieten, nämlich CSng.
Mach den Funktionsaufruf so:
Code: | Locate2 CSng(x), CSng(y%) |
Damit ist es immer ein Single und du kannst dir auch das Any in der Deklaration der Sub sparen. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 12.05.2010, 23:21 Titel: |
|
|
Das Problem wird sein, dass dann alle LOCATE-Befehle per Hand angepasst werden müssen, und das wollte er sich ersparen. Der LOCATE-Befehl soll auch nicht mit Singles umgehen können, sondern die übergebenen Variablen sind eben bereits Singles. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.05.2010, 09:16 Titel: |
|
|
nemored, du hast mein Problem verstanden
@MOD: Klar sind singles für LOCATE sinnlos, aber in meinen anfänglichen QB-Zeiten habe ich mich um Deklarationen halt nicht geschert und so sind die singles da alle gelandet. Irgednwann bin ich dann auf den Trichter gekommen, dass die ja unnötig den unter DOS so raren Speicher belasten und bin auf Integer umgestiegen
Kennt jemand denn veilleicht ein Programm, mit dem man unter Berücksichtigung von Variablen Textstellen ersetzen kann? Denn jede LOCATE manuell abändern, das wäre die Hölle! |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 13.05.2010, 10:17 Titel: |
|
|
Theoretisch geht es mit 'any' .. eine lösung wäre die nutzung von FIX() und ABS() ... aber, das funktioniert nur nicht, weil bei der übergabe -2,9 bei dem singlewert heraus kommt ... mich würd aber noch mehr interesieren, warum es manchmal 2,8, manchmal 2,9, und manchmal noch irgend was anderes is.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.05.2010, 10:40 Titel: |
|
|
Ja... seltsam mit den verschiedenen Werten. Aber ich vermute mal, dass die Unterschiede belanglos sind, wenn man daraus wieder eine Integer rekonstruiert (falls das überhaupt geht!?)
Allerding ist mir dein Lösungsansatz mit FIX und ABS noch nicht klar geworden. Wie willst du aus -2.992154e-05 Integer 2 rekonstruieren? |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 13.05.2010, 11:02 Titel: |
|
|
Fix() schneidet die Nachkommastellen ab und abs() gibt dir den absolut Betrag (Entfernung von 0).
Code: | fix(abs(-2.9943894)) ' = 2 |
|
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.05.2010, 11:44 Titel: |
|
|
Das ist schon klar,
nun ist es aber nicht so, dass jeder Integer i als Single eingelesen auch -i.irgendwas ergibt, das war nur in dem Beispiel von ThePuppetMaster so.
Integer 10 wird z.B. zu 5.877486e-039,
Integer 7 zu 5.877482e-039
Integer 1 zu 5.877473e-039
@ThePuppetMaster: Für welche Integer kommst du überhaupt auf diese Werte??? Wie du siehst, kommt bei mir immer irgendwas mit 5.877... raus und zwar immer exakt der gleiche Wert.
Hier noch einmal der Code, den ich verwendet habe:
Code: | #LANG "qb"
DECLARE SUB locate2 (x AS any, y AS ANY)
x = 5: y% = 1
LOCATE2 x, y%
SLEEP
END
SUB locate2 (x AS SINGLE, y AS SINGLE)
PRINT x, y
END SUB |
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 13.05.2010, 12:39 Titel: |
|
|
Eine weitere Möglichkeit wären Macros:
Code: | #Macro Locate2(x,y)
Print x, y
#EndMacro |
In dem Fall musst du aber jedes Locate2 mit Klammern aufrufen.
Du müsstest halt per Editor jedes "Locate" gegen "Locate2(" ersetzen und hinten noch ein ")" hinzufügen.
Du hast also ein QB-Programm mit 30000 Codezeilen geschrieben, dass voller Locates ist!? Was macht das Programm? |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.05.2010, 13:29 Titel: |
|
|
Es handelt sich um eine kommerzielle Software, die jetzt Vista/7-tauglich gemacht werden soll/muss.
Es besteht natürlich nicht nur aus lauter LOCATEs, aber bei 30.000 Zeilen sind es halt einfach zuviele um manuelle Änderungen vorzunehmen.
Trotzdem Danke für deinen Tipp. Vielleicht noch jemand ne Idee, wie man aus dem Single wieder den ursprünglichen Integer erhält? |
|
Nach oben |
|
 |
goooofy
Anmeldungsdatum: 12.09.2005 Beiträge: 69
|
Verfasst am: 13.05.2010, 16:25 Titel: |
|
|
Hab das Problem selber lösen können. Etwas unkonventionell, aber wenigstens kurz und einfach
Code: |
#LANG "qb"
DECLARE SUB locate2 (x AS ANY, y AS ANY)
DECLARE FUNCTION SNG2INT(y AS ANY)
x = 5: y% = 1
LOCATE2 x, y%
SLEEP
END
SUB locate2 (x AS SINGLE, y AS SINGLE)
PRINT x, y
IF INSTR(STR$(y), ".") THEN y=sng2int(y): PRINT y
END SUB
FUNCTION sng2int(y AS INTEGER)
SNG2INT=y
END FUNCTION |
|
|
Nach oben |
|
 |
|