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

11

24.04.2014, 18:28

Äh doch?
In solchen Fällen ist es notwendig die Fragestellung explizit zu wiederholen und im besten Fall noch eine genaue verdeutlichung der vorhandenen Verwirrung zu notieren.

EDIT: Waaas sogar die zweite Seite von Google? Welch akribische Suche du doch betreibst.

Zitat

Du hast die SFML nicht gelinkt, zumindest nicht das Modul "sfml-graphics".

Ich weiß nicht, aber vielleicht ist es möglich irgendwann aus solch einer Aussage zu folgern, nochmal an der Grundlage nachzusehen, wie man die SFML denn linkt. Von dort kommt man uneigentlich immer ziemlich fix zum Tutorial.

MfG
Check

12

26.04.2014, 11:20

Hmmm, aber im code steht doch #include <SFML\Graphics.hpp>, oder hat das etwa nicht damit zu tun? Außerdem hab ich Das Tutorial vom Anfang bis inkl. den Grafiken gelesen und habe den Code leicht verändert (Ich werde nur soviel reinkopieren wie ich für nötig halte):

Sprite.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef SPRITE_HPP
#define SPRITE_HPP

#include <SFML\Graphics.hpp>
#include <SFML\System.hpp>

extern sf::Texture TicTacToe_Texture;

//Texture class
class CTexture
{
    friend class CSlots;
    friend class CTransmitter;
    friend class CXO;

    public:

    void LoadTexture();
};
//...Der Rest hat sich nicht verändert...


Sprite.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Sprites.hpp"

using namespace std;

void CTexture::LoadTexture()
{
    if(!TicTacToe_Texture.loadFromFile("TicTacToeGrid.png"))
    {
        printf("ERROR: Could not load 'TicTacToeGrid.png'");
    }
}

