Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: pointer na funkciu

Aktivity
Avatar
ivan.miso
Člen
Avatar
ivan.miso:3.2.2015 20:54

Zdravim.chcem sa spytat.ked priradim adresu funkcie k pointeru na tuto funkciu:
Int(*p_fint)();
Funkcia sa vola sucet,ktora je predtym definovana.
p_fint = sucet;
Preco ked si vypisem adresu funkcie a hodnotu p_fint, tak mi na obidve vyhodi adresu p_fint,ale ked si takto isto priradim premennu k pointeru tak je to ok.

Som tu novy,stale sa len ucim programovat, tak ak sa pytam zle, opravte ma.ďakujem

 
Odpovědět
3.2.2015 20:54
Avatar
David.Landa
Člen
Avatar
David.Landa:4.2.2015 15:15

Můžeš to prosím ještě trochu vysvětlit a ukázat (zformátovaný prosím) nějaký souvislejší kus kódu?

Editováno 4.2.2015 15:16
 
Nahoru Odpovědět
4.2.2015 15:15
Avatar
ivan.miso
Člen
Avatar
Odpovídá na David.Landa
ivan.miso:4.2.2015 20:53

#include <stdio.h>
#include <stdlib.h>

int sucet(int a, int b)
{
return (a + b);
}

int main(void)
{
int(*p_fint)(int, int);
int prve, druhe;

printf("napis 2 cele cisla:\n");
scanf("%d %d", &prve, &druhe);

p_fint = sucet;

printf("sucet dvoch cisel je %d\n"
"adresa funkcie sucet je %p\n"
"hodnota pointeru p_fint je %p\n", p_fint(prve, druhe), sucet, p_fint);

system("pause");
return 0;
}

 
Nahoru Odpovědět
4.2.2015 20:53
Avatar
ivan.miso
Člen
Avatar
Odpovídá na ivan.miso
ivan.miso:4.2.2015 21:01

p_fint = sucet; v tomto riadku by sa mala adresa funkcie priradit do pointeru ale ked si vypisem hodnoty v printf tak pre sucet aj pre p_fint by mala byt hodnota adresa suctu, spravne?

v tomto riadku int(*p_fint)(int, int); som musel dat int, int inak mi to vyhadzovalo chybu c2440 tusim. pouzivam microsoft visual studio 2013l

 
Nahoru Odpovědět
4.2.2015 21:01
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na ivan.miso
Lukáš Hruda:4.2.2015 21:53

Však obě ty vypsané adresy jsou stejné, v čem je problém?

 
Nahoru Odpovědět
4.2.2015 21:53
Avatar
David.Landa
Člen
Avatar
Odpovídá na ivan.miso
David.Landa:4.2.2015 22:10

Ukazatel na funkci inicializuješ správně: pak to to vypíše součet a hodnotu ukazatele a adresu funkce -- obě stejné (např. 0x40062d), jak bys očekával, kde je chyba? Možná chceš něco jiného, ale syntakticky je program správně -- kompiluj s příznaky (flags):

gcc test.c -o test -Wall -Wextra -Werror

Formátuj ten kód -- je na to čudlík .)

Editováno 4.2.2015 22:13
 
Nahoru Odpovědět
4.2.2015 22:10
Avatar
David.Landa
Člen
Avatar
Odpovídá na ivan.miso
David.Landa:4.2.2015 22:16

Nepoužívej

system("pause")

-- It's not portable!

 
Nahoru Odpovědět
4.2.2015 22:16
Avatar
Odpovídá na ivan.miso
Libor Šimo (libcosenior):5.2.2015 10:16

Možno ti pomôže toto:

Nahoru Odpovědět
5.2.2015 10:16
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David.Landa
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
David.Landa:5.2.2015 15:51

Pleteš pojmy adresa a hodnota ukazatele. Adresa ukazatele není jak píšeš v příkladu, to je hodnota kterou ukazatel uchovává -- ukazatel je normální proměnná, adresu ukazatele dostaneš takto:

printf("address of pointer is: 0x%0X\n", (unsigned)&p);
Editováno 5.2.2015 15:53
 
Nahoru Odpovědět
5.2.2015 15:51
Avatar
ivan.miso
Člen
Avatar
Odpovídá na David.Landa
ivan.miso:10.2.2015 12:13

skusim vam to ukazat: adresa icka sa priradi do hodnoty pointera, ten teda ukazuje na icko(sam pointer ma ale vlastnu adresu tu ale na obrazku nevidim ze????, ), ked si to v printf vypisem pomocou %p ukaze mi rovnake hodnoty, DOBRE TO CHAPEM????
potom vam ukazem vo to ukazem vo funkcii, tam to mam inak.

system("pause"); pouzivam lebo nechcem aby mi hned zavrelo okno.

 
Nahoru Odpovědět
10.2.2015 12:13
Avatar
David.Landa
Člen
Avatar
David.Landa:10.2.2015 12:33

Jo, já sem odpovídal na předřečníka -- myslím, že to chápeš:
ukazatel je proměnná, která jako hodnotu uchovává adresu jiného objektu (proměnné atd.). Ale protože je sám proměnnou, musí mít také nějakou adresu.
Však to chápeš. Předřečník ve screenshotu píše: adresa pointera... -- ale to je hodnota, kterou uchovává, nikoliv jeho adresa.

 
Nahoru Odpovědět
10.2.2015 12:33
Avatar
David.Landa
Člen
Avatar
Odpovídá na David.Landa
David.Landa:10.2.2015 12:35

ivan.miso Doporučím ti naučit se kompilovat z řádky, pro jednoduché příklady je to ideální a ještě se spoustu naučíš.

Editováno 10.2.2015 12:36
 
Nahoru Odpovědět
10.2.2015 12:35
Avatar
ivan.miso
Člen
Avatar
Odpovídá na David.Landa
ivan.miso:10.2.2015 12:44

co myslis tym kompilovat z radky, cecko sa ucim viac menej sam, dakujem za kazku radu, zajtra napisem ako mi to ukazuje pointer na fuknciu , tam my to ukazuje inak, pointer na premennu teda chapem, zatial dakujem za ochotu.idem do prace

 
Nahoru Odpovědět
10.2.2015 12:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.