Du bist nicht angemeldet.

Werbeanzeige

1

16.10.2011, 20:01

Nicht aufgelöstes externes Symbol bei dem Auflisten der Adapter

Hallo wieder einmal, leider habe ich erneut ein Problem.
Eigentlich bezieht es sich ziemlich genau auf das Beispiel im Buch (Seite 109), bei dem die Grafikadapter aufgelistet werden.
Undzwar habe ich folgendes Problem:

Ich erhalte (leider weiß ich nicht, nicht einmal nach der msdn Seite, warum) beim Kompilieren 2 Fehler (die höchstwahrscheinlich zusammenhängen):
Fehler error LNK1120: 1 nicht aufgelöste externe Verweis
Fehler error LNK2001: Nicht aufgelöstes externes Symbol "_Direct3DCreate9@4".

Hier ist mein Code:

Quellcode

1
2
3
4
5
6
7
8
     PDIRECT3D9 m_pD3D;
    m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(!m_pD3D)
    {
        // Fehler!
        MessageBox(NULL, "Die IDirect3D9-Schnittstelle konnte nicht generiert werden! DirectX 9 oder höher wird benötigt!", "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR("Die IDirect3D9-Schnittstelle konnte nicht generiert werden! DirectX 9 oder höher wird benötigt!", TB_ERROR);
    }


Ich bin mir sehr sicher, alle auch im Beispiel verwendeten Imports (Windows.h, stdio.h, d3d9.h) eingebunden zu haben und bei dem Projekt gab es vorher noch nie Fehler.
Weiß irgendwer, woher dieser Fehler kommt bzw. wie man ihn beheben kann?

BurningWave

Alter Hase

Beiträge: 1 110

Spieleentwicklung: Hobby

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

16.10.2011, 21:06

Du hast hoffentlich nicht nur die Dateien eingebunden, sondern auch gegen die passenden Libs gelinkt (Linkereinstellungen -> Eingabe)?!

Manchmal hilft es, das Projekt zu bereinigen und komplett neu zu erstellen.

3

17.10.2011, 06:43

Also mitgelinkt denke ich schon, Tribase hat immer funktioniert und wenn ich "d3d9.h" eingeben will, schlägt er mir einige directx header vor (wieso sollte er sie vorschlagen, wenn sie nicht mitgelinkt wurden?).
Bereinigen bzw. neu erstellen hilft leider auch nicht.
Hat irgendjemand vielleicht noch eine andere Idee?

dot

Supermoderator

Beiträge: 9 000

Spieleentwicklung: Hobby

Wohnort: Graz

  • Private Nachricht senden

4

17.10.2011, 07:28

Du hast vergessen d3d9.lib zu linken.

5

24.10.2011, 18:48

Oh danke, hab die leider nicht richtig mitgelinkt :rolleyes:

aber jetzt habe ich noch ein (eher kleineres) Problem:

Ich habe eine Funktion mit einem Char Array als Parameter (char ch1[]) und jetzt habe ich bei dem Laden einer Datei einen char Pointer (char*).
Wie kann ich ganz einfach diesen Pointer in ein Char Array umwandeln und der Funktion liefern?
Ich hab schon einiges versucht, aber meistens ist das übergebene Array dann nur 1 Eintrag groß und es wird nur das "A" am Anfang mitgeliefert...

MfG pd9937

dot

Supermoderator

Beiträge: 9 000

Spieleentwicklung: Hobby

Wohnort: Graz

  • Private Nachricht senden

6

24.10.2011, 18:52

So ganz klar ist mir das Problem nicht. Zeig vielleicht mal etwas Code.

7

24.10.2011, 19:32

ifstream file("some file.txt");
char* buffer = new char;

int index = 0;
while(!file.eof())
{
file.getline(buffer, 50);

xxx->Fill(?????????????????????);


index++;
}


class xxx {

tbResult Fill(char NewContent[])
{
char* temp = new char[sizeof (NewContent) / sizeof (char) + 1];
temp = NewContent;
m_pContent = temp;

return TB_OK;
}

}


Ich hoffe, das ist halbwegs verständlich...

Also um es noch etwas besser auszudrücken: Ich habe eine Funktion und eine Klasse, die selbst eine Membervariable vom Typ char* hat und eine Funktion besitzen soll, die diese zuweist.
Falls es eine bessere Lösung dafür gibt (z.b. andere funktionsparameter) würde ich diese auch gerne akzeptieren, es geht eigentlich nur darum, einen char* Wert in eine Klasse zu kriegen.

BurningWave

Alter Hase

Beiträge: 1 110

Spieleentwicklung: Hobby

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

8

24.10.2011, 19:48

char* buffer = new char;
Was wird das? Speicherplatz für einen einzigen char, in den weiter unten 50 Zeichen kopiert werden? Dieser Speicherplatz wird außerdem nicht gelöscht. Ganz schlecht.
Besser wäre: char buffer[50];

xxx->Fill(?????????????????????);
Muss heißen xxx->Fill("?????????????????????");

Mache aus tbResult Fill(char NewContent[]) das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
tbResult Fill(char *NewContent)
{
   if(m_pContent) {
      delete [] m_pContent;
      m_pContent = NULL;
   }

   m_pContent  = new char[sizeof (NewContent) / sizeof (char) + 1];  // Nicht vergessen, m_pContent wieder zu löschen
   strncpy(m_pContent, NewContent, 50);

   return TB_OK;
}


Hier möchte ich auch mal auf std::string verweisen, was du in jedem Falle bevorzugen solltest.

9

24.10.2011, 19:59

char* buffer = new char;
Was wird das? Speicherplatz für einen einzigen char, in den weiter unten 50 Zeichen kopiert werden? Dieser Speicherplatz wird außerdem nicht gelöscht. Ganz schlecht.
Besser wäre: char buffer[50];

xxx->Fill(?????????????????????);
Muss heißen xxx->Fill("?????????????????????");

Mache aus tbResult Fill(char NewContent[]) das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
tbResult Fill(char *NewContent)
{
   if(m_pContent) {
      delete [] m_pContent;
      m_pContent = NULL;
   }

   m_pContent  = new char[sizeof (NewContent) / sizeof (char) + 1];  // Nicht vergessen, m_pContent wieder zu löschen
   strncpy(m_pContent, NewContent, 50);

   return TB_OK;
}


Hier möchte ich auch mal auf std::string verweisen, was du in jedem Falle bevorzugen solltest.




Oh danke, funktioniert sichtlich sehr gut!

Oh warte:
Unbehandelte Ausnahme bei 0x7729e653 in MyProject.exe: 0xC0000374: Ein Heap wurde beschädigt.
bei:

Quellcode

1
2
3
4
if(m_pContent) {
    delete [] m_pContent;        //Diese Zeile
    m_pContent = NULL;
}

dot

Supermoderator

Beiträge: 9 000

Spieleentwicklung: Hobby

Wohnort: Graz

  • Private Nachricht senden

10

24.10.2011, 20:03

Verwend doch einfach std::string ;)

Werbeanzeige