CSlots::CSlots ()
    {
        &CTexture::LoadTexture;
//...Die letzte Zeile steht neuerdings am Anfang der drei Klassen: CSlots, CTransmitter, CXO.


Dieser Text ist scheint bis auf LNK2001/1120 für den Compiler einwandfrei zu sein. Die Foren mit den Problemen anderer helfen mir nicht weiter und die MSDN-Website ist aus meiner Sicht auch nicht gerade hilfreich. Ich möchte nun diesen Fehler ein für alle mal beheben; dieser Fehler geht mir auf den Keks. Und ich möchte jeden anderen LNK-Fehler verhindern denn mit denen komme ich nur schlecht zurecht, die meisten anderen kann ich selbst lösen. Und nein die zweite Frage zum Beispiel:

Zitat

2.Warum tauchen alle diese Fehler auf?
womit die die if und ';' Fehler meinte die rein gar nichts mit dem anderen Fehler zu tun hat, es sei denn ich habe was übersehen.

MfG
Pwalb

13

26.04.2014, 11:59

Schau dir bitte an, was lib-Dateien sind, wie man die in Visual studio linkt, und wo der Unterschied zwischen Header und Lib's ist.

Schau dir außerdem bitte an, wann man globale Variablen nutzen sollte und wann nicht.

C-/C++-Quelltext

1
extern sf::Texture TicTacToe_Texture;

Ist noch immer nicht definiert. Schau dir daher bitte ferner an, wie man Variablen deklariert und wie man sie definiert.


Edit: Es wäre übrigens auch super nett, wenn du uns ganze Fehlermeldung geben könntest, nicht nur irgendwelche seltsamen Bruchstücke ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (26.04.2014, 12:10)


14

26.04.2014, 13:55

Schau dir bitte an, was lib-Dateien sind, wie man die in Visual studio linkt, und wo der Unterschied zwischen Header und Lib's ist.


Ich habe keine ahnung wie ich das bild hier einfügen soll, von daher:

C/C++: Allgemein: Zusätzliche Includeverzeichnisse: C:\Users\user\Documents\Visual Studio 2012\SFML 2.1 32-bit\SFML-2.1\include;C:\Users\user\Pictures
Linker: Eingabe: Zusätzliche Abhängigkeiten: sfml-graphics-s-d.lib;sfml-window-s-d.lib;sfml-system-s-d.lib;%(AdditionalDependencies)


Schau dir außerdem bitte an, wann man globale Variablen nutzen sollte und wann nicht.

extern sf::Texture TicTacToe_Texture;

Ist noch immer nicht definiert. Schau dir daher bitte ferner an, wie man Variablen deklariert und wie man sie definiert.


Edit: Es wäre übrigens auch super nett, wenn du uns ganze Fehlermeldung geben könntest, nicht nur irgendwelche seltsamen Bruchstücke


Ohne Extern: (sf::texture TicTacToe_Texture;)
Fehlerausgabe:

Quellcode

1
2
3
4
5
6
1>------ Erstellen gestartet: Projekt: SFML_Game, Konfiguration: Debug Win32 ------
1>  main.cpp
1>  Sprites.cpp
1>Sprites.obj : error LNK2005: "class sf::Texture TicTacToe_Texture" (?TicTacToe_Texture@@3VTexture@sf@@A) ist bereits in main.obj definiert.
1>C:\Users\user\documents\visual studio 2012\Projects\SFML_Game\Debug\SFML_Game.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========


Mit Extern: (extern sf::Texture TicTacToe_Texture;)
Fehlerausgabe:

Quellcode

1
2
3
4
5
6
#1>------ Erstellen gestartet: Projekt: SFML_Game, Konfiguration: Debug Win32 ------
1>  main.cpp
1>  Sprites.cpp
1>Sprites.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class sf::Texture TicTacToe_Texture" (?TicTacToe_Texture@@3VTexture@sf@@A)".
1>C:\Users\user\documents\visual studio 2012\Projects\SFML_Game\Debug\SFML_Game.exe : fatal error LNK1120: 1 nicht aufgelöste Externe
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========


So, bitte. Ich hoffe du kennst dich mit SFML aus.

MfG
Pwalb

15

26.04.2014, 14:40

Deinem Output zufolge sind deine Libs richtig gelinkt.

Der Grund, warum der Compiler den Fehler "error LNK2001: Nicht aufgelöstes externes Symbol ""class sf::Texture TicTacToe_Texture"" wirft, ist, dass du die externe, globale Variable nirgendwo definierst, es ist also nirgendwo "aufgelöst".

Hiermit ein allgemeines Beispiel für eine externe, globale Variable:

C-/C++-Quelltext

1
2
3
4
5
// header:
extern sf::Texture g_MyTexture; // Deklaration

// cpp:
sf::Texture g_MyTexture; // Definition


Deine Klasse CTexture ist so, wie du sie nutzt, relativ sinnlos. Du könntest genauso gut die Memberfunktion CTexture::LoadTexture() aus der Klasse rausnehmen. Ich empfehle dir, von den globalen variablen abzusehen und sie lieber als pointer parameter einer funktion zu übergeben. Aber das ist ein anderes Thema, über das du sehr sehr viele Informationen im Internet finden wirst.

Weiterführende Informationen:
http://stackoverflow.com/questions/14332…-extern-but-how
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »iSmokiieZz« (26.04.2014, 14:47)


Cookiezzz

Frischling

Beiträge: 91

Wohnort: Deutschland

Beruf: Schüler

  • Private Nachricht senden

16

26.04.2014, 14:54

Sprite.hpp:

C-/C++-Quelltext

1
extern sf::Texture TicTacToe_Texture;


irgendeine *.cpp deiner Wahl:

C-/C++-Quelltext

1
sf::Texture TicTacToe_Texture;


Wie schon erwähnt ist hier eine globale Variable nicht besonders sinnvoll.
Um die Lösung zu finden, muss du dich nur einmal in deinen Compiler/Linker versetzen. Der Compiler sieht immer nur eine *.cpp, die er in eine Objektdatei übersetzt. Der Linker fügt dann alles zu deiner *.exe zusammen.
Ohne extern in der hpp würde folgendes passieren:

-Compiler fängt mit Main.cpp an.
-Die Sprite.hpp wird inkludiert und eingefügt. Darin findet sich die globale Variable, sie wird also angelegt.
-Das gleiche mit der Sprite.cpp, da diese auch Sprite.hpp einbindet wird die Variable noch einmal in der Mainobjektdatei angelegt.
-Linker fängt an, die Objektdateien zusammenzufügen. In beiden Dateien findet sich nun eine globale Variable mit dem gleichen Namen. Das geht nicht, der Linker weiß nicht, was er tun soll und bricht ab.

Mit extern, aber ohne Definition in einer cpp:

-Compiler fängt wieder in der Main.cpp an, stößt auf das extern in der Sprite.hpp; Extern heißt soviel wie: Es gibt eine Variable mit diesem Namen woanders, die sollst du benutzen. Es wird keine Variable angelegt, sondern sich darauf verlassen, dass der Linker später dann aus einer anderen Objektdatei eine Variable mit passendem Namen hat, die dann benutzt wird.
-Das gleiche in der Sprite.cpp. Es wird wieder keine Variable angelegt, sondern nur das Einfügen auf den Linker geschoben.
-Der Linker fängt an. Da aber ALLE Objektdateien nun auf diese eine Variable verweisen, sie aber von KEINER angelegt wird, existiert die Variable, auf die verwiesen wird nicht. Der Linker weiß wieder nicht, was er tun soll und bricht ab.

Mit der Lösung passiert folgendes:

-Der Compiler fängt wieder an, stößt zweimal auf das extern und fügt wieder einen Platzhalter für den Linker ein. Die eine Objektdatei legt die Variable tatsächlich an (Wegen dem fehlendem extern in der *.cpp). Der Linker hat nun EINE passende Variable, die er überall einfügen kann, alles ist gut.
-???
-Profit

Nur so mal als Erklärung ;) . Du solltest aber wirklich dringend mal darüber nachdenken, die Variable in eine Klasse zu verschieben, denn 1. willst du sicher mehr als ein Sprite anlegen und 2. hat man dann solche Scherereien mit extern usw. nicht mehr. :nono:

17

26.04.2014, 15:40

Alles klar! Danke für die Übersicht, Cookiezzz. Nun ich habe jetzt die Instanz CSlots Slots in der main.cpp Datei, die ich per MainWindow.draw(Slots); in das Fenster rendern will. Aber es öffnet sich nur die Konsole und dann: SFML_GAME.exe funktioniert nicht mehr...

aber der Compiler selbst spuckt keinen Fehler aus. Woran liegt das?

18

26.04.2014, 16:03

Dein Stichwort lautet Debugger.
Schaue, bis wohin das Programm kommt, bevor es deart abstürzt.

Wo rufst du die CTexture::LoadTexture() eines instanziierten CTexture Objekts auf?
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

19

26.04.2014, 16:22

Ich weiß nicht genau was das bedeutet: Unbehandelte Ausnahme bei 0x777AFD12 (ntdll.dll) in SFML_Game.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000004. Das Problem liegt bei der Definition der Textur: sf::Texture TicTacToe_Texture. Die Memberfunktion CTexture::LoadTexture() rufe ich nur in den anderen Klassen: CSlots, CTransmitter und CXO so auf: &CTexture::LoadTexture;

Cookiezzz

Frischling

Beiträge: 91

Wohnort: Deutschland

Beruf: Schüler

  • Private Nachricht senden

20

26.04.2014, 16:39

Ich glaube, du solltest dir noch einmal grundlegende Dinge anschauen. &CTexture::LoadTexture ruft nicht die Funktion auf, sondern liefert ihre Adresse.

Werbeanzeige