Margal Opublikowano 19 Kwietnia 2011 Zgłoś Opublikowano 19 Kwietnia 2011 Zainspirowany kopalnią informacji ze strony Constants - C++ Documentation zrobiłem sobie eksperyment pt. jak to w C++ można wypisywać dane na ekran i, przyznaję, że wynik tegoż był dla mnie niezrozumiały. Oto kod: Ideone.com | OCu9J Co najdziwniejsze, na mojej konsoli (Ubuntu, jeśli to coś zmienia), wynik różni się od tego, co wypluł ideone. Jest on taki: 2147483647 12df 10 0x8048d8c28 asdf asdf 1.01235e+14 asdfjkl; a - Pastebin.com Spróbowałem najpierw prześledzić to, co pojawiło mi się w terminalu z tym, co jest w kodzie. Wers pierwszy, zrozumiały, wypisało zmienną a i złamało linię. Wers drugi: powinno wypisać asdf wg kodu, a następnie dać tam znak '\r', który, podług wikipedii, jest inną metodą łamania linii. Tymczasem "asdf\r" ominęło zupełnie, wypisując od razu 12 (jak rozumiem wynik #define ujujujujuj 12), ale przecież potem jest 2x endl! Linii tymczasem nie złamało nawet raz, wypisując za to na końcu df - i dopiero potem mamy oczekiwane podwójne złamanie linii. Na oko dokładnie tak jakby najpierw napisało asdf, potem cofnęło się do początku wiersza, pisząc tą dwunastkę zamiast dwóch pierwszych liter asdf, potem jednakże przesunęło się znów aż do końca wiersza (no bo te podwójne \n wstawiło za, a nie przed df). Wers czwarty: najpierw, jak rozumiem, wypisało wartość zmiennej c, zmieniwszy ją z sytemu ósemkowego na dziesiętny. Dalej mamy grzecznie tabulator, po którym jednak następuje coś, czego totalnie nie pojmuję. Zamiast wypisać asdfasdfdafsdfasdąę, a potem dwie linijki puste w wyniku potrójnego \n, otrzymujemy przedziwne 0x8048d8c, potem, po zignorowanieu \n\n\n, wartość zmiennej d przepisaną na system dziesiętny, czyli 28. Podejrzewam, że problemy z wypisaniem są wywołane przez polskie znaki ąę, ale przecież dałem tam L"ąę"? W tutorialu stoi jak byk: "Wide characters are used mainly to represent non-English or exotic character sets." a przecież polskie znaki to chyba jest "non-English character set"? Mniemałem więc, że będzie działać poprawnie. Wers szósty: Jak rozumiem, po wypisaniu powyżej obu \n\n, w wersie tym przeszło do wypisywania pierwszego z dwóch asdf-ów oddzielonych tablulatorem pionowym. Wers siódmy: jeśli założymy, że \v zachowuje się dokładnie tak samo, jakbym napisał \n\t, to ma to sens. Będzie to po prostu drugi z asdf-ów. Wers dziesiąty: oddzielony trzema \n-ami, jak być powinno, następnie wypisał wartość zmiennej e w notacji wykładniczej oczywiście, następnie, po oddzieleniu tego za pomocą tabulatora wypisał stringa f, po czym, oddzielając to kolejnym tabulatorem, wypisał wartość stringa g (co ma sens, jeśli przyjmiemy, że przy kontynuowaniu stringa z poprzedniej linijki zakończonej znakiem '\' białe znaki z początku następnej linijki jak najbardziej się do tego stringa wliczają). Następnie wstawił grzecznie jeszcze jednego tabulatora i... znów zamienił L"ąęćźóżłńś" na 0x8048df8. O dziwo, w przeciwieństwie do podobnej sytuacji z linijki czwartej tym razem raczył wypisać następujące po tym dziwadle "\n\n". Linijka 12: no to mamy konwencję ramową, bo nie mam pytań ani do linijki pierwszej, ani do dwunastej. Po prostu wypisał wartość zmiennej b, dając następnie ostatni w kodzie literał. Tymczasem oto, co zrobił ideone: Linijka druga: napisał całe asdf, potem kwadracik (tak jakby nie wiedział, co to \r, ale linię jednak potem złamał). Linijka trzecia: tu nie mam pytań, ta dwunastka i następujące po niej podwójne endl Linijka piąta: zgadza się z terminalem, ale niepojętym dla mnie jest, czemu w terminalu napisał 0x8048d8c, a ideone 0x8048e90? Może te wartości generowane są losowo? Linijka szósta: Wygląda, jakby totalnie zignorował znak \v? I na koniec linijka dziesiąta: zamienił 0x8048df8 na 0x8048eec. wtf? ocb? thx. <==trójznak paradise;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MaciekCi Opublikowano 19 Kwietnia 2011 Zgłoś Opublikowano 19 Kwietnia 2011 (edytowane) Sorry, ale tak nie składnie to napisałeś, że jestem w stanie czytać co drugi wiersz. Ogólnie Twój problem polega na tym, że zastanawiasz się, skąd tak różne wyniki ? Dużym prawdopodobieństwem jest kompilator, zwróć uwagę, że na ideaone jest gcc-4.3.4, który jest ... specyficzny... Akurat mam (nie)przyjemność pracować ze SPOJem i czasem magiczne rzeczy się dzieją w zależności od kompilatora. Na ubuntu z czego korzystasz ? Jeszcze tylko dodam, że : 1.Linijka piąta: zgadza się z terminalem, ale niepojętym dla mnie jest, czemu w terminalu napisał 0x8048d8c, a ideone 0x8048e90? Może te wartości generowane są losowo? 2.Linijka druga: napisał całe asdf, potem kwadracik (tak jakby nie wiedział, co to \r, ale linię jednak potem złamał). 1.U mnie jest 0x8048e4028. ;) Jest to adres w pamięci, więc tak, w pewnym sensie jest to "losowe" i akurat tu nic nie zmienisz. :) 2. "\r" to w ogólności powrót karetki, na gcc-4.3.4 działa jak "Enter" (stąd ten śmieszny znaczek nowej linii) a nie jako załamanie linii, tym się właśnie różni od "\n". "\r" ma działać jak Enter, niby nowa linia, ale ustawia się na początku, w przypadku ideaone "\r" działa jak "Enter", czyli jak "\n" plus znak na końcu . W Visualu i u Ciebie "\r" ustawia po prostu na początku bieżącej linii, co ma większy sens. ;) Edytowane 19 Kwietnia 2011 przez MaciekCi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Quad Opublikowano 20 Kwietnia 2011 Zgłoś Opublikowano 20 Kwietnia 2011 Hehe cale piekno (przenosnosci) C++ ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Margal Opublikowano 21 Kwietnia 2011 Zgłoś Opublikowano 21 Kwietnia 2011 Dzięki. Nie pojmuję tylko czemu nie wypisało polskich znaków tylko jakiś adres pamięci, skoro na cplusplus.com jest napisane wyraźnie: Finally, if we want the string literal to be explicitly made of wide characters (wchar_t type), instead of narrow characters (char type), we can precede the constant with the L prefix: L"This is a wide character string"Wide characters are used mainly to represent non-English or exotic character sets. Rozumiem, że polski alfabet to jest "non-English character set". Dałem grzecznie, jak kazali, "L prefix" przed stringiem, i guzik. Czemu? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
goram Opublikowano 21 Kwietnia 2011 Zgłoś Opublikowano 21 Kwietnia 2011 Rozumiem, że polski alfabet to jest "non-English character set". Dałem grzecznie, jak kazali, "L prefix" przed stringiem, i guzik. Czemu? Bo trzeba jeszcze wiedziec jak wypisac taki ciag, np: Ideone.com | 8B1g7 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...