» »

[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]
  • spremenil: Vesoljc ()

OwcA ::

Katero napako pa javi?
Otroška radovednost - gonilo napredka.

SasoS ::

V proceduri allocate moraš returnat pointer al ga pa prenašat po referenci

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

OwcA ::

void x::allocateMemory(unsigned long *&myArray, unsigned long n) 
{ 
  myArray = new unsigned long[n];
}
Otroška radovednost - gonilo napredka.

spin ::

tnx!!!!!!!!

prvic vidm foro... no vsi se morm 1x naucit :D

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

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();

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 :)

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

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

Quikee ::

Zdaj lahko delay delas z Sleep() metodo.

spin ::

lol... sej to je blo bol tko v sali misleno to z delay() :) ;)

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:
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?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Arduino kot časovni rele

Oddelek: Pomoč in nasveti
81615 (1201) davor92
»

Kako deluje strojna koda?

Oddelek: Programiranje
182212 (1672) Zheegec
»

[C/C++] unsigned long lala = -1;

Oddelek: Programiranje
51175 (1134) Vesoljc
»

Casovni problem v C/C++

Oddelek: Programiranje
91258 (1159) sid_dabster
»

Coding Style

Oddelek: Programiranje
433466 (2658) 64202

Več podobnih tem