[c] Wartość graniczna tablicy
Ostatnio zmodyfikowano 2014-05-21 12:50
okowiec Temat założony przez niniejszego użytkownika |
[c] Wartość graniczna tablicy » 2014-05-21 07:03:31 Witam,mam taki o oto program : int main() { char t[ 100000000 ]; int i; for( i = 0; i < t; i++ ) { printf( "%d udalo się!\n", t[ i ] ); }
i zadanie do niego "Jaka jest graniczna wartość rozmiaru tablicy t[], kiedy program poprawnie działa i nie zgłasza błędu?" Nie wiem jak zrobić ,żeby program wyświetlał mi wartość max t. Wiem ,że teraz jest teraz za duże i wartość to ponad 200 000 ,ale jak zrobić ,żeby program pokazywał mi dokładnie do kiedy się uda. Jaką pętlę zrobić ,proszę o pomoc |
|
akwes |
» 2014-05-21 09:20:12 Jest to... bardzo trudne pytanie i można na nie odpowiedzieć na wielu poziomach. W samym C++ ciężko powiedzieć, że takie ograniczenie istnieje, bardziej jest to kwestia sprzętowa. Jeżeli chcemy mieć to wykryte na poziomie kompilacji kodu to mówimy o rozmiarze ramki stosu i tablicy w postaci zmiennej automatycznej. #include <limits>
size_t s = std::numeric_limits < size_t >::max();
Później, w przypadku dynamicznej alokacji bądź std::vector , staje się to dość płynne. Maksymalny indeks tablicy określa maksymalna wartość typu std::size_t. Drugą kwestią jest rozmiar pamięci. Jeżeli w tablicy mamy bardzo duże obiekty to pamięć może nam się wyczerpać już przy kilku indeksach natomiast bardzo małych obiektów możemy mieć... miliony. Co więcej tablica ma taką własność, że musi zajmować ciągły obszar pamięci, jeżeli pamięć jest pofragmentowana to ciężko będzie upchnąć cokolwiek większego. Kolejną rzeczą będzie alokator, on również może afektować na to jak jest alokowana i zwalniana pamięć. |
|
maly |
» 2014-05-21 09:56:47 Ilość dostępnego stosu można sprawdzić funkcją stackavail z <malloc.h>.
|
|
pekfos |
» 2014-05-21 09:57:54 ale jak zrobić ,żeby program pokazywał mi dokładnie do kiedy się uda. |
To tak nie działa. Sama próba utworzenia takiej tablicy wywoła błąd. Utwórz funkcję z mniejszą tablicą, wywołuj ją rekurencyjnie i wypisuj w niej kolejne numery. Jeśli to w ogóle ma sens. Nie ma jakiejś jednej, stałej, magicznej liczby, która jest odpowiedzią na te pytanie. Jeśli masz podać konkretną wartość, i tak nie trafisz. Ilość dostępnego stosu można sprawdzić funkcją stackavail z <malloc.h>. |
Jeśli w ogóle coś takiego ma. |
|
maly |
» 2014-05-21 10:14:08 Jeśli w Windows to VirtualQuery. |
|
Adik80 |
» 2014-05-21 12:50:08 A posixy: struct rlimit r { 0, 0 }; getrlimit( RLIMIT_STACK, & r ); printf( "%d", r.rlim_cur ); |
|
« 1 » |