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

Zelený je lopuch,
fotbal to je hra...

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: ytdxvdx
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
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.
davpe Davpe 26.3.2009 15:24  745
aha, tak to je pro me novinka, takze me tohle chovani dost zaskocilo :) funguje to, diky moc! :)

jinak o tom, ze je to stejne vim, ale uz jsem byl trochu zoufaly, tak jsem zkousel vsechno mozne :D
huh huh 26.3.2009 01:18  744
Davpe [743]: To je jednoduchý, newA ve funkci add se alokuje na zásobníku, po ukončení této funkce se tato pamět na zásobník vrátí a někdy během prvního volání printf se znovu použije.

Řešení: pamět alokovat v haldě:
void add (A **array) {
A* newA = malloc(sizeof(A));
newA->structB.value = 12345;
array[1] = newA;
}


BTW add(&*pointers); je úplně to samý jako add(pointers);

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

(c) 2001-2011 Lopuch.cz   
Kontakt