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

Rozdział 28 - osadzenie funkcji wewnątrz innej funkcji

Ostatnio zmodyfikowano 2017-02-23 15:10
Autor Wiadomość
e5500
Temat założony przez niniejszego użytkownika
Rozdział 28 - osadzenie funkcji wewnątrz innej funkcji
» 2017-02-23 02:53:15
Witam! Rozwiązałem zadanie po rozdziale 28 i spostrzegłem, że struktura napisanego kodu aż prosi się o wykorzystanie funkcji. Kod przedstawia się tak:

C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik = sTekst;
   
    size_t znalezionaPozycja = sWynik.find( "  " );
    do
    {
        sWynik.erase( znalezionaPozycja, 1 );
        znalezionaPozycja = sWynik.find( "  ", znalezionaPozycja );
    } while( znalezionaPozycja != std::string::npos );
   
   
    znalezionaPozycja = sWynik.find( "<" );
    do
    {
        sWynik.erase( znalezionaPozycja, 1 );
        sWynik.insert( znalezionaPozycja, "[" );
        znalezionaPozycja = sWynik.find( "<", znalezionaPozycja );
    } while( znalezionaPozycja != std::string::npos );
   
    znalezionaPozycja = sWynik.find( ">" );
    do
    {
        sWynik.erase( znalezionaPozycja, 1 );
        sWynik.insert( znalezionaPozycja, "]" );
        znalezionaPozycja = sWynik.find( ">", znalezionaPozycja );
    } while( znalezionaPozycja != std::string::npos );
   
    return sWynik;
}

int main()
{
    std::string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    std::cout << tekst << std::endl;
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}

Jednakże nie jestem w stanie (co jest w pełni zrozumiałe) uzyskać komunikacji między funkcją konwertuj, a hipotetycznie napisaną funkcją zamień. Kompilator wyświetla błąd informujący, że funkcja nie została zadeklarowana w danym zakresie. Co powinienem zrobić? Wpisać ją na "wewnątrz" funkcji konwertuj?
P-158148
carlosmay
» 2017-02-23 06:02:56
Wklej kod, którego dotyczy problem.
Jeśli kompilator mówi, że funkcja jest niezadeklarowana, to tak jest (przynajmniej w miejscu, w którym chcesz użyć tej funkcji).
Wszystko czego chcesz użyć musi być już znane w miejscu użycia.
P-158151
pekfos
» 2017-02-23 11:10:16
Jednakże nie jestem w stanie (co jest w pełni zrozumiałe) uzyskać komunikacji między funkcją konwertuj
???
Czyli jest w pełni zrozumiałe dla ciebie, dlaczego nie możesz tego zrobić? Po co wtedy ten temat..?

funkcja nie została zadeklarowana w danym zakresie. Co powinienem zrobić? Wpisać ją na "wewnątrz" funkcji konwertuj?
To że nie ma funkcji w danym zakresie, nie znaczy, że masz ją wpisać do dokładnie tego zakresu, tj zakresu widoczności nazw funkcji konwertuj(). Nazwy pojawiają się i znikają wraz z analizowaniem kodu od góry do dołu. Jeśli coś jest niezadeklarowane, to znaczy że kompilator o tym jeszcze nie słyszał, idąc od góry do dołu, i widząc użycie tej nazwy, nie ma pojęcia co z tym zrobić.
P-158156
latajacaryba
» 2017-02-23 13:33:12
Moi przedmówcy już Ci odpowiedzieli, ale ja tylko dodam, że:
Wpisać ją na "wewnątrz" funkcji konwertuj?
Nie można definiować jednej funkcji wewnątrz drugiej jeśli o to Ci chodziło.
P-158161
e5500
Temat założony przez niniejszego użytkownika
» 2017-02-23 15:10:18
Wpis pekfos nakierował mnie na właściwi błąd. Funkcję zamien definiowałem po funkcji konwertuj i dlatego była ona "not declared in this scope".
Udało mi się znaleźć prawidłowe rozwiązanie. Oto ono:
C/C++
#include <iostream>
#include <string>

std::string zamien( std::string & sTekst, std::string szukanySymbol, std::string wpisywanySymbol )
{
    size_t znalezionaPozycja = sTekst.find( szukanySymbol );
    do
    {
        sTekst.erase( znalezionaPozycja, 1 );
        sTekst.insert( znalezionaPozycja, wpisywanySymbol );
        znalezionaPozycja = sTekst.find( szukanySymbol, znalezionaPozycja );
    } while( znalezionaPozycja != std::string::npos );
   
    return sTekst;
}

std::string konwertuj( std::string & sTekst )
{
    zamien( sTekst, "<", "[" );
    zamien( sTekst, ">", "]" );
   
    size_t znalezionaPozycja = sTekst.find( "  " );
    do
    {
        sTekst.erase( znalezionaPozycja, 1 );
        znalezionaPozycja = sTekst.find( "  ", znalezionaPozycja );
    } while( znalezionaPozycja != std::string::npos );
   
    return sTekst;
}

int main()
{
    std::string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    std::cout << tekst << std::endl;
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}

Wszystkim serdecznie dziękuję :)
P-158170
« 1 »
  Strona 1 z 1