 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 07:58 Titel: Einige Befehle aus BlitzBasic? |
|
|
Vielleicht hätte ich das hier lieber offtopic posten sollen, al eine Art Stellenangebot, nur dachte ich, ich frag erstmal hier.
Und zwar benötige ich ein paar Befehle aus der Blitzbasic Syntax hier in Freebasic.
Ich bin aber wahrscheinlich noch zu sehr noob in Freebasic um sie selber nachzubilden.
Als da wären einige Befehle Speicherbänke betreffend, und noch ein paar andere.
Nun weiß ich nicht, ob mir jemand hier helfen würde, oder ob jemand gegen einen kleinen Obolus diese Aufgabe übernehmen möchte.
Eine weitere Frage wäre, ob man sowas ausse als .bi auch als .dll machen könnte um es allgemein verwenden zu können.
Wenn mir jemand helfen möchte, würde ich mich freuen.
Es würde sich um weniger als 10 Befehle handeln.
Über Antworten freue ich mich. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 22.10.2008, 09:08 Titel: |
|
|
Wenn Du "noch zu sehr Noob" bist, kennst Du wahrscheinlich die Möglichkeiten von FreeBasic noch gar nicht. Zeig uns mal die Befehle und schreib dazu, was sie machen sollen. Vermutlich gibt es zumindest einige Parallelen in FreeBasic. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 10:01 Titel: |
|
|
Mein Problem ist, dass ich absolut nicht weiß, wie man diese Befehle damit nachbaut.
Ich konvertiere grad ein relativ großes Projekt von Blitz nach FreeBasic, daher mein "Zeitdruck" und meine Frage nach Hilfe, da mir diese Befehle eben fehlen.
Wie gesagt, wenn mir jemand hilft, muss es ja nicht umsonst sein.
Ausserdem durch das bisherige gewurschtel mit Freebasic(positiv gemeint) habe ich mich schon ziemlich weit in dessen Syntax einarbeiten können, nur eben diese Sachen fehlen mir halt noch auf jeden Fall.
Und meine zweite Frage war auch noch, ob man, nach Erstellung dieser Funktionen, diese zumindest teilweise innerhalb einer dll sogar für andere sprachen nutzen kann?
Das aber nur am Rande.
Also ich wäre wahnsinnig froh und dankbar, wenn mir jemand bei dieser Befehlsumsetzung helfen würde.
Weil ich sonst hier im Moment leider nicht weiterkomme.
[edit] achja, ReadBytes liest aus einer Speicherbank, nicht aus einer Datei wie ReadInt! |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 22.10.2008, 11:10 Titel: |
|
|
Wie schon gesagt: Die Befehle müssen nicht "nachgebaut" werden, es gibt sie bereits. Wie Du sie einsetzt, steht jeweils in der Befehlsreferenz mit drin.
Als Beispiel:
Code: |
Dim Variable as Byte
Dim pPointer as Variable PTR
pPointer = allocate(1*Len(Byte)) '(Alloziieren des Speichers, Rückgabewert ist die Adresse)
Oder:
pPointer = VARPTR(Variable)
bzw.
pPointer = @Variable '(einfache Abfrage der Adresse von "Variable")
'Das @ entspricht der Funktion VARPTR()
|
Der Unterschied:
Ein Pointer, dem per VARPTR(bzw. @) eine Adresse zugewiesen wurde, wird nach Abschluß der Funktion, in der das geschieht, ungültig. Der Speicher (den der Pointer beansprucht!) wird frei und die darin enthaltene Adresse wird verworfen.
Ein per Allocate angeforderter Speicher bleibt nach Abschluß der Funktion gültig, bis Deallocate() ausgeführt wird. Du mußt also den Pointer schon VOR der Funktion einrichten und ihn an die Funktion übergeben, damit sich das Programm den Speicherbereich merkt. Anderenfalls kannst Du den Speicher nicht wieder freigeben (Deallocate) und produzierst Speicherleaks.
Zugriff auf den Speicherbereich: Da gibt es keinen Unterschied zwischen einer alloziierten Speicheradresse und eine Variablenadresse.
Bei PokeByte wäre das z. B.
Code: |
Poke Byte, pPointer, 1
Moderne Schreibweise:
*pPointer = 1
Für PokeInt:
Poke Integer, (Adresse), (Wert)
|
Für Adresse und Wert kann man natürlich auch gültige Variablen übergeben.
Genaueres kannst Du in der Befehlsreferenz unter Pointer nachlesen.
http://www.freebasic-portal.de/index.php?s=reftopic&id=386
So schwer ist das doch nicht...
Zu Deiner zweiten Frage: Natürlich kann man compilierten FreeBasic-Code auch als dll verwenden. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 11:26 Titel: |
|
|
Zitat: | Du mußt also den Pointer schon VOR der Funktion einrichten und ihn ByRef an die Funktion übergeben |
das habe ich jetzt nicht so richtig verstanden?
Code: | Dim Variable as Byte
Dim pPointer as Variable PTR
pPointer = allocate(1*Len(Byte)) |
das sozusagen bevor ich solch eine speicherbank brauche, richtig?
Und pPointer wäre dann 1 Speicherbank.
Könnte auch pPointer2,pPointer2 ect. geben, richtig?
oder habe ich das jetzt falsch verstanden?
aber du hast recht, ist ja der selbe befehl, eigentlich.
eins hab ich noch nicht verstanden: (1*Len(Byte)) warum dieses? warum nicht einfach nur Byte? |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 22.10.2008, 11:47 Titel: |
|
|
Heiko hat Folgendes geschrieben: | Zitat: | Du mußt also den Pointer schon VOR der Funktion einrichten und ihn ByRef an die Funktion übergeben |
das habe ich jetzt nicht so richtig verstanden?
|
allocate ist eine Anweisung an das Betriebssystem, Speicher zu reservieren. Danach bleibt der Speicher so lange reserviert, bis Deallocate(pPointer) ausgeführt wird.
Wenn Du in der selben Funktion den Pointer erstellst und gleichzeitig den Speicher alloziierst, wird beim Abschluß der Funktion der Pointer ungültig. Der Speicher bleibt aber weiter reserviert, weil das Betriebssystem noch auf Deallocate wartet. Da Du den Pointer nicht mehr hast, kannst Du auf den reservierten Speicher nicht mehr zugreifen und ihn auch nicht mehr freigeben- auch nicht bei einem neuen Funktionsaufruf. Der Speicher ist dann für das Programm nicht mehr verfügbar ("Speicherloch"). Wenn man das öfters macht, kann es im Speicher eng werden.
Zitat: |
Code: | Dim Variable as Byte
Dim pPointer as Variable PTR
pPointer = allocate(1*Len(Byte)) |
das sozusagen bevor ich solch eine speicherbank brauche, richtig?
Und pPointer wäre dann 1 Speicherbank.
Könnte auch pPointer2,pPointer3 ect. geben, richtig?
|
Richtig. Ein Pointer ist eigentlich nur eine Integer-Variable, in der eine Speicheradresse abgelegt wird. Folglich kann er jeden beliebigen Namen haben. Ich markiere einen Pointer immer mit einem kleinen p(daher "pPointer"), das entspricht der ungarischen Notation.
Zitat: |
eins hab ich noch nicht verstanden: (1*Len(Byte)) warum dieses? warum nicht einfach nur Byte? |
Allocate(1) geht auch. Allocate erwartet einen Wert, der die Anzahl der reservierten Bytes angibt.
Weil Du mit allocate Speicher für jeden Datentyp alloziieren kannst, also auch selbst erstellte Datentypen. Allocate (1) würde nur eine einzige Speicherzelle (1Byte) reservieren. LEN() gibt die Größe des Datentyps zurück, auf diese Weise wird allocate stets genau die richtige Speichergröße übergeben. Macht bei allocate(1*LEN(Byte)) vielleicht nicht Sinn, weil ohnehin nur 1 Byte gebraucht wird. Als Standartschreibweise ist es aber flexibel brauchbar. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 11:58 Titel: |
|
|
okay hab ich jetzt fast verstanden.
Nur das hier immer noch nicht:
Zitat: | Wenn Du in der selben Funktion den Pointer erstellst und gleichzeitig den Speicher alloziierst, wird am Ende der Pointer ungültig. |
wie meinst du das? in der selben funktion?
Sollte ich demzufolge einfach eine funktion schreiben, in der sagen wir mal 10 pPointer1-10 deklarieren?
Also so:
Code: | Dim Variable as Byte
Dim pPointer1 as Variable PTR
Dim pPointer2 as Variable PTR
Dim pPointer3 as Variable PTR |
und die benutzung dann irgendwo im restlichen code oder in anderen funktionen dann eben per pPointer1-10 = allocate(1*Len(Byte))?
was aber ziemlich umständlich ist, oder?
war das so gemeint?
Oder kannst du einfach ein kleines beispiel bringen, wo ich sehe, wie das nun richtig anzuwenden ist.
danke dir. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 12:03 Titel: |
|
|
ohhh sorry, sollte kein doppelpost werden....eigentlich edit.
cool wäre es nämlich, wenn ich einfach eine funktion schreiben könnte, die eben Createbank(byte) heißen würde, aber diese deklarationen für jedes krümel ist schon manchmal etwas nervig.
kann man das nicht umgehen?
also dieses DIM ist echt krass, kann man das nicht weglassen.
Bei anderen Basic geht das ja auch irgendwie.
oder es müßte nen menüpunkt geben, wo man in fbedit z.b. alle variablen anklickt, die vom selben typ sind, und da wird dann eben ein DIM-code erzeugt.
Ich hab berge von solchen sachen, bisschen einfacher geht es nicht, oder?
I hate DIM...smile.
achja, nochwas:WICHTIG.
Kann man so einen Befehl, eben als Funktion CreateBank(Byte) schreiben, als DLL verpacken und auch mit anderen anwendungen nutzen.
Andere sprachen etc. ?
geht das?
ähm, Wäre nicht statt Code: | DIM Variable AS BYTE
DIM pPointer AS Variable PTR |
Nicht auch
Code: | DIM pPointer AS BYTE PTR |
einfacher?
Zuletzt bearbeitet von Heiko am 22.10.2008, 13:15, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 22.10.2008, 13:09 Titel: |
|
|
Zunächst mal macht es keinen Sinn,
Code: |
Dim pPointer1 as Variable PTR
Dim pPointer2 as Variable PTR
Dim pPointer3 as Variable PTR |
zu schreiben. Da würde ich die Pointer in ein Array zusammenfassen und die Werte per Zählschleife zuweisen:
Beispiel:
Code: |
Dim C As Integer 'Zähler für die Schleife
Dim i (10) As Integer 'erstellt ein Array mit 10 Integern
Dim Pointerarray(10) as Integer Ptr 'erstellt ein Array mit 10 Pointern
For C = 1 To 10 'Zählschleife
i (c) = 2*C 'weist den Elementen des Integer-Arrays je einen Wert zu
Pointerarray (C) = @i(c) 'Weist den Elementen des Pointerarrays die Adressen der Integer-Elemente zu.
Next
For C = 1 To 10
Print "Pointer";c; "=";*Pointerarray(c) 'greift über die Pointer auf die Integerelemente zu
Next
sleep |
entsprechend mit Allocate.
Zitat: |
okay hab ich jetzt fast verstanden.
Nur das hier immer noch nicht:
Zitat: |
Wenn Du in der selben Funktion den Pointer erstellst und gleichzeitig den Speicher alloziierst, wird am Ende der Pointer ungültig.
wie meinst du das? in der selben funktion? |
|
In FreeBasic sind Pointer oder Variablen, die durch DIM erstellt werden, nur innerhalb des jeweiligen Funktionsblocks oder der jeweiligen Fuction/ Sub gültig. Eine Variable, die ein einer For-Next-Schleife geDIMt wird, wird bei Erreichen des NEXT ungültig und beim neuen Schleifendurchlauf neu geDIMt.
Darum wird ein Pointer, der in einer Funktion erstellt wird, am Ende der Funktion gelöscht und ist nicht mehr verfügbar. Ausnahme: Variablen, die mit STATIC deklariert werden, bleiben bis zum nächsten Funktionsaufruf erhalten, sind aber außerhalb der Funktion nicht sichtbar.
Zitat: | cool wäre es nämlich, wenn ich einfach eine funktion schreiben könnte, die eben Createbank(byte) heißen würde, aber diese deklarationen für jedes krümel ist schon manchmal etwas nervig.
kann man das nicht umgehen?
| Oben beschrieben.
Auf das DIM kannst Du nicht verzichten. Jede Variable muß vor der Verwendung dimensioniert werden. In QBasic/QuickBasic war das nicht nötig. FreeBasic lehnt sich damit an die anderen Hochsprachen an.
Du kannst aber mehrere Variablen gleichzeitig dimensionieren:
Code: | DIM as Integer A, B, C,... |
Eine Funktion wie CreateBank(byte) ist in FreeBasic nicht möglich, weil Du nur Variablen, aber nicht Datentypen an einer Funktion übergeben kannst.
Zum Schluß: Dlls enthalten immer kompilierten Code, sind also sprachenunabhängig. Du kannst also eine FreeBasic-DLL auch in einem Pascal- oder C-Programm verwenden. _________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 13:30 Titel: |
|
|
Zitat: | Eine Funktion wie CreateBank(byte) ist in FreeBasic nicht möglich, weil Du nur Variablen, aber nicht Datentypen an einer Funktion übergeben kannst. |
warum nicht?
Createbank(bte AS BYTE) würde es ja doch heißen.
wird doch eine variable bzw. ein wert AS BYTE übergeben.
Ich hab gedacht, sooo könnte eine DLL aussehen.
Code: | Dim Createbank As Function (bte As Byte) As Integer
Dim Initbanks As Function () As Any ptr
Function Createbank (bte As Byte)
pPointer = allocate(1*Len(Bte))
Return pPointer
End Function
Function Initbanks () As Any PTR
Dim Shared pPointer AS BYTE PTR
Return 0
End Function |
das mit deinen jeweiligen zuweisungen in deinem code gerade eben, habe ich noch nicht verstanden.
Könntest du das einbauen, und mir vorallem sagen, ob mein code gehen würde?
wenn nein warum nicht, und ob das irgendwie hinzubekommen ist? |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 22.10.2008, 13:52 Titel: |
|
|
Heiko hat Folgendes geschrieben: | Zitat: | Eine Funktion wie CreateBank(byte) ist in FreeBasic nicht möglich, weil Du nur Variablen, aber nicht Datentypen an einer Funktion übergeben kannst. |
warum nicht?
|
Darum. Frag die Programmierer, die FB erfunden haben.
Zitat: |
Createbank(bte AS BYTE) würde es ja doch heißen.
wird doch eine variable bzw. ein wert AS BYTE übergeben. |
Das ist der Funktionsheader. Das bedeutet, daß CreateBank einen Wert oder eine Variable des Typs Byte erwartet. Es kann aber nicht ein Datentyp übergeben werden, sondern muß als Wert oder Variable (oder Referenz der Variale) übergeben werden.
Zitat: |
Ich hab gedacht, sooo könnte eine DLL aussehen.
Code: | Dim Createbank As Function (bte As Byte) As Integer
Dim Initbanks As Function () As Any ptr
Function Createbank (bte As Byte)
pPointer = allocate(1*Len(Bte))
Return pPointer
End Function
Function Initbanks () As Any PTR
Dim Shared pPointer AS BYTE PTR
Return 0
End Function |
das mit deinen jeweiligen zuweisungen in deinem code gerade eben, habe ich noch nicht verstanden.
Könntest du das einbauen, und mir vorallem sagen, ob mein code gehen würde?
wenn nein warum nicht, und ob das irgendwie hinzubekommen ist? |
Ich kann Dir auch nichts anderes schreiben, als in der Befehlsreferenz (meine Links oben) steht. Schlag Dich ruhig ein bißchen damit rum.
Nur so viel:
DIM SHARED in einer Funktion geht nicht. SHARED bedeutet, daß die Variable global- also in allen Programmteilen- sichtbar ist. Da sie am Ende der Funktion ungültig wird, kann sie nicht Shared sein.
Shared-Variablen müssen also im globalen Scope deklariert werden.
Funktionen werden nicht geDIMt, sondern deklariert. Laß das DIM AS vor der Funktionsdeklaration weg!
Code: | Declare Function CreateBank(bte as Byte) as Integer |
_________________ Und die Grundgebihr is aa scho drin- DOS is jo nett. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.10.2008, 14:02 Titel: |
|
|
btw, die laufvariable für for-schleifen sollte man lieber so deklarieren:
Code: |
for i as integer = 1 to 10
...
next
|
wird übersichtlicher als überall eine globale variable für sowas oder so ähnlich zu deklarieren. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.10.2008, 14:47 Titel: |
|
|
Dies ist ein Beispiel ( http://www.blitzforum.de/help/CreateBank ) aus BB umgesetzt in FB.
Evtl. hilft dir dies Gemeinamkeiten zu erkennen und schneller zu übersetzen:
Code: | #Include "crt.bi" 'wegen memcpy (dest,sorce,count)
#Define CreateBank Allocate
#Define ResizeBank ReAllocate
#Define FreeBank DeAllocate
#Define WaitKey GetKey
'BankID = CreateBank(5000)
Dim BankID As Byte Ptr = CreateBank(5000)
For t As Integer = 0 To 4999
'PokeByte BankID,t,RAND(9)
Poke Byte ,BankID+t, Int(Rnd*9)
'oder und besser
BankID[t] = Int(Rnd*9)
Next
ResizeBank BankID,10000
'CopyBank BankID,0,BankID,5000,5000
memcpy BankID+5000,BankID,5000
'Print BankSize(BankID)
Print 10000 'oder in Variable merken
FreeBank BankID
WaitKey |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 15:06 Titel: |
|
|
Mmmmmm ich geb zu, so richtig seh ich da jetzt nicht durch, aber Sebastian hat mir schon versucht zu helfen.
Ich poste mal ein Beispiel, und die dazugehörige include, vielleicht wißt ihr, warum sich alles aufhängt beim starten.
So, hier der Code...
Code: | #Include "mems1.bi"
Dim bnkTest As BBBank
Dim As Integer i, Ergebnis
Screen 18
bnkTest = CreateBank(50)
PokeByte bnkTest,0,10
Print Using "### "; PeekByte (bnkTest,0);
FreeBank bnkTest
Sleep
End
|
Die Include...
Code: | #define BBBank Any Ptr
FUNCTION CreateBank(ByVal Bytes As Integer) As Any Ptr
Return Allocate(Bytes)
END FUNCTION
SUB FreeBank (ByVal Bank As Any Ptr)
DeAllocate Bank
END SUB
FUNCTION PeekByte (ByVal Bank As Any Ptr, ByVal Offset As Integer) As UByte
Dim x As UByte Ptr
x = cast(UByte Ptr, Bank)
Return *(x+Offset)
END FUNCTION
SUB PokeByte (ByVal Bank As Any Ptr, ByVal Offset As Integer, ByVal Wert As UByte)
Dim x As UByte ptr
x = cast(UByte Ptr, Bank)
*(x+Offset) = Wert
END SUB
FUNCTION ReadBytes (ByVal Bank As Any Ptr, ByVal stream As Integer, ByVal offset As Integer, ByVal anzahl As Integer) As Integer
Dim i As Integer
Dim B As UByte
If anzahl < 1 Then Return 0
For i = 0 TO anzahl-1
If Eof(stream) Then Return i
Get #stream,,B
*(cast(UByte Ptr,Bank)+offset+i) = B
Next i
Return anzahl
END FUNCTION
SUB PokeInt (ByVal Bank As Any Ptr, ByVal Offset As Integer, ByVal Wert As Integer)
Dim x As Integer Ptr
x = Cast(Integer Ptr,Bank)
*(x+Offset) = Wert
END SUB
FUNCTION PeekInt (ByVal Bank As Any Ptr, ByVal Offset As Integer) As Integer
Dim x As Integer Ptr
x = cast(Integer Ptr, Bank)
Return *(x+Offset)
END FUNCTION
FUNCTION SeekFile (ByVal stream As Integer, ByVal Offset As Integer) As Integer
SEEK #stream, Offset
RETURN Offset
END FUNCTION
|
|
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 15:27 Titel: |
|
|
ach sch.......
hängt sich auch auf......
mmmmm aber bei meinem xors3d wrapper geht alles....
hab bei FBEdit windows gui angeklickt, obwohl wär doch egal, oder, hab ich bei meinem wrapper auch.
ahhhhhh es geht, super
wäre erstmal nur noch das mit den ReadBytes, das schau ich mir dann an, ob man das ändern müsste, wie du sagstes. |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 22.10.2008, 17:21 Titel: |
|
|
Mix mit Sebastians Routinen:
Code: | #Include "is_b.bi"
Dim BankID As Any Ptr 'ohne DIM gibt es nur Warnhinweise!!
BankID = CreateBank(5000)
For t = 0 To 4999 'kein Dim t as integer :))
PokeByte(BankID,t,Int(Rnd*9)) 'muss in Klammern
Next
ResizeBank BankID,10000
CopyBank(BankID,0,BankID,5000,5000) 'muss in Klammern
'Print BankSize(BankID)
Print 10000 'oder in Variable merken
FreeBank BankID
WaitKey | mit is_b.bi
Code: | #lang "deprecated"
#Include "crt.bi" 'wegen memcpy (dest,sorce,count)
#Define CreateBank Allocate
#Define ResizeBank ReAllocate
#Define FreeBank DeAllocate
#Define CopyBank(quelle,start1,ziel,start2,anzahl) memcpy(ziel+start2,quelle+start1,anzahl)
#Define PokeByte(Bank,Offset,Wert) Cast(UByte Ptr, Bank)[Offset]= Wert
#Define PeekByte(Bank,Offset) Cast(UByte Ptr, Bank)[Offset]
#Define PokeInt(Bank,Offset,Wert) Cast(Integer Ptr, Bank)[Offset]= Wert
#Define PeekInt(Bank,Offset) Cast(Integer Ptr, Bank)[Offset]
#Define PokeShort(Bank,Offset,Wert) Cast(UShort Ptr, Bank)[Offset]= Wert
#Define PeekShort(Bank,Offset) Cast(UShort Ptr, Bank)[Offset]
#Define PokeFloat(Bank,Offset,Wert) Cast(Single Ptr, Bank)[Offset]= Wert
#Define PeekFloat(Bank,Offset) Cast(single Ptr, Bank)[Offset]
#Define CloseFile(stream) Close #stream
#Define WaitKey GetKey
Function ReadBytes (Bank As Any Ptr, stream As Integer, Offset As Integer, anzahl As Integer) As Integer
If anzahl < 1 Then Return 0
For i = 0 To anzahl-1
If EOF(stream) Then Return i
Get #stream,,(Cast(UByte Ptr,Bank)[Offset+i])
Next i
Return anzahl
End Function
Function SeekFile (stream As Integer, Offset As Integer) As Integer
Seek #stream, Offset
Return Offset
End Function |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 22.10.2008, 17:25 Titel: |
|
|
schon getestet?
ReadBytes muss so geändert werden....
Start -End bezogen sich auf die bank, muss aber auf die gestreamte datei zeigen.
Code: | FUNCTION ReadBytes (ByVal Bank As Any Ptr, ByVal stream As Integer, ByVal offset As Integer, ByVal anzahl As Integer) As Integer
Dim i As Integer
Dim B As UByte
If (anzahl < 1) OR (offset >= LOF(stream)) OR (offset < 0) Then Return 0
Seek #stream,(offset+1)
For i = 0 TO anzahl-1
If Eof(stream) Then Return i
Get #stream,,B
*(cast(UByte Ptr,Bank)+i) = B
Next i
Return anzahl
END FUNCTION
|
und ist es möglich, dass man alle paramter hinter den befehlen in klammern angeben muss.
das verwirrt sonst ein wenig.
ausserdem müssten das in meinem fall eventuell später eh alles funktionen sein, da ich nebenbei auch noch eine dll draus machen möchte. |
|
Nach oben |
|
 |
|
|
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.
|
|