Демьян М.
9 сообщений
#14 лет назад
Имеется ооочень запутанный код=) Увидел такое впервые. В цикле while двойное условие, через &&. После ввода в программу определённого вида данных программа зацикливается. При просмотре в пошаговом режиме отчётливо видно, что на определённом этапе значение второй части условия равно false. Цикл же и не думает останавливаться. Решив что не разобрался с условием цикла, я сделал так

while(<часть условия1>==<параметр1>){
if(<часть условия2>!=<параметр2>)
break;
...
}

Тут то и началось самое интересное!!! Мой финт ушами ничего не изменил, а при просмотре в пошаговом режиме отчётливо видно, что в нужный момент выполняется break... после чего выполнение программы переходит к СЛЕДУЮЩЕЙ строке

Может кто-нибудь сталкивался с подобным? Что это такое понятия не имею...
Владимир Ф.
1322 сообщения
#14 лет назад
Расставьте явно скобки.
Может в конце экрана пустой оператор ";"
Демьян М.
9 сообщений
#14 лет назад
vovan_f, Вы имеете в виду ситуацию:
while(<часть условия1>==<параметр1>){
if(<часть условия2>!=<параметр2>) ;
break;
...
}

??? Но в таком случае выход из цикла должен был произойти на первой же итерации.
Владимир Ф.
1322 сообщения
#14 лет назад
Точно.. туплю
Себастьян Ф.
584 сообщения
#14 лет назад
MDamien, выложите кусок реального кода
99.9% кривой hands.dll
Демьян М.
9 сообщений
#14 лет назад
  while(((((numColsArg/N)*K)+(numColsArg%N))>=resultNumArg) && (((numColsArg/N)*K)+(numColsArg%N))>N){
circle=0;
Form1->ProgressBar1->Min=0;
Form1->ProgressBar1->Max=numColsArg/N;
Form1->ProgressBar1->Position=0;
while(circle<numColsArg/N){
Form1->ProgressBar1->StepBy(1);
Application->ProcessMessages();
rightOne=N-1;
rightZero=N-1;
nextOne=0;
sigmaMin=100000000000000000000000;
//Обнуляем массив сочетаний
for(int i=0;i<N;i++)
if(i<K){
mass=1;
matrixGroup=new long double;
} else mass=0;
for(unsigned long int iteration=0; iteration<C;iteration++){
//Заполняем массив из N элементов
int MatCount=0;//счётчик
for(int i=0; i<N; i++)
if(mass){
for(int r=0;r<numRowsArg;r++)
matrixGroup=dataSource;
MatCount++;
}
sigma=0;
for(int l=0; l<left;l++)
sigma+=sigmaFunc(matrixGroup, funcVal, numRowsArg, numRowsInModel,l,K,false);
sigma/=left;
if(sigma<sigmaMin){
sigmaMin=sigma;
for(int q=0; q<N; q++)
if(mass) massSigmaBest=1;
else massSigmaBest=0;
}
rightZero=rightOne=N-1;
//Если правый бит не единица, находим ближайшую единицу и сдвигаем вправо на 1
while(!mass) rightOne--;
if(rightOne!=N-1){
mass=0;
mass=1;
continue;
}
//Если правый бит единица
//Считаем количество единиц справа
while(mass) rightZero--;
//Исключаем единичные разряды справа из рассмотрения
//находим ближайшую единицу и перемещаем на 1 вправо
if(rightZero!=N-1){
nextOne=rightZero;
while(!mass) nextOne--;
mass=0;
mass=1;
for(int i=rightZero+1; i<N; i++)
mass=0;
for(int i=nextOne+2;i<nextOne+2+(N-1-rightZero);i++)
mass=1;
}
}
//Сдвигаем значения вправо
for(int j=0,k=0; j<N; j++)
if(massSigmaBest){
for(int i=0; i<numRowsArg;i++)
dataSource=dataSource;
titleHead=titleHead;
titleHead=titleHead;
k++;
}
circle++;
Sh1.OlePropertyGet("Cells",(numRowsArg*left+10+step),(circle+1)).OlePropertySet("Value",((AnsiString)(double)sigmaMin).c_str());
}
for(int j=0;j<(numColsArg%N);j++){
for(int i=0; i<numRowsArg;i++)
dataSource=dataSource;
titleHead=titleHead;
titleHead=titleHead;
}
step++;
numColsArg=((numColsArg/N)*K)+(numColsArg%N);
}
Демьян М.
9 сообщений
#14 лет назад
Цитата ("SField"):
MDamien, выложите кусок реального кода
99.9% кривой hands.dll


За что отвечает и исправит ли это переустановка среды? Заранее спасибо =) Ставил себе RXlib, мог что-нибудь накосячить...
Александр Ц.
1031 сообщение
#14 лет назад
Такие вещи иногда происходят, если возникает исключение, не приводящее к крашу программы. Притом не обязательно в цикле. Поставьте все, что внутри цикла в try-catch и посмотрите будет ли он срабатывать.
Себастьян Ф.
584 сообщения
#14 лет назад
1. break не срабатывал т.к. всего скорее Вы его ставили внутрь другого цикла, из которого он и выходил
2. Для того чтобы отследить правильность работы условий, выносите весь этот ГК:
(((((numColsArg/N)*K)+(numColsArg%N))>=resultNumArg) && (((numColsArg/N)*K)+(numColsArg%N))>N) 

в отдельные переменные которые будут обрабатываться внутри цикла и их уже проверяйте отладчиком
3. Приведите код в нормальный вид, разбив его на функции. Другими словами упростите понимание кода, для себя.
Демьян М.
9 сообщений
#14 лет назад
Спасибо всем отписавшимся. Проблема была решена удалением исполнимого файла проекта. Возможно это связано с тем, что проект был перенесён. Других идей нет
Олег Казакевич
702 сообщения
#14 лет назад
MDamien, это ужасный, ужасный, ужасный код !
На его разбор может уйти прилично времени - проще плюнуть и переписать заново, с
нормальными отступами и явно отслеживаемой логикой, где не будет этих чудовищных
циклов без фигурных скобок и выражений с шестью уровнями вложенности !

Чур меня, чур !
Демьян М.
9 сообщений
#14 лет назад
Я тоже испугался, когда увидел впервые ))))))))