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

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

21

17.11.2008, 14:38

Zitat von »"Nexus"«

switch wäre auch keine schlechte Idee... ;)

ja, ich weis, aber ich konzentriere mich mehr darauf, ob es funktioniert, optimieren und übersichtlicher machen tu ich erst am schluss.

Zitat von »"Deviloper"«

grundlagen wäre hier generell das beste ...

wieso? die "wesentlichen" grundlagen beherrsche ich eigentlich nicht schlecht.

Zitat von »"TrikkieMikkie"«

Gon

Schau mal in den Projekteinstellungen unter C++ - Codegenerierung -> Laufzeitbibliothek und stell ggf. auf "/MTd" oder "/MDd" um.

ok, hab ich gemacht. bei /MDd kommt aber immernoch eine Meldung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1>------ Erstellen gestartet: Projekt: Teilchenbeschleuniger, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Framework.cpp
1>Game.cpp
1>Line.cpp
1>main.cpp
1>Menu.cpp
1>Settings.cpp
1>Sprite.cpp
1>Statistics.cpp
1>Timer.cpp
1>Code wird generiert...
1>Verknüpfen...
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
1>Das Manifest wird eingebettet...
1>mt.exe : general error c101008a: Failed to save the updated manifest to the file ".\Debug\Teilchenbeschleuniger.exe.embed.manifest". Falscher Parameter.
1>Das Buildprotokoll wurde unter "file://c:\Programmierung\Projekte\C++\Grafik-Programme\Teilchenbeschleuniger\Debug\BuildLog.htm" gespeichert.
1>Teilchenbeschleuniger - 1 Fehler, 1 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


er kann das aktuallisierte manifest nicht in die datei Teilchenbeschleuniger.exe.embed.manifest schreiben, da ein Parameter falsch ist. aber welcher?

