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:

ein kleines 64bit Problem

 
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
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 563
Wohnort: Jüterbog

BeitragVerfasst am: 08.08.2015, 14:31    Titel: ein kleines 64bit Problem Antworten mit Zitat

da ich nun die 64Bit Version des FBC benutzen kann und will habe ich beim neukompilieren meiner Projekte doch diverse Fehlermeldungen bzw auch Abstürze ohne Meldungen fabriziert. Etwas demotivierend aber naja...

<32> habe ich schon entdeckt und erfolgreich eingebaut lächeln

nächstes Problem hier:

eine kleine Casting Geschichte, der String ist im Original ein Funktionsergebnis und das Zielformat ist auch ein anderes, aber der Fehler ist der gleiche:

Code:
print cast(integer ptr, valint ("12345"))'nur 32bit kompatibel
print cast(integer ptr, vallng ("12345"))'nur 64bit kompatibel


geht das auch mit nem Einzeiler ohne Fehlermeldung? Oder muß ich das über ein Metakonstrukt lösen

Code:
#ifdef __FB_64BIT__
  print cast(integer ptr, vallng ("12345"))'nur 64bit kompatibel
#else
  print cast(integer ptr, valint ("12345"))'nur 32bit kompatibel
#endif

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 08.08.2015, 16:37    Titel: Antworten mit Zitat

Ich würde ja sagen, wenn du Strings in Pointer umwandeln musst, ist dein Programm kaputt.
Ohne es getestet zu haben, warum funktioniert vallng nicht bei 32-bit? Wenn du das wirklich tun musst, würde ich den Cast in eine Funktion packen, das würde auch jede Menge Redundanz entfernen bei den Casts, sodass du dieses ifdef nur an einer Stelle verwenden müsstest.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 563
Wohnort: Jüterbog

BeitragVerfasst am: 08.08.2015, 17:02    Titel: Antworten mit Zitat

Warum das so ist, keine Ahnung. Jeweils die eine oder andere zeile erzeugt mit aktuellem beim jeweiligen compiler ein fehlermeldung.
Ich geb zu pointer in nen string zu speichern...war die einfachste Lösung zum speichern einer kleinen pointerliste... Das könnte ich generell ändern.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 09.08.2015, 01:21    Titel: Antworten mit Zitat

Ich kann mir nicht vorstellen dass Pointer als dezimalzahl in einem String zu speichern eine "einfache Lösung" sein kann, aber zum Problem:
ValInt gibt einen Long-Wert (32-bit) zurück, ValLng einen LongInt (64-bit) (die Funktionsbezeichnung ist da etwas verwirrend - musste in der Doku nachschaun) - was du brauchst ist aber ein Integer Typ (der je nach Architektur immer so groß ist wie ein Pointer). Da es soweit ich gesehen hab keine VAL-Funktion gibt, die einen Integer-Typ zurückgibt kannst du dir z.B. mit einem weiteren cast helfen:
Code:
print cast(integer ptr, cast(Integer, vallng ("12345")))

Es wird also der String in einen 64-Bit Wert konvertiert, dieser in einen Integer konvertiert (ggf. 32 bit) und dieser dann als Pointer verwendet. Ist zwar nicht schön, sollte aber funktionieren. Und, ehrlich gesagt, wenn man Pointer in einem String speichert dann macht noch ein wenig mehr hässlicher Code auch keinen Unterschied mehr.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 09.08.2015, 12:26    Titel: Antworten mit Zitat

Warum ValInt einen Long zurückliefert, ist mir ein Rätsel. Die rtlib liefert einen int zurück, erst der Compiler definiert die Rückgabe dann als Long. Das wurde im Zug der 64bit Umstellung gemacht (ich meine auch irgendwo mal eine Diskussion zu dem Thema gesehen zu haben).

Dass ValLng einen LongInt und keinen Long zurückliefert, ist seltsamerweise schon seit langem so (die Funktion hieß auch mal Val64, was mehr Sinn macht), allerdings hat ValInt bis vor kurzem noch einen Integer zurückgeliefert.

Interessant finde ich das Verhalten der aktuellen 1.03 Version trotzdem:
Code:
Print Cast(Integer Ptr, ValInt("12345"))


Dieser Code funktioniert in der 32bit Variante problemlos, beschwert sich in der 64bit Variante aber nicht über falsche Datentypen (Integer vs. Long), sondern darüber, dass er einen Ptr möchte. Die Auto-Casting-Magie greift wohl hier nicht.

Ich habe noch diese Version als funktionsfähig gefunden (hat aber den Nachteil einer Ptr Variable, die man theoretisch wieder aufräumen muss):
Code:
Print Cast(Integer Ptr, *New Integer (ValInt("12345")))
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 10.08.2015, 05:19    Titel: Antworten mit Zitat

Zu deinen Beispielen: Es ist schon Richtig dass sich fbc über einen falschen Datentyp beschwert (der kein Pointer ist) und auch nicht automatisch konvertiert, wie wenn es ein "normaler" Zahlenwert wäre. Denn einen 32bit Wert in einen 64bit Wert zu konvertieren ist bei Pointern auf einem 64bit System schlicht falsch. Unter demselben Problem leidet übrigens auch dein zweites Beispiel.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
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