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

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

21

27.06.2004, 21:25

Interessanter wäre feof.

Wie öffnest Du die Datei?
"Games are algorithmic entertainment."

22

27.06.2004, 21:44

Mit:
Datei=fopen(Dateiname, "r");
feof prüf ich auch, aber die Datei ist bestimmt nicht zu Ende, da nach den Indices noch die Textur folgt.

23

27.06.2004, 21:53

ich habs jetzt nochmal genau geprüft: Die fread Funktion liest definitiv nicht die angegebene Größe aus der Datei. Und in der MSDN kann ich nix darüber finden was man da machen kann.

24

27.06.2004, 22:00

ok, ich hab einen feof() Nach dem Lesevorgang gemacht. Die Datei scheint tatsächlich zu ende zu sein. Das dürfte aber eigentlich gar nicht sein.
Beim speichern rechne ich erst die Chunkgröße aus, schreibe den Chunk und prüfe dann, ob genausoviel geschrieben wurde, wie ich vorher ausgerechnet hab. Danach wird dann noch die textur geschrieben. Und es wird immer die richtige Größe geschrieben. Ich hab echt keine Ahnung woran das liegen könnte!
Ich kann ja einfach nochmal den speichercode psoten:

Quellcode

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
void CPartlist::ExportToFile(LPCSTR Filename)
{

    char acDateiname[32];
    FILE* Datei=NULL;
    FileChunk ChunkHeader;
    DWORD dwChunkSizeTest=0;

    sprintf(acDateiname, "%s.mdl", Filename);

    Datei=fopen(acDateiname, "w");
    if(NULL==Datei) Error("Fehler beim erstellen der Exportdatei!");
    
    //Den DateiHeader schreiben
    ChunkHeader.eChunkTyp=CT_HEADER1;
    ChunkHeader.dwChunkSize=sizeof(int);
    fwrite(&ChunkHeader, sizeof(FileChunk), 1, Datei);
    int iDateiTyp=2;//Modelleditordatei, exportiert
    fwrite(&iDateiTyp, sizeof(int), 1, Datei);


    //Als erstes die Gesamtzahl der Vertices/Indices ermitteln
    int iNumVertices=0;
    int iNumIndices=0;
    m_PartIt=m_Partliste.begin();
    for(int i=0; i<m_Partliste.size(); i++)//Schleife durchgehen und Teilzahlen zu Gesamtzahl addieren
    {
        iNumVertices+=(*m_PartIt)->GetNumVertices();
        iNumIndices+=(*m_PartIt)->GetNumIndices();
        m_PartIt++;
    }


    //Die Vertices schreiben:
    ChunkHeader.eChunkTyp=CT_VERTICES;
    ChunkHeader.dwChunkSize=sizeof(int)+sizeof(DWORD)+(sizeof(TexturedVertex)*iNumVertices);
    fwrite(&ChunkHeader, sizeof(FileChunk), 1, Datei);
    dwChunkSizeTest=0;
    DWORD dwFVF=TexturedVertexFVF;
    dwChunkSizeTest+=fwrite(&iNumVertices, sizeof(int), 1, Datei)*sizeof(int);//Anzahl der Vertices
    dwChunkSizeTest+=fwrite(&dwFVF, sizeof(DWORD), 1, Datei)*sizeof(DWORD);//Das Format
    m_PartIt=m_Partliste.begin();//Schleife zum speichern aller Parts
    for(i=0; i<m_Partliste.size(); i++)
    {
        dwChunkSizeTest+=fwrite((*m_PartIt)->GetVertices(), sizeof(TexturedVertex), (*m_PartIt)->GetNumVertices(), Datei)*sizeof(TexturedVertex);
        m_PartIt++;
    }
    if(dwChunkSizeTest!=ChunkHeader.dwChunkSize)
    {
        Error("Export: Fehler beim berechnen der Chunkgröße! CT_VERTICES");
        Error(dwChunkSizeTest);
        Error(ChunkHeader.dwChunkSize);
    }


    //Die Indices schreiben
    ChunkHeader.eChunkTyp=CT_INDICES;
    ChunkHeader.dwChunkSize=sizeof(int)+sizeof(DWORD)+(sizeof(IndexFormat)*iNumIndices);
    fwrite(&ChunkHeader, sizeof(FileChunk), 1, Datei);
    dwChunkSizeTest=0;
    IndexFormat offset=0;  // Offset für die Index-Werte 
    DWORD dwIF=sizeof(IndexFormat);
    dwChunkSizeTest+=fwrite(&iNumIndices, sizeof(int), 1, Datei)*sizeof(int);//Anzahl der Indices
    dwChunkSizeTest+=fwrite(&dwIF, sizeof(DWORD), 1, Datei)*sizeof(DWORD);//IndexFormat schreiben
    m_PartIt = m_Partliste.begin();
    for(i=0; i<m_Partliste.size(); i++) 
    {
        for(int c=0; c<(*m_PartIt)->GetNumIndices(); c++)
        {
            IndexFormat Index = (*m_PartIt)->GetIndices()[c] + offset; 
            dwChunkSizeTest+=fwrite(&Index, sizeof(IndexFormat), 1, Datei)*sizeof(IndexFormat); 
        }
        offset+=(IndexFormat)(*m_PartIt)->GetNumVertices();
        m_PartIt++;
    }
    if(dwChunkSizeTest!=ChunkHeader.dwChunkSize)
    {
        Error("Export: Fehler beim berechnen der Chunkgröße! CT_INDICES");
        Error(dwChunkSizeTest);
        Error(ChunkHeader.dwChunkSize);
    }


    //Die Textur schreiben:
    ChunkHeader.eChunkTyp=CT_TEXTURE;
    ChunkHeader.dwChunkSize=sizeof(char)*16;
    fwrite(&ChunkHeader, sizeof(FileChunk), 1, Datei);
    dwChunkSizeTest=0;
    dwChunkSizeTest+=fwrite(m_acTexturename, sizeof(char), 16, Datei)*sizeof(char);
    if(dwChunkSizeTest!=ChunkHeader.dwChunkSize)
    {
        Error("Export: Fehler beim berechnen der Chunkgröße! CT_TEXTURE");
        Error(dwChunkSizeTest);
        Error(ChunkHeader.dwChunkSize);
    }

    
    //Die Gruppeninformationen schreiben, damit die Datei später wieder ins Editorformat umgewandelt werden kann!
    ChunkHeader.eChunkTyp=CT_PARTINFOS;
    ChunkHeader.dwChunkSize=sizeof(int)+(sizeof(int)*2*m_Partliste.size());//Anzahl der Gruppen, für jede Gruppe Anzahl Vertices, Anzahl Indices
    fwrite(&ChunkHeader, sizeof(FileChunk), 1, Datei);
    dwChunkSizeTest=0;
    int iNumParts=m_Partliste.size();
    dwChunkSizeTest+=fwrite(&iNumParts, sizeof(int), 1, Datei)*sizeof(int);//Anzahl der Gruppen
    m_PartIt=m_Partliste.begin();
    for(i=0; i<m_Partliste.size(); i++)
    {
        int iPuffer=0;
        iPuffer=(*m_PartIt)->GetNumVertices();//Für Jede Gruppen Anzahl Vertices und Indices speichern
        dwChunkSizeTest+=fwrite(&iPuffer, sizeof(int), 1, Datei)*sizeof(int);
        iPuffer=(*m_PartIt)->GetNumIndices();
        dwChunkSizeTest+=fwrite(&iPuffer, sizeof(int), 1, Datei)*sizeof(int);
    }
    if(dwChunkSizeTest!=ChunkHeader.dwChunkSize)
    {
        Error("Export: Fehler beim berechnen der Chunkgröße! CT_PARTINFOS");
        Error(dwChunkSizeTest);
        Error(ChunkHeader.dwChunkSize);
    }



    //uff endlich alles gespeichert! Datei schließen:
    fclose(Datei);
}

Wie immer, bei kleineren Modellen funzt alles!

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

25

27.06.2004, 22:12

Dein Fehler ist GENAU der, der passiert wenn Du im fopen das "b" vergisst.
"Games are algorithmic entertainment."

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

26

27.06.2004, 22:16

Um mich zu wiederholen: Schau Dir die Datei in nem Hex-Editor an. Lass Dir in Deinem Code ausgeben, wo Du in der Datei bist (ftell). Schau Dir dann den Chunk header "manuell" im Editor an. Schau nach, was für ein Zeichen an der Stelle ist, an der der Code meint, die Datei ist zu Ende. Ich rate mal, es ist ein Ctrl-Z :).
"Games are algorithmic entertainment."

27

27.06.2004, 22:31

also, ich mab gemerkt, das die Datei rapide zu klein ist. Statt 1013 Byte wenn iich die letzte Gruppe weglasse nur 81! Byte.
Das müsste doch heißen, das schon die Vertexdaten nicht korrekt geschrieben werden können.
Leider blick ich bei dem Rest der Hexdaten nicht so gut durch.

Ich hab mal zusammengerchnet, wie viel ich in die Datei schreibe und wie groß sie hinterher ist:
geschrieben: 1010 Byte
größe: 1013 Byte

gschrieben 436
größe 437

28

28.06.2004, 18:37

Das mit dem "b".
Ich hab beim speichern "wb" geschrieben. Hat nix genützt.
Beim Laden hab ich mal "rb" geschrieben, das Resultat war ein Absturz. "br" funktioniert auch nicht und nur "b" auch nicht. Also was soll ich den dann schreiben, um die Datei zu öffnen???

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

29

28.06.2004, 19:38

Zitat


Beim Laden hab ich mal "rb" geschrieben, das Resultat war ein Absturz.


Dann hast Du noch einen zweiten Fehler. Er liest jetzt weiter als bisher und daher wird wahrscheinlich der 2. Fehler "aktiv". Jetzt heist es debuggen.
"Games are algorithmic entertainment."

adapto

Treue Seele

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

30

29.06.2004, 01:25

"wb" und "rb" solltest du auf jedenfall benutzen. ansonsten schau mal ob du deine structuren richtig ausgerichtet hast. den fehler hatte ich vor kurzem auch.

Werbeanzeige