Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

funkcja a rozna ilosc argumentow

Ostatnio zmodyfikowano 2010-01-29 23:29
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
funkcja a rozna ilosc argumentow
» 2010-01-28 23:14:34
chcialem zapytac, czy istnieje sposob, aby tak napisac funkcje, aby wykonywala sie dla podanej liczby argumentow ? chodzi o to, ze mozna wpisac 1,2...5...10 argumentow, a funkcja sie wykona dla nich, przyklad:

-20 obiektow klasy OBIEKT
-funkcja sprawdzajaca kolizje 2 obiektow
C/C++
kolizja( obiekt1, obiekt2 )
kolizja( obiekt1, obiekt3 )
//...
kolizja( obiekt1, obiekt20 )

czy da sie tak, zeby:
kolizja( obiekt1, obiekt2, obiekt7, obiekt15 )
??

i nie chodzi mi o zdefiniowanie wszytskich mozliwych funkcji i ilosci argumentow, lecz napisanie jednej funkcji... np cos takiego, jak wektor, ktory by zliczal wszytskie podane argumenty i dla ich ilosci (rozmiar wektora) wykonal wlasnie ta funkcje?
C/C++
for( i = 0; i < dlugosc_wektora; i++ )
     kolizja( obiekt1, obiekt[ i ] )
po drugie, czy jest sens to robic, bo szukam skroconego zapisu dla np:
C/C++
if( !kolizja_dolna( ludek, podloga1 ) &&!kolizja_dolna( ludek, podloga2 )
&&!kolizja_dolna( ludek, podloga3 ) &&!kolizja_dolna( ludek, podloga4 )
&&!kolizja_dolna( ludek, podloga5 ) &&!kolizja_dolna( ludek, podloga6 )
&&!kolizja_dolna( ludek, podloga7 ) &&!kolizja_dolna( ludek, podloga8 )
&&!kolizja_dolna( ludek, podloga9 ) &&!kolizja_dolna( ludek, podloga10 )
&&!kolizja_dolna( ludek, podloga11 ) &&!kolizja_dolna( ludek, podloga12 )
&&!kolizja_dolna( ludek, podloga13 )
&&!kolizja_dolna( ludek, podloga14 ) &&!kolizja_dolna( ludek, podloga15 )
&&!kolizja_dolna( ludek, podloga16 ) &&!kolizja_dolna( ludek, podloga17 )
&&!kolizja_dolna( ludek, podloga18 )
&&!kolizja_dolna( ludek, podloga19 ) &&!kolizja_dolna( ludek, podloga20 )
&&!kolizja_dolna( ludek, podloga21 ) &&!kolizja_dolna( ludek, podloga22 )
zeby zamiast wypisywac tyle, wpisac w nawias te obiekty, ktore mnie interesuja - zajelo by to mniej miejsca i czasu
P-13366
malan
» 2010-01-29 09:19:19
Zrób sobie tablice obiektów (np. std::vector) umieść tam wszystkie... obiekty klasy i po kłopocie :).
P-13369
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-29 16:56:25
tzn, zrobic tablice wszystkich obiektow w jednej tablicy vektor?
czy robic tak, ze przed uzyciem funkcji, robic tablice tylko dla uzywanych w tej funkcji obiektow?

bo np bedzie w vectorze Ob1,Ob2,Ob3,Ob4 - a jedna funkcja ma zbadac, czy jest zaleznosc miedzy Ob1 a Ob3, druga funkcja, czy Ob1,Ob2 a Ob4, trzecia funkcja wszytskie Obiekty.

chodzi o to, ze jesli mialaby byc jedna tablica ze wszytskimi, a funkcja bedzie pobierala tylko kilka obiektow jako argumenty, to chyba musialbym jeszcze tworzyc druga tablice, ze wskaznikami, ktore argumenty maja byc pobrane?
ewentualnie wlasnie tworzyc kazdorazowo tablice argumentow, ktore chce uzyc

byc moze tez nie dokonca cos zrozumialem lub przeoczylem, lub poportsu nie wiem jak do tego sie zabrac ;)
P-13380
WinerFresh
» 2010-01-29 17:55:28
Masz niebezpieczne var_arg.
P-13382
malan
» 2010-01-29 20:27:01
Masz tutaj mały przykład jak umieścić obiekty klasy w tablicy vector. Może nie jest on najlepszy, ale mniej więcej o to chodzi.
C/C++
#include <iostream>
#include <vector>
using namespace std;

