Forum » Programiranje » [C] Funkcija vrnitev kazalca
[C] Funkcija vrnitev kazalca
marjan_h ::
Zanima me zakaj pri prenosu argumentov polje se ne prenese dolžina? Sicer bi lahko dodal nov argument velikost vendar to ni smiselno. Kako se rešuje težava v C-ju?
Hvala.
#include <stdio.h> int * najdiMaksimum(int *polje){ int n = 0; int *pmax = &n; for(int i=0; i < sizeof(polje) / sizeof(int); i++){ if (*pmax < *(polje + i)){ pmax = (polje + i); } } return pmax; } int main(void) { int tabela[] = {1,5,1,2}; printf("%d", *najdiMaksimum(tabela)); return 0; }
Hvala.
mallard ::
Zanima me zakaj pri prenosu argumentov polje se ne prenese dolžina?
Ker polja niso kazalci in C-ju jih ne moreš pošiljat funkcijam. Namesto tega se polje avtomatsko pretvori v kazalec na prvi element.
Kako se rešuje težava v C-ju?
Z dodatnim parametrom za velikost.
Vesoljc ::
Sicer bi lahko dodal nov argument velikost vendar to ni smiselno.
Zakaj ni smiselno?
Abnormal behavior of abnormal brain makes me normal...
Datadog ::
Pointer decay če prav štekam kaj sprašuješ.
http://web.archive.org/web/200812081224...
Če maš na voljo stl raje std::array drugače pa argument ja...
Pa vračaš si pointer na spremenljivko, ki je out of scope. Could have nasty sideeffects...
http://web.archive.org/web/200812081224...
Če maš na voljo stl raje std::array drugače pa argument ja...
Pa vračaš si pointer na spremenljivko, ki je out of scope. Could have nasty sideeffects...
MrStein ::
Zanima me zakaj pri prenosu argumentov polje se ne prenese dolžina?
Prenese se (implicitno) kazalec na polje, oziroma na njegov prvi element.
Dolžino lahko "uganeš" v funkciji, če poznaš strukturo polja (recimo stringi imajo zadnji element z vrednostjo nič). Ali pa preneseš velikost v dodatnem argumentu.
Neke "sistemske" rešitve ni.
PS: Primer programa je totalno mimo, več različnih (logičnih) napak.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
GupeM ::
Verjetno bi moral vrniti kazalec na tisto polje v arrayu, kjer je max in ne na lokalno spremenljivko ki drži vrednost max.
mn ::
Poizkusi tole:
Popravek:
Slabo sem prebral. Prenese se samo pointer na prvi element. Dolžine ni. In v Cju se to tako rešuje, da se funkciji da ali dolžina bufferja ali pa število elementov. Pa nikoli vračati pointerjev na lokalne variable, kar bi se pri tebi zgodilo, če bi bile v arrayu samo negativne vrednosti.
#include <stdio.h> int * najdiMaksimum(int *polje, int count){ int *pmax = polje; // sizeof(polje) je tukaj v resnici enak sizeof(int*) in ne sizeof(tabela) for(int i=0; i < count; i++){ if (*pmax < *(polje + i)){ pmax = (polje + i); } } return pmax; } int main(void) { int tabela[] = {1,5,1,2}; // sizeof(tabela) ti vrne velikost tabele v bajtih in ne stevilo elementov. Za stevilo elementov deli s velikostjo enega elementa sizeof(int) printf("%d", *najdiMaksimum(tabela, sizeof(tabela)/sizeof(int))); return 0; }
Popravek:
Slabo sem prebral. Prenese se samo pointer na prvi element. Dolžine ni. In v Cju se to tako rešuje, da se funkciji da ali dolžina bufferja ali pa število elementov. Pa nikoli vračati pointerjev na lokalne variable, kar bi se pri tebi zgodilo, če bi bile v arrayu samo negativne vrednosti.
Zgodovina sprememb…
- spremenilo: mn ()
MrStein ::
Ta return type je totalno mimo, posebej, ker pa sploh ne uporabljaš kot pointer.
Navaden int vrni, pa je. Ves "pmax" briši in recimo tisti n uporabiš namesto.
Navaden int vrni, pa je. Ves "pmax" briši in recimo tisti n uporabiš namesto.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
GupeM ::
Ni res da je totalno mimo. Če nekdo rabi kazalec na max v tabeli, rabi kazalec na max v tabeli in ne vrednosti max v tabeli.
Edit: Pa sumim da je takšno nalogo dobil na faksu in mora tako narediti.
Edit: Pa sumim da je takšno nalogo dobil na faksu in mora tako narediti.
Zgodovina sprememb…
- spremenil: GupeM ()
MrStein ::
Ja, saj, naj pove zahteve.
Ker trenutni main iz primera pač ne rabi kazalca.
Ker trenutni main iz primera pač ne rabi kazalca.
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!
Zgodovina sprememb…
- spremenil: MrStein ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] - Spreminjanje programa s pointerjiOddelek: Programiranje | 1188 (940) | DaMachk |
» | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 7381 (6454) | MrBrdo |
» | [C] Sortiranje preštetih črkOddelek: Programiranje | 1438 (1274) | BigBoobs |
» | [C] Narascajoce sortiranje linearnega seznamaOddelek: Programiranje | 1864 (1753) | Jebiveter |
» | kazalci in poljeOddelek: Programiranje | 1681 (1602) | rasta |