Ошибка бесконечного цикла

Ошибка бесконечного цикла

Доброго дня!
Помогите пожалуйста, почему валя выдает ошибку бесконечного цикла?

package com.javarush.task.task28.task2810;

import com.javarush.task.task28.task2810.model.*;

public class Aggregator {
public static void main(String[] args) {
Provider provider = new Provider(null);
Controller controller = new Controller(provider);
controller.scan();
}

}

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

The program builds properly, but I’m getting an infinite loop of random numbers and I’m not sure why. I

int getInt(void);
double getDbl(void);
void prnTitle(void);
void prnFooter(double gTotal);
void pause(void);
double getDblLimited(double lowerLimit, double upperLimit);
  1. comment out the main when submitting milestone one
  2. Your final milestone one should run perfectly with the following tester program.

To comment out the main() delete the next two characters after the arrow

int main (void)
{
    int iVal;
    double dVal;
    welcome();

    // testing prnTitle()
    printf("listing header and footer with grand total:n");
    prnTitle();



    // Testing prnFooter()
    prnFooter(1234.5678);
    printf("listing header and footer without grand total:n");
    prnTitle();
    prnFooter(-1);


    // Testing Pause() and clrKyb()
    pause();


    // Testing getInt()
    printf("Enter an integer: ");
    iVal = getInt();
    printf("You entered: %dn", iVal);


    // Testing Get Int Limited
    printf("Enter an integer between 10 an 20: ");
    iVal = getIntLimited(10, 20);
    printf("Your entered %dn", iVal);


    // Testing Get Double
    printf("Enter a floating point number: ");
    dVal = getDbl();
    printf("You entered: %0.2lfn", dVal);


    // Tesing Get Double Limited
    printf("Enter a floating point number between 10.00 an 20.00: ");
    dVal = getDblLimited(10.0, 20.0);
    printf("You entered: %0.2lfn", dVal);



    printf("End of tester program for milestone one!n");
    return 0;
    }


/* End Commenting out the main out*/

// implement your functions for milestone one down here:
void welcome(void)
{
    printf("---=== Grocery Inventory System ===---n");

}

void prnTitle(void)
{
    printf("Row |SKU| Name t | Price |Taxed| Qty | Min |  Total  |Atn n");
    printf("----+---+--------------------+--------+-----+-----+-----+------------+|---n");

}
void prnFooter(double gTotal)
{
    printf("--------------------------------------------------------+-----------------n");
    //float  gTotal = 1234.57;
    while (gTotal > 0)
    {
        printf("%12.21f", gTotal);
    }
}
void clrKyb(void)
{
    char b;
    while (b != 'n')
    {
        scanf("%c", &b);
    }

}
void pause(void)
{
    printf("Press <Enter> to continue...");

    clrKyb();

}
int getInt(void)
{
    //printf("Enter an interger:");
    int d;
    char c;
    scanf("%d%c", &d, &c);
    while (c != 'n')
    {
        printf("Invalid integer, please try again ");
        scanf("%d%c", &d, &c);
    }
    return d;
}
int getIntLimited(int lowerLimit, int upperLimit)
{
    int a;
    //printf("Enter an integer between %d and %d:", lowerLimit, upperLimit);
    scanf("%d", &a);
    while (a <= lowerLimit || a >= upperLimit)
    {
    //  printf("Invalid value, %d < value < %d:", lowerLimit, upperLimit);
        scanf("%d", &a);
    }
    return a;
}
double getDbl(void)
{
    double d;
    char c;
//  printf("Enter a floating point number:");
    scanf("%lf,%c", &d, &c);
    while (c != 'n')
    {
        printf("Invalid number, please try again ");
        scanf("%lf%c", &d, &c);
    }
    return d;
}

double getDblLimited(double lowerLimit, double upperLimit)
{
    double a;
    printf("Enter a floating point number between %f and %f:", lowerLimit, upperLimit);
    scanf("%lf", &a);
    while (a <= lowerLimit || a >= upperLimit)
    {
        printf("Invalid value, %f < value < %f:", lowerLimit, upperLimit);
        scanf("%lf", &a);

    }
    return a;
    return 0;
}

1 / 1 / 0

Регистрация: 16.06.2021

Сообщений: 97

1

17.06.2021, 12:13. Показов 2213. Ответов 12


