2016-04-13 15 views
2

XMLファイルをループしてstructにデータを格納する前に、そのstruct'sポインタをvectorに格納しようとしています(私はそうだと思います)。しかし、直近のアクセス番号structにアクセスした直後にデータにアクセスしようとすると、どのインデックスにアクセスしても問題ありません。問題の構造体のベクトルへのアクセス

struct

typedef struct 
{ 
    double trueHeadingRadians; 
    double latitude; 
    double latitudeRadians; 
    double longitude; 
    double longitudeRadians; 
    . 
    . 
} wayPoint; 

関連vector機能:

typedef struct 
{ 
    void   **items; 
    unsigned int capacity; 
    unsigned int total; 
} vector; 

// intitiaizes vector struct 
void vectorInit(vector* v) 
{ 
    v->capacity = VECTOR_INIT_CAPACITY; // 4 
    v->total = 0; 
    v->items = malloc(sizeof(void*) * v->capacity); 
} 

// resizes vector 
static void vectorResize(vector* v, int capacity) 
{ 
    void** items = realloc(v->items, sizeof(void*) * capacity); 
    if(items) 
    { 
     v->items = items; 
     v->capacity = capacity; 
    } 
} 

// returns total number of members in vector 
unsigned int vectorTotal(vector *v) 
{ 
    return v->total; 
} 

// adds element to vector 
void vectorAdd(vector* v, void* item) 
{ 
    if(v->capacity == v->total) 
    { 
     vectorResize(v, v->capacity * 2); 
    } 

    v->items[v->total++] = item; 
} 

// gets item from vector 
void* vectorGet(vector* v, unsigned int index) 
{ 

    if(index >= 0 && index < v->total) 
    { 
     return v->items[index]; 
    } 

    return NULL; 
} 

だから今は、ベクターにstructvoid pointerを追加する前にstructに値を追加します。

vector simDataVector; 
vectorInit(&simDataVector); 

wayPoint pointStruct = {0}; 
pointStruct.latitude = 37.415000; 
. 
. 
// add struct pointer to vector 
vectorAdd(&simDataVector, &pointStruct); 
printf("length of vector: %u\n", vectorTotal(&simDataVector)); 

// THIS IS WHERE I THINK THE ISSUE IS -- AM I DEREFERENCING THIS PROPERLY? 
printf("latitude = %f\n", ((wayPoint*)vectorGet(&simDataVector, indx))->latitude); 

この出力は、次のとおりです。ループを通るたびに正しい

length of vector: 1  // whichever index I am currently on 
latitude = 37.415000 // the most recently added struct's latitude 

!ベクトルは、データだけでなくサイズも適切に追跡できます。初期化後まで。テストのために各道点structを印刷しようとすると、各インデックスには最近追加されたwayPoint structのデータが表示されます。私はここでとても混乱しています。

+0

これらの線は、wayPoint pointStruct = {0}です。 wayPoint.latitude = 37.415000'は、セミコロンがない場合でも、コンパイルしません。 2行目の 'pointStruct.latitude'でなければなりませんか? –

+0

あなたは 'indx'がどこに定義されているのか、どのように値に設定されているのかを表示していません。その価値は何ですか?ベクトルに別のポイントを追加するときに、引き続き '&pointStruct'を渡しますか?そうであれば、1つの変数に多くの異なる値を格納しようとしており、同時に複数の変数(最新のもの)を管理することはできません。私はこれがあなたの問題だと思う。あなたがMCVE(MCVE)を見せてくれれば、決定的になる方がずっと簡単です。 –

+0

@HappyCoder:CはC++ではないためです。 –

答えて

2

ベクターの実装に基づいてメモリを十分に把握しているように見えますが、実際のデータをコピーするのは忘れてしまいました。代わりに、あなたはこのようなあなたのローカル変数へのポインタを渡されました:

vectorAdd(&simDataVector, &pointStruct); 

を代わりに、あなたは(あなたのベクトルの現在のデザインを与えられた)ストレージを割り当てる必要があります。おそらく、関数内でラップしてください:

+2

ベクトルが存在する間に、そのデータを持つオブジェクトが削除されない場合、データをコピーする必要はありません。 – GMichael

+1

@paddyあなたの所見は、 'pointstruct'がアクセスされているときにスコープから外れる場合にのみ有効です。それは、OPの問題のケースではないようです。有効なメモリへのポインタは 'vectorAdd'関数に渡されます。 – Prab

+0

質問の最後の段落を読んだ場合、OPは挿入のコードサンプルがループ内で実行されていることを示します。ループの後で、彼らはベクトルのすべての項目が同じ値を含んでいると言います。このことがOPの問題であることは私には明らかでした。 – paddy

関連する問題