[ ana @ 17.02.2004. 15:05 ] @
Caos svima:) Radim neki projektic za fax i nesto mi nije jasno kako da u funkciju prenesem niz koji sadrzi pokazivace, i kako da prodjem kroz ceo taj niz ,a da pri tom funkciji ne dostavim br clanova niza. Jel ima neka standardna fora za to?

Meni je palo na pamet da zadnji clan u niz ne bude nista korisno nego 0, (kao kod stringova) medjutim to mi nesto ne deluje bas kao lepo resenje (mada radi)

evo sta treba da uradim tacno:Za skolski Kernel realizovati funkciju runConcurrently() koja kao parametar prima niz pokazivaca na globalne funkcije bez argumenata i pokrece po jednu nitnad svakom od tih funkcija.
-Pri tome imam konstruktor za Thread ovakav: Thread (void (*body)())
ja sam to resila ovako:
Code:

void (*f[5])();
f[0]=&threadBody;    //ovde su mi threadBody i f2 neke fje
f[1]=&f2;
f[2]=&f2;
f[3]=&f2;
f[4]=0;
runConcurrently(f);
--- gde je:
void runConcurrently(void (*f[])()) {
// void (*f[])() niz pokazivaca na fje (koje nemaju arg i ne vracaju nista)
 for(int i=0;f[i]!=0;i++) {
                        cout<<"Pravim novi thread za i="<<i<<"\n";
                        Thread* t=new Thread(f[i]);
                        cout<<"Startujem thread za i="<<i<<"\n";
                        t->start();
                }
}


Hvala! Anchie
[ leka @ 17.02.2004. 15:38 ] @
Ana, primer takvog prosledjivanja imas u maltene svakom mom primeru koji
sam ovde poslao - ja volim ovakvu main funkciju u svom C/C++ kodu:

Code:

#include <stdio.h>

int main(int argc, char** argv)
{
printf("Aplikacija: %s", argv[0]);
return 0;
} // main()


'argv' je ovde niz koji sadrzi nizove karaktera (stringove narodski
receno). Naravno NULL je uvek indikator da niz vise nema elemenata...
[ Dragi Tata @ 17.02.2004. 16:57 ] @
Citat:
ana:
Caos svima:) Radim neki projektic za fax i nesto mi nije jasno kako da u funkciju prenesem niz koji sadrzi pokazivace, i kako da prodjem kroz ceo taj niz ,a da pri tom funkciji ne dostavim br clanova niza. Jel ima neka standardna fora za to?

Meni je palo na pamet da zadnji clan u niz ne bude nista korisno nego 0, (kao kod stringova) medjutim to mi nesto ne deluje bas kao lepo resenje (mada radi)


Ako baš ne želiš da funkciji eksplicitno dostaviš i broj članova niza, onda ovo tvoje rešenje uopšte nije loše.
[ yooyo @ 18.02.2004. 00:05 ] @
Moze i ovako...

Code:

typedef void (*PFNThreadFunc)();

std::vector<PFNThreadFunc> niz;

niz.push_back(f1);
niz.push_back(f2);
niz.push_back(f3);
...

runConcurrently(niz);
--------------------

void runConcurrently(std::vector<PFNThreadFunc>& f) 
{
 for(int i=0; i< f.size(); i++) 
 {
        Thread* t=new Thread(f[i]);
        t->start();
 }
}



Imam i pitanje... Ko ce da obrise sve ove silne thread-ove?

yooyo
[ Dragi Tata @ 18.02.2004. 02:11 ] @
Ne verujem da vector dolazi u obzir u ovom slučaju - koliko sam razumeo, radi se o kernel-mode programiranju.
[ Ivan Dimkovic @ 18.02.2004. 10:22 ] @
Anina ideja je sasvim OK za kernel programiranje - moj savet je da se umesto nule koristi neka druga vrednost - jer ako se ta lista pointera negde automatski puni, moze da se desi da nekom greskom neki pointer bude nula, a onda ce funkcija startovanja niti stati pre vremena (treba proveriti da li je ptr validan pre startovanja niti, naravno)

Napisi samo dve funkcije - ptrArrayAlloc(int num, void*ptrArray[]) i ptrArrayFree(void*ptrArray) koje ce raditi "bookeeping" tj. alocirati/dealocirati jedan clan vise i dodeljivati mu neku "magicnu" vrednost, recimo -1 koja ce oznacavati kraj niza.


2Leka - Trazeno je resenje >bez< broja clanova kao parametra funkcije - tvoj argc sluzi upravo tome, a pretpostavljati da je nula na kraju niza je opasno jer mozda ima i drugacijih CRT implementacija.
[ filmil @ 18.02.2004. 13:31 ] @
Samo da napomenem, pošto sam prepoznao da se u primeru radi na školskom
kernelu za predmet „Programiranje u realnom vremenu“, da saveti u kojima
se koristi STL (dakle std::vector i slične stvari) neće raditi. STL
prosto nije na raspolaganju u implementaciji školskog kernela.

Zato mislim da je rešenje koje je OP dao u redu, uz dodatnu primedbu da
za školski kernel nije bitno što za nit ne postoji destruktor: memorija
se oslobađa automatski pri kraju rada.

f
[ ana @ 20.02.2004. 16:47 ] @
da bas za Programiranje u realnom vremenu :) da nisi slucajno i ti uzeo taj predmet za izborni? :)

Hvala svima na savetima,ideja je bas bila da se ne prenese br clanova niza,i da se ne koristi nikakva kolekcija, mada sam bila ubedjena da postoji neki standardan programerski shtos kako se u tom slucaju prolazi kroz niz.
Ovo sa -1 mi se bas svidja tako da cu tako napraviti...
[ filmil @ 20.02.2004. 17:01 ] @
Evo idejica: kako nismo sigurni da pointer 0 ili -1 ne pokazuje na neku korisnu lokaciju, onda bi marker za kraj trebao da sadrži adresu samog sebe. Ta vrednost sigurno ne pokazuje na neki validan kod (jer je upravo koristimo za dotični pointer) a vrlo lako se proverava, ništa posebno teže.

while (&p != p)

itd...

f

p.s. Za nas je PRV bio obavezan predmet.