Я делаю драйвер клавиатуры для моей OSDev OS и у меня есть проблема в моем kbd.c:Ошибка: объект с переменным размером не может быть инициализирован?
kbd.c: In function 'scancoderec':
kbd.c:56:2: error: variable-sized object may not be initialized
register int (ScanCode[strlen(ValEAX)-8]) = 0x00; /* Remove last 8 bits from the value we gathered from EAX to get AH and make that the scancode. */
Вот функция, которая содержит неудовлетворительную строку кода:
int scancoderec() {
__asm__ volatile("movl $0, %eax"); /* Moving 00 to EAX. */
__asm__ volatile("int $0x16 "); /*int 0x16 */
register int ValEAX asm("eax"); /* Let's get eax */
register int (ScanCode[strlen(ValEAX)-8]) = 0x00; /* Remove last 8 bits from the value we gathered from EAX to get AH and make that the scancode. */
}
Почему это происходит?
EDIT: У меня все еще есть то, что «топор» не определен, на этот раз, в другой функции.
kbd.c:65:27: error: 'ax' undeclared (first use in this function)
register int Key = kbdus[ax];
Код функции скан и GETKEY функции:
unsigned short scancodeget()
{
unsigned char ax = 0; /* int 0x16, AH=0 is get keystroke */
__asm__ __volatile__ ("int $0x16\n\t"
: "+a"(ax));
ax = ax >> 8; /* Shift top 8 bits of ax to lower 8 bits */
/* ax now is the scancode returned by BIOS */
return (unsigned short)ax; /* Return the lower 8 bits */
}
int getkey() { /*This could be used as a keyboard driver. */
scancoderec(); /*Get our scancode! */
int Key = kbdus[ax]; /*Use our kbdus array which i copied from a website since i seriously don't want to make an gigantic array */
}
Компилятор считает, что вы объявляете массив под названием «ScanCode». Честно говоря, я понятия не имею, что вы пытаетесь сделать в этом коде. – user3386109
Комментарий: «Удалить последние 8 бит из значения ...» -> выглядит как «Удалить последние 8 _bytes_ ...» – chux
Хммм, если 'strlen (ValEAX) <= 8', код, безусловно, будет иметь проблемы. – chux