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

Podstawy - wksaźniki. Linux Ubuntu

0 głosów
98 wizyt
pytanie zadane 12 lutego w C i C++ przez Teslum_369 Gaduła (3,240 p.)

Witam,

Zmagam się z pewnym problemem w Linux Ubuntu w aplikacji Xterm.

#include <iostream>

using namespace std;
int ile;

int main()
{
    cout << "Podaj rozmiar tablicy: ";



    cin >> ile;

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

    for(int i=0; i<ile; i++)
    {
        cout << reinterpret_cast<int >(tablica[ile]) << "\n";

        tablica++;
    }

    delete [] tablica;

    return 0;
}

Przerabiam 10 odcinek kursu Pana Mirka, natomiast po wpisaniu dokładnie tego samego kodu, nie mogłem go skompilować, znalazłem podobny temat gdzie wytłumaczono, iż aby zamienić int* na int trzeba użyć reinterpret <int >(adres), zastosowałem takie polecenie i kompilator się uruchomił. Dalszy problem polega na tym, że gdy wpisuję rozmiar tablicy np 10 wyświetla mi tylko pierwszą wartość, potem same 0  a następnie free(): invalid pointer, Aborted (core dumped), co mógłbym zrobić? 

komentarz 12 lutego przez DarthMazut Bywalec (2,430 p.)
Cześć :)

rozumiem, że chcesz przeiterować utworzoną tablicę za pomocą wskaźnika?

Jeśli o to chodzi, to utwórz sobie osobny wskaźnik do tego (np. int* new_wsk), a nie inkrementuj tego, który wskazuje na początek tablicy. Nowy wskaźnik ustaw na początek: new_wsk = &tablica i teraz w pętli wypisz to na co wskaźnik wskazuje: cout << *new_wsk, a po każdej iteracji go inkrementuj new_wsk++.

1 odpowiedź

0 głosów
odpowiedź 12 lutego przez gagyn Mądrala (6,160 p.)

Skopiowałem ten kod co podałeś i działa zarówno z użyciem reinterpret_cast jak i bez, czyli: cout << tablica[0] << "\n"; Jednak w tym przypadku używanie reinterpret_cast nie ma sensu i wystarczy odwołać się normalnie do tablicy.

EDIT: Teraz widzę, że nie możesz odwoływać się za pomocą tablica[ile], tylko tablica[0], ponieważ wykonując tablica++, a następnie odwołując się do ostatniej komórki wychodzisz poza zakres tablicy już w pierwszym przebiegu pętli.

komentarz 12 lutego przez Teslum_369 Gaduła (3,240 p.)

Niestety, u mnie wciąż to samo.

 

komentarz 12 lutego przez gagyn Mądrala (6,160 p.)
Spróbuj skompilować i uruchomić bez delete [] tablica.
komentarz 12 lutego przez Teslum_369 Gaduła (3,240 p.)

Otrzymałem coś takiego:

Tylko teraz dwa pytania,

1) Czy powinienem usunąć "delete [] tablica" ?

2) Nie powinienem ujrzeć jakiegoś adresu komórek?

komentarz 12 lutego przez DarthMazut Bywalec (2,430 p.)
Napotkany problem jest bardzo dobrze wyjaśniony w pierwszej z kolei odpowiedzi pod postem:

https://forum.pasja-informatyki.pl/127590/cr-c-%2310-wskazniki-dynamiczne-alokowanie-pamieci
komentarz 12 lutego przez Teslum_369 Gaduła (3,240 p.)

Wszystko ładnie, tylko spotkał mnie chyba ostatni problem, dlaczego program nie może się skompilować? Otrzymuję taki komunikat:

error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]|  

O co tu chodzi i jak to naprawić?

komentarz 12 lutego przez gagyn Mądrala (6,160 p.)
Pokaż aktualny kod.

Gdzieś próbujesz potraktować wskaźnik jako wartość zmiennej.
komentarz 13 lutego przez j23 VIP (105,900 p.)

@Karol_Tesla, chodzi o to, że wskaźnik może być większy od typu int, który najczęściej jest 32-bitowy, nawet na platformach 64-bitowych. Użyj typu intptr_t.

Podobne pytania

0 głosów
2 odpowiedzi 105 wizyt
pytanie zadane 12 listopada 2016 w C i C++ przez Hanuku Nowicjusz (140 p.)
+1 głos
2 odpowiedzi 116 wizyt
0 głosów
1 odpowiedź 84 wizyt
Porady nie od parady
Nie wiesz jak poprawnie zredagować pytanie lub pragniesz poznać którąś z funkcji forum? Odwiedź podstronę Pomoc (FAQ) dostępną w menu pod ikoną apteczki.FAQ

65,788 zapytań

112,438 odpowiedzi

237,541 komentarzy

46,728 pasjonatów

Przeglądających: 204
Pasjonatów: 7 Gości: 197

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...