bei /MTd kommen sehr viele fehler:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1>------ Erstellen gestartet: Projekt: Teilchenbeschleuniger, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Framework.cpp
1>Game.cpp
1>Line.cpp
1>main.cpp
1>Menu.cpp
1>Settings.cpp
1>Sprite.cpp
1>Statistics.cpp
1>Timer.cpp
1>Code wird generiert...
1>Verknüpfen...
1>Framework.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::endl(class std::basic_ostream<char,struct std::char_traits<char> > &)" (?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > & (__cdecl*)(class std::basic_ostream<char,struct std::char_traits<char> > &))" (??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: static bool __cdecl std::char_traits<char>::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: static int __cdecl std::char_traits<char>::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > & __thiscall std::basic_ostream<char,struct std::char_traits<char> >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: class std::basic_streambuf<char,struct std::char_traits<char> > * __thiscall std::basic_ios<char,struct std::char_traits<char> >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: __thiscall std::_Container_base_secure::~_Container_base_secure(void)" (??1_Container_base_secure@std@@QAE@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: void __thiscall std::_Container_base_secure::_Orphan_all(void)const " (?_Orphan_all@_Container_base_secure@std@@QBEXXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: static unsigned int __cdecl std::char_traits<char>::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: int __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: __thiscall std::_Container_base_secure::_Container_base_secure(void)" (??0_Container_base_secure@std@@QAE@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: void __thiscall std::basic_ostream<char,struct std::char_traits<char> >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: class std::basic_ostream<char,struct std::char_traits<char> > * __thiscall std::basic_ios<char,struct std::char_traits<char> >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: void __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: void __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: char __thiscall std::basic_ios<char,struct std::char_traits<char> >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>Framework.obj : error LNK2005: "public: int __thiscall std::basic_streambuf<char,struct std::char_traits<char> >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) ist bereits in msvcprtd.lib(MSVCP90D.dll) definiert.
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMTD.lib(typinfo.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _exit ist bereits in LIBCMTD.lib(crt0dat.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _strrchr ist bereits in LIBCMTD.lib(strrchr.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _fgetc ist bereits in LIBCMTD.lib(fgetc.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _fclose ist bereits in LIBCMTD.lib(fclose.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: _setvbuf ist bereits in LIBCMTD.lib(setvbuf.obj) definiert.
1>msvcrt.lib(MSVCR90.dll) : error LNK2005: __isctype ist bereits in LIBCMTD.lib(isctype.obj) definiert.
1>LIBCMTD.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
1>.\Debug/Teilchenbeschleuniger.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
1>Das Buildprotokoll wurde unter "file://c:\Programmierung\Projekte\C++\Grafik-Programme\Teilchenbeschleuniger\Debug\BuildLog.htm" gespeichert.
1>Teilchenbeschleuniger - 35 Fehler, 1 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


die meisten fehler liegen an Framework.obj, und zwar das manche sachen schon in der msvcprtd.lib(MSVCP90D.dll) definiert sind.

was ist immernoch falsch? irgendwas stimmt mit der msvcrt.lib nicht...
und wenn ich, wie in der warnung der ersten fehlermeldung, NODEFAULTLIB:msvcrt.lib bei den libs einbinde, kann der compiler sie nicht finden...

ich hoffe, jemand kann mir helfen.

vielen dank im voraus,

mfg Gon

22

17.11.2008, 14:45

Hast du mal geprüft, ob du jeweils die Debug-Version deiner Libraries verwendest?

Ansonsten gabs hier neulich noch was zum Thema Laufzeitbibliotheken:

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=10561&postdays=0&postorder=asc&start=0

Gon

Treue Seele

  • »Gon« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Nahe München

Beruf: Schüler (9. Klasse Gymnasium)

  • Private Nachricht senden

23

17.11.2008, 15:24

also bis ich das mit den vectors gemacht habe, gings ja auch.
aber jetzt hab ichs wieder zum laufen gebracht, ich hatte bei NODEFAULTLIB:msvcrt.lib den slash am anfang vergessen :oops:
aber jetzt freezt das programm, wenn es die Linien laden, bzw. rendern soll, und beim debuggen komm ich auf einen fehler, den ich schon öfters hatte. der fehler war immer, dass ich bei dem Linien-Array, das ich vor den vectoren hatte, auf eine stelle zugegriffen habe, die nicht mehr im array war.
es muss also an dem teil von meinem quelltext liegen:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/ RenderSteps
//

// Aufgabe: Linien, bzw. Punkte, die den Weg markieren, rendern

//

void CGame::RenderSteps ()
{

    if (m_Zufallszahl == 1)  // Links(-Rechts)-Linie zeichnen

    {
        m_vLineLeft[m_Left].SetPos ((m_fPlayerEndXPos + 12.5f), (m_fPlayerEndYPos));
   
    }

    else if (m_Zufallszahl == 2)  // (Links-)Rechts-Linie zeichnen

    {
        m_vLineRight[m_Right].SetPos ((m_fPlayerEndXPos - 37.5f), (m_fPlayerEndYPos));
   
    }

    else if (m_Zufallszahl == 3)  // Oben(-Unten)-Linie zeichnen

    {
        m_vLineUp[m_Up].SetPos ((m_fPlayerEndXPos), (m_fPlayerEndYPos + 12.5f));
   
    }

    else if (m_Zufallszahl == 4)  // Oben(-Unten)-Linie zeichnen

    {
        m_vLineDown[m_Down].SetPos ((m_fPlayerEndXPos), (m_fPlayerStartYPos - 37.5f));
   
    }

    else if (m_Zufallszahl == 5)  // Stop-Punkt zeichnen

    {
        m_vStopPoint[m_Stop].SetPos ((m_fPlayerEndXPos), (m_fPlayerEndYPos));
   
    }

   

    for (int i = 0; i < m_Steps; i++)
    {

        m_vLineLeft[i].Render ();

        m_vLineRight[i].Render ();

        m_vLineUp[i].Render ();

        m_vLineDown[i].Render ();

        m_vStopPoint[i].Render ();
     }
       
} // RenderSteps


es kann natürlich auch beim initialisieren ein fehler sein:

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
// werte aus ini-datei lesen

  char ini[] = "C:\\Programmierung\\Projekte\\C++\\Grafik-Programme\\Teilchenbeschleuniger\\Data\\TB.ini";

  m_Steps    = GetPrivateProfileInt("Settings", "Schritte", 0, ini);

  CSprite         SpriteTemp;             // Temporäres Sprite


  for (int i = 0; i < m_Steps; i++)
  {

      SpriteTemp.Load ("Data/Line_Left_Right.bmp");
      SpriteTemp.SetColorKey (255, 0, 255);
      m_vLineLeft.push_back (SpriteTemp);
      
      SpriteTemp.Load ("Data/Line_Left_Right.bmp");
      SpriteTemp.SetColorKey (255, 0, 255);
          m_vLineRight.push_back (m_SpriteTemp);
      
      SpriteTemp.Load ("Data/Line_Up_Down.bmp");
      SpriteTemp.SetColorKey (255, 0, 255);
      m_vLineUp.push_back (SpriteTemp);

      SpriteTemp.Load ("Data/Line_Up_Down.bmp");
      SpriteTemp.SetColorKey (255, 0, 255);
      m_vLineDown.push_back (SpriteTemp);

      SpriteTemp.Load ("Data/StopPoint.bmp");
      SpriteTemp.SetColorKey (255, 0, 255);
      m_vStopPoint.push_back (SpriteTemp);

  }


am ende von dieser schleife soll m_vLineLeft so viele einträge haben, wie viele m_Steps es sind, z.b. bei m_Steps == 20 soll es m_vLineLeft(20) sein, das vector-array soll also 20 (bzw. 21, weil ja die null auch zählt) einträge haben, alle sollen mit dem Sprite "Data/Line_Left_Right" gefüllt sein, und bei der render-funktion geht die schleife alle einträge durch und rendert sie...irgendwo da muss der fehler liegen, aber wo?
bei beiden lautet die schleife nähmlich

C-/C++-Quelltext

1
for (int i = 0; i < m_Steps; i++)
also kann garnicht auf einen array-eintrag zugegriffen werden, der außerhalb des arrays liegt...
oder vielleicht liegt es daran, dass die zählung bei null beginnt, dass es also nur bis 19 geht? (aber es dann trotzdem 20 einträge)


hoffentlich weis jemand weiter.

vielen dank im voraus,

mfg Gon



EDIT:
diese fehlermeldung ist gekommen, als ich versuchte, das programm ohne debuggen zu starten:

(Link)

(Link)



EDIT2:
ich konnte durch schreiben von daten in eine ini-datei den fehler eingrenzen. er befindet sich 100% in dieser zeile

C-/C++-Quelltext

1
    m_vLineLeft.push_back (SpriteTemp);

alles bis zu diesem punkt wird in die datei geschrieben, ab diesem punkt und nach diesem punkt nicht mehr, weil das programm dann nähmlich schon abgestürzt ist.
was ist an dieser zeile aber falsch? vectoren haben doch eine funktion push_back, der paramter muss eine instanz des datentypen(bzw. der klasse) des vectors, bzw. des vector-arrays sein. und da m_vLineLeft.push_back als vector deklariert ist

C-/C++-Quelltext

1
vector<CSprite> m_vLineLeft;

und vom typ CSprite ist, muss der parameter von push_back ebenfalls ein CSprite sein, was ja auch der fall ist, wie man an der deklaration von SpriteTemp sehen kann

C-/C++-Quelltext

1
CSprite  SpriteTemp;  // Temporäres Sprite


warum läuft das also nicht?

vielen dank im voraus

mfg Gon

Werbeanzeige