kan de juiste waarden niet schrijven naar aanwijzer van typedef-array

Mijn probleem ishet volgende - Ik heb deze coderegels:

// allocate a new vector
        Vector3I *theVector = (Vector3I*)calloc(1,sizeof(Vector3I));

       //write face's points to thisvector
        *theVector[0] = a3dsFace->points[0];
        *theVector[1] = a3dsFace->points[1];
        *theVector[2] = a3dsFace->points[2];

In de punten [] array zijn de waarden {0,1,2} . Wanneer ik ze schrijf naar de Vector3I waarnaar ik verwijs, krijg ik {0,0,0} . Heb je suggesties over wat ik verkeerd doe?

EDIT: Some more details:

Thisisfrom lib3ds at: http://code.google.com/p/lib3ds/

struct Lib3dsFace {
    Lib3dsUserData user;    /*! Arbitrary user data */
    char material[64];      /*! Material name */
    Lib3dsWord points[3];   /*! Indices into mesh points list */
    Lib3dsWord flags;       /*! See Lib3dsFaceFlag, below */
    Lib3dsDword smoothing;  /*! Bitmask; each bit identifies a group */
    Lib3dsVector normal;
};

De a3dsFace iseen Lib3dsFace struct.

En de puntenserie isvan dit type:

 typedef unsigned __int16 Lib3dsWord

En mijn aanwijzer:

Vector3I* theVector

is

typedef int Vector3I[3];

I hope thiswill bring some light to the problem.

Met vriendelijke groet.

0
Wat is Vector3I ? Wat is a3dsFace-> punten ?
toegevoegd de auteur cnicutar, de bron
voeg de definities van beide typedefs toe aan uw vraag. Ik kan de definities niet in je commentaar zien.
toegevoegd de auteur DwB, de bron
@Knut: plaats een voorbeeld van een werkende code, dat ook de definitie van a3dsFace bevat.
toegevoegd de auteur AusCBloke, de bron
Hallo, Vector3I is: typedef int Vector3I [3]; en punten: Lib3dsWoord punten [3]; waar typedef unsigned __int16 typedef unsigned __int16 Lib3dsWord;
toegevoegd de auteur Knut, de bron

3 antwoord

probeer dit (let op 3 elementen toewijzen en toegang met alleen array-notatie):

Vectore3I *theVector = (Vector3I*)calloc(3, sizeof(Vector3I));

theVector[0] = a3dsFace->points[0];
theVector[1] = a3dsFace->points[1];
theVector[2] = a3dsFace->points[2];
2
toegevoegd
Hallo, dit werkt niet
toegevoegd de auteur Knut, de bron

De onderstaande code werkt en is een test voor uw codefragment. Als iets niet werkt, kan het een goed idee zijn om een ​​test als deze te maken, met hard-coded waarden voor * a3dsFace , om uw probleem te beperken.

#include 
#include 
#include 

typedef int Vector3I[3];
typedef uint16_t Lib3dsWord;

struct Lib3dsFace {
   /* ... */
   Lib3dsWord points[3];   /*! Indices into mesh points list */
   /* ... */
};

/* ... */
struct Lib3dsFace some_face = { {0, 1, 2} };
struct Lib3dsFace *a3dsFace = &some_face;
/* ... */

int main(void)
{
   Vector3I *theVector = (Vector3I*)calloc(1,sizeof(Vector3I));

   (*theVector)[0] = a3dsFace->points[0];
   (*theVector)[1] = a3dsFace->points[1];
   (*theVector)[2] = a3dsFace->points[2];

   printf("theVector: %p, *theVector: %p, &(*theVector)[0]: %p\n", theVector, *theVector, &(*theVector)[0]);

   printf("RIGHT Addresses: %p, %p, %p\n", &(*theVector)[0], &(*theVector)[1], &(*theVector)[2]);
   printf("WRONG Addresses: %p, %p, %p\n", &*theVector[0], &*theVector[1], &*theVector[2]);

   printf("Values: %d, %d, %d\n", (*theVector)[0], (*theVector)[1], (*theVector)[2]);

   free(theVector);

   return 0;
}

Output:

theVector: 0x1cd3010, *theVector: 0x1cd3010, &(*theVector)[0]: 0x1cd3010
RIGHT Addresses: 0x1cd3010, 0x1cd3014, 0x1cd3018
WRONG Addresses: 0x1cd3010, 0x1cd301c, 0x1cd3028
Values: 0, 1, 2

Ik heb de adressen daar gezet, zodat u kunt zien dat (* theVector) [0] een geldige manier is om toegang te krijgen tot het eerste element van uw dynamisch toegewezen Vector3I .

Perhaps you haven't set a3dsFace->points properly and that's why {0, 0, 0} is being copied. Note also that you have each element of a Vector3I as type int, and each point is of type uint16_t. You also don't need to use calloc to zero the allocated memory, since you're immediately after assigning values to them; you could just use malloc.

Waar het op neer komt is dat u nog steeds niet voldoende code heeft opgegeven om uw exacte probleem te vinden en dat u code moet toevoegen om uw code in uw code te debuggen.

EDIT: I accidentally had *theVector[0] which should have been and is now (*theVector)[0], since [] has higher precedence than *. Otherwise it'd cause undefined behaviour due to the fact you're going past the bounds of the array, my bad. I don't know how I forgot that when it was one of the main reasons I was going to post an answer before you made your edit. It worked, but if you ran it through a program like valgrind it'd tell you that something wasn't quite right (even if it may have ran as expected).

Zoals je kunt zien aan de adressen die hierboven zijn uitgegeven, is er nogal een verschil. Als u bijvoorbeeld * theVector [1] gebruikt, die vanwege de prioriteit van de operator hetzelfde is als * (theVector [1]) , betekent dit dat het adres wordt verhoogd naar door theVector door 3 * sizeof (int) bytes (ook bekend als sizeof (Vector3I) ), in plaats van alleen 1 * sizeof ( int) in het (juiste) geval van (* theVector) [1] ).

2
toegevoegd
Wat je doet is niet gedefinieerd. U wijst ruimte toe voor een array met een grootte van 3 ints en hebt een veel groter bereik dan dat. Voorrang voor operator is [] en dan *.
toegevoegd de auteur Milan, de bron
@Milan: Woops is het ook - ik had dat eigenlijk in het voorbeeld dat ik ging posten voordat hij zijn bewerking maakte en dat in het nieuwe voorbeeld miste. Het leek in dit geval te werken, maar als je zegt dat het niet goed is (zou dit voorbeeld ook in valgrind moeten draaien om dat te vangen). Ik wist dat ik iets vergat toen ik het plaatste, bedankt dat je het hebt opgevangen.
toegevoegd de auteur AusCBloke, de bron
Oh de beugel! Dat wist ik niet. Dank je!
toegevoegd de auteur Knut, de bron

Wat denk je hiervan:

// allocate a new vector
        Vector3I *theVector = calloc(1,sizeof(Vector3I));

       //write face's points to this vector
        (*theVector)[0] = a3dsFace->points[0];
        (*theVector)[1] = a3dsFace->points[1];
        (*theVector)[2] = a3dsFace->points[2];
1
toegevoegd
Ja, dit klopt! Ik moest de beugel toevoegen. Dank je!
toegevoegd de auteur Knut, de bron