DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > Programiranje
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

Programiranje Java, Perl, VB, ASP, .NET, C, C++, Pascal, Delphi Sponzor: VIP izazov 3

Odgovori
 
Alati teme Način prikaza
Staro 19. 12. 2010.   #1
smez
smezuljak
 
Datum učlanjenja: 17.01.2010
Lokacija: Smederevo
Poruke: 3
Hvala: 1
0 "Hvala" u 0 poruka
smez is on a distinguished road
Default C++, alociranje memorije za strukturu

Imam jedan od onih problema o kojima guglaš po' sata a nigde ne možeš da nađeš rešenje.. Koristim DevCpp i puca kada se alocira veća memorija. A vrrrrrrlo mi je neophodna.

Prolazi:
Kôd:
struct pix {
	unsigned char B, G, R;
} pic[800][800];
A treba mi, i ne prolazi:
Kôd:
struct pix {
	unsigned char B, G, R;
} pic[900][900];
Takođe ne prolazi ni:
Kôd:
struct pix {
	unsigned char B, G, R;
} pic[800][800], pic2[800][800];
A čisto da se uporedi sa prvim ne prolazi ni:
Kôd:
struct pix {
	unsigned char B, G, R;
        int abc;
} pic[800][800];
Kad kažem "ne prolazi" to znači da puca pri startovanju, neće da se pokrene.

Kako alocirati više memorije?
__________________
Šta mi vredi što sam pametan kad imam posla sa budalama?
smez je offline   Odgovorite uz citat
Staro 19. 12. 2010.   #2
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Pretpostavljam da to pokušava da alocira na steku, a izgleda da je limit na cygwin 2Mb.

Povećaj stack size ili, bolje, alociraj dinamički.
__________________
blog

Poslednja izmena od jablan : 19. 12. 2010. u 20:45.
jablan je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #3
misko_
profesionalac
Qualified
 
Datum učlanjenja: 22.09.2007
Lokacija: Split
Poruke: 111
Hvala: 8
39 "Hvala" u 10 poruka
misko_ is on a distinguished road
Default

Ja imam još jedno pitanje u vezi ovoga.

Zanimam me kako se može saznati koiko se može alocirati na steku ili u slobodnom prostoru(dinamički) ?
Znači kako ja mogu uopće znati koliko mi je još MB dostupno za alociranje ?
predpostavljam da OS se brine oko toga koliko će kome dati i koliko još tko ima, ali kako ja mogu doći do tih informacija ?
misko_ je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #4
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Nisam 100% siguran da li postoje pozivi koji ti to vraćaju. Što se tiče steka, pogledaj ovde:

Kôd:
jablan@poneti:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Što se hipa tiče, nisam primetio da stdlib.h nudi neku odgovarajuću funkciju. Međutim, uvek možeš da "napipaš" vrednost polovljenjem intervala, pošto malloc vraća NULL ako ne uspe da alocira zadatu veličinu.

Uostalom, javiće se već neki ETF-ovac da pojasni stvari...
__________________
blog
jablan je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #5
Dragi Tata
dinosaurus
Master
 
Avatar Dragi Tata
 
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
Dragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoro
Default

Пар ствари:

1) DevCpp је мање-више мртав. Ако хоћеш неки IDE за gcc под Виндоузом, погледај Code::Block.

2) Ако већ користиш C++ (код који си показао може да буде и С), лепо скини готову библиотеку за матрице (предлажем ову: http://www.boost.org/doc/libs/1_39_0...doc/matrix.htm ) и нема да те боли глава.

3) Веруј ми да не желиш да се бакћеш са проверама величине стека. Ако имаш иоле велику структуру података, мораћеш да је креираш на хипу. Лепота код С++а је што постоје класе (као нпр матрица коју сам ти препоручио) које ти омогуће да креираш објекат на стеку а он интерно алоцира и деалоцира меморију са хипа колико му треба.
Dragi Tata je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #6
Dragi Tata
dinosaurus
Master
 
Avatar Dragi Tata
 
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
Dragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoro
Default

