Указатель на указатель в структуре C / ObjC - PullRequest
0 голосов
/ 08 декабря 2011

</p> <pre><code>typedef struct { float Position[3]; float Color[4]; float VertexNormal[3]; } Vertex; typedef struct WingedEdge{ struct WingedEdge* sym; struct WingedEdge* next; struct WingedEdge* prev; Vertex** vertex; GLushort** indexPointer; } WingedEdge; Vertex* vertices; GLushort* indices; struct WingedEdge* wingedEdges; int numberOfVertices; //initialized elsewhere int numberOfIndices; //initialized elsewhere,this is multiplied by three since I am not using a struct for the indices vertices = (Vertex *) malloc(numberOfVertices * sizeof(Vertex)); indices = (GLushort *) malloc(numberOfIndices * sizeof(GLushort) * 3); wingedEdges = (struct WingedEdge*)malloc(sizeof(struct WingedEdge)*numberOfIndices*3); for (int i = 0; i < numberOfIndices*3; i+=3) { wingedEdges[i].indexPointer = (&indices+i); wingedEdges[i+1].indexPointer = (&indices+i); wingedEdges[i+2].indexPointer = (&indices+i); wingedEdges[i].vertex = (&vertices+indices[i]); wingedEdges[i+1].vertex = (&vertices+indices[i+1]); wingedEdges[i+2].vertex = (&vertices+indices[i+2]); NSLog(@"%hu %hu %hu", *(indices+i),*(indices+i+1),indices[i+2]); NSLog(@"%f %f %f", (vertices+indices[i])->Position[0], (vertices+indices[i])->Position[1], (vertices+indices[i])->Position[2]); NSLog(@"%f %f %f", (vertices+indices[i+1])->Position[0], (vertices+indices[i+1])->Position[1], (vertices+indices[i+1])->Position[2]); NSLog(@"%f %f %f", (vertices+indices[i+2])->Position[0], (vertices+indices[i+2])->Position[1], (vertices+indices[i+2])->Position[2]); NSLog(@"%hu", **(wingedEdges[i].indexPointer)); }

Пробовал смотреть на несколько других проблем с указателями и структурами, но я ничего не нашел. Я получаю сообщение об ошибке с последним вызовом NSLog. Все, что в вызовах NSLog с индексами и вершинами является правильным, похоже, что это может быть простая синтаксическая ошибка или проблема с указателем. Кроме того, как я должен увеличить указатель, на который указывает indexPointer? Поскольку indexPointer указывает на указатель индексов, то я хочу получить доступ к индексам + 1 и индексам + 2, а также через indexPointer.

1 Ответ

0 голосов
/ 08 декабря 2011

(& indexes + i) не указывает ни на одну выделенную вами память.

Что будет работать, так это изменить indexPointer и вершину на отдельные указатели, а затем

wingedEdges[i].indexPointer = &indices[i];
wingedEdges[i].vertex = &vertices[indices[i]];

Тогда* (wingedEdges [i] .indexPointer) совпадает с индексами [i], а wingedEdges [i] .vertex-> Position [0] совпадает с вершинами [indices [i]]. Position [0].Тем не менее, вы не получите автоматическое обновление, которое вы хотите (см. Мои комментарии для более подробной информации).Я рекомендую простую встроенную функцию:

inline *Vertex vertex(WingedEdge* e) 
{
    return &vertices[*(e->indexPointer)];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...