2010-03-19 4 views
2

J'essaie d'écrire une fonction courte qui me permettra de lire rapidement dans un fichier de taille inconnue et de renvoyer le pointeur vers le tableau de données et la longueur de ce tableau, mais il semble mon code ne fonctionne pas. Qu'est-ce que je fais mal?lire un fichier de longueur inconnue avec une fonction

int readIn(int* pointer, param parameters, string description) 
{ 
    string fileName = parameters.fileName + " " + description + ".bin"; 

    ifstream readFile; 
    readFile.open(fileName.c_str(), ios::in|ios::binary|ios::ate); 

    int size = readFile.tellg(); 
    int length = size/4; 
    int* output = new int [length]; 

    readFile.seekg (0, ios::beg); 
    readFile.read(reinterpret_cast<char*>(output), (size)); 
    readFile.close(); 

    pointer = output; // link new array with the pointer 
    return length; 
} 

et dans la fonction principale:

int* testList; 
int numEntries = readIn(testList, parameters, "test"); 

je me retrouve avec une erreur en disant que ma variable TestList a été utilisé et non initialisé. Qu'est-ce que je fais mal?

Répondre

2

Vous ne retournez rien dans votre variable pointeur après l'appel de la fonction.

Vous pouvez remplir une variable afin que sa valeur reste modifiée après l'appel de la fonction en déréférenciant son adresse.

Exemple:

void fillX(int *p) 
{ 
    //p holds a memory address, go to that memory address and change its value 
    *p = 4; 
} 


void main(int argc, char **argv) 
{ 
    int x; 
    fillX(&x); 
    return 0; 
    assert(x == 4); 
} 

Pour modifier ce que les points de pointeur que vous devez passer un pointeur vers un pointeur.

I.e. vous auriez besoin de passer l'adresse de votre pointeur, et vous auriez besoin que le type de paramètre soit int** pointer. Lorsque vous définissez vous diriez *pointer = buffer;

Exemple:

void fillPointer(int **pp) 
{ 
    //p holds a memory address to a pointer 
    //Go to that memory address and change its value 
    *pp = new int[10]; 
} 


void main(int argc, char **argv) 
{ 
    int *x; 
    fillPointer(&x); 
    //x now points to the first element of an array 
    delete[] x; 
    return 0; 
} 

Le point clé ici: Lorsque vous souhaitez modifier les valeurs via un paramètre, vous devez passer dans son adresse, puis déréférencer pour définir ce qui est à cette adresse.

+0

Merci beaucoup. – Faken

+0

Pas de problème. Dans votre cas, le changement le plus simple peut être de renvoyer un int * et de renvoyer la longueur en paramètre. C'est si vous voulez éviter les pointeurs vers les pointeurs. –

1
int readIn(int** pointer, param parameters, string description) 

... 

*pointer = output 

... 

int numEntries = readIn(&testList, ...) 
0

Je peux me tromper ici, mais peut-être que vous devez faire de votre fonction,

int readIn(int **pointer, param parameters, string description) 

, à savoir un pointeur vers un pointeur. Appelez-le avec,

int numEntries = readIn(&testList, parameters, "test"); 

vars sont passés en valeur en C/C++.

Questions connexes