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

adres adresu funkcji

Ostatnio zmodyfikowano 2016-10-12 15:26
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
adres adresu funkcji
» 2016-10-10 18:10:02
Nazwa funkcji jest adresem wskazującym na kod tej funkcji.
Jednakże ten sam adres nie znajduje się w pamięci,
więc operecja pozyskania adresu nie powinna się powieść,
bo adres adresu tak na prawdę nie istnieje w pamięci.

To coś wypisuje 1 jakimś cudem,
a nie powinno w ogóle działać:
C/C++
#include <iostream>
int main() { std::cout << & main; }

To tymbardziej nie powinno:
C/C++
#include <iostream>
int main() { std::cout <<( void * )( & main ); }

Czy jest to jakiś zdefiniowany undefined behavior?
Ktoś mi wyjaśni co to za magia się tam dzieje?

EDIT: Tak wiem, że:
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.
ale nie o to się pytam.
P-152401
Monika90
» 2016-10-10 18:32:11

Nazwa funkcji jest adresem wskazującym na kod tej funkcji.
Nie jest. Więc &funkcja to jest adres funkcji, nie adres adresu. Kompilator dokona jednak niejawnej konwersji: funkcja -> wskaźnik do funkcji, w miejscach w których oczekiwany jest wskaźnik, dlatego działa coś takiego:

void (*pf)() = funkcja;


i znaczy to zupełnie to samo co

void (*pf)() = &funkcja;



P-152404
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-10-10 19:32:05
Mając taki oto kod:
C/C++
#include <iostream>
void test( void ) { std::cout << "Hi!\n"; }

int main()
{
    void( * wsk )() = test;
   
    ( wsk )();
    ( & test )();
    test();
}

Instrukcje
( wsk )();
 i
( & test )();
 są pośrednio równoznaczne sobie,
a
test();
 równoznaczne tylko w działaniu?

Czy wywołanie funkcji (użycie operatora funkcji)
na wskaźniku do funkcji również powoduje wcześniejsze
niejawne wyłuskanie tego wskaźnika czy jest może
ten operator w domyśle przeładowany dla tych wskaźników?


P-152405
mateczek
» 2016-10-12 08:07:38
he właśnie jestem w trakcie pisania biblioteki i w przypadku obiektów funkcyjnych działa tak samo
C/C++
//tak
void PlcQtLib::writeByte( int dbb, int data )
{
    QMutexLocker m( & mutex );
    kolejkaZadan.enqueue( std::bind( PlcQtLib::_writeByte, this, dbb, data ) ); //rejestracja funkcji w kolejce do wykonywania w wątku
}
//czy siak
void PlcQtLib::writeByte( int dbb, int data )
{
    QMutexLocker m( & mutex );
    kolejkaZadan.enqueue( std::bind( & PlcQtLib::_writeByte, this, dbb, data ) );
}
//się kompiluje
P-152468
Monika90
» 2016-10-12 12:13:21
Wygląda na to że inaczej jest w C a inaczej w C++, choć nie sądzę żeby ta różnica miała jakieś praktyczne znaczenie. Więc w C operator () jest zdefiniowany tylko dla wskaźników do funkcji, jeżeli to co stoi po jego lewej stronie nie jest wskaźnikiem, to zostanie automatycznie przekształcone na wskaźnik do funkcji (jeżeli się da). W C++ po lewej stronie operatora () może wystąpić zarówno wskaźnik jak i funkcja, i nie ma żadnej konwersji ani wyłuskania. Końcowy efekt jest jednak taki sam w C i w C++.
P-152479
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-10-12 15:26:01
Dziękuję za udzielenie treściwych odpowiedzi!
Szczególne podziękowania dla Pani Moniki! ;)

Temat zamykam!
P-152484
« 1 »
  Strona 1 z 1