Dziwny problem z kodem w C (gcc mips/pic32)

May 17, 2023 Last reply: 3 years ago 169 Replies

Ludzi czytających ten wątek kosztowało 10 sekund pozbycie się złego nazywku liczenia długości przez sizeof.

I to w zupełności wystarcza, aby wykonać jeden krok do przodu. natępne przyjdą same, jako że ten pierwszy był najtrudniejszy.

Te podstawy mieszczą się na 1 stronie dokumentacji, a w zasadzie mieszczą się w 10 linijkach exampla na końcu. Nie trzeba wiedzieć, jak to działa aby z tego korzystać. To zabawne, ale w zasadzie wiele elementów w C++ jest znacznie łatwiejszych w użyciu, niż ręczne dziobanie w C, a efekt ten sam.

Nie.

Chodzi o to, aby używać ułatwień. W C i C++.

Nie ma absolutnie wymogu używania C++ w sensie klas, new/delete, templates. Nie musisz nawet wiedzieć, że to jest w C++. Używasz tego, czego potrzebujesz, jak st::size albo RIIA. I nie ma problemu.

Do tego jest sizeof.

Dla rozmairu w *elementach* jest std::size()

W examplu z błedem programista chciał poznać rozmiar tablicy w elementach, nie bajtach.

Użył workaroundu i jak to z workaroundami bywa, pomylił się.

Jeśli piszesz w C++ prawidłowo, ilość użyć sizeof jest znikoma i dotyczy głównie kodu pracujacego na poziomie allokatorów czy sprzętu. Normalny, algorytmiczny, kod prawie nigdy nie wymaga wiedzy o rozmiarach czegośtam w bajtach.

No, czyli, służą do czego innego, więc jedno nie jest workaroudem na brak drugiego.

JDX snipped-for-privacy@onet.pl napisał(a):

Jest, bo na tym polega workaround, że używasz czegoś nieprzeznaczonego do danego celu. sizeof() nie służy do zwracania liczby elementów ale czasem może dać poprawny wynik (dla typu jednobajtowego). Przy typie wielobajtowym trzeba podzielić przez sizeof(typ_wielobajtowy). Można też w ogóle nie używać sizeof() ale mieć stałą definiującą rozmiar i używać jej zarówno do deklaracji tablicy jak i do dostępu do tej tablicy. Szczególnie przydatne jak ta tablica jest potem gdzieś przekazywana i ktoś przez roztargnienie mógłby zrobić sizeof() na wskaźniku i dostać (zwykle) 4 lub 8 zależnie od architektury zamiast rozmiaru tablicy.

Jak nie ma wymogu, to po co zmieniać kompilator? No i kwestia zasadnicza. Wiem, że w C nie ma tego, czego potrzebuję. Aby dowiedzieć się, czy w C++, a w zasadzie w STL , jest to, czego potrzebuję, to muszę poświęcić czas. Nie twierdzę, że nie warto przejść z C na C++. Twierdzę, że nie jest to ani za darmo ani przynajmniej jakoś specjalnie tanie. Trochę czasu na czytanie i ćwiczenia praktyczne z kompilatorem trzeba zainwestować…

BTW. AFAIR w C, korzystając z rozszerzeń gcc, również można wykorzystywać RIIA. :-)

Tablice moze i osobne, ale jak przekroczysz rozmiar BT, to trafi nie wiadomo gdzie.

Ale potem takie krzaczki jak powyzej wychodzą :-)

J.

Aby dostać darmowe udogodnienia.

Z tych samych przyczyn jak legacy programmers lat temu 40 zmieniali asembler na C.

Też dało sie wszystko w asm napisać. A jednak zmienili. Dziwne, nie?

Tak. Zmienić kompilator na g++. Zazwyczja to wszystko, czasami kilka detali więcej jeśli piszesz coś wyjątkowo dziwacznego (np. wyłaczenie wsparcia wyjątków itp).

