» »

[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?


#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 ::

marjan_h je izjavil:

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.

marjan_h je izjavil:

Kako se rešuje težava v C-ju?

Z dodatnim parametrom za velikost.

Vesoljc ::

marjan_h je izjavil:

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...

MrStein ::

marjan_h je izjavil:

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!

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:

#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 ()

marjan_h ::

Aja, razumem. Hvala.

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.
Motiti se je človeško.
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.

Zgodovina sprememb…

  • spremenil: GupeM ()

MrStein ::

Ja, saj, naj pove zahteve.
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!

Zgodovina sprememb…

  • spremenil: MrStein ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] - Spreminjanje programa s pointerji

Oddelek: Programiranje
61188 (940) DaMachk
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
657381 (6454) MrBrdo
»

[C] Sortiranje preštetih črk

Oddelek: Programiranje
61438 (1274) BigBoobs
»

[C] Narascajoce sortiranje linearnega seznama

Oddelek: Programiranje
71864 (1753) Jebiveter
»

kazalci in polje

Oddelek: Programiranje
51681 (1602) rasta

Več podobnih tem