Symfonia C++ Problem z jednym programem

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" ;



}

nie jestem pewny ale czy czasami nie trzeba wywolac polecenia

system(“pause”), ??

powoduje ono czekanie na nacisniecie klawisza.

niektorzy jednak uwazaja je za zle bo dziala tylko pod windowsem.

ale nic innego mi nie przychodzi do głowy

edit:

tzreba dolączyc jeszcze nagłówek cstdlib

jak sie pomylilem to niech ktos poprawi.

tez dopiero co sie ucze C++

musi jakieś być rozwiązanie bo w książce błędu na pewno niema

W książce nie, ale w tym co przepisałeś są.

  1. Nie tylko

  2. int main a nie main.

Jeśli chcesz aby Ci się nie wyłączał po wyświetleniu przeliczenia, to dodaj przed } funkcji main system(“PAUSE”); .

Ale to rozwiązanie tylko dla windowsa. Powinieneś uruchamiać program z konsoli (Windows: Start->Uruchom wpisać cmd i nacisnąć enter).

Fiołek nie wprowadzaj go w błąd z tym iostream’em! Tak powinien wyglądać kod:

w ksiazce jak byk jest napisane main() a nie int main()

jak tak robie to wyskakuje mi taki blad

C:\Program Files\Microsoft Visual Studio\MyProjects\02\main.cpp(17) : error C2065: ‘getchar’ : undeclared identifier

  1. 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.

  2. domyślnym typem zwracanym jest int. Nie ma błędu, powinno być ostrzeżenie kompilatora.

  3. 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ł… :?

wiec co nalezy zrobic zeby zatrzymac program i zobaczyc wynik ?

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.

to jest pierwszy program który jest w książce, wiec pętla while chyba nie może być bo jest ona w dalszej części książki.

W takim razie w książce jest błąd.

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ś.

  1. 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?

  2. Przeczytaj temat od początku do końca zwracając uwagę na to kto się wypowiada.

o to obrazek z ksiazki

http://img339.imageshack.us/my.php?image=skanuj0006ok1.jpg

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)

Porównaj:

http://www.cplusplus.com/reference/clib … tchar.html

z:

http://www.cplusplus.com/reference/iostream/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. :slight_smile:

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.

  1. 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.
  1. 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.

  2. 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.

Gdzieś w jakimś kursie widziałem że jeśli się doda

a na końcu

getch();

to powinno wstrzymać na końcu program.

#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();


}

A jak zrobiłem coś takiego to program mi sie zatrzymuje, ale po podaniu zmiennej stopy, a nie tak jak ja chcę na końcu 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ę.

Dobra Ryan, że tak powiem - wygrałeś :wink:

Zaprawdę dziwny jest ten C++, ale warty nauki.

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.

Zamieszczę moją “Złotą Myśl”

Pobrałem Dev C++

i wg. zaleceń Presto

dałem taki kod

#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 :stuck_out_tongue:

Gdzie można o tym znaleźć więcej informacji żeby wiedzieć co się robi i dlaczego - i żeby to robić :slight_smile:

Wiedzą nabywa się pisząc programy, na błędach. :wink: