Toon posts:

[c++] 3DS loader en lokale/globale variabele

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een 3DS (3D Studio Max) model-loader van het net geplukt, misschien kennen mensen 'm wel, je ziet dezelfde code vaak terugkomen:
http://anoid.dk/output/classCLoad3DS.html.
Nu heb ik een zeer bizar probleem, misschien dat het met de loader te maken heeft, of misschien met c++ programmeren in het algemeen, ik weet het niet. Dit is het probleem: Het inladen van een model blijkt alleen te kunnen met een globaal gedeclareerde variabele (t3DModel myModel). Als ik in een functie een model declareer en deze probeer in te laden, krijg ik bij het een inladen een Exception die leidt naar een fout bij het uitvoeren van memcpy. Dit is nog TIJDENS de inlaad routines, dus binnen de scope van de huidige functie. Als ik in diezelfde functie het model inlaadt met de GLOBAAL gedeclareerde variabele is er geen probleem. Als ik het binnen een functie probeer met een pointer: t3DModel * myModel = new t3DModel werkt het ook niet.

Waarschijnlijk een te vage omschrijving, of te weinig informatie, maar misschien dat iemand het probleem herkent :) .

Ik werk in VC++ 6.0.

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je niet beter gewoon de maker van het stukje software mailen? Of misschien is er wel een support forum of some sort?

Verder schrijf ik mijn loaders over het algemeen zelf, dus ik zou het niet weten :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Tja het probleem is dat deze loader zo vaak vermenigvuldigd is dat ik niet precies weet bij wie ik aan moet kloppen, maar ik ga er zeker nog werk van maken.

Misschien dat iemand weet welke verschillen tussen globale en lokale variabelen voor bepaalde problemen kunnen zorgen? (natuurlijk buiten het feit dat lokale vars aan het eind van de scope worden 8)7 )

[ Voor 18% gewijzigd door Verwijderd op 22-09-2003 18:16 ]


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 10-08 15:44

klinz

weet van NIETS

Lokale variabelen worden op de stack opgeslagen. Globale variabelen in de data section (of segment, whatever).

Dit zou natuurlijk voor problemen kunnen zorgen als de stack te klein is. Hoe groot is je stack? En vergelijk dit eens met sizeof(CLoad3DS). Kleine kans dat hier het probleem ligt overigens. Ik wijt het eerder aan rotte code van die lieden :-)

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vermoed dat idd ook. Objecten zijn zelfden >1k. Geometrische data komt natuurlijk ook niet direct in het geheugengebied van het object te staan, maar gewoon gealloceerd geheugen waarnaar wordt verwezen via pointers.
En bovendien verklaart dat nog niet waarom de new variant die hij ook geprobeerd heeft niet werkt :)

De enige verklaring die ik kan geven is dat er bij de constructie van een object ergens gebruik van wordt gemaakt wat nog niet goed geinitializeert is, en dat het daardoor toevallig wel goed gaat. Globale objecten worden geconstruct voordat main () wordt aangeroepen, en over de volgorde is weinig te zeggen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Maar een lokaal met 'new' gedefinieerde pointer naar een object van de class wordt toch in de heap gecreeerd, en dat werkt dus ook niet. (dit werkt trouwens uberhaupt niet, zowel bij een lokale als een globale pointer loopt het zaakje vast. Daarbij weet ik zeker dat ik geen fouten maak met references en de-references, & en * tekens etc). Het gaat ook fout met dezelfde objecten in een globale list, vector of map.

De code kan inderdaad best rot zijn, maar het ENIGE wat de loader-interface vraagt is een pointer naar een model-struct (of klasse) en een file name. Die loader zou toch niet eens kunnen weten dat die pointer wijst naar een lokale dan wel een globale variable?
Ik zal het loaderobject, wat nu ook globaal wordt gemaakt, eens lokaal aanmaken. Wie weet...

Verwijderd

Topicstarter
Een lokaal gedefinieerde loader kan ook niets met lokale objecten.
Het is echt raar dat zelfs een globaal object gedefinieerd met new niet werkt (t3DModel * myModel = new t3DModel ) , maar een globale varialele (t3DModel myModel) dus wel. Echt BIZAR. Dit zit dan toch echt heeeeel DIEP ofzo, assembler niveau, terwijl zo'n loadertje gewoon een pointer naar een model wil, een 3D file uitleest, het model vult met triangles die weer vertices bevatten en that's it.

