Forum » Programiranje » [C++] dinamicna alokacija iz subrutine
[C++] dinamicna alokacija iz subrutine
spin ::
ze doug nism delu s c++ (Java kriwa) :) zdej pa neki caram v Visual C++ pa sm prsu do enga problemcka, aja delam pa z MFC;
hocm narest tkole (bom pisu bol simbolicno):
class x {
unsigned long *myArrayGlobal;
void x::Test1 {
unsigned long *myLocalArray;
unsigned long *myLocalArray2 = new unsigned long[n];
allocateMemory(myArrayGlobal, 100000); // => OK
allocateMemory(myLocalArray, 100000); // => NI OK, DOBIM ERROR
fillArray(myLocalArray2, 100000); // => NI OK, DOBIM ERROR
}
void x::allocateMemory(unsigned long *myArray, unsigned long n) {
myArray = new unsigned long[n];
}
void x::fillArray(unsigned long *myArray, unsigned long n) {
for(unsigned long i=0; i < n; i++) myArray[i] = i;
}
} // end of class
sej sm butast, sam pls nej me kksn razsvetli :) LOL tnx!!!!
[edit: v oddleku programiranje imamo nekaj pravil - PREBERI ME - vsc]
hocm narest tkole (bom pisu bol simbolicno):
class x {
unsigned long *myArrayGlobal;
void x::Test1 {
unsigned long *myLocalArray;
unsigned long *myLocalArray2 = new unsigned long[n];
allocateMemory(myArrayGlobal, 100000); // => OK
allocateMemory(myLocalArray, 100000); // => NI OK, DOBIM ERROR
fillArray(myLocalArray2, 100000); // => NI OK, DOBIM ERROR
}
void x::allocateMemory(unsigned long *myArray, unsigned long n) {
myArray = new unsigned long[n];
}
void x::fillArray(unsigned long *myArray, unsigned long n) {
for(unsigned long i=0; i < n; i++) myArray[i] = i;
}
} // end of class
sej sm butast, sam pls nej me kksn razsvetli :) LOL tnx!!!!
[edit: v oddleku programiranje imamo nekaj pravil - PREBERI ME - vsc]
- spremenil: Vesoljc ()
spin ::
napaka je:
Unhandled exception at 0x004025f9 in aps2.exe: 0xC0000005: Access violation writing location 0x008e9000.
Sasos dej mi pls kratk primerck napis :) zdele sm returnu pointer sam je blo isto... verjetn sm kej narobe naredu...
unsigned long* x::alocateMem(unsigned long n) {
unsigned long *dummy = new unsigned long[n];
return dummy;
}
pa ne se smejat ce je kej narobe :D
Unhandled exception at 0x004025f9 in aps2.exe: 0xC0000005: Access violation writing location 0x008e9000.
Sasos dej mi pls kratk primerck napis :) zdele sm returnu pointer sam je blo isto... verjetn sm kej narobe naredu...
unsigned long* x::alocateMem(unsigned long n) {
unsigned long *dummy = new unsigned long[n];
return dummy;
}
pa ne se smejat ce je kej narobe :D
OwcA ::
void x::allocateMemory(unsigned long *&myArray, unsigned long n) { myArray = new unsigned long[n]; }
Otroška radovednost - gonilo napredka.
spin ::
zdej dela... :)
u bistvu delam benchmark za ene sort algoritme in jih primerjam s temi bolj klasicnimi (quick sort, buble sort, ...) :D
mi je pa neki full zanimiv:
ce aloceram memory v subrutini pol vse skup dela full hitrej... ce pa nardim globalno spremenljivko al pa tko kot smo zdej pogruntal
dela pa kr ornk pocasnej...
fora je pa v tem, da AMD to tezko prezveci INTEL pa zlahkoto dela isto kot da bi bla lokalno... INTEL 2.4 Ghz AMD 2.2Ghz (2500+ navit na 2.2Ghz)
:D pa dobr vsaj dela :)
se 1x hvala
u bistvu delam benchmark za ene sort algoritme in jih primerjam s temi bolj klasicnimi (quick sort, buble sort, ...) :D
mi je pa neki full zanimiv:
ce aloceram memory v subrutini pol vse skup dela full hitrej... ce pa nardim globalno spremenljivko al pa tko kot smo zdej pogruntal
dela pa kr ornk pocasnej...
fora je pa v tem, da AMD to tezko prezveci INTEL pa zlahkoto dela isto kot da bi bla lokalno... INTEL 2.4 Ghz AMD 2.2Ghz (2500+ navit na 2.2Ghz)
:D pa dobr vsaj dela :)
se 1x hvala
Quikee ::
Lahko se probas
void x::Test1 { unsigned long *myLocalArray; unsigned long *myLocalArray2 = new unsigned long[n]; myArrayGlobal = allocateMemory(100000); myLocalArray = allocateMemory(100000); fillArray(myLocalArray2, 100000); } unsigned long* x::allocateMemory(unsigned long n) { return new unsigned long[n]; }
spin ::
tnx, tud to dela :)
drgac pa mi je full funy tole:
//globalno
unsigned long *cache;
//
//lokalno
unsigned long *myArray;
cache = new unsigned long[1];
myArray = allocateMemory(n);
for(unsigned long i=0; i < n; i++) cache[0] = myArray[i]; // ce dam to vrstico pol se algoritm full hitrej izvaja, mogoce zarad kesiranja PCa?
algoritm();
drgac pa mi je full funy tole:
//globalno
unsigned long *cache;
//
//lokalno
unsigned long *myArray;
cache = new unsigned long[1];
myArray = allocateMemory(n);
for(unsigned long i=0; i < n; i++) cache[0] = myArray[i]; // ce dam to vrstico pol se algoritm full hitrej izvaja, mogoce zarad kesiranja PCa?
algoritm();
Quikee ::
mozno.. samo se mi zdi to cudno. Daj razlozi malo kak meris cas izvajanja in pa kateri compiler uporabljas in ali testiras na release verziji?
spin ::
Uporablam Visual Studio .NET 2005 Beta2, Ja testiram ne Release, Debug pocasnej dela...
za merjenje sm uporabu metodo: GetTickCount();
kompajler pa who knows :) pac pozenem... mam sele 1mesc Visual Studio :)
za merjenje sm uporabu metodo: GetTickCount();
kompajler pa who knows :) pac pozenem... mam sele 1mesc Visual Studio :)
spin ::
recmo ce testiram algoritm:
1. casovna odvisnot O(n^2)
2. algoritm je za sorteranje tabel po velikosti
3. Tabela velikosti = 100.000 elementov
Globalna spremenljivka: cca 8.2 sec
Lokalna Spremenljivka: cca 6.1 do 6.5 sec
Lokalna Spremenljivka pa un uspredi: cca 5.6 sec :D
sam mi je full zanimiv spet, ker ce dam stavk:
for(unsigned long i=0; i < n; i++) cache[0] = myArray[i];
v funkcijo, pa pol funkcijo poklicm je pa spet sranje :D
sej pravm mal mi je smesn tole, pomislu sm na keseranje sam ne vem :D who knows hehe
1. casovna odvisnot O(n^2)
2. algoritm je za sorteranje tabel po velikosti
3. Tabela velikosti = 100.000 elementov
Globalna spremenljivka: cca 8.2 sec
Lokalna Spremenljivka: cca 6.1 do 6.5 sec
Lokalna Spremenljivka pa un uspredi: cca 5.6 sec :D
sam mi je full zanimiv spet, ker ce dam stavk:
for(unsigned long i=0; i < n; i++) cache[0] = myArray[i];
v funkcijo, pa pol funkcijo poklicm je pa spet sranje :D
sej pravm mal mi je smesn tole, pomislu sm na keseranje sam ne vem :D who knows hehe
spin ::
AJA :D
pa se to me zanima:
unsigned long dummy = 0;
for(unsigned long i=0; i < 1000000000; i++) dummy = i;
moj kompajler tole preprosto preskoc, pa kr sam izracuna vrednost za dummy :) sej to je sicr cist pametno...
sam funny vseen :) vcasih k je biu se DOS aktualn, sm tko delay delu LOL :D
pa se to me zanima:
unsigned long dummy = 0;
for(unsigned long i=0; i < 1000000000; i++) dummy = i;
moj kompajler tole preprosto preskoc, pa kr sam izracuna vrednost za dummy :) sej to je sicr cist pametno...
sam funny vseen :) vcasih k je biu se DOS aktualn, sm tko delay delu LOL :D
SasoS ::
Nekako ne vidim tvoje poante for(unsigned long i=0; i < n; i++) cache[0] = myArray[i]; vrstice...si prepričan da ti algoritem deluje uredu?
Quikee ::
Hehe.. pa res.. v tem primeru (brez oklepajev) bi ti cache[0] na koncu kazal na zadnji element ;)
Piporocam, da si naredis nek test... recimo v stilu:
Piporocam, da si naredis nek test... recimo v stilu:
unsigned int sortiraneVrednosti[] = {1,1,2,3,4,9,10,10,11,13}; unsigned int vhodneVrednosti[] = {13,1,9,10,3,10,4,1,11,2}; sortiraj(vhodneVrednosti, sizeof(vhodneVrednost)/sizeof(unsigned int)); if (!primerjajVrednosti(sortiraneVrednosti, vhodneVrednosti)) //javi napako
spin ::
algoritem na koncu izpljune urejeno tabelo, ki jo zapise v .txt datoteko... pa zmer jo uredu uredi tko da vsi algoritmi 100% pravilno delajo...
fore res ni une vrstice... to sm ugotovu po nakljucju, ko sm iz globalne spremenljivke koperu v lokalno ... pa sm koperu vrednosti.. pol se mi je pa zdel cudn zakaj je tkoj hitrej :D
se prau najprej sm meu:
for(int i=0; i < N; i++) myArray[i] = myArrayGlobal[i];
pol sm obrnu
fill(myArray);
for(int i=0; i < N; i++) myArrayGlobal[i] = myArray[i];
pol sm si pa reku da sploh ne rabm globalne spremenljivke pa sm nared cache = new unsigned long[1]; :)
do te fore sm cist prsu po naklucju, ker sm hotu narest cim hitrejso zadevo, opazu sm pa tkoj
da globalno dela pocasnej kot lokalno, pa peach me zakaj?
fore res ni une vrstice... to sm ugotovu po nakljucju, ko sm iz globalne spremenljivke koperu v lokalno ... pa sm koperu vrednosti.. pol se mi je pa zdel cudn zakaj je tkoj hitrej :D
se prau najprej sm meu:
for(int i=0; i < N; i++) myArray[i] = myArrayGlobal[i];
pol sm obrnu
fill(myArray);
for(int i=0; i < N; i++) myArrayGlobal[i] = myArray[i];
pol sm si pa reku da sploh ne rabm globalne spremenljivke pa sm nared cache = new unsigned long[1]; :)
do te fore sm cist prsu po naklucju, ker sm hotu narest cim hitrejso zadevo, opazu sm pa tkoj
da globalno dela pocasnej kot lokalno, pa peach me zakaj?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Arduino kot časovni releOddelek: Pomoč in nasveti | 1615 (1201) | davor92 |
» | Kako deluje strojna koda?Oddelek: Programiranje | 2212 (1672) | Zheegec |
» | [C/C++] unsigned long lala = -1;Oddelek: Programiranje | 1175 (1134) | Vesoljc |
» | Casovni problem v C/C++Oddelek: Programiranje | 1258 (1159) | sid_dabster |
» | Coding StyleOddelek: Programiranje | 3465 (2657) | 64202 |