Forum Linux.pl

Programowanie => C/C++ => Wątek zaczęty przez: prezes.cc w 2018-07-15, 01:05:30

Tytuł: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 01:05:30
Podczas kompilacji pojawia mi się "błąd rzutowania" tyle moge przeczytać, ale nie wiem co to oznacza

(https://naforum.zapodaj.net/thumbs/6cd7328f2a59.png) (https://naforum.zapodaj.net/6cd7328f2a59.png.html)

//Edit
Program omawia wskaźniki
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-15, 09:10:16
Jest wyraźnie napisane: (int*) jest zbyt duże, żeby zrzutować je na (int). Pierwsze jest adresem (32 albo 64 bitowa reprezentacja całkowita bez znaku), drugi jest 32 bitową liczbą całkowitą ze znakiem. Rzutowanie w żadną stronę nie ma sensu.

EDIT:

I proponuję nie używać zabawkowego IDE z absolutnie przestarzałym kompilatorem (widzę, że screen z Windows), tylko albo darmowy Visual Studio Express C++ 2017 (https://visualstudio.microsoft.com/pl/vs/express/), albo darmowy Qt Creator 4.6 Open Source edition (https://www.qt.io/download) z kompilatorem albo GCC 7/8 albo Clang 6/7.


EDIT #2:
Poprawiając program tak, aby się skompilował (nie tak aby był poprawny!) otrzymujemy:
#include <iostream>

int main()
{
    using std::cin, std::cout, std::endl;

    /* Zaszyte na stałe, nie ma wpływu na poprawność */
    auto ile = 4u;

    auto tab = new int[ile];

    for ( auto i = 0u; i < ile; i++ ) {
        cout << (long int)tab << endl;
        tab++;
    }

    delete[] tab;
    return 0;
}
a wynik:
39775856
39775860
39775864
39775868
free(): invalid pointer
The program has unexpectedly finished.

* Liczby za każdym razem są inne (Dlaczego? Co to w ogóle za wartości? O ile się różnią kolejne z nich? Dlaczego akurat o tyle?)

* Program kończy się panikiem w delete[] (Dlaczego? Jak to poprawić?) - pod Linuksem jest program Valgrind do szukania takich błędów. Można go wywołąć bezpośrednio z QtCreatora. Dla przykładowego projektu komunikat naprowadza na przyczynę błędu:

Invalid free() / delete / delete[] / realloc()
  in main in /home/pawel/Projekty/QtCreator/ptrs/main.cpp:17
  1: operator delete[](void*) in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
  2: main in /home/pawel/Projekty/QtCreator/ptrs/main.cpp:17

Address 39775872 is 0 bytes after a block of size 16 alloc'd  1: operator new[](unsigned long) in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
  2: main in /home/pawel/Projekty/QtCreator/ptrs/main.cpp:10

Czyli "zwalniany blok jest 0 bajtów za zaalokowanym blokiem 16 bajtów".
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 15:42:24
Troche trudne pytania zadajesz. Właśnie próbuje założyć konto w Visual Studio. Przerabiam właśnie wskaźniki i rzutowanie i nie bardzo jeszcze rozumiem oba zagadnienia. Musze używać tego IDE bo tylko to mi działa. Reszta nie chce się zainstalować. Chyba narazie zrezygnuje z forum, bo po co mi ono jest jak nierozumie pomocy. Nie będę dalej ciągnął tematu i zabierał czas innych osób, które chcą mi pomóc. Temat można zamknąć a ja wracam do nauki programowania a jak napotkam błąd to poszukam w internecie. Takie rozwiązywanie problemów nie ma sensu.
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: snajper_8383 w 2018-07-15, 18:59:54
Kolega Paweł zadał Tobie bardzo dobre pytania. Jeśli teraz zajmujesz się wskaźnikami to poświęć trochę czasu na rozwiązaniem pytań Pawła, bo jeśli to zrobisz, to zrozumiesz wskaźniki. Dobra lekcja programowania :) Pzdr.
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-15, 20:01:14
Cytuj
Właśnie próbuje założyć konto w Visual Studio.

Przepraszam, że co? Aż zainstalowałem sobie Win7 w wirtualce. Win zaktualizowany, nie aktywowany (mam legalną 10-kę, ale nie chciałem sobie syfu robić w systemie tylko do gier). Nie zalogowany do żadnej usługi w Microsofcie.

* Ściągnięty instalator VSC2017, uruchomiony (2x klik), wybrana opcja, że chcę pisać w C/C++ (1 klik), "dalej" (1 klik), czekanie na zakończenie instalacji, "uruchom" (1 klik), "nie chcę konta" (1 klik), działa. Po zamknięciu/resecie nie marudzi więcej o założenie konta.

* Plik -> Nowy -> Projekt (3x klik), "Aplikacja Konsolowa Windows" (1 klik), "ok" (1 klik), można edytować kod.

* Jak kod gotowy, to F5 (1 klik) uruchom w debuggerze albo CTRL-F5 (2 kliki) uruchom bez debuggera.

Po skopiowaniu oryginalnej wersji kodu i włączeniu pokazywania wszystkich błędów, VS zgłasza błędy C4302 i C4311, po kliknięcu na numer błędu pojawia się (koślawo przetłumaczona, ale zrozumiała) strona

Cytuj
Kompilator C4302 ostrzegawcze (poziom 2)
 
"konwersji": obcięcie z "wpisz 1" na "typ 2"

Kompilator wykryto konwersji z typu większych na mniejszy typ. Informacje mogą zostać utracone.

[...]

oraz

Cytuj
Kompilator C4311 ostrzegawcze (poziom 1)
 
'zmienna' : obcinanie wskaźnika z 'typ do 'typ'

To ostrzeżenie wykrywa problemy obcięcie wskaźnika 64-bitowych. Na przykład, jeśli kod jest skompilowany dla architektury 64-bitowych, wartość wskaźnika (64-bitowy) zostaną obcięte Jeśli przypisano do int (32-bitowy).
[...]
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 20:10:34
Na YouTube znalazłem bardzo dobry kurs Mirosława Zelenda. A Pan Paweł bez urazy, ale zadaje trudne pytania których nie rozumiem. Wskaźników będę się uczył z lekcji Mirosława Zelenda - bardzo dobry kurs
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 20:37:47
Cytuj
Jest wyraźnie napisane: (int*) jest zbyt duże, żeby zrzutować je na (int). Pierwsze jest adresem (32 albo 64 bitowa reprezentacja całkowita bez znaku), drugi jest 32 bitową liczbą całkowitą ze znakiem. Rzutowanie w żadną stronę nie ma sensu.

Właśnie przerabiam rzutowanie i nie do końca wszystko rozumiem

Cytuj
I proponuję nie używać zabawkowego IDE z absolutnie przestarzałym kompilatorem

Żaden inny nie chce mi działać, a VS nie mogę utworzyć profilu

Cytuj
Liczby za każdym razem są inne (Dlaczego? Co to w ogóle za wartości? O ile się różnią kolejne z nich? Dlaczego akurat o tyle?)

Są przypadkowe i zmieniają się co 4

Cytuj
Program kończy się panikiem w delete[] (Dlaczego? Jak to poprawić?)

Tak ma być

Cytuj
Czyli "zwalniany blok jest 0 bajtów za zaalokowanym blokiem 16 bajtów".

Tego nie wiem
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-15, 20:43:47
Pan Paweł bez urazy, ale zadaje trudne pytania których nie rozumiem.

Na jedno pytanie jest odpowiedź bezpośrednio na slajdach p. Zelendy. Konkretnie w 7:02 filmu o wskaźnikach.

W 8:24 jest w górnym-prawym rogu ekranu informacja dokładnie o błędzie, który Pana spotkał i jak go naprawić w kompilatorach 64-bitowych (bez wyjaśnienia, na czym polega ów błąd). Zresztą zaproponowana korekta jest przypadkiem jedyną poprawną, przenośną wersją tego rzutowania (uintptr_t jest typem int o rozmiarze gwarantującym poprawne przechowanie reprezentacji wskaźnika na danej platformie).
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-15, 20:45:35
Cytuj
Program kończy się panikiem w delete[] (Dlaczego? Jak to poprawić?)

Tak ma być

Buahahahahahaha! Zaplanowany panic...
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 20:51:12
Cytuj
Buahahahahahaha! Zaplanowany panic...

Z tym to do Pana Zelendy, ja tylko przepisuje polecenia
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-15, 21:13:09
Cytuj
W 8:24 jest w górnym-prawym rogu ekranu informacja dokładnie o błędzie

Dzięki pomogło - program działa
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: 920806 w 2018-07-22, 03:08:18
Cześć Paweł :D, pozwolę się wtrącić.

Po pierwsze primo.. sugeruje zmienić dostawce informacji czyt. Pan Zelant może i jest fajny, ale uczy okropnych nawyków. Sam zaczynałem od niego, szczęściem moim znudziłem się programowaniem i zapomniałem czego mnie nauczył, co dało mi szanse nauki programowania od początku - dzieki czemu moglem poznać lepsze nawyki.

Drugie.. Kup książkę S. Praty - Szkoła programowania - może tłumaczenie nie najlepsze, ale nadal lepsze to od Zelenta, lub nawet najnowsze Opus Magnum J.Gabrosza, książki opisują wyczerpująco tematykę C++.. albo cos od samego twórcy

wtedy nie dostaniesz reprymendy na forach
Po trzecie, sugeruje zacząć programowanie od Pythona, ja od tego zaczalem , potem zaatakowałem  C++
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-22, 12:27:45
Dzięki za konstruktywną krytykę. Kupie książke Prady. Z Pytona na razie zrezugnowałem, bo przyłuczam się do game devu. Wybrałem też język skryptowy Lua, który jest przydatny właśnie w game devie i silnik Unreal Engine. I narazie na tym zestawie kończe.

Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-22, 15:15:27
Z mojej strony to:
* Lippman "C++ Primer" (https://www.amazon.com/Primer-5th-Stanley-B-Lippman/dp/0321714113)
* Prata "C++ Primer Plus" (https://www.amazon.com/Primer-Plus-6th-Developers-Library/dp/0321776402) (wygląda na to, że "Szkoła programowania" (https://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,cppri6.htm#format/d) to jej polskie tłumaczenie i o dziwo najnowszego wydania - ale dziwne, bo na podstawie polskiego tłumaczenia innej ekipy z poprzedniego wydania...)

Ja akurat (subiektywnie) wolę tą pierwszą - mam obie, pierwszą prywatnie, drugą "służbowo". Minus - po angielsku. Plus - ja akurat wolę podręczniki do programowania po angielsku, bo jest o niebo spójniejsza terminologia od naszych tłumaczeń.
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: 920806 w 2018-07-22, 15:40:17
Niestety mój angielski pozostawia jeszcze zbyt sporo miejsca na domysły :/, ale planuje na początku nowego roku przełamać sie, przemawia za tym fakt, ze tutoriale i artykuły w j.angielskim czytam dość swobodnie :). Książka Praty jest spoko, ale zadania są głupio przetłumaczone.. po za tym, uważam ze nie należy jej traktować, jako jedyne źródło nauki C++ :). Wiele osób poleca Lippman'a :), wiec i ja od niej zacznę :)
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: prezes.cc w 2018-07-22, 15:56:24
Ja mam jeszcze Symfonię C++ ale ona jest z 2006 roku.
Ja za dodatkowe źródło nauki zaliczam tutorial Od zera do game codera. Skoro mowa o Lippman'ie to też się rozejrzę. Poczytałem troche o tej książce, ale zaciekawił mnie, tu cytat
Cytuj
Do zrozumienia książki wystarcza znajomość podstawowych pojęć i konstrukcji nowoczesnych języków programowania.
Co należy rozumieć pod tym pojęciem, jestem początkujący i nie wiem co to znaczy, a tytuł książki to "Podstawy języka C++". Którą książkę polecacie Praty czy Lippman?
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: 920806 w 2018-07-22, 16:50:42
Hmm, nie czytałem tej pierwszej. Możesz zdać się wyłącznie na własne odczucia, opinie lub na autorytet p.Pawła Kraszewskiego. Przeczytałem za to druga pozycje z 2 razy, temat jest dobrze opisany, ale to nadal za mało, zacząłem czytać Opus Magnum Gabrosza i równolegle wzorce projektowe, ale mało pisze w C++, więcej w Pythonie :D. Symfonia C++ jest już za stara niestety, a opus Magnum to jej najnowsza wersja, która traktuje o C++11, na nasze nieszczęście wyszło właśnie C++ 17, ale nie ma chyba jeszcze żadnej książki traktującej o C++17, wiec pozostaje dokumentacja i artykuły .

A pozycja "od zera do gier kodera" niestety, ale tez już powinna odejść do "lamusa.
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-22, 18:28:51
lub na autorytet p.Pawła Kraszewskiego

A wypraszam sobie :D . Po prostu robię trochę zakręconego oprogramowania sieciowo-kryptograficznego (między innymi) w C++17 i kiedyś uczyłem programowania na uczelni. Ale żeby zaraz mnie autorytetować...
Tytuł: Odp: [C++] Błąd rzutowania
Wiadomość wysłana przez: 920806 w 2018-07-22, 19:17:49
Chciałem nawiązać do tego, ze jesteś ekspert i twoje doświadczenie na pewno nie jednemu pomogło , wiec i warto się słuchać tego co mówisz - a raczej piszesz :D.

A co do programowania sieciowego, nie ukrywam, ze jest to i moim głównym obiektem zainteresowań, ale na start łatwiej było usiąść do socketow w Pythonie, aniżeli w C i C++, myślę tu o tych okropnych bibliotekach .. winsock , ale czuje ze mnie to nie ominie :(.

Napisałem chat'room w Pythonie, może mógł byś podrzucić mi jaki twórczy pomysł na projekt ,który dal by fajne doświadczenie w programowaniu sieciowym?:)
Tytuł: Projekt C++
Wiadomość wysłana przez: Paweł Kraszewski w 2018-07-22, 22:40:09
... myślę tu o tych okropnych bibliotekach .. winsock , ale czuje ze mnie to nie ominie ...

Winsock? Na POSIX'ie?

Klient: socket(), connect(), read/write/send/recv/... czy co tam trzeba, close()
Serwer: socket(), bind(), listen(), accept(), read/write/send/recv/..., czy co tam trzeba, close()

Chatroom w C++:
* Transport - np MQTT, (Mosquitto (http://mosquitto.org/), biblioteka libmosquittopp-dev w klientach, serwer mosquitto jako broker)
* Serializacja danych - np Cap'n'Proto (https://capnproto.org/) (pakiet capnproto)
* GUI - Qt5
* Poćwiczyć natywne rozwiązania C++17 (wątki, synchronizacja, lambdy jako handlery Qt, itp)

Niestety nie znam przyzwoitej książki o Qt5 z użyciem najnowszych wersji C++.