Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структуры, раота с самоадресуемыми структурами 
:(
    Опции темы
reddevel
Дата 21.4.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 8.12.2004
Где: Россия

Репутация: нет
Всего: нет



есть само адресуемая структура

Код

class TFormObject    
{
 public:
 TImage *pict;
 TFormObject *tf;
 void __fastcall OnMD(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
 void __fastcall OnMM(TObject *Sender, TShiftState Shift, int X, int Y);
 void __fastcall OnMU(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
 void __fastcall OnC(TObject *Sender);
 void __fastcall TFSadd();
 void __fastcall DrawLink(); 
 int fx,fy;
 
};



есть функция добавления новой структуры

Код

void __fastcall TFormObject::TFSadd()   
{

 if (TFn ==NULL)
 {TFn= TFnew;
 TFold= TFnew;}
 else {TFold->tf= TFnew;
  TFn= TFnew;
  TFn->tf= TFnew;}
};


есть функция хождения по структуре
Код

 void __fastcall TFormObject::DrawLink()
    {
      int x,y,x1,y1;
      TFnew= TFn;
 while (TFnew !=NULL)
       {
          
          x1=(TFnew->fx)*10;
          y1=(TFnew->fy)*10;

          Form2->Canvas->MoveTo(x1,y1);
          
          TFnew= TFnew->tf;
          if (TFnew !=NULL)
          {
          x=(TFnew->fx)*10;
          y=(TFnew->fy)*10;

          Form2->Canvas->LineTo(x,y);
          }
        };
    };


при вызове функции DrawLink система уходит в бесконечный цикл!!!!
подскажите плз где ошибка очень на до горю по срокам с дипломом (((
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 21.4.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Код

if (TFn ==NULL)
 {TFn= TFnew;
 TFold= TFnew;}
 else {TFold->tf= TFnew;
  TFn= TFnew;
  TFn->tf= TFnew;}

Очень интересно, как это уходитв цикл, когда это вообще не не должно, ибо что такое TFn TFold, TFnew?
А откуда перется бесконечность :
Код

TFn= TFnew;
  TFn->tf= TFnew

Вот и замкнули сами на себя


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
reddevel
Дата 21.4.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 8.12.2004
Где: Россия

Репутация: нет
Всего: нет



TFn - это указатель на 1 -ую структуру.
TFnew- на новую
TFold- на предыдущую.


TFn,TFnew->TFold,TFnew,->TFold,NULL

а если от этого
Код

TFn= TFnew;
 TFn->tf= TFnew;
 

берется бесконечность то я не понимаю как еще можно добавить структуру в конец списка????

PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 21.4.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Переводим smile
Пусть у нас TFnew указывает на объект O
TFn= TFnew;
После этого кода и TFn будет указывать на O
Следовательно этот код
TFn->tf= TFnew;
равносилен
O->tf = O;
Зациклили

Код


TFnew= TFn; //TFnew указывает на O
while (TFnew !=NULL)
   {
          
          //.........           
          TFnew= TFnew->tf;    // TFnew опять указывает на O,  так ка O->tf == O; 


          ///...
 
}


Добавлено @ 15:54
Вообщето достаточно иметь указатель на первую струкруру и на последнюю(если не хочечь пробегать по всему дереву. Но обойдемся только первой
Код

struct Item {
{
 Item():next(NULL){}   
Item* next;
void Add(Item* );
void Draw();
void DrawItem();
    
};

void Item::Add(Item* newItem) 
{
      Item* i;
      for(  i = this; i->next; i = i->next);  //обращаю внимание - не пропустите ';' 
      i->next = newItem;
 }

void Item::Draw()
{
  for( Item* i = this; i->next; i = i->next){
         i->DrawItem();     
  }
}


Item FirstItem;
for(int i = 10; i--;)
{
     FirstItem.Add(new Item);   
}

//рисуем всех
FirstItem.Draw();




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.