Студворк — интернет-сервис помощи студентам

Всем привет. Написал цикл for, изменя при этом стандартное расположение выражений, что привело к бесконечному циклу. Можете объяснить в каком порядке вообще выполняют элементы заголовка цикла. Заголовок: for(counter <= 10; counter = 8; counter++);



0



XLAT

Just Do It!

3559 / 1958 / 626

Регистрация: 23.09.2014

Сообщений: 6,318

Записей в блоге: 2

17.06.2021, 12:27

2

Лучший ответ Сообщение было отмечено long399 как решение

Решение

Цитата
Сообщение от andrew321
Посмотреть сообщение

каком порядке вообще выполняют элементы заголовка цикла

C++
1
2
3
4
5
6
7
8
for
(   int i = 0;  /// Инициализатор.
        i < N;  /// Условие, цикл выплняется, когда оно true
        i++  ;  /// Действие выполняемое в конце цикла.
)
{
        ...     /// Тело цикла.
}



0



1 / 1 / 0

Регистрация: 16.06.2021

Сообщений: 97

17.06.2021, 12:32

 [ТС]

3

Почему в мое случае происходит бесконечный цикл?



0



140 / 84 / 23

Регистрация: 31.08.2016

Сообщений: 731

17.06.2021, 12:36

4

counter = 8 всегда true видимо



1



Нарушитель

8593 / 4598 / 1060

Регистрация: 12.03.2015

Сообщений: 21,598

17.06.2021, 12:36

5

Цитата
Сообщение от andrew321
Посмотреть сообщение

Почему в мое случае происходит бесконечный цикл?

патамушта присваивание counter = 8 возвращает ненулевой результат.



1



Just Do It!

3559 / 1958 / 626

Регистрация: 23.09.2014

Сообщений: 6,318

Записей в блоге: 2

17.06.2021, 12:48

6

Цитата
Сообщение от andrew321
Посмотреть сообщение

Почему в мое случае происходит бесконечный цикл?

https://www.cyberforum.ru/post15572970.html
потому что:

… /// Условие, цикл выполняется, когда оно true.



1



liv

Эксперт CЭксперт С++

5109 / 4548 / 854

Регистрация: 07.10.2015

Сообщений: 9,461

17.06.2021, 13:18

7

andrew321, цикл

C++
1
2
3
4
for (int i = 0;  i < N; i++)
{
    //тело цикла
}

эквивалентен

C++
1
2
3
4
5
6
7
8
    i = 0;
    goto cmp;
loop:
//тело цикла
    i++;
cmp:
    if (i < N)
        goto loop;

Или если рассмотреть три выражения, как for (A; B; C), то будем иметь:

C++
1
2
3
4
5
6
7
8
    A
    goto cmp;
loop:
//тело цикла
    C
cmp:
    if (B)
        goto loop;



1



1 / 1 / 0

Регистрация: 16.06.2021

Сообщений: 97

01.07.2021, 06:46

 [ТС]

8

Здравствуйте, в книжке у меня было написано: for(a, b, c), где а, b, c — это списки выражений определенного типа, а тип определяется самым правым выражением в списке, поэтому возникает вопрос — for(counter <= 10; counter = 8; counter++); не эквивалентен for(counter = 8; counter <= 10; counter++); ?



0



qppq

140 / 84 / 23

Регистрация: 31.08.2016

Сообщений: 731

01.07.2021, 07:31

9

не эквивалентен

кто сказал что их местами можно менять

Цитата
Сообщение от andrew321
Посмотреть сообщение

а тип определяется самым правым выражением в списке

C++
1
for(int i; i<6; i++)

тут тип int имеется ввиду



0



1 / 1 / 0

Регистрация: 16.06.2021

Сообщений: 97

01.07.2021, 07:48

 [ТС]

10

Не понял, как нельзя менять, а что тогда можно сделать в заголовке?



0



140 / 84 / 23

Регистрация: 31.08.2016

Сообщений: 731

01.07.2021, 08:28

11

нормальную книжку скачай



0



Нарушитель

8593 / 4598 / 1060

Регистрация: 12.03.2015

Сообщений: 21,598

01.07.2021, 08:45

12

Цитата
Сообщение от andrew321
Посмотреть сообщение

Не понял, как нельзя менять, а что тогда можно сделать в заголовке?

