Pomoc w zrozumieniu funkcji Void

Pomoc w zrozumieniu funkcji Void
FA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:5
0

Witam, niedawno zacząłem się uczyć o funkcjach i zagadką jest dla mnie furkacja Void, na czym one polegają, nie będę podawał konkretnego przykładu, ale żeby było wiadomo, o co mi chodzi to, napisze początek takiej funkcji.

Kopiuj
#include <iostream>
using namespace std;
void Test
edytowany 1x, ostatnio: flowCRANE
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:7 dni
  • Lokalizacja:Szczecin
4

void to typ oznaczający pustkę/nicość. Chodzi o to, że dana funkcja jest de-facto procedurą, a nie funkcją w rozumieniu matematyczno-podobnym, czyli nie zwraca żadnej wartości.


FA
Dzięki za pomoc :) ale właśnie to mi nie za bardzo coś mówi .Może jakiś przykład różnicy Void a inną funkcją w praktyce.
FA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:5
0

Dzięki za pomoc :) ale właśnie to mi nie za bardzo coś mówi .Może jakiś przykład różnicy Void a inną funkcją w praktyce.

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:4946
0

Po prostu funkcja void w momenie swojego wywołania wykonuje kod który jest w jej definicji, a nie zwraca wartość:

Kopiuj
void Test(){
cout << "Hello from void:)";
}
//....
//....
Test(); // -> Hello from void:)

FA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:5
0

A czyli różnica take że nie wprowadza się danych , funkcja wykonuje tylko to co ma w sobie , to chyba rozumiem :) jeżeli nie popraw mnie :D

grski
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 miesięcy
  • Postów:245
0

w dużym, ogromnym uproszczeniu

jak masz funkcję void, to nie będziesz miał w funkcji return - taka funkcja niczego nie zwraca

jak jest jakiś inny typ funkcji, np int to gdzieś tam w kodzie znaleźć się będzie musiało wyrażenie return coś_tam gdzie coś_tam to jakaś zmienna/cokolwiek innego co ma typ int, czyli jest liczbą

ewentualnie czasem domyślnie zwracane jest zero z tego co pamiętam, ale mogę się mylić

ale poza tym, na twoim poziomie, to możesz bezpiecznie założyć, że nie różnią się niczym więcej - wszystko to samo, też możesz wprwoadzać dane itd.


Napisałem książkę - Programowanie z Górskim: Junior Python Developer
Pora na następny krok na drodze po pierwszą pracę w it i WCALE-NIE-MITYCZNE #programista40k? Zapraszam.
edytowany 1x, ostatnio: grski
FA
Po namyśle, doszedłem do wniosku z waszych komentarzy, że void niczego nie zwraca, czyli referencje typu dodawanie liczb itd... nie mogą być jako void, ale na przykład referencje, które zamieniają istniejące liczby pasuje do void i np.: referencje, które wykorzystują istniejące liczby / informacje, ale nie tworzą nowych też mogą być void ?
Patryk27
1. Jak najbardziej w funkcji void może znajdować się return. 2. Funkcje void nic nie zwracają, nawet "czasem".
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:4946
0
falszywyemail napisał(a):

A czyli różnica take że nie wprowadza się danych , funkcja wykonuje tylko to co ma w sobie , to chyba rozumiem :) jeżeli nie popraw mnie :D

O co chodzi z wprowadzaniem danych?


