Передача указателей векторов со структурами C++

Я объявил следующую функцию на С++

void setCellInfo (CELL_MESH* target, int Global_ID, int node0,vector<NODE_MESH *>* NodeStore, vector<CELL_MESH *>* CellStore) {

    CellStore->push_back(target); //No Errors
    target->Global_ID = Global_ID; //No Errors
    
    if (node0 != 0) {
        target->node[0] = NodeStore[vector<NODE_MESH *>::size_type(node0)]->ID; //ERROR 1
        target->node_pointers[0] = NodeStore[vector<NODE_MESH *>::size_type(node0)]; //ERROR 2
    }
}

ОШИБКА 1: дает мне «Нет члена с именем« ID »в« std::vector <NODE_MESH *> »» для атрибутов target-> node [], хотя это объекты из указателей в векторе, которые имеют этот элемент идентификатора. Поскольку я пытаюсь получить определенный объект в векторе, используя NodeStore[value], я думаю, что это сработает.

ОШИБКА 2: выдает мне «Назначение 'NODE_MESH *' из несовместимого типа 'vector <NODE_MESH *>'» для всех атрибуций target->node_pointers. Кажется, это та же проблема, но с прямыми указателями (без члена ID).

векторы NodeStore и CellStore определяются следующим образом вне функции

vector<NODE_MESH*> NodeStore;
vector<CELL_MESH*> CellStore;

Затем я пытаюсь использовать такую ​​функцию, где «i» — это int Global_ID, а «nodes_x*y+x» — некоторое целое число.

CELL_MESH *newCell = new CELL_MESH;

setCellInfo (&newCell, i, nodes_x*y+x, &NodeStore, &CellStore);

Я пробовал много разных изменений в указателях, но не могу заставить его работать. Вы бы знали, как?

Вот упрощенная полная версия:

#include <vector>

using namespace std;

typedef struct NODE_MESH{
    int ID;
}NODE_MESH;

typedef struct CELL_MESH{
    int Global_ID;
    NODE_MESH* node_pointers[4];
    int node[4];
}CELL_MESH;

vector<NODE_MESH*> NodeStore;
vector<CELL_MESH*> CellStore;

double nodes_y = 5;
double nodes_x = 4;
int cells_y = 4;
int cells_x = 3;

void setCellInfo (CELL_MESH* target, int Global_ID, int node0,vector<NODE_MESH *>* NodeStore, vector<CELL_MESH *>* CellStore) {

    CellStore->push_back(target); //No Errors
    target->Global_ID = Global_ID; //No Errors
    
    if (node0 != 0) {
        target->node[0] = NodeStore[vector<NODE_MESH *>::size_type(node0)]->ID; //ERROR 1
        target->node_pointers[0] = NodeStore[vector<NODE_MESH *>::size_type(node0)]; //ERROR 2
    }
}

int main() {
    
    int i = 0;
    
    for (double y = 0; y < nodes_y; y++) {
        for (double x = 0; x < nodes_x; x++) {
            NODE_MESH *newNode = new NODE_MESH;
            NodeStore.push_back(newNode);
            newNode -> ID = i;
            i++;
        }
    }
    
    i = 0;
    
    for (int y = 0; y < cells_y; y++) { //nodes_y since horizontal faces are aligned with nodes horizontaly (same y)
        for (int x = 0; x < cells_x; x++) { //x coordinate for horizontal faces is in-between nodes so 0.5 with count for faces
            
            CELL_MESH *newCell = new CELL_MESH;
            
            setCellInfo (newCell, i, nodes_x*y+x, &NodeStore, &CellStore);
            
            i++;
            
        }
    }
    
    return 0;
}

Начните с изменения вашей функции, чтобы она брала векторы по ссылке &, а не по указателю.

Botje 06.02.2023 12:31
NodeStore — это указатель на vector<NODE_MESH *>, поэтому NodeStore[x] — это vector<NODE_MESH *>.
molbdnilo 06.02.2023 12:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для переменной T* t синтаксис t[x] эквивалентен *(t+x), что и является причиной этой путаницы. Конкретно, NodeStore[vector<NODE_MESH *>::size_type(node0)] имеет тип vector<NODE_MESH *>&, а не элемент NodeStore, как вы ожидали.

Измените свой код, чтобы вместо этого использовать переменные по ссылке:

void setCellInfo (CELL_MESH* target, int Global_ID, int node0,vector<NODE_MESH *>& NodeStore, vector<CELL_MESH *>& CellStore) {

    CellStore->push_back(target); //No Errors
    target->Global_ID = Global_ID; //No Errors
    
    if (node0 != 0) {
        target->node[0] = NodeStore[node0]->ID;
        target->node_pointers[0] = NodeStore[node0];
    }
}

Тогда вызов просто

setCellInfo (&newCell, i, nodes_x*y+x, NodeStore, CellStore);

В качестве альтернативы вам нужно будет разыменовать указатель перед индексацией:

(*NodeStore)[node0]->ID

Окончательное решение:

void setCellInfo (CELL_MESH* target, int Global_ID, int node0,vector<NODE_MESH *>& NodeStore, vector<CELL_MESH *>& CellStore) {

    CellStore.push_back(target);
    target->Global_ID = Global_ID;
    
    if (node0 != 0) {
        target->node[0] = NodeStore[node0]->ID;
        target->node_pointers[0] = NodeStore[node0];
    }
}

При этом при его использовании:

CELL_MESH *newCell = new CELL_MESH;
        
setCellInfo (newCell, i, nodes_x*y+x, NodeStore, CellStore);

Другие вопросы по теме