pointer array

Status
Niet open voor verdere reacties.

Icerider

Nieuwe gebruiker
Lid geworden
12 apr 2010
Berichten
3
Ik ben voor mijn masterproef in c++ segmentatie algoritmes aan het ontwerpen en implementeren(graph cuts op precies te zijn). Ik ben c++ ook nog aan het leren. De basis heb ik ondertussen wel onder de knie, maar ik probeer nu mijn programmeer stijl eleganter te maken(door oa meer en meer object gericht te werken).

Ik heb 2 dynamische array's waar ik een aantal x en y coordinaten opsla.
Die stop ik dan in een array van pointers om te returnen.
De code:
[cpp]
int* Lnx;
int* Lny;
Lnx = new int[noa];
Lny = new int[noa];
Lnx = lnx;
Lny = lny;
for(int i = 0; i<=noa; i++)
{
std::cout<<"lnx:"<<i<<":"<<lnx<<std::endl;
std::cout<<"lny:"<<i<<":"<<lny<<std::endl;
}
delete[] lnx,lny;
int** defn;
defn = new int*[2];
defn[0]=Lnx;
defn[1]=Lny;

for(int i = 0; i<=noa; i++)
{
std::cout<<"defn x:"<<i<<":"<<defn[0]<<std::endl;
std::cout<<"defn y:"<<i<<":"<<defn[1]<<std::endl;
}
return defn;
[/cpp]
lnx is een array die veel meer elementen bevat als noa. Ik wil dus enkel de eerste noa elementen hebben.

Het grote probleem dat ik niet snap is, dat als ik test, dan krijg ik als output dit:
Code:
2010-04-12 10:57:54 Cout: Lnx:0:-1
2010-04-12 10:57:54 Cout: Lny:0:-1
2010-04-12 10:57:54 Cout: Lnx:1:0
2010-04-12 10:57:54 Cout: Lny:1:-1
2010-04-12 10:57:54 Cout: Lnx:2:-1
2010-04-12 10:57:54 Cout: Lny:2:0
2010-04-12 10:57:54 Cout: Lnx:3:0
2010-04-12 10:57:54 Cout: Lny:3:0
2010-04-12 10:57:54 Cout: defn x:0:126669440
2010-04-12 10:57:54 Cout: defn y:0:-1
2010-04-12 10:57:54 Cout: defn x:1:126681144
2010-04-12 10:57:54 Cout: defn y:1:-1
2010-04-12 10:57:54 Cout: defn x:2:-1
2010-04-12 10:57:54 Cout: defn y:2:0
2010-04-12 10:57:54 Cout: defn x:3:0
2010-04-12 10:57:54 Cout: defn y:3:0
de defn x:0: zou dus een -1 moeten zijn ipv een of andere int.

Ik snap er nog minder van als ik de 2 arrays om draai, dus
defn[0] = Lny;
defn[1] = Lnx;
dan krijg ik een output waarbij:

defn y:0: een of andere rare int.
defn x:0: -1

Ergens lijkt me dat de eerste twee geheugencellen waar de pointer Lnx[0] en Lnx[1] naar verwijst veranderen. Hoe kan dat?
Heeft iemand een suggestie hoe het wel zou kunnen werken?
 
Laatst bewerkt door een moderator:
Ik vermoed dat lnx en lny (met kleine letters) de arrays zijn waarin je je waardes inleest?

In elk geval begint je code hier al met een memory leak: Je maakt 2 pointers aan en reserveert geheugen voor noa integers. Direct daarna laat je je twee pointers echter naar lnx/y wijzen, waardoor je het geheugen dat je gereserveerd had (met new) niet meer kan bereiken. Echter blijft dat geheugen wel nog steeds al 'gereserveerd' gemarkeerd staan, dus ook geen enkel ander gedeelte van jouw programma (of een ander) kan dat gebruiken.

Nadat je lnx/y dan hebt weergegeven wis je die arrays, waardoor hun geheugenblok vrijkomt.

Vervolgens maak je een nieuwe array aan die 2 elementen heeft, namelijk de pointers Lnx/y, en probeert via deze pointers je waardes opnieuw weer te geven.

