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:

Array an Sub/Funktion übergeben
Gehe zu Seite 1, 2  Weiter
 
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 14.12.2013, 22:14    Titel: Array an Sub/Funktion übergeben Antworten mit Zitat

Ich versuche gerade, ein Programm von QuickBasic auf FreeBasic zu portieren.

In Quickbasic hatte ich einigen Subs mit Marken und GOSUB - RETURN gearbeitet. Das hatte den gewissen Vorteil, dass alle Variablen innerhalb dieser Sub natürlich auch für den Abschnitt gültig sind, zu dem ich mit GOSUB springe.
In FreeBasic darf ich das nicht mehr, und muss diese Prozeduren also in eigene Subs oder Functions auslagern, und die erforderlichen Variablen als Argumente übergeben.
Das ist zwar umständlich, hat aber zumindest geklappt, bis ich in einem Fall eine Fehlermeldung bekomme.

Hier ein (sinnloses) Testbeispiel, das NICHT funktioniert:

Code:
Type testtype
    element1 as Integer
    element2 as String
End type

Declare Sub Wurstel (A1 as TestStype())


Dim Feld(1 to 4) as TestType
DIM as Integer i

For i=1 to 4
    Feld(i).element1 = i
    Feld(i).element2 = "Test"
Next i
   
Wurstel(Feld())

Sleep

End

Sub Wurstel (Testfeld() as TestStype())
    DIm as integer k
    DIM as String Erg

    For k=1 to 4
        Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2
        Print l
    next k
end sub


Was mache ich falsch?

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 14.12.2013, 22:43    Titel: Antworten mit Zitat

Code:
Type testtype
    element1 as Integer
    element2 as String
End type

Declare Sub Wurstel (A1() as Testtype)


Dim Feld(1 to 4) as TestType
DIM as Integer i

For i=1 to 4
    Feld(i).element1 = i
    Feld(i).element2 = "Test"
Next i
   
Wurstel(Feld())

Sleep

End

Sub Wurstel (Testfeld() as Testtype)
    DIm as integer k
    DIM as String Erg

    For k=1 to 4
        Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2
        Print k
    next k
end sub


Ich habe großzügig das letzte l durch k ersetzt, keine Ahnung, was du da ausgeben wolltest ... happy
_________________
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 00:01    Titel: Antworten mit Zitat

Ähm ja, "L" war Mist, sollte ERG ausgeben. Ist aber eh nur ein Testprogramm, das irgendwas verwursteln soll.

Entscheidend ist die Fehlermeldung, hätte ich vielleicht gleich anhängen sollen:

Zitat:
Compiler output:
D:\programs\FreeBASIC\tmp_sub_array.bas(6) error 58: Illegal specification, at parameter 1 (A1) of Wurstel() in 'Declare Sub Wurstel (A1 as TestStype())'
D:\programs\FreeBASIC\tmp_sub_array.bas(17) error 57: Type mismatch, at parameter 1 of WURSTEL() in 'Wurstel(Feld())'
D:\programs\FreeBASIC\tmp_sub_array.bas(23) error 58: Illegal specification, at parameter 1 (Testfeld) of Wurstel() in 'Sub Wurstel (Testfeld() as TestStype())'
D:\programs\FreeBASIC\tmp_sub_array.bas (28 ) error 247: Symbol not a CLASS, ENUM, TYPE or UNION type, before '.' in 'Erg= Str(Testfeld(k).element1)+" "+Testfeld(k).element2'

Results:
Compilation failed

System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.90.1


Grüße
Rainer


Zuletzt bearbeitet von TimesChange am 15.12.2013, 00:30, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.12.2013, 00:04    Titel: Antworten mit Zitat

Und, klappt denn meine Verbesserung für deine Zwecke?
_________________
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 00:33    Titel: Antworten mit Zitat

Nein, obige 4 Fehler bekomme ich auch mit Änderung.

Das Codebeispiel habe ich nur gemacht, da ich irgendeine Subroutine mit einem Array mit benutzerdefinierten Daten aufrufen wollte, um die Fehlermeldung zu zeigen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.12.2013, 00:42    Titel: Antworten mit Zitat

Zitat:
Nein, obige 4 Fehler bekomme ich auch mit Änderung.

Das ist aber komisch, bei compiliert es fehlerlos. traurig

