void (__cdecl *)(int)' in 'DWORD

02/28/2012 21:56 xazorstix#1
Hey e*pvpers,

Ich habe gerade mit C++ angefangen. Nun wollte ich einen Timer machen, in den man die Zeit eingibt und der dann diese Zeit abwartet(Sleep) und danach den Warnton(\a) ausgibt.

Dies hier ist mein Code:

Dies hier ist der Fehlercode

Bin natürlich auch für Anregungen am Code selber offen.




mfg
xazorstix
02/28/2012 22:04 ms​#2
Du gibst immer den Funktionsnamen anstatt des Variablennamens als Argument an die Sleep-Funktion. Außerdem solltest du wo es möglich ist nur lokale Variablen benutzen, da globale Variablen böse sind.
02/29/2012 12:21 yihaaa#3
VBA vorbelastet.
Code:
void sectim( int n )
{
	Sleep( n * 1000 );
}
MfG
02/29/2012 13:17 Nightblizard#4
Das Problem ist ganz einfach, dass du nicht den Namen der Variablen an Sleep übergist, sondern die Funktionen. Und deine Funktionen sind in dem Fall nunmal vom typen void (__cdecl*)(int), was der Compiler jedoch nicht implizit nach unsigned long (DWORD) casten kann.

Anregungen:
Globale Variablen vermeiden.
Globales using namespace vermeiden
Gebe deinen Variablen aussagekräftige Namen. n und t sagen dir absolut gar nichts.

Was ich cool finde:
Wie du den String auf mehrere Möglichkeiten mit dem Komma Operator prüfst. Sieht man nicht sehr häufig!
02/29/2012 15:45 ms​#5
Quote:
Originally Posted by Nightblizard View Post
Was ich cool finde:
Wie du den String auf mehrere Möglichkeiten mit dem Komma Operator prüfst. Sieht man nicht sehr häufig!
Ist...
Code:
if(t == "sec", "seconds")
... nicht gleichwertig mit ...?
Code:
if("seconds")
Ich dachte immer der Komma-Operator evaluiert zu dem letzten Ausdruck und verwirft den Rest.
02/29/2012 15:54 Nightblizard#6
Quote:
Originally Posted by Metin2Spieler97 View Post
Ist...
Code:
if(t == "sec", "seconds")
... nicht gleichwertig mit ...?
Code:
if(t == "seconds")
Ich dachte immer der Komma-Operator evaluiert zu dem letzten Ausdruck und verwirft den Rest.
Wir haben beide unrecht. :o
Der Code macht folgendes:
Code:
mov ecx, offset string "seconds"
test ecx,ecx
je DEADBEEFh ;überspringt den if block
Der if-Block wird also immer aufgerufen!


Edit:
Ah, du hast es geändert. :)
02/29/2012 16:11 ms​#7
Quote:
Originally Posted by Nightblizard View Post
Edit:
Ah, du hast es geändert. :)
Mir ist im Nachhinein erst aufgefallen, dass der == Operator vor dem Komma kommt. :>
02/29/2012 17:24 xazorstix#8
DANKE für eure Hilfe, ich habe die Funktion in Sleep durch die Variablen ersetzt.
Dazu habe ich noch einen Warnton eingebaut, welcher ertönt wenn Sleep(time) vorüber ist.

Habe auch eure anderen Verbesserungen mit eingebracht.

02/29/2012 17:58 Nightblizard#9
Du kannst die Eingabe so nicht prüfen. Der Compiler macht aus diesem Code
Code:
if(timetype == "sec", "seconds")
folgendes:
Code:
timetype == sec;
if("seconds") //prüft, ob der angegebene String ungleich null ist und das ist er, weshalb dieser Teil immer aufgerufen wird
Du kannst also so nicht prüfen, da egal ist was du eingibst, es wird immer ausgeführt!
Wie es du machen solltest:
Code:
if(tyetype == "sec" || timetype == "seconds")
02/29/2012 18:14 xazorstix#10
Wär ja auch zu schön gewesen :D

03/01/2012 23:51 MrSm!th#11
Es ist auch nicht gerade schlau, die Namen der Funktionen den Namen der Variablen so ähnlich zu wählen (sectime, sectim).