RTV forum PL | NewsGroups PL

Różnice w znakach wskaźników w definicji funkcji w C/C++ - które wybrać?

Pytanko dotyczące C/C++

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Różnice w znakach wskaźników w definicji funkcji w C/C++ - które wybrać?

Goto page 1, 2, 3, 4  Next

Guest

Thu Aug 04, 2016 8:09 am   



Może trochę NTG, ale chyba prędzej tutaj uzyskam konkretną odpowiedź, niż na grupie "BOGÓW" od C/C++. Jak wiecie, mam trochę wstręta do C, ale nie w tym rzecz. Prośba: Napiszcie mi w kilku "żołnierskich" słowach jaka jest różnica/jak to interpretować:

1) void Jakaś_Tam_Funkcja(int* Jakaś_Tam_Zmienna);
2) void Jakaś_Tam_Funkcja(int *Jakaś_Tam_Zmienna);
3) void Jakaś_Tam_Funkcja(int * Jakaś_Tam_Zmienna);

============
Tematy softwarowe zlecam fachowcom, ale muszę(ino z ciekawości) rozgryźć pewne źródło programistyczne, które z pewnych powodów muszę zaimplementować (już zrobione) na sztywno w hardware. Na 100% da się wiedząc od strony matematycznej w czym rzecz. Skoro się da, skoro jest znany model matematyczny, no to kurka wódka po cholerę mi soft i uC/uP (w tej konkretnej aplikacji, uC/uP to bardzo pożyteczne stworzenia w wielu sytuacjach),trochę posiedziałem nad projektem i jest OK.

A pytanie/o co marudzę? Ot z czystej ciekawości...

To chyba jest "elementarz" C, ale pytanie zupełnie serio, nie robię sobie tutaj jaj !!

Mateusz Viste
Guest

Thu Aug 04, 2016 8:09 am   



On 04/08/2016 08:09, stchebel@gmail.com wrote:
Quote:
Może trochę NTG, ale chyba prędzej tutaj uzyskam konkretną odpowiedź, niż na grupie "BOGÓW" od C/C++. Jak wiecie, mam trochę wstręta do C, ale nie w tym rzecz. Prośba: Napiszcie mi w kilku "żołnierskich" słowach jaka jest różnica/jak to interpretować:

1) void Jakaś_Tam_Funkcja(int* Jakaś_Tam_Zmienna);
2) void Jakaś_Tam_Funkcja(int *Jakaś_Tam_Zmienna);
3) void Jakaś_Tam_Funkcja(int * Jakaś_Tam_Zmienna);

Różnica: żadna. Wszystkie trzy prototypy są jednoznaczne, i deklarują
funkcję która nic nie zwraca, a która jako parametr oczekuje wskaźnika
do inta - a czym jest int, to już zależy od platformy - ANSI mówi tylko
że ma mieć co najmniej 16 bitów.

Temat bardziej na pl.comp.lang.c swoją drogą (a tamtejsi "bogowie" wcale
nie gryzą!).

Mateusz

Ghost
Guest

Thu Aug 04, 2016 8:09 am   



Użytkownik napisał w wiadomości grup
dyskusyjnych:c668b776-b84c-427e-9ec5-92058735710a@googlegroups.com...

Quote:
To chyba jest "elementarz" C, ale pytanie zupełnie serio, nie robię sobie
tutaj jaj !!

Na Twoje pytanie już padła odpowiedz, w ramach rozszerzenia:

deklaracje

int *a, b;
i
int* a, b;

też są równoważne, ale z drugiej ktoś niedoświadczony (choć niekoniecznie)
mógłby wywnioskować, że obie zmienne to wskaźniki.
Zatem skoro * dotyczy tylko elementu tuż za znakiem, to przytulajmy go doń,
na pewno zyskujemy na czytelności.

ajt
Guest

Thu Aug 04, 2016 8:09 am   



