C: velkost pola, na ktore ukazuje pointer

C,C++,C#

Moderátori: psichac, Moderátori

OM0XA
Stály člen
Stály člen
Príspevky: 235
Dátum registrácie: 03 Okt 2012, 23:18
Bydlisko: Poprad

C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa OM0XA » 26 Apr 2017, 12:17

Ahoj

potrebujem zistit velkost pola definovaneho staticky.

Kód: Vybrať všetko

  const unsigned char Arial5x8[] = {
        0x02, 0x00, 0x80, 0x00, 0x00, 0x00,      // Code for char .
        0x03, 0xC0, 0x3C, 0x03, 0x00, 0x00,      // Code for char /
        0x05, 0x7E, 0x81, 0x81, 0x81, 0x7E,      // Code for char 0
        0x03, 0x04, 0x02, 0xFF, 0x00, 0x00,      // Code for char 1
        0x05, 0x82, 0xC1, 0xA1, 0x91, 0x8E,      // Code for char 2
        0x05, 0x42, 0x81, 0x89, 0x89, 0x76,      // Code for char 3
        0x05, 0x30, 0x2C, 0x22, 0xFF, 0x20,      // Code for char 4
        0x05, 0x4C, 0x8B, 0x89, 0x89, 0x71,      // Code for char 5
        0x05, 0x7E, 0x89, 0x89, 0x89, 0x72,      // Code for char 6
        0x05, 0x01, 0xE1, 0x19, 0x07, 0x01,      // Code for char 7
        0x05, 0x76, 0x89, 0x89, 0x89, 0x76,      // Code for char 8
        0x05, 0x4E, 0x91, 0x91, 0x91, 0x7E,      // Code for char 9
        0x01, 0x84, 0x00, 0x00, 0x00, 0x00       // Code for char :
        };
  
Mam makro, ktore vypocita velkost pola:

Kód: Vybrať všetko

 #define N_ELEMENTS(array) (sizeof(array)/sizeof(array[0])) 
Zatial vsetko OK. Teraz urobim pointer na pole:

Kód: Vybrať všetko

  const unsigned char *znaky=Arial5x8;
    
A toto uz nefunguje:

Kód: Vybrať všetko

pocet_znakov = ( sizeof(*znaky) / sizeof(znaky[0]) ) ;
sizeof(*znaky) dava velkost 1, cize velkost char a nie velkost celeho pola.
Samozrejme sizeof(znaky) dava velkost pointera, co je OK, ale nie to co potrebujem.
Pripada mi to, ze sizeof(*znaky) berie ako sizeof( znaky[0] ), cize sizeof( *(znaky+0) ).


Aj Herout v knihe toto popisuje, ze by to malo fungovat.
Ma niekto napad? Dakujem.
0

Používateľov profilový obrázok
roboulbricht
Stály člen
Stály člen
Príspevky: 156
Dátum registrácie: 07 Jan 2015, 12:01
Bydlisko: Banská Bystrica
Vek: 54
Kontaktovať používateľa:

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa roboulbricht » 26 Apr 2017, 14:20

V žiadnom z bežne používaných kompilátorov nedostaneš iný výsledok ako 1. Z pointra sa nedá zistiť veľkosť poľa, na ktorý ukazuje. Preto aj všade vidíš pri predávaní poľa pomocou pointra do funkcie dva parametre. Prvý je pointer a druhý veľkosť poľa. Jediná výnimka sa vyskytuje pri poli znakov, ale tam je to zistiteľné len vďaka tomu, že je za posledným znakom ešte nula a funkcie na spracovanie textových reťazcov o tom vedia.
0

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 982
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa budvar10 » 26 Apr 2017, 14:58

sizeof je makro, ktoré je vyhodnotené už počas kompilácie, čiže nemôže vrátiť veľkosť dynamicky alokovaného alebo externého poľa.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa peterple » 26 Apr 2017, 17:53

OM0XA napísal: Pripada mi to, ze sizeof(*znaky) berie ako sizeof( znaky[0] ), cize sizeof( *(znaky+0) ).
To tak je lebo

Kód: Vybrať všetko

znaky je presne to isté ako &znaky[0]
Treba si uvedomiť že pole v C nie je objekt, Ale len ukazateľ na nejaký kus pamäte.
Vizualizácia napríklad tu.
https://www.programiz.com/c-programming ... ers-arrays

Preto sa ani nedá kontrolovať index poľa a ľahko sa dá pomocou dobrého indexu dostať hocikam do pamäte. Až Java a im podobný urobili z poľa objekt a to už je iná pesnička.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martin knocik
Ultimate člen
Ultimate člen
Príspevky: 1639
Dátum registrácie: 23 Jan 2008, 00:00
Bydlisko: Trenčianska Turná
Vek: 33
Kontaktovať používateľa:

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa martin knocik » 26 Apr 2017, 18:17