Citat:
Originalno napisao jablan Pogledajte poruku
pošto malloc vraća NULL ako ne uspe da alocira zadatu veličinu.
Чисто информације ради: на Линуксу то најчешће није случај. Тамо malloc увек врати поинтер који није нула и онда тек кад га дереференцираш он прсне. Више о томе: http://linux.die.net/man/3/malloc
Dragi Tata je offline   Odgovorite uz citat
Staro 21. 12. 2010.   #7
misko_
profesionalac
Qualified
 
Datum učlanjenja: 22.09.2007
Lokacija: Split
Poruke: 111
Hvala: 8
39 "Hvala" u 10 poruka
misko_ is on a distinguished road
Default

Citat:
Originalno napisao jablan Pogledajte poruku
Međutim, uvek možeš da "napipaš" vrednost polovljenjem intervala, pošto malloc vraća NULL ako ne uspe da alocira zadatu veličinu.
Da malloc možda i da, ali new C++ operator ne radi tako.
I to me zbunjuje jer i mnogim knjiga piše da je.
Evo što sam otkrio.

Prvo kod kompajiram sa g++ na RHEL sa:
[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test

Napisao sam sljedeći code:
Kôd:
#include <iostream>

int main(int argc, char *argv[])
{
    double * array;
    array = NULL;
    printf("PRVI ALLOC\n");

    array = new double[1000000000];

    if( NULL == array )
    {
        printf("Nije uspio alocirati.\n");
    }
}
Program se uredno komapjlira, ali kada ga pokrenemo dobijem ovo
Kôd:
[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test
PRVI ALLOC
terminate called after throwing an instance of 'std::bad_alloc'
  what():  St9bad_alloc
Aborted
Iz ovoga zakljucujem da se ovako treba raditi provjera alocirane memorije u C++.
Kôd:
#include <iostream>
int main(int argc, char *argv[])
{
    double * array;
    array = NULL;
    printf("PRVI ALLOC\n");

    try
    {
        array = new double[1000000000];
    }
    catch( std::bad_alloc )
    {
        printf("array ALOCIRANJE NIJE USPIJELO\n");
        exit( -5 );
    }
    catch(...)
    {
        printf("NESTO NIJE USPIJELO\n");
    }
}
Kada ovaj kode pokrenem i kompajliram, dobijem:
Kôd:
[sasa@localhost my_code]$ g++ test.cpp -g -o test && ./test
PRVI ALLOC
array ALOCIRANJE NIJE USPIJELO
U dosta knjiga će se naći da se nakon new treba sa if( NULL == p ) prvojeriti da li je memorija stvarno alocirana.
Iz ovoga moga eksperimenta je jasno da je to koncept koji više ne funkcionira.

Mene sada zanima, od kada se to izmjenilo?
I ako netko ima još kakvih dodatnih informacija može ih iznjeti u vezi ove tematike.
misko_ je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #8
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

^ Koliko kapiram, nije da nikad ne vraća NULL, već ponekad ne vrati NULL iako nema garancije da je to i alocirao?

Off Topic: BTW, čovek Splićanin, a ti razvezao ćirilicom...
__________________
blog
jablan je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #9
Dragi Tata
dinosaurus
Master
 
Avatar Dragi Tata
 
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
Dragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoroDragi Tata će postati "faca" uskoro
Default

Citat:
Originalno napisao jablan Pogledajte poruku
^ Koliko kapiram, nije da nikad ne vraća NULL, već ponekad ne vrati NULL iako nema garancije da je to i alocirao?
Јесте, лоше сам се "одразио"

Поента је да не можеш да рачунаш на то да ће malloc да му врати NULL.

Off Topic: BTW, čovek Splićanin, a ti razvezao ćirilicom...


Упс. Ево лека: Microsoft Transliteration Utility

Мада, ако је већ кренуо да учи С++, ћирилица му је најмањи проблем
Dragi Tata je offline   Odgovorite uz citat
Staro 20. 12. 2010.   #10
jablan
VD IT Direktora
Invented the damn thing
 
Avatar jablan
 
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
jablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamenjablan je pravi dragi kamen
Default

Citat:
Originalno napisao Dragi Tata Pogledajte poruku
Evo još jednog:

http://www.benya.com/cyrillic/tocyrillic/#bookmarklets
__________________
blog
jablan je offline   Odgovorite uz citat
Odgovori



Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum


Vreme je GMT +2. Trenutno vreme je 01:34.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.