Ошибка: структура определена неправильно

Я делаю некоторые GPIO с бигльбоун и в настоящее время это в моем коде:

#include <linux/gpio.h>         //for GPIO

char label[] = "sys/kernel/debug/gpio";

struct gpio xx[] = {
    { gpio1, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio2, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio3, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio4, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio5, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio6, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio7, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio8, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio9, GPIOF_DIR_OUT|GPIOF_INIT_LOW, label },
    { gpio10, GPIOF_DIR_OUT|GPIOF_INIT_HIGH, label },
    };

где gpio#, все определены как целые числа. GPIOF_DIR_OUT и GPIOF_DIR_LOW — это функции в «linux/gpio.h».

Структура не объявляется внутри функции. Я считаю, что это моя проблема, но я не уверен, как это объявляется неправильным. Я видел другие темы для этого, но ничего не помогло с моей проблемой. Я думаю, проблема в том, что я вызываю функцию из своей структуры. Если бы кто-то мог проверить или помочь мне исправить это, это было бы здорово.


person Dohrann    schedule 28.02.2013    source источник
comment
ваш код не вызывает никаких функций, попробуйте использовать GPIOF_DIR_OUT().   -  person perreal    schedule 28.02.2013
comment
Какое определение для struct gpio? Также я предполагаю, что gpio1~10 и label являются макросами или перечислениями. Они не могут быть переменными.   -  person Tuxdude    schedule 28.02.2013


Ответы (4)


Если от gpio1 до gpio10 целые числа, как вы говорите, то то, что вы здесь объявили, как говорит компилятор, недействительно. Инициализаторы глобальных переменных в C должны быть постоянными выражениями, что означает, что использование переменных запрещено!

person Carl Norum    schedule 28.02.2013

[...] где gpio#, все определены как целые [...]

Я предположил, что вы, вероятно, имели в виду что-то вроде:

const int gpio1 = 42;
const int gpio2 = 84;
const int gpio3 = 43;
// etc.

Однако, поскольку xx инициализируется в глобальной области видимости, он выделяется и инициализируется во время компиляции. Однако, исходя из моего предположения, gpio1 и друзья выделяются и инициализируются во время выполнения, поэтому очевидно, что компилятор сообщает вам, что он не может инициализировать xx.

Вам нужно будет использовать постоянное выражение (или макрос, который будет расширяться до буквальной константы), чтобы это работало. Например, вы должны сделать:

enum {
    gpio1 = 42, 
    gpio2 = 84, 
    gpio3 = 43, 
    // etc.
};

...or:

#define gpio1 42
#define gpio2 84
#define gpio3 43
// etc.

И прежде чем вы спросите, label распадается на указатель на строковый литерал в этом контексте. Это делает его постоянным выражением, так что это разрешено.

person netcoder    schedule 28.02.2013

GPIOF_DIR_OUT, GPIOF_INIT_LOW, GPIOF_INIT_HIGH — это макросы, а не функции. Так что это не причина.

Я думаю, что эта проблема может быть связана с определениями gpio1 ~ gpio10, это переменные или макросы?

person tian_yufeng    schedule 28.02.2013

Сделайте значения gpio1 etc const и он скомпилируется, например:

const unsigned gpio1 = 1;
person William Morris    schedule 28.02.2013
comment
Переменная, определенная как const, не считается константным выражением в C, поэтому нет, это не сработает. - person netcoder; 28.02.2013
comment
Хм, я скомпилировал его перед публикацией, и это сработало. Если присмотреться, clang принимает это, а gcc нет; оба с -std=c99 - person William Morris; 28.02.2013
comment
См. gcc.gnu.org/bugzilla/show_bug.cgi?id=53091. #c3. Обратите внимание, что вышеперечисленное будет разрешено в C++. - person netcoder; 28.02.2013