Ukazovateľ na funkciu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukazovateľ na funkciu – C / C++ – Fórum – Programujte.comUkazovateľ na funkciu – C / C++ – Fórum – Programujte.com

 

Kent0
Stálý člen
26. 10. 2013   #1
-
0
-

Dobrý deň,

mám problém s jednou úlohou. Jej zadanie je niečo v zmysle, že mám vytvoriť funkciu, ktorá načíta a pomocou argumentov vráti dve čísla. Ďalej mám vytvoriť ďalšiu funkciu na výpočet obvodu obdlžníka.
A problém je, že výpočet toho obsahu mám robiť tak, že zavolám ukazovateľ na funkciu. 

O ukazovateľoch sa učím ani nie týždeň a doteraz som študoval rôzne texty na nete ale nejde mi do hlavy ako to mám spraviť. 

Tak ak by sa našiel niekto, kto by mi s tým pomohol, bol by som rád.

Ďakujem

Nahlásit jako SPAM
IP: 178.253.136.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2013   #2
-
0
-
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
27. 10. 2013   #3
-
0
-

#2 KIIV
napísal som si tú prvú funkciu, ktorá vráti načítané čísla a potom som skúsil vytvoriť ukazovateľ na tú funkciu ale to určite nemám dobre. 

include <stdio.h>
double nacitaj()
{
	double x;
	scanf("%lf",&x);
	return x;
}
/*double obsah()
{
	S=a*b;
	return S;
}
double obvod()
{
	o=2*(a+b);
}*/
int main()
{
	
	double a,b;
	a=nacitaj();
	b=nacitaj();
	double (*p) (nacitaj()); //toto je urcite zle 
	getchar();
	return 0;
	
	
}
Nahlásit jako SPAM
IP: 178.253.136.–
Kent0
Stálý člen
27. 10. 2013   #4
-
0
-

#2 KIIV 

include <stdio.h>
double nacitaj()
{
	double x;
	scanf("%lf",&x);
	return x;
}
/*double obsah()
{
	double S;
	S=a*b;
	return S;
}
double obvod()
{
	double o;
	o=2*(a+b);
	return o;
}*/
int main()
{
	
	double a,b;
	a=nacitaj();
	b=nacitaj();
	double (*p) (nacitaj());  
	getchar();
	return 0;
	
	
}

teda takto to mám zatiaľ..to prvé čo som poslal bolo zle

Nahlásit jako SPAM
IP: 178.253.136.–
ingiraxo+15
Grafoman
27. 10. 2013   #5
-
0
-

#4 Kent
Jen ukázka ukazatele na funkci, podle toho si to zkus upravit ;)

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

int vynasob(int a, int b)
{
    return a * b;
}

int vypocti(int a, int b, int (*fce)(int, int))
{
    return fce(a, b);
}

int main()
{
    int secteno = vypocti(10, 20, secti);
    int vynasobeno = vypocti(10, 20, vynasob);

    return EXIT_SUCCESS;
}

Případně takto to máš jako ukazatelé ještě, ale je lepší si to natypovat 

int obvod()
{
    return 10; // vlastni vypocet
}

int obsah()
{
    return 20; // vlastni vypocet
}

int main()
{
    // ukazatele na funkce
    void* pObvod = obvod;
    void* pObsah = obsah;

    // zavolani fcunkci pres jejich ukazatele
    int _obvod = ((int (*)())pObvod)();
    int _obsah = ((int (*)())pObsah)();

    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kent0
Stálý člen
27. 10. 2013   #6
-
0
-

#5 ingiraxo
skúsil som ten prvý spôsob aj druhý:  

#include <stdio.h>
double nacitaj()
{
	double x;
	scanf("%lf",&x);
	return x;
}
double obsah(double a,double b)
{
	return a*b;
}
double obvod(double a,double b)
{
	return 2*(a+b);
}
double vypocet(double a,double b, double(*p)(double, double))
{
	return p(a,b);
}
int main()
{
	double a,b,S,o;
	a=nacitaj();
	b=nacitaj();
	S=vypocet(a,b,obsah);
	o=vypocet(a,b,obvod);
	printf("Obsah: %.2lf\n",S);
	printf("Obvod: %.2lf\n",o);
	getchar();
	return 0;
}

ale ten druhý mi nešiel ..nechápem tomu 

#include <stdio.h>
double nacitaj()
{
	double x;
	scanf("%lf",&x);
	return x;
}
double obsah(double a,double b)
{
	return a*b;
}
double obvod(double a,double b)
{
	return 2*(a+b);
}
int main()
{
	double a,b,S,o;
	void *pObsah=obsah;
	void *pObvod=obvod;
	a=nacitaj();
	b=nacitaj();
	
	double S=((double(*) ()) pObsah) ();
	printf("Obsah: %.2lf\n",S);
	//printf("Obvod: %.2lf\n",o);
	getchar();
	return 0;
}
Nahlásit jako SPAM
IP: 178.253.136.–
ingiraxo+15
Grafoman
27. 10. 2013   #7
-
0
-

#6 Kent
To není jenom o tom, že si to opíšeš, musíš i upravit volání... to co jsem psal, byl ukazatel na fci, která neměla parametr, ty tam máš 2 .. takže

double S = ((double(*)(double,double))pObsah)(a,b);

Ale je lepší, když si to nadefinuješ jak jsem psal (jen příklad)

typedef double (*FuncPtr)(double, double);

int main()
{
    FuncPtr pObvod = obvod;
    double a, b;

    double vysledek = pObvod(a, b);
}

Nebo mě napadla možnost ještě inline zápisu, pokud chceš být "moderní" :D 

int main()
{
    double (*vypoctiObvod)(double, double) = [](double a, double b) -> double {
        return 2 * (a + b);
    };

    double vysledek = vypoctiObvod(10, 20);

    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kent0
Stálý člen
27. 10. 2013   #8
-
0
-
Nahlásit jako SPAM
IP: 178.253.136.–
ingiraxo+15
Grafoman
27. 10. 2013   #9
-
0
-

#8 Kent
v C musíš provádět deklaraci a initializaci proměnných jako první, takže tomu vadí, že proběhla pozdější deklarace.. v C++ tohle řešit nemusíš

Dev++ je blbý IDE, píše ti chybu úplně jinou něž která nastala

Takže když to tvoje trochu zkrátim, tak to může být takto 

#include <stdio.h>

double nacitaj()
{
    double x;
    scanf("%lf", &x);
    return x;
}

double obsah(double a, double b)
{
    return a * b;
}

int main()
{
    double a = 0, b = 0, S = 0;
    void* pObsah = obsah;
    
    a = nacitaj(),
    b = nacitaj(),
    S = ((double(*)(double,double))pObsah)(a, b);
    
    printf("Obsah: %.2lf\n", S);
    
    getchar();
    return 0;
}

A pokud používáš C místo C++, tak používej jako příponu pro zdrojáky .c a né .cpp

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Kent0
Stálý člen
29. 10. 2013   #10
-
0
-

#9 ingiraxo
Ďakujem za rady :) 

Nahlásit jako SPAM
IP: 178.253.136.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

Ukazovatel na objekt — založil Anonymní uživatel

Hľadám funkciu — založil Trebor

Kontrola cez funkciu — založil Anonym

Ako priradit funkciu — založil Marek

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý