Ошибка бесконечного цикла
Доброго дня!
Помогите пожалуйста, почему валя выдает ошибку бесконечного цикла?
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);
- comment out the main when submitting milestone one
- 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 как решение Решение
каком порядке вообще выполняют элементы заголовка цикла
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 |
Почему в мое случае происходит бесконечный цикл? патамушта присваивание counter = 8 возвращает ненулевой результат.
1 |
Just Do It! 3559 / 1958 / 626 Регистрация: 23.09.2014 Сообщений: 6,318 Записей в блоге: 2 |
|
17.06.2021, 12:48 |
6 |
Почему в мое случае происходит бесконечный цикл? https://www.cyberforum.ru/post15572970.html … /// Условие, цикл выполняется, когда оно true.
1 |
liv 5109 / 4548 / 854 Регистрация: 07.10.2015 Сообщений: 9,461 |
||||||||||||
17.06.2021, 13:18 |
7 |
|||||||||||
andrew321, цикл
эквивалентен
Или если рассмотреть три выражения, как
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 |
|||
не эквивалентен кто сказал что их местами можно менять
а тип определяется самым правым выражением в списке
тут тип 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 |
Не понял, как нельзя менять, а что тогда можно сделать в заголовке? Мы тут понять не можем, ЧЕГО ТЫ ВАЩЩЕ ХОЧЕШЬ.
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 Необходимо перезапустить сервер");
}
}
задан 16 мар 2016 в 11:13
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 MayorovPavel Mayorov
57.7k7 золотых знаков71 серебряный знак144 бронзовых знака
Просто определите в какой момент он перестает выходить из Вашего цикла for. И если в нем (и ниже) Вы используете логические выражения, то поменяйте & на &&.
ответ дан 16 мар 2016 в 11:17
Max ZSMax ZS
3,3511 золотой знак10 серебряных знаков25 бронзовых знаков
2