PDA

View Full Version : [c++] Problema con puntatori


willygroup
24-11-2008, 13:23
Attualmente nel mio programma C++ ho una classe che contiene un vettore di strutture "alfa".
Ogni struttura "alfa" contiene un vettore di TOT elementi.
Questi TOT elementi però possono essere ripetuti in più strutture, quindi mi ritrovo con dei dati ridondanti.

Avevo pensato di sostituire a tale vettore di TOT di elementi un vettore di TOT Puntatori
e aggiungere alla classe un vettore con TUTTI gli elementi.

Però non riesco a far funzionare il tutto a dovere.

Ho fatto qualche prova con un programmino per vedere se in questo caso funziona, ma ho problemi anche qui.
Probabilmente non ho capito a fondo come funzionano i puntatori.

Credo che il problema sia in fase di inserimento del puntatore nel vettore (***), ma non riesco a risolverlo.
Qualcuno mi può dare una mano?

Ecco il codice:


//myClass.h
#include <vector>

struct myStr{
int a;
int b;
};

typedef myStr* pMyStr;

class myClass{

public:
std::vector<myStr> myVector;
std::vector<pMyStr> PmyVector;
myClass(void);
~myClass(void);
void setMyStr(int a1, int b1);
};



// myClass.cpp
#include "MyClass.h"

myClass::myClass(void){

};

myClass::~myClass(void){

};

void myClass::setMyStr(int a1, int b1){

myStr temp;
temp.a = a1;
temp.b = b1;

myVector.push_back(temp);

// (***)
PmyVector.push_back(&myVector.back());


};



//main.cpp
#include <windows.h>
#include <iostream>
#include "Myclass.h"

int main(){

myClass newClass;

for(int j=0;j<5;j++){
newClass.setMyStr(j,j);
}
std::cout<<"DIRETTO\n";
for(int i=0;i<(int)newClass.myVector.size();i++){

std::cout<<"a = "<<newClass.myVector.at(i).a<<" , b = "<<newClass.myVector.at(i).b<<std::endl;

}
std::cout<<"\nINDIRETTO\n";
for(int i=0;i<(int)newClass.myVector.size();i++){

std::cout<<"a = "<<newClass.PmyVector.at(i)->a<<" , b = "<<newClass.PmyVector.at(i)->b<<std::endl;

}

system("pause");
return 0;
}



//Uscita
DIRETTO
a = 0 , b = 0
a = 1 , b = 1
a = 2 , b = 2
a = 3 , b = 3
a = 4 , b = 4

INDIRETTO
a = 0 , b = 0
a = 0 , b = 0
a = 3562984 , b = 3563080
a = -1414812757 , b = -17891602
a = 4 , b = 4

willygroup
30-11-2008, 11:48
Alla fine ho risolto usando gli indici come "puntatori" (tanto il vettore iniziale è fisso),
però il dubbio sul perché questo codice non funziona mi rimane :(

tomminno
01-12-2008, 12:02
Alla fine ho risolto usando gli indici come "puntatori" (tanto il vettore iniziale è fisso),
però il dubbio sul perché questo codice non funziona mi rimane :(

Prova a farti stampare gli indirizzi e vedrai che il tuo codice è sbagliato:

for(int i = 0; i<myVector.size(); i++)
cout << &myVector[i] << endl;


Ad ogni inserimento la capacità di vector aumenta con conseguente riallocazione di tutti gli elementi in indirizzi di memoria differenti.
Quindi te salvi un indirizzo che poi non è più occupato dai dati che effettivamente stai cercando.

willygroup
01-12-2008, 20:48
00365D38

00365E58
00365E60

00365EA8
00365EB0
00365EB8

00365D38
00365D40
00365D48
00365D50

003660D0
003660D8
003660E0
003660E8
003660F0



Vero!
Grazie per avermi chiarito questo dubbio :)