PDA

Tam Sürümünü Görmek İçin : Dinamik bellek yardim??


tryon
19/02/2008, 20:29
Merhaba arkadaslar,

Goruntu isleme ile ilgili bir proje yapiyorum. Kodun bir kisminda
dar bogaz yasiyorum ve yorumlariniza ihtiyacim var.


Resmin RGB icin asagidaki gibi bir struct olusturdum.

typedef struct{
float b,g,r; // gecici resim dizisi icin yapi tanimlama
} Tmp;


Bu RGB degerlerini tutacak gecici 2 boyutlu dinamik dizi
tanimlamalarini asagidaki gibi yaptim.

Temp_img = (Tmp **)malloc(sizeof(Tmp*) * height);

for(i=0;i<height;i++){
for(j=0;j<width;j++){

Temp_img[i] = (Tmp *)malloc(sizeof(Tmp) * width);
}
}


if (Temp_img == NULL){
printf("Yetersiz bellek...\n");
exit(1);
}


Temp_img_2 = (Tmp **)malloc(sizeof(Tmp*) * height);

for(i=0;i<height;i++){
for(j=0;j<width;j++){

Temp_img_2[i] = (Tmp *)malloc(sizeof(Tmp) * width);
}
}


if (Temp_img_2 == NULL){
printf("Yetersiz bellek...\n");
exit(1);
}


400*320 boyutunda bir resmi test ettigimde, dinamik dizilerin
yaratilmasi uzun sure aliyor. Bunu nasil kisaltabilirim?


acehreli
19/02/2008, 20:48
(Temp_img == NULL) denetimini Temp_img'i ayirdigin anda yapman dogru olmaz mi? Yoksa NULL olsa bile ona erismeye calisacaksin. Ayni sey Temp_img_2 icin de gecerli.

Temp_img[i]'lerin malloc'lari da NULL dOndUrebilir. Onlari da... :)

Eger yavaslik cok sayida malloc cagrisi yuzunden oluyorsa, herseyi tek bir malloc ile ayirip, o bellegin belirli yerlerini belirli satir ve sutundaki Tmp icin kullanabilirsin:

Tmp * butun_tmpler = (Tmp*)malloc(sizeof(Tmp) * height * width);

i. satir ve j. sutundaki Tmp'in adresi soyle bulunabilir:

butun_tmpler[i * width + j]

Ali

bluekid
20/02/2008, 09:15
img her satırı için yer ayırmaktansa her img için yer ayırmak daha pratik
320 defa 400 Tmp lik yer ayırmak nerede bir seferde 320x400 Tmp lik yer ayırmak nerede ?
hatta sen 320 defa 400 Tmp lik yer ayırma işlemini 400 defa yapmışsın ! tabii ki yavaş olacak ve üstelik hafızada ayrıdığın yerin pointerlarını kaybediyorsun üst üste yazarak. yani for j döngülerinin olmaması lazım.