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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

04.05.2013, 16:15

<Speicher kann nicht gelesen werden> C++

Hallo,

ich habe ein kleines Problem... Ich verwende drei Klassen für meinen ersten OpenGL Test. Und ich glaube genau das ist das Problem. Ich erzeuge eine neues Objekt in der Funktion LevelMain bzw in CreatLevel_01. Dann übergebe ich ein paar Werte an die nächste Funktion InitSpirit, und genau hier entsteht der Fehler. Das Programm stürtzt an dieser Stelle ab weil es einen Wert nicht lesen kann, nur warum nicht?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Level
{
public:
    Level(void);
    ~Level(void);

    void LevelMain ();

    bool CreatLevel_01 (int Anzahl);
    bool DeleteLevel_01 (int Anzahl);
    void Print (int Anzahl);

private:
    int LevelStatus;
    bool Creat, Delete;
    spirit* Objekt [20];
};



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
bool Level::CreatLevel_01 (int Anzahl)
{
    int I;
    // Erzeugen der Objekte
    for (I = 0;  I < Anzahl; I++)
    {
        Objekt [I] = new spirit();
    }

    // Wete Festsetzen
    int     Objekt_01_Art = Dreieck;
    float   Objekt_01_X[10] = {0.1f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    float   Objekt_01_Y[10] = {0.1f, 0.8f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    float   Objekt_01_Z[10] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
    float   Objekt_01_viewX = 0.8f;
    float   Objekt_01_viewY = 0.2f;
    float   Objekt_01_viewZ = 3.8f;
    float   Objekt_01_R = 1.0f;
    float   Objekt_01_G = 0.025f;
    float   Objekt_01_B = 1.0f;
    float   Objekt_01_A = 0.0f;

    //Initalisiren
    Objekt [1]->InitSpirit (Objekt_01_Art, Objekt_01_X, Objekt_01_Y, Objekt_01_Z, Objekt_01_viewX, Objekt_01_viewY, Objekt_01_viewZ,
                            Objekt_01_R, Objekt_01_G, Objekt_01_B, Objekt_01_A);

    return true;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class spirit
{
public:
    spirit(void);
    ~spirit(void);
    void PrintSpirit ();
    bool InitSpirit (int art, float x[10], float y[10], float z[10],
        float ViewX, float ViewY, float ViewZ, float r, float g, float b, float a);
private:
    int Art;
    float X [10], Y[10], Z[10];
    float viewX, viewY, viewZ;
    float R, G, B, A;
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spirit::spirit(void)
{
    Art = 0;
    for (int i = 0; i < 10; i++)
    {
        X [i] = 0;
        Y [i] = 0;
        Z [i] = 1;
    }
    viewX = 0;
    viewY = 0;
    viewZ = 0;
    R = 0;
    G = 0;
    B = 0;
    A = 0;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool spirit::InitSpirit (int art, float x[10], float y[10], float z[10], float ViewX, float ViewY, float ViewZ, float r, float g, float b, float a)
{
    Art = art;
    X[0] = x[0]; X[1] = x[1]; X[2] = x[2]; X[3] = x[3]; X[4] = x[4]; X[5] = x[5]; X[6] = x[6]; X[7] = x[7]; X[8] = x[8]; X[9] = x[9];
    Y[0] = y[0]; Y[1] = y[1]; Y[2] = y[2]; Y[3] = y[3]; Y[4] = y[4]; Y[5] = y[5]; Y[6] = y[6]; Y[7] = y[7]; Y[8] = y[8]; Y[9] = y[9];
    Z[0] = z[0]; Z[1] = z[1]; Z[2] = z[2]; Z[3] = z[3]; Z[4] = z[4]; Z[5] = z[5]; Z[6] = z[6]; Z[7] = z[7]; Z[8] = z[8]; Z[9] = z[9];
    viewX = ViewX;
    viewY = ViewY;
    viewZ = ViewZ;
    R = r;
    G = g;
    B = b;
    A = a;
    return true;
}

Auf die Variable Art kann er angeblich nicht zugreifen.

2

04.05.2013, 16:26

Du erstellst 'Anzahl' viele Spirit (sind das wirklich Geister, oder meinst du Sprite?) Objekte, initialisierst aber nur das 2te ([1])? Welchen Wert hat 'Anzahl' denn? Und was meinst du, würde passieren, wenn du nicht mindestens 2 Objekte vorher angelegt hast (Tipp: Genau davon gehe ich nämlich aus, denn wenn man eine Methode von einem Objekt aufruft, das gar nicht exisitert, knall es in der Regel, sobald du das erste Attribut des Objektes benutzt, und das wäre hier offensichtlich Art)
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

04.05.2013, 17:02

Warum musst du deine spirit Objekte mit new erzeugen? Und wieso brauchst du eine separate InitSpirit() Methode, wäre für das nicht eher ein entsprechender Konstruktor angebracht? Ein weiterer Tipp lautet std::vector... ;)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

4

04.05.2013, 18:58

Du erstellst 'Anzahl' viele Spirit (sind das wirklich Geister, oder meinst du Sprite?)
Jetzt werden es wohl Geister :)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

5

04.05.2013, 19:02

Es hat jetzt funktionirt, doch es kommt der Fehler an einer neuen Stelle. Im ersten Frame läuft alles doch dann bricht er wieder ab.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch (Art)
    {
    case Dreieck:
        {
            glTranslatef(viewX, viewY,viewZ); // 1.5 Einheiten nach Links dann 6.0 Einheiten in den Bildschirm hinein
            glColor3f(R, G, B); // Setzt die Farbe auf Blau
            glBegin(GL_TRIANGLES); // Zeichne Dreiecke
            for (I = 0; I < 3; I++)
            {
                glVertex3f( X[I], Y[I], Z[I]); // Oben
            }
            glEnd(); // Fertig gezeichnet
            break;
        }
...
Wo liegt der Fehler jetzt?

6

05.05.2013, 00:42

Existiert denn 'Art'? Oder stehen in X,Y,Z wirklich 3 Einträge drin?
Der Code ansich schaut richtig aus, vermutlich wird er im falschen Kontext benutzt.
Lieber dumm fragen, als dumm bleiben!

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

7

05.05.2013, 13:08

Ja die Einträge stümmen und im ersten Fram läuft auch alles durch nur beim zweitenmal stürtzt es ab. ?(

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

8

05.05.2013, 13:34

Hab den Fehler gefunden. Ich habe mein Objekt immer gleich nach dem Rendern zerstört und dann wieder aufgerufen :dash:

Edit: Warum wird mir trotzdem kein Dreieck angezeigt?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Volker_Neff« (05.05.2013, 15:33)


Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

9

05.05.2013, 23:15

Sorry mir fiel nicht auf das eventuel entscheidener Code fehlt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Grafik.cpp
int grafik::InitGL(GLvoid) // Der ganze Setup Kram für OpenGL kommt hier rein
 {
     glShadeModel(GL_SMOOTH); // aktiviert weiches Shading (Smooth Shading)
      glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Schwarzer Hintergrund 
       glClearDepth(1.0f); // Depth Buffer Setup
       glEnable(GL_DEPTH_TEST); // aktiviert Depth Test
       glDepthFunc(GL_LEQUAL); // Die Art des auszuführenden Depth Test 
       glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // wirklich nette Perspektiven Berechnungen
       return true;
 }

 int grafik::Rest ()
 {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Lösche den Bildschirm und den Depth-Buffer
     glLoadIdentity(); // Resettet die aktuelle Modelview Matrix / Setzt die Position mitig
     return true; // Alles war OK
 }


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
Grafik.h
#ifndef grafik_H_
#define grafik_H_
class grafik
{
public:
    grafik(void);
    ~grafik(void);

    static GLvoid ReSizeGLScene(GLsizei width, GLsizei height);
    int InitGL(GLvoid); // Der ganze Setup Kram für OpenGL kommt hier rein
    int Rest ();
    bool CreatWindow (char* title, int width, int height, int bits, bool fullscreenflag);
    GLvoid KillWindow (GLvoid);

    static LRESULT CALLBACK WndProc(    HWND hWnd, // Handle für dieses Fenster
                                UINT uMsg, // Nachricht für dieses Fenster
                                WPARAM wParam, // Weitere Nachrichten Informationen
                                LPARAM lParam); // Weitere Nachrichten Informationen

    
    void setFullsreen (bool a);
    bool getFullscreen ();
    int getActive ();
    HDC gethDC ();

private:
    HGLRC hRC; // Permanenter Rendering Context
    HDC hDC; // Privater GDI Device Context
    HWND hWnd; // Enthält unser Fenster-Handle
    HINSTANCE hInstance; // Enthält die Instanz der Applikation
    static bool active; // Fenster Aktiv Flag standardmäßig auf TRUE gesetzt
    bool fullscreen; // Fullscreen Flag ist standardmäßig auf TRUE gesetzt

public:
    static bool keys[256]; // Array das für die Tastatur Routine verwendet wird
};
#endif

Könntet ihr mir jetzt vieleicht weiterhelfen ?(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

06.05.2013, 06:30

Ich seh da nirgends ein SwapBuffers.
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