LINUX.ORG.RU

История изменений

Исправление 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] 

Вообще никаких проблем.