Wie auch immer: Klammern hinter der Arraybezeichnung, aber keine hinter dem Datentyp. In der Befehlsreferenz zu DIM findet sich auch ein Beispiel.
_________________
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
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 15.12.2013, 00:45    Titel: Antworten mit Zitat

TimesChange hat Folgendes geschrieben:
Nein, obige 4 Fehler bekomme ich auch mit Änderung.

Das Codebeispiel habe ich nur gemacht, da ich irgendeine Subroutine mit einem Array mit benutzerdefinierten Daten aufrufen wollte, um die Fehlermeldung zu zeigen.


Also bei mir funktioniert Nemoreds Version ohne Probleme!
Die Stellen mit Fehler bzw. Ungenauigkeiten sind folgende:

Code:
Declare Sub Wurstel (A1 as TestStype())
Code:
Declare Sub Wurstel (A1() as Testtype)


Code:
Wurstel(Feld())
Code:
Wurstel Feld()


Code:
Sub Wurstel (Testfeld() as TestStype())
Code:
Sub Wurstel (Testfeld() as Testtype)


Code:
Print l
Code:
Print erg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 00:57    Titel: Antworten mit Zitat

Oh, sorry, ich habe nicht bemerkt dass du noch bisschen mehr korrigiert hast als nur das "L".
Wenn ich meine ganzen "Verschreiber" korrigiere, klappts auch bei mir zwinkern

Den eigentlichen Fehler habe ich inzwischen auch gefunden:

Ich hatte (anders als im Beispiel oben) die Funktion wie folgt deklariert, da die Werte im übergebenen Feld geändert werden sollen:

Code:
Declare Sub Wurstel (ByRef A1() as Testtype)


Offenbar hat hier das BYREF gestört, da "user-defined Types are passed ByRef by default"

Grüße und Danke
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 03:09    Titel: Antworten mit Zitat

So, einen hab' ich noch zwinkern

Ich habe ein Array aus Strings fester Länge. Wenn ich dieses an eine SUB übergeben will bekomme ich untenstehende Fehlermeldungen.
What's wrong?

Code:
Declare Sub DRUCK (Anz as Integer, ByRef  Zeig() as String * 10)

    Dim Zeig(4) as String * 10
    DIM as Integer i
   
    For i=1 to 4
        Zeig(i) = STR(i) + ". Element"
    Next i
       
    Druck (4, Zeig())
    Sleep

End


Sub DRUCK (i as Integer, ByRef Z() as String * 10)
    DIM as Integer k
    For k=1 to i
        Print Z(k)
    next k
End Sub


Zitat:
Compiler output:
D:\programs\FreeBASIC\FBIDETEMP.bas(1) error 58: Illegal specification, at parameter 2 (Zeig) of DRUCK() in 'Declare Sub DRUCK (Anz as Integer, Zeig() as String * 10)'
D:\programs\FreeBASIC\FBIDETEMP.bas(10) error 57: Type mismatch, at parameter 2 of DRUCK() in 'Druck (4, Zeig())'
D:\programs\FreeBASIC\FBIDETEMP.bas(16) error 58: Illegal specification, at parameter 2 (Zeig) of DRUCK() in 'Sub DRUCK (i as Integer, Zeig() as String * 10)'



Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.12.2013, 10:51    Titel: Antworten mit Zitat

Zunächst einmal ist die Angabe von BYREF bei Arrays nicht erlaubt, da Arrays immer BYREF übergeben werden und BYVAL gar nicht möglich wäre.

Strings fester Länge können wohl grundsätzlich nicht als Parameter gefordert werden. Man kann einen String fester Länge angeben, wenn ein String variabler Länge gefordert ist - dieser wird dann automatisch umgewandelt. Bei String-Arrays geht das allerdings nicht.

Man würde da wohl üblicherweise mit ZSTRING PTR der STRING PTR arbeiten. Mit UDTs kann man auch etwas tricksen (auch wenn ich nicht weiß, ob meines die beste mögliche Lösung ist):
Code:
Type FixedLength10
  As String*10 inh 
  Declare Operator Cast As String
  Declare Operator Let(value As String)
End Type

Operator FixedLength10.Cast As String
  Return This.inh
End Operator

Operator FixedLength10.Let(value as String)
  This.inh = value
End Operator