W dniu 2016-08-04 o 09:24, stchebel@gmail.com pisze:
Quote:
Nie chodzi mi o "void". To akurat jest zrozumiałe. Chodzi mi o umiejscowienie "*" w deklaracji zmiennej wejściowej. (typ* zmienna, typ *zmienna, typ * zmienna).

Umiejscowienie nie ma żadnego znaczenia, wszystkie trzy przykłady są
równoważne, pominąłeś jeszcze typ*zmienna, to również to samo.
Oczywiście nie można wykluczyć jakiejś egzotycznej implementacji, gdzie
ktoś w ten sposób chciałby nadać inne znaczenia, ale to już nie byłoby C ...

Quote:
A idę o zakład , że:
1) Każdy algorytmista czytając żródło w Pascalu, zrozumie o co chodzi
2) Czytając żródło C - będzie czkawka Smile)

Dawno temu miałem zajęcia z nieżyjącym już niestety Janem Bieleckim. Na

zaliczenie trzeba było zrobić erratę do jego kolejnej książki o C czy
C++. Po dokładnym przeanalizowaniu kilkudziesięciu pokręconych
przykładów (a JB lubił wymyślać różne dziwolągi składniowe) i
znalezieniu sporej liczby błędów nie miałem już problemów z rozumieniem
źródeł Smile
--
Pozdrawiam
Andrzej www.radom.city

J.F.
Guest

Thu Aug 04, 2016 8:16 am   



Użytkownik stchebel napisał w wiadomości grup
Quote:
Wgłębiając się jednak ciutę głębiej w C/Pascal, są jednak pewne
różnice wynikające chociażby z zapisu i wymiany danych o różnych
typach. Pascal jest >kurewsko restrykcyjny w typach zmiennych. Nawet
na pozomie kompilacji potrafi pokazać środkowy paluch ku górze.

W C natomiast, masz możliwość typowania danych, cholernie trzeba z
tym uważać.

To jest koniecznosc.
Zreszta teraz w C++/C# enuma sp* maksymalnie ... a moze tak ma byc,
dlugosc tekstu sie nie liczy.

Zreszta ... kto nie programowal w PL/1, ten nie wie co to jest
konwersja typow :-)

Quote:
Tymczasem w C, możesz zadeklarować nazwę zmiennej gdzie popadnie.
Nawet zmienną sterującej pętli wewnątrz pętli!! for(int i.. i tak
dalej) .
BURDEL jak cholera !! Hahh!!

Jaki burdel ? Zmienna deklarujesz w "bloku" tzn w {}. I w tymze bloku
obowiazuje.
Dzieki temu nie musisz daleko patrzec.
Nie pamietam - a w Pascalu nie jest tak samo ?

Quote:
A idę o zakład , że:
1) Każdy algorytmista czytając żródło w Pascalu, zrozumie o co
chodzi
2) Czytając żródło C - będzie czkawka Smile)

Niewatpliwe w C, da sie napisac program w sposob bardzo zagmatwany.
Ale po co to robic ? Mozesz pisac rownie elegancko jak w Pascalu.

Owszem, jakies ambitniejsze konstrukcje wskaznikowo-tablicowe moga
czlowieka dobic, ale coz robic

Nie narzekaj na C. Poznasz C++, to C wyda ci sie idealem :-)

Niejaki AL tu zwracal swego czasu uwage na jedna ceche Pascala -
zagniezdzone procedury/funkcje, i ich zmienne.
Procedury maja dostep do zmiennych procedury nadrzednej, co znakomicie
utrudnia implementacje ..

J.

Mateusz Viste
Guest

Thu Aug 04, 2016 8:16 am   



On 04/08/2016 09:40, stchebel@gmail.com wrote:
Quote:
Japierdole!!! Przepraszam, to nie jest reakcja w Twoją stronę, lecz w stronę developerów C. Nie wiem gdzie zyskujemy na czytelności.. Gwiazdka w lewo, prawo, pośrodku, znaki zapytania gdziebądź, wykrzykniki itd, itp..
Nosz kurwa, wolę w assemblerze mov a,b - przynajmniej wiadomo o co chodzi.

Nie rozumiem dlaczego w takim razie upierasz się przy C. Nie podoba się
- działaj w czymkolwiek innym... Filozoficzne narzekania prowadzą do nikąd.

Mateusz

Ghost
Guest

Thu Aug 04, 2016 8:42 am   



Użytkownik napisał w wiadomości grup
dyskusyjnych:29f17d21-b0b0-4c39-accb-5f6e2410660c@googlegroups.com...

Quote:
Nie wiem gdzie zyskujemy na czytelności..

Programowanie nie jest dla ciebie Smile Niezależnie od języka.

Ghost
Guest

Thu Aug 04, 2016 8:47 am   



Użytkownik napisał w wiadomości grup
dyskusyjnych:9756d847-22a1-444a-b88c-f17ae5805bf4@googlegroups.com...

W dniu czwartek, 4 sierpnia 2016 09:53:22 UTC+2 użytkownik ajt napisał:

Quote:

Umiejscowienie nie ma żadnego znaczenia, wszystkie trzy przykłady są
równoważne, pominąłeś jeszcze typ*zmienna, to również to samo.
Oczywiście nie można wykluczyć jakiejś egzotycznej implementacji, gdzie
ktoś w ten sposób chciałby nadać inne znaczenia, ale to już nie byłoby C
...


Dzięki za odpowiedź. Chyba nie do końca prawidłowo zadałem pytanie.
Korekta:
1) void Jakaś_Tam_Funkcja(typ* zmienna_1,zmienna_2,....,zmienna_n);
2) void Jakaś_Tam_Funkcja(typ *zmienna_1,zmienna_2,....,zmienna_n);
3) void Jakaś_Tam_Funkcja(typ * zmienna_1,zmienna_2,....,zmienna_n);

Chodzi mi o cały wektor zmiennych. Aha , pominąłem jeszcze to samo jak
wyżej, ale BEZ GWIAZDKI!! Jak to wtedy działa?

I nie masz odruchowego wrażenia, ze

typ* zmienna_1,zmienna_2,....,zmienna_n
oznacza deklaracje n zmiennych każda typu typ*

a
typ *zmienna_1,zmienna_2,....,zmienna_n
oznacza deklaracje zmienna_1 typu typ*, oraz n-1 zmiennych typu typ?

Tymczasem obie deklarację robią to samo, znaczy realizują drugi przypadek,
dlatego należy trzymać gwiazdki przy zmiennych

Mateusz Viste
Guest

Thu Aug 04, 2016 9:01 am   



On 04/08/2016 10:18, stchebel@gmail.com wrote:
Quote:
Dzięki za odpowiedź. Chyba nie do końca prawidłowo zadałem pytanie. Korekta:
1) void Jakaś_Tam_Funkcja(typ* zmienna_1,zmienna_2,....,zmienna_n);
2) void Jakaś_Tam_Funkcja(typ *zmienna_1,zmienna_2,....,zmienna_n);
3) void Jakaś_Tam_Funkcja(typ * zmienna_1,zmienna_2,....,zmienna_n);

Chodzi mi o cały wektor zmiennych. Aha , pominąłem jeszcze to samo jak wyżej, ale BEZ GWIAZDKI!! Jak to
wtedy działa?


Bez gwiazdki to po prostu int przepisany "by value", a nie wskaźnik ("by
reference").

Co do "wektora zmiennych", to w powyższym przykładzie nic takiego nie ma
miejsca. To po prostu lista parametrów, gdzie pierwszy parametr jest
wskaźnikiem do zmiennej typu "typ", a kolejne są int-ami (brak definicji
typu = int, patrz sekcja 6.7.1 z ISO/IEC 9899:1990).

Naturalnie składnia "...." jest nieprawidłową deklaracją funkcji
wariadycznej, ale domniemywam że nie było to celowe.

Zapraszam na pl.comp.lang.c - lub (zależnie od nastawienia) -
pl.sci.filozofia

Mateusz

Mateusz Viste
Guest

Thu Aug 04, 2016 9:10 am   



On 04/08/2016 10:55, stchebel@gmail.com wrote:
Quote:
Byle gdzie przeczytałeś parę zdań, a co do meritum tematu nie masz bladego pojęcia. Przeczytaj główny wątek !!

Faktycznie mój błąd - było "opisz różnicą między prototypami po żołniersku".

To może pl.misc.militaria ?

Mateusz

Guest

Thu Aug 04, 2016 9:24 am   



W dniu czwartek, 4 sierpnia 2016 08:22:09 UTC+2 użytkownik Mateusz Viste napisał:
Quote:
On 04/08/2016 08:09, stchebel@gmail.com wrote:
Może trochę NTG, ale chyba prędzej tutaj uzyskam konkretną odpowiedź, niż na grupie "BOGÓW" od C/C++. Jak wiecie, mam trochę wstręta do C, ale nie w tym rzecz. Prośba: Napiszcie mi w kilku "żołnierskich" słowach jaka jest różnica/jak to interpretować:

1) void Jakaś_Tam_Funkcja(int* Jakaś_Tam_Zmienna);
2) void Jakaś_Tam_Funkcja(int *Jakaś_Tam_Zmienna);
3) void Jakaś_Tam_Funkcja(int * Jakaś_Tam_Zmienna);

Różnica: żadna. Wszystkie trzy prototypy są jednoznaczne, i deklarują
funkcję która nic nie zwraca, a która jako parametr oczekuje wskaźnika
do inta - a czym jest int, to już zależy od platformy - ANSI mówi tylko
że ma mieć co najmniej 16 bitów.

Temat bardziej na pl.comp.lang.c swoją drogą (a tamtejsi "bogowie" wcale
nie gryzą!).


==========
Nie chodzi mi o "void". To akurat jest zrozumiałe. Chodzi mi o umiejscowienie "*" w deklaracji zmiennej wejściowej. (typ* zmienna, typ *zmienna, typ * zmienna). A co się tyczy "bogów" z pl.comp.lang.c, to niestety z Bogiem nie pogadasz. Kiedyś wdałem się tam w dyskusję dot. składni C vs. Pascal. Na dobrą sprawę, "filozofia" obu języków jest IDENTYCZNA !! Pomijam takie pierdulamenty jak "begin/{", bądź "end/}", na co głównie młodzianie zwracają uwagę. Ich zdaniem, ten begin/end to syf!!

Wgłębiając się jednak ciutę głębiej w C/Pascal, są jednak pewne różnice wynikające chociażby z zapisu i wymiany danych o różnych typach. Pascal jest kurewsko restrykcyjny w typach zmiennych. Nawet na pozomie kompilacji potrafi pokazać środkowy paluch ku górze.

W C natomiast, masz możliwość typowania danych, cholernie trzeba z tym uważać.
No i kwestia porządku. W swojej biblioteczce mam książki poukładane sensownie. Koziołek Matołek jest na zupełnie innej półce niż Matematyka w Fizyce Klasycznej i Kwantowej/Byron&Fuller. Tymczasem w C, możesz zadeklarować nazwę zmiennej gdzie popadnie. Nawet zmienną sterującej pętli wewnątrz pętli!! for(int i.. i tak dalej) . BURDEL jak cholera !! Hahh!! Jest też w C jakiś tam zapis(jednolinijkowy), którego treść jest taka: Jeżeli a<b, to zrób "A", jeżeli a=b, to zrób "B", jeżeli a>b, to zrób "C". Nie pamiętam dokładnie tej składni, ale jest coś takiego w C, i jest to bardziej pojebane niż zapis całej tej procedury w Assemblerze.