Ak nutne potrebujes dynamicke pole a nutne potrebujes zitovat jeho velkost, tak by som mozno pouvazoval o pouzitii c++ jazyka a vektorov. Udajne existuju c kniznice ktore prinasaju c++ vektory do c jazyka
0
http://mkbci.com

FEL UNIZA 2015, Ing.

ľudstvo je vírus ktorý napadol Zem

nerobme si ťažkú hlavu z debilov čo nám ani po členky nesiahajú, buďme radi že my dačo dokážeme a smejme sa im akí sú sprostí

aditya12
Okoloidúci
Okoloidúci
Príspevky: 1
Dátum registrácie: 29 Dec 2018, 17:42

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa aditya12 » 29 Dec 2018, 17:43

https://welookups.com/C++/default.html

-- Spojený príspevok 29 Dec 2018, 18:44 --

https://www.javacodegeeks.com
0

zofrem
Nový člen
Nový člen
Príspevky: 50
Dátum registrácie: 13 Feb 2008, 00:00
Bydlisko: Lipt. Mikuláš
Vek: 35

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa zofrem » 04 Jan 2019, 11:11

Pre staticky definované pole nedáva zmysel(a ani nejde) vracať jeho veľkosť, tú by mal poznať programátor čo ho vytváral. Alebo ak sa jeho veľkosť definovala premenou za behu programu, tak potrebuješ hodnotu tejto premennej. V C++ by si mohol použiť std::array tam to pôjde. To by však vyžadovalo prejsť od zastaralej akademickej knižky od Herouta k Bjarne Stroustrupovi.
0
ALMA MATER Elektro Fakulta UNIZA

Dumitru
Stály člen
Stály člen
Príspevky: 370
Dátum registrácie: 06 Nov 2011, 22:19
Vek: 32

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa Dumitru » 04 Jan 2019, 17:13

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const unsigned char Arial5x8[] = {
        0x02, 0x00, 0x80, 0x00, 0x00, 0x00,      // Code for char .
        0x03, 0xC0, 0x3C, 0x03, 0x00, 0x00,      // Code for char /
        0x05, 0x7E, 0x81, 0x81, 0x81, 0x7E,      // Code for char 0
        0x03, 0x04, 0x02, 0xFF, 0x00, 0x00,      // Code for char 1
        0x05, 0x82, 0xC1, 0xA1, 0x91, 0x8E,      // Code for char 2
        0x05, 0x42, 0x81, 0x89, 0x89, 0x76,      // Code for char 3
        0x05, 0x30, 0x2C, 0x22, 0xFF, 0x20,      // Code for char 4
        0x05, 0x4C, 0x8B, 0x89, 0x89, 0x71,      // Code for char 5
        0x05, 0x7E, 0x89, 0x89, 0x89, 0x72,      // Code for char 6
        0x05, 0x01, 0xE1, 0x19, 0x07, 0x01,      // Code for char 7
        0x05, 0x76, 0x89, 0x89, 0x89, 0x76,      // Code for char 8
        0x05, 0x4E, 0x91, 0x91, 0x91, 0x7E,      // Code for char 9
        0x01, 0x84, 0x00, 0x00, 0x00, 0x00       // Code for char :
        };

    printf("%d",sizeof(Arial5x8)/sizeof(char));
    return 0;
}

Veľkosť poľa je 78, už si to len niekam uložiť a použivať to, cez pointer si to treba vymyslieť ukončovacie poradie znakov pripadne znaku alebo číslo čokoľvek len aby si vedel že je koniec, a len čítať s polia kým nenájdeme koniec , pre char znaky je to '/0'.
napríklad takto:

Kód: Vybrať všetko

#define NUL    ....
while (*(data) != NUL) {

    *(data++) // inkrementovanie adresy o 1

}
Prílohy
123.PNG
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: C: velkost pola, na ktore ukazuje pointer

Príspevok od používateľa Tribec Zacks » 04 Jan 2019, 19:26

Mozes pouzit trochu pointer aritmetiky pre najdenie velkosti pola:
int n = *(&Arial5x8 + 1) - Arial5x8 ;

&pole + 1 ukazuje na adresu za polom, minus adresa zaciatku pola ti da jeho velkost, tento pristup ale tiez nebude fungovat ak si chces vytvorit funkciu podobnu sizeof a pastnut jej pointer na pole. hadam aspon trochu pomoze.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok