Lakshmi Narayanan
Lakshmi Narayanan

Reputation: 5342

Pass pointer array address to function and update data in the address

I am pretty weak in understanding and working with pointers. So, Please help me here.

My objective is to pass an array pointer's address to a function ,(i.e.) the address the pointer is pointing to, and update the values directly in the address using the '*' operator, in the function, to avoid any return values. Moreover, the length of this array has to be changed dynamically in the function to which it is passed. This is my attempt. If there's a better method to update the value of an variable, without having it returned from a function, please do mention that to help me.

But am getting errors, as I know I am doing it wrong, but still wanted to try with what I know, since I thought the best way to learn is to do and make as many mistakes as possible. Please help me here

This is the main function

     int main()
     {
        double *trans;
        int *rots;
        readctrls(rots,trans);
        for(int i=0;i<trans.size();i++)
        {
                cout<<trans[i]<<endl<<rots[i];
        }
     }

Here, am trying to pass the address of the pointer arrays to the function readctrls. then later, print its values. I haven't mentioned a size, cuz it will be determined later in the function.

The function is just to read numbers from a text file, line by line and store these numbers in these 2 arrays. The readctrls function is as follows.

    void readctrls(int*& rots,double*& trans)
    {
        fstream inputs;
        inputs.open("input_coods.txt");
        int nol = 0,i = 0;
        string line,temp,subtemptrans,subtemprots;
        while(getline(inputs,line))
        {
                ++nol;
        }
        cout<<nol<<endl;
        inputs.close();
        inputs.open("input_coods.txt");
        string *lines = new (nothrow) string[nol];
        trans = new double[nol];
        rots = new int[nol];
        for(int i = 0; i<nol ; i++)
        {
                getline(inputs,lines[i]);
                temp = lines[i];
                for(int j = 0; j<temp.length() ; j++)
                {
                        if(temp.at(j) == ' ')
                        {
                                subtemptrans = temp.substr(0,j);
                                subtemprots = temp.substr(j+1,temp.length()-j);
                                trans[j] = ::atof(subtemptrans.c_str());
                                rots[j] = atoi(subtemprots.c_str());
                        }
                }
        }
        inputs.close();
}

Thanks a lot for your help guys. I was able to understand a bit and changed the code and was able to compile now without errors. however, the value I read from file and load into the array, doesn't seem to get reflected back in the main. Am getting the correct values from the file when I print the array in the function, but am getting zeros, when I print in the main(). Please help me here.

These are the contents of the file

     0.2 0 
     0.2 0 
     0.2 0
     0.2 0
     0.2 0

while print 'trans', which takes the first number every line, in the function, am getting the correct values. But while printing in the main function

    0
    0
    0
    0.2.

I changed the pointer to pointer reference while passing to function. Please check edit in the function code. Thanks in advance.

Upvotes: 0

Views: 2803

Answers (4)

Sanoob
Sanoob

Reputation: 2474

There are many errors ...

inputs.open("input_coods.txt"); // second argument is missing

check this fstream open

void readctrls(int &rots,double &trans)

change to

void readctrls(int* rots, double* trans) // this creates pointer rots trans
*trans = new double[nol]; // remove *
*rots = new int[nol]; // remove *
double *trans = new double[]; // not specified the size
int *rots = new int[]; // not specified the size
readctrls(&rots,&trans); // this means you passing address of pointer  
trans.size() ; // this is c++  double is not a class

I am recommending you to study c++ from this site C++ Tutorial

Upvotes: 1

Ben Brammer
Ben Brammer

Reputation: 998

An array and a pointer can be thought about similarly as a way of referring to a range in memory. If you want to refer to a range of memory via pointers, then just pass the pointer to the function, ie

double pd* = new double[10];
fun(pd);

...

 void fun(double* pd, int numDoubles)
    {
       do {
       double d = magicDoubleGenerator();
       *pd = d; // read as "the value that pd points to" or "contents of pd"
       } while (++pd < pd + numDoubles);

    }

Pointers are hard until one day you realize "Ahh! they just point at things!"

Upvotes: 1

taocp
taocp

Reputation: 23624

Your code has several errors. Here are some of them:

 double *trans = new double[];
 int *rots = new int[]; //^^You need to give the size 

 for(int i=0;i<trans.size();i++)
 {
     cout<<*trans[i]<<endl<<*rots[i];
 }

trans and rots are simply array of double and integers, you simply use trans[i] to print the i-th element. Dynamic arrays should be used similarly to static arrays. Take a look at this pointer and arrays for some basic understanding. Meanwhile, look at dynamic memory in C++ for some understanding on this point.

void readctrls(int &rots,double &trans);
//^^expects reference to int and double while you are not passing int and double from main

Upvotes: 1

Some programmer dude
Some programmer dude

Reputation: 409166

The declaration

void readctrls(int &rots,double &trans)

tells the compiler that rots and trans are references to a single value each. They are not pointers.

To make matters worse, you are actually trying to pass a pointer-to-pointer as arguments when calling this function.

You should change the declaration to actually take pointers:

void readctrls(int* rots, double* trans)

then change your call to not use the address-of operator (as those are already pointers):

readctrls(rots, trans);

Upvotes: 1

Related Questions