Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tablice, coś co nie powinno działać działa

Ostatnio zmodyfikowano 2016-07-25 15:10
Autor Wiadomość
Maciekb
Temat założony przez niniejszego użytkownika
Tablice, coś co nie powinno działać działa
» 2016-07-25 13:12:53
C/C++
#include <iostream>
using namespace std;
int main()
{
    int liczba[ 10 ];
    int licznik = 0;
    do
    {
        std::cin >> liczba[ licznik ];
        licznik++;
    } while( licznik < 11 );
   
    liczba[ 20 ] = 18;
    cout << liczba[ 20 ];
    std::cout << "Podales nastepujace liczby: ";
    licznik = 0;
    do
    {
        std::cout << liczba[ licznik ] << ", ";
        licznik++;
    } while( licznik < 11 );
   
    return 0;
}

Program grzecznie się kompiluje i działa mimo że, wychodzę poza zakres tablicy wypisuje: 18, 1,2,3,4,5,6,7,8,9,10,10.
Dlaczego?, proszę o pomoc.
P-150242
BlackFive
» 2016-07-25 13:37:08
drugi link na samym dole...

http://lmgtfy.com/?q=c%2B%2B+wyj%C5%9Bcie+poza+tablice\
P-150243
Maciekb
Temat założony przez niniejszego użytkownika
» 2016-07-25 14:05:22
W linku jest o programowaniu obiektowym a ja dopiero raczkuje w c++, nie rozumiem tego, chciałbym się dowiedzieć dlaczego tak się dzieje i jak uniknąć błędów które to może powodować :)
P-150244
Gibas11
» 2016-07-25 14:18:51
Pamięć nie musi być dokładnie pilnowana, równie dobrze możesz nie naruszać żadnych ważnych danych. Jak masz szczęście to wysypuje się od razu, jak pecha to wysypuje się po miesiącu cholera wie dlaczego. ;)
W każdym razie lepiej tego pilnuj.
P-150245
carlosmay
» 2016-07-25 14:32:46
chciałbym się dowiedzieć dlaczego tak się dzieje i jak uniknąć błędów które to może powodować :)
Kompilator nie sprawdza poprawności indeksu. Ten obowiązek spoczywa na programiście.
Korzystaj z std::array. To jest opakowana tablica statyczna. Dam przykład:
C/C++
#include <iostream>
#include <array> // od c++11
using namespace std;

int main()
{
    array < int, 10 > furtherNumbers;
   
    for( int i = 0; i < furtherNumbers.size(); ++i ) {
        furtherNumbers[ i ] = i + 1;
    }
   
    for( int i = 0; i < furtherNumbers.size(); ++i ) {
        cout << furtherNumbers[ i ] << ' ';
    }
   
    // użycie indeksu spoza tablicy, może (nie musi) spowodować awarię
    // cout << furtherNumbers[10] << '\n';
   
    // metoda at() służy do sprawdzania czy indeks należy do tablicy, zgłosi błąd
    cout << furtherNumbers.at( 10 ) << '\n';
}
Kwestia przywyknięcia do składni.

std::array<>
P-150247
BlackFive
» 2016-07-25 15:10:26
Użyj kolego google bo tam jest więcej wiedzy niż na wikipedii...
http://cpp0x.pl/kursy/Kurs-C++/Poziom-2/Tablice-jednowymiarowe/292


"Najczęstszym błędem, jaki jest popełniany przez początkujących programistów (jak również i tych bardziej doświadczonych) jest wychodzenie poza zakres tablicy. Przykładowo:

C/C++
int tablica[ 10 ];
tablica[ 10 ] = 123; //Element o indeksie 10 jest 11 elementem tablicy - piszesz poza tablicą!
Pisząc poza tablicą modyfikujesz wartości innych zmiennych lub kodu maszynowego aplikacji - w efekcie uszkadzasz kod swojego programu co prowadzi do błędu krytycznego aplikacji. Wychodząc poza zakres tablicy może się zdarzyć również, że podejmiesz próbę pisania po pamięci innej aplikacji na co współczesne systemy operacyjne nie pozwalają. System operacyjny ochroni Twój komputer przed taką ewentualnością i wyrzuci błąd krytyczny Twojej aplikacji, zapobiegając jednocześnie możliwości modyfikacji zasobów, które do Ciebie nie należały."
P-150249
« 1 »
  Strona 1 z 1