Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

adres funkcji

Ostatnio zmodyfikowano 2016-10-10 18:21
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
adres funkcji
» 2016-10-10 15:23:22
Witam. Szukałem, ale nigdzie nie mogę znaleźć odpowiedzi. Chciałbym znaleźć adres funkcji:
C/C++
#include <iostream>
using namespace std;
void funk()
{
    cout << "funkcja";
}
void funk2()
{
    cout << "funkcja";
}
int main()

{
    void( * wsk )() = & funk;
    cout << wsk << endl;
    wsk = & funk2;
    cout << wsk;
}
i teraz pytania:
a) dlaczego kiedy piszemy cout<<wsk; pokazuje się '1' a nie jak w innych przypadkach adres funkcji?
b) (powiązane) dlaczego musimy użyć '&' żeby wypisać adres?
P-152385
mateczek
» 2016-10-10 16:20:10
C/C++
#include <iostream>
using namespace std;
void funk()
{
    cout << "funkcja funk" << endl;
}
void funk2()
{
    cout << "funkcja funk2" << endl;
}
int main()

{
    //    void( * wsk )() = & funk; //ciekawy zapis :P nawet nie wiedziałem, że tak można
    void( * wsk )(); //deklaracja wskaźnika na funkcje
    wsk = funk;
    wsk(); //wywołanie funkcji za pomocą wskaźnika
    wsk = funk2;
    wsk();
}
P-152388
Monika90
» 2016-10-10 16:30:35
IOStreams nie potrafi drukować wskaźników do funkcji. Dlatego taki wskaźnik jest konwertowany do bool o wartośći true, a true jest drukowane jako jedynka.

Jednak niektóre implementacje C++ pozwalają na rzutowanie wskaźników do funkcji na jakiś inny typ wskaźnikowy, więc można wydrukować wskaźnik do funkcji w taki sposób:
C/C++
int main()
{
    void( * wsk )() = funk;
    cout << reinterpret_cast < void *>( wsk ) << endl;
    cout << reinterpret_cast < void *>( funk2 );
}
P-152389
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-10 16:50:05
Dzięki, ale jednej rzeczy nie rozumiem:

"rzutowanie na inny typ wskaźników"
Inny w jakim sensie?
C/C++
void( * wsk )() = funk;
cout << reinterpret_cast < void *>( wsk ) << endl;
cout << reinterpret_cast < void *>( funk2 );

Przecież tu wskaźnik jest wskaźnikiem do funkcji typu void, czyli jego typ to void. Skoro tak, to dlaczego rzutujemy
cout << reinterpret_cast < void *>( wsk ) << endl;
 na typ void*?
Ps. co w takim razie oznacza ten zapis (on już zwraca jakiś adres):
C/C++
void( * wsk2 )();
void( * wsk )() = funk;
cout <<& wsk;
P-152391
Rashmistrz
» 2016-10-10 16:51:10
Przecież tu wskaźnik jest wskaźnikiem do funkcji typu void, czyli jego typ to void.
VOID, że co? Typ void(*)() jest zupełnie czym innym niż typ void* czy samego void!

EDIT:Przeniosłem swoje pytanie do osobnego tematu: adres adresu funkcji

P-152392
Monika90
» 2016-10-10 17:11:55
Typ zwracany z funkcji a typ funkcji to nie to samo.

Dla przykładu, typem funkcji f zdefiniowanej tak

float f(int, int)
{
    return 0;
}


jest float (int, int), typem wskaźnika do tej funkcji jest float (*)(int, int)



Ps. co w takim razie oznacza ten zapis (on już zwraca jakiś adres):
C/C++
void( * wsk2 )();
void( * wsk )() = funk;
cout <<& wsk;
To jest adres zmiennej wsk
P-152394
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-10 17:25:52
Aha! a więc to:  float (*nazwa)(int, int) jest typem :)
Super, dziękuję za wyjaśnienie. Tematu jeszcze nie zamykam, bo Rachmistrz o coś się tam pytał.
P-152395
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-10-10 17:41:25
Przypomniałem sobie, o jeszcze czymś. Co właściwie w tym przypadku oznacza ten zapis:
C/C++
cout << reinterpret_cast < void *>( wsk ) << endl;
bo przecież typ void nie może przechowywać znaków itp. więc dlaczego rzutujemy na typ void* a nie np. int* ?
P-152398
« 1 » 2
  Strona 1 z 2 Następna strona