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

11

14.03.2013, 15:22

Ja, es ging doch gerade um Arrays statischer Größe für die man dann keinen std::vector braucht, sondern ein std::array nehmen kann, weil es im Vergleich mit einem C-Array überhaupt keinen Overhead hat, im Vergleich zu dem minimalen, den man bei einem vector hat.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

14.03.2013, 15:27

Möglicherweise hab ich was falsch verstanden, aber es geht hier doch um's Laden einer obj Datei und ich seh nicht, wo ein Array statischer Größe dabei hilfreich wäre!? ;)

Aber klar, wenn man tatsächlich ein Array statischer Größe will, dann ist std::array natürlich eine angenehme Alternative zu normalen Arrays. Zusammenfassung:

Array statischer Größe -> std::array
Array fixer, aber erst zur Laufzeit bekannter Größe -> std::unique_ptr
Array dynamischer Größe -> std::vector

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

13

14.03.2013, 15:49

Ja, war auch nur weil ich da z.B. seinen Zwischenbuffer gesehen hatte. Der hat ja eine feste Größe, und bei so etwas macht es ja nicht so viel Sinn einen std::vector zu nehmen. Und wenn er eh schon auf std::vector umbaut dachte ich, ich erwähne das einfach mal mit dem std::array :thinking: .

Edit: Beim Thema bleiben ;), zumindest fast.
Oh und zur Analyse einer Wavefront obj. Datei könnte sich auch das parsen per Regex anbieten. Ist aber natürlich was ganz anderes als du jetzt gerade machst.

<regex>
:love: := Go;

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »H5::« (14.03.2013, 15:58)


Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

14

14.03.2013, 15:58

Zur std::vector-Lösung: ein std::vector hat ab Start eine Größe von 0. Das heißt, Dein erster Zugriff auf Vertices_VECTOR[ irgendeinIndex ] ist bereits ein Zugriff außerhalb des zulässigen Feldes und damit ein Crash. Oder im Debug-Modus eine Ausnahme, glaube ich - ich hoffe mal dringend für Dich, dass Du im Debug-Build entwickelst und nicht mit dem Release-Build.

Einen std::vector benutzt man, indem man mittels push_back() ein neues Element hinzufügt, wenn man ein neues hat. Dafür entfällt dann zum Beispiel das initiale Durchzählen, wieviele Vertices das Modell hat. Was genau Du an Deinem Code dazu ändern musst, kann ich Dir nicht sagen - das ist ja eine ziemliche Textwüste, die ich mir im Detail nicht durchgelesen habe.

[Edith meint:] Falls Du Dir den ganzen Kram ersparen willst, empfehle ich eine externe Bibliothek wie z.B. Assimp, was ich in meiner Signatur verlinkt habe. Eine externe Lib in C++ einzubinden ist aber beim ersten Mal ein ein Stück Arbeit, das für sich alleine entmutigen kann. Aber irgendwann musst Du da mal durch, und dafür kannst Du danach mit ein paar Zeilen alle möglichen Modellformate lesen, nur nur OBJ. Das ist zugegebenermaßen das einfachste Dateiformat, aber hat auch eine Menge Limitationen, die für Dich irgendwann kritisch werden.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

15

14.03.2013, 16:27

ich hoffe mal dringend für Dich, dass Du im Debug-Build entwickelst und nicht mit dem Release-Build.

naja... da der Fehler, wie du ja schon erwähnt hast, nur im Release so auftritt, und im Debug-Mode nur, wenn ich versuche, den Prozess zu beenden, habe ich den Release-Modus genommen, weil die Fehlermeldung da eindeutiger war und sofort aufgetaucht ist (im Debug gabs "nur" ne Zugriffsverletzung).

ein std::vector hat ab Start eine Größe von 0. Das heißt, Dein erster Zugriff auf Vertices_VECTOR[ irgendeinIndex ] ist bereits ein Zugriff außerhalb des zulässigen Feldes und damit ein Crash

hmmm... das klingt schonmal interessant, weil das gut zur Fehlermeldung passt.
Aber ich greife doch erst auf den vector zu, wenn ich ihm bereits per Vertices_VECTOR.push_back(Vertices); (Zeile 265) Werte zugewiesen, und ihn somit erweitert habe, oder? Ich greife schließlich nicht darauf zu, wenn ich ihm noch nichts zugewiesen hab... oder muss ich seine Größe definieren, bevor ich ihm mittels push_back() einen Wert übergebe? Ich dachte das sei das dynamische daran, dass man das nicht muss?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

16

14.03.2013, 21:48

Du kannst ja mal testweise vor dem Zugriff auf den Vector einen Test einbauen, ob der Vector etwas enthält. Wenn nicht, lass dir das ausgeben.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

17

14.03.2013, 22:02

Ich glaub ich hab jetzt eine Idee, wo der Fehler liegen könnte.
Es scheint am Laden der Vertices zu liegen. Die Funktion lädt weniger als in der *.obj steht.
Aber wenn das stimmt: warum macht das dann ohne vector-class keine Fehler?

Ich schau mir das morgen nochmal genauer an. :hmm:

18

14.03.2013, 22:12

Ja, assimp ist natürlich supi. Aber ist gibt natürlich auch Obj-Loader, die mit 1-2 Dateien auskommen und dann vielleicht einfacher einzubinden sind, als so ein Schwergewicht. Muss man sich halt überlegen, was man haben möchte. Aber für Anfänger ist es auch eine tolle Übung, mal Obj-Dateien 'per Hand' zu lesen.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

14.03.2013, 23:16

Ich denk, du solltest dich erstmal noch in Ruhe etwas mit Grundlagen wie z.B. der Frage, wie man std::vector nun genau verwendet befassen. Zum Parsen verwend dann einfach direkt die entsprechende Funktionalität der C++ Streams (operator >>), anstatt kompliziert mit C-Strings und irgendwelchen atoi-artigen Funktionen zu hantieren und plötzlich wird dein Code wesentlich einfacher, kürzer und eleganter sein... ;)

lfp

Frischling

  • »lfp« ist der Autor dieses Themas
  • Private Nachricht senden

20

16.03.2013, 12:36

so... also ich hab jetzt einige solcher tests gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
vector<VERTEX> testvector;
VERTEX testvertex;

testvertex.x = 1;
testvertex.y = 2;
testvertex.z = 3;
testvertex.Color = RGB(100, 100, 100);

testvector.push_back(testvertex);
testvertex.x = testvector[0].x;

naja...
es macht leider keine Fehler :D

Nach einigem nachdenken hab ich dann einfach mal den Vertex-Buffer weggelassen, also das Sperren und Entsperren.
Und voila: Es gab keine Fehler mehr!


Also:

Quellcode

1
2
VertexBuffer->Lock(0,0,(void**)(&Vertices_sortiert_VECTOR), D3DLOCK_NOSYSLOCK);
VertexBuffer->Unlock();

Wenn ich's so mache gibts Fehler...

...und wenn ichs indirekt mache:

Quellcode

1
2
3
4
VOID *MYVOID;
VertexBuffer->Lock(0,0,(void**)&MYVOID,0);
memcpy(MYVOID, &Vertices_sortiert_VECTOR, sizeof(Vertices_sortiert_VECTOR));
VertexBuffer->Unlock();

Dann wird einfach nichts gezeichnet! So als sei der VertexBuffer leer...

Könnt ihr euch das erklären?

Werbeanzeige