Skocz do zawartości

Obliczanie rozmiaru tablicy na podstawie wskaźnika do niej


_LM_

Pomocna odpowiedź

Mam dwie tablice char:

char t1[100];
char t2[2048];

oraz wskaźnik który zależnie od potrzeb wskazuje na t1 lub t2

char * ptr;
ptr = t1;

czy jest możliwość aby za pomocą sizeof pobrać rozmiar tablicy na którą aktualnie ustawiony jest wskaźnik?

Edytowano przez _LM_
Link do komentarza
Share on other sites

A nie możesz po prostu sprawdzać adresów?

#include <stdio.h>

#define SIZE_1 100
#define SIZE_2 2048

char t1[SIZE_1];
char t2[SIZE_2];

char* pointer = t1;

int get_size()
{
	if(pointer == t1) return SIZE_1;
  	if(pointer == t2) return SIZE_2;
  	return 0;
}

void main()
{
	printf("%d\n", get_size());
  	pointer = t2;
  	printf("%d\n", get_size());
}

 

  • Lubię! 2
Link do komentarza
Share on other sites

Zamiast delfine lepiej użyć sizeof(tab) /szeof(tab[0]); także tak mam zamiar zrobić jak piszesz. Bo poza wskaźnikiem na tablicę (bufor) dodatkowo jest przypisywany wskaźnik na funkcję która ten bufor obsługuje. Więc dodanie trzeciego parametru - rozmiaru, nie stanowi problemu aczkolwiek nie bardzo mi się podoba 😉

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

8 minut temu, _LM_ napisał:

Zamiast delfine lepiej użyć sizeof(tab) /szeof(tab[0]); także tak mam zamiar zrobić jak piszesz. Bo poza wskaźnikiem na tablicę (bufor) dodatkowo jest przypisywany wskaźnik na funkcję która ten bufor obsługuje. Więc dodanie trzeciego parametru - rozmiaru, nie stanowi problemu aczkolwiek nie bardzo mi się podoba 😉

Bym polemizował. Policz sobie koszt operacyjny Twojej i mojej wersji 😉 Twoja będzie kilka razy wolniejsza per wykonanie (zależy od jednostki obliczeniowej).

Link do komentarza
Share on other sites

@H1M4W4R1, o jakim koszcie operacyjnym mówisz? sizeof będzie wyliczony na etapie kompilacji jeżeli rozmiar obiektu jest znany na etapie kompilacji. Dla VLA sizeof() jest ewaluowany na etapie wykonania. Dla mnie zawsze lepiej użyć sizeof niż define na sztywno. Podane przez @_LM_ sizeof(tab) / sizeof(tab[0]) mam zawsze pod ręką jako makro

#define NELEMS(a) (sizeof(a) / sizeof(a[0]))

Lepiej w ten sposób uniezależnić się od zmiany typu w tablicy jeżeli interesuje nas tylko ilość elementów, a nie rozmiar.

@_LM_ Jak w zależności "od czegoś" będziesz zmieniał kilka parametrów (wskaźnik na dane, ich rozmiar i jakaś funkcja) to proponuję ubrać sobie ten zestaw danych w strukturę i może nawet typedef na strukturę z jakąś sensowną nazwą. Z jakiegoś powodu te dane są powiązane ze sobą logicznie wiec w kodzie też łatwiej będzie je upilnować zamknięte w jedną strukturę. Nie musisz pamiętać, żeby w zależności "od czegoś" podmieniać kilka różnych parametrów tylko podmienisz całą strukturę.

EDIT:

Standard C11, 6.5.3.4 2

Cytat

The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.

 

Edytowano przez Hubert.M
  • Lubię! 1
Link do komentarza
Share on other sites

54 minuty temu, Hubert.M napisał:

Jak w zależności "od czegoś" będziesz zmieniał kilka parametrów (wskaźnik na dane, ich rozmiar i jakaś funkcja) to proponuję ubrać sobie ten zestaw danych w strukturę i może nawet typedef na strukturę z jakąś sensowną nazwą. Z jakiegoś powodu te dane są powiązane ze sobą logicznie wiec w kodzie też łatwiej będzie je upilnować zamknięte w jedną strukturę. Nie musisz pamiętać, żeby w zależności "od czegoś" podmieniać kilka różnych parametrów tylko podmienisz całą strukturę.

Przeważnie tak robię przy bardziej skomplikowanych funkcjach, łącznie z tablicowaniem typów wskaźnikowych. Trzeba się trochę nakombinować na początku ale potem praca z takim kodem to czysta przyjemność. 

Link do komentarza
Share on other sites

[sarkazm] C11? Co ty robisz na tych studiach... Przecież góra to najwyżej C98 można używać studencie jeden, a jak się nie podoba to pisz w ASM [/sarkazm]

Jak człowiek jest po kilku piwach to czytać ze zrozumieniem nie umiem, myślałem, że chodzi o podstawienie w kodzie, a widziałem kiedyś kompilator (dość dawno temu), który nie wykonywał dzielenia po sizeof'ach, więc miałeś gratisowe dzielenie od sponsora, ale przecież mikrokontrolery tak szybko dzielą... To Twoim zdaniem jako programisty jest przewidzenie, że kompilator może nie przeliczyć tej operacji, przez co masz nadmiarową operację, co przekłada się na znaczny spadek wydajności.

Poza tym jaki jest sens używania sizeof w define, jak i tak zgodnie z zasadami programowania (no tak, na studiach uczą, że hardcode nie jest zły...) rozmiar tablicy powinien być osobnym define'm, a rozmiar elementu nie ma wpływu, bo i tak zwracasz wartość na bazie porównania wskaźników kompletnie nie wchodząc do tablicy. Taki kod jest po pierwsze krótszy, po drugie mniejsza w nim szansa na zrobienie błędu.

Edytowano przez H1M4W4R1
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Ja zwykłym hobbystom jestem, nawet studiów w tym kierunku nie mam. Inaczej mówiąc jestem prostym "programistą" widzę tablice używam sizeof 🙂

EDIT 

Używam sizeof z prostego powodu: jeśli zmienię rozmiar tablicy nie muszę pamiętać o zmianie parametru w #define

Edytowano przez _LM_
Link do komentarza
Share on other sites

14 godzin temu, _LM_ napisał:

Używam sizeof z prostego powodu: jeśli zmienię rozmiar tablicy nie muszę pamiętać o zmianie parametru w #define

Nie rozumiem tej pokrętnej logiki... przecież wartość define zwracanego przez funkcję get_size jest użyta w definicji tablicy jako jej rozmiar, więc zmieniając rozmiar tablicy automatycznie zaktualizuje się on także dla get_size... 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.