Nowe posty

Autor Wątek: [C++] Błąd rzutowania  (Przeczytany 4280 razy)

prezes.cc

  • Gość
[C++] Błąd rzutowania
« dnia: 2018-07-15, 01:05:30 »
Podczas kompilacji pojawia mi się "błąd rzutowania" tyle moge przeczytać, ale nie wiem co to oznacza



//Edit
Program omawia wskaźniki
« Ostatnia zmiana: 2018-07-15, 01:13:40 wysłana przez Zdzisław Knop »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #1 dnia: 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, albo darmowy Qt Creator 4.6 Open Source edition 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".
« Ostatnia zmiana: 2018-07-15, 11:23:56 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #2 dnia: 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.

snajper_8383

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #3 dnia: 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.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #4 dnia: 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).
[...]
« Ostatnia zmiana: 2018-07-15, 20:32:35 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #5 dnia: 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

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #6 dnia: 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
« Ostatnia zmiana: 2018-07-15, 20:39:54 wysłana przez Zdzisław Knop »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #7 dnia: 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).
« Ostatnia zmiana: 2018-07-15, 20:49:49 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #8 dnia: 2018-07-15, 20:45:35 »
Cytuj
Program kończy się panikiem w delete[] (Dlaczego? Jak to poprawić?)

Tak ma być

Buahahahahahaha! Zaplanowany panic...
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #9 dnia: 2018-07-15, 20:51:12 »
Cytuj
Buahahahahahaha! Zaplanowany panic...

Z tym to do Pana Zelendy, ja tylko przepisuje polecenia

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #10 dnia: 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

Offline 920806

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 130
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #11 dnia: 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++
Steve Wozniak nie wiedział .. ~ ~ https://www.youtube.com/watch?v=FG1AQcGGSec ~~ / "Uparty jak nigdy" /P3@CE , L0\/E & rock'|\|'roII

prezes.cc

  • Gość
Odp: [C++] Błąd rzutowania
« Odpowiedź #12 dnia: 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.

« Ostatnia zmiana: 2018-07-22, 13:37:16 wysłana przez Zdzisław Knop »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3047
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #13 dnia: 2018-07-22, 15:15:27 »
Z mojej strony to:
* Lippman "C++ Primer"
* Prata "C++ Primer Plus" (wygląda na to, że "Szkoła programowania" 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ń.
« Ostatnia zmiana: 2018-07-22, 15:18:29 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline 920806

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 130
    • Zobacz profil
Odp: [C++] Błąd rzutowania
« Odpowiedź #14 dnia: 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ę :)
« Ostatnia zmiana: 2018-07-22, 15:42:55 wysłana przez 920806 »
Steve Wozniak nie wiedział .. ~ ~ https://www.youtube.com/watch?v=FG1AQcGGSec ~~ / "Uparty jak nigdy" /P3@CE , L0\/E & rock'|\|'roII