FA
Właśnie pisałem odpowiedz i znów się pogubiłem bo np : [ double kwadrat(double x) ] wpisuje dane czyli x a myślałem że w void tego nie ma a zobaczyłem przykład [ void zamien(double& a, double& b) ] tu też się podaje dane + referencja jest czy coś ale nie wiem czy ma to jakieś znaczenie w tym temacie . więc znowu się pogubiłem :P . Myślałem ze void wygląda tylko tak [ void Test(){ cout << "Hello from void:)"; ] tu danych się nie podaje
FA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:5
0

Właśnie pisałem odpowiedz i znów się pogubiłem bo np :

Kopiuj
double kwadrat(double x)

wpisuje dane czyli x a myślałem że w void tego nie ma a zobaczyłem przykład

Kopiuj
void zamien(double& a, double& b)

tu też się podaje dane + referencja jest czy coś ale nie wiem czy ma to jakieś znaczenie w tym temacie . więc znowu się pogubiłem :P . Myślałem ze void wygląda tylko tak

Kopiuj
void Test(){
cout << "Hello from void:)";

tu danych się nie podaje

edytowany 4x, ostatnio: flowCRANE
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:4946
1
falszywyemail napisał(a):

Właśnie pisałem odpowiedz i znów się pogubiłem bo np : [ double kwadrat(double x) ] wpisuje dane czyli x a myślałem że w void tego nie ma a zobaczyłem przykład [ void zamien(double& a, double& b) ] tu też się podaje dane + referencja jest czy coś ale nie wiem czy ma to jakieś znaczenie w tym temacie . więc znowu się pogubiłem :P . Myślałem ze void wygląda tylko tak [ void Test(){
cout << "Hello from void:)"; ] tu danych się nie podaje

Masz na myśli parametry formalne funkcji, jak void f() - bez parametrów czy void g(int x) z jednym parametrem. To nie ma znaczenia, jak program się wykonuje to "widząc" wywołanie funkcji typu void, wykonuje to co w jej definicji (tak jak przy każdej innej funkcji :)), jak ma ona jakieś parametry formalne to wykonuje odpowiednie przypisania na stosie, i tak dalej; z tą różnicą, że ten kawałek programu nic nie zwraca, coś tam się dzieje i kontynuujemy do kolejnej komendy. W przypadku funkcji która zwraca jakiś obiekt, możemy ją przypisać do zmiennej, czy cokolwiek:

Kopiuj
int inc(int x){
x += 1;
return x;}
//...
//....
x = 0;
int a = inc(x);
cout <<  a ; // 1

W przypadku funkcji void zrobić się tak nie da.


edytowany 1x, ostatnio: lion137
FA
Po namyśle, doszedłem do wniosku z waszych komentarzy, że void niczego nie zwraca, czyli referencje typu dodawanie liczb itd... nie mogą być jako void, ale na przykład referencje, które zamieniają istniejące liczby pasuje do void i np.: referencje, które wykorzystują istniejące liczby / informacje, ale nie tworzą nowych też mogą być void ?
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12175
2

@falszywyemail: dane możesz sobie wprowadzać w dowolnej funkcji. Z void chodzi o to, że taka funkcja nie może zwrócić danych za pomocą return x, gdzie x to jakaś wartość (literał lub identyfikator).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:7 dni
  • Lokalizacja:Szczecin
0

W rozumieniu quasi-matematycznym, funkcja ma parametry (wejścia) i wartość (dla danych argumentów). Np. sin(x), czyli

Kopiuj
double sin(double x)
{
    return /* ... */;
} 

Wartość takiej funkcji możesz np. wypisać:

Kopiuj
std::cout << sin(PI/4);

Z drugiej strony masz procedurę, np. podnieś ramię robota o x cm.

Kopiuj
void robot_raise_arm(int cm)
{
    // ...
}

W tym przypadku ciężko mówić o wartości takiej funkcji, bo jest to po prostu wywołanie procedury.

W wielu językach programowania, w tym C++, różnica między czysto matematycznymi funkcjami bez efektów ubocznych i procedurami jest zatarta lub nie istnieje w ogóle, więc traktuj te przybliżenia jako uproszczenia, a nie pełne i wyczerpujące definicje.


FA
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:5
0

Po namyśle, doszedłem do wniosku z waszych komentarzy, że void niczego nie zwraca, czyli referencje typu dodawanie liczb itd... nie mogą być jako void, ale na przykład referencje, które zamieniają istniejące liczby pasuje do void i np.: referencje, które wykorzystują istniejące liczby / informacje, ale nie tworzą nowych też mogą być void ?

za dożo tych void w tym zdaniu ;p

na tym przykładzie

Kopiuj
void zamien(double& a, double& b)
{
    double tymczasowa(a);      
    a = b;                   
    b = tymczasowa;            

]
edytowany 4x, ostatnio: flowCRANE
NS
  • Rejestracja:ponad 7 lat
  • Ostatnio:dzień
  • Postów:455
0

Pomyśl w taki sposób, że metoda jest jak maszynka do mielenia mięsa.
Coś wkładasz i coś innego wychodzi.

Tak samo w programowaniu: wkładasz jakieś argumenty do metody/funkcji, a ta funkcja mieli te argumenty i wychodzi przemielony produkt.

Metoda void nie zwraca żadnego typu. Mieli mięcho i napycha je do kiszek, ale nic nie zwraca.

Stosuj void jak najrzadziej.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1

@NeutrinoSpinZero: mowa o funkcjach, nie metodach – nie mieszajmy pytaczowi w głowie na chwilę obecną zbędnymi terminami.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
NS
Wybacz - javowe podejście ;)
ytrewq
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:33
3

Też miałem kiedyś problem ze zrozumieniem tej różnicy między funkcjami a procedurami, więc spróbuję napisać, jak w końcu to zrozumiałem.

Zarówno procedura jak i funkcja mogą przyjmować różne parametry w nagłówku, więc tym się nie sugeruj. W obu też możemy tworzyć zmienne (lokalne, niedostępne poza klamrami). Różnica jest taka, że jak już napisano, funkcja zwraca wartość (czyli na końcu ma "return cośtam", gdzie "cośtam" musi być typu takiego, jak funkcja, np int). Procedura nie zwraca wartości, a jedynie wykonuje różne rzeczy. Procedury i funkcje różnia się zarówno w budowie, jak i w tym, jak je wywołujesz. W praktyce to wyobraź sobie procedurę i funkcję, które sumują 2 liczby.

Różnica w budowie:

Kopiuj
void proceduraSumuj(int a, int b)
{
    cout << "Suma wynosi " << a + b;
}
Kopiuj
int funkcjaSumuj(int a, int b)
{
    return a + b;
}

Różnica w wywołaniu:
procedurę void możesz sobie od tak napisać w kodzie:

Kopiuj
int main()
{
    proceduraSumuj(2,2); // wyswietli "Suma wynosi 4";
    return 0;
}

Natomiast gdybyś tak samo wywołał tę funkcję, to w praktyce tak, jakbyś napisał:

Kopiuj
int main()
{
    4;
    return 0;
}

Czyli bez sensu, nie?

Dlatego funkcje przypisujesz do zmiennej albo wrzucasz do couta:

Kopiuj
int main()
{
    int mojaSuma;
    mojaSuma = funkcjaSumuj(2,2);
    
    // albo, jeśli byś chciał uzyskać efekt jak przy procedurze:
    cout << "Suma wynosi: " << funkcjaSumuj(2,2);
    return 0;
}
edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1

Jeśli chodzi o C++, to raczej nie używa się terminu procedura – w tym języku (i wszystkich podobnych składniowo) są po prostu funkcje, zwracające dane w typowym rezultacie, lub nie zwracające w nim danych. Owy void istnieje po to, aby móc tworzyć funkcje nie zwracające danych za pomocą return i aby ujednolicić składnię deklaracji funkcji – nagłówków i ciał. Gdyby voida nie było, to trzeba by inaczej zapisywać nagłówki funkcji zwracających dane w rezultacie, i inaczej tych, które tego nie robią.

Kopiuj
// funkcja zwracająca liczbę
int foo(int a, int b)

// funkcja nie zwracajaca danych poprzez return
foo(int a, int b)  // ?

Jawne procedury natomiast istnieją w innych językach, np. w Pascalu. Składnia jasno określa co jest funkcją, a co procedurą – nagłówek zaczyna się od słówka procedure, albo od function. W funkcji zwraca się dane za pomocą Result, który to nie jest w ogóle dostępny w procedurach. W późniejszych wersjach dialektów (np. Free Pascalu) zunifikowano zapis, dając możliwość wyjścia z procedury za pomocą Exit, a z funkcji za pomocą Exit(wartość).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
vpiotr
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
1

@furious programming: void nie jest potrzebny w C. Nawet deklarowanie typu wyniku. Taki "smaczek".

Kopiuj
#include <stdio.h>
 
 main()
 {    
      int x = 3;
      printf("Square of %d = %d\n", x, square(x));
 }
 
 square(x)
 {    
      int y = 3 * 3;
      return y;
 }

https://ideone.com/JLU7cG

kq
To tylko C89 i pre-standaryzacyjne C
YooSy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:472
1

Nie pisz na priv. Zadaj dobre pytanie na forum.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.