C++ Einfache Frage zu Funktionen: Ist das so richtig?

obilaner

Lt. Junior Grade
Registriert
Apr. 2011
Beiträge
389
HallO!
Bin Neueinsteiger in C++ und es ist schon eine Weile her das ich die Funktionen versucht habe durchzukauen ^!
Jedenfalls möchte ich für ein einfaches Textadventure Sounds mit der PlaySound Funktion realisieren in Form einer Funktion an die man zB. kill als String übergibt, wenn der Chara gestorben ist. Dann soll in der Funktion nur Kill ankommen und mit dem +.wav habe ich versucht daraus der Funktion zu sagen das es ein gleichnamiges Wave File öffnen soll.. Sicherlich ist das +".wav" Syntaktisch total falsch geschrieben, weil aus Java und auch dort falsch ^^.
Kann mir das vieleicht kurz wer richtig stellen? Evtl ist auch die Deklaration falsch / Doppelt aber ich bin echt Neuling

Vielen dank!

Hier der Screen:
vbXJjQe.png
 
Du kannst über die
HTML:
[CODE][/CODE]
klammern auch code posten.

Warum erstellst du einen neuen string Name wenn du schon einen durch die Übergabe bekommst?
 
Die Konstruktion 'name+".wav"' mag in VB funktionieren. In Java oder C bezweifle ich das.
Versuch erstmal eine Funktion mit einem fixen String zu verwenden, wenn das funktioniert würde ich den String vor dem Aufruf der PlaySound Funktion zusammenbauen und nicht während des Aufrufs. Das macht das ganze auch übersichtlicher und du kannst einfacher eine Fehlerbehandlung einbauen. Um z.B. zu testen ob die Datei überhaupt existiert.
 
Hier nochmal die Funktion als Code:

Code:
string void wav(string name)
{
  PlaySound(name+".wav",NULL,SND_FILENAME);
  //falls nicht vorhanden:
  //BOOL (*PlaySound)(LPSTR,HMODULE,DWORD)=GetProcAddress(LoadLibrary("winmm.dll"),"PlaySoundA");
  //if(PlaySound) PlaySound("test.wav",NULL,SND_FILENAME);
  return 0;
}

Kricht das vieleicht wer hin? Schicke vieleicht auch einen Keks in nem Briefumschlag!!, oder zwei!! versprochen.
 
obilaner schrieb:
Hier nochmal die Funktion als Code:

Code:
string void wav(string name)
{
  PlaySound(name+".wav",NULL,SND_FILENAME);
  //falls nicht vorhanden:
  //BOOL (*PlaySound)(LPSTR,HMODULE,DWORD)=GetProcAddress(LoadLibrary("winmm.dll"),"PlaySoundA");
  //if(PlaySound) PlaySound("test.wav",NULL,SND_FILENAME);
  return 0;
}

Eine Funktion hat genau einen Rückgabetyp. Entweder string oder void. string void macht hier keinen Sinn. Noch dazu gibst du dann im Rumpf weder gar nichts noch einen einen String sondern den Integerwert 0 zurück. Entscheide dich! ;)

Zeichenketten mit dem + Operator zu konkatenieren ist schon ok, soweit einer der Operanden ein string-Objekt ist; das machst du also richtig.
Ergänzung ()

Nilson schrieb:

strcat braucht er nicht. Er verwendet std::string. Es gibt also keinen Grund, auf die ganzen C-Funktionen zum String-Verwurschteln zurückzugreifen.
 
Zuletzt bearbeitet:
antred schrieb:
strcat braucht er nicht. Er verwendet std::string. Es gibt also keinen Grund, auf die ganzen C-Funktionen zum String-Verwurschteln zurückzugreifen.
Darf ich noch ergänzen? Deswegen: string operator+ (const string& lhs, const char* rhs);
In C++ werden Operatoren wie Funktionen der Klassen gehandhabt, in Infix-Schreibweise (also a + b) wird daraus: string::operator+(a,b). Diese oben genannte Methode erlaubt das "addieren" von einem const char* (also einem plain C-String) zu einem std::string.
 
Ergänzend zu dem, was antred sagte: Mir scheint, du hast noch nicht verstanden, wozu Funktionen eigentlich gut sind und wie man sie schreibt. Also hier mal zwei Beispiele:

Code:
float average(float a, float b) {
  return 0.5f * (a + b);
}

Das erste float ist der Rückgabetyp der Funktion, also der Typ des Ergebnisses, welches von der Funktion berechnet wird und z.B. in eine Variable geschrieben werden kann. return sorgt quasi dafür, dass das Ergebnis "hinten raus" kommt, der Ausdruck - in diesem Fall also die Formel - muss aber kompatibel zum Rückgabetypen sein.

Code:
void printAverage(float a, float b) {
  const float avg = average(a, b);  // = 0.5f * (a + b) nach dem Funktionsaufruf
  printf("Durchschnitt von %f und %f: %f\n", a, b, avg);
}

Rückgabetyp ist void, also gibt es keine Rückgabe. Die Funktion soll auch nichts berechnen, sie soll nur etwas auf die Konsole schreiben.
printf ist in C++ auch nicht das Mittel der Wahl, dafür gibt es std::cout - aber lassen wir das erstmal

Die Konstruktion 'name+".wav"' mag in VB funktionieren. In Java oder C bezweifle ich das.
Laut Thread-Titel geht es hier um C++, da geht das ganze sehr wohl. In Java nebenbei auch.
 
Zuletzt bearbeitet:
Code:
#include "include.h"

#include <windows.h>
#include <mmsystem.h>
void wav(string);


int main()

{
    cout<<"ich bin dumm";
    cout<<"\n";
    wav("C:/WINDOWS/Media/ding.wav");
    return 0;
}

void wav(string wav)
{
 string blubzilla=wav;
  PlaySound(blubzilla,NULL,SND_FILENAME);
  //falls nicht vorhanden:
  //BOOL (*PlaySound)(LPSTR,HMODULE,DWORD)=GetProcAddress(LoadLibrary("winmm.dll"),"PlaySoundA");
  //if(PlaySound) PlaySound("test.wav",NULL,SND_FILENAME);
  }

So nun stimmt eigentlich alles bis auf das mein compiler ein "LPCSTR {aka const char*}" erwartet, weil er keinen String dazu konvertieren kann.. Kurzfassung: Muss ich dafür irgendwie mit Pointern arbeiten?
 
Warum kopierst du den String "wav"?

Probier mal wav.c_str(), das gibt dir den Pointer (const char*) auf den String "wav" zurück.
 
Zurück
Oben