Ссылка на typedef как его структурный аналог - PullRequest
0 голосов
/ 12 октября 2010

Ладно, ребята, мы все знаем, что есть много вопросов по typedef / struct, но я чувствую, что это что-то вроде ума.

Я моделирую соседние взаимодействия кристаллической решетки, используя строго C. У меня есть структура, называемая "ball_struct", которую я определил как "ball". Структура содержит указатель на список ball_structs (поскольку я не мог использовать имя typedef до его собственного объявления), который шар считает своими соседями.

Итак, вот подвох: Я хочу добавить шары в этот список соседей ball_struct. Когда я компилирую (в Visual Studio 2009 нет поддержки CLR), я получаю:

ошибка C2440: '=': невозможно преобразовать из 'ball *' в 'ball_struct'

Я не удивлен, но я в тупике. Есть ли способ привести typedef обратно к соответствующей структуре? Если нет, могу ли я в любом случае добавить «ball» в список «ball_struct», чтобы мне не пришлось удалять ключевые слова typedef и вставлять «struct» во всем коде? Вот код, о котором идет речь:

Структура / typedef:

typedef struct ball_struct
{
    double mass;
    vector pos, vel, acc;

    /* keep list of neighbors and its size */
    struct ball_struct *neighbors;
    int numNeighbors;
} ball;

И ошибочная функция:

/* adds ball reference to the neighbor list of the target */
void addNeighbor(ball *target, ball *neighbor)
{
    int n = target->numNeighbors;
    target->neighbors[n] = neighbor;     // error C2440
    target->numNeighbors = n+1;
}

Спасибо, любая помощь приветствуется. Помните, пожалуйста, только решения для C.

1 Ответ

3 голосов
/ 12 октября 2010

В строке, где вы получаете сообщение об ошибке:

 target->neighbors[n] = neighbor; 

вы назначаете указатель (neighbor) на фактическую структуру (не указатель на структуру).Обратите внимание, что если вы внимательно посмотрите на сообщение об ошибке, вы увидите, что это то, что он говорит.Обратите внимание на звездочку в типе 'from', о которой говорится:

cannot convert from 'ball *' to 'ball_struct'

Предполагая, что target->neighbors указывает на массив ball_struct структур, я думаю, что вы хотите сделать следующее:1011 *


PS: вы можете рассмотреть возможность использования одного и того же имени для вашей структуры и typedef структуры:

typedef struct ball
{
    /* etc... */
} ball;

Хотя компилятор до ANSI мог не поддерживать это ( Почему имена структур отличаются от их имен typedef? ), сегодня это, безусловно, хорошо поддерживается.И я думаю, что это делает вещи немного менее запутанными.

...