Как правильно получить доступ к элементам std :: array, передав указатель на функцию в C ++? - PullRequest
0 голосов
/ 12 сентября 2018

Фрагмент кода выглядит следующим образом. Ошибка в функции foo для строки cout:

typedef struct Datatype {
    int first;
    int second;
} Datatype;

void foo(std::array<Datatype, 100>* integerarray){
    cout << *integerarray[0].first << endl; //ERROR: has no member first
}

void main() {
    std::array<Datatype, 100> newarray;
    for(int i=0; i<100; i++)
        newarray[i] = i;
    }
    foo(&newarray);
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

newarray [i] = i;

В этой строке вы пропустили добавление значения к структурным переменным. Также вы передали массив в качестве ссылки на функцию. Удаление его и передача только имени массива передаст базовый адрес массива. Я добавляю следующий код для вашей справки:

#include<iostream>
#include <array>
struct Datatype{
int first;
int second;
}

typedef Datatype varInts;
void display(std::array<varInts,20> &dummy)
{
int b =5;
for(int i=0; i<20; i++)
{
dummy[i].first =b++;
dummy[i].second = b+5; //Give any logic you wish.just adding different values;
b++;
}
}
int main()
{
std::array<varInts,20> data;
int a =1;
for(int i=0;i<20;i++)
{
 data[i].first = a++;
data[i].second = a+5;
a++; //Just adding values for example
}
display(data);
return 0;
}

Он работает без ошибок. Надеюсь, это поможет !!

0 голосов
/ 12 сентября 2018

Из-за приоритета оператора *integerarray[0].first переводится как *(integerarray[0].first), что не то, что вам нужно.Вам нужно использовать (*integerarray)[0].first.

cout << (*integerarray)[0].first << endl;

Вы можете упростить свою жизнь, передав ссылку.

void foo(std::array<Datatype, 100>& integerarray){
  cout << integerarray[0].first << endl;
}

Кроме того, вам не нужно использовать typedef struct DataType { ... } DataType; вC ++.Вы можете использовать только struct DataType { ... };

...