Zakończenie działania funkcji

dział ogólny

Zakończenie działania funkcji

Nowy postprzez Miroo_007 » czwartek, 12 marca 2009, 19:34

Mam taki kod
Kod: Zaznacz cały
void funkcja(int i) {
   if(i < 0) {
     // Jak zakończyć działanie funkcji w tym miejscu?     
   }
   else {...}
   //...
}
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez usermaw » czwartek, 12 marca 2009, 20:03

A nie mozesz zmienin definicji na np: if( i >= 0)
i tylko tyle, wtedy "zakonczysz" funkcje, bo dla i<0 nic sie nie wykona
Avatar użytkownika
usermaw
Homos antropiczny
Homos antropiczny
 
Posty: 55
Dołączył(a): piątek, 2 stycznia 2009, 20:43
Podziękował : 2
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Cyfrowy Baron » czwartek, 12 marca 2009, 20:16

Działanie funkcji przerywa się wyrażeniem return

Kod: Zaznacz cały
    void funkcja(int i)
    {
       if(i < 0)
       {
         return;
       }
       else
      {
        ;
      }
    }



Category
Statements
Syntax

Kod: Zaznacz cały
return [ <expression> ] ;

Description
Use the return statement to exit from the current function back to the calling routine, optionally returning a value.

Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Miroo_007 » czwartek, 12 marca 2009, 20:32

Ale funkcja nic nie zwraca, więc nie może mieć instrukcji return.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Corvis » czwartek, 12 marca 2009, 20:33

oczywiście, że może zobacz co Baron wkleił
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Miroo_007 » czwartek, 12 marca 2009, 20:49

OK. To ja jestem starej daty. W książce Symfonia C++ pisze wyraźnie, że funkcja, która nic nie zwraca nie może mieć instrukcji return. No ale to wydanie jest z roku 1999...
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Cyfrowy Baron » czwartek, 12 marca 2009, 21:06

To czy wyrażenie return coś zwraca, czy nie zależy od typu funkcji. Funkcja void jest typem pustym, więc nic nie zwraca, gdybyś jednak stworzył np. funkcję typu AnisString, wtedy wyrażenie return musiałoby zwrócić dokładnie taki typ:

Kod: Zaznacz cały
void Funkcja(int x)
{
    [...]
   return;
}

AnsiString Funkcja(int x)
{
   String result;
    [...]
   return result;
}

int Funkcja(int x)
{
   int result;
    [...]
   return result;
}