A idę o zakład , że:
1) Każdy algorytmista czytając żródło w Pascalu, zrozumie o co chodzi
2) Czytając żródło C - będzie czkawka Smile)

J.F.
Guest

Thu Aug 04, 2016 9:36 am   



Użytkownik stchebel napisał w wiadomości grup
W dniu czwartek, 4 sierpnia 2016 10:16:47 UTC+2 użytkownik J.F.
napisał:
Quote:
Zreszta ... kto nie programowal w PL/1, ten nie wie co to jest
konwersja typow Smile
Nie wiem nawet i nie chcę wiedzieć czym jest PL/1. Domyślam się, że
tam to dopiero jest Brothel Smile)

Powiedzmy tak:
J=1 ;
IF J=1 THEN ...

Myslisz, ze warunek jest prawdziwy ? To sie mylisz.

Quote:
Tymczasem w C, możesz zadeklarować nazwę zmiennej gdzie popadnie.
Nawet zmienną sterującej pętli wewnątrz pętli!! for(int i.. i tak
dalej) .
BURDEL jak cholera !! Hahh!!

Jaki burdel ? Zmienna deklarujesz w "bloku" tzn w {}. I w tymze
bloku
obowiazuje.
Nie pamietam - a w Pascalu nie jest tak samo ?

Prawie tak samo, tylko ciuta porządniej. Nie w bloku {-}/begin-end,
lecz w dedykowanym bloku deklaracji zmiennych lokalnych (var), zaraz
po deklaracji >funkcji/procedury(w C jest to "void" - boszsz...).
Dzięki temu nie ma potrzeby szukania blisko/daleko.. Po prostu
wiadomo gdzie szukać

Dziesiec stron wczesniej na wydruku :-)

Quote:
Owszem, jakies ambitniejsze konstrukcje wskaznikowo-tablicowe moga
czlowieka dobic, ale coz robic
Otóż i to. Nawet tak duperelny temat jak mnożenie macierzy, gdzie
traba pamiętać o odjęciu jedynki od numery wiersz/kolumny.

Po co ? Mnozenie nie wymaga znajomosci nr wiersza czy kolumny.

A nie pamietam - w Pascalu byla mozliwosc przekazania do funkcji
tablicy dwuwymiarowej o nieokreslonym rozmiarze ?

A potem jeszcze napisz procedure odwracajaca macierz ... zespolona.
Niech zyje Fortran :-)

Quote:
Nie narzekaj na C. Poznasz C++, to C wyda ci sie idealem Smile
Niestety.. Nie poznam.. Jestem niereformowalny, wątek utworzyłem
tylko by upewnić się czy rozumiem pewne źródło.

Kiedys i Pascala rozwina.
Juz chyba rozwineli (Delphi) :-)

J.

Guest

Thu Aug 04, 2016 9:40 am   



W dniu czwartek, 4 sierpnia 2016 08:43:02 UTC+2 użytkownik Ghost napisał:
Quote:
Użytkownik napisał w wiadomości grup
dyskusyjnych:c668b776-b84c-427e-9ec5-92058735710a@googlegroups.com...

To chyba jest "elementarz" C, ale pytanie zupełnie serio, nie robię sobie
tutaj jaj !!

Na Twoje pytanie już padła odpowiedz, w ramach rozszerzenia:

deklaracje

int *a, b;
i
int* a, b;

też są równoważne, ale z drugiej ktoś niedoświadczony (choć niekoniecznie)
mógłby wywnioskować, że obie zmienne to wskaźniki.


Quote:
Zatem skoro * dotyczy tylko elementu tuż za znakiem, to przytulajmy go doń,
na pewno zyskujemy na czytelności.

