_LM_ Napisano Lipiec 11, 2021 Udostępnij Napisano Lipiec 11, 2021 (edytowany) 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 Lipiec 11, 2021 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 11, 2021 Autor tematu Udostępnij Lipiec 11, 2021 Pogrzebałem trochę za tym i wynika że się nieda 😕 https://www.elektroda.pl/rtvforum/topic2911896.html https://4programmers.net/Forum/Newbie/178575-rozmiar_tablicy_ No nic trzeba będzie dodać dodatkowy parametr do funkcji 1 Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Lipiec 11, 2021 Udostępnij Lipiec 11, 2021 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()); } 2 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Lipiec 11, 2021 Autor tematu Udostępnij Lipiec 11, 2021 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 😉 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
H1M4W4R1 Lipiec 11, 2021 Udostępnij Lipiec 11, 2021 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). Cytuj Link do komentarza Share on other sites More sharing options...
Hubert.M Wrzesień 27, 2021 Udostępnij Wrzesień 27, 2021 (edytowany) @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 Wrzesień 27, 2021 przez Hubert.M 1 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Wrzesień 27, 2021 Autor tematu Udostępnij Wrzesień 27, 2021 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ść. Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Wrzesień 27, 2021 Udostępnij Wrzesień 27, 2021 (edytowany) [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 Wrzesień 27, 2021 przez H1M4W4R1 1 Cytuj Link do komentarza Share on other sites More sharing options...
_LM_ Wrzesień 27, 2021 Autor tematu Udostępnij Wrzesień 27, 2021 (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 Wrzesień 27, 2021 przez _LM_ Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Wrzesień 28, 2021 Udostępnij Wrzesień 28, 2021 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... Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!