Передать адрес массива указателей в функцию и обновить данные в адресе

Я довольно слаб в понимании и работе с указателями. Пожалуйста, помогите мне здесь.

Моя цель — передать адрес указателя массива в функцию (т.е. адрес, на который указывает указатель) и обновить значения непосредственно в адресе с помощью оператора ‘*’ в функции, чтобы избежать каких-либо возвращаемых значений. Кроме того, длина этого массива должна динамически изменяться в функции, которой он передается. Это моя попытка. Если есть лучший способ обновить значение переменной, не возвращая ее из функции, пожалуйста, укажите это, чтобы помочь мне.

Но я получаю ошибки, поскольку я знаю, что делаю это неправильно, но все же хотел попробовать то, что знаю, так как я думал, что лучший способ учиться — это делать и совершать как можно больше ошибок. Пожалуйста, помогите мне здесь

Это основная функция

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

Здесь я пытаюсь передать адрес массивов указателей в функцию readctrls. затем распечатайте его значения. Я не упомянул размер, потому что он будет определен позже в функции.

Функция состоит в том, чтобы просто читать числа из текстового файла, построчно и сохранять эти числа в этих двух массивах. Функция readctrls работает следующим образом.

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

Большое спасибо за вашу помощь, ребята. Я смог немного понять и изменить код и теперь мог компилировать без ошибок. однако значение, которое я читаю из файла и загружаю в массив, похоже, не отражается в основном. Получаю правильные значения из файла, когда я печатаю массив в функции, но получаю нули, когда я печатаю в main (). Пожалуйста, помогите мне здесь.

Это содержимое файла

     0.2 0
0.2 0
0.2 0
0.2 0
0.2 0

в то время как print ‘trans’, которая принимает первое число в каждой строке, в функции, я получаю правильные значения. Но пока печать в основной функции

    0
0
0
0.2.

Я изменил указатель на ссылку указателя при переходе к функции. Пожалуйста, проверьте редактирование в коде функции. Заранее спасибо.

0

Решение

Декларация

void readctrls(int &rots,double &trans)

сообщает компилятору, что rots а также trans являются Рекомендации к не замужем ценим каждого. Они есть не указатели.

Что еще хуже, вы фактически пытаетесь передать указатель на указатель в качестве аргументов при вызове этой функции.

Вы должны изменить объявление, чтобы фактически брать указатели:

void readctrls(int* rots, double* trans)

затем измените ваш вызов, чтобы не использовать оператор адреса (поскольку это уже указатели):

readctrls(rots, trans);
1

Другие решения

В вашем коде есть несколько ошибок. Вот некоторые из них:

 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 а также rots просто массив двойных и целых чисел, вы просто используете trans[i] распечатать i-й элемент. Динамические массивы должны использоваться аналогично статическим массивам. Взгляните на это указатель и массивы для некоторого базового понимания. А пока посмотри на динамическая память в C ++ для некоторого понимания по этому вопросу.

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

Массив и указатель можно рассматривать аналогично как способ обращения к диапазону в памяти. Если вы хотите обратиться к диапазону памяти через указатели, просто передайте указатель на функцию, т.е.

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

}

Указатели трудны, пока однажды вы не поймете «Ааа! Они просто точка на вещи!

1

Есть много ошибок …

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

Проверь это открытый поток

void readctrls(int &rots,double &trans)

изменить на

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

Я рекомендую вам изучить с ++ с этого сайта C ++ Tutorial

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector