Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gelöschter Benutzer

unregistriert

1

25.10.2014, 21:06

"Klassen in 'if'"

Hallo,

mich beschäftigt im Moment ein Problem, welches ich nicht lösen kann. Es geht darum, dass ich einen Thread habe, der mein SFML-Fenster updatet. Soweit funktioniert dieser bisher gut, allerdings habe ich in der Thread-Funktion folgendes Problem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// create window
THREAD_WINDOW_COMMUNICATION_STRUCT *sParam = reinterpret_cast<THREAD_WINDOW_COMMUNICATION_STRUCT*>(pParameter); 
// different styles 
if (sParam->unWINDOW_STYLE == 0) // none 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::None); 
else if (sParam->unWINDOW_STYLE == 1) // titlebar 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Titlebar); 
else if (sParam->unWINDOW_STYLE == 2) // resize 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Resize); 
else if (sParam->unWINDOW_STYLE == 3) // close 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Close); 
else if (sParam->unWINDOW_STYLE == 4) // fullscreen 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Fullscreen); 
else if (sParam->unWINDOW_STYLE == 5) // default 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Default); 
else 
sf::RenderWindow Window(sf::VideoMode(sParam->vSize.x, sParam->vSize.y), sParam->sTitle, sf::Style::Close); 

// window open?
bool bOpen = true;
while (bOpen) 
{ 
EnterCriticalSection(&sParam->CS);
sf::Event event;
while (Window.pollEvent(event)) 
{ 
// close
if (event.type == sf::Event::Closed)
Window.close(); 
}
bOpen = Window.isOpen(); 
LeaveCriticalSection(&sParam->CS); 
}
sParam->bRun = false; 
return 0;


Ich benutze bOpen, weil ich sonst die Critical Section vor die while-Schleife hängen müsste, und dann immer alles kritisch wäre... das ist das kleinere Problem :) Das Eigentliche kommt jetzt: wenn ich den Code so schreibe bzw. kompiliere, dann wirft mir Visual Studio 2013 den Fehler aus, dass ein Bezeichner erwartet wird, da ich Window in der if-Funktion deklariere und dort auch den Konstruktor aufrufe. VS denkt sich vermutlich also, dass es meinen Bezeichner nicht gibt. Jetzt wäre an euch die Frage, wie ich folgendes Problem lösen kann, bzw. nach was ich Ausschau halten soll. Ich hoffe, dass das kein Anfänger-Fehler ist, weil ich bin eigentlich kein Anfänger mehr :D

Mit freundlichen Grüßen,

alex41018

2

25.10.2014, 21:15

die erstellten 'Windows' sind jeweils nur in dem jeweiligen If-Block sichtbar. Du könntest sie aber mit new anlegen und dann einem Zeiger zuweisen, der vor den Blöcken deklariert wurde.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

25.10.2014, 21:17

Erstmal solltest du dir switch/case anschauen, das ist viel handlicher als so viele "if"s.
Zweitens hast du wohl das Konzept der Sichtbarkeit von Variablen nicht richtig verstanden.
Zwei Möglichkeiten, das Problem zu lösen: entweder initialisierst du "Window" nur an einer Stelle mit Variablen als Parameter, die du vorher mittels switch/case bzw. "if" setzt. Oder du arbeitest mit einem Window-Zeiger, den du außerhalb von switch/case bzw. "if" deklarierst und innerhalb davon initialisierst.

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

4

25.10.2014, 21:33

Oder du arbeitest mit einem Window-Zeiger, den du außerhalb von switch/case bzw. "if" deklarierst und innerhalb davon initialisierst.


Aber das Freigeben nicht vergessen oder besser direkt smarte verwenden.

http://msdn.microsoft.com/de-de/library/hh279674.aspx

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

25.10.2014, 21:48

Ich frag mich wieso Du überhaupt einen Thread brauchst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Gelöschter Benutzer

unregistriert

6

25.10.2014, 22:28

Vielen Dank für die vielen Antworten!
@Roflo: Das mit new hatte ich mir auch schon überlegt, aber soweit ich weiß, kann ich den VideoMode des Fensters im Nachhinein nicht ändern, um diesen Parameter ging es ja. Das die Variable/Instanz nur in dem if-Block gültig ist, wusste ich nicht. Danke :)
@David: Switch und Case sind mir auf jeden Fall ein Begriff, allerdings fand ich, dass diese den Code "aufblähen", da diese jedes Mal ein break benötigen (sofern "C++ für Spieleprogrammierer" mich richtig belehrt hat :D ). Allerdings werde ich sie dennoch einbauen, aus Gründen der Übersichtlichkeit. Dein erstgenanntes Verfahren werde ich benutzen, da ich wie bei Roflo bereits erwähnt hatte, die Parameter des VideoModes im Nachhinein nicht ändern kann (soweit ich weiß). Auch vielen Dank!
@Tankard: Auch ein "Danke" an dich, für den Tipp mit den "smarten Zeigern". Ich wusste nicht einmal, dass es sie gibt.
@BlueCobold: Einfach um mal ein bisschen rumzuspielen :love: Auch wenn ich es "privat" nie brauchen werde.


EDIT: Ich habe aus Versehen überall den VideoMode genannt, es ging um den "Style"

7

25.10.2014, 22:56

Den Style kannst du nachher auch noch ändern, genauso wie Auflösung und Titel, einfach über window.create( *Werte* ) neu erschaffen.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

26.10.2014, 08:48

Oder du arbeitest mit einem Window-Zeiger, den du außerhalb von switch/case bzw. "if" deklarierst und innerhalb davon initialisierst.


Aber das Freigeben nicht vergessen oder besser direkt smarte verwenden.

http://msdn.microsoft.com/de-de/library/hh279674.aspx
Bitte nicht gleich wieder uebelstes Overengeneering fuer die simpelsten Anwendungen...

Entweder, wenns unbedingt mit Pointer sein soll (warum eigentlich pointer, fuer sowas gibts Referenzen...):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
Window w;
Window* p = &w;
if (blubb)
{
    p->Create(Dies);
}
else
{
    p->Create(Das);
}


Oder einfach in normal:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
Window w;
if (blubb)
{
    w.Create(Dies);
}
else
{
    w.Create(Das);
}

9

26.10.2014, 10:46

Hier gehts ja aber um den Konstruktor, und da kommst du um einen Zeiger nicht drum.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

26.10.2014, 10:52

Allerdings geht es in diesem Fall eben nicht um den Konstruktor, sondern nur um einen Parameter im Konstruktor und/oder um die Create-Methode. Das geht wunderbar ohne irgendwelche Pointer.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige