Anonymní profil Laďas – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Laďas – Programujte.comAnonymní profil Laďas – Programujte.com

 

Příspěvky odeslané z IP adresy 88.100.12.–

Laďas
C / C++ › Problém s dvojrozmerným poľom
25. 3. 2009   #97927

Tady je fce která vrátí ukazatel na dvojrozměrné pole, které alokuje a vyplní ho hodnotou
zadanou jako parametr. Rozměry toho pole jsou zadány také jako parametr. Snad to pomůže...



long ** alokujPoleLong(const long pocetRadku, const long pocetSloupcu,const long hodnota=0)
{

long ** pole = new long*[pocetRadku];
for (long i = 0; i < pocetRadku; i++)
{
pole[i] = new long[pocetSloupcu];
for (long j = 0; j < pocetSloupcu; j++)
{
pole[i][j] = hodnota;
}
}
return pole;
}

Laďas
C / C++ › inicializace dvojrozmerneho…
24. 3. 2009   #97881

To tmi : Ja sem to pak jeste zkousel v kombinaci ukazatel na pocatek pole + nejaky offset a bylo to jeste rychlejsi nez obe vyse zminovane moznosti. Mas urcite pravdu, aritmeticke operace byvaji co do poctu taktu provedeny mnohem rychleji nez samotna adresace pameti, takze ten vypocet by na rychlost nemel mit vliv. Nezkousel sem to, ale verim, ze pouziti iteratoru bude v tomto pripade pomalejsi nez "klasicky" for cyklus. Bohužel ale, tento přístup nelze použít u spousty jiných dost často používaných kontejnerů, které alokují pamět nespojitě. Např list nebo set atp. Takže pokud nejde vyloženě o rychlost je někdy pohodlnější použít metodu COPY & PASTE, když už to bylo někde předtím napsané, třeba pro jiný kontejner.

Laďas
C / C++ › inicializace dvojrozmerneho…
15. 3. 2009   #97357

To tmi : Nez bych to tu rozepisoval radeji uvedu priklad.




#define ROZMER
int pole[10][10];

// neefektivne
for(int i=0;i< ROZMER: i++)
for(int j=0;j< ROZMER: j++)
pole[i][j]= 0;

//efektivne
int rozsah = ROZMER * ROZMER;
int *pint = &pole[0][0];
for(int i=0; i < rozsah: i++)
{
*pint = 0;
++pint;
}




Rekl bych ze ten druhy for cyklus bude efektivnejsi protoze se tam neustale neprepocitava ta adresa jako u toho prvniho, pouze inkrementuje. POdobne sem myslel ze je to i s iteratory.

Laďas
C / C++ › inicializace dvojrozmerneho…
15. 3. 2009   #97354

to tmi To tmi : Dik chlape pomohl jsi mi :smile2: Jasne to sem pochopil. Na sexy iteratory :smile5: si dam pozor, budu to ale muset jeste overit. Prislo mi prave efektivnejsi pouzit iteratory, protoze pri pouziti for cyklu kde bych to pole indexoval dochazi k vypoctu adresy daneho prvku v poli. Coz mi prislo neefektivni...

Laďas
C / C++ › inicializace dvojrozmerneho…
15. 3. 2009   #97351

Pardon oprava. Jde mi jen o prostor ne prvky, ty si tam vlozim pozdeji. Chci jen dost mista, aby nedoslo
k prekopirovavani z nedostatku vymezeneho mista...



pprv.reserve(PPRV_RADKY);

for(vector<vector <pair <Node *, bool> > >::iterator h = pprv.begin(); h < pprv.end(); h++)

{
h->reserve(NEJAKE_PREDEM_NEZNAME_CISLO);
}


Laďas
C / C++ › inicializace dvojrozmerneho…
15. 3. 2009   #97348

No ono takhle, abych to uvedl na správnou míru. Předem je známý
jen počet řádků toho pole, ale počet sloupců ne, a navíc počet těch
položek na řádku se bude v průběhu vykonávání programu také měnit.
Proto potřebuji mít to pole nestatické. Jinak na inicializovanych hodnotach
v tom poli tak uplně nezáleží. Neni podstatne jestli tam bude NULL, a true.
To se bude upravovat později. Takže pokud sem dobře pochopil to s tím
reserve bude to v konstruktoru vypadat asi takhle...




pprv.reserve(PPRV_RADKY);
vector< pair<Node *, bool > > vp;
for(vector<vector <pair <Node *, bool> > >::iterator h = pprv.begin(); h < pprv.end(); h++)
{
h.push_back(vp);
h.reserve(NEJAKE_PREDEM_NEZNAME_CISLO);
}



Laďas
C / C++ › inicializace dvojrozmerneho…
15. 3. 2009   #97332

Zdravím všechny,
vytvořil sem si jednoduchou třídu Oblasti, která má jednu
privátní proměnnou. Dvojrozměrné pole vector obsahující
dvojice : ukazatel na objekt Node a boolovskou proměnnou.
Počet řádků i sloupců toho pole je předem známý, je určen makry
PPRV_RADKY a PPRV_SLOUPCE. ( Proto bych chtěl předem vymezit
celý prostor pole a ne jednotlivě přidávat řádky ) Toto pole bych
chtěl inicializovat (alokovat prostor) v konstruktoru třídy. Průběh
Inicializace si představuji následovně. Nejprve by se měli naalokovat řádky.
Takze nejak takhle pprv(PPRV_RADKY) a potom ve for cyklu by se
alokovali sloupce. for(int i = 0; (int) i < pprv.size(); i++)
pprv[i] = vector < pair <Node *, bool> >(PPRV_SLOUPCE, pair<NULL, true>);
Přičemž hodnota každé dvojice pole by byla NULL a true.
Snažil sem se to vygooglit ale nenašel sem nic použitelného. Buď
sem hledal špatně a nebo to nejde. Budu rád za jakýkoliv příspěvek,
případně pokud by to někdo věděl a mohl uvést příklad bylo by to
uplně super !

Předem díky všem.

#include <vector>

#define PPRV_RADKY 20
#define PPRV_SLOUPCE 6

using std::vector;
using std::pair;

class Oblasti
{
vector < vector < pair <Node *, bool> > > pprv;
public:
Oblasti() {
// !!!sem doplnit kod inicializace pole pprv !!!
}
~Oblasti();
};

Laďas
C / C++ › básnička
28. 2. 2009   #96239

Nevíte někdo náhodou jak může fungovat tento kód ?

/* Basnicka */

#include <stdio.h>

int main(int t, int _, char *a)
{
return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)):
1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý