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

Legalne czy nielegalne operacje na tablicach

Ostatnio zmodyfikowano 2012-04-30 21:22
Autor Wiadomość
diego997
Temat założony przez niniejszego użytkownika
Legalne czy nielegalne operacje na tablicach
» 2012-04-30 19:12:57
Wcześniejszy problem nieaktualny ale przy szukaniu błędu natknąłem się na coś dziwnego.

Program się skompiluje, dlaczego ?
C/C++
int tab[ 10 ][ 10 ] = { 0 };

cout << tab[ 0 ][ 12 ];

Program się nie skompiluje, dlaczego ?
C/C++
int tab[ 10 ][ 10 ];

cout << tab[ 0 ][ 12 ];

Dlaczego taka operacja jest możliwa jestem sobie w stanie wyobrazić, ale czy legalna, jakie jest prawdopodobieństwo, że nie natrafimy na zajęty obszar pamięci ?

C/C++
int tab[ 10 ];

tab[ 12 ] = 1;

cout << tab[ 12 ];
P-55683
akwes
» 2012-04-30 20:59:33
1. Oba pierwsze kody się kompilują u mnie w Dev i w Visualu...
2. Po prostu w c++ celem optymalizacji działań na tablicach, nie jest sprawdzane czy nie przekraczasz zakresu tablicy...
P-55695
Admixior
» 2012-04-30 21:05:26
tak mi się zdaje że:
C/C++
cout << tab[ 0 ][ 12 ]; //trzy elementy ponad tablicę nr 0
jest to samo co:
C/C++
cout << tab[ 1 ][ 2 ]; //trzeci element tablicy nr 1

Zaraz przetestuje czy rzeczywiście tak jest.
Poprawcie mnie jakbym się mylił


//edit 2: jednak element tab[ 1 ][ 2 ] jest to ten sam(powprawiłem u góry kod), można to sprawdzić kodem:
C/C++
int main() {
    int tab[ 10 ][ 10 ];
    tab[ 1 ][ 2 ] = 5;
    tab[ 0 ][ 12 ] = 6;
    std::cout << tab[ 1 ][ 2 ];
    std::cin.get();
}
P-55696
jankowalski25
» 2012-04-30 21:14:02
Jeśli program nie wykorzystuje informacji o rozmieszczeniu elementów w pamięci, to obiekty nie muszą być ustawione po kolei, ale mogą być optymalizowane.
P-55697
akwes
» 2012-04-30 21:22:25
Eee

C/C++
#include <iostream>
#include <conio.h>

int main()
{
    int tab[ 10 ][ 10 ];
    tab[ 1 ][ 1 ] = 7;
   
    std::cout << tab[ 0 ][ 11 ] << "  " << &( tab[ 0 ][ 11 ] ) << "\n";
    std::cout << tab[ 1 ][ 1 ] << "  " << &( tab[ 1 ][ 1 ] ) << "\n";
    std::cout << *( * tab + 11 ) << "  " <<( * tab + 11 );
    getch();
   
    return 0;
}

Po prostu kolega wyżej się walną o jedną liczbę... Policzył że 10 element tablicy 10 elementowej to 10 a nie 9, więc zamiast 9 + 2 wyszło mu 10 + 2. Poprawił już :)

Przykładowy log


7 0x28fddc
7 0x28fddc
7 0x28fddc
P-55698
« 1 »
  Strona 1 z 1