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:

Einige Befehle aus BlitzBasic?
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
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 07:58    Titel: Einige Befehle aus BlitzBasic? Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 09:08    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 28.07.2008
Beiträge: 101

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

mmm okay...

http://www.blitzforum.de/help/CreateBank
http://www.blitzforum.de/help/FreeBank
http://www.blitzforum.de/help/PeekByte
http://www.blitzforum.de/help/ReadBytes
http://www.blitzforum.de/help/PokeInt
http://www.blitzforum.de/help/PokeByte

http://www.blitzforum.de/help/ReadInt
http://www.blitzforum.de/help/SeekFile

so, das wären glaub ich erstmal die, die mir spontan einfallen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 09:45    Titel: Antworten mit Zitat

Zitat:

CreateBank
FreeBank

Dafür dürften sich allocate/reallocate/deallocate eignen: http://www.freebasic-portal.de/index.php?s=reftopic&id=38

Zitat:
ReadBytes+ ReadInt

Dazu suchen bei open (Dateioperation). Bei Open kannst Du angeben, ob aus der Datei gelesen, geschrieben oder frei zugegriffen werden soll.
http://www.freebasic-portal.de/index.php?s=reftopic&id=233

Zitat:
SeekFile

http://www.freebasic-portal.de/index.php?s=reftopic&id=378

Zitat:
PeekByte

Peek gibt es auch in FreeBasic, allerdings kannst Du die Breite des gelesenen Wertes selbst festlegen:
http://www.freebasic-portal.de/index.php?s=reftopic&id=471

Zitat:
PokeInt+PokeByte

Für Poke gilt das gleiche wie für Peek.
http://www.freebasic-portal.de/index.php?s=reftopic&id=476

Anmerkung: Statt Peek/Poke verwendet man in FreeBasic eher Pointer-Operationen (Speicherzeiger). Entspricht mehr den übleichen Hochsprachen (C/Pascal) und ist z. B. bei Verwendung von UDTs praktischer (finde ich!)
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 10:01    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 11:10    Titel: Antworten mit Zitat

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... zwinkern

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



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 11:26    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 11:47    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 11:58    Titel: Antworten mit 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?
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
Benutzer-Profile anzeigen Private Nachricht senden
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 12:03    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 13:09    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 13:30    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 22.10.2008, 13:52    Titel: Antworten mit Zitat

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.Zunge rausstrecken
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. Zunge rausstrecken
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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 22.10.2008, 14:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.10.2008, 14:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 15:06    Titel: Antworten mit Zitat

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


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 22.10.2008, 15:18    Titel: Antworten mit Zitat

Hallo!

Bei mir funktioniert dein Beispielprogramm ohne Probleme:



Kannst du denn unabhängig von den Speicherfunktionen
Code:
SCREEN 18
PRINT "Hallo Welt"
SLEEP
END

ausführen oder hängt sich das auch auf?

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
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 15:27    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 22.10.2008, 17:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Heiko



Anmeldungsdatum: 28.07.2008
Beiträge: 101

BeitragVerfasst am: 22.10.2008, 17:25    Titel: Antworten mit Zitat

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