[ Voor 3% gewijzigd door Verwijderd op 22-09-2003 21:28 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Lijkt wel of er een access violation in die loader zit dan. Kan het zijn dat er bij die memcpy iets fout gaat ?

Omdat globale vars ergens anders worden neergezet kan het zijn dat je dan de bug niet tegenkomt .....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Ik krijg een access violation bij het uitvoeren van de volgende code (voor wat het waard is...)
code:
1
2
3
4
5
6
7
MEMCPY.ASM
...
UnwindUp2:
        mov     eax,[esi+ecx*4-8] ;U(entry)/V(not) - get dword from source
                                  ;V(entry) - spare
        mov     [edi+ecx*4-8],eax ;U - put dword into destination
...

De tweede mov geeft de problemen.

[ Voor 5% gewijzigd door Verwijderd op 23-09-2003 15:08 ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja, daar hebben we natuurlijk ook niets aan :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
was ik al bang voor maar wie niet waagt wie niet wint :)
Als ik in de broncode van de loader wil gaan graven naar de fout, naar wat voor dingen moet ik dan kijken gegeven het feit dat een MEMCPY fout gaat? Specifieke, makkelijk herkenbare stukken code of ook dingen als = operators van klassen (= debug-ellende)?

Verwijderd

Topicstarter
Ik heb het probleem gevonden. Bij het initialiseren van het model object wordt aangenomen dat twee int-counters op 0 worden geinitialiseerd.... Dit gaat blijkbaar goed bij globale initialisatie, maar bij lokale init staan deze counters netjes op -8567346 :)
De counters worden gebruikt als offset naar data-chunks in de file. Dit soort getallen (ipv 1,2,3,4) worden natuurlijk niet geslikt.

Ik voel me behoorlijk stom dat dit uiteindelijk het probleem is, maar toch ook vrij leerzaam :) Verder zou je van zo'n loader, die verder erg complex in elkaar zit en netjes geprogrammeerd is, verwachten dat dit soort basis dingen worden uitgesloten.

Anyway, close topic, iedereen bedankt!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Zoals de C++ vader al zei, declareren is initialiseren. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Is dat niet definieren is initializeren? :)

(met declareren geef je alleen aan dat er iets is. Met definieren zeg je: hier is iets)

[ Voor 50% gewijzigd door .oisyn op 23-09-2003 20:25 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Is het niet zo dat de OOP gedachte is dat je de members initialiseert in de constructor van de definitie van het object waarvan je een instantie declareert ;) ?
Dat is in ieder geval hetgeen ik ga doen. De objecten zijn nu nog allemaal structs dus moet die dingen effe ombouwen.

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

De objecten zijn nu nog allemaal structs
Structs en classes zijn in feite hetzelfde. Het enige verschil is dat de members van een struct default public zijn, en die van een class default private. En dat is het enige verschil :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Vergeet je dan niet het feit dat een class functies kan bevatten, plus de mogelijkheid voor het initialiseren van de members via de constructor (= een functie)?

Als je bedoelt dat het ombouwen simpel is als het alleen gaat om member-vars dan heb je gelijk. struct wordt class en boven de members het woord public: . De functionaliteit in het programma is dan hetzelfde.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Verwijderd schreef op 24 September 2003 @ 19:19:
Vergeet je dan niet het feit dat een class functies kan bevatten, plus de mogelijkheid voor het initialiseren van de members via de constructor (= een functie)?
Nee hoor. :+
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Foo
{
    int x;

    Foo()
    {
        x = 3*222;      
    }

    int bar()
    {
        return x;
    }
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
.oisyn schreef op 23 September 2003 @ 20:24:
Is dat niet definieren is initializeren? :)

(met declareren geef je alleen aan dat er iets is. Met definieren zeg je: hier is iets)
Dat is me nog steeds niet duidelijk,

Als ik zeg :
C++:
1
int i = 0;

Dan declareer ik toch een variabele van het type int ? De definitie van i is de definitie van een integer, een built in type.

Verder,
C++:
1
2
3
4
5
class Foo
{
public:
    int bar();
};

Hier declareer ik een klasse Foo, en daarbij declareer ik een memberfunctie bar van het type int. De definitie wordt hier niet gegeven.

Verwarrend.
Vergeet je dan niet het feit dat een class functies kan bevatten, plus de mogelijkheid voor het initialiseren van de members via de constructor (= een functie)?
Hehe, ook met C begonnen zeker. :)

[ Voor 14% gewijzigd door farlane op 24-09-2003 21:52 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op 24 September 2003 @ 21:50:
[...]


Dat is me nog steeds niet duidelijk,

Als ik zeg :
C++:
1
int i = 0;

Dan declareer ik toch een variabele van het type int ? De definitie van i is de definitie van een integer, een built in type.
nee, dat is een definitie ;)
Zoals ik al zei, bij een declaratie zeg je dat er ergens iets is van een bepaald type, en bij een definitie zeg je dat daar iets is van een bepaald type.

