<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Probleme bei schwieriger c++ Programmieraufgabe]]></title><description><![CDATA[<p>Hallo, ich bin noch ein ziemlicher Neuling in Sachen programmieren und<br />
muss nun, zumindest für mich, schwierige Programmieraufgabe lösen:</p>
<p>Es geht darum WAV Dateien in c++ zu manipulieren.</p>
<p>-Die erste Aufgabe besteht darin, die &quot;readWaveHeader&quot; und<br />
printWaveheader&quot; Funktionen so zu implementieren, dass sie<br />
Informationen zu einem WAV-File nach folgendem Schema ausgeben:</p>
<p>Codec: PCM, 44100Hz, 16bitm 1 channel: Length 9.81 sec</p>
<p>-In Aufgabe zwei soll die &quot;readWaveHeader&quot; so umprogrammiert werden,<br />
dass sie eine Fehlermeldung ausgibt, wenn eine WAV-Datei nicht die<br />
Eigenschaften:<br />
&quot;Codec: PCM, 44100Hz, 16bit, 1 channel&quot; erfüllt.</p>
<p>-Dann soll als drittens die &quot;writeWaveHeader&quot; so implementiert werden,<br />
dass sie ein Waveheader in einen Output-Stream schreibt.</p>
<p>-Dann ist noch angegeben, dass das Programm folgendes Unterstüzen<br />
sollte:<br />
1.) Wenn das Programm mit dem -totext Parameter aufgerufen wird, soll<br />
eine Textdatei (out.text) erzeugt werden, welche die einzelnen<br />
Samples(short) als ASCII Zahl auflistet.<br />
2.) Wenn das Programm mit dem -volume Parameter aufgerufen wird, soll<br />
das Programm die Lautstärke der Eingabedatei ändern. Ein float Parameter<br />
soll den Faktor angeben.<br />
3.) Wenn das Programm mit dem -mix Parameter aufgerufen wird, kann es<br />
zwei Audiodateien mischen.<br />
4.) Wenn das Programm mit dem -echo Parameter aufgerufen wird, soll ein<br />
Echoeffekt erzeugt werden. Der erste Parameter soll die Verzögerung, der<br />
zweite die Lautstärke des Echos angeben.</p>
<p>Was ich bisher geschafft habe ist folgendes:</p>
<pre><code class="language-cpp">[code]
/********************************************************************
	purpose:	A simple PCM Wave File Editing TOOL

	created:	2010/11/08
	filename: 	audio_tmpl.cpp
	author:		

*********************************************************************/

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;
#include &lt;limits.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

struct WAVEHEADER {
	char	ChunkID[4];	//          Contains the letters &quot;RIFF&quot; in ASCII form
	int		ChunkSize;
	int		Format;
	char	Subchunk1ID[4];
	int		Subchunk1Size;
	short	AudioFormat;
	short	NumChannels;
	int		SampleRate;
	int		ByteRate;
	short	BlockAlign;
	short	BitsPerSample;
	char	Subchunk2ID[4];
	int		Subchunk2Size;
};

//---------------------------------------------------------
// helper functions
//---------------------------------------------------------

/*
* Gibt wave file header Informationen in der Console aus;
* \param hdr: wavefile hdr
*/
void printWaveHeaderInfos( WAVEHEADER *hdr) {
	if(NULL == hdr) {
		cerr &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot; &lt;&lt; endl;
	}
	if(hdr-&gt;AudioFormat == 1 &amp;&amp; hdr-&gt;SampleRate == 44100 &amp;&amp; hdr-&gt;BitsPerSample == 16 &amp;&amp; hdr-&gt;NumChannels ==1 )  {
		cout &lt;&lt; &quot;Codec: &quot;;
		if (hdr-&gt;AudioFormat == 1) {
			cout &lt;&lt; &quot;PCM, &quot;;
		}
		else {
			cout &lt;&lt; &quot;This is not a PCM file! &quot;;
		}
		cout &lt;&lt; hdr-&gt;SampleRate &lt;&lt; &quot; Hz, &quot;;
		cout &lt;&lt; hdr-&gt;BitsPerSample &lt;&lt; &quot;bit, &quot;;
		cout &lt;&lt; hdr-&gt;NumChannels &lt;&lt; &quot; channel, &quot;;
		cout &lt;&lt; &quot;Length &quot; &lt;&lt; ((hdr-&gt;Subchunk2Size * 8.0) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels) / (hdr-&gt;SampleRate)) &lt;&lt; &quot; sec&quot; &lt;&lt; endl;
	} else {
		cout &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot;;
	}

	// outpout
	// codec, sampling rate, sampling precision, channels, length

}

/*
 * Liest den Waveheader und checkt ob das Format unterstuetzt wird;
 * \param fin: ifstream.
 * \return: NULL in case of error, waveheader else
 */
WAVEHEADER *readWaveHeader(ifstream *fin) {
	WAVEHEADER *hdr = NULL;

	//benutze die read Funktion um binaere Daten zu lesen
	hdr = new WAVEHEADER;

	fin-&gt;read((char*)hdr, sizeof(WAVEHEADER));
	/* TODO */
	if (fin-&gt;eof() || fin-&gt;fail() || fin-&gt;bad()){
		WAVEHEADER *hdr = NULL;
	}

	printWaveHeaderInfos(hdr);

	return hdr;
	delete [] hdr;
}