BOOL funkcja(int x)
{
  bool result;
    [...]
   return result;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Miroo_007 » czwartek, 12 marca 2009, 21:08

Ja doskonale o tym wiem. Tylko chodzi mi o funkcję, która nie zwraca niczego. Myślałem, że jest jakaś inna instrukcja do tego celu przeznaczona. Ale próbowałem swego czasu również tak:
Kod: Zaznacz cały
void funkcja(void) {
  return;
}

Ale Borland C++ Builder wywala błąd. Teraz nie jestem wstanie sprawdzić tego ponieważ jestem w pracy.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez polymorphism » czwartek, 12 marca 2009, 21:46

No to coś źle próbowałeś, bo ta konstrukcja jest poprawna.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Witold » czwartek, 12 marca 2009, 23:52

Miroo_007 napisał(a):W książce Symfonia C++ pisze wyraźnie, że funkcja, która nic nie zwraca nie może mieć instrukcji return. No ale to wydanie jest z roku 1999...


Możesz podać stronę/zacytować ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Miroo_007 » piątek, 13 marca 2009, 00:55

Tom I, str. 80. Wydanie z roku 1999.
Dodam jeszcze, że jest przecież inne rozwiązanie tej sytuacji. Za pomocą instrukcji throw.
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Witold » piątek, 13 marca 2009, 11:04

Miroo_007 napisał(a):Tom I, str. 80. Wydanie z roku 1999.


Symfonia c++ str. 80, fragment napisał(a):...
Skoro więc takie wywołanie jest wyrażeniem mającym jakoś wartość, to można go użyć w innych większych wyrażeniach. Przykładowo

7 + 1.5 + potega(2,2) + 100

odpowiada u nas wyrażeniu

7 + 1.5 + 4 + 100

Jeżeli funkcja jest zadeklarowana jako zwracająca typ void – czyli nie zwracająca niczego – a my, przez nieuwagę, użyjemy ją w takim wyrażeniu, to kompilator ostrzeże nas, że popełniliśmy błąd. To jedna z wielu zalet obowiązkowych deklaracji funkcji. Także, gdybyśmy wewnątrz definicji takiej funkcji obok słowa return postawili coś oprócz średnika

return 6; // błąd, gdy f-cja zwraca void

to kompilator wykryje błąd. Mieliśmy bowiem nic nie zwracać, a zwracamy ? Także odwrotnie: jeżeli zadeklarowaliśmy, że funkcja ma coś zwracać, a przy słowie return stoi sam średnik, kompilator uzna to za nasz błąd. Obiecywałeś, że coś tu będzie, a nie ma ? Pewnie o czymś zapomniałeś!


Gdzie tu jest napisane (wyraźnie), że : "że funkcja, która nic nie zwraca nie może mieć instrukcji return." ?
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez polymorphism » piątek, 13 marca 2009, 12:00

Dodam jeszcze, że jest przecież inne rozwiązanie tej sytuacji. Za pomocą instrukcji throw.

Rzucanie wyjątków to nie jest metoda wychodzenia z funkcji w przypadku, gdy wszytko jest OK. Jak sama nazwa mówi, wyjątek rzucasz tylko wtedy, gdy zaistnieje jakaś sytuacja wyjątkowa (np. parametry funkcji nie spełniają z góry ustalonych założeń).

Wyjątki to jeden z mechanizmów sygnalizowania błędów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez wargo » piątek, 13 marca 2009, 14:31

Jeśli jest samo "return" bez treści to tak jakby nic nie zwracało ;)
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Zakończenie działania funkcji

Nowy postprzez Cyfrowy Baron » sobota, 14 marca 2009, 10:03

Kod: Zaznacz cały
void funkcja(void) {
  return;
}


Ta funkcja jest poprawna. Popełniasz gdzieś błąd. Tak zadeklarowana funkcja jest funkcją globalną, bez przynależności do klasy, więc wszelki kod wywołujący tą funkcję musi znajdować się pod kodem funkcji a nie nad nim, przykłady:

BŁĘDNE WYWOŁANIE FUNKCJI:
Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  funkcja();
}
//---------------------------------------------------------------
void funkcja(void)
{
  return;
}


PRAWIDŁOWO WYWOŁANA FUNKCJA:
Kod: Zaznacz cały
void funkcja(void)
{
  return;
}
//---------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  funkcja();
}



Gdy piszesz, że kompilator zgłasza błąd, to podawaj treść tego błędu.

Poczytaj sobie: ► patrz serwis: Cyfrowy Baron dział: teoria:
  • Funkcje ogólne
  • Funkcje





Jeżeli chcesz mieć dostęp do funkcji niezależnie od jej umiejscowienia w kodzie, to stwórz funkcję prywatną lub publiczną, czyli najpierw zadeklaruj funkcje w sekcji private lub public pliku nagłówkowego (*.H), a następnie zdefiniuj ją w pliku źródłowym (*.CPP), przypisując ją do klasy formularza:



Plik nagłówkowy (np. Unit1.h):
Kod: Zaznacz cały
  private:

  public:
           void funkcja(void);




Plik źródłowy (np. Unit1.cpp):
Kod: Zaznacz cały
/* zwracam uwagę na TForm1:: - nazwa klasy formularza, jeżeli klasa formularza nosi nazwę TMainForm to wpisujesz odpowiednio TMainForm:: */
void TForm1::funkcja(void)
{
   return;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości