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

Това е част от случай на превключвател IOCTL. Получавам следната грешка?

грешка: размерът на съхранението на 'data' не е известен грешка: '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
РАЗМЕРЪТ на масива на pIDs се променя при всяко всичко на този драйвер, той не е дефиниран като #define РАЗМЕР 10. Какво може да се направи? - person user340; 26.08.2012
comment
@kani Да. Това обаче ще доведе до други промени. - person cnicutar; 26.08.2012
comment
Хм, да :-( можеш ли да погледнеш това. 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

Имам две заявки на Oracle, изпълнявани в различни сесии, които блокират, и ми е трудно да разбера защо се случва това.

Заявката в сесия 1 е следната:

UPDATE REFS R SET R.REFS_NAME = :B2 WHERE R.REFS_CODE = :B1 

Заявката в сесия 2 е следната:

UPDATE REFS R SET R.STATUS_CODE = :B3, R.STATUS_TYPE = :B2 WHERE R.REFS_CODE = :B1 

Всеки е заобиколен от курсор, който преминава през селекция от стойности на първичен ключ. Когато тези заявки се изпълняват едновременно, те блокират. REFS_CODE е първичният ключ и проследяването на Oracle показва, че те актуализират различни редове. Първичният ключ очевидно е индексиран и има някои ограничения на външния ключ, които се поддържат от индекси, тъй като това е било проблем за нас в миналото.

Преминавайки към царството на отчаянието, опитах да деактивирам тригерите на масата и това не помогна. Също така се опитах да използвам автономни транзакции, но това направи нещата много по-лоши.

Има ли нещо, което пропускам? Благодаря за всяка помощ!

- person user340; 26.08.2012
comment
@kani, Ако искате размерът на масива да бъде динамичен, тогава наистина искате елемент int numIDs и променете pIDs на указател (int * pIDs). След това драйверът ще трябва да разпредели пространство в паметта с размер numIDs*sizeof(int), след което да направи copy_from_user() към това пространство в паметта с помощта на pIDs. - person Joshua; 29.08.2012