/*
 * Schreibt den Waveheader
 * \param fin: ifstream.
 * \param hdr: wavefile hdr
 * \return: false in case of an write error
 */
bool writeWaveHeader(ofstream *fout, WAVEHEADER *hdr) {

	if(NULL == hdr)
		return false;

	fout-&gt;write((char*)hdr, sizeof(WAVEHEADER));

	if (fout-&gt;eof() || fout-&gt;fail() || fout-&gt;bad()){
		WAVEHEADER *hdr = NULL;
	}

	// save hdr into file

	return true;
}

//---------------------------------------------------------
// Commands
//---------------------------------------------------------

/*
 * Fuer den Commando -info
 * \param fin: ifstream.
 */
void waveFileInfo( char * filename ) {

	//oeffne die Datei filename als binaere Datei (fin)
	ifstream fin(filename, ios::in | ios::binary);

	if( !fin.is_open() ) {
		cerr &lt;&lt; filename &lt;&lt; &quot; not found.&quot; &lt;&lt; endl;	
	} else {
		WAVEHEADER *hdr = readWaveHeader(&amp;fin);
		delete hdr;
	}
} 

void convertWaveFile( char infile[], char outfile[] )  
{
	cout &lt;&lt; &quot;Trying to convert wavefile to text:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void volumeWaveFile( char infile[], char outfile[], double gain )  
{
	cout &lt;&lt; &quot;Changing Volume:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; (s*gain) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void mixWaveFiles( char infile1[], char infile2[], char outfile[] )  
{
	cout &lt;&lt; &quot;Mixing 2 audio files:&quot; &lt;&lt; endl;

	ifstream fin1(infile1, ios::in | ios::binary);
	ifstream fin2(infile2, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr1 = NULL;
	WAVEHEADER *hdr2 = NULL;

	hdr1 = new WAVEHEADER;
	hdr2 = new WAVEHEADER;

	hdr1 = readWaveHeader(&amp;fin1);
	hdr2 = readWaveHeader(&amp;fin2);

	int samples1 = (hdr1-&gt;Subchunk2Size * 8) / (hdr1-&gt;BitsPerSample) / (hdr1-&gt;NumChannels);
	short s1 = samples1;

	int samples2 = (hdr2-&gt;Subchunk2Size * 8) / (hdr2-&gt;BitsPerSample) / (hdr2-&gt;NumChannels);
	short s2 = samples2;

	if (s1&gt;s2) {
		writeWaveHeader(&amp;fout , hdr1);
	}

	if (s1&lt;s2) {
		writeWaveHeader(&amp;fout , hdr2);
	}

	if (s1&gt;s2) {
		for (int i= 0; i&lt;s1; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl;
		}
	}

	if (s1&lt;s2) {
		for (int i= 0; i&lt;s2; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl; 
		}
	}

	delete [] hdr1;
	delete [] hdr2;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void echoWaveFile( char infile[], char outfile[], double delay, double echo_gain )  
{
	cout &lt;&lt; &quot;Adding echo:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s+((s-1)*(s-2)) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

//---------------------------------------------------------
// main
//---------------------------------------------------------
int main(int argc, char *argv[])
{
	char *command = &quot;-info&quot;;
	char **parms = &amp;argv[1];
	int parms_count = argc - 1;

	if(argc &gt; 1 &amp;&amp; argv[1][0] == '-') {
		command = argv[1];
		parms = &amp;argv[2];
		parms_count--;
	}

	// -info command standard case prints info of the given file
	if(!strcmp(command, &quot;-info&quot;)) {
		if(parms_count &gt;= 1) {
			waveFileInfo(parms[0]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Call &quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; [-info] wavefile&quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; -help : \tfor more help&quot; &lt;&lt; endl;
			return 1;
		}
	}

	// -help command
	if(!strcmp(command, &quot;-help&quot;)) {
		cout &lt;&lt; &quot;Help:&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -totext wavfile_in  textfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -volume gain wavfile_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -mix    wavfile1_in wavfile2_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -echo   delay strength wavfile_in wavfile_out&quot; &lt;&lt; endl;

		return 0;
	}

	// -totext command
	if(!strcmp(command, &quot;-totext&quot;)) {
		if(parms_count &gt;= 2) {
			convertWaveFile( parms[0], parms[1]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -vol command
	if(!strcmp(command, &quot;-volume&quot;)) {
		if(parms_count &gt;= 3) {
			volumeWaveFile( parms[1], parms[2], atof(parms[0]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -mix command
	if(!strcmp(command, &quot;-mix&quot;)) {
		if(parms_count &gt;= 3) {
			mixWaveFiles( parms[0], parms[1], parms[2]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -echo command
	if(!strcmp(command, &quot;-echo&quot;)) {
		if(parms_count &gt;= 4) {
			echoWaveFile( parms[2], parms[3], atof(parms[0]), atof(parms[1]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	cin.get();
	cin.get();
	return 0;
}
</code></pre>
<p>Kompilieren tut es schonmal ohne Probleme. Doch ich kann einfach keine Eingaben tätigen um Audiofiles (.WAV) zu manipulieren, da sich die cmd sofort schliesst.<br />
Ich habe schon versucht zu Debuggen und herausgefunden, dass der Fehler irgendwo bei der Funktion &quot;WAVEHEADER *readWaveHeader(ifstream *fin) {...}&quot; ist.<br />
Sieht vielleicht Jemand was ich falsch mache in der Funktion?</p>
<p>Gruss Hans</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295513/probleme-bei-schwieriger-c-programmieraufgabe</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 11:15:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295513.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Nov 2011 19:43:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme bei schwieriger c++ Programmieraufgabe on Tue, 15 Nov 2011 19:43:21 GMT]]></title><description><![CDATA[<p>Hallo, ich bin noch ein ziemlicher Neuling in Sachen programmieren und<br />
muss nun, zumindest für mich, schwierige Programmieraufgabe lösen:</p>
<p>Es geht darum WAV Dateien in c++ zu manipulieren.</p>
<p>-Die erste Aufgabe besteht darin, die &quot;readWaveHeader&quot; und<br />
printWaveheader&quot; Funktionen so zu implementieren, dass sie<br />
Informationen zu einem WAV-File nach folgendem Schema ausgeben:</p>
<p>Codec: PCM, 44100Hz, 16bitm 1 channel: Length 9.81 sec</p>
<p>-In Aufgabe zwei soll die &quot;readWaveHeader&quot; so umprogrammiert werden,<br />
dass sie eine Fehlermeldung ausgibt, wenn eine WAV-Datei nicht die<br />
Eigenschaften:<br />
&quot;Codec: PCM, 44100Hz, 16bit, 1 channel&quot; erfüllt.</p>
<p>-Dann soll als drittens die &quot;writeWaveHeader&quot; so implementiert werden,<br />
dass sie ein Waveheader in einen Output-Stream schreibt.</p>
<p>-Dann ist noch angegeben, dass das Programm folgendes Unterstüzen<br />
sollte:<br />
1.) Wenn das Programm mit dem -totext Parameter aufgerufen wird, soll<br />
eine Textdatei (out.text) erzeugt werden, welche die einzelnen<br />
Samples(short) als ASCII Zahl auflistet.<br />
2.) Wenn das Programm mit dem -volume Parameter aufgerufen wird, soll<br />
das Programm die Lautstärke der Eingabedatei ändern. Ein float Parameter<br />
soll den Faktor angeben.<br />
3.) Wenn das Programm mit dem -mix Parameter aufgerufen wird, kann es<br />
zwei Audiodateien mischen.<br />
4.) Wenn das Programm mit dem -echo Parameter aufgerufen wird, soll ein<br />
Echoeffekt erzeugt werden. Der erste Parameter soll die Verzögerung, der<br />
zweite die Lautstärke des Echos angeben.</p>
<p>Was ich bisher geschafft habe ist folgendes:</p>
<pre><code class="language-cpp">[code]
/********************************************************************
	purpose:	A simple PCM Wave File Editing TOOL

	created:	2010/11/08
	filename: 	audio_tmpl.cpp
	author:		

*********************************************************************/

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;
#include &lt;limits.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

struct WAVEHEADER {
	char	ChunkID[4];	//          Contains the letters &quot;RIFF&quot; in ASCII form
	int		ChunkSize;
	int		Format;
	char	Subchunk1ID[4];
	int		Subchunk1Size;
	short	AudioFormat;
	short	NumChannels;
	int		SampleRate;
	int		ByteRate;
	short	BlockAlign;
	short	BitsPerSample;
	char	Subchunk2ID[4];
	int		Subchunk2Size;
};

//---------------------------------------------------------
// helper functions
//---------------------------------------------------------

/*
* Gibt wave file header Informationen in der Console aus;
* \param hdr: wavefile hdr
*/
void printWaveHeaderInfos( WAVEHEADER *hdr) {
	if(NULL == hdr) {
		cerr &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot; &lt;&lt; endl;
	}
	if(hdr-&gt;AudioFormat == 1 &amp;&amp; hdr-&gt;SampleRate == 44100 &amp;&amp; hdr-&gt;BitsPerSample == 16 &amp;&amp; hdr-&gt;NumChannels ==1 )  {
		cout &lt;&lt; &quot;Codec: &quot;;
		if (hdr-&gt;AudioFormat == 1) {
			cout &lt;&lt; &quot;PCM, &quot;;
		}
		else {
			cout &lt;&lt; &quot;This is not a PCM file! &quot;;
		}
		cout &lt;&lt; hdr-&gt;SampleRate &lt;&lt; &quot; Hz, &quot;;
		cout &lt;&lt; hdr-&gt;BitsPerSample &lt;&lt; &quot;bit, &quot;;
		cout &lt;&lt; hdr-&gt;NumChannels &lt;&lt; &quot; channel, &quot;;
		cout &lt;&lt; &quot;Length &quot; &lt;&lt; ((hdr-&gt;Subchunk2Size * 8.0) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels) / (hdr-&gt;SampleRate)) &lt;&lt; &quot; sec&quot; &lt;&lt; endl;
	} else {
		cout &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot;;
	}

	// outpout
	// codec, sampling rate, sampling precision, channels, length

}

/*
 * Liest den Waveheader und checkt ob das Format unterstuetzt wird;
 * \param fin: ifstream.
 * \return: NULL in case of error, waveheader else
 */
WAVEHEADER *readWaveHeader(ifstream *fin) {
	WAVEHEADER *hdr = NULL;

	//benutze die read Funktion um binaere Daten zu lesen
	hdr = new WAVEHEADER;

	fin-&gt;read((char*)hdr, sizeof(WAVEHEADER));
	/* TODO */
	if (fin-&gt;eof() || fin-&gt;fail() || fin-&gt;bad()){
		WAVEHEADER *hdr = NULL;
	}

	printWaveHeaderInfos(hdr);

	return hdr;
	delete [] hdr;
}

/*
 * Schreibt den Waveheader
 * \param fin: ifstream.
 * \param hdr: wavefile hdr
 * \return: false in case of an write error
 */
bool writeWaveHeader(ofstream *fout, WAVEHEADER *hdr) {

	if(NULL == hdr)
		return false;

	fout-&gt;write((char*)hdr, sizeof(WAVEHEADER));

	if (fout-&gt;eof() || fout-&gt;fail() || fout-&gt;bad()){
		WAVEHEADER *hdr = NULL;
	}

	// save hdr into file

	return true;
}

//---------------------------------------------------------
// Commands
//---------------------------------------------------------

/*
 * Fuer den Commando -info
 * \param fin: ifstream.
 */
void waveFileInfo( char * filename ) {

	//oeffne die Datei filename als binaere Datei (fin)
	ifstream fin(filename, ios::in | ios::binary);

	if( !fin.is_open() ) {
		cerr &lt;&lt; filename &lt;&lt; &quot; not found.&quot; &lt;&lt; endl;	
	} else {
		WAVEHEADER *hdr = readWaveHeader(&amp;fin);
		delete hdr;
	}
} 

void convertWaveFile( char infile[], char outfile[] )  
{
	cout &lt;&lt; &quot;Trying to convert wavefile to text:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void volumeWaveFile( char infile[], char outfile[], double gain )  
{
	cout &lt;&lt; &quot;Changing Volume:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; (s*gain) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void mixWaveFiles( char infile1[], char infile2[], char outfile[] )  
{
	cout &lt;&lt; &quot;Mixing 2 audio files:&quot; &lt;&lt; endl;

	ifstream fin1(infile1, ios::in | ios::binary);
	ifstream fin2(infile2, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr1 = NULL;
	WAVEHEADER *hdr2 = NULL;

	hdr1 = new WAVEHEADER;
	hdr2 = new WAVEHEADER;

	hdr1 = readWaveHeader(&amp;fin1);
	hdr2 = readWaveHeader(&amp;fin2);

	int samples1 = (hdr1-&gt;Subchunk2Size * 8) / (hdr1-&gt;BitsPerSample) / (hdr1-&gt;NumChannels);
	short s1 = samples1;

	int samples2 = (hdr2-&gt;Subchunk2Size * 8) / (hdr2-&gt;BitsPerSample) / (hdr2-&gt;NumChannels);
	short s2 = samples2;

	if (s1&gt;s2) {
		writeWaveHeader(&amp;fout , hdr1);
	}

	if (s1&lt;s2) {
		writeWaveHeader(&amp;fout , hdr2);
	}

	if (s1&gt;s2) {
		for (int i= 0; i&lt;s1; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl;
		}
	}

	if (s1&lt;s2) {
		for (int i= 0; i&lt;s2; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl; 
		}
	}

	delete [] hdr1;
	delete [] hdr2;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void echoWaveFile( char infile[], char outfile[], double delay, double echo_gain )  
{
	cout &lt;&lt; &quot;Adding echo:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = NULL;
	hdr = new WAVEHEADER;

	hdr = readWaveHeader(&amp;fin);

	int samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s+((s-1)*(s-2)) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

//---------------------------------------------------------
// main
//---------------------------------------------------------
int main(int argc, char *argv[])
{
	char *command = &quot;-info&quot;;
	char **parms = &amp;argv[1];
	int parms_count = argc - 1;

	if(argc &gt; 1 &amp;&amp; argv[1][0] == '-') {
		command = argv[1];
		parms = &amp;argv[2];
		parms_count--;
	}

	// -info command standard case prints info of the given file
	if(!strcmp(command, &quot;-info&quot;)) {
		if(parms_count &gt;= 1) {
			waveFileInfo(parms[0]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Call &quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; [-info] wavefile&quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; -help : \tfor more help&quot; &lt;&lt; endl;
			return 1;
		}
	}

	// -help command
	if(!strcmp(command, &quot;-help&quot;)) {
		cout &lt;&lt; &quot;Help:&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -totext wavfile_in  textfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -volume gain wavfile_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -mix    wavfile1_in wavfile2_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -echo   delay strength wavfile_in wavfile_out&quot; &lt;&lt; endl;

		return 0;
	}

	// -totext command
	if(!strcmp(command, &quot;-totext&quot;)) {
		if(parms_count &gt;= 2) {
			convertWaveFile( parms[0], parms[1]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -vol command
	if(!strcmp(command, &quot;-volume&quot;)) {
		if(parms_count &gt;= 3) {
			volumeWaveFile( parms[1], parms[2], atof(parms[0]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -mix command
	if(!strcmp(command, &quot;-mix&quot;)) {
		if(parms_count &gt;= 3) {
			mixWaveFiles( parms[0], parms[1], parms[2]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -echo command
	if(!strcmp(command, &quot;-echo&quot;)) {
		if(parms_count &gt;= 4) {
			echoWaveFile( parms[2], parms[3], atof(parms[0]), atof(parms[1]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	cin.get();
	cin.get();
	return 0;
}
</code></pre>
<p>Kompilieren tut es schonmal ohne Probleme. Doch ich kann einfach keine Eingaben tätigen um Audiofiles (.WAV) zu manipulieren, da sich die cmd sofort schliesst.<br />
Ich habe schon versucht zu Debuggen und herausgefunden, dass der Fehler irgendwo bei der Funktion &quot;WAVEHEADER *readWaveHeader(ifstream *fin) {...}&quot; ist.<br />
Sieht vielleicht Jemand was ich falsch mache in der Funktion?</p>
<p>Gruss Hans</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144942</guid><dc:creator><![CDATA[tschabos]]></dc:creator><pubDate>Tue, 15 Nov 2011 19:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei schwieriger c++ Programmieraufgabe on Tue, 15 Nov 2011 20:06:24 GMT]]></title><description><![CDATA[<p>Kompilieren ohne Probleme? Ich denke nein:</p>
<pre><code>test.cc: In function ‘WAVEHEADER* readWaveHeader(std::ifstream*)’:
test.cc:84: warning: unused variable ‘hdr’
test.cc: In function ‘bool writeWaveHeader(std::ofstream*, WAVEHEADER*)’:
test.cc:107: warning: unused variable ‘hdr’
test.cc: At global scope:
test.cc:245: warning: unused parameter ‘delay’
test.cc:245: warning: unused parameter ‘echo_gain’
test.cc: In function ‘int main(int, char**)’:
test.cc:275: warning: deprecated conversion from string constant to ‘char*’
</code></pre>
<p>Außerdem:<br />
- Nutz mal Referenzen<br />
- Nutz mal Vectoren</p>
<p>Nur mal ein Beispiel:</p>
<pre><code class="language-cpp">WAVEHEADER *readWaveHeader(ifstream *fin) {
    WAVEHEADER *hdr = NULL;

    //benutze die read Funktion um binaere Daten zu lesen
    hdr = new WAVEHEADER;

    fin-&gt;read((char*)hdr, sizeof(WAVEHEADER));
    /* TODO */
    if (fin-&gt;eof() || fin-&gt;fail() || fin-&gt;bad()){
        WAVEHEADER *hdr = NULL;
    }

    printWaveHeaderInfos(hdr);

    return hdr;
    delete [] hdr;
}
</code></pre>
<p>Hier ist jede Zeile mindestens gefährlich, die meisten schlichtweg falsch:<br />
-Per Pointer Objekte rausgeben, sehr ungewöhnlich und fehleranfällig<br />
-Per Pointer Objekte annehmen, sehr ungewöhnlich und fehleranfällig<br />
-Unsinniges Nullsetzen<br />
-C-Casts sollten immer Alarmzeichen sein, da sie dem reinterpret_cast aus C++ entsprechen können. Siehe dazu die Bemerkung von cooky451 unter mir.<br />
-Aus obigem Grund solltest du C-Casts auch vermeiden, da sie unauffällig aussehen, dem Compiler aber sehr klar sagen, dass er die Schnauze halten soll, selbst wenn es wahrscheinlich falsch ist. Vermutlich hast du so noch mehr potentiell nützliche Warnungen unterdrückt. Nimm die C++-Casts, da sieht man, was passiert. Wenn du sagst, das wäre viel Schreibarbeit, dann ist dein Design kaputt, weil du zu viel casten musst.<br />
-Guck mal, was <code>if (fin)</code> wohl macht<br />
-Guck auch mal, was fail, bad und eof genau machen und ob deine Abfrage nicht redundant ist<br />
-Du legst da eine neue lokale Variable im if-Block an, die nichts mit dem hdr außenrum zu tun hat.<br />
-delete[] passt nicht zum new<br />
-delete[] wird nie erreicht<br />
-würde delete[] erreicht, würdest du ein ungültiges Objekt zurück geben</p>
<p>Wenn in einer Funktion schon so viel falsch ist, mache ich nicht weiter. Du spielst hier mit Sachen rum (manuelle Speicherverwaltung), die sehr gefährlich sind und du weißt nicht, was du überhaupt tust. Kein Wunder, dass das nicht funktioniert. Fragt sich nur, warum du das tust, du hast das gar nicht nötig.</p>
<p>edit: Der Intel Compiler ist oftmals noch pingeliger als der GCC:</p>
<pre><code>test.cc(84): remark #1599: declaration hides variable &quot;hdr&quot; (declared at line 76)
          WAVEHEADER *hdr = NULL;
                      ^

test.cc(84): remark #177: variable &quot;hdr&quot; was declared but never referenced
          WAVEHEADER *hdr = NULL;
                      ^

test.cc(90): remark #111: statement is unreachable
      delete [] hdr;
      ^

test.cc(107): remark #1599: declaration hides parameter &quot;hdr&quot; (declared at line 99)
          WAVEHEADER *hdr = NULL;
                      ^

test.cc(107): remark #177: variable &quot;hdr&quot; was declared but never referenced
          WAVEHEADER *hdr = NULL;
                      ^

test.cc(152): remark #2259: non-pointer conversion from &quot;int&quot; to &quot;short&quot; may lose significant bits
      short s = samples;
                ^

test.cc(179): remark #2259: non-pointer conversion from &quot;int&quot; to &quot;short&quot; may lose significant bits
      short s = samples;
                ^

test.cc(209): remark #2259: non-pointer conversion from &quot;int&quot; to &quot;short&quot; may lose significant bits
      short s1 = samples1;
                 ^

test.cc(212): remark #2259: non-pointer conversion from &quot;int&quot; to &quot;short&quot; may lose significant bits
      short s2 = samples2;
                 ^

test.cc(258): remark #2259: non-pointer conversion from &quot;int&quot; to &quot;short&quot; may lose significant bits
      short s = samples;
                ^

test.cc(245): remark #869: parameter &quot;delay&quot; was never referenced
  void echoWaveFile( char infile[], char outfile[], double delay, double echo_gain )  
                                                           ^

test.cc(245): remark #869: parameter &quot;echo_gain&quot; was never referenced
  void echoWaveFile( char infile[], char outfile[], double delay, double echo_gain )  
                                                                         ^
</code></pre>
<p>Der findet also noch mehr technische Fehler, die ich oben erst als Zusatzkommentare zu deiner Funktion geschrieben habe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144949</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Nov 2011 20:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei schwieriger c++ Programmieraufgabe on Tue, 15 Nov 2011 19:58:26 GMT]]></title><description><![CDATA[<p>Du verlässt dich irgendwie darauf, dass die Member des struct im Speicher direkt hintereinanderliegen, das ist aber nicht garantiert!<br />
Zudem solltest du dich mal entscheiden, ob du C++ oder C schreiben willst, das da ist offen gesagt ziemlich.. hässlich. (z.B. solltest du dir mal überlegen was Zeile 90 macht. :D)</p>
<p>Wenn du den Debugger bereits kennst, guck doch einfach in welcher Zeile sich dein Programm beendet? Ich verstehe dein Problem nicht?</p>
<p>Edit:<br />
Autsch. Da war ich mal langsamer..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2144952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144952</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 15 Nov 2011 19:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei schwieriger c++ Programmieraufgabe on Tue, 15 Nov 2011 21:20:01 GMT]]></title><description><![CDATA[<p>So, habe es nocheinmal überarbeitet, hoffe konnte alles beheben.<br />
Muss mir auch mal den Intel Compiler runterladen.</p>
<pre><code class="language-cpp">[code]
/********************************************************************
	purpose:	A simple PCM Wave File Editing TOOL

	created:	2010/11/08
	filename: 	audio_tmpl.cpp
	author:		

*********************************************************************/

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;cstring&gt;
#include &lt;limits.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

struct WAVEHEADER {
	char	ChunkID[4];	//          Contains the letters &quot;RIFF&quot; in ASCII form
	int		ChunkSize;
	int		Format;
	char	Subchunk1ID[4];
	int		Subchunk1Size;
	short	AudioFormat;
	short	NumChannels;
	int		SampleRate;
	int		ByteRate;
	short	BlockAlign;
	short	BitsPerSample;
	char	Subchunk2ID[4];
	int		Subchunk2Size;
};

//---------------------------------------------------------
// helper functions
//---------------------------------------------------------

/*
* Gibt wave file header Informationen in der Console aus;
* \param hdr: wavefile hdr
*/
void printWaveHeaderInfos( WAVEHEADER *hdr) {
	if(NULL == hdr) {
		cerr &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot; &lt;&lt; endl;
	}
	if(hdr-&gt;AudioFormat == 1 &amp;&amp; hdr-&gt;SampleRate == 44100 &amp;&amp; hdr-&gt;BitsPerSample == 16 &amp;&amp; hdr-&gt;NumChannels ==1 )  {
		cout &lt;&lt; &quot;Codec: &quot;;
		if (hdr-&gt;AudioFormat == 1) {
			cout &lt;&lt; &quot;PCM, &quot;;
		}
		else {
			cout &lt;&lt; &quot;This is not a PCM file! &quot;;
		}
		cout &lt;&lt; hdr-&gt;SampleRate &lt;&lt; &quot; Hz, &quot;;
		cout &lt;&lt; hdr-&gt;BitsPerSample &lt;&lt; &quot;bit, &quot;;
		cout &lt;&lt; hdr-&gt;NumChannels &lt;&lt; &quot; channel, &quot;;
		cout &lt;&lt; &quot;Length &quot; &lt;&lt; ((hdr-&gt;Subchunk2Size * 8.0) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels) / (hdr-&gt;SampleRate)) &lt;&lt; &quot; sec&quot; &lt;&lt; endl;
	} else {
		cout &lt;&lt; &quot;Keine Waveheaderinformationen gefunden&quot;;
	}

	// outpout
	// codec, sampling rate, sampling precision, channels, length

}

/*
 * Liest den Waveheader und checkt ob das Format unterstuetzt wird;
 * \param fin: ifstream.
 * \return: NULL in case of error, waveheader else
 */
WAVEHEADER *readWaveHeader(ifstream *fin) {
	WAVEHEADER *hdr = NULL;

	//benutze die read Funktion um binaere Daten zu lesen
	hdr = new WAVEHEADER;

	fin-&gt;read((char*)hdr, sizeof(WAVEHEADER));
	/* TODO */
	if (fin-&gt;eof() || fin-&gt;fail() || fin-&gt;bad()){
		cout &lt;&lt; &quot;Fehler beim Ausgeben des Files&quot;;
	}

	printWaveHeaderInfos(hdr);

	return hdr;
}

/*
 * Schreibt den Waveheader
 * \param fin: ifstream.
 * \param hdr: wavefile hdr
 * \return: false in case of an write error
 */
bool writeWaveHeader(ofstream *fout, WAVEHEADER *hdr) {

	if(NULL == hdr) {
		return false;
	}

	fout-&gt;write((char*)hdr, sizeof(WAVEHEADER));

	if (fout-&gt;eof() || fout-&gt;fail() || fout-&gt;bad()){
		cout &lt;&lt; &quot;Fehler beim Ausgeben des Files&quot;;
	}

	// save hdr into file

	return true;
}

//---------------------------------------------------------
// Commands
//---------------------------------------------------------

/*
 * Fuer den Commando -info
 * \param fin: ifstream.
 */
void waveFileInfo( char * filename ) {

	//oeffne die Datei filename als binaere Datei (fin)
	ifstream fin(filename, ios::in | ios::binary);

	if( !fin.is_open() ) {
		cerr &lt;&lt; filename &lt;&lt; &quot; not found.&quot; &lt;&lt; endl;	
	} else {
		WAVEHEADER *hdr = readWaveHeader(&amp;fin);
		delete hdr;
	}
} 

void convertWaveFile( char infile[], char outfile[] )  
{
	cout &lt;&lt; &quot;Trying to convert wavefile to text:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = readWaveHeader(&amp;fin);

	short samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void volumeWaveFile( char infile[], char outfile[], double gain )  
{
	cout &lt;&lt; &quot;Changing Volume:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = readWaveHeader(&amp;fin);

	short samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; (s*gain) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void mixWaveFiles( char infile1[], char infile2[], char outfile[] )  
{
	cout &lt;&lt; &quot;Mixing 2 audio files:&quot; &lt;&lt; endl;

	ifstream fin1(infile1, ios::in | ios::binary);
	ifstream fin2(infile2, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr1 = readWaveHeader(&amp;fin1);
	WAVEHEADER *hdr2 = readWaveHeader(&amp;fin2);

	short samples1 = (hdr1-&gt;Subchunk2Size * 8) / (hdr1-&gt;BitsPerSample) / (hdr1-&gt;NumChannels);
	short s1 = samples1;

	short samples2 = (hdr2-&gt;Subchunk2Size * 8) / (hdr2-&gt;BitsPerSample) / (hdr2-&gt;NumChannels);
	short s2 = samples2;

	if (s1&gt;s2) {
		writeWaveHeader(&amp;fout , hdr1);
	}

	if (s1&lt;s2) {
		writeWaveHeader(&amp;fout , hdr2);
	}

	if (s1&gt;s2) {
		for (int i= 0; i&lt;s1; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl;
		}
	}

	if (s1&lt;s2) {
		for (int i= 0; i&lt;s2; i++) {
			fin1.read((char*)&amp;s1, sizeof(s1));
			fin2.read((char*)&amp;s2, sizeof(s2));
			fout &lt;&lt; (s1+s2) &lt;&lt;endl; 
		}
	}

	delete [] hdr1;
	delete [] hdr2;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

void echoWaveFile( char infile[], char outfile[], double delay, double echo_gain )  
{
	cout &lt;&lt; &quot;Adding echo:&quot; &lt;&lt; endl;

	ifstream fin(infile, ios::in | ios::binary);
	ofstream fout(outfile);

	WAVEHEADER *hdr = readWaveHeader(&amp;fin);

	short samples = (hdr-&gt;Subchunk2Size * 8) / (hdr-&gt;BitsPerSample) / (hdr-&gt;NumChannels);
	short s = samples;

	for (int i= 0; i&lt;s; i++) {
		fin.read((char*)&amp;s, sizeof(s));
		fout &lt;&lt; s*(delay*echo_gain) &lt;&lt;endl;
	}

	delete [] hdr;

	cout &lt;&lt; &quot;done&quot; &lt;&lt; endl;
}

//---------------------------------------------------------
// main
//---------------------------------------------------------
int main(int argc, char *argv[])
{
	char *command = &quot;-info&quot;;
	char **parms = &amp;argv[1];
	int parms_count = argc - 1;

	if(argc &gt; 1 &amp;&amp; argv[1][0] == '-') {
		command = argv[1];
		parms = &amp;argv[2];
		parms_count--;
	}

	// -info command standard case prints info of the given file
	if(!strcmp(command, &quot;-info&quot;)) {
		if(parms_count &gt;= 1) {
			waveFileInfo(parms[0]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Call &quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; [-info] wavefile&quot; &lt;&lt; endl;
			cerr &lt;&lt; argv[0] &lt;&lt; &quot; -help : \tfor more help&quot; &lt;&lt; endl;
			return 1;
		}
	}

	// -help command
	if(!strcmp(command, &quot;-help&quot;)) {
		cout &lt;&lt; &quot;Help:&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -totext wavfile_in  textfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -volume gain wavfile_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -mix    wavfile1_in wavfile2_in  wavfile_out&quot; &lt;&lt; endl;
		cout &lt;&lt; argv[0] &lt;&lt; &quot; -echo   delay strength wavfile_in wavfile_out&quot; &lt;&lt; endl;

		return 0;
	}

	// -totext command
	if(!strcmp(command, &quot;-totext&quot;)) {
		if(parms_count &gt;= 2) {
			convertWaveFile( parms[0], parms[1]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -vol command
	if(!strcmp(command, &quot;-volume&quot;)) {
		if(parms_count &gt;= 3) {
			volumeWaveFile( parms[1], parms[2], atof(parms[0]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -mix command
	if(!strcmp(command, &quot;-mix&quot;)) {
		if(parms_count &gt;= 3) {
			mixWaveFiles( parms[0], parms[1], parms[2]);
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	// -echo command
	if(!strcmp(command, &quot;-echo&quot;)) {
		if(parms_count &gt;= 4) {
			echoWaveFile( parms[2], parms[3], atof(parms[0]), atof(parms[1]));
			return 0;
		} else {
			cerr &lt;&lt; &quot;Not enough parameters&quot; &lt;&lt; endl;
			return 1;
		}

	}

	cin.get();
	cin.get();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2144988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2144988</guid><dc:creator><![CDATA[tschabos]]></dc:creator><pubDate>Tue, 15 Nov 2011 21:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei schwieriger c++ Programmieraufgabe on Wed, 16 Nov 2011 11:26:48 GMT]]></title><description><![CDATA[<p>Du hast zwar einige Kritikpunkte behoben, aber die wesentlichen Bemängelungen sind immer noch drin, zum Beispiel:</p>
<pre><code class="language-cpp">WAVEHEADER *readWaveHeader(ifstream *fin)
</code></pre>
<p>Es besteht kein Grund, hier Zeiger zu benutzen, weder für den Rückgabewert noch für den Parameter. Gib´ ein Objekt als Value zurück und übergib´ den Inputstream als Referenz:</p>
<pre><code class="language-cpp">WAVEHEADER readWaveHeader( ifstream&amp; ifs )
{
   WAVEHEADER wh;

   // Daten lesen

   // Objekt zurückgeben
   return wh;
}
</code></pre>
<p>Wenn du das Ganze noch C++ konform lösen willst solltest du den operator&gt;&gt; und oeprator&lt;&lt; für WAVEHEADER und istream/ostream überladen:</p>
<pre><code class="language-cpp">istream&amp; operator&gt;&gt;( istream&amp; is, const WAVEHEADER&amp; wh )
{
   // Daten aus stream lesen
}

ostream&amp; opertaor&lt;&lt;( ostream&amp; os, WAVEHEADER&amp; wh )
{
   // Daten in stream schreiben
}
</code></pre>
<p>Außerdem hat cooky451 schon erwähnt, dass die Elemente einer Struktur/Klasse nicht lückenlos linear hintereinander im Speicher liegen müssen. Der Compiler kann zwischen einzelnen Elementen Füllbytes (Padding) einfügen, um schneller auf die Elemente zugreifen zu können. Daher solltest du dem Compiler noch explizit sagen, dass er für die Struktur <strong>kein</strong> Padding verwenden darf. Wie das geht hängt vom Compiler ab. Beim Codegear 2007 könnte das so aussehen:</p>
<pre><code class="language-cpp">#pragma pack( push, 1 ) // Elemente auf Bytegrenzen ausrichten
struct WAVEHEADER
{
   ...
};
#pragma pack( pop ) // alte Ausrichtung wiederherstellen
</code></pre>
<p>PS:<br />
Die Ausrichtung für die Struktur muss natürlich nur dann auf Bytegrenzen gesetztz werden, wenn du sie am Stück mit <code>write</code> schreiben oder mit <code>read</code> willst. Alternativ kannst du auch alle Elemente separat in den Stream schreiben (bzw. aus ihm lesen), dann ist die Elementausrichtung der Struktur egal.</p>
<p>PPS:<br />
Es gibt den Datentyp <code>std::string</code> , dann brauchst du keine char-Arrays mehr durch die Gegend zu reichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2145160</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2145160</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Wed, 16 Nov 2011 11:26:48 GMT</pubDate></item></channel></rss>