Размер хранилища неизвестен

Это часть корпуса коммутатора IOCTL. Я получаю следующую ошибку?

ошибка: размер хранилища «данных» неизвестен ошибка: «mesg» не объявлен (первое использование в этой функции)

case PASS_STRUCT:

        struct mesg{
            int pIDs[SIZE];
            int niceVal;
        };

        struct mesg data;

        ret = copy_from_user(&data, arg, sizeof(data));
        if(ret < 0){
            printk("PASS_STRUCT\n");
            return -1;  
        }

        printk("Message PASS_STRUCT : %d\n",data.niceVal);
        break;

Значение SIZE задается перед созданием сообщения.


person user340    schedule 26.08.2012    source источник


Ответы (1)


struct mesg{
    int pIDs[SIZE];
    int niceVal;
};

Значение SIZE задается перед созданием сообщения.

В C SIZE должна быть настоящей константой времени компиляции, чтобы использовать ее таким образом. Что-то типа:

#define SIZE 10

Вы также должны переместить объявление структуры за пределы switch.

person cnicutar    schedule 26.08.2012
comment
SIZE массива pIDs меняется при каждом включении в этот драйвер, он не определяется как #define SIZE 10. Что можно сделать? - person user340; 26.08.2012
comment
@кани Да. Однако это принесет другие изменения. - person cnicutar; 26.08.2012
comment
Хм, да :-( Можете ли вы взглянуть на это. драйвер устройства через ioctl"> stackoverflow.com/questions/12130689/. Я определяю SIZE перед вызовом PASS_STRUCT, разве в этом коде ничего не делается? - person user340; 26.08.2012
comment
@kani Узнайте больше о C и внутреннем устройстве Linux: это будет проще, чем просто перетаскивать код с одного вопроса на другой. - person cnicutar; 26.08.2012
comment
Можно ли будет изменить #define SIZE 10 во время выполнения? - person user340; 26.08.2012
comment
@kani Нет, как только вы это определите, он станет текстом. - person cnicutar; 26.08.2012
comment
с тем же кодом выше, теперь я получаю эту ошибку: ожидаемое выражение перед «структурой». Что ты думаешь об этом? - person user340; 26.08.2012
comment
@kani, если вы хотите, чтобы размер массива был динамическим, вам действительно нужен элемент int numIDs и измените pIDs на указатель (int * pIDs). Затем драйвер должен будет выделить пространство памяти размером numIDs*sizeof(int), а затем выполнить copy_from_user() для этого пространства памяти, используя pIDs. - person Joshua; 29.08.2012