deklaracja tablicy
Ostatnio zmodyfikowano 2010-01-16 13:04
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.
|
|
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. |
|
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.
|
|
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. |
|
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. |
|
Elaine |
» 2010-01-16 12:58:26 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ę. |
Właśnie, że będzie brzęczał: >> cat a.cpp
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: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. |
|
Ivian |
» 2010-01-16 13:04:54 A no racja. Mój błąd, choć wynika z czysto teoretycznego podejścia.
sorka;) |
|
« 1 » |