Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Beliebigen Datentyp (SINGLE oder INTEGER) übergeben

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 12.05.2010, 17:09    Titel: Beliebigen Datentyp (SINGLE oder INTEGER) übergeben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 12.05.2010, 17:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 12.05.2010, 19:18    Titel: Antworten mit Zitat

Leider nicht, wenn -lang qb verwendet wird

error 55: Type mismatch, at parameter 1 of LOCATE2()
locate2 x, y
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 12.05.2010, 19:28    Titel: Antworten mit Zitat

Mist, ich habe es extra noch getestet und in der Konsole compiliert, und dann doch -lang qb vergessen mit dem Kopf durch die Mauer wollen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.05.2010, 19:28    Titel: Antworten mit Zitat

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 durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 12.05.2010, 19:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 12.05.2010, 20:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 12.05.2010, 21:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 12.05.2010, 22:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4699
Wohnort: ~/

BeitragVerfasst am: 12.05.2010, 23:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.05.2010, 09:16    Titel: Antworten mit Zitat

nemored, du hast mein Problem verstanden zwinkern

@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 traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 13.05.2010, 10:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.05.2010, 10:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 13.05.2010, 11:02    Titel: Antworten mit Zitat

Fix() schneidet die Nachkommastellen ab und abs() gibt dir den absolut Betrag (Entfernung von 0).
Code:
fix(abs(-2.9943894))   ' = 2
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.05.2010, 11:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 13.05.2010, 12:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.05.2010, 13:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
goooofy



Anmeldungsdatum: 12.09.2005
Beiträge: 69

BeitragVerfasst am: 13.05.2010, 16:25    Titel: Antworten mit Zitat

Hab das Problem selber lösen können. Etwas unkonventionell, aber wenigstens kurz und einfach lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz