Nauka programowania: error: cast from 'int*' to 'int' loses precision

0

Co robię źle? Wywala taki błąd jak w temacie.

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <string>
#include <iomanip>

using namespace std;

int ile;

int main()
{
    cout<<"Ile liczb w tablicy: ";
    cin>>ile;

    int *tablica;
    tablica = new int [ile];

    for (int i=0; i<ile; i++)
    {
        cout<<(int)tablica<<endl; // w tym miejscu wywala error!!!
        tablica++;
    }

    delete [] tablica;

    return 12;
}
0

Eh, C++ i przesuwanie wskaźnika, cóż to za prawadny podręcznik,
Wywala error bo tablica jest typu int * a nie int. Pewnie gwiazdki brakuje

UPDATE linia powinna wygladac cout<<*tablica<<endl; Ale IMHO to szalone wciąż

0
KamilAdam napisał(a):

Eh, C++ i przesuwanie wskaźnika, cóż to za prawadny podręcznik,
Wywala error bo tablica jest typu int * a nie int. Pewnie gwiazdki brakuje

UPDATE linia powinna wygladac cout<<*tablica<<endl; Ale IMHO to szalone wciąż

Niby coś tam opala błędu nie wywala, ale za to ten prosty program tak jakby mój antywirus blokuje. Wartości które wyświetla to same 0 i przy zakończeniu antywirus daje o sobie znać i program się kończy

1
profirme2016 napisał(a):

Wartości które wyświetla to same 0

No a co byś chciał jak nie zainicjalizowałeś wablicy wartościami? To już nie te czasy że w C++ można sobie łatwo czytać losową pamięć

i przy zakończeniu antywirus daje o sobie znać i program się kończy

bo przypisałeś pamięć do tablica w między czasie przesunąłeś wskaźnik tablica i potem zwalniasz pamięć z przesuniętego wskaźnika

Jak chcesz zrobić coś sensownego to poczytaj o vektorze, albo chociaż o indeksowaniu. Jak chcesz czytać niezainicjalizowaną pamięć to pewnie musisz powyłączać zabezpieczenia przełącznikami kompilatora

Co to za pradawny tutorial używasz?

0
KamilAdam napisał(a):
profirme2016 napisał(a):

Wartości które wyświetla to same 0

No a co byś chciał jak nie zainicjalizowałeś wablicy wartościami? To już nie te czasy że w C++ można sobie łatwo czytać losową pamięć

i przy zakończeniu antywirus daje o sobie znać i program się kończy

bo przypisałeś pamięć do tablica w między czasie przesunąłeś wskaźnik tablica i potem zwalniasz pamięć z przesuniętego wskaźnika

Jak chcesz zrobić coś sensownego to poczytaj o vektorze, albo chociaż o indeksowaniu. Jak chcesz czytać niezainicjalizowaną pamięć to pewnie musisz powyłączać zabezpieczenia przełącznikami kompilatora

Co to za pradawny tutorial używasz?

Kurs C++ z kanału Pasja informatyki na YT - sprzed 9 lat. Czyli sugerujesz że wskaźniki można pominąć?

3
profirme2016 napisał(a):

Kurs C++ z kanału Pasja informatyki na YT - sprzed 9 lat. Czyli sugerujesz że wskaźniki można pominąć?

Sugeruję że można pominąć wszystkie kursy z Pasja informatyki i omijać je szerokim łukiem

0
KamilAdam napisał(a):
profirme2016 napisał(a):

Kurs C++ z kanału Pasja informatyki na YT - sprzed 9 lat. Czyli sugerujesz że wskaźniki można pominąć?

Sugeruję że można pominąć wszystkie kursy z Pasja informatyki i omijać je szerokim łukiem

Nie mam alternatywy. Chcę ogarnąć sobie te kursy i przejść do czegoś innego, np Python. Ale będę zwracał uwagę żeby było to świeże.

2

Nie no wydaje mi się że praca na takich surowych wskaźnikach ci się przyda w zrozumieniu języków o wyższym poziomie abstrakcji, może lepiej weź kurs C a nie C++ bo w c++ się tak raczej nie programuje. Rodzaj kursu moim zdaniem nieistotny, poćwiczyłbym sobie to parę dni i skoczył od razu do języka którym jesteś faktycznie zainteresowany. Jak masz się uczyć wektorów, iteratorów i mądrych wskaźników to moim zdaniem w ogóle nie warto sobie zawracać głowy i od razu uczyć pythona

1
profirme2016 napisał(a):

Nie mam alternatywy.

W sensie w całym internecie nie ma ani jednego dobrego kursu C++ ? Czy ktoś cie zmusza?

Chcę ogarnąć sobie te kursy i przejść do czegoś innego, np Python

Ale po co ci w takim razie C++ jak chcesz się uczyć Pythona? Jak chcesz się uczyć Pythona to ucz się Pythona. To trochę tak jakbyś jazdę samochodem zaczął od nauki jazdy konnej

3

Problemem jest kurs/książka z jakiej korzystasz do nauki, która źle uczy C++.
To powinno wyglądać tak (pomijając fakt, że sam kod nie ma za bardzo sensu):

#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

int main()
{
    int ile;
    std::cout << "Ile liczb w tablicy: ";
    std::cin >> ile;

    std::vector<int> tablica(ile);
    for (auto& x : tablica) {
        std::cout << x << '\n';
    }

    return 12;
}

W współczesnym C++ jawne używanie new i delete jest niewskazane i niepraktykowane (poza jakimiś dziwnymi bibliotecznymi hackami).
Zarządzanie pamieći ma być przekazane w ręce standardowej biblioteki.
Ergo nalkezy użyać 1. std::vector (już w latach '90) 2. std::unique_ptr (C++11) 3. std::sharade_ptr/std::weak_ptr (C++11) itp.

0

@MarekR22:

MarekR22 napisał(a):

Problemem jest kurs/książka z jakiej korzystasz do nauki, która źle uczy C++.

E, czy ja wiem czy on tak źle uczy?
W sensie pod względem dobrych praktyk, jakości kodu i nowości języka to faktycznie, tego nie uczy wcale albo źle,
natomiast takie koncepty jak wskaźniki, arytmetyka wskaźników, zmienne i ogólnie różne podstawowe rzeczy pamiętam tłumaczył tak, że początkujący
jest w stanie to pojąć - prosto i klarownie.
Więc moim zdaniem, jeżeli ktoś jest totalnym newbie to może sobie odpalić Zelenta, aby zrozumieć czym są wskaźniki, zmienne itp. itd.
Jednakże po tym etapie przesiąść się na coś innego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1