tablica - określanie wymiaru

0

Witam,
Myślałem, że problemu przy takiej prostej rzeczy nie znajdę, ale przy kodzie:

#include <iostream>
using namespace std ;

int main (){
  int liczba_pracownikow=6;
  double tabl [liczba_pracownikow];
  return 0;
}

tablica ma wymiar 6
wszystko mi się ładnie kompiluje, ale według książki "Podstawy Języka C++" Lippmana i Lajoie nie powinno ponieważ:
"Wprawdzie zmienna liczba_pracownikow otrzymała wartość początkową, lecz nie jest obiektem stałym. Dostęp do tej wartości można uzyskać jedynie podczas wykonywania programu, więc użycie go jako wymiaru tablicy nie jest poprawne"

Wnioskuję z tego, że kompilator nie powinien być w stanie obliczyć wartości liczba_pracownikow.

Mam wydanie drugie. Może to błąd w książce. Jeśli ktoś posiada tą książkę to jest w rozdziale 3.9 Typy tablicowe. (w wydaniu w twardej czerwonej okładce to jest na str 116/117).

0
  1. Mowa jest o rozmiarze tablicy. Wymiar to co innego/
  2. deklaracje typu int n - 7; int tab[n] są niezgodne ze standardem, ale niektóre kompilatory(np. ten dostarczany z Devem, stara wersja GCC) to puszczają.
    3)prawidłowa deklaracja takiej talicy to:
    int n = 7;
    int *tab = new int[n];
0

ad 1) ok, wymiar jest 1, rozmiar jest 6

eryk napisał(a)

ale niektóre kompilatory(np. ten dostarczany z Devem, stara wersja GCC) to puszczają.

gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

0

Odpowiedź dlaczego to przechodzi jest bardzo prosta. GCC chce zapewnić w C++ większą zgodność ze standardem C (gdzie taki zapis jest jak najbardziej legalny) i udostępnia własne rozszerzenie języka o taki zapis. Po dodaniu flagi -pedantic otrzymujemy wyjście:

hauleth@niuniobook ~/Pulpit $ g++ test.cpp -Wall -pedantic
test.cpp: In function ‘int main()’:
test.cpp:6:34: warning: ISO C++ forbids variable length array ‘tabl’
test.cpp:6:34: warning: unused variable ‘tabl’
0

Wnioskuję z tego, że kompilator nie powinien być w stanie obliczyć wartości liczba_pracownikow.

Jest to rozszerzenie GCC. Działa nie tylko w "starej wersji", najnowsza wersja też to dopuszcza.
Jak działa, to się cieszyć. Jak przeszkadza bo "według standardu nie powinno działać", to nie używać ;-)

Pobrać najnowszą wersję trudno?
Trudno. W "łatwych" dystrybucjach Linuksa nie zawsze dostępna jest najnowsza wersja jako pakiet, a instalowanie nowszej "na pałę" (np. ze źródeł) potrafi rozwalić system.
Z doświadczenia wiem, że łatwiej o najnowsze GCC 4.6.0 pod MS-DOSem niż pod jebuntu.

Poza tym wersja GCC, jak już wspomniałem nie jest tutaj winna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1