tags:

views:

79

answers:

3

I'm trying to write a short function that will let me quickly read in a file of unknown size and return pointer to the array of data and the length of that array but it seems my code isn't working. What am i doing wrong?

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;
}

and in the main function:

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

I end up with an error saying that my testList variable was used and not initialized. What am i doing wrong?

+2  A: 

You aren't returning anything in your pointer variable after the function call.

You can fill a variable so it's value remains changed after the function call by dereferencing it's address.

Example:

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);
}

To change what a pointer points to you need to pass in a pointer to a pointer.

I.e. you'd need to pass in the address of your pointer, and then you'd need the parameter type to be an int** pointer. When you set it you'd say *pointer = buffer;

Example:

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;
}

The key point here: When you want to change values via a parameter, you need to pass in it's address, then dereference it to set what's at that address.

Brian R. Bondy
Thank you very much.
Faken
No problem. In your case by the way the simplest change may be to return an int* and have the length returned as a parameter. That is if you want to avoid pointers to pointers.
Brian R. Bondy
+1  A: 
int readIn(int** pointer, param parameters, string description)

...

*pointer = output

 ...

int numEntries = readIn(&testList, ...)
Tuomas Pelkonen
A: 

I could be wrong here but perhaps you need to make your function,

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

, i.e. a pointer to a pointer. Call it with,

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

vars are passed by value in C/C++.

Adrian