Передача указателя структуры или массива в качестве аргумента функции - PullRequest
0 голосов
/ 18 октября 2018

У меня есть структура typedef, например, так:

typedef struct {
    int col;
    int row;
} move_t;

Я пытаюсь передать массив типа move_t в функцию в виде своего рода буфера для заполнения ... вот так:

void generate_valid_moves(int fc, int fr, move_t* moves, int limit);

или

void generate_valid_moves(int fc, int fr, move_t moves[], int limit);

Оба генерируют скрытую ошибку gcc:

moves.h:43: error: expected declaration specifiers or ‘...’ before ‘move_t’
moves.h:887: error: conflicting types for ‘generate_valid_moves’
moves.h:43: note: previous declaration of ‘generate_valid_moves’ was here

Я попытался удалить typedef и просто сделать его нормальной структуройи т.д ... все приводят к подобным ошибкам.По ощущениям, я знаю, что что-то упустил ...

Прототип моей функции и сигнатура реализации абсолютно совпадают ... так что часть ошибки еще более странная.

Моя цель состоит в том, чтобысоздайте массив из move_t, затем передайте его в эту функцию для заполнения move_t.Затем вызывающая сторона выполняет работу с заполненным буфером move_t.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

То же самое здесь.Даже объявление с указателем на move_t не является проблемой.

Удостоверились ли вы в том, что ваше объявление завершено, прежде чем оно будет использовано для объявления прототипа функции?

Вот пример кода, использующего объявление на основе typedef и указателя:

#ifndef MOVE_H_INCLDED
#define MOVE_H_INCLUDED

typedef struct {
    int col;
    int row;
} move_t;

void generate_valid_moves(int fc, int fr, move_t* moves, int limit);

#endif
#include <stdio.h>
#include "move.h"

void generate_valid_moves(int fc, int fr, move_t* moves, int limit)
{

}

int main()
{
    return 0;
}

скомпилированный файл move.c с gcc.

0 голосов
/ 18 октября 2018

typedef должен быть перед прототипом функции, который ссылается на тип.Код C обрабатывается по порядку, вы не можете ссылаться на имя, пока оно не определено.Поэтому, если у вас нет определения структуры, то он думает, что move_t является объявленной переменной, но перед ней нужен спецификатор типа.

...