Kupilem Symfonie C++ i mam pewien problem, przepisuje kod w calosci identycznie jak w ksiazce. Program ma zamienic wysokosc w stopach na metry. Gdy podaje wysokosc w metrach i naciskam enter to nawet nie zdążę zobaczyc wyniku bo sie wyłącza. Jest to jeden z pierwszych programow.
o to kod
#include
main()
{
int stopy ;
float metry ;
float przelicznik = 0.3 ;
cout <<"Podaj wysokosc w stopach:" ;
cin >> stopy ;
metry = stopy * przelicznik ;
cout <<"/n";
cout << stopy <<" stop to jest : "
<< metry <<"metrow/n" ;
}
Większość kompilatorów posiada iostream.h który dołącza iostream. Nie ma większego powodu do zmiany. Gdyby plik nie istniał, kompilator zdłosiłby błąd.
domyślnym typem zwracanym jest int. Nie ma błędu, powinno być ostrzeżenie kompilatora.
Skoro program działał ale się po uruchomieniu wyłączał, to znaczy, że był napisany poprawnie semantycznie a problem leżał w innym miejscu. Tutaj: cmd bez /k. Wciąż nie rozumiem dlaczego w odpowiedzi na postawione pytania tak często pojawiają się rzeczy niezwiązane bez wyraźnego zaznaczenia, że to tylko sugestia a nie wymóg, by program działał… :?
Oczywiście, że tak, bo getchar w iostream nie ma. Zamień te dwie linie sugerowane przez Viona:
getchar(); //konsolka zatrzymuje program
getchar(); //konsolka definitywnie stopuje program i czeka na wciśnięcie klawisza (takie małe niedociągnięcie polecenia "getchar")
Na tą:
while (cin.get() != '\n');
Vion, o jakim niedociągnięciu getchar mówisz? Odnoszę wrażenie, że jedynie niewłaściwie tej funkcji używasz…
Złączono Posta: 21.08.2007 (Wto) 13:06
I jeszcze jedno:
windows+r
cmd [wciśnij enter]
i pobawcie się konsolą. Plus: używajcie opcji szukaj. To pytanie pojawia się dwudziesty raz.
Mój kod sprawdzałem w środowisku Dev C++. Mogę Cię tylko zapewnić, że na nim program działa poprawnie. Polecam zmianę kompilatora na Borlanda lub Dev’a. Poza tym czytać, czytać i jeszcze raz czytać kod i samemu starać się go zrozumieć.
P.S. Taka mała uwaga do Ryana. Widać, że początkujący w C++ nie jesteś.
Jeśli getchara nie ma w iostreamie to w jaki sposób program (którego kod zamieściłem powyżej) mi się poprawnie kompiluje, linkuje, uruchamia i kończy?
Przeczytaj temat od początku do końca zwracając uwagę na to kto się wypowiada.
Nie jest. Warto posiadać wiedzę na temat tego, z czego się instruuje innych. Ech… Kompilatory często oszukują. W standardzie C z 1990 (C90) domyślnym typem zwracanym przez funkcję jest int. Wiele kompilatorów do dziś stosuje domyślny typ zwracany mimo iż standard C99 jak i wszystkie wersje standardu C++ mówią, że typ zwracany ma być podany explicite.
Środowisko uruchomieniowe Cię może oszukiwać dodając “domyślnie” jakąś bibliotekę i plik nagłówkowy. Albo jest sto innych powodów. Nie zmienia to faktu, że getchar jest częścią C a nie C++ a zatem stanowi część standardowych bibliotek C (tutaj: stdio) a nie C++ (np. iostream)
Pardon, że źle przypisałem sugestię z getchar. Nie zmiania to faktu, że jest błędna a Ty nie odpowiedziałeś dlaczego Twoim zdaniem getchar nie działa prawidłowo.
Ja bym powiedział, że jednak jest, gdyż mam dostęp do najświeższej wersji Symfonii (Standard) i specjalnie zajrzałem do kodu tego samego programu. Autor zamieścił tam formę z “int”. W każdym razie zawsze uczyli mnie wypisywać maina z “intidżerem”.
Szczerze powiedziawszy - nie wiem… Jak się uczyłem to pamiętam, że do niektórych programów musiałem dodawać kolejnego getchara, bo program nie chciał stopować po jednym. Wyżej wymieniony program jest takim przykładem. W każdym razie Borland przepuszcza Getchara w bibliotece , tak samo jest z Dev’em.
Ok, pobrałem DevCpp 4.9.9.2 i wypróbowałem Twój kod.
DevCpp pozwala na załączenie iostream.h Zawartość pliku nagłówkowego bez komentarzy o licencji GPL (wybaczcie autorzy):
#ifndef _BACKWARD_IOSTREAM_H
#define _BACKWARD_IOSTREAM_H 1
#include “backward_warning.h”
#include
using std::iostream;
using std::ostream;
using std::istream;
using std::ios;
using std::streambuf;
using std::cout;
using std::cin;
using std::cerr;
using std::clog;
#ifdef _GLIBCXX_USE_WCHAR_T
using std::wcout;
using std::wcin;
using std::wcerr;
using std::wclog;
#endif
using std::ws;
using std::endl;
using std::ends;
using std::flush;
#endif
// Local Variables:
// mode:C++
// End:
Plik ten oznaczony jest jednak jako deprecated (o tym dalej) i nie powinien być używany. 2. iostream ładuje c++config.h oraz istream i ostream. Wygląda na to, że GGC w wersji 3.4.2 dołącza stdio dla uzyskania kilku stałych:
#include // For SEEK_SET, SEEK_CUR, SEEK_END, BUFSIZ
Efektem ubocznym jest dostępność getchar(). Nie powinno się na tym polegać, gdyż jest to nieudokumentowany efekt uboczny takiej a nie innej konstrukcji plików nagłówkowych a nie część standardu. Innymi słowy: działa ten kod u Ciebie, bo ktoś popełnił błąd. Nie oczekuj, że tak napisany kod będzie się kompilował przy użyciu innego kompilatora, w tym nowszej wersji GCC (będącej częścią MinGW, które jest częścią DevC++). Co więcej wersja kompilatora z mojego DevC++ jest mądrzejsza i nie pozwala na bezkarne używanie błędnych plików nagłówkowych z 3.4.2 komunikując to ostrzeżeniem:
D:/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated.
Grębosz w różnych wydaniach swojej książki poprawiał stopniowo różne błędy. Nie można wykluczać, że pierwotnie polegał na standardzie C90.
Nie zastanawiało Cię nigdy dlaczego getchar nie stopuje programu? Odpowiedź jest prosta: bo bufor klawiatury zawiera jakiś znak pozostawiony przy poprzednim odczycie znaków. Nie można winić getchar za błędną konstrukcję programu.
Litości. Vion, przeczytaj kilka ostatnich tematów na forum. Nie łącz iostream i conio. conio jest dostępne wyłącznie w środowiskach Borlanda, nie jest standardem i jeśli nie wiesz co robisz i dlaczego to robisz - nie rób tego. Nie używaj zatem conio, zaoszczędzisz sobie i innym czasu i wyświadczysz sobie przysługę.
Osobiście temat mi pomógł się czegoś dowiedzieć. Wątpię jednak czy autor tematu zrozumiał coś z tej burzy mózgów.
Jest dużo osób co ściągną jakieś środowisko, kupią jakąś książkę, przepiszą z niej kod, skompilują i jak program poprawnie działa to natychmiast piszą nowe tematy na forum z zapytaniem jak zrobić grę itp.
#include /*można użyć takiej biblioteczki (nie trzeba wpisywać potem using namespace itd)*/
int main()
{
int stopy;
float metry;
float przelicznik = 0.3;
cout<<"Podaj wysokosc w stopach: ";
cin>>stopy;
metry = stopy * przelicznik;
cout<<"Stop to jest: "
<
getchar(); //konsolka zatrzymuje program
getchar(); //konsolka definitywnie stopuje program i czeka na wciśnięcie klawisza (takie małe niedociągnięcie polecenia "getchar")
return 0; //program zakończył się poprawnie
}
Teraz program zatrzymuje się na końcu, i jest OK Ale jeśli dam tak
#include
#include
int main()
{
int stopy;
float metry;
float przelicznik = 0.3 ;
cout<<"Podaj wysokosc w stopach: ";
cin>>stopy;
metry = stopy * przelicznik;
cout<<"Stop to jest: "
<
getch();
}
To programik też zatrzymuje się na końcu.
tak wiec moje pytanie
Gdzie można o tym znaleźć więcej informacji żeby wiedzieć co się robi i dlaczego - i żeby to robić