Bij variabelen lijkt dat wat anders, aangezien je daar geen forward declarations hebt zoals bij functies, maar je hebt natuurlijk wel extern:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//declaraties
extern int i;
void func (int);
struct Test;

// definities
int i = 3;

void func (int i)
{
    std::cout << i << std::endl;
}

struct Test
{
    int x, y, z;
};
Verder,
C++:
1
2
3
4
5
class Foo
{
public:
    int bar();
};

Hier declareer ik een klasse Foo, en daarbij declareer ik een memberfunctie bar van het type int. De definitie wordt hier niet gegeven.
Dat is een definitie ;) Zoals ik hierboven al aangaf, bij declaratie van een struct/class zeg je alleen dat er een struct/class is met die naam. De memberfunctie int bar () in je class Foo is echter weer een declaratie in de classdefinitie, omdat je alleen zegt dat er een functie is met de naam bar (). Bij de definitie van die memberfunctie specificeer je weer de body.
Soultaker schreef op 24 September 2003 @ 20:05:
C++:
1
2
3
4
5
6
// knip
    Foo()
    {
        x = 3*222;      
    }
// knip
member-initialization gaat natuurlijk zo he
C++:
1
2
3
    Foo() : x (3 * 222)
    {
    }

;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
.oisyn schreef wat over declaraties en definities
[...]
Hmmm, zoals ik al zei verwarrend. :) ( Volgens mij heeft het meer met de eigenschappen van de Engelse taal te maken dan met C++ )

Bijvoorbeeld op deze paginas ( doe verder geen enkele uitspraak over de betrouwbaarheid van de info )

http://www.intap.net/~drw/cpp/cpp03_02.htm
http://www.intap.net/~drw/cpp/cpp07_01.htm

Hebben ze het over het 'declaren van een variabele' en het 'declaren van een class'. en header files behoren de 'class declaration' te bevatten.

[ Voor 6% gewijzigd door farlane op 25-09-2003 09:12 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ok, pakken we het woordenboek erbij :)

define
1a. To state the precise meaning of (a word or sense of a word, for example).
1b. To describe the nature or basic qualities of; explain: define the properties of a new drug; a study that defines people according to their median incomes.

2a. To delineate the outline or form of: gentle hills that were defined against the sky.
2b. To specify distinctly: define the weapons to be used in limited warfare.

3. To give form or meaning to: “For him, a life is defined by action” (Jay Parini).


declare
1. To make known formally or officially. See Synonyms at announce.
2. To state emphatically or authoritatively; affirm.
3. To reveal or make manifest; show.
4. To make a full statement of (dutiable goods, for example).
5. Games. To designate (a trump suit or no-trump) with the final bid of a hand in bridge.


Oftewel, bij iets als "class Blaat;" zeg je alleen maar dat er een class Blaat is (To make known formally or officially)

Bij de hele specificatie van Blaat is To state the precise meaning of (a word or sense of a word, for example) van toepassing

Conclusie: de schrijver van die tutorial zit ernaast ;)

(overigens staan deze dingen ook keihard in de C en C++ specifications)

[ Voor 3% gewijzigd door .oisyn op 25-09-2003 12:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
.oisyn schreef op 25 September 2003 @ 12:38[/b]
Ok, pakken we het woordenboek erbij :)
(overigens staan deze dingen ook keihard in de C en C++ specifications)
Hehe, ok ik pak de standaard erbij ( Kennelijk de draft van 1996 ) :

In paragraaf 3.1 punt twee staat :
A declaration is a definition unless .....
Volgens de standaard is een declaratie dus ook een definitie, afgezien van ( in mijn voorbeeld ) de declaratie van de memberfunctie bar in Foo, omdat daar geen functie body bijzit.

Jij hebt helemaal gelijk, en ik een beetje omdat een declaratie kennelijk vaak ook een definitie is. :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

en ik een beetje omdat een declaratie kennelijk vaak ook een definitie is.
nou vooruit, als het zo belangrijk voor je is... :P ;)

[ Voor 11% gewijzigd door .oisyn op 25-09-2003 16:51 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
.oisyn schreef op 25 september 2003 @ 16:51:
[...]

nou vooruit, als het zo belangrijk voor je is... :P ;)
Hmmm, eigenlijk wel ja ..... dank je :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Alle definities zijn declaraties, maar niet andersom. Dit staat los van initializeren. Ten eerste kun je functies e.d. niet initializeren, maar wel definieren. Ten tweede kun je sommige variabelen definieren zonder ze te initializeren:
code:
1
int i; // ongeinitialiseerd

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1