problem mit array einer selbst erstellten Klasse und einem windows timer
-
Folgendes soll unter Win7 64bit in der Konsole laufen:
#include "stdafx.h" #include <string> #include <iostream> #include <Windows.h> using namespace std; int holz=500, lehm=500, steine=500, gold=50; class Gebaude { public: string Name; int Stufe; Gebaude(){ Stufe=1; }; ~Gebaude(); }; Gebaude gebaut[5]; gebaut[0].Name="Holzfäller"; gebaut[1].Name="Lehmgrube"; gebaut[2].Name="Steinbruch"; SetTimer(hwnd, // handle to main window IDT_TIMER1, // timer identifier 60000, // 60-second interval (TIMERPROC) NULL); // no timer callback case WM_TIMER: { holz += (gebaud[0].Stufe)^2*30; lehm += (gebaud[1].Stufe)^2*30; steine += (gebaud[2].Stufe)^2*30; gold += 10; } string t; void rohstoffe(){ cout<<"Sie haben "<<holz<<" Holz, "<<lehm<<" Lehm, "<<steine<<" Steine und "<<gold<<" Gold"<<endl; } using namespace std; int main() { cout<<"Herzlich Willkommen bei Peter's Aufbauspiel!"<<endl<<endl; rohstoffe(); while (true){ } return 0; }
Was ist an der Deklaration des Gebaude-Arrays falsch? Ich bekomme in der Zeile in der
gebaut[0].Name="Holzfäller";
steht den Fehler "Zuordnung eines Arrays der konstanten Größe 0 nicht möglich."
Und hat jm nen Link zu nem Tutorial für Windows Timer? Oder kann mir kurz erklären was ich hier falsch mache und was ich ändern muss?
Vielen Dank schonmal
Peter
-
pt1234 schrieb:
Oder kann mir kurz erklären was ich hier falsch mache und was ich ändern muss?
Du hast dort frei im Raum stehenden Programmcode, das ist in C++ nicht möglich. Anweisungen kannst du nur im Inneren einer Funktion unterbringen.
-
-.- manchmal kanns so einfach sein. Habs i-wie übersehen
Vielen DankKann mir noch jm mit dem timer helfen?
-
Für
SetTimer(hwnd, ...
benötigt man definitiv ein Fenster. Das hat deine Konsolenanwendung offensichtlich nicht
Wenn es eine Win32 Applikation mit Fenster werden soll dann sollte das hier helfen:
MSDN - Creating a Timer
http://msdn.microsoft.com/en-us/library/ms644901(v=vs.85).aspx#creating_timer
Ansonsten wäre möglicherweise das besser (Win32 Konsolen Applikation):
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent,DWORD dwTime) { }
zusammen mit
m_LoadTimesTimerID = SetTimer(NULL,1,1000,TimerProc);
Leider schreibst Du ja nicht was genau dein gewünschtes Ziel ist.
VG
merano
-
Die Konsole hat sehrwohl ein Fenster - HWND beziehbar über GetConsoleWindow(), weiß allerdings nicht ob man dieses für Timer verwenden kann.
MfG SideWinder
-
SideWinder schrieb:
Die Konsole hat sehrwohl ein Fenster ...
Ja, super - dann braucht man ja "nur" noch die message queue entsprechend erweitern
-
Man braucht eine Nachrichtenschleife. Das kann etwa so aussehen:
// Funktion, die beim Timeout ausgeführt werden soll void CALLBACK TimeOut(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { printf("Timeout!"); } DWORD WINAPI MyThread (void * Param) { MSG msg; cout << "bin im Thread" << endl; UINT timerID = 1; // ID für Timer; timerID = SetTimer(NULL,timerID,5000,TimeOut); // Timer setzen auf 5 sec while (GetMessage (&msg, NULL, 0, 0)) { DispatchMessage(&msg); } KillTimer(0, timerID); cout << "Thread fertig" << endl; return 0; }
Man startet den Thread aus main und wenn man ihn nicht mehr braucht, sendet man ihm
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
-
Die Timerlösung entspricht meinem Vorschlag (s.o.)
Die Nachrichtenschleife wird hier für den (zusätzlichen) Thread verwendet.
Ein Thread ist eine elegante Lösung wenn man Nebenläufigkeiten brauchen sollte ...Der Timer selbst kommt wohl auch ohne Thread und Nachrichtenschleife aus.
Timer beenden sollte z.B. so aussehen:
KillTimer( NULL, timerID );
VG
-
merano schrieb:
Der Timer selbst kommt wohl auch ohne Thread und Nachrichtenschleife aus.
Nein, der Timer läuft nur, wenn es eine Nachrichtenschleife gibt, deshalb der Thread, der eine solche zur Verfügung stellt.