Seite 3 von 3
Re: Structure + Memory + WriteData
Verfasst: 15.02.2010 21:11
von ts-soft
Man übergibt keine Strukturen an Proceduren, die werden nur definiert, um damit
benutzerdefinierte Variablen oder strukturierte Pointer zu erstellen. Strukturen sind
immer Global, egal wo man sie definiert
Was das mit den hundertausend Datensätzen im moment mit dem Thema zu tun hat
ist mir auch nicht ganz klar. Sicherlich meinst Du einen bestimmten Bereich einer
strukturierten Variable als Pointer zu übergeben, das war hier aber nicht Thema.
Gruß
Thomas
Re: Structure + Memory + WriteData
Verfasst: 15.02.2010 21:18
von Kaeru Gaman
ja blablabla, natürlich rede ich von Strukturierten Variablen und nicht den Strukturen selber!
und er hat gefragt, wie er sie an Prozeduren übergeben kann, und üblicher Weise macht man das per Referenz, weil man üblicherweise MEHRERE davon hat und nicht nur eine. und er hat auch eingangs keinesfalls explizit herausgestellt dass er nur eine hat, also was?
btw: Strukturen sind nicht Global. sie haben überhaupt kein Scope.
sie sind compilerintern und existieren zur Laufzeit nicht namentlich, nur noch die Offsets bleiben übrig.
Re: Structure + Memory + WriteData
Verfasst: 16.02.2010 17:21
von mk-soft
Zurück zu WriteData und ReadData mit Struckturen. War schon mal und habe es bei mir wieder gefunden.
Code: Alles auswählen
;-TOP
; Comment : Get und Put Strukturdaten
; Author : mk-soft, Germany
; Second Author :
; File : .pb
; Version : 1.01
; Create :
; Update :
;
; Compilermode :
; *****************************************************************************
#FileDB = 0
Procedure OpenDB(name.s)
If OpenFile(#FileDB, name)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure CloseDB()
If IsFile(#FileDB)
CloseFile(#FileDB)
EndIf
EndProcedure
Procedure GetDB(id, *pdata, size)
Protected max, pos, len
If IsFile(#FileDB) = #False
ProcedureReturn #False
EndIf
max = Lof(#FileDB)
max / size
max - 1
If id > max
ProcedureReturn #False
EndIf
pos = id * size
FileSeek(#FileDB, pos)
len = ReadData(#FileDB, *pdata, size)
If len = size
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure PutDB(id, *pdata, size)
Protected max, pos, len
If IsFile(#FileDB) = #False
ProcedureReturn #False
EndIf
max = Lof(#FileDB)
max / size
If id > max
ProcedureReturn #False
EndIf
pos = id * size
FileSeek(#FileDB, pos)
len = WriteData(#FileDB, *pdata, size)
If len = size
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndProcedure
; *****************************************************************************
Structure udtData
Name.s{20}
Price.d
Units.l
EndStructure
Global dataOut.udtData, dataIn.udtData
Debug "Open DB"
If OpenDB("TestDB.DAT")
Debug "Ok."
Else
Debug "Error Open"
End
EndIf
Debug Lof(#FileDB)
Debug "Put..."
For id = 0 To 10
With dataOut
\Name = "Name ID " + Str(id)
\Price = 10.5 + id
\Units = 100 + id
EndWith
If PutDB(id, dataOut, SizeOf(udtData))
Debug "PutDB Ok."
Else
Debug "PutDB Error"
EndIf
Next
Debug "Change..."
id = 5
With dataOut
\Name = "Hallo Welt: " + Str(id)
\Price = 99.8
\Units = 1000
EndWith
If PutDB(id, dataOut, SizeOf(udtData))
Debug "PutDB Ok."
Else
Debug "PutDB Error"
EndIf
Debug "Get..."
For id = 0 To 11
If GetDB(id, dataIn, SizeOf(udtData))
With dataIn
Debug "ID : " + Str(id)
Debug "Name : " + \Name
Debug "Price : " + StrD(\Price)
Debug "Units : " + Str(\Units)
EndWith
Else
Debug "GetDB Error"
EndIf
Next
CloseDB()
FF
