• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskazniki typ zmiennej float a Int

Object Storage Arubacloud
0 głosów
876 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez qlucha Obywatel (1,790 p.)
 int *Tab;
    Tab = new int [10];

    for(int i=0;i<=9;i++)
    {
        *Tab=25;
        cout <<*Tab<<endl;
        Tab++;
    }
   delete [] Tab ;

// BRAK BŁĘDU -Kod powyżej , a po zmianie na typ zmiennej float ;
// Pojawnia sie bląd z pamiecią:

float *Tab;
    Tab = new float [10];

    for(int i=0;i<=9;i++)
    {
        *Tab=25;
        cout <<*Tab<<endl;
        Tab++;
    }
   delete [] Tab ;

Ucząc sie z Kursu w moim sposobie myślenia Ten błąd nie powinien sie pojawić ,A tu niespodzianka.

Proszę o pomoc. (kod jest bardzo prosty ) 

Wiem że, Float zajmuje 4 bajty(4 komórki pamięci) podobnie jak int.  frownsurprise

3 odpowiedzi

+2 głosów
odpowiedź 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
wybrane 6 lutego 2017
 
Najlepsza

Niech zgadnę, kurs Zelenta?

Pojawienie się tego błędu to kwestia przypadku, ty akurat miałeś szczęście. Wskaźnik, który podajesz do operatora delete[] to nie to samo, co ten zwrócony przez operator new, wyjścia masz dwa: obliczyć podczas usuwania poprawny wskaźnik lub zachować nienaruszoną kopię (to drugie jest lepsze).

float *Tab;
Tab = new float [10];

for(int i=0;i<=9;i++) {
	*Tab=25;
	std::cout <<*Tab<<std::endl;
	Tab++;
}

delete [] (Tab - 10);
float *Tab;
Tab = new float [10];
auto copy = Tab;

for(int i=0;i<=9;i++) {
	*Tab=25;
	std::cout <<*Tab<<std::endl;
	Tab++;
}

delete [] copy;

A tu masz w ogóle lepsze podejście do problemu, bez ruszania wskaźnikami.

float *Tab;
Tab = new float [10];

for(int i=0;i<=9;i++) {
	*(Tab + i) = 25.f;
	std::cout << *(Tab + i) <<std::endl;
}

delete [] Tab;

Pamiętaj, że *(Tab + i) to w tym przypadku synonim Tab[i].

A Zelent mimo wielokrotnego omówienia tego błędu w internecie dalej nie poprawił swojego filmu i ludzie się z tego uczą, szkoda słów.

komentarz 5 lutego 2017 przez qlucha Obywatel (1,790 p.)

Dzieki za Odpowiedz ,  Co do Kursu M.Zelenta . Jako początkujący adept programowania 

muszę stwierdzić ,że dzieki Jego kursom nabrałem motywacji i obrałem kierunek nauki dla niełatwego zajęcia jakim jest programowanie.Każdy jest tylko człowiekiem i popełnia błędy , a poświęcać swój wolny czas i tworzyć kursy Ciekawe Tematycznie darmowe i ogólnodostępne . To naprawdę kosztuje wiele cięzkiej pracy. I z mojej strony należą się podziekowania i szacunek za trud i ciężką prace .smileyyes 

komentarz 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
A Zelent bardzo ładnie motywuje, równie ładnie tłumaczy (niestety też równie powoli), ale niestety w ten piękny sposób przekazuje swoją dosyć ograniczoną wiedzę na temat C++ i to już jest problem. Bo pomyśl, Ty akurat miałeś szczęście – kod się wykrzaczył, zapytałeś na forum i wiesz co się działo, teraz pytanie co z tymi, którym tamten przykład zadziała i kiedyś te błędne przekonania doprowadzą do niespodziewanego błędu po zmianie jednego wiersza kilkaset linii od wadliwego kodu. Co jak co, ale takie błędy najtrudniej się debuguje.
komentarz 5 lutego 2017 przez qlucha Obywatel (1,790 p.)
Tak wiem , do Kursów M.Zelenta podchodzę jako kursów dobrych dla osób zaczynających , przygode z programowaniem  i jetem świadom ,że podstaw języka moge się nauczyć w ciagu 2 miesiecy , ale poziom mistrzowski osiąga sie Latami.  Rozumiem twoje podejscie i jest ono bardzo Profesjonalne. Moje pytanie , czy mógłbyś polecić  kursy w sieci godne polecenia ?
komentarz 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)

