Programowanie > C/C++
[C++] Błąd rzutowania
prezes.cc:
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".
prezes.cc:
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:
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
[#] Następna strona
Idź do wersji pełnej