Как использовать указатели на структуры - PullRequest
0 голосов
/ 11 апреля 2011

Я определил структуру в одном из моих файлов исходного кода.Также я определил указатель на эту структуру, как (глобальное объявление)

struct blockPropStruct { int random_id; int id; CvPoint left_up; CvPoint right_down; };

typedef struct blockPropStruct *newBlock;

В этом же файле я назначаю память указателям с помощью mallocсоздать массив структур.

newBlock = (blockPropStruct*)malloc(maxNum*sizeof(blockPropStruct));

Теперь я пытаюсь использовать его в другом исходном файле, объявив (глобальное объявление)

extern struct blockPropStruct *newBlock;

Теперь, когда я использую что-то вроде

newBlock[i].left_up.x=mark1[i];

Выдает ошибку.

Ответы [ 4 ]

2 голосов
/ 11 апреля 2011

Может показаться, что вы пропустили объявление типа struct в файле, который объявляет переменную extern.

2 голосов
/ 11 апреля 2011

Название вашей структуры struct blockPropStruct. Обратите внимание, что в C вы не можете просто удалить часть struct, это часть имени типа. Вы можете определить тип для своей структуры, чтобы у вас было меньше печатания, но я думаю, что лучше не забывать использовать ваши структуры как struct blockPropStruct.

На основании сообщений об ошибках, которые вы добавили в свои комментарии:

ошибка C2036: 'blockPropStruct *': неизвестный размер
ошибка C2027: использование неопределенного типа 'blockPropStruct'

Вы пытаетесь получить размер sizeof(blockPropStruct) в своем вызове malloc(), поскольку blockPropStruct не является допустимым идентификатором, поэтому вы пытаетесь получить размер неопределенного типа.

Чтобы определить ваш тип:

typedef struct blockPropStruct blockPropStruct;

Теперь вы можете ссылаться на тип вашей структуры как blockPropStruct или struct blockPropStruct.

0 голосов
/ 11 апреля 2011
newBlock = (blockPropStruct*)malloc(maxNum*sizeof(blockPropStruct));

Для того, чтобы вышеприведенный оператор работал, текущий исходный файл должен видеть размер структуры.Итак, проверьте, включили ли вы соответствующий заголовочный файл.


extern struct blockPropStruct *newBlock;

А когда вы делаете -

newBlock[i].left_up.x=mark1[i];

Вы должны перенести определение blockPropStruct втекущий модуль компиляции, чтобы иметь возможность использовать его членов.Итак, попробуйте -

#include "blockPropStruct.h"
extern struct blockPropStruct *newBlock;  // This says to use else where 
                                          // initialized newBlock
// ....
newBlock[i].left_up.x=mark1[i];           // And to do this, bring the definition
                                          // to this file scope

И нет необходимости явно набирать malloc.

0 голосов
/ 11 апреля 2011

Вам нужно дать имя с помощью 'typedef' и указать на него.

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