Declare Sub DRUCK (Anz as Integer, Zeig() as FixedLength10)

    Dim Zeig(4) as FixedLength10
    DIM as Integer i
   
    For i=1 to 4
        Zeig(i) = STR(i) + ". Element"
    Next i
       
    Druck (4, Zeig())
    Sleep

End


Sub DRUCK (i as Integer, Z() as FixedLength10)
    DIM as Integer k
    For k=1 to i
        Print Z(k)
    next k
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 13:51    Titel: Antworten mit Zitat

Ja, mit BYREF habe ich einen Bock geschossen, da wir das mit Arrays ja gerade erst beim Beispiel weiter oben hatten.
Ich habe mich da von der Hilfsdatei verwirren lassen:
Zitat:
When passing Strings as parameters to Subs, they should always be passed by reference (ByRef)

Zu meiner Ehrenrettung: Ich habe auch den Aufruf ohne BYREF versucht zwinkern

Deinen Vorschlag mit UDTs und den Operatoren finde ich ziemlich raffiniert.
Auch wenn es "doof" ist, dass ich kein Array aus Fiexd Strings ohne Umwege übergeben kann.
FreeBasic kann schon bissl mehr als Quickbasic, aber man muss sich erst daran gewöhnen und umdenken, und es ist auch deutlich anspruchsvoller.

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 15.12.2013, 14:19    Titel: Antworten mit Zitat

@TimesChange: Du könntest die fraglichen Variablen ja auch mit Dim Shared... als globale Variablen deklarieren. Dann kannst du wie einst bei GOSUB ohne Parameterübergabe von jedem Unterprogramm aus uneingeschränkt darauf zugreifen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 15.12.2013, 16:33    Titel: Antworten mit Zitat

@grindstone: Ja, DIM SHARED würde das Problem auch lösen.
Das fände ich aber nicht so "elegant", da es hier nur um temporäre "Hilfsvariablen" geht, die nur kurzfristig innerhalb einer Sub benötigt werden.
In diesem speziellen Fall werde ich vermutlich sogar ganz darauf verzichten, den ehemaligen GOSUB-Block in eine Sub auszulagern, da er nur von 2 oder 3 Stellen innerhalb der Routine aufgerufen wird, und nur wenige Zeilen lang ist. Da erscheint es mir vertretbar, dieselben paar Zeilen an 2 oder 3 Stellen im Programm einzufügen.
Was anderes wäre es, wenn diese Subroutine umfangreicher wäre, oder von mehr Stellen aus aufgerufen werden würde.


Grüße
Rainer


P.S. @all: Ich hoffe, dass ich (hier und in meinen anderen Fragen) nicht undankbar wirke, wenn mir manche Vorschläge nicht "passen".
Ohne den hilfreichen Input hier aus dem Forum hätte ich's schon aufgegeben...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 15.12.2013, 17:38    Titel: Antworten mit Zitat

Du kannst globale und lokale Variablen je nach Bedarf beliebig kombinieren. Das ist nicht unelegant, sondern äußerst praktisch und macht die Programmierung sehr flexibel.

Wenn du einige wenige Programmzeilen hast, die an mehreren Stellen identisch auftauchen, kannst du sie auch als Makro definieren und wie einen Unterprogrammaufruf an den entsprechenden Stellen platzieren. Der Kompiler fügt die Programmzeilen dann so ein, als wenn du sie dort explizit hingeschrieben hättest. Etwas störend ist nur, daß ein Makro vor seinem ersten Aufruf definiert werden muß. So etwas wie Declare gibt es für Makros nicht.

TimesChange hat Folgendes geschrieben:
Ich hoffe, dass ich (hier und in meinen anderen Fragen) nicht undankbar wirke, wenn mir manche Vorschläge nicht "passen".
Jeder hat seinen eigenen Programmierstil, dazu gehört manchmal auch der Wunsch, etwas so und nicht anders lösen zu wollen. lächeln
Irgendwann kannst du sicher auch die "nicht passenden" Lösungen gebrauchen (behalte sie daher im Hinterkopf). Und außerdem gibt es da ja auch noch eine ganze Anzahl von Mitlesern im Hintergrund (jetzt oder in Zukunft), die dabei sicher den einen oder anderen "Aha-Effekt" erleben.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



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

BeitragVerfasst am: 15.12.2013, 19:40    Titel: Antworten mit Zitat