Nic nie kosztuje, w większości wypadków. Jeśli przejście coś kosztuje, to znaczy że masz jakiś niezły fuckup w C. Tak, są bardzo interesujące projekty, które w C++ się nie kompilują, a właściciele będą bronić tego guano jak niepodległości. Miałem do czynienia kilka razy. To stan umysłu.

Nikt nie broni, tylko po co w C?

Eee tam czepiasz się, nazwijmy to translator który tłumaczył mnemoniki i liczył adresy, teraz lepiej?

Ale przecież po to używa funkcję czy co to tam jest żeby mu policzyło długość tablicy, na palcach jej nie liczył, a że funkcja skopana to wychodzą kwiatki.

Spokojnie ty też będziesz miał kiedyś tyle, zobaczy jak ci sie wtedy optyka zmieni.

W zwykłym C na przekazanej tablicy w ogole juz nie mozna ustalic rozmiaru.

Jak rozmiar zmienny, to trzeba go jawnie przekazywać, jak stały, to mozna coz z typami kombinować.

A sizeof to nawet nie funkcja, tylko operator i to "czasu kompilacji"

- kompilator ustala ile wynosi wartosc.

P.S. Nie ma jakis cudów związanych z rozmieszczeniem danych? Chodzi mi po głowie, ze MIPS lubil na granicy słów 32-bit, wiec np sruktura {int, char} może i ma 5 bajtów, ale w tablicy takie struktury byłyby rozmieszczone co 8 ...

J.

Padding.

formatting link
formatting link

No ale widzisz - źle policzył, przekroczyl zakres, a C NIE MA ZABEZPIECZEN.

I w miare dobrze, ze nie ma.

A funkcja dobra, tylko źle użyta.

Trzeba umiec powiedzieć "dość" :-)

A tu jeszcze co chwila cos nowego wymyślaja i zaskakują człowieka na stare lata ... i to w szczegółach, bo w ogółach to za tym postępem trudno nadążyć :-(

J.

Przez dostarczenie ogromnej ilości biblitek napisanych w C++.

Pierwsza od reki:

formatting link

On czy funkcja?

To wiadomo, po to użył funkcję.

No nie, jest skopana skoro działa wybiórczo. A Ty wiedziałeś przed tym wątkiem że taki problem istnieje?

I wtedy już można się kłaść do trumny. Można zwolnić ale zatrzymanie jest uziemiające już na stałe. Ale ja wciąż czuję się młodo, mam wszystkie włosy i nawet jeszcze nie całkiem siwe więc nadal daję rady, oczywiście w swoim tempie a nie w takim jak otoczenie ode mnie oczekuje.

Ja akurat jestem 'techniczny' więc w miarę nadążam. Ostatnio zamiast W7 bo mnie wkurzał zainstalowałem Ubuntu 22 LTS, a W7 postawiłem na wirtualce po to żeby odpalić na nim Avr Studio 7 i Kicada

5 i coś tam jeszcze chodzące na windzie.

On.

Jaki problem? że sizeof zwraca, a własciwie to podaje, rozmiar w bajtach, to wiem.

że można zajechac obszar innej zmiennej w C, i nic przed tym nie ostrzeże - to też wiem.

Markowi pogratulować, ze tak szybko namierzył miejsce problemu.

A wiesz, ze juz jest W11 ? :-)

J.

On 5/19/23 11:21, Janusz wrote: [...]

Kompletnie OT, ale zżera mnie ciekawość: Dlaczego używasz Win do odpalania KiCada, skoro ładnie działa na linuksie?

Jacek

W dniu 19.05.2023 o 17:35, J.F pisze:

No to podaje prawidłowy rozmiar czy nie?

Ale jakim prawem, w tej konstrukcji nie powinno do tego dojść, przecież po to 'pytał' o długość tablicy aby nie przekroczyć zakresu. Skoro przekracza to oznacza że funkcja jest zła. Koniec kropka.

No i co z tego?Obaj moi synowie go mają a ja nie chcę.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required