Seite 1 von 1
Portierung von Pb5.0 auf Pb5.62
Verfasst: 01.10.2021 16:41
von bvlaar
Hallo,
bin neu hier und habe folgendes Problem: Ich muss alten PB-Code von 5.0 auf 5.62 portieren. Den Code habe ich nicht geschrieben. Es wurde mit einer
alten Zeiger-Variante gearbeitet.
Kann mir jemande sagen, wie ich es umschreiben muß?
Code: Alles auswählen
Global mx,my,mk,soundplay.b,sprache.b,bewegt.b,winx,winy,winh,winb,oldergebnis,sampelrate
Procedure play()
If soundload=0
Goto playraus
EndIf
Shared *start,sampelrate
If sampelrate<44101
If samplebyte=16
*my.l=@insound()
Else
*my.l=@insound8()
EndIf
CatchSound(0, *my)
PlaySound(0)
StatusBarText(#StatusBar_Window_0, 2,"Sound Pos. :",#PB_StatusBar_Right)
soundplay=1
Else
MessageRequester(translate("Fehler"),translate( "Samplerate über 44100"), 0)
EndIf
playraus:
EndProcedure
Falls ich es richtig verstanden habe, sind Zeiger so, wie dem Beispiel nicht mehr verwendbar.
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 01.10.2021 17:29
von Axolotl
Willkommen im deutschen Forum.
Probier mal die Zeiger *my.l ohne den Datentyp, also nur *my.
Bin gerade nicht am Rechner mit purebasic, deshalb nur als Vorschlag
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 01.10.2021 17:44
von bvlaar
...o.k. der Compiler hat dort nicht mehr gemeckert. Aber wie es bei solchen Portierungen ist, fliegt er an der nächsten Stelle ´raus

.
Bei "*mem\l='FFIR' :*mem+4" kommt der nächste Ausstieg. Da ich auch etwas in der Doku lese, kann es sein, dass die Sterne stören?
Code: Alles auswählen
Structure PBUnion
StructureUnion
b.b
w.w
l.l
f.f
EndStructureUnion
EndStructure
*sound = mem
*mem.PBUnion = *sound
*mem\l = 'FFIR' : *mem+4 ; riff-chunk-ID "RIFF"
*mem\l = 36 + datachunkBytes : *mem+4 ; normally filesize minus (these) 8 Bytes
*mem\l = 'EVAW' : *mem+4 ; wave-chunk-ID "WAVE"
*mem\l = ' tmf' : *mem+4 ; format-chunk-ID "FMT "
*mem\l = 16 : *mem+4 ; chunk data size (+ Extra Format Bytes)
*mem\w = 1 : *mem+2 ; compression code
*mem\w = mychannels : *mem+2 ; number of channels
*mem\l = mysamplerate : *mem+4 ; samplerate
*mem\l = myavBytesPerSec : *mem+4 ; average bytes per second, (channels)*(block align)*(samplerate)
*mem\w = mybitrate/8*mychannels : *mem+2 ; Block Align ('bytes per sample')
*mem\w = mybitrate : *mem+2 ; Bits per sample
*mem\l = 'atad' : *mem+4 ; data-chunk-ID "DATA"
*mem\l = datachunkBytes : *mem+4 ; data chunk size in byes
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 01.10.2021 23:28
von STARGÅTE
Früher wurden die EXEn im ASCII Format kompiliert, daher hatte der String 'FFIR' nur 4 Bytes.
Mit den neueren Versionen wurde aber zu Unicode gewechselt, sodass die Strings in den Hochkomma nun je 2 Byte pro Zeichen hat, in deinem Fall also 8 Byte.
Dein Code (oder der Code) ist also in der Form nicht mehr möglich.
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 02.10.2021 01:53
von bvlaar
Danke für den Hinweis. Hast Du eine Idee, wie man es in den Griff bekommt? Wie geht man heute mit solchen Probkemen um?
Denn das Problem existiert ja weiterhin.
Kann man die Zeichenkette 'FFIR' in 4 ASCII-Variablen packen und über einen Operator verknüpfen, so dass ich bei meinen 4 Byte bleibe?
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 02.10.2021 03:31
von Demivec
bvlaar hat geschrieben: 02.10.2021 01:53Kann man die Zeichenkette 'FFIR' in 4 ASCII-Variablen packen und über einen Operator verknüpfen, so dass ich bei meinen 4 Byte bleibe?
Hier:
Code: Alles auswählen
PokeS(*mem, "RIFF", 4, #PB_Ascii | #PB_String_NoZero) : *mem+4 ; riff-chunk-ID "RIFF"
*mem\l = 36 + datachunkBytes : *mem+4 ; normally filesize minus (these) 8 Bytes
PokeS(*mem, "WAVE", 4, #PB_Ascii | #PB_String_NoZero) : *mem+4 ; wave-chunk-ID "WAVE"
PokeS(*mem, "fmt ", 4, #PB_Ascii | #PB_String_NoZero) : *mem+4 ; format-chunk-ID "FMT "
*mem\l = 16 : *mem+4 ; chunk data size (+ Extra Format Bytes)
*mem\w = 1 : *mem+2 ; compression code
*mem\w = mychannels : *mem+2 ; number of channels
*mem\l = mysamplerate : *mem+4 ; samplerate
*mem\l = myavBytesPerSec : *mem+4 ; average bytes per second, (channels)*(block align)*(samplerate)
*mem\w = mybitrate/8*mychannels : *mem+2 ; Block Align ('bytes per sample')
*mem\w = mybitrate : *mem+2 ; Bits per sample
PokeS(*mem, "data", 4, #PB_Ascii | #PB_String_NoZero) : *mem+4 ; data-chunk-ID "DATA"
*mem\l = datachunkBytes : *mem+4 ; data chunk size in byes
Oder mit macro:
Code: Alles auswählen
Macro SetIDType(_adr_, _IDType_)
PokeS((_adr_), _IDType_, 4, #PB_Ascii | #PB_String_NoZero)
EndMacro
SetIDType(*mem, "RIFF") : *mem+4 ; riff-chunk-ID "RIFF"
*mem\l = 36 + datachunkBytes : *mem+4 ; normally filesize minus (these) 8 Bytes
SetIDType(*mem, "WAVE") : *mem+4 ; wave-chunk-ID "WAVE"
SetIDType(*mem, "fmt ") : *mem+4 ; format-chunk-ID "FMT "
*mem\l = 16 : *mem+4 ; chunk data size (+ Extra Format Bytes)
*mem\w = 1 : *mem+2 ; compression code
*mem\w = mychannels : *mem+2 ; number of channels
*mem\l = mysamplerate : *mem+4 ; samplerate
*mem\l = myavBytesPerSec : *mem+4 ; average bytes per second, (channels)*(block align)*(samplerate)
*mem\w = mybitrate/8*mychannels : *mem+2 ; Block Align ('bytes per sample')
*mem\w = mybitrate : *mem+2 ; Bits per sample
SetIDType(*mem, "data") : *mem+4 ; data-chunk-ID "DATA"
*mem\l = datachunkBytes : *mem+4 ; data chunk size in byes
@Edit: Umbenanntes Makro.
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 02.10.2021 14:17
von bvlaar
....danke, arbeite seit einigen Stunden daran. Das eine Problem scheint gelöst zu sein. Jetzt rebelliert eine andere Stelle bei einem Readfile() und
Fileseek(). Der Compiler ist der Ansicht, dass die Datei nicht initialisiert sei. Die zu öffnende Datei wurde in eine Struktur geschoben, worauf sich die
Folgeoperationen beziehen. Während 5.0 locker hinwegsah, ist 5.62 nicht der Ansicht.

.
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 02.10.2021 16:58
von Axolotl
Ohne Beispiel ist es immer schwierig. Also nur ein vorsichtiger Versuch ...
Bei der Grundkonstallation von PB 5.0 zu PB 5.6 und ReadFile würde ich bei ASCII vs. UNICODE u.ä. schauen...
z.B. ReadStringFormat()
kurze Zeichenketten kann man auch so in einem Integer unterbringen:
Code: Alles auswählen
Debug Hex(('T' << 24) | ('R' << 16) | ('C' << 8) | 'X') ; == 54524358
Debug Hex('T') ; == 54
Debug Hex('R') ; == 52
Debug Hex('C') ; == 43
Debug Hex('X') ; == 58
Re: Portierung von Pb5.0 auf Pb5.62
Verfasst: 03.10.2021 21:24
von Demivec
bvlaar hat geschrieben: 02.10.2021 14:17
....danke, arbeite seit einigen Stunden daran. Das eine Problem scheint gelöst zu sein. Jetzt rebelliert eine andere Stelle bei einem Readfile() und
Fileseek(). Der Compiler ist der Ansicht, dass die Datei nicht initialisiert sei. Die zu öffnende Datei wurde in eine Struktur geschoben, worauf sich die
Folgeoperationen beziehen. Während 5.0 locker hinwegsah, ist 5.62 nicht der Ansicht.

.
Meine Vermutung:
Code: Alles auswählen
;eine Beispielstruktur für Daten
Structure WAVEFILEHEADER
; RIFF Header
riffid.l ; 'RIFF'
filezize.l
waveid.l ; 'WAVE'
; Format chunk
fmtid.l ; 'fmt '
fmtlength.l
wFormatTag.w
nChannels.w
nSamplesPerSec.l
nAvgBytesPerSec.l
nBlockAlign.w
bitspersample.w
; Data chunk
dataid.l ; 'data'
DataLength.l
EndStructure
Define whdr.WAVEFILEHEADER
Macro SetIDType(_adr_, _IDType_)
PokeS((_adr_), _IDType_, 4, #PB_Ascii | #PB_String_NoZero)
EndMacro
Macro CheckIDType(_adr_, _IDType_)
Bool(PeekS((_adr_), 4, #PB_Ascii) = _IDType_)
EndMacro
;If ReadData(*This\FileNo, @whdr, SizeOf(WAVEFILEHEADER)) = SizeOf(WAVEFILEHEADER)
SetIDType(@whdr\riffid, "RIFF"): SetIDType(@whdr\waveid, "WAVE")
;If whdr\riffid = 'FFIR' And whdr\waveid = 'EVAW'
If CheckIDType(@whdr\riffid, "RIFF") And CheckIDType(@whdr\waveid, "WAVE")
Debug "match"
EndIf