Tylko cpp0x zdaje się móc konkurować w polskim internecie z Zelentem. Jeśli nie przeszkadza Ci angielski to mogę z czystym sumieniem polecić to. Swoją drogą jeśli problem jest rozwiązany byłoby miło, gdybyś oznaczył jakąś odpowiedź jako prawidłową.

komentarz 5 lutego 2017 przez qlucha Obywatel (1,790 p.)

Osobiście , uważam że Twoja odpowiedz jak i odpowiedz  Criss Szeryf (88,680 punkty) 

były bardzo pomocne ,na obydwie odpowiedzi oddałem głos w góre, i podziękowałem za odpowiedz.smileyyes. (Chodzi Ci o oznaczenie Jako Najlepszą ,?? / Czy można obydwie zaznaczyć jako najlepsze ??) 

1
komentarz 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
Nie, najlepszość ma to do siebie, że jest unikatowa. :P
komentarz 6 lutego 2017 przez niezalogowany

Całkiem ok jest też kurs z 4programmers oraz Megatutorial Xion'a

Także to nie tak, że MZ nie ma z czym konkurować, bo dobrych kursów w języku polskim jest sporo. 

komentarz 6 lutego 2017 przez koczurekk Gaduła (3,420 p.)
Zapomniało mi się o kursie na 4programmers. ;-; A ten Megatutorial Xion'a pierwszy raz w życiu widzę na oczy, obczaję to.
+1 głos
odpowiedź 5 lutego 2017 przez criss Mędrzec (172,590 p.)

Wiem że, Float zajmuje 4 bajty(4 komórki pamięci) podobnie jak int.

A co to ma do rzeczy?

Nie wiem jakim cudem pierwszy kod ci się nie wykrzacza, ale problem jest prosty -  delete[] musi dostać,dokładnie ten sam adres który zwrócił new[]. Ty przesuwasz wskaźnik i w efekcie delete[] dostaje już co innego.

komentarz 5 lutego 2017 przez qlucha Obywatel (1,790 p.)

Dzieki za odpowiedz.smileyyes . Teraz juz rozumie o co chodzi.

0 głosów
odpowiedź 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)

Zdaje się, ze robisz błąd. Jeśli chcesz zainicjować każdy element tablicy wartoscią 25 to powinieneś to zrobić tak:

Tab[i] = 25;

A w przypadku dynamicznej tablicy typu float:

Tab[i] = 25.0f;

I przy zwalnianiu pamięci nie zapomnij, zmiennej przypisać wartości nullptr:

delete [] Tab ;
Tab = nullptr;

Przy Twoim obecnym rozwiązaniu, zmieniasz adres wskaźnika, a to jest błąd, bo chyba nie to chciałeś osiągnąć.

komentarz 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
Fragment "*Tab = 25;" jest prawidłowy. Zamiast "25.0f" można użyć samego "25.f". No i użycie dziesiętnego 25 jest ok, ponieważ nie ma tu żadnej straty precyzji.
komentarz 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)
Jeśli autor chce do obecnego miejsca w pamięci, na które wskazuje wskaźnik, przypisać wartość 25 - to tak. Ale jak piszę o całym kontekście w przypadku gdyby autor chciał w cywilizowany sposób zainicjować całą tablicę.

Chyba, że chodzi Ci o samo przypisanie wartości typu int do zmiennej typu float - to tak, racja, prawidłowy.
komentarz 5 lutego 2017 przez koczurekk Gaduła (3,420 p.)
O to drugie, oczywiście zapis Tab[i] jest lepszy od *(Tab + i).

Podobne pytania

0 głosów
1 odpowiedź 387 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez krzycholl18 Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 544 wizyt
pytanie zadane 24 października 2019 w C i C++ przez KumberTwo Dyskutant (8,270 p.)
0 głosów
2 odpowiedzi 6,361 wizyt
pytanie zadane 9 czerwca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...