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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2014, 23:02   #1
=A_Z_A=
Новичок
Джуниор
 
Регистрация: 12.03.2014
Сообщений: 2
По умолчанию ООП в C++Builder: помогите передать в функцию указатель на структуру

Доброго времени суток. После долгого размышления на тему "Построение таблицы идентификаторов по методу бинарного дерева" родил вот такой вот код:
Код:
//Файл модуля .cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vcl/dstring.h>
#include "SystemApplicationUnit.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
TSystemApplication *SystemApplication;
//---------------------------------------------------------------------------
TStringList *IDList = new TStringList;
//---------------------------------------------------------------------------
__fastcall TSystemApplication::TSystemApplication(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::POpenFileClick(TObject *Sender)
{
 OpenFile -> FileName = "";
 if (OpenFile -> Execute())
  {
   IDList -> LoadFromFile(OpenFile -> FileName);
   if (IDList -> Count != 0)
	{
	 for (int i = 0; i < IDList -> Count; i++)
	  {
	   Buffer = IDList -> Strings[i];
	   for (int j = 1; j <= Buffer.Length(); j++)
		{
		 if (((Buffer[j] < 48) || (Buffer[j] > 57)) &&
			 ((Buffer[j] < 65) || (Buffer[j] > 90)) &&
			 ((Buffer[j] < 97) || (Buffer[j] > 122)))
		  {
		   Application -> MessageBox("Выбран файл с недопустимыми данными",
									 "Ошибка",MB_OK + MB_ICONERROR);
		   return;
		  }
		}
	  }
	 Application -> MessageBox("Файл успешно загружен в программу",
							   "Осведомление",MB_OK + MB_ICONINFORMATION);
	}
   else
	Application -> MessageBox("Файл пуст. Выберите другой файл","Ошибка",
							  MB_OK + MB_ICONERROR);
  }
 else
  Application -> MessageBox("Файл не выбран","Предупреждение",
							MB_OK + MB_ICONWARNING);
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::CreateBinaryTree()
//Эту функцию я еще не сделал до конца, но проблема не в этом
{
 bool Done;
 NewVertex = new TVertex;
 NewVertex -> Value = IDList -> Strings[0];
 NewVertex -> LeftLeaf = NULL;
 NewVertex -> RightLeaf = NULL;
 RootVertex = NewVertex;
 for (int i = 1; i <= IDList -> Count; i++)
  {
   Done = false;
   CurrentVertex = RootVertex;
   do
	{
	 if (IDList -> Strings[i] == CurrentVertex -> Value)
	  {
	   Buffer = "Невозможно создать бинарное дерево. Причина: наличие двух ";
	   Buffer += "одинаковых идентификаторов во входном потоке данных";
	   Application -> MessageBox(Buffer.c_str(),"Ошибка",MB_OK + MB_ICONERROR);
//В этом месте должна вызываться функция DeleteBinaryTree в ней и проблема
	   return;
	  }
	}
   while (!Done);
  }
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::DeleteBinaryTree(TVertex *Pointer)
{
 /*Здесь будет просматриваться дерево по алгоритму обратного обхода с использованием
рекурсий и т.п. В итоге память под дерево будет освобождена*/
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::EFIDTBinaryTreeMethodClick(TObject *Sender)
//Эта функция также не сделана до конца
{
 if (IDList -> Count != 0)
  {
   BinaryTree -> Items -> BeginUpdate();
   BinaryTree -> Items -> Clear();

   BinaryTree -> Items -> EndUpdate();
  }
 else
  Application -> MessageBox("Файл не выбран. Выберите файл","Ошибка",
							MB_OK + MB_ICONERROR);
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::PExitClick(TObject *Sender)
{
 SystemApplication -> Close();
}
//---------------------------------------------------------------------------
void __fastcall TSystemApplication::FormClose(TObject *Sender,
	  TCloseAction &Action)
{
 IDList -> Free();
 Action = caFree;
}
//---------------------------------------------------------------------------
Так вот, как уже было указано в комментах, проблема в функции DeleteBinaryTree(TVertex *Pointer), а именно в ее параметре. Компилятор ругается как и на заголовок, так и на прототип функции. Перелопатил уйма сайтов, но ничего толкового не нашел, за исключением листингов консолей, которые, как я понял после долгих экспериментов, здесь не в тему. Кто знает как правильно передать указатель на структуру в функцию помогите пожалуйста. Заранее благодарен. Также прилагаю заголовочный файл .h с описанием использованных объектов, прототипов, структуры и т.п.
Вложения
Тип файла: doc Заголовочный файл.doc (29.5 Кб, 7 просмотров)

Последний раз редактировалось Stilet; 12.03.2014 в 23:20.
=A_Z_A= вне форума Ответить с цитированием
Старый 13.03.2014, 07:46   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

TVertex, является классом, а не шаблоном класса. TComponent и TObject - шаблоны. Для передачи параметров класса, используется амперсанд &.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 13.03.2014, 12:05   #3
=A_Z_A=
Новичок
Джуниор
 
Регистрация: 12.03.2014
Сообщений: 2
По умолчанию

Спасибо за ответ, только я вроде как структуру использую, а не класс. Но все равно сделал вот так вот:
Код:
void __fastcall TSystemApplication::DeleteBinaryTree(TVertex &Pointer) //Заголовок
void __fastcall DeleteBinaryTree(TVertex &Pointer); //Прототип
но компилятор также ругался теми же словами:
[BCC32 Error] SystemApplicationUnit.h(39): E2293 ) expected
[BCC32 Error] SystemApplicationUnit.cpp(81): E2316 '_fastcall TSystemApplication::DeleteBinaryTre e(TSystemApplication::TVertex &)' is not a member of 'TSystemApplication'
В первом случае, как я понял, компилятору не нравиться, что я в прототипе пишу (TVertex &Pointer) вместо (TVertex). Но в принципе это тож не верно, хотя и компилятор перестает ругаться по этому поводу.
А во втором случае вроде как функция или ее параметр не являются членом формы или что-то типа того. А вот как это обойти я вообще хз. Просто мне нужно, чтобы указатель передавался в функцию, чтобы я смог рекурсивно ее вызывать. А без передачи указателя рекурсия вроде как не получается, по крайней мере в тех вариантах, которые я перепробывал
=A_Z_A= вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на структуру Alexandr- Помощь студентам 2 15.09.2013 20:48
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
Как передать указатель на функцию в функцию WIN32APIist Общие вопросы C/C++ 1 27.01.2011 10:35
Как передать в функцию указатель на String avd Общие вопросы C/C++ 6 06.06.2010 17:52