Portierung von Pb5.0 auf Pb5.62

Für allgemeine Fragen zur Programmierung mit PureBasic.
bvlaar
Beiträge: 4
Registriert: 01.10.2021 16:21

Portierung von Pb5.0 auf Pb5.62

Beitrag 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.
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
bvlaar
Beiträge: 4
Registriert: 01.10.2021 16:21

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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 
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
bvlaar
Beiträge: 4
Registriert: 01.10.2021 16:21

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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?
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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.
Zuletzt geändert von Demivec am 03.10.2021 20:55, insgesamt 1-mal geändert.
Bild
bvlaar
Beiträge: 4
Registriert: 01.10.2021 16:21

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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. :-) .
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Portierung von Pb5.0 auf Pb5.62

Beitrag 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
Bild
Antworten