JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=150ef9c86056dd36ca7a694b3a58c956Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Namensbereiche

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
IO
Mini JLI'ler



Anmeldedatum: 02.08.2003
Beiträge: 21

Medaillen: Keine

BeitragVerfasst am: 15.08.2003, 17:09    Titel: Namensbereiche Antworten mit Zitat

Hallo,
sorry, dass ich mit so einer einfachen Frage nerve, aber ich bekomme dieses blöde Problem einfach nicht weg.

Ich hab einen Namensbereich und darin habe ich 2 Device. Wnen ich jetzt die Datei z.B. in Main.cpp einbinden will, dann bekomm ich immer diese Fehler:


[quote]
Main.obj : error LNK2005: "struct IDirect3DDevice9 * Graphics::pDevPrev" (?pDevPrev@Graphics@@3PAUIDirect3DDevice9@@A) bereits in le3D.obj definiert
[quote]

Ich hab auch Header Wächter....
Kann mir jemand einen Tipp geben ??

Bye
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 15.08.2003, 17:42    Titel: Antworten mit Zitat

Ich nehme an, dass du in deinem (beiden) Headern zu stehen hast:
Code:
LPD3DDevice9 pDevPrev=null;

Du darft in Headern aber nicht Initialisieren, sondern nur Definieren.
Zum Initialisieren sollten Konstruktoren verwendet werden.
Auch sollte beachtet werden, dass der gleiche Header nur ein mal includiert wird. ==> #pragma once

AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
IO
Mini JLI'ler



Anmeldedatum: 02.08.2003
Beiträge: 21

Medaillen: Keine

BeitragVerfasst am: 15.08.2003, 17:45    Titel: Antworten mit Zitat

nein hab ich nicht

Ausserdem steht ja in dem Fehler: Mehrfach definiert !

Nicht deklariert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
IO
Mini JLI'ler



Anmeldedatum: 02.08.2003
Beiträge: 21

Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 09:27    Titel: Antworten mit Zitat

*push*
Kann mir echt niemand helfen ??

So sieht mein Namensbereich aus:
Code:
namespace blaBla
{
   BOOL InitD3D(void);
   BOOL InitScene(void);
   BOOL Exit(void);



   LPDIRECT3D9         pD3D;
   LPDIRECT3DDEVICE9      pDevice;
   LPDIRECT3DDEVICE9      pDevPrev;


   class Irgendeine
   {
      . . .
   };


   class Nocheine
   {

      . . .
   };
}


Bitte..........
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 09:37    Titel: Antworten mit Zitat

Ich bin mir zimlich Sicher, dass du
a) Mehrere Dateien in deinem Projekt hast,
b) ein und den selben Header (der wo dein Codeausschnitt zu sehen ist) von Verschiedenen C++-Dateien includiert wird.

Damit werden in jedem Objekt beim Erstellen der Ausführbaren Datei die Funktionen InitD3D, InitSzene und Exit sowie die Variablen pD3D, pDevice und pDevPrew definiert. Da diese Objekte ann in mehreren Obj-Dateien zu finden sind, weiß der Linker später nicht, welchen er nutzen kann.

Lösung: Weniger globale Variablen nutzen und die, die sich gar nicht vermeiden lassen müssen als extern definiert werden und in einer einzigen C++-Datei am anfang extra definiert werden, dort ohne extern.

Damit weiß der Linker, dass diese Funktionen und Variablen die gleichen sind. Durch die Extern-Definition werden sie den anderen Objekt-Dateien nur bekannt gemacht, ohne eine wirkliche definition zu erstellen.

HTH
AFE-GmdG
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
IO
Mini JLI'ler



Anmeldedatum: 02.08.2003
Beiträge: 21

Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 10:01    Titel: Antworten mit Zitat

Hi,
dürfte doch aber eigntlich nicht sein, denn ihc hab ja Include Guards.

Oder bringen die nichts ??

Bei 1) und 2) hast du recht, allerdings dürfte es dohc mit den Guards keine Probleme geben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 18:07    Titel: Antworten mit Zitat

Von Incude Guards hab ich noch nie was gehört. Ist das ein Plugin für VC? Wenn er solche Fehler verhindern soll - funktioniert er wohl nicht richtig...
Lösungsvorschläge hab ich ja schon gegeben.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 18:11    Titel: Antworten mit Zitat

#pragma once z.B. nennt man Include Guard.
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 16.08.2003, 18:24    Titel: Antworten mit Zitat

Ach so, das verwende ich ja auch.

ABER Ich zeige mal ein Komkretes Beispiel, wo der Fehler auftritt:
3 Dateien, 2 C++-Dateien und 1 Header.

Header.h
Code:
#pragma once

int i=0;
Datei1.cpp
Code:
#include "Header.h"

int get_i() {
  return i;
}
Datei2.cpp
Code:
#include "Header.h"

void set_i(int _i) {
  i=_i;
}

Jetzt kompilieren wir das mal Schrittweise:
Datei1.obj
Es werden die Symbole i und get_i() angelegt.
Datei2.obj
Es werden die Symbole i und set_i(int) angelegt.
beim Linken werden jetzt alle Obj-Dateien in eine (ausführbare) Datei gelinkt. Der Linker findet aber in beiden Objektdateien das Symbol i und hat keine Information darüber, ob es das gleiche Symbol ist oder ob es unterschiedliche Symbole sind.
Fazit: Global definierte Symbole können Ärger verursachen (Verursachen fast immer Ärger)
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum