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

02.08.2013, 20:13

(C++) vector subscript out of range

Guten Abend,

ich beschäftige mich seit einiger zeit mit dem laden von Wavefront .obj Datein. Jetzt geht es aber nicht mehr weiter.
Die Funktion zum Laden sieht so aus:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
bool ModelClass::LoadModel(char* filename)
{
    //Temp Variablen
    std :: vector <unsigned int  > vertexIndices, uvIndices, normalIndices;
    std :: vector <vec3> temp_vertices;
    std :: vector <vec2> temp_uvs;
    std :: vector <vec3> temp_normals;


    FILE * file = fopen(filename, "r");
    if( file == NULL )
    {
        printf("Impossible to open the file !\n");
        return false;
    }

    while( 1 )
    {
 
        char lineHeader[128];
        // read the first word of the line
        int res = fscanf(file, "%s", lineHeader);
        if (res == EOF)
        {
            break; // EOF = End Of File. Quit the loop.

        }

        if ( strcmp( lineHeader, "v" ) == 0 )
        {
            vec3 vertex;
            fscanf(file, "%f %f %f\n", &vertex.x, &vertex.y, &vertex.z );
            temp_vertices.push_back(vertex);
        }

        else if ( strcmp( lineHeader, "vt" ) == 0 )
        {
            vec2 uv;
            fscanf(file, "%f %f\n", &uv.x, &uv.y );
            temp_uvs.push_back(uv);
        }

        else if ( strcmp( lineHeader, "vn" ) == 0 )
        {
            vec3 normal;
            fscanf(file, "%f %f %f\n", &normal.x, &normal.y, &normal.z );
            temp_normals.push_back(normal);
        }

        else if ( strcmp( lineHeader, "f" ) == 0 )
        {
            std::string vertex1, vertex2, vertex3;
            unsigned int vertexIndex[3], uvIndex[3], normalIndex[3];
            int matches = fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIndex[0], &uvIndex[0], &normalIndex[0], &vertexIndex[1], &uvIndex[1], &normalIndex[1], &vertexIndex[2], &uvIndex[2], &normalIndex[2] );
            if (matches != 9)
            {
                printf("File can't be read by our simple parser : ( Try exporting with other options\n");
                return false;
            }
            vertexIndices.push_back(vertexIndex[0]);
            vertexIndices.push_back(vertexIndex[1]);
            vertexIndices.push_back(vertexIndex[2]);
            uvIndices    .push_back(uvIndex[0]);
            uvIndices    .push_back(uvIndex[1]);
            uvIndices    .push_back(uvIndex[2]);
            normalIndices.push_back(normalIndex[0]);
            normalIndices.push_back(normalIndex[1]);
            normalIndices.push_back(normalIndex[2]);
        }
    }

    // For each vertex of each triangle
        for( unsigned int i=0; i<vertexIndices.size(); i++ )
        {
            unsigned int vertexIndex = vertexIndices[i];
            vec3 vertex = temp_vertices[ vertexIndex-1 ];
            this->vertices.push_back(vertex);
        }
        for( unsigned int i=0; i<uvIndices.size(); i++ )
        {
            unsigned int uvIndex = uvIndices[i];
            vec2 uv = temp_uvs[ uvIndex-1 ];
            this->uv.push_back(uv);
        }
        for( unsigned int i=0; normalIndices.size(); i++ )
        {
            unsigned int normalIndex = normalIndices[i];
            vec3 normal = temp_normals[ normalIndex-1 ];
            this->normals.push_back(normal);
        }

    m_model = new ModelType[vertices.size()];

    for(unsigned int i = 0; i < vertices.size(); i++)
    {
        m_model[i].x = vertices[i].x;
        m_model[i].y = vertices[i].y;
        m_model[i].z = vertices[i].z;

        m_model[i].tu = uv[i].x;
        m_model[i].tv = uv[i].y;

        m_model[i].nx = normals[i].x;
        m_model[i].ny = normals[i].y;
        m_model[i].nz = normals[i].z;
    }

    return true;
}

Doch leider gibt es nach dem letzten Durchlauf der Schleife in Zeile 85 dieser Fehler:
Debug Assertion Failed
Programm:...Studio
vetor line 932
Vector ubscript out of range

ich freue mich über Antworten

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

02.08.2013, 20:25

Schau dir mal die Abbruchbedingung der For-Schleife in Zeile 85 an. ;)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

02.08.2013, 20:34

Ich muss leider passen?( , sie soll abbrechen wenn der komplette Vector Kopiert ist, was bei den Schleifen davor auch funktioniert

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

02.08.2013, 20:51

Ich muss leider passen?( , sie soll abbrechen wenn der komplette Vector Kopiert ist, was bei den Schleifen davor auch funktioniert

In den Schleifen davor vergleichst du aber mit i... ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

02.08.2013, 20:51

Weil sie eben ganz anders als die Schleifen davor ist. Kann doch nicht so schwer sein die Zeilen mal zu vergleichen, oder? ;)

Edit:
Architekt, du oller Spoiler, lass die Leute doch mal selber ihren Code richtig lesen und selber denken.
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]

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

02.08.2013, 21:03

Manchmal sieht man aber wirklich den Wald vor lauter Bäumen nicht. Hach da hätte C# beim kompilieren schon einen auf dem Deckel gegeben...^^ (bin ich mir zumindest ziemlich sicher. Hatte das schon einmal bei einem if, als ich C nach C# portiert habe).

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

7

02.08.2013, 21:46

Manchmal sieht man aber wirklich den Wald vor lauter Bäumen nicht.
Das ist mir jetzt peinlich, da habe ich drei Stunden dran geknobelt :dash:
Danke :thumbsup:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

02.08.2013, 21:49

Eine sehr wichtige Fähigkeit eines guten Programmierers ist es, den Code so zu lesen, wie er da steht und nicht so, wie er es erwartet. Auch den eigenen! Aber das ist nicht einfach.
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]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

02.08.2013, 22:30

Weil sie eben ganz anders als die Schleifen davor ist. Kann doch nicht so schwer sein die Zeilen mal zu vergleichen, oder? ;)

Edit:
Architekt, du oller Spoiler, lass die Leute doch mal selber ihren Code richtig lesen und selber denken.

Mit dem Hint hat er es nicht gefunden. Ich denke ohne weitere Tipps hätte er morgen noch gesucht, also wozu seine Zeit opfern.
Solchen Leute muss man zumindest einmal die Lösung direkt präsentieren, damit sie lernen, den Code den sie schreiben auch zu lesen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

10

03.08.2013, 00:43

Ich werde mich bemühen

Werbeanzeige