Programowanie > C/C++

[C++] Błąd rzutowania

(1/4) > >>

Zdzisław Knop:
Podczas kompilacji pojawia mi się "błąd rzutowania" tyle moge przeczytać, ale nie wiem co to oznacza



//Edit
Program omawia wskaźniki

Paweł Kraszewski:
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:

--- Kod: ---
#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;
}

--- Koniec kodu ---
a wynik:

--- Kod: ---
39775856
39775860
39775864
39775868
free(): invalid pointer
The program has unexpectedly finished.

--- Koniec kodu ---

* 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".

Zdzisław Knop:
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.

Kuba83:
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.

Paweł Kraszewski:

--- Cytuj ---Właśnie próbuje założyć konto w Visual Studio.
--- Koniec cytatu ---

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.

[...]

--- Koniec cytatu ---

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).
[...]

--- Koniec cytatu ---

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej