Я объявил следующую функцию на С++
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;
}
NodeStore
— это указатель на vector<NODE_MESH *>
, поэтому NodeStore[x]
— это vector<NODE_MESH *>.
Для переменной 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);
Начните с изменения вашей функции, чтобы она брала векторы по ссылке
&
, а не по указателю.