Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • C: velkost pola, na ktore ukazuje pointer

C: velkost pola, na ktore ukazuje pointer

C,C++,C#

Moderátori: psichac, Moderátori

C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod 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.
OM0XA
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 235
Zalo┼żen├Ż: 03.10.2012
Bydlisko: Poprad
Karma: 2

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod 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.
roboulbricht
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 142
Vek: 49.89
Zalo┼żen├Ż: 07.01.2015
Bydlisko: Banská Bystrica
Karma: 5

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod 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.
budvar10
Obr├ízok pou┼ż├şvate─ża
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 439
Zalo┼żen├Ż: 15.12.2014
Bydlisko: Košice
Karma: 7

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod 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/c-pointers-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.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1916
Vek: 52.89
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 52

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod 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
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├ş
martin knocik
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1512
Vek: 28.65
Zalo┼żen├Ż: 23.01.2008
Bydlisko: Tren─Źianska Turn├í
Karma: 7

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod aditya12 » 29 Dec 2018, 18:43

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

-- Spojen├Ż pr├şspevok 29 Dec 2018, 18:44 --

https://www.javacodegeeks.com
aditya12
Okoloid├║ci
Okoloid├║ci
Pr├şspevky: 1
Zalo┼żen├Ż: 29.12.2018
Karma: 0

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod zofrem » 04 Jan 2019, 12: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.
ALMA MATER Elektro Fakulta UNIZA
zofrem
Obr├ízok pou┼ż├şvate─ża
Nov├Ż ─Źlen
Nov├Ż ─Źlen
Pr├şspevky: 50
Vek: 31.15
Zalo┼żen├Ż: 13.02.2008
Bydlisko: Lipt. Mikuláš
Karma: 0

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod Dumitru » 04 Jan 2019, 18: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
Dumitru
St├íly ─Źlen
St├íly ─Źlen
Pr├şspevky: 331
Zalo┼żen├Ż: 06.11.2011
Karma: 0

Re: C: velkost pola, na ktore ukazuje pointer

Odosla┼ąod Tribec Zacks » 04 Jan 2019, 20: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.
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.
Tribec Zacks
Obr├ízok pou┼ż├şvate─ża
Pokro─Źil├Ż ─Źlen
Pokro─Źil├Ż ─Źlen
Pr├şspevky: 628
Vek: 37.15
Zalo┼żen├Ż: 26.06.2010
Bydlisko: Levice / Cork IRL
Karma: 21


Nasp├Ą┼ą na C,C++,C#

Kto je pr├ştomn├Ż

U┼ż├şvatelia prezeraj├║ci si toto f├│rum: ┼Żiadny registrovan├Ż pou┼ż├şvate─ż a 0 host├ş.

Forums ©
Autor str├ínky je Ondrej Z├ívodsk├Ż(zawin), o graficky design sa star├í ─Żubo┼í Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
─îas potrebn├Ż k spracovaniu str├ínky 0.42 sek├║nd