Używam biblioteki dcmtk do modyfikowania danych pikseli skompresowanego obrazu dicom o wielu klatkach. Tak więc, aby to zrobić, w pewnym momencie w pętli for
biorę dane pikselowe każdej zdekompresowanej ramki i modyfikuję je zgodnie z moim życzeniem i próbuję połączyć poszczególne zmodyfikowane dane pikseli w dużym buforze pamięci klatka po klatce. Ten podstawowy proces pętli for
jest następujący.Błąd pamięci podczas korzystania z memcpy?
Problem jest po pierwszej iteracji, która daje pamięć w wierszu kodu, w którym nazywam funkcję getUncompressedFrame
. Myślę, że dzieje się tak z powodu linii memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF);
, ponieważ kiedy usuwam tę linię, nie ma w tym czasie błędu, a cała pętla for działa absolutnie dobrze.
Czy możesz mi powiedzieć, jeśli popełniam błąd podczas pracy z memcpy? Dzięki.
Uint32 sizeF=828072;// I just wrote it to show what is the data type.
Uint8 * fullBuffer = new Uint8(int(sizeF*numOfFrames));//The big memory buffer
for(int i=0;i<numOfFrames;i++)
{
Uint8 * buffer = new Uint8[int(sizeF)];//Buffer for each frame
Uint8 * newBuffer = new Uint8[int(sizeF)];//Buffer in which the modified frame data is stored
DcmFileCache * cache=NULL;
OFCondition cond=element->getUncompressedFrame(dataset,i,startFragment,buffer,sizeF,decompressedColorModel,cache);
//I get the uncompressed individual frame pixel data
if(buffer != NULL)
{
for(unsigned long y = 0; y < rows; y++)
{
for(unsigned long x = 0; x < cols; x++)
{
if(planarConfiguration==0)
{
if(x>xmin && x<xmax && y>ymin && y<ymax)
{
index=(x + y + y*(cols-1))*samplePerPixel;
if(index<sizeF-2)
{
newBuffer[index] = 0;
newBuffer[index + 1] = 0;
newBuffer[index +2] = 0;
}
}
else
{
index=(x + y + y*(cols-1))*samplePerPixel;
if(index<sizeF-2)
{
newBuffer[index] = buffer[index];
newBuffer[index + 1] = buffer[index + 1];
newBuffer[index + 2] = buffer[index + 2];
}
}
}
}
}
memcpy(fullBuffer+(i*sizeF),newBuffer,sizeF);
//concatenate the modified frame by frame pixel data
}
Run w debugger, jeśli to zatrzymuje się, a następnie bada wartości 'i' i' sizeF', aby sprawdzić, czy wyglądają dobrze. Jeśli to się nie skończy, ustaw punkt przerwania. –
Uruchomiłem debugger, i i sizeF daje odpowiedni numer. Program działa dobrze Nie używam wiersza kodu z memcpy, ale jeśli go użyję, program się zepsuje. –
typ formatu sizeF ?? –