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