Japierdole!!! Przepraszam, to nie jest reakcja w Twoją stronę, lecz w stronę developerów C. Nie wiem gdzie zyskujemy na czytelności.. Gwiazdka w lewo, prawo, pośrodku, znaki zapytania gdziebądź, wykrzykniki itd, itp..

Nosz kurwa, wolę w assemblerze mov a,b - przynajmniej wiadomo o co chodzi.

Grzegorz Niemirowski
Guest

Thu Aug 04, 2016 9:47 am   



stchebel@gmail.com <stchebel@gmail.com> napisał(a):
Quote:
Nie chodzi mi o "void". To akurat jest zrozumiałe. Chodzi mi o
umiejscowienie "*" w deklaracji zmiennej wejściowej. (typ* zmienna, typ
*zmienna, typ * zmienna). A co się tyczy "bogów" z pl.comp.lang.c, to
niestety z Bogiem nie pogadasz. Kiedyś wdałem się tam w dyskusję dot.
składni C vs. Pascal. Na dobrą sprawę, "filozofia" obu języków jest
IDENTYCZNA !! Pomijam takie pierdulamenty jak "begin/{", bądź "end/}", na
co głównie młodzianie zwracają uwagę. Ich zdaniem, ten begin/end to syf!!
Wgłębiając się jednak ciutę głębiej w C/Pascal, są jednak pewne różnice
wynikające chociażby z zapisu i wymiany danych o różnych typach. Pascal
jest kurewsko restrykcyjny w typach zmiennych. Nawet na pozomie kompilacji
potrafi pokazać środkowy paluch ku górze.

Ta grupa to nie jest miejsce na wojenki C vs Pascal.

Quote:
W C natomiast, masz możliwość typowania danych, cholernie trzeba z tym
uważać. No i kwestia porządku. W swojej biblioteczce mam książki
poukładane sensownie. Koziołek Matołek jest na zupełnie innej półce niż
Matematyka w Fizyce Klasycznej i Kwantowej/Byron&Fuller. Tymczasem w C,
możesz zadeklarować nazwę zmiennej gdzie popadnie. Nawet zmienną
sterującej pętli wewnątrz pętli!! for(int i.. i tak dalej) . BURDEL jak
cholera !! Hahh!!

No właśnie porządek jest. Widzisz wyraźnie, że ta zmienna należy do tej
pętli i jest niewidoczna poza nią. Przecież deklarowanie jej poza pętlą to
tak jak deklarowanie zmiennej globalnej w stosunku do zmiennej
zadeklarowanej wewnątrz funkcji.

Jest też w C jakiś tam zapis(jednolinijkowy), którego
Quote:
treść jest taka: Jeżeli a<b, to zrób "A", jeżeli a=b, to zrób "B", jeżeli
a>b, to zrób "C". Nie pamiętam dokładnie tej składni, ale jest coś takiego
w C, i jest to bardziej pojebane niż zapis całej tej procedury w

Chyba masz na myśli ternary conditional (a ? b : c), który zwraca b jeśli
jest a jest prawdą lub c jeśli a jest fałszem. Jest to bardzo przydatne i
nie wiem o co się czepiasz.

Quote:
Assemblerze.
A idę o zakład , że:
1) Każdy algorytmista czytając żródło w Pascalu, zrozumie o co chodzi
2) Czytając żródło C - będzie czkawka Smile)

Najpierw zrozum C, a potem pisz emocjonalne posty.

--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 8 days, 12 hours, 17 minutes and 38 seconds

Guest

Thu Aug 04, 2016 9:48 am   



W dniu czwartek, 4 sierpnia 2016 08:22:09 UTC+2 użytkownik Mateusz Viste napisał:

Quote:

Temat bardziej na pl.comp.lang.c swoją drogą (a tamtejsi "bogowie" wcale
nie gryzą!).


OK, zapytam

Goto page 1, 2, 3, 4  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Różnice w znakach wskaźników w definicji funkcji w C/C++ - które wybrać?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map