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

deklaracja tablicy

Ostatnio zmodyfikowano 2010-01-16 13:04
Autor Wiadomość
marek
Temat założony przez niniejszego użytkownika
deklaracja tablicy
» 2010-01-15 14:38:50
6.2. Tablice jednowymiarowe

Dot deklaracji tablicy
"Ważnym aspektem jest to, iż LiczbaElementów musi być wartością stałą całkowitą, lub stałą const"

Czy Liczba Elementów może też być zmienną
czyli czy coś takiego będzie prawidłowe?

max = 3;
int tablica [max];

Kompilator przyjmuje to ale programy tego typu  raz  działają  lecz często zawieszają się? Nie wiem czy nie naruszyłem zasad, czy coś jest nie tak w moim kompie.

P-13004
Elaine
» 2010-01-15 15:11:20
To jest tylko takie niewielkie rozszerzenie GCC (niedziałające nigdzie indziej), więc najlepiej zapomnieć, że kompilator to dopuszcza (zresztą nie zawsze - wystarczy jeden mały switch /bodajże -pedantic/, żeby ten ficzer wyłączyć). Nie mam w tej chwili standardu pod ręką, żeby rzucić regułką potwierdzającą, że rozmiar tablicy musi być stałą.

...a nie, mam standard (8.3.4.1 - dcl.array):
In a declaration T D where D has the form
D1 [constant-expression(opt)]
(...) If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Wnioski wyciągnij sam.
P-13005
chesterr
» 2010-01-15 18:48:16
Elementy tablicy musza byc okreslone stala doslowna lub stala const.
Jesli chcesz aby twoj przyklad byl poprawny zainteresuj sie dynamicznym przydzielaniem pamieci.

P-13007
Elaine
» 2010-01-15 19:30:16
Nitpick: nie musi to być literał całkowity czy stała całkowita. Wystarczy, że wyrażenie jest stałe - może być także 2 + 2, jakieś obliczenia wykonane na wzorcach, albo (od C++0x) wywołanie stałowyrażeniowej funkcji.
P-13009
Ivian
» 2010-01-16 12:27:13
Kompilator nie będzie brzęczał o błąd gdy zobaczy :

int max = 3;
int tablica[max];

bo w momencie kompilacji zna wartość zmiennej max i taką tworzy tablicę.

gdybyś miał coś takiego:

int max;
int tablica[max];
max = 3;\
no to już by Cię nie przepuścił.

Ponadto nie licz na to  że deklarując wcześniej tablicę a potem jakoś zmieniając zmienną max rozmiar tablicy Ci sie zmieni.

Najlepiej i tak zrobić coś takiego:

const int max = 3;
int tablica[max];

Później jeżeli juz naprawde zajdzie taka potrzeba możesz zmieniać zmienną max operatorem reinterpret_cast, choć nie widzę takiej potrzeby.
P-13022
Elaine
» 2010-01-16 12:58:26
Kompilator nie będzie brzęczał o błąd gdy zobaczy :
C/C++
int max = 3;
int tablica[ max ];
bo w momencie kompilacji zna wartość zmiennej max i taką tworzy tablicę.
Właśnie, że będzie brzęczał:
>> cat a.cpp
C/C++
int main()
{
    int foo = 11;
    int a[ foo ];
}
>> cl a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.21003.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.cpp
a.cpp(4) : error C2057: expected constant expression
a.cpp(4) : error C2466: cannot allocate an array of constant size 0
a.cpp(4) : error C2133: 'a' : unknown size

Najlepiej i tak zrobić coś takiego:
C/C++
const int max = 3;
int tablica[ max ];
Później jeżeli juz naprawde zajdzie taka potrzeba możesz zmieniać zmienną max operatorem reinterpret_cast
Nie możesz - zmienianie obiektu utworzonego jako stały to undefined behavior (czyli może stać cokolwiek - program może się wyłożyć, może wykoleić się tramwaj, albo UFO może przylecieć na Ziemię i porwać autora takiego programu). Większość kompilatorów specjalnie na taki wypadek zrobi gdzieś obiekt o wartości 3, który niekiedy nawet można zmienić bez crasha, ale próba odczytu i tak skończy się otrzymaniem trójki - każdy znany mi porządny kompilator traktuje stałe typów wbudowanych jak coś podobnego do makrodefinicji.
P-13033
Ivian
» 2010-01-16 13:04:54
A no racja. Mój błąd, choć wynika z czysto teoretycznego podejścia.

sorka;)
P-13037
« 1 »
  Strona 1 z 1