Problem z zakresem tablicy w dev c++

0

Witam mam problem z tablica jednowymiarową ponieważ jej zakres jest bardzo ograniczony do 1000000 a ja potrzebuje dużo więcej
I tu moje pytanie jak zwiększyć zakres tablicy
Z góry bardzo dziękuje

0

Dynamiczne tablice,

int* tablica=new int[1000000000000];

na koniec zwalniasz pamiec

delete []tablica;

Poczytaj o wskaźnikach, o new i delete żebyś nie narobil wycieków pamięci itd.

Pozdro

0

Dzięki wielkie ale to mi nie pomogło
Teraz mój program dla dużych liczb nie oblicza nic
Wrzucam mój program który ma obliczać ile samochodów wyminęło się 0-samochod jedzie w prawo 1-samochod jedzie w lewo i dla dużych liczb program nie działa
int n,k=0,d=0,f=0,w;
cin>>n;
int* tablica=new int[n];

for (int i=0;i<n;i++)
cin>>tablica[i];

do
{ w=tablica[k];
if (w==0)
d=d+1;
else
f=f+d;

      k=k+1;
      
      
}while (k<n);
cout<<f;
0

@Edit
Zakres jest do liczb 12 cyfrowych

upss double post sorry

0

Zdajesz sobie sprawę, że int tablica[1000000]; zajmuje ok. 4GB pamięci?

ravi35 napisał(a)

Zakres jest do liczb 12 cyfrowych

Zdajesz sobie sprawę, że int tablica[100000000000]; zajmuje ok. 93GiBstrasznie dużo pamięci?

0

w takim razie co mam zrobić ?

0
ravi35 napisał(a)

@Edit
Zakres jest do liczb 12 cyfrowych

a w int pomieścisz liczby do (2^32) - 1

0
wowow napisał(a)
ravi35 napisał(a)

@Edit
Zakres jest do liczb 12 cyfrowych

a w int pomieścisz liczby do (2^32) - 1

sorry błąd (2^16) - 1 (dodatnie), druga połowa to ujemne.

0
wowow napisał(a)
wowow napisał(a)
ravi35 napisał(a)

@Edit
Zakres jest do liczb 12 cyfrowych

a w int pomieścisz liczby do (2^32) - 1

sorry błąd (2^16) - 1 (dodatnie), druga połowa to ujemne.
to też zależy od architektury.

1

Co wy mieliście z matematyki? o_O
int który ma 4 bajty pomieści 232 różnych wartości. Wolę nie myśleć skąd wzieliście to 216 bo 232 / 2 = 231 a nie 2^16...
W wesji unsigned to będzie po prostu od 0 do 232 -1 a w wersji signed od -231 do 2^31

0

W takim razie co proponujecie?

0

Na prawdę masz dane o wielkości setek gigabajtów? Wydaje mi się, że masz po prostu dla każdego samochodu ciąg znaków (max 12) w postaci np. 01000110001, który określa trasę. Po prostu wtedy wczytujesz do stringa i patrzysz na kolejne pozycje.

0

Tutaj jest link do tego zadania i jak wysyłam do sprawdzenia do wyskakuje błąd dla dużych liczb
http://main.edu.pl/pl/archive/ilocamp/2011/sam

0

Zadeklaruj f jako long long (64 bity), powinno działać.

0

@up Dzięki podziałało ale teraz mam problem bo przekraczam limit pamięci

0

Ok temat do zamknięcia już zrobiłem
Wielkie dzięki za pomoc

0

ile punktów?

0

Witam!
Sorka za "podczepienie się" do tematu, ale mam podobny problem. Otóż, za zadanie mam przybliżyć całkę oznaczoną za pomocą dowolnej kwadratury Newtona-Cotesa, następnie zmodyfikować wyniki za pomocą metody Romberga i porównać błędy tych metod. Do kwadratury potrzebuję dużej ilości pod przedziałów (nawet 410) a do metody tablicy dwuwymiarowej (dokładniej trójkątnej) o wymiarach równych liczbie przedziałów. Tablicę tworzę dynamicznie,

        long int n = pow(4,potega);
        double **tab = new double*[n+1];
        for (long int i=0;i<n+1;i++)
        {
            tab[i]= new double[n+1];
        }

niestety po przekroczeniu 7 potęgi (tablica o wymiarach 16384+1x16384+1) program się wywala. Co robię źle? Co powinienem zrobić lub poprawić?

0

Właśnie przekraczasz limit alokowalnej pamięci dla procesu 32bitowego. Double u Ciebie zajmuje zapewne 8 bajtów, stąd
8*(4^7+1)^2 = 2 147 745 800, co jest więcej niż 2GB.

Jesteś pewien że taki byczy ochłap pamięci jest Ci potrzebny? Jeśli koniecznie musisz operować na takiej potędze, to zastąp double float'em.

0

Dałeś mi właśnie do myślenia, muszę w takim razie porozmawiać na ten temat z doktorem który będzie oceniał ten projekt. On nie przyjmuje float'ów gdyż dla niego mają zbyt krótkie rozwinięcie po przecinku, no a niestety aby otrzymać względnie dokładne wyniki, potrzebuję double, dużej ilości przedziałów co równa się utworzeniu ogromnej tablicy :/ Dzięki za szybką odpowiedź :)

0

No i się dowiedziałem :D Źle zrozumiałem sformułowanie zdania :/ Doktor napisał mi, że tworząc tablicę, wrzucam do niej nie kolejne wyniki poszczególnych pod przedziałów tylko ogólny wynik dla konkretnych gęstości, czyli w pierwszą kolumnę poszczególnych wierszy wrzucam tylko kolejno wyniki dla 40, 41, 42 itd. działam na nich metodą Romberga, po czym porównuję wyniki dla konkretnych gęstości czyli np pierwszą i ostatnią kolumnę w 8 wierszu (dla 47)Także mój problem został rozwiązany, w sobotę usiądę i bd miał po projekcie. Dzięki za pomoc ;)

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