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 Dank

    Kann 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.


Anmelden zum Antworten