Maar! (en dit is een grote maar)
defn[0] wijst naar Lnx, wat zelf een pointer is, en die wijst naar... ? NIKS. Lnx wees naar lnx, maar lnx heb je al gewist, dus dat geheugen kon ondertussen door gelijk wie aangepast worden, vandaar je 'vreemde' resultaat.


Als je even uitlegt wat je hier juist wil bereiken, zetten wij je verder op weg. (Ik vermoed het kopieren van lnx/y naar Lnx/y ?).

En dan nog een laatste woord van persoonlijk advies met betrekking tot je code eleganter maken: gebruik volle(re) namen met meer betekenis voor je variabelen: voor mezelf vind ik dat mijn code dan heel wat vlotter leesbaar/onderhoudbaar wordt. (uiteraard is er niks mis met i voor een teller of n voor een aantal, maar ik vond Lnx en lnx toch wel wat verwarrend).
 
bedankt, ik snap wat je bedoelt. Ook bedankt voor je tip ivm de variabelen.
algemeen wat ik probeerde te doen is:

Ik werk met 3D medische beelden. De data werkt met voxels ivp pixels, die voxels hebben een bepaalde geometrische afmeting. Elke pixel die je op je scherm ziet stelt een 3D volume voor van vb 0.78 op 0.78 op 4 voor.

Wat ik probeer te doen is een straal op te geven en alle voxels binnen die straal te berekenen. Daarvan de index op te slaan in een x en y array.
om een klein voorbeeltje te geven:
je straal is vb 0.8 dan weet je dat alle voor voxels met coordinaten (-1,0,0); (1,0,0);(-1,0,0);(1,0,0) ten opzichte van de voxel met coordinaat (0,0,0)(centrumvoxel) er een relatie bestaat tov de centrumvoxel. Deze verzameling wordt ookwel de neighbourhood genoemd.
Als je de straal groter maakt dan wordt ook je natuurlijk ook je neighbourhood groter. (voor meer theorie kan je wat lezen over Markov Random Fields, maar dat leidt hier veel te ver)

Aangezien de snedes 4 mm dik zijn werk ik in 2D. Je zou de straal al 4mm groot moeten maken met als gevolg dat er veel voxels in de x en y bij komen, dan wordt het programma veel te reken intensief.

de manier hoe ik dacht het aan te pakken is een kubus of beter een vierkant af te scannen en de euclidische afstand van elk voxel tot het hoofd element te bepalen. Je weet hoe groot het vierkant is van te voren. namelijk: floor((straal/voxelgrootte)^2) aantal elementen. je weet op voorhand niet hoeveel elementen dat er exact binnen de straal vallen.
Daarna om terug geheugen vrij te maken stop je ze in array waarvan je deze keer wel weet hoe groot het is. ik heb hier met pointers gewerkt om die dan in een array van pointers te stoppen en de pointer van die array dan te returnen. Ik had ook gekeken om met vectoren te werken maar om een pointer array van vectoren te maken lukt niet vanwege cast problemen.

Als je tips hebt om dit op een veel elegantere manier te doen dan hoor ik het graag daar leer ik veel van.
 
Om het eenvoudig te houden zou ik inderdaad met de vector-container gewerkt hebben.
Ik was ook even aan het denken richting linked lists, maar kom er nog niet uit en ik gok dat het uiteindelijk de code eerder ingewikkeld zou maken en niet zo heel veel opleveren.

Misschien kan je jouw poging die gebruik maakt van vectoren hier plaatsen en kunnen we daarmee verderwerken? Ikzelf heb namelijk nog geen echte problemen gehad met een vector..
 
Ik heb al geprobeerd met vectoren te werken maar dat kan ik niet gebruiken. Ik werk namelijk met mevislab (een medisch programma waarbij je modules met elkaar verbind en zo je beeld verwerkt. Je kan zelf modules maken en die programmeer je in c++. Het is me niet gelukt om vectoren te gebruiken, of mevislab kan niet met vectoren werken, of ik ken er net iets te weinig vanaf om er voor te zorgen dat mevislab niet onmiddelijk crasht als ik mijn module in laad.)
Ik heb inmiddels iets gemaakt dat iets minder elegant is maar wel goed werkt.
 
mevislab is mij ongekend, en ik beschik ook niet over de tijd om me er verder in te verdiepen.

Maar dus om arrays te kopieren dien je dat element per element te doen.

Nog veel succes met je masterproef verder!
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan