Fehler beim Füllen einer Struktur
-
Kannst Du mir bitte die Seitennummer von der Bibel verraten?
Welcher Kapitelüberschrift trät diese Seite?Ich besitze selbst so ein Exemplar, so daß ich nachsehen kann ob es ein Bug ist.
Bitte auch gleich das Erscheinungsjahr (oder die wievielte Ausgabe?) mit angeben.
Martin
-
Beschrieben ist das ganze im Kapitel 22 im Programm "WAKEUP.C" S. 1226 ff
5. Auflage aus 2000 Sonderausgabe als Taschenbuch.
-
Danke,
werde ich am Wochenende nachschlagen
-
Soweit scheint es jetzt zu funzen...alerdings wird bei PlaySound nichts abgespielt...
WAVEFORM wf = { { 'R', 'I', 'F', 'F' }, nDataSize + 36, { 'W', 'A', 'V', 'E' }, { 'f', 'm', 't', ' ' }, sizeof(PCMWAVEFORMAT), { { WAVE_FORMAT_PCM, 1, 8000, 16000, 2 }, 16 }, { 'd', 'a', 't', 'a' }, nDataSize }; FILE* pWaveFile = fopen(WaveDataFile, "rb"); fseek(pWaveFile, 0, SEEK_SET); WAVEFORM *pWaveForm; short *pData; pData =(short*)malloc(sizeof(short)*nWaveSize); pWaveForm = (WAVEFORM*)malloc(sizeof(WAVEFORM) + nDataSize); *pWaveForm = wf; for(int i = 0; i < nDataSize; i++) { fread(pWaveForm->byData+i, 1, 1, pWaveFile); } fclose(pWaveFile); if(!PlaySound((PTSTR)pWaveForm, NULL, SND_MEMORY | SND_LOOP | SND_ASYNC )) MessageBox(NULL, "NoSound", "Error", MB_OK);PlaySound gibt allerdings TRUE zurück nur aus den Lautsprechern kommt nix raus...
Ist das mit dem auslesen der WaveDatei denn wohl korrekt?
-
mr. main schrieb:
Hab es jetzt so gemacht wie Martin Richter das beschrieben hat. Werd es mal testen jetzt lässt es sich zumindest kompilieren...
Dank an alle...
Aber echt mal scheiße wenn es in einer angeblichen Bibel für Windows Programmierung so falsch beschrieben wird...
Ich würde mal eher sagen, dass dies am alten "VC6" Compiler gelegen hat, der hier einfach keinen Fehler gemeldet hat.
Der hat einfach die Initialisierungen ausgeführt der Reihe nach und die Array Bound Überschreitungen sind gar nicht aufgefallen. Da der nachfolgende Wert ja korrekt gesetzt wurde.
-
Ja das kann natürlich wirklich so sein...
-
So, hab mir den besagten Kapitel von Petzolds "Windows-Programmierung" angesehen.
Kann da keinen Fehler erkennen.Zunächst einmal:
mr. main schrieb:
Aber echt mal scheiße wenn es in einer angeblichen Bibel für Windows Programmierung so falsch beschrieben wird...
So langsam werde ich aber ein wenig ungemütlich.
Mein Kommentar dazu:
Aber echt mal scheiße wenn ein Anfänger nicht in der Lage ist ein Bespielprogramm aus einer anerkannten Bibel zum Laufen zu bringen.
(ich habe nur Deine Worte wiederverwendet)Denn dort steht ganz klar geschrieben:
... WriteFile (hFile, "RIFF", 4, &dwWritten, NULL) ; ...Womit exakt 4 Bytes in eine Datei geschrieben werden. Die Struktur wird später mit dem Inhalt dieser Datei aufgefüllt.
mr. main schrieb:
Wie gesagt hab das nur aus dem Buch übernommen...
Von einer Initialisierung einer Struktur (so wie Du sie hier gepostet hast) keine Spur!
Schönes Wochenende!
-
Ich kann das nicht bestätigen.
Hier mal die entsprechende Passage aus dem Programm:LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndDTP, hwndCheck, hwndPush ; static WAVEFORM waveform = { "RIFF", NUMSAMPS + 0x24, "WAVE", "fmt ", sizeof (PCMWAVEFORMAT), 1, 1, SAMPRATE, SAMPRATE, 1, 8, "data", NUMSAMPS } ;Soweit ich mich erinnere, steht es genau so in dem Buch. Im Moment kann ich das nicht verifizieren, da ich es im Büro liegen habe. Aber ich habe das schon mal im Verlauf dieses Threads direkt im Buch nachgeschlagen und kann die Angaben von Mr.Main bestätigen.
PS: Hab das EBook hier gerade gefunden, da ist es abgedruckt, wie oben beschrieben.
-
Der Compiler hat recht. Dieser Initialisierungscode ist falsch.
Sie meine Antwort mit der korrekten Sequenz. Wenn man keine 0 Terminierung will muss man die einzelnen charss angeben.
-
Nachtrag:
Aber echt mal scheiße wenn man selber nicht alle Codezeilen in einem gedruckten Buch einzeln nacheinander durchforstet.
Tatsächlich ist so eine Initialisierung im Code enthalten.
In der gedruckten Fassung hab ich diese Passage übersehen!
Ganz klar Asche auf mein Haupt... WriteFile (hFile, "RIFF", 4, &dwWritten, NULL) ; ...Durch das Vorhandensein dieser "klassischen" Initialisierung (wenn auch als Umweg über Datei) habe ich eine weitere Initialisierung (so wie sie mr. main beschrieben hat) übersehen.
Sorry für meinen vorschnellen Komentar.
Martin