Przekazywanie wielu obiektów jako jeden argument funkcji.

dział ogólny

Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 9 marca 2009, 14:48

Zastanawiam się nad pewną możliwością.

Mam 6 obiektów typu TImage: Image1, Image2...Image6

i funkcjÄ™:

Kod: Zaznacz cały
void (TImage *Image)
{
// tutaj funkcja musi wykonać operacje na 6 obiektach typu TImage
}


Funkcja nie należy do klasy formularza, znajduje się w zupełnie innym pliku i nie ma pojęcia jakie obiekty znajdują się na formularzu. Jedyny jej kontakt z formularzem to ta funkcja.

Czy istnieje jakaś możliwość przekazania 6 obiektów do funkcji jako pojedynczy argument?
Tym samym takie rozwiÄ…zanie nie wchodzi w grÄ™:

Kod: Zaznacz cały
void (TImage *Image1, TImage *Image2, TImage *Image3, TImage *Image4, TImage *Image5, TImage *Image6)
{
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Witold » poniedziaÅ‚ek, 9 marca 2009, 15:46

Cyfrowy Baron napisał(a):Czy istnieje jakaś możliwość przekazania 6 obiektów do funkcji jako pojedynczy argument?

Może tablica (dla której koniec danych to NULL) ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez kinio » poniedziaÅ‚ek, 9 marca 2009, 16:07

Hej!

Cyfrowy Baron napisał(a):Funkcja nie należy do klasy formularza, znajduje się w zupełnie innym pliku i nie ma pojęcia jakie obiekty znajdują się na formularzu. Jedyny jej kontakt z formularzem to ta funkcja.

Trochę niejasno napisane, ale mniemam że chodzi o to aby wysłać do funkcji 6 obiektów naraz.
Jeżeli tak to można to zrobić na dwa sposoby:

1. Stworzyć tablicę:
Kod: Zaznacz cały
TImage** tab[] = {Image1, Image2, Image3, Image4, Image5, Image6}

a później napisać funkcję:
Kod: Zaznacz cały
void func(TImage** tab)
{
    for(int i=0;i<6;++i)
    {
         //operacje na kazdym Image. Odnosimy siÄ™ poprzez tab[i] np.
         tab[i]->Left = 0;
    }
}

Funckję oczywiście można łatwo uogólnić dla dowolnej liczby komponentów. Jeżeli zamierzamy przesyłać tablicę o różnej wielkości to trzeba podać jej rozmiar np:
Kod: Zaznacz cały
void func(int size, TImage** tab)
{
    for(int i=0;i<size;++i)
    {
         //operacje na kazdym Image. Odnosimy siÄ™ poprzez tab[i] np.
         tab[i]->Left = 0;
    }
}


2. Stworzyć funkcję o zmiennej liczbie argumentów:
Kod: Zaznacz cały
#include <stdarg.h>
...
void func(int liczba, ...)
{
     va_list vl;
     va_start(vl, liczba);

     for(int i=0;i<liczba;++i)
     {
          TImage* img = va_arg(vl, TImage*);
          img->Left = 0;
     }

     va_end(vl);
}

No i funckje teraz możemy wywołać tak:
Kod: Zaznacz cały
func(6, Image1, Image2, Image3, Image4, Image5, Image6)


Mam nadzieje że to rozwiązuje problem. Jeżeli źle zrozumiałem powyższe Twoje zdanie to opisz dokładniej o co chodzi.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 9 marca 2009, 16:23

TImage** tab[] = {Image1, Image2, Image3, Image4, Image5, Image6}


To nie działa. Komunikaty błędów:

[BCC32 Error] Main.cpp(151): E2034 Cannot convert 'TImage *' to 'TImage * *'
[BCC32 Error] Main.cpp(153): E2034 Cannot convert 'TImage * * *' to 'TImage * *'
[BCC32 Error] Main.cpp(153): E2342 Type mismatch in parameter 'tabImages' (wanted 'TImage * *', got 'TImage * * *')
[BCC32 Error] Main.cpp(162): E2034 Cannot convert 'TImage *' to 'TImage * *'
[BCC32 Error] Main.cpp(164): E2034 Cannot convert 'TImage * * *' to 'TImage * *'
[BCC32 Error] Main.cpp(164): E2342 Type mismatch in parameter 'tabImages' (wanted 'TImage * *', got 'TImage * * *')




Fragment mojego programu.

w pliku modułu DataCreate.h i DataCreate.cpp:
Kod: Zaznacz cały
public:
       void __fastcall UnPack(String NameGat, String NameTitle,
                         TStrings *ListaOpisu, TImage** tabImages);
//========================================================================
void __fastcall TCreateBase::UnPack(String NameGat, String NameTitle,
     TStrings *ListaOpisu, TImage** tabImages)
{
::SetCursor(LoadCursor(NULL, IDC_WAIT));
String packFileName = FBaseDir + "\\" + NameGat + "\\" + NameTitle + ".bfb";

TMemoryStream *mStream = new TMemoryStream();

Archiver->FileName = packFileName;
Archiver->OpenArchive(fmOpenRead);
Archiver->Password = "password";

Archiver->ExtractToStream("title.txt", mStream);
mStream->Position = 0;
ListaOpisu->LoadFromStream(mStream);
mStream->Position = 0;

for(int i = 0; i < 6; i++)
{
  WideString aFileName = "title" + (String)(i + 1) + ".jpg";
  try
  {
  Archiver->ExtractToStream(aFileName, mStream);

   mStream->Position = 0;

   std::auto_ptr<TJPEGImage> JImage(new TJPEGImage());
   JImage->LoadFromStream(mStream);
   tabImages[i]->Picture->Assign(JImage.get());

   mStream->Position = 0;
  }catch(...){;}
}

Archiver->CloseArchive();

delete mStream;
Screen->Cursor = crDefault;
}


w pliku modułu Main.cpp:
Kod: Zaznacz cały
TImage** tabImages[] = {Image1, Image2, Image3, Image4, Image5, Image6};

CreateGroup->UnPack("GAT1", "title1", ListaOpisu, tabImages);
Memo1->Lines->Assign(ListaOpisu);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez kinio » poniedziaÅ‚ek, 9 marca 2009, 16:29

Sorki, prosta literówka:
zamiast:
Kod: Zaznacz cały
TImage** tab[] = {Image1, Image2, Image3, Image4, Image5, Image6}

powinno być:
Kod: Zaznacz cały
TImage* tab[] = {Image1, Image2, Image3, Image4, Image5, Image6}
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 9 marca 2009, 16:32

Pierwsze co zrobiłem gdy nie zadziałało, to właśnie to, ale tak też nie działa:

Komunikaty błędu:

[BCC32 Error] Main.cpp(153): E2034 Cannot convert 'TImage * *' to 'TImage *'
[BCC32 Error] Main.cpp(153): E2342 Type mismatch in parameter 'tabImages' (wanted 'TImage *', got 'TImage * *')
[BCC32 Error] Main.cpp(164): E2034 Cannot convert 'TImage * *' to 'TImage *'
[BCC32 Error] Main.cpp(164): E2342 Type mismatch in parameter 'tabImages' (wanted 'TImage *', got 'TImage * *')




Siedzę już nad tym 8 godzin i jestem zmęczony...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 9 marca 2009, 16:33

Już wiem co jest nie tak. funkcja musi mieć zdefiniowany rozmiar tablicy:

Kod: Zaznacz cały
void __fastcall UnPack(String NameGat, String NameTitle,
                         TStrings *ListaOpisu, TImage* tabImages[]);


Dzięki, to mi usprawnia całą aplikację, gdyż bez obiektów pośrednich funkcja działa szybciej, a juz zabierałem się za tworzenie specjalnej klasy, która będzie pośredniczyć w przekazywaniu obiektów. Jestem już chyba bardzo zmęczony, bo rozważałem możliwość użycia tablicy, ale uznałem, że to nie wypali...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez kinio » poniedziaÅ‚ek, 9 marca 2009, 16:38

Spox!
Lepiej odpocznij :s
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Corvis » wtorek, 10 marca 2009, 22:49

A próbowałeś wrzucić to do Listy obiektów ? TObjectList* ???
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
PodziÄ™kowaÅ‚ : 80
OtrzymaÅ‚ podziÄ™kowaÅ„: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Przekazywanie wielu obiektów jako jeden argument funkcji.

Nowy postprzez Cyfrowy Baron » Å›roda, 11 marca 2009, 11:39

Problem jest już rozwiązany, wystarczy mi tablica.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron