Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Nudou jsi opuch?
Navštiv Lopuch!

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: pzwsdkp
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
sekory Sekory The journey of thousand miles - starts with a single step. 5.4.2009 14:57  761
Já to naštěstí nijak nepotřeboval, jen mě prostě napadlo, že místo abych předával fci proměnou navíc, která mi udává velikost pole, tak použiju sizeof. Nicméně mi nedošlo jak to přesně funguje, což mi huh osvětlil. Myslim si ale, že je pro mě asi nejlepší předat o proměnou víc, než se pouštět do věcí co popisuje Bredy (i kdybych chtěl použít C++), navíc kdoví, jestli to nakonec není třeba pomalejší...
huh huh 5.4.2009 13:16  760
Ale jo, je to šikovný, akorát já v C++ moc klasický pole nepoužívám a v C to bohužel nejde :-)
bredy 5.4.2009 13:10  759
huhJasně, tady nešlo ani tak o použitou technologii, jako o to, že to opravdu "někdy" jde. Jen už jsem si nepamatoval ten zápis, musel jsem se podívat. Uvedený postup používám hlavně k implementaci funkce countof, což je podobné jak sizeof, s tím, že vrací počet prvků pole, nikoliv jeho velikost v bajtech.

for (int i = 0; i < countof(arr); i++) {
   int x = arr[i];
   ...
}
huh huh 5.4.2009 13:04  758
No jo, když použiješ referenci, tak je to něco úplně jinýho.
bredy 5.4.2009 12:45  757
huhNejlepší je praktická ukázka... Jen pravdou je, že můj příklad není úplně korektní, takže to opravíme:

#include <stdio.h>

template<int n>
void foo(int (&arr)[n]) {
	int sz = sizeof(arr);
	printf("size: %d\n",sz);
}

int main(int c, char **v) {
	int a[40];
	foo(a);
}

A výsledek?
ondra@linda:/tmp$ g++ test.cpp -o test
ondra@linda:/tmp$ ./test
size: 160
ondra@linda:/tmp$
huh huh 4.4.2009 21:06  756
Ve skutečnosti můžeš v C (c99) napsat:
void fce(int n, int pole[n])
ale nic ti to nepomůže, sizeof(pole) bude furt sizeof(int*)
huh huh 4.4.2009 21:03  755
Bredy [754]: Nemať Sekoryho. int pole[40] je to samy co int pole[], to samy co int* pole, takze ti to stejne vrati sizeof(int*).
bredy 4.4.2009 20:49  754
template<int n>
void fce(int pole[n]) {
  int a;
  a = sizeof(pole);
}


ale to uz je vyšší dívčí, navíc C++.
sekory Sekory The journey of thousand miles - starts with a single step. 4.4.2009 20:19  752
huh: Aha, to smysl dává, to mě nenapadlo, dík.
huh huh 4.4.2009 20:16  751
Sekory [750]: int pole[] v deklaraci parametrů funkce je úplně to samé, co int* pole. Dokonce i int pole[40] v deklaraci parametrů funkce je úplně to samé, co int* pole. Nezapomeň, že sizeof se vyhodnocuje v době překladu, ne za běhu. A pole v C ani svou velikost nezná.
sekory Sekory The journey of thousand miles - starts with a single step. 4.4.2009 19:58  750
CTo je divný... Proč mi funkce sizeof() vrací u pole jeho velikost, ale když to pak použiju u jiné funkce, kde pole není deklarované hází mi to velikost proměnné

void fce(int pole[]);

void main(){
int i, pole[10];
i = sizeof(pole) //i=40
fce(pole);
....
}

void fce(int pole[]){
int a;
a=sizeof(pole); //zde už má hodnotu jen 4!
}

Nechápu...
bredy 29.3.2009 20:40  749
mptsPodobnou filozofii mají někteří programátoři linuxu. Bohužel :-(

Jeden příklad za všechny... xorg.
mpts mpts Je to jinak, ba přesně naopak! 29.3.2009 17:10  748
Bredy [746]: Proč, však ona se při restartu uklidí sama... ;-))
davpe Davpe 27.3.2009 00:18  747
Bredy: jasne, neboj ;)
bredy 26.3.2009 16:22  746
DavpeNezapoměň pak paměť uklidit.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt