Funkce na velikost pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Funkce na velikost pole – C / C++ – Fórum – Programujte.comFunkce na velikost pole – C / C++ – Fórum – Programujte.com

 

Porcepoque0
Newbie
23. 9. 2012   #1
-
0
-

Dobrý den,
pokud mám funkci na zjištění délky pole s argumentem typu pole, nevrací délku pole,
ale velikost ukazatele / velikost typu T.

template <typename T>
int GetArrayLength(T[] arr)
{
  return (sizeof(arr)/sizeof(T));
}

/.../

int main()
{
  int x[5]={1,2,3,4,5};
  int length= GetArrayLength(x); //nevrátí 5, ale 1
}

Můžu nějak pomocí funkce zjistit délku pole?

dík.

Nahlásit jako SPAM
IP: 88.102.98.–
ondra.holub+1
Stálý člen
23. 9. 2012   #2
-
0
-

   

size_t length = sizeof(x) / sizeof(x[0]);

Když už by to muselo být tou šablonou (jakože mě nenapadá důvod proč), tak by to šlo třeba takto:

template <typename T, size_t L>
int GetArrayLength(T[L] arr)
{
  return L;
}
Nahlásit jako SPAM
IP: 212.96.189.–
yaqwsx+9
Posthunter
23. 9. 2012   #3
-
0
-

Je to zcela normální chování - najdi si referenci sizeof() - jakmile jej použiješ na pole předané funkci (tzn. stal se z něj "obyčejný pointer"), tak sizeof vrátí velikost pointeru.

Řešení je je jednoduché - vykašlat se na pole a použít nějaký kontejner ;)

Nahlásit jako SPAM
IP: 85.160.44.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
vitamin+8
Grafoman
23. 9. 2012   #4
-
0
-
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Porcepoque0
Newbie
26. 9. 2012   #5
-
0
-

Zkoušel jsem ve své třídě udělat toto: 

void operator=(T arr[])
   {
    int _length=0;
    for(T &var : arr)
    { 
     _length++;
    }

    if(length>0)delete[] Item;
    Item = new T[_length];
    for(int i=0;i<_length;i++)
    {
     this->Item[i]=arr[i];
    }
    length=_length;
   }

Toto je něco jako foreach v c++ (aspoň myslim).
Pokud takto pracuju přímo s polem (ne s argumentem typu pole), tak to funguje.
Funkce výše napsaná při použití vyvolá tyto chyby:

error C3312: no callable 'begin' function found for type 'int []'
error C3312: no callable 'end' function found for type 'int []'

Prosím, napiště možná řešení.
Díky.
 

Nahlásit jako SPAM
IP: 88.102.98.–
vitamin+8
Grafoman
26. 9. 2012   #6
-
0
-

#5 Porcepoque
Aby fungoval foreach v c++ tak musí pre kontainerový typ fungovať std::begin() a std::end(). Pozri si hlavne 3 verziu funkcií, uvidíš že polia musia mať známu veľkosť pri preklade.

edit: Vyriešiť to môžeš zabalením poľa do triedy pre ktorú definuješ metódy begin() a end(). Je to ale zbytočné keď tu máme stl a std::array. Načo to programovať odznovu keď to dakto spravil za teba? :)  Ak budeš polia alokovať dynamicky, tak zas použi std::vector .

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

Podobná vlákna

Velikost pole — založil fnenks

Náhodná velikost pole — založil Jan

Velikost pole struktur — založil Redby

Funkce 2d pole nefunguje — založil TiTanerCZE

Moderátoři diskuze

 

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