Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 14:46   #1
ParadoxX27
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 11
По умолчанию Работа с циклом.

Доброго утра, дня или вечера! Кому как.
Не могу разобраться с циклом:

Код:
for (int i=sl->Count-1;i>=0;i--)
if (sl->Strings[i].Pos(edit3->Text))
{
sl->Delete(i);
sl->Delete(i-1);
sl->Delete(i-2);
break;
}
else {Form3->Show();
break;}
Если не выполняются условия if, то выскакивает нужная Form3 и ошибка цикла. Не могу добиться, чтобы просто появлялась Form3.
ParadoxX27 вне форума Ответить с цитированием
Старый 29.01.2012, 16:22   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

- последний break вообще ни к чему.
nick42 вне форума Ответить с цитированием
Старый 29.01.2012, 16:27   #3
ParadoxX27
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от nick42 Посмотреть сообщение
- последний break вообще ни к чему.
Знаю, там вместо него return стоит. Но всё равно не работает.
ParadoxX27 вне форума Ответить с цитированием
Старый 30.01.2012, 10:31   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Я считаю, что неправилен сам подход: в цикле нужно модифицировать какую-то логическую переменную, а после исполнения цикла, в зависимости от значения этой переменной, уже работать с самой формой3.
Напр: bool isdeleted; for(...){.. isdeleted=true;}; if(!isdeleted) Form3->Show;
nick42 вне форума Ответить с цитированием
Старый 30.01.2012, 11:07   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

У Вас цикл организован как i=sl->Count-1, а внутри цикла размер массива sl изменяется. Если действительно хотите менять размер массива, тогда нужно это делать через while.

Код:
int i=sl->Count-1;
while(i >= 0)
{
  if (sl->Strings[i].Pos(edit3->Text))
  {
  sl->Delete(i);
  sl->Delete(i-1);
  sl->Delete(i-2);
  i = Count-1;// получаем новый размер массива
  }
  else i--;
}
Но у Вас при первом-же совпадении со строкой происходит выход из цикла. Тогда нужно делать иначе.

Код:
bool x;
int i;
for (i=sl->Count-1;i>=0;i--)
if (sl->Strings[i].Pos(edit3->Text)) {x=true; break;}
else x=false;
if(x)
{
  sl->Delete(i);
  sl->Delete(i-1);
  sl->Delete(i-2);
}
else Form3->Show();
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 30.01.2012 в 11:09.
Smitt&Wesson вне форума Ответить с цитированием
Старый 30.01.2012, 14:33   #6
ParadoxX27
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Но у Вас при первом-же совпадении со строкой происходит выход из цикла. Тогда нужно делать иначе.

Код:
bool x;
int i;
for (i=sl->Count-1;i>=0;i--)
if (sl->Strings[i].Pos(edit3->Text)) {x=true; break;}
else x=false;
if(x)
{
  sl->Delete(i);
  sl->Delete(i-1);
  sl->Delete(i-2);
}
else Form3->Show();
При запуске цикла выскакивает ошибка "List index out of bounds (-1)".
.
ParadoxX27 вне форума Ответить с цитированием
Старый 30.01.2012, 15:02   #7
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

никаких парадоксов, - если Вы собираетесь удалять две предшествующие строки, то ограничивать цикл надо не i>=0, а i>1 или внутри цикла сделать анализ, чтоб не обращаться к несуществующим (с отрицательным индексом) строкам компонента.
nick42 вне форума Ответить с цитированием
Старый 31.01.2012, 14:48   #8
ParadoxX27
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 11
По умолчанию

Код:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
TStringList* sl= new TStringList();
sl->LoadFromFile("Variables.txt");
bool x;
      for (int i=sl->Count-1;i > 1;i--)
        if (sl->Strings[i].Pos(edit3->Text))
        {
          sl->Delete(i);
          sl->Delete(i-1);
          sl->Delete(i-2);
          x = true;
sl->SaveToFile("Variables.txt");
delete sl;
edit3->Clear();
Form2->Show();
        }
if (!x) {ShowMessage("Not Found");}
}
Выскакивает ошибка "raised exception class EStringListError with message List index out of bounds.
Помогите найти ошибку =(
ParadoxX27 вне форума Ответить с цитированием
Старый 31.01.2012, 15:10   #9
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

- просто надо душевнее к циклам относиться... - Вы и запись в файл, и открытие новой формы - все выполняете, не выйдя из цикла. Тут любой компилятор взбесится.
После x=true; я бы еще добавил i = i-2: для коррекции индекса (Вы ж три последние в цикле строки "снесли"...) и закрыл фигурную скобку. Потом - анализ х: если истина - ... ну, и дальше по тексту - иначе - ShowMessage.
nick42 вне форума Ответить с цитированием
Старый 31.01.2012, 15:58   #10
ParadoxX27
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 11
По умолчанию

Вот весь код кнопки, при выполнении условия if в первом цикле всё работает нормально, ошибок не вылетает. Но если выполняется else {ShowMessage("Not Found");}, то после нажатия в этом сообщении на "Ок" вылетает "raised exception class EStringListError with message List index out of bounds (-1)"

Код:
int id;

void __fastcall TForm1::Button4Click(TObject *Sender)
{
TStringList* sl= new TStringList();
sl->LoadFromFile("Variables.txt");
bool x;
int i;
        for (i=sl->Count-1;i>1;i--)
        if (sl->Strings[i].Pos(edit3->Text)) {x=true; break;}
        else x=false;
        if(x)
        {
          String s=sl->Strings[i];
          id=s.SubString(4,s.Pos("Name=")-4).ToInt();
          sl->Delete(i);
          sl->Delete(i-1);
          sl->Delete(i-2);
        }
        else {ShowMessage("Not Found");}
sl->SaveToFile("Variables.txt");
sl->LoadFromFile("App.ini");
sl->Text = StringReplace(sl->Text,"[!ShowMeter App"+String(id)+"]","",TReplaceFlags()<<rfReplaceAll);
sl->Text = StringReplace(sl->Text,"[!HideMeter App"+String(id)+"]","",TReplaceFlags()<<rfReplaceAll);
int u = sl->IndexOf("[Back"+String(id)+"]");
for (i=0;i<8;i++)
{
sl->Delete(u);
}
int p = sl->IndexOf("[App"+String(id)+"]");
for (i=0;i<15;i++)
{
sl->Delete(p);
}
sl->Strings[14];
int idY=sl->Values["Y"].ToInt();
idY+=2;
sl->Values["Y"]=idY;
sl->Strings[15];
int idH=sl->Values["H"].ToInt();
idH-=30;
sl->Values["H"]=idH;
sl->SaveToFile("App.ini");
delete sl;
edit3->Clear();
Form2->Show();
}
Помогите, пожалуйста, подскажите, в чём причина ошибки?
ParadoxX27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с циклом. glebast Помощь студентам 1 20.01.2012 16:41
Работа с циклом ( находим сумму) - не могу понять , где ошибся ) zipo666 Помощь студентам 3 01.11.2011 12:51
работа с циклом alekstav Общие вопросы Delphi 1 31.12.2010 09:18
Задача в паскале. Работа с циклом while do. Йохан Шмидт Помощь студентам 12 28.07.2010 10:43
Работа с циклом в StringGrid-e artemavd Общие вопросы Delphi 2 20.07.2009 22:27