Мы тут понять не можем, ЧЕГО ТЫ ВАЩЩЕ ХОЧЕШЬ.



0



140 / 84 / 23

Регистрация: 31.08.2016

Сообщений: 731

01.07.2021, 09:26

13



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

01.07.2021, 09:26

13

Цикл while может выполняться бесконечно
(это приведет к зависанию скрипта и страницы
браузера), достаточно передать ему выражение,
которое никогда не станет ложным.
Например, так:

let test = true;

while (test === true) {
/*
Написанный здесь код будет выполняться "вечно"
(пока скрипт не будет остановлен принудительно).
Не стоит это повторять - это приведет к зависанию
страницы браузера!
*/
}

Начинающие программисты время от времени
загоняют свою программу в бесконечный цикл
(с вами это тоже обязательно случится пару
раз). Давайте рассмотрим распространенные
ошибки начинающих.

Ошибка 1

Пусть есть вот такой цикл, выводящий числа
от 1 до 10:

let i = 1;

while (i <= 10) {
console.log(i);
i++;
}

Представим теперь, что программист забыл
сделать увеличение счетчика в цикле:

let i = 1;

while (i <= 10) {
console.log(i);
}

В этом случае цикл будет выполнятся бесконечно,
так как условие, при котором цикл закончится,
никогда не будет достигнуто.

Ошибка 2

Пусть опять наш программист хотел выводить
числа от 1 до 10, однако, вместо
++ написал --:

let i = 1;

while (i <= 10) {
console.log(i);
i--; // перепутал ++ и --
}

В этом случае, хотя счетчик и изменяется,
но он изменяется не в ту сторону — и опять
условие никогда не будет достигнуто.

Цикл не запускается

Бывает и обратная проблема — можно так написать
код, что условие цикла уже изначально будет
неверно и цикл просто не запустится.

Пусть, к примеру, программист хотел вывести
столбец чисел от 1 до 10, однако,
вместо условия i <= 10, написал
условие i >=:

let i = 1;

while (i >= 10) {
console.log(i);
i++;
}

В таком случае цикл просто не начнется, так
как условие изначально неверно.

Бывает и так, что некоторым начинающим кажется,
что цикл крутится не пока условие верно,
а наоборот — цикл крутится пока условие не
верно и остановится, когда оно станет верным.

Вот пример такого кода:

let i = 1;

while (i == 10) { // зачем-то написано ==
console.log(i);
i++;
}

При таком условии цикл вообще не начнется,
так как условие просто изначально не верно.

Задачи

В следующем коде программист вывел числа
от 10 до 1:

let i = 10;

while (i >= 1) {
console.log(i);
}

В коде, однако, была допущена ошибка, которая
привела к тому, что цикл выполняется бесконечно.
Исправьте ошибку программиста.

В следующем коде программист вывел числа
от 10 до 1:

let i = 10;

while (i >= 1) {
console.log(i);
i++;
}

В коде, однако, была допущена ошибка, которая
привела к тому, что цикл выполняется бесконечно.
Исправьте ошибку программиста.

В следующем коде программист вывел числа
от 10 до 1:

let i = 10;

while (i <= 0) {
console.log(i);
i--;
}

В коде, однако, была допущена ошибка, которая
привела к тому, что на экран ничего не вывелось.
Исправьте ошибку программиста.

В следующем коде программист вывел числа
от 10 до 1:

let i = 10;

while (i == 0) {
console.log(i);
i--;
}

В коде, однако, была допущена ошибка, которая
привела к тому, что на экран ничего не вывелось.
Исправьте ошибку программиста.

В следующем коде программист вывел числа
от 10 до 1:

let i = 10;

while (i == 10) {
console.log(i);
i--;
}

В коде, однако, была допущена ошибка, которая
привела к тому, что цикл вывел только число
10 и закончил свою работу. Исправьте
ошибку программиста.

В отдельном потоке запускаю бесконечный цикл. В цикле обрабатываю значения публичного List которые сохраняются в базу данных. В окне программы при каждой интерации выводится номер итерации, List.Count, clientCount. Все отлично работает но по истечении времени, всегда разного, в окно проги выводится одни и те же значения, кроме номера итерации который инкриментируется при каждом выводе.

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