Es wäre noch zu überlegen, ob statt eines Strings fester Länge einer mit variabler Länge reichen würde. Ggf. kann er ja mit LEFT gekürzt werden. Die Feldlänge müsstest du übrigens gar nicht übergeben, LBOUND und UBOUND wird bei der Übergabe mitgeliefert. Außer du willst nicht das ganze Feld verwenden.
_________________
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
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 08.01.2014, 01:29    Titel: Antworten mit Zitat

Jetzt hänge ich nochmal eine aktuelle Frage hier dran, da wir eh schon über Fixed Strings als Parameter gesprochen haben.

Grundsätzlich kann ich ja auch einen String fester Länge an eine Sub/Function übergeben, die einen STRING erwartet.
Zu meiner Überraschung funktioniert das in folgendem Beispiel auch, wenn der String ein 0-Byte enthält:
Code:
DIM S as String*20
Declare Sub Druck (St as String)

   S="Hallo"+CHR(0)+"Du"
   Druck(S)
   ? "done..."
   sleep
end

Sub Druck (St as String)
   ? "*";St;"*"
end Sub


Es wird "HalloDu" ausgegeben (warum das chr(0) einfach "verschluckt wird, verstehe ich allerdings nicht).

Das nächste Beispiel ist näher an meiner Anwendung (ich habe Datumswerte in einem 4-Byte-String fester Länge gespeichert. Eine Funktion soll z.B. das Datum im Format "TT.MM.JJJJ" ausgeben).
Hier übergebe ich eine Integer-Zahl, die mittels MKI in einem (fixed-)String gespeichert wurde, an eine Funktion. Die Zahl im Beispiel ist so gewählt, dass 0-Bytes enthalten sind.
Hier wird nicht nur der fixed-String "falsch" übergeben, sondern zu allem Überfluss wird auch der ursprüngliche Inhalt des String durch die Übergabe geändert.
Und das verstehe ich nun überhaupt nicht mehr.

Code:
DIM as integer Z
DIM as STRING*4 SF

Declare Function Value (S as String) as integer

   Z=65537
   SF=MKI(Z)
     
   Print "Zahl original     : "; CVI(SF)
   Print "Wert              : "; Value(SF)
   Print "Zahl nach Function: "; CVI(SF)
   Print "Done..."
   sleep
         
End


Function Value (S as String) as integer
   Value=CVI(S)
end function


Kann mich jemand erhellen ?
Ganz egal ob FB die Parameter per ByRef (Standard bei Stings, bei Fixed Strings?) oder ByVal übergibt, dürfte sich der Inhalt der übergebenen Variablen doch nicht ändern, wenn die aufgerufene Funktion nichts verändert ?!?

Grüße
Rainer


P.S.: Ich finde FreeBasic wirklich eine tolle Sache, aber die Stringbehandlung ist zum mit dem Kopf durch die Mauer wollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HorstD



Anmeldungsdatum: 01.11.2007
Beiträge: 110

BeitragVerfasst am: 08.01.2014, 03:07    Titel: Antworten mit Zitat

Zitat:
Kann mich jemand erhellen ?


Die Funktion erwartet einen String, du übergibst aber einen String * 4.

Konnte ich jetzt nicht mit FB testen.
PB kommt mit einer Fehlermeldung.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1279
Wohnort: Ruhrpott

BeitragVerfasst am: 08.01.2014, 09:05    Titel: Antworten mit Zitat

Ich bin auch erstaunt. Offenbar ist es nicht erlaubt, einen String mit fester Länge als Parameter an eine Function zu übergeben. verwundert In der Befehlsreferenz habe ich dazu nichts gefunden. Mit einem String ohne Längenfestlegung arbeitet das Programm korrekt.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 08.01.2014, 12:39    Titel: Binär-Rohdaten-Umwandlungen nach String sind nicht nötig Antworten mit Zitat

Hallo,

wenn man entweder ZString als Argumenttyp verwendet oder den String BYVAL übergibt, wird die Variable immerhin durch den Funktionsaufruf nicht beschädigt. Ich glaube, mich dunkel zu erinnern, dass FB intern für Strings fester Länge ZString benutzt.
Allerdings kommt auch dann in der Funktion nicht der richtige Wert an, weil ja bei 0 terminiert wird und die "Binärzeichenkette" mit einem Nullbyte anfängt.

Generell muss man aber sagen, dass solche Binär-Rohdaten-Umwandlungen von Typ (Integer, Double, ...) zu String in FreeBASIC vollkommen überflüssig sind. Das macht eigentlich keiner mehr. Wozu sollte man die 4 Bytes eines Integers o. ä. erst in einen 4 Byte langen String packen, wenn man mit dem Integer direkt alles machen kann?

Man kann z. B. einen Pointer, der eigentlich auf einen Integer zeigt, auch mit CAST als Pointer auf einen Float "umdeuten" und dann so den Integer-Rohinhalt als Gleitkommazahl interpretieren lassen. Mir fällt spontan nichts in FB ein, wofür man mit MKI / CVI und Konsorten String-Operationen auf Binärdaten machen müsste (Rückwärtskompatibilität zu alten QB-Programmen von "anno dazumal" einmal ausgenommen).

Stattdessen kann man sich z. B. mit (C)ALLOCATE Speicherblöcke beliebiger Länge erstellen lassen. Oder man kann ein UBYTE()-Array verwenden. Dann hat man auch gleich Zugriff auf die einzelnen Bytes und muss sie nicht mit MID(...) aus einem n Byte langen String raussuchen.
Die primitiven Datentypen kann man in FB auch direkt in Dateien schreiben und auslesen (Dateimodus BINARY). Also man muss einen Integer nicht erst in einen 4-Byte-Binärstring verwandeln, um ihn als 4-Byte-Datum in eine Datei zu schreiben (statt als Dezimalrepräsentation variabler Länge).

Vielleicht kannst du den Anwendungsfall konkret beschreiben. Dann finden sich vielleicht bessere Lösungen als diese String-Umwandlungen. Die Rohdaten, z. B. eines Integers oder einer Gleitkommazahl, erst nach String umzuwandeln, um dann etwas damit zu tun, ist in FB einfach überflüssig geworden. In FB hat man auf jedes Byte direkten Zugriff, ohne solche Umwege ("von hier aus über Oslo nach Rom reisen") einbauen zu müssen, die auch noch für Fehler sorgen können. lächeln

Du kannst ja mal dieses Beispiel hier testen:
Code:
Declare Sub ShowBytes (byval x As Integer)


Dim i As Integer

i = 65537
'i = 255

Print "Wert im Dezimalsystem:  " & i

Print "Ein Integer hat wie viele Bytes? " & SizeOf(Integer)

Print "Wert im Dualsystem:     " & Bin(i, SizeOf(Integer)*8)  'Anzahl Bytes * 8 Bits



Print "---"
ShowBytes(i)
Print "---"

Print "i dezimal nach der SUB: " & i

Const Dateiname = "TimesChange.dat"

Print
Print "Schreibe den Integer in die Datei " & Dateiname & "..."

'Datei "blanko" ueberschreiben:
Open Dateiname For Output As #1
Close #1
' => Datei ist jetzt leer / ueberschrieben.

'Den Integer in die Datei schreiben:
Open Dateiname For Binary As #1
Put #1, , i
Close #1
' => Die Datei ist jetzt genau 4 Bytes lang, egal, welchen Wert der Integer hat.

Print "Fertig."

Sleep
End




Sub ShowBytes (byval x As Integer)
   'http://de.wikipedia.org/wiki/Byte-Reihenfolge
   dim b As UByte Ptr
   b = Cast(UByte Ptr, @x)  'Zeiger auf Integervariable als Zeiger auf Byte umdeuten
   for i As Integer = 1 To SizeOf(Integer)   'Die Bytes des Integers durchlaufen
      Print "Das " & i & ". Byte in deinem Integer ist:  &H" & Hex(*b, 2) & "  (oder dezimal: " & *b & ")"
      b += 1   ' Pointer um 1 erhoehen, um zum naechsten Byte zu kommen
   next i
End Sub


Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



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

BeitragVerfasst am: 08.01.2014, 15:09    Titel: Antworten mit Zitat

Zitat:
Zu meiner Überraschung funktioniert das in folgendem Beispiel auch, wenn der String ein 0-Byte enthält

Ein String darf durchaus 0-Bytes enthalten; diese können dann halt am Bildschirm nicht dargestellt werden. Sie terminieren aber den String nicht. ZSTRING und WSTRING dürfen im Gegensatz dazu kein 0-Byte enthalten bzw. werden von diesem terminiert.
_________________
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
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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