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

Struktura jako argument domniemany funkcji

Ostatnio zmodyfikowano 2013-04-13 16:20
Autor Wiadomość
McAffey
Temat założony przez niniejszego użytkownika
Struktura jako argument domniemany funkcji
» 2013-04-13 06:04:06
Witam. Skoro nigdzie nie znalazłem takiego wykorzystania, to pewnie odpowiedź jest przecząca, ale co mi szkodzi upewnić się Was, starych wyjadaczy - czy da się zastosować strukturę jako argument domniemany funkcji ? Kompilator w przypadku argumentu funkcji, nie godzi się na stosowanie standardowego przypisania wstępnej wartości strukturze (x = {1, 2}), a nie przychodzi mi do głowy inny sposób na wykonanie inizjalizacji struktury. Wydaje mi się, że nie da się tego wykonać, ale już nie raz używałem takiego zwrotu "wydaje mi się", a potem wielokrotnie pokazywaliście mi, że "tylko mi się wydaje", i po prostu brak mi doświadczenia, dlatego pytam ;) Z góry dzięki :)
P-80495
pekfos
» 2013-04-13 11:03:25
Masz na myśli wartość domyślną argumentu?
C/C++
#include <iostream>

struct a
{
    int x, y;
};

void f( a b = { 1, 2 } )
{
    std::cout << b.x << " " << b.y;
}

int main()
{
    f();
}
Kompiluje się i działa (GCC 4.7.2).
P-80501
McAffey
Temat założony przez niniejszego użytkownika
» 2013-04-13 11:45:38
Hmm, to może dzięki temu że masz nowszy, ja sprawdzałem na GCC 4.4.1 i GCC 4.6.2 i na obu dostawałem błąd kompilacji :

error: expected primary-expression before '{' token
error: expected ')' before '{' token

No nic, chyba zostaje mi zaktualizować kompilator :)
P-80502
DejaVu
» 2013-04-13 12:39:57
Jeżeli masz włączoną obsługę standardu C++11 to być może zadziała wspomniany zapis.

/edit:
Pod Visual C++ 1012 nie działa, więc jest to raczej rozszerzenie kompilatora GCC 4.7.2.
P-80504
Elaine
» 2013-04-13 15:21:15
To nie jest rozszerzenie, to wina kompilatora Microsoftu, który ma tylko częściową obsługę C++. Według standardu jest to poprawne; GCC (które od 4.8.1 ma pełną obsługę) i Clang (któremu niewiele brakuje) nie mają z tym problemu.
P-80506
Monika90
» 2013-04-13 16:20:24
Można problem rozwiązać na wiele sposobów:
1. Zdefiniować konstruktor
C/C++
struct S
{
    int x, y, z;
    S( int x, int y, int z )
        : x( x )
        , y( y )
        , z( z )
    { }
};

void f( S s = S( 1, 2, 3 ) );
2. Zdefiniować stałą
C/C++
struct S { int x, y, z; };

const S default_s = { 1, 2, 3 };

void f( S s = default_s );
3. Przeciążyć funkcję
C/C++
struct S { int x, y, z; };

void f( S s );
inline void f() { S s = { 1, 2, 3 }; f( s ); }
P-80507
« 1 »
  Strona 1 z 1