Что ограничивает количество вложенных циклов в c? - PullRequest
0 голосов
/ 19 апреля 2009

Редактировать: Для тех из вас, кто ищет ответ на вопрос, как указано, стандарт ограничивает число вложенных циклов во время компиляции. Во время выполнения это другая проблема, поскольку единственным ограничением будет размер сегмента программы.

Решено: Я слишком рано искал процесс сборки. Файл c получает дальнейшую предварительную обработку. Выкл. К последующим шагам.

У меня проблема с кодом c, сгенерированным через perl из языка, который применяет правила для генерации произношения. По сути, ввод представляет собой огромный словарь исключений для правил произношения. Код пронизан gotos, и он работал до тех пор, пока один из словарей исключений не достиг 23K правил.

Код в основном не читаемый, но мне удалось заставить код c компилироваться после удаления того, что выглядит как 6200-й вложенный цикл:

for (dictionionary1=seed1;dicitonary1<limit1;dictionary1++)
{
    for (dictionionary2=seed2;dicitonary2<limit2;dictionary2++)
    {
           /* .... */
        for (dictionionary6199=seed6199;dicitonary6199<limit6199;dictionary6199++)
        {
               /* two hundred more removed adding one makes it not compile */

        }

    }
}

И gcc, и xlC способны справиться с этим, но aCC 3.73 (на H11.23 PA RISC) рвется.

Compiling /home/ojblass/exception_dictionary_a.c...
Loading the kernel...
Pid 18324 killed due to text modification or page I/O error
/bin/ksh: 28004 Bus error(coredump)
*** Error exit code 138

Я нашел эту ссылку и попробовал многие из предложенных исправлений без успеха.

По устаревшим причинам я должен скомпилировать 32-битную версию (она использует 32-битную библиотеку, для которой у меня нет 64-битной копии).

maxdsiz = 256 MB (x10000000) tried up to 4 GB
maxssiz = 16 MB (x1000000) tried up to 100MB
maxtsiz = 256 MB (x10000000) tried up to 1 GB

Есть предложения по настройке компилятора или хорошая ссылка для документирования для aCC 3.73? Я тону в результатах поиска.

Я закодировал обходной путь, разбив словарь на две части, в результате чего Dictionary_an.c и dictionary_az.c. Мне пришлось прикоснуться к некоторой основной логике, к которой я не чувствую себя комфортно, чтобы осуществить это, и я надеялся вернуться к первоначальной конфигурации.

Ответы [ 2 ]

7 голосов
/ 19 апреля 2009

Ничего себе - я знаю, что это вам не поможет, но глубина вложения 6199 уровней намного превышает то, что требуется C или C ++ (15 для C90, 127 для C99 и 256 для C ++).

Что меня интересует, так это то, насколько хорошо это работает - если ваши словари имеют любой размер, количество итераций цикла должно быть астрономическим. Скажем, каждый размер словаря равен 10: (10 ^ 6199) довольно большое число. Даже если в словаре только 2 элемента, (2 ^ 6199) также впечатляет.

1 голос
/ 19 апреля 2009

PID 18324 уничтожен из-за изменения текста или ошибки ввода / вывода страницы

Звучит как переполнение стека ^ Ошибка памяти. Это будет означать, что это ошибка в компиляторе. Я не говорю на HPUX, поэтому могу ошибаться, но открытие билета в HP может дать больше информации.

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