Loop Limit в C / C ++ - PullRequest
       6

Loop Limit в C / C ++

3 голосов
/ 19 августа 2010

Есть ли предел того, сколько раз цикл может выполняться в C?


void main()
{
    int T,N,x,X,i;
    x=0;
    scanf("%d",&T);
    while(T>0)
    {
        T--;
        scanf("%d",&N);
        X=0;
        while(N>0)
        {
            N--;
            scanf("%d",&x);
            if(x>X){X=x;}
        }
        printf("Case: %d",x);
    }
}

T имеет диапазон 0-250, а N имеет диапазон 0-1000.х имеет диапазон 0-10 000.Всякий раз, когда N превышает 800, моя консоль перестает принимать данные.Может ли это быть связано с ограничением входного буфера?

Ответы [ 4 ]

4 голосов
/ 19 августа 2010

Нет ограничений на количество циклов.Существуют ограничения на максимальные и минимальные значения int, и они могут играть в ваш цикл.В этом случае 800 должно быть в порядке, поэтому здесь происходит что-то еще.

Редактировать: Работает для меня ... Единственное, что я вижу странно, это то, что вы сбрасываете X внутри самого внутреннего цикла, поэтому выход всегда является последним введенным целым числом, если оно> 0 или 0.

2 голосов
/ 19 августа 2010

Вы вводите данные для этой программы?Там может быть некоторое ограничение буферизации с этим.Попробуйте поместить данные в файл и прочитать из файла.

1 голос
/ 19 августа 2010

Обычной практикой является цикл 10000 или (намного) больше для сравнения производительности двух небольших вычислений.

Если бы был предел, не было бы такой вещи, как бесконечный цикл. ;)

1 голос
/ 19 августа 2010

Поскольку комментарии к вам стали неуместны, я сделаю это вики-сообществом и начну с вопросительного предложения, которое содержится в комментариях:

Проверьте возвращаемые значения из всех вызовов scanf.Сначала сделайте это, чтобы определить, передает ли API стандартной библиотеки вам информацию - посредством «электростатической передачи», иначе называемой содержимым регистра eax после вызова scanf в архитектуре x86.Не позволяйте свету в этом регистре умереть незамеченным.Возьмите электрические заряды регистра (биты) в переменную и сравните их с нулем (0) и EOF.Эти инопланетные передачи были отправлены вам с 1976 года, когда scanf был впервые написан для возврата информативного числового значения вызывающей стороне.

Как указал Томлогик в комментариях к ответу, если вы вставляетеданные, вы должны вместо этого попробовать использовать технику, известную как «перенаправление ввода» или «трубопровод».Сначала поместите ваши данные в файл, скажем, name filename.dat .Затем введите команду, такую ​​как:

executable-name < <em>filename.dat</em>

Где имя-файла-исполняемого файла - это файл, который вы генерируете с помощью компилятора Си.Технически, приведенный выше синтаксис создает «перенаправление ввода» или «перенаправление stdin» - оболочка открывает файл для доступа на чтение как нулевой дескриптор файла (0), также известный как stdin.Дочерняя программа, порожденная из оболочки, извлекает scanf из файла, а не из терминала (буфер вставки).

Другой подход заключается в создании «перенаправления канала», при котором оболочка открывает еще один * 1021.* обрабатывает вывод для чтения и передает его потомку, снова как stdin дескриптор файла.В этом случае оболочка, вероятно, использует popen вместо open.Синтаксис для этого может быть:

cat <em>filename.dat</em> | executable-name, как будто на Unix-клоне, или

type <em>filename.dat</em> | executable-name, если в контексте клона IBM® PC-DOS®.

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