class Prostokat
{
    int bokA, bokB;
   
public:
    inline void ZapiszDlugosciBokow( int fBokA, int fBokB )
    {
        bokA = fBokA;
        bokB = fBokB;
        return;
    };
    inline int ObliczPole( void )
    {
        return bokA * bokB;
    };
    inline int ObliczObwod( void )
    {
        return bokA + bokB;
    };
};

int main()
{
    vector < Prostokat > vProstokat;
   
    int iloscFigur, bokA, bokB;
   
    cout << "Ile prostokatow chcesz wczytac?" << endl;
    cin >> iloscFigur;
   
    for( int i = 0; i < iloscFigur; i++ )
    {
        Prostokat Obiekt;
       
        cout << "#" << i + 1 << endl;
        cout << "Podaj dlugosc bokow: ";
        cin >> bokA >> bokB;
       
        Obiekt.ZapiszDlugosciBokow( bokA, bokB );
        vProstokat.push_back( Obiekt );
    }
   
    for( int i = 0; i < iloscFigur; i++ )
    {
        cout << "#" << i + 1 << endl;
        cout << "Pole: " << vProstokat[ i ].ObliczPole() << endl;
        cout << "Obwod: " << vProstokat[ i ].ObliczObwod() << endl << endl;
    }
   
    getchar();
    return 0;
}
Jeżeli będziesz chciał wypisać konkretny element to piszesz po prostu tak:
C/C++
cout << "Pole 3 elementu: " << vProstokat[ 2 ].ObliczPole() << endl;
cout << "Obwod 5 elementu: " << vProstokat[ 4 ].ObliczObwod();
P-13384
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-29 23:23:27
ok, to wszytsko rozumiem, tylko nie bardzo wiem, czy akurat w moim przypadku sie przyda, jeszcze raz napisze, moze bardziej obrazowo:

przyjmijmy, ze jest 10 obiektow o nazwie od podloga1 do podloga10

po pierwsze ustalam grawitacje, czyli dotad robilem to tak:
C/C++
if( !kolizja( ludek, podloga1 ) &&!kolizja( ludek, podloga2 )...&&!kolizja( ludek, podloga10 ) )
     ludek.i_y++;
po drugie, niektore podlogi powoduja zdarzenie1
C/C++
if( kolizja( ludek, podloga2 ) || kolizja( ludek, podloga4 ) || kolizja( ludek, podloga7 )
zdarzenie1 = true;

po trzecie, inne podlogi powoduja zdarzenie2
...znow kod z np kolizja z 6 obiektami...

a zamiast tego, chcialbym, aby pkt pierwszy wygladal tak:
C/C++
if( kolizja( ludek, podloga1, podloga2, podloga3...podloga10 ) )
     to_zrob_cos_tam;
czyli pytam, jak powinna wygladac definicja funkcji, ktora wykonywalaby sie dla podanej ilosci argumentow (z gory nie okreslonej,bo wtedy wiadomo, ze zdefiniowalbym okreslona funkcje dla takiej czy innej liczby - tak jak teraz mam dla dwoch obiektow, i pozniej wypisuje wszytskie mozliwe w danym przypadku pary, raz tych par jest 10, raz 5 - a majac np obiektow jak podloga np 20,30, latwiej wypisac je kolejno, niz ukladac je w pary z ludkiem i wlasnie o to chcialem zapytac, jak taka funkcje zdefiniowac, ktora sama utworzy pary dla argumentow, ktore podam)

jesli ten przyklad z prostokatem ten problem rozwiazuje, to prosze jeszcze o naprowadzenie bardziej pod moj przyklad, bo niestety nie umiem go pod siebie przeksztalcic, oczywiscie dziekuje bardzo za cierpliwosc, sam dalej bede jeszcze kombinowal, moze na cos wpadne
P-13392
DejaVu
» 2010-01-29 23:29:02
Nie czytałem zbyt dokładnie tego co napisałeś (w sumie to przescrollowałem temat), ale jeśli chodzi Ci o sprawdzenie kolizji każdy z każdym wystarczy użyć pętli:
C/C++
for( int i = 0; i < ilosc - 1; i++ )
for( int j = i + 1; j < ilosc; j++ )
{
    if( jestKolizja( obiekt[ i ], obiekt[ j ] ) )
    {
        //tu coś zrobić - np. pójść do toalety i pomyśleć co dalej :)
    } //if
} //for

/edit:
PS. Jeśli jestem daleki od celu który chcesz osiągnąć i nie jestem w temacie to z góry przepraszam.

/edit2:
A na kwestię wydajności rozwiązania spuśćmy kurtynę milczenia... :)
P-13394
« 1 »
  Strona 1 z 1