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

[c] Wartość graniczna tablicy

Ostatnio zmodyfikowano 2014-05-21 12:50
Autor Wiadomość
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 :


C/C++
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
P-110527
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.

C/C++
int tab[ 10 ];

C/C++
#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ęć. 
P-110534
maly
» 2014-05-21 09:56:47
Ilość dostępnego stosu można sprawdzić funkcją stackavail z <malloc.h>.
P-110535
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.
P-110536
maly
» 2014-05-21 10:14:08
Jeśli w Windows to VirtualQuery.
P-110537
Adik80
» 2014-05-21 12:50:08
A posixy:
C/C++
struct rlimit r { 0, 0 };
getrlimit( RLIMIT_STACK, & r );
printf( "%d", r.rlim_cur );
P-110547
« 1 »
  Strona 1 z 1