C++ - tablice

0

Witam wszystkich forumowiczów :)

W wielu książkach do programowania tablice rozróżnia się na statyczne i dynamiczne.

Moje pytanie: czy taki sposób użycia tablic jest pewnego rodzaju ewenementem:

Kopiuj
 
#include <iostream>

using namespace std;

int main(){
    
    int rozmiar;
    cin >> rozmiar;
    
    int tablia[rozmiar];   // - chodzi o tą linijkę
       
    return 0;   
}

Wszędzie piszą, że takie użycie jest błędem, bo rozmiar powinien być znany już w czasie kompilacji...
Jednakże mi taki sposób działa i sam nie wiem sam czy mam używać mechanizmu do tworzenia dynamicznych tablic, czy pozostać z tym ;/

Z góry dziękuję wszystkim za odpowiedź :)

Resident
albo rozmiar ustawiasz podczas tworzenia i jest on const, albo tworzysz dzięki dynamicznemu alokowaniu tablic
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

Owszem działa ale tylko na jednym kompilatorze.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

Jeżeli można spytać to co przez to mam rozumieć? :)

Sopelek
że tak się nie powinno robić
MN
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 12 lat
0

Że jeśli byś użył innego kompilatora, to by nie działało. Powinieneś alokować pamięć dynamicznie ;) i później ją zwalniać.

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

użyj klasy vector - opis tutaj, poszukaj sobie też przykładów (na tej stronie też są):
http://www.cplusplus.com/reference/vector/vector/

tak jak napisałeś robi się częściej w C gdzie nie ma innych możliwości.


░█░█░█░█░█░█░█░█░█░█░█░
_13th_Dragon
Od kiedy C został pozbawiony funkcji malloc ?
matek3005
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 5 lat
  • Postów:358
0
C_Grinch napisał(a):

Jednakże mi taki sposób działa

w c++ możesz niejednokrotnie spotkać się z takimi sytuacjami, które często (zwykle) będą działać ale ogólnie nie masz pewności czy zawsze i __wszędzie __zadziałają. Jeśli chcesz tworzyć oprogramowanie w tym języku, które zadziała ci w każdej sytuacji i niezależnie od użytego kompilatora powinieneś pisać zgodnie ze standardem. Wiele kompilatorów posiada dodatkowe mechanizmy "tuningujące" język. Pamiętaj jednak, że nie są one zgodne ze standardem i stosowanie ich może zawęzić twoje możliwości pod kątem kompilacji ich w innych architekturach bądź pod innymi kompilatorami. Oczywiście z tym programowaniem zgodnie ze standardem oraz zgodnością kompilatorów z nim to różnie bywa. Wszystko dla ludzi, pytanie co i do czego potrzebujesz, ale gdy miewasz jakieś wątpliwości jak ta w tym temacie, to warto zajrzeć do tego dokumentu i zobaczyć co na dany temat sądzi komitet standaryzujący (a w tym sam twórca języka).

Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
0

GCC obsługuje VLA z >=C99 w C++. Można dodać do komendy: -pedantic żeby zobaczyć ostrzeżenie:
warning: ISO C++ forbids variable length array ‘tablia’ [-Wvla] które informuje o tym, że to nie jest dopuszczalne w standardowym C++.

Z tego i innych powodów w GCC sugeruję używanie -Wall -Wextra -pedantic przy każdej kompilacji. (Można też dodać -Weffc++, ale nie zawsze jest to przydatne)


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
n0name_l
Przy kazdej kompilacji? bym chyba zwariowal ;> Wystarczy na ostatniej w trybie debug danego projektu.
RE
jeżeli wariujesz od ilości ostrzeżeń to znaczy, że już od początku piszesz słaby kod i warto pisać go tak, by już od pierwszej kompilacji nie było się do czego przyczepić.
n0name_l
Przy pisaniu 50+ plikow zaczynajac od szkieletow bys mial min 300 warningow typu unused parametr, do tego w pewnych miejscach po prostu wiem, ze tam sypnie warningiem i zostawiam tak jak jest, zeby to pozniej uzupelnic. Dlatego tez wystarczy ostatnia kompilacja w trybie debug do wykrycia czegos co przeoczylem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.