Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

Brak umiejętności tworzenia plików i korzystania z funkcji inline

#1
Brak umiejętności tworzenia plików i korzystania z funkcji inline
Pytanie z książki Grębosza "Symfonia C++ - Standard":
Napisz program składający się z funkcji main i z funkcji druga będących w dwóch różnych plikach.
Następnie napisz definicję funkcji inline o nazwie wieksza, która przyjmuje dwa argumenty typu int, a jako rezultat zwraca większy z nich. Wywołania tej funkcji mają być zarówno z funkcji main, jak i z funkcji druga.
Zrób to na 2 sposoby
1. używając pliku nagłówkowego włączanego dyrektywą #include
2. bez użycia pliku nagłówkowego
--------------------------------------------------------------------------------------------------------------------------

Dobra to tak.
1. Nie wiem jak mam zrobić ten plik nagłówkowy, żeby była końcówka ".h". Może ktoś pokierować?
2. Tutaj też nie bardzo potrafiłem stworzyć projekt z 2 plikami. Stworzyłem 2 projekty i plik "druga" przeniosłem do folderu z plikiem "main" i dopiero wtedy udało mi się stworzyć w jednym projekcie 2 pliki.
Wątpię, że tak to powinienem zrobić - jaka jest inna możliwość? Próbowałem poprzez klikanie na pasku w Code::Blocksie 13.12 klikać "project>add files..." i dodawać, ale tworzyło mi jakby osobne podfoldery w tym projekcie tzn. miałem ogólnie Projekt a w nim "Sources>main" i "druga>druga". No i w tym drugim początkowo było "druga>main", ale też "ręcznie" zmieniłem na druga.

Co do kodu. Napisałem to tak:
main.cpp
Kod:
#include <iostream>

using namespace std;

int wieksza(int jeden, int dwa);
extern int druga(int);
int main()
{

    wieksza(0,0);
    cout << endl;
    druga(0);
}

inline int wieksza(int jeden , int dwa)
{

    cout << "Podaj jeden ";
    cin >> jeden;
    cout << "podaj dwa ";
    cin >> dwa;
    if(jeden > dwa)
    {
    cout << jeden;
    return jeden;
    }

    else
    {
        cout << dwa;
        return dwa;
    }
}
druga.cpp
Kod:
#include <iostream>

using namespace std;

extern int wieksza(int jeden, int dwa);
int druga(int)
{
wieksza(0,0);
}

I tutaj co do tego mam pytanie, czy w odpowiednim miejscu wstawiłem "inline"?
Zastanawiam się, czy może nie powinienem wstawić w int main przed "wieksza(0,0);".
 System operacyjny: windows_seven Przeglądarka: chrome
#2
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Dobra. Poradziłem sobie już z tym tworzeniem pliku. Trzeba dać empty file i zmienić rozszerzenie albo .cpp albo .h i potem wyskoczy okienko z pytaniem, czy dodać do projektu. Także to już wyjaśnione. Zrobiłem w takim razie też podpunkt 1:

druga.cpp
Kod:
#include <iostream>
#include "naglowek.h"

using namespace std;


int druga(int)
{
wieksza(0,0);
}
main.cpp
Kod:
#include <iostream>
#include "naglowek.h"

using namespace std;



int main()
{

    wieksza(0,0);
    cout << endl;
    druga(0);
}

inline int wieksza(int jeden , int dwa)
{

    cout << "Podaj jeden ";
    cin >> jeden;
    cout << "podaj dwa ";
    cin >> dwa;
    if(jeden > dwa)
    {
    cout << jeden;
    return jeden;
    }

    else
    {
        cout << dwa;
        return dwa;
    }
}
naglowek.h
Kod:
extern int wieksza(int jeden, int dwa);
extern int druga(int);

Dobrze?
 System operacyjny: windows_seven Przeglądarka: chrome
#3
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Nie dobrze. Funkcja z przedrostkiem inline powinna być naprawdę krótka (jak sugeruje nazwa):
Kod:
inline int wieksza(int a, int b)
{
    return (a > b ? a : b);
}
Albo
Kod:
inline int wieksza(int a, int b)
{
    if (a > b)
        return a;
    return b;
}
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#4
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Ale masz na myśli, że wstawiłem ją w nieodpowiednim miejscu, czy że źle napisałem funkcję(skoro mam użyć inline)?

Jeśli pierwsza opcja, to czy może powinienem ją wstawić w main.cpp przed:
Kod:
wieksza(0,0);
?
 System operacyjny: windows_seven Przeglądarka: chrome
#5
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Źle napisałeś tę funkcję (ona ma nie wczytywać dwóch liczb, tylko zwrócić większą z nich, które przekazano w parametrach).
 System operacyjny: linux_ubuntu Przeglądarka: firefox
