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

void funkcja(???) - jak to zrobić?

Ostatnio zmodyfikowano 2010-04-03 19:42
Autor Wiadomość
kamillo121
» 2010-04-02 11:10:48
Ta funkcja nic nie zwraca , po prostu działa na oryginalnych zmiennych dlatego użyłeś referencji , więc nie wiem skąd twoje twierdzenie "..wyjściu funkcji może być wiele parametrów.."

tu też możesz deklarować bez nazw ale nie
funkcja( int, int..);
tylko
funkcja( int &, int &..);
P-15696
marek
Temat założony przez niniejszego użytkownika
» 2010-04-02 11:21:26
Ta funkcja nic nie zwraca , po prostu działa na oryginalnych zmiennych
Jak go zwał tak go zwał. Ja w działaniu na oryginalnych parametrach widzę same zalety. To po co stworzono funkcję ze zwrotem parametru (tylko jednego!) poprzez return? Nie wiem, może oszczędność pamięci?, szybkość?
Z innej beczki. Szkoda żeby to forum znikło. (patrz strona główna ddt)
P-15697
malan
» 2010-04-02 11:39:39
To po co stworzono funkcję ze zwrotem parametrów poprzez return
C/C++
// EXAMPLE_1
#include <iostream>

int suma( int, int );

int main()
{
    int a, b;
   
    std::cin >> a >> b;
    std::cout << suma( a, b );
   
    std::cin.sync();
    std::cin.get();
    return 0;
}

int suma( int l1, int l2 )
{
    return l1 + l2;
}
C/C++
// EXAMPLE_2
#include <iostream>

void suma( int, int, int & );

int main()
{
    int a, b, wynik;
   
    std::cin >> a >> b;
    suma( a, b, wynik );
    std::cout << wynik;
   
    std::cin.sync();
    std::cin.get();
    return 0;
}

void suma( int l1, int l2, int & wynik )
{
    wynik = l1 + l2;
}
Widać różnicę? :)

Szkoda żeby to forum znikło. (patrz strona główna ddt)
No szkoda, szkoda, ale to nie w tym temacie o tym dyskutować ;p.
P-15698
marek
Temat założony przez niniejszego użytkownika
» 2010-04-02 12:27:55
Example2 jest tylko trochę (ale tylko trochę) bardziej skomplikowane niż Example1 . Natomiast możliwości Example2 do Example1 mają  się tak, jak możliwości Mike'a Tyson'a  do Andrzeja Gołoty w pamiętnej walce. Może Example2 jest bardziej pamięciochłonne lub wolniejsze?
Nie mam doświadczeń z C++. Na pewno zwrot wartości poprzez return parametr jest czymś umotywowane. W tej chwili widzę to tak, że w C++ powinna być używana głównie metoda z Example2, zaś Example1 tylko wtedy gdy wynikiem działania funkcji jest tylko jeden parametr.
P-15700
Aithne
» 2010-04-03 12:04:23
Na pewno zwrot wartości poprzez return parametr jest czymś umotywowane.
Dobra... Jak chcesz inaczej zrobić funkcję zwracającą wartość? Z chęcią się dowiem - w Example2 ta funkcja nic nie zwraca. Chyba że coś palisz i wydaje ci się że zwraca. Nie wiem, nie wnikam.

Example1 tylko wtedy gdy wynikiem działania funkcji jest tylko jeden parametr.
Wynikiem działania funkcji jest parametr? Ty serio coś palisz.
P-15756
marek
Temat założony przez niniejszego użytkownika
» 2010-04-03 13:02:42
Mistrzu
Piszę skrótowo. Dla mnie nieważne, jest czy funkcja zwraca wartość czy nie. Ważne jest to, że oblicza jakąś wartość, która jest dostępna dla programu. Przecież to samo mogę uzyskać, poprzez np. float funkcja(x,y,z,...) jako konkretna wartość i void funkcja(x,y,z) jako zawartość pewnego miejsca w pamięci . I dlatego zastanawiam się po co w C++ są funcje z "return". W/g mnie wystarczyłyby tylko funkcje typu void funkcja(x,y,z...).
Na pewno jest jakieś uzasadnienie. Np funkcje z "return" mogą być szybsze. Ale czekam na kogoś, kto mi to uzasadni.
A co do pozostałych uwag, to raczej jestem pijący niż palący.
Pozdrowienia świąteczne
P-15760
Elaine
» 2010-04-03 13:26:13
Mistrzu
Popraw to faux pas, zanim ona to zauważy...

Przecież to samo mogę uzyskać, poprzez np. float funkcja(x,y,z,...)jako zawartość pewnego miejsca w pamięci i void funkcja(x,y,z)jako konkretna wartość .
Nie możesz uzyskać tego samego.
C/C++
double zonk( double x, double y )
{
    return x * y / 2.3;
}

cout << "Wynik wynosi: " << zonk( 1.1, 4.8 );
Teraz zrób to samo, zwracając void i przekazując refa do zmiennej, do której ma być zapisany wynik. Oczywiście linijka wypisująca na ekran ma zostać jak jest.

I dlatego zastanawiam się po co w C++ są funcje z "return".
Żeby język wyglądał w miarę normalnie (każdy sensowny język tak potrafi) i można było traktować wywołanie funkcji jako wyrażenie jakiegoś sensownego typu (nie, void nie jest sensownym typem)

W/g mnie wystarczyłyby tylko funkcje typu void funkcja(x,y,z...).
Nie wystarczyłyby - wtedy dziwnie wyglądałoby np. przeciążanie operatorów.

Np funkcje z "return" mogą być szybsze.
Uhhh, tu jest ciężko - jest kilka możliwości.
[li]Funkcja jest inlajnowana - obydwa przypadki dają dokładnie to samo.[/li]
[li]Funkcja zwraca typ prosty, nie jest inlajnowana - zwracanie wartości jak bozia przykazała jest nieco szybsze.[/li]
[li]Funkcja zwraca typ złożony, nie jest inlajnowana, (N)RVO działa - obydwa przypadki dają dokładnie to samo (bo zwracanie przez return jest tłumaczone do przyjmowania refa).[/li]
[li]Funkcja zwraca typ złożony, nie jest inlajnowana, (N)RVO nie działa - przekazywanie refa do obiektu zadziała szybciej.[/li]
P-15763
marek
Temat założony przez niniejszego użytkownika
» 2010-04-03 18:31:17
Iname
Na takie wysokie cis
Uhhh, tu jest ciężko - jest kilka możliwości.
Funkcja jest inlajnowana - obydwa przypadki dają dokładnie to samo.
Funkcja zwraca typ prosty, nie jest inlajnowana - zwracanie wartości jak bozia...
to ja nie wyrabiam. Ale między wierszami mam wrażenie, że funkcja zonk typu void nie będzie pożerała dużo więcej zasobów (pamięć i czas procesora) niż funkcja z "return" (ze zwracaniem wartości). Twoja funkcja zonk z referencjami wyglądałaby tak
C/C++
#include <iostream>
void zonk( double &, double &, double & );
int main()
{
    using std::cout;
    double x = 15, y = 2.3, z;
    zonk( x, y, z );
    cout << "z=" << z << "\n";
    return 0;
}
void zonk( double & a, double & b, double & c )
{
    c =( a * b ) / 2.3;
}
Rzeczywiście jest to bardziej skomplikowane niż Twoje zonk.
Z drugiej strony sądzę, że student któregoś tam roku informatyki w ramach zaliczeń z kompilatorów, zakładając że są tylko funkcje z referencjami(bez "return"), mógłby tak zmodyfikować C++
C/C++
#include <iostream>
zonk( double, double, double );
int main()
{
    using std::cout;
    double x = 20, y = 2.3, z;
    zonk( x, y, z );
    cout << "z=" << z << "\n";
    return 0;
}
zonk( double a, double b, double c )
{
    c =( a * b ) / 2.3;
}
To byłoby już bardziej zjadliwe.
Korzyści byłyby jeszcze bardziej widoczne w  przypadku 2(lub więcej) zmiennych wyjściowych
C/C++
#include <iostream>
zonk( double, double, double, double );
int main()
{
    using std::cout;
    double x = 20, y = 2.3, z1, z2;
    zonk( x, y, z1, z2 );
    cout << "z1=" << z1 << "\n";
    cout << "z2=" << z2 << "\n";
    return 0;
}
zonk( double a, double b, double c, double d )
{
    c =( a * b ) / 2.3;
    d =( a + b ) / 4.5
}
 Nie wiem. Może zbyt lekko podchodzę do możliwości modyfikacji, czy też tworzenia języków.
Na tym kończę rozważania. Proszę też o drobinę wyrozumiałości dla kogoś, kto tkwi w czasach algolu, fortranu i Wydziału Łączności ( a nie Elektroniki).
 




P-15770
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona