C++ Wav-Datei Samples addieren



  • Hallo, ich bin neu in C++ und habe eine Aufgabe zu lösen. Ich versuche seit knapp 2 Wochen die Aufgabe zu lösen, leider ohne Erfolg. Ich weis noch nicht mal ob mein Code Sinn ergibt.

    Mein Code:

    Container-Klasse:

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    template <class T>
    
    class Container{
    	
    	private:
    		double *myArray;
    		T mySize;
    		
    	public:
    		
    		Container(T startSize){
    			mySize = 0;
    			myArray = NULL;
    			resize(startSize);		
    		}
    	
    		~Container(){
    			if(myArray != NULL){
    				delete[] myArray;
    			}
    		}
    		
    		
    		void resize(T size){
    		
    			double *newArray =  new double[size];
    			int t = 0;
    			if(myArray != NULL && new double[size]){
    				for(t = 0; (t < size) && (t < mySize); t++){
    					newArray[t] = myArray[t];
    				}
    				for(; t < size; t++){
    					newArray[t] = 0;
    				}
    				
    				delete[] myArray;
    			}
    			
    			myArray = newArray;
    			mySize = size;
    			
    		}
    		
    		double &operator[](T index){
    			
    			if(index < 0)
    				printf("Index negativ \n");
    			
    			if(index > mySize)
    				resize(index + 1000);
    				
    			return myArray[index];
    			
    		}
    };
    
    

    Main:

    #include "container.h"
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    struct MyWave{
    	char ChunkID[4];
        int ChunkSize;
        char Format[4];
        char subChunk1ID[4];
        int subChunk1Size;
        short audioFormat;
        short numChannels;
        int sampleRate;
        int byteRate;
        short blockAlign;
        short bitsPerSample;
        char subChunk2ID[4];
        int subChunk2Size;
    };
    
    union ReadMyWave{
    	struct MyWave header;
    	char characters[44];
    };
    
    
    int main(int argc, char *argv[]){
    
    	ReadMyWave myHeader;
    	
    	FILE *openFile = fopen("pluck.wav", "rb");
    	
    	if(openFile){
    		
    		for(int index = 0; index < 44; index++){
    			myHeader.characters[index] = fgetc(openFile);
    		}
    		
    		int buffer[8000];
    			
    		for(int i = 0; i < 8000; i++)
    		buffer[i] = 0;
    
    		fclose(openFile);
    	}
    	
    
    }
    

    Die Aufgaben:

    Aufgabe 1
    Implementieren Sie eine Klasse Container, die ein dynamisches Array implementiert. Im Konstruktor soll die Startgröße des Arrays Übergeben werden. Falls der Index, mit dem auf das Array zugegriffen wird zu groß ist, so wird
    ein neuer Speicher reserviert, die Daten in den neuen Speicher kopiert, der alte
    Speicher frei gegeben und der Zeiger des Arrays auf den neuen Speicher gesetzt.
    Das Array soll vom Template Datentyp sein, also beliebige Datentypen fassen
    können. Überladen sie den Eckigen-Klammer-Operator um Zugriffe wie bei den ursprünglichen Arrays zu ermöglichen!

    Aufgabe 2
    Laden sie ein WAV-File ein. Nutzen sie dafür das neue dynamische Array.

    Aufgabe 3
    Implementieren Sie einen Ringbuffer der Größe 8000 (initialisiert mit 0). Addieren sie nun zu den Sound Samples der Wav Datei die um 8000 verzögerten Sound Samples und speichern die Wav Datei wieder ab. Was hören sie, wenn sie
    die Datei anhören? (Falls Übersteuerung auftritt, können Sie gerne die Sound-samples halbieren.)

    Ich bin echt verzweifelt und würde mich freuen, wenn jemand mit helfen könnte.



  • Soll jetzt jemand deine Hausaufgaben lösen?



  • @manni66 Ein Tipp/Ansatz wäre optimal 😅



  • @Berkan046 erkläre mal

    
    if(myArray != NULL && new double[size]){
    
    


  • @manni66 ...was möchtest du bewirken? Ich muss es am Ende sowieso dem Prof. erklären, da brauch ich es nicht noch einem Random erklären. Wenn du nicht helfen kannst, dann würde ich dich bitten nicht noch mehr Sinnlose Kommentare/Fragen abzugeben, damit du nicht deine und meine Zeit verschwendest🙂 .


  • Mod

    Das hat manni66 gewiss nicht gefragt, weil er dir nicht helfen wollte oder konnte.



  • Was soll denn der Datentyp doublein Deiner Container-Klasse?
    Ich hab das Gefühl, dass die ganze Klasse völlig ohne diesen Datentyp auskommt.

    PS Das ist nicht als Ergänzung zu manni66s Kommentar zu verstehen, sondern ein anderes Problem.



  • This post is deleted!


  • @Belli Danke für dein Verbesserungsvorschlag. Um ehrlich zu sein habe ich selber wenig Ahnung vom Code. Ich weis zwar was die Methoden bzw. die Befehle machen, aber mir fehlen dennoch die Befehle um meine Wav auszulesen und es in mein Array zu packen.



  • Das war ein Hinweis, dass der Code keinen Sinn macht. Anscheinend nicht offensichtlich genug.



  • @Mechanics Jetzt schon, wenn man es DIREKT sagt. Nur zu schreiben, dass der Code kein Sinn ergibt macht, mich auch nicht weiter. Ich habe auch geschrieben, dass ich nicht weis ob es Sinn ergibt. Bin erst seit kurzem in C++ und die ganzen Dinge sind mir eben neu.



  • Was hast du von dem Code überhaupt selbst geschrieben, was war vorgegeben?
    Was verstehst du, und wo hast du Schwierigkeiten?



  • @Mechanics Die Container Klasse war eigentlich so gut wie vorgeben bzw. der Prof. hat er in der Vorlesung so uns gezeigt. Ich habe nur eben ein Template erstellt und die Main habe ich mit einem Freund geschrieben.

    In der Container Klasse habe ich Kleinigkeiten geändert, wie z.B. formalen Parameter.



  • Hab mir schon gedacht, dass die Container-Klasse ursprünglich mal für double geschrieben war, und Du die nun auf Template umstellen willst/sollst - daher auch die Reste mit dem Typ double.

    Mach doch zuerst mal die Containerklasse fertig, so dass die funktioniert, eins nach dem anderen ...



  • @Belli sagte in C++ Wav-Datei Samples addieren:

    Hab mir schon gedacht, dass die Container-Klasse ursprünglich mal für double geschrieben war

    Nicht nur das... Die Codezeile macht so oder so keinen Sinn.

    Das ist eine ganz grundlegende Frage. Was macht new double[x]?



  • @Berkan046 sagte in C++ Wav-Datei Samples addieren:

    @Mechanics Jetzt schon, wenn man es DIREKT sagt. Nur zu schreiben, dass der Code kein Sinn ergibt macht, mich auch nicht weiter.

    Wenn du versuchst zu erklären was eine sinnlose/falsche Codezeile macht, dann kann u.A. folgendes passieren:

    1. Du erklärst was du meinst dass die Codezeile bewirkt - und deine Vorstellung ist falsch. In dem Fall können wir diesen Irrtum aufklären und dir sagen was die Codezeile wirklich macht. Das hilft dir dann weiter.
    2. Du kommst selbst drauf dass die Codezeile keinen Sinn macht. Das hilft dir auch weiter.

    Was dir aber nicht hilft ist dich aufzuregen wenn dir jemand sowas schreibt. Damit machst du dich bloss unbeliebt.



  • @Mechanics sagte in C++ Wav-Datei Samples addieren:

    new double[x]

    hab mir eben den Quellcode von meinem Prof. angeschaut und bemerkt, dass ich wahrscheinlich beim probieren bzw. umstellen einen Fehler gemacht habe.

    Es hätte so sein müssen:

    if(value != NULL && newValue != NULL)
    

    bzw.

    if(myArray != NULL && newArray != NULL)
    


  • @hustbaer Ich gebe dir vollkommen Recht. Nur macht es ebenso wenig Sinn zu sagen das es falsch ist, statt kurz und knapp zu sagen was falsch ist. Und wenn alles nicht stimmt, dann kann man das auch direkt sagen finde ich.



  • Ich weiß ja nicht, was Du studierst, aber wenn Du programmieren lernen willst, wäre es schon gut, wenn Du verstehen würdest, warum

    if(myArray != NULL && new double[size]){
    

    grob falsch ist.



  • @Belli Eigentlich wird doch nur überprüft ob mein Array leer ist bzw. kein Inhalt hat oder nicht? Und wenn es nicht der Fall ist dann wird der darauf folgende Code ausgeführt. Im ersten Semester hatte ich gar keine Probleme mit Java, aber C++ ist (für mich zumindest) sehr schwierig bzw. kompliziert, weil C++ neue Sachen mit sich bringt wie union, struct, pointer etc.


Log in to reply