Ограничение на размерность массива в языке Си - PullRequest
0 голосов
/ 30 марта 2010
int KMP( const char *original, int o_len, const char *substring, int s_len ){
if( o_len < s_len )
    return -1;

int k = 0;
int cur = 1;

int fail[ s_len ];

fail[ k ] = -1;

while( cur < s_len ){
    k = cur - 1;
    do{
        if( substring[ cur ] == substring[ k ] ){
            fail[ cur ] = k;

            break;
        }else{
            k = fail[ k ] + 1;
        }
    }while( k );    

    if( !k && ( substring[ cur ] != substring[ 0 ] ) ){
        fail[ cur ] = -1;
    }else if( !k ){
        fail[ cur ] = 0;
    }

    cur++;
}

k = 0;
cur = 0;

while( ( k < s_len ) && ( cur < o_len ) ){
    if( original[ cur ] == substring[ k ] ){
        cur++;
        k++;
    }else{
        if( k == 0 ){
            cur++;
        }else{
            k = fail[ k - 1 ] + 1;
        }
    }
}

if( k == s_len )
    return cur - k;
else
    return -1;
}

Это алгоритм KMP, который я однажды написал. Когда я просмотрел это сегодня утром, мне показалось странным, что целочисленный массив определен как int fail [s_len]. Требуется ли в спецификации постоянная времени компиляции массивов? Как этот код может пройти компиляцию? Кстати, у меня версия gcc 4.4.1. Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 30 марта 2010

Возможность определения массивов с использованием переменной в качестве измерения была добавлена ​​в C в C99. Он также поддерживается как расширение некоторыми компиляторами C ++, но не является частью стандарта C ++ и не будет частью C ++ 0x. Если вы планируете переносимость на компиляторы C89 или C ++, лучше не использовать его.

2 голосов
/ 30 марта 2010

В дополнение к ответу Нила: эта функция называется VLA - Массив переменной длины . Он действительно был добавлен в C99 и в настоящее время поддерживается несколькими компиляторами. Его использование не рекомендуется по другим причинам , в дополнение к проблеме переносимости, упомянутой Нилом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...