#6
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
(30.05.2015, 15:39)Szachista napisał(a): Nie dobrze. Funkcja z przedrostkiem inline powinna być naprawdę krótka (jak sugeruje nazwa):

Nie tyle krótka, co prosta. (Funkcje ogólnie powinny być w miarę możliwości krótkie)
Powinna być tez widoczna w trakcie kompilacji cała inaczej nie będzie ona za bardzo inlinowa.
dlatego tworzenie w osobnym pliku cpp funkcji inline jest bezsensowne, gdyż kompilator jej nie widzi i nie może wstawić bezpośrednio w kod.
 System operacyjny: windows_seven Przeglądarka: firefox
#7
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Wiem o tym, że inline powinno być krótkie, jednakże nie rozumiem czemu, ale mniejsza już z tym.
Ogólnie nie chce przypisać konkretnych wartości do argumentów funkcji, bo to znacznie upraszcza program, dlatego chcę, by w programie samemu podawać te parametry, ale coś mi to teraz nie śmiga. Błąd wywala w druga.cpp, że niby a,b są niezdefiniowane, a przecież zrobiłem to w pliku nagłówkowym:

main.cpp
Kod:
#include <iostream>
#include "naglowek.h"

using namespace std;



int main()
{
    int a,b;
    cout << "Podaj a ";
    cin >> a;
    cout << "podaj b ";
    cin >> b;
    wieksza(a,b);
    cout << wieksza (a,b) << endl;
    druga();
    cout << druga() << endl;
}

inline int wieksza(int jeden , int dwa)
{
return (jeden > dwa ? jeden : dwa);
}

druga.cpp
Kod:
#include <iostream>
#include "naglowek.h"

using namespace std;


int druga()
{
wieksza(a,b);   //tu wywala błąd
}

naglowek.h
Kod:
extern int wieksza(int jeden, int dwa);
extern int druga();

extern int a,b;

Jak to zrobić, by te argumenty w funkcji wieksza w pliku druga.cpp były znane z programu main.cpp, które podaje podczas uruchomienia programu?

Dobra, wrzuciłem
int a,b;
przed funkcję int main ()
i teraz się kompiluje ale wyskakują śmieci.

A nie - dobrze już jest. Działa. Może być tak jak tu napisałem? Z tym, że właśnie int a,b; przed funkcję, by było globalnie?
 System operacyjny: windows_seven Przeglądarka: chrome
#8
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Nie - ty tam (w pliku nagłówkowym) zadeklarowałeś, że są gdzieś zdefiniowane globalne zmienne a i b (ogólnie programy na zmiennych globalnych nie powinno się pisać - zmienne globalne tylko w wyjątkowych sytuacjach!), ale nigdzie ich nie zadeklarowałeś (te w funkcji main to zmienne lokalne)
 System operacyjny: windows_seven Przeglądarka: firefox
#9
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Tak, tak -rozumiem te nazewnictwo, nawet jak formułowałem pytanie, to myślałem, czy by to dokładniej(tak jak Ty piszesz) nie ponazywać, ale napisałem, by było szybciej.
Pomijając nazewnictwo i to, że nie powinno się globalnych zmiennych robić(z czasem się nauczę, ale póki co piszę proste programy, więc moim głównym celem jest to, by działały tak jak tego oczekuję) to czy program jest teraz zgodny z treścią polecenia?
Tak jak już pisałem, zmienne a,b wrzuciłem jako globalne i program teraz działa, więc wydaje mi się, że jest ok. Hmm?
 System operacyjny: windows_seven Przeglądarka: chrome
#10
RE: Brak umiejętności tworzenia plików i korzystania z funkcji inline
Pomijając błąd, że deklarujesz, że funkcja coś zwraca, a nie zwracasz nic, to chyba jest dobrze. Dodatkowo - pewnych rzeczy ucz się od razu, później będziesz miał problemy, jak kod będzie w wielu plikach i zmienne zaczną się przysłaniać i nadpisywać, że o dostępie z różnych wątków już nie wspomnę. Wiem - ewentualnie pieśń przyszłości, ale wiesz jak trudno odzwyczaić się od złych nawyków?

Np robienia bałaganu w kodzie, deklarujesz, że funkcja zwraca int i nic nie zwracasz.
 System operacyjny: windows_seven Przeglądarka: firefox
Programy: Polecane / Nowe / Inne




Podobne wątki (Brak umiejętności tworzenia plików i korzystania z funkcji inline)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Wykres Funkcji w Javie wanhelsing 4 13947 17.02.2018, 22:27
Ostatni post: wanhelsing
  Nauka tworzenia aplikacji w Android Studio- książka do wyboru. raxer 2 11762 11.04.2017, 15:12
Ostatni post: raxer
  VisualBasic - tablicowanie wartości funkcji . samanta19 2 10224 20.01.2017, 01:01
Ostatni post: samanta19

Skocz do: