2009-04-18 3 views
0

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

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

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

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

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 */ 

     } 

    } 
} 

Оба НКУ и 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 

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

По унаследованным причинам я должен составить для 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. Мне пришлось прикоснуться к какой-то основной логике, я не чувствую себя комфортно, прикасаясь к этому, и я надеялся вернуться к первоначальной конфигурации.

+1

Строго, стандарт C не ограничивает количество циклов; он устанавливает нижнюю границу числа вложенных циклов, которые должны поддерживаться. Все, что имеет 6200 вложенных циклов, ошеломляет. Я должен сомневаться, что это «лучший» способ справиться с этой проблемой. –

ответ

7

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

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

+0

Я не могу говорить с этим peice, но общая система генерирует речь примерно в 16 раз в реальном времени. В некотором анализе селектинг звука и сглаживание волн конечной системы речи затмевают время выполнения компонента произношения в 2400-1.Я лишил много кода (большое количество статусов goto), которые, вероятно, уменьшают сложность на огромную сумму. К сожалению, я сижу на некоторых вещах, которые я не совсем понимаю. – ojblass

+1

Может быть, gotos и все это означает, что на самом деле это не так уж и страшно. Во всяком случае, это нелепый код. – Artelius

+0

Я не завидую вам - попытка исправить сгенерированный код или генераторы кода может стать кошмаром. –

1

Pid 18324 убит из-за текста модификации или страницы ввода/вывода ошибки

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

Смежные вопросы