История изменений
Исправление Stanson, (текущая версия) :
error: pointers are not permitted as case values
Разумеется.
Написал бы
case( ptr )
{
case 0xC0000000: ... break;
case 0xC0000010: ... break;
}
никаких ошибок не было бы.
Но со строками таблицу вообще не выйдет сделать никак, потому что для каждого case надо вызывать strcmp.
Да-да, конечно-конечно.
case( string )
{
case "measure": ... break;
case "reset": ... break;
case "calibrate": ... break;
}
=>
char *commands[] = { "measure", "reset", "calibrate" };
void *jmptable[] = { &case0, &case1, &case2 };
for( i = 0; i < sizeof(commands); i++ )
if( !strcmp( string, commands[i]) )
goto jmptable[i]
Вообще никаких проблем. Реализовать это в компиляторе совсем не сложно, благо strcmp/memcmp обычно вообще builtin.
Исправление Stanson, :
error: pointers are not permitted as case values
Разумеется.
Написал бы
case( ptr )
{
case 0xC0000000: ... break;
case 0xC0000010: ... break;
}
никаких ошибок не было бы.
Но со строками таблицу вообще не выйдет сделать никак, потому что для каждого case надо вызывать strcmp.
Да-да, конечно-конечно.
case( string )
{
case "measure": ... break;
case "reset": ... break;
case "calibrate": ... break;
}
=>
char *commands[] = { "measure", "reset", "calibrate" };
void *jmptable[] = { &case0, &case1, &case2 };
for( i = 0; i < sizeof(commands); i++ )
if( !strcmp( string, commands[i]) )
goto jmptable[i]
Вообще никаких проблем.
Исходная версия Stanson, :
Но со строками таблицу вообще не выйдет сделать никак, потому что для каждого case надо вызывать strcmp.
Да-да, конечно-конечно.
case( string )
{
case "measure": ... break;
case "reset": ... break;
case "calibrate": ... break;
}
=>
char *commands[] = { "measure", "reset", "calibrate" };
void *jmptable[] = { &case0, &case1, &case2 };
for( i = 0; i < sizeof(commands); i++ )
if( !strcmp( string, commands[i]) )
goto jmptable[i]
Вообще никаких проблем.