public void Circle(Object StateInfo)
{
    try
    {
        newDatas = new List<MarketData>();
        newDepths = new List<MarketDepth>();
        newInst = new List<Instrument>();
        int clienCount = 0;
        int whileCnt = 0;
        int cntSaveToDB = 0;
        int cntZero = 0;


        while (true)
        {
            try {

                Thread.Sleep(500);

                myEvent("While: " + whileCnt + " RequestList: " + requestList.Count + " clientCount: " + clienCount);

                for (int i = 0; ((i < requestList.Count) & (i < 1100)); i++)
                {
                    if (requestList[0] != null)
                    {
                        var arr = System.Text.RegularExpressions.Regex.Split(requestList[0], ";");
                        ArrToObj(arr);
                        requestList.RemoveAt(0);
                        clienCount++;
                        //for debuging
                        //myEvent("For: " + i + " RequestList: " + requestList.Count + " clientCount: " + clienCount);
                     }
                }

                if ((clienCount >= quantToSave)||(cntZero > 2))
                {
                    cntSaveToDB++;
                    BaseContext clientContext = new BaseContext(connectionString);
                    clientContext.Configuration.AutoDetectChangesEnabled = false;

                    clientContext.Instruments.AddRange(newInst);
                    clientContext.MarketDatas.AddRange(newDatas);
                    clientContext.MarketDepths.AddRange(newDepths);

                    myCnt("Сохранено в базу записей: " + clientContext.SaveChanges());
                    myCnt("В очереди на сохранение в базу :" + requestList.Count);

                    newInst.Clear();
                    newDatas.Clear();
                    newDepths.Clear();
                    clienCount = 0;

                    clientContext.Dispose();

                    myCnt("Всего сохранений в бд " + cntSaveToDB);
                    whileCnt = 0;
                    cntZero = 0;
                }

                if((requestList.Count == 0)&(clienCount != 0))
                {
                    cntZero++;
                }
                else
                {
                    cntZero = 0;
                }

                whileCnt++;

            }
            catch(Exception exc)
            {
                myErr(exc.ToString());
                writeError(exc.ToString());
            }
        }
    }
    catch (Exception exc)
    {                            
        writeError(exc.ToString());
        MessageBox.Show("Внимание: какие то проблемы rn" + exc.ToString() + "rn Необходимо перезапустить сервер");
    }

}

Nicolas Chabanovsky's user avatar

задан 16 мар 2016 в 11:13

Искандер Фоатов's user avatar

1

Ваша основная проблема — в том, что когда requestList[0] оказывается null — он так и остается навсегда. Просто потому что строчка requestList.RemoveAt(0); выполняется только для ненулевых запросов. Ее надо выполнять во всех случаях.

Проблема номер два — небезопасная работа с потоками.

Проблема номер три — активное ожидание. Программа занимает процессор даже если ничего не делает.

Все проблемы можно решить если вместо списка воспользоваться классом BlockingCollection поверх ConcurrentQueue:

BlockingCollection<string> requestsQueue = new BlockingCollection<string>(new ConcurrentQueue<string>());

// ...

while (!requestsQueue.IsCompleted) {
  try {
    var request = requestsQueue.Take(); // Этот метод выполняет ожидание если очередь пуста
    var i = 0;
    do {
      // Обработка запроса request как вы делали ранее
    } while (++i < 1100 && requestsQueue.TryTake(out request)); // Получаем новый запрос если очередь не пуста - но не более 1100 запросов в пакете.

    // Дальше как было
  } catch /*...*/ { /*...*/ }
}

ответ дан 17 мар 2016 в 7:19

Pavel Mayorov's user avatar

Pavel MayorovPavel Mayorov

57.7k7 золотых знаков71 серебряный знак144 бронзовых знака

Просто определите в какой момент он перестает выходить из Вашего цикла for. И если в нем (и ниже) Вы используете логические выражения, то поменяйте & на &&.

ответ дан 16 мар 2016 в 11:17

Max ZS's user avatar

Max ZSMax ZS

3,3511 золотой знак10 серебряных знаков25 бронзовых знаков

2

Понравилась статья? Поделить с друзьями:
  • Ошибка биос 0251
  • Ошибка бесконечного регресса
  • Ошибка биопсии щитовидки
  • Ошибка бесключевого доступа шкода
  • Ошибка бименджи драйв 0x00000003