Как передать указатель на вектор указателей? - PullRequest
0 голосов
/ 23 сентября 2019

Это версия дублированного вопроса на C ++.Я немного знаю указатели на векторы в следующем, но я сделал это для того, чтобы дублировать гораздо больший проект.Члены info_a не печатаются должным образом из print_b, и я не могу правильно передать вектор указателей.

С тем, что я попробовал, члены info_a не печатают должным образом из print_b.Первый элемент в порядке, но следующие два - нет.

Structs и print_b от стороннего API, и я пытаюсь передать то, что они ожидают.

Вот рабочий код ...

http://coliru.stacked -crooked.com / a / c3ad6af6da9409a5

Кто-нибудь видит, где я иду не так??

typedef struct {
    uint16_t a1;
    uint8_t a2;
    uint8_t a3;
} info_a;

typedef struct {
    uint16_t id;
    unsigned int arr_sz;
    info_a *arr;
} info_b;

void print_a(const info_a* a)
{
    using namespace std;

    cout <<
        "a->a1 0x" << hex << setfill('0') << setw(4) << a->a1 << std::endl <<  
        "a->a2 0x" << hex << setfill('0') << setw(2) << a->a2 << std::endl <<  
        "a->a3 0x" << hex << setfill('0') << setw(2) << a->a3 << std::endl;    
}

void print_b(const info_b* b)
{ 
    using namespace std;

    cout << "b->id 0x" << hex << setfill('0') << setw(4) << b->id << endl      
        << "b->arr_sz " << hex << setfill('0') << setw(2) << b->arr_sz << endl;

    for (unsigned int i = 0; i < b->arr_sz; ++i) {                             
        const info_a *elem = &(b->arr[i]);                                     

        print_a(elem);
    }
}

int main(int argc, char **argv)
{
    std::shared_ptr<std::vector<std::shared_ptr<info_a>>> sp_info_a =
        std::make_shared<std::vector<std::shared_ptr<info_a>>>();              

    std::shared_ptr<std::vector<std::shared_ptr<info_b>>> sp_info_b =          
        std::make_shared<std::vector<std::shared_ptr<info_b>>>();              

    int offset = 0;

    for (uint16_t i = 1; i <= 1; ++i) {
        for (uint16_t j = 1; j <= 3; ++j) {                                    
            std::shared_ptr<info_a> a_info =                                   
                std::make_shared<info_a>(info_a { j, 0x31, 0x32 } );           

            sp_info_a->push_back(a_info);                                      
        }

        std::shared_ptr<info_b> b_info = std::make_shared<info_b>(             
            info_b {
                static_cast<uint16_t>(i),                                      
                static_cast<unsigned int>(sp_info_a->size()),                  
                (*sp_info_a)[offset].get()                                     
            });

        sp_info_b->push_back(b_info);

        print_b(b_info.get());

    }

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

Это не работает, потому что вы интерпретируете массив std::shared_ptr<info_a> как массив info_a.Это будет работать:

int main(int argc, char **argv)
{
    std::shared_ptr<std::vector<info_a>> sp_info_a =
        std::make_shared<std::vector<info_a>>();

    std::shared_ptr<std::vector<std::shared_ptr<info_b>>> sp_info_b =
        std::make_shared<std::vector<std::shared_ptr<info_b>>>();

    int offset = 0;

    for (uint16_t i = 1; i <= 1; ++i) {
        for (uint16_t j = 1; j <= 3; ++j) {
            sp_info_a->push_back(info_a { j, 0x31, 0x32 });
        }

        std::shared_ptr<info_b> b_info = std::make_shared<info_b>(
            info_b {
                static_cast<uint16_t>(i),
                static_cast<unsigned int>(sp_info_a->size()),
                sp_info_a->data() + offset
            });

        sp_info_b->push_back(b_info);

        print_b(b_info.get());

    }

    return 0;
}
2 голосов
/ 24 сентября 2019

Мне не удалось правильно передать вектор указателей

В этом суть проблемы.Вызываемый C API не ожидает вектор указателей, он ожидает вектор структур.

В частности, этот бит ...

    unsigned int arr_sz;
    info_a *arr;

... ожидаетнаходить arr_sz структуры в памяти, одна за другой, начиная с arr.

Ваш код распределяет все структуры по отдельности, а затем сохраняет адрес первой в arr.Затем код печати выходит из конца arr[0], ожидая найти следующую структуру, но, поскольку вы распределили их по отдельности, они сохраняются, кто знает, где в памяти.

Для того, чтобы это исправитьчто бы вы ни делали, вы должны создать эквивалент std::vector<info_a> (который затем можно обернуть info_b, как вид массива).Это то, что дает вам гарантию того, что структуры фактически смежны в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...