PB5.30 geht.... PB5.50 bringt Fehler !

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von RSBasic »

@Bisonte & @ts-soft
Stimmt, ihr habt recht. :mrgreen:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Then
Beiträge: 287
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von Then »

Sorry, bin zu dämlich....

Code: Alles auswählen

wav_datei$="D:\Haussteuerung\1.wav" 
If ReadFile(0,wav_datei$ )
    riff$="" 
    For i=1 To 4
     riff$+Chr(ReadCharacter(0))
    Next
    gr=ReadLong(0)
    wave$=""
    For i=1 To 4
     wave$+Chr(ReadCharacter(0))
    Next
    fmt$=""
    For i=1 To 4
     fmt$+Chr(ReadCharacter(0))
    Next
    fmt_length=ReadLong(0)
    format_tag=ReadWord(0)
    channels=ReadWord(0)
    sample_rate=ReadCharacter(0 ,#PB_Ascii)
    bytes_per_second=ReadCharacter(0 ,#PB_Ascii)
    block_align=ReadWord(0)
    bits_per_sample=ReadWord(0)
    dat$=""
    For i=1 To 4
     dat$+Chr(ReadCharacter(0))
    Next
    data_length=ReadCharacter(0 ,#PB_Ascii)
    *buffer=AllocateMemory(data_length)
    ReadData(0, *buffer, data_length)
    CloseFile(0)  
   EndIf
läuft nicht :o WARUM ???
PB 6.10LTs / Windows 11 64Bit 25H2

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von RSBasic »

Du hast noch 4 weitere ReadCharacter(). Dort musst du auch explizit #PB_Ascii angeben.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Then
Beiträge: 287
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von Then »

dann kommt aber wieder ein anderer Fehler :

[13:02:37] Executable gestartet.
[13:02:37] [ERROR] Zeile: 28
[13:02:37] [ERROR] AllocateMemory(): Kann keinen Speicherbereich mit der Größe 0 allokieren.
[13:02:54] Das Programm wurde beendet.
[13:02:58] [COMPILER] Zeile 5: Chr(): Falsche Zahl an Parametern.


In der Hilfe steht, dass man bei Compiler-Optionen das Häkchen bei Unicode rausnehmen kann, dieser Eintrag steht ja gar nicht in den Optionen mehr drin ??
PB 6.10LTs / Windows 11 64Bit 25H2

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von RSBasic »

Then hat geschrieben:In der Hilfe steht, dass man bei Compiler-Optionen das Häkchen bei Unicode rausnehmen kann, dieser Eintrag steht ja gar nicht in den Optionen mehr drin ??
Ja, weil die Version 5.50 standardmäßig nur noch Unicode ist. ASCII wurde entfernt:
Changelog hat geschrieben:- Removed: ASCII mode for internal PureBasic string representation, PureBasic is now unicode only.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Then
Beiträge: 287
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von Then »

... dennoch läuft der Code nicht und bringt andere Fehler :oops:

könnt ihr den Code nicht mal testen und lauffähig machen ? :cry:
PB 6.10LTs / Windows 11 64Bit 25H2

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von alter Mann »

ich schätze mal

Code: Alles auswählen

,#PB_Ascii
an der falschen Stelle

Code: Alles auswählen

riff$+Chr(ReadCharacter(0),#PB_Ascii) ; FALSCH

Code: Alles auswählen

riff$+Chr(ReadCharacter(0,#PB_Ascii)) ; RICHTIG
Win11 64Bit / PB 6.0
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von Bisonte »

Du hast da auch noch mehr als nur EIN ReadCharacter() drin stehen.

Du gehst ja davon aus, dass dein Chunk an bestimmten Positionen bestimmte Werte enthält.
Im Ascii wäre nach einlesen des riff$ der Zeiger an 5. Position... Bei Unicode ist der schon um einige Ecken weiter..
Daher muss JEDER ReadCharacter() Aufruf mit dem ASCII Flag benutzt werden...

Und wenn wir das für dich lauffähig machen... dann lernt man doch nix. ;)

Und beim nächstenmal, wenn du wieder vor so einem Problem stehst, weisst du dann nicht Warum/Wieso/Weshalb...
und wieder du das selber hinbiegen kannst ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von DarkSoul »

Du liest stumpf eine Datei aus, ohne zu überprüfen, ob du überhaupt richtig liegst.

Das ist zum Scheitern verurteilt, wie du gerade bemerkt hast.

Du solltest unbedingt überprüfen, ob die gelesenen Daten überhaupt gültig sind. (Allerspätestens, wenn der AllocateMemory kommt)

Was würde passieren, wenn jemand eine .mp3 nimmt, die in .wav umbenennt und die in dein Programm lädt? Im blödesten Fall AllocateMemory(wasLongMaxValueHergibt) :twisted:

Was würde passieren, wenn der Block mit den Wave-Daten 0 Byte oder 20GB groß ist?

RIFF WAVE ist ohnehin nur ein Container. Neben unkomprimiertem PCM (das es auch in allen möglichen Bittiefen und Sampleraten gibt) kann da auch ADPCM, A-Law, MP3, OGG usw. drinstecken. Berücksichtigst du das?

Warum überhaupt sperrige Wave-Dateien für eine Lichtsteuerung? Die Datenmengen empfinde ich als übertrieben. Was willst du z.B. mit einer Lampe, die zum 3000Hz-Ton flackert? Das könnte man gar nicht sehen. :shock:

Wäre es nicht besser, mit einer Sequenz zu arbeiten, wie: "halbdunkel -> 1s warten -> werde langsam hell -> 5s warten -> gehe aus....und nochmal von vorne"? Oder mit Funktionsgeneratoren? :)

Zu deinem Problem:
data_length=ReadCharacter(0 ,#PB_Ascii)
Der Datenlängeneintrag ist 4 Byte groß. Das wäre Long. Du ließt aber nur das erste Byte.

Gleiche mal hiermit ab:
http://soundfile.sapp.org/doc/WaveFormat/

Du musst die verschiedenen Datentypen der Struktur im Header schon genau einhalten, sonst wird das nichts. :)

Und sowieso immer prüfen, prüfen, prüfen.... und mit Fehlermeldung den Lesevorgang abbrechen, wenn was nicht gültig ist. Manche Wave-Dateien haben z.B. noch einen Block Metadaten zwischen "fmt" und "data" oder auch am Ende nach dem "data"-Block.

Gerade mit RIFF WAVE hast du dir ein Format ausgesucht, wo theoretisch ALLES drin stecken kann. Man könnte da sogar Bilder oder Texte reinstopfen, wenn man wollte. Manche Programme können das sogar lesen und zeigen das Bild, wenn in den vermeintlichen PCM-Daten auf einmal ein kompletter JPEG-Header kommt.

Ansonsten ist ein HEX-Editor für sowas ganz hilfreich, weil man dann ein "lebendes Beispiel" vor Augen hat.
Bild
Benutzeravatar
Then
Beiträge: 287
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: PB5.30 geht.... PB5.50 bringt Fehler !

Beitrag von Then »

Wie schon geschrieben, benutze NUR ich das Programm für meine Haussteuerung und da kommt kein MP3 als WAV ... :shock: Es gibt da kein Wenn... dann...

Das mit dem Stumpf auslesen gebe ich mal weiter an Captain_Hesse, denn von dem habe ich den Code aus diesem Forum :

http://purebasic.fr/german/viewtopic.ph ... v+grafisch

Aber dann schreibe ich lieber im 5.30 weiter.... immer diese Veränderungen und nix läuft mehr :cry:

__________________________________________________
Domain angepasst
24.11.2016
RSBasic
PB 6.10LTs / Windows 11 64Bit 25H2

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Antworten