Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2015, 19:41   #1
Kr@ShAK
Пользователь
 
Регистрация: 17.12.2013
Сообщений: 11
Восклицание Проблема с памятью при реализации медианного фильтра на Си

Стараюсь реализовать медианный фильтр на Си, компиляция проходит успешно, но на определенном моменте работы приложения система выдает ошибку связанную с памятью (Windows "Нарушение прав доступа при чтении.", Linux "Ошибка сегментирования (сделан дамп памяти)" )

Код:
#define W 640
#define H 480

int median(int matr[H][W], int width, int height) {
   int window[9];
   int result_temp[H][W];
   int x,y,fx,fy;
   for (x = 1; x < (width - 1);x++) 
       for (y=1; x < (height - 1);y++){
           i = 0;
           for (fx = 0; fx < 3; fx++)
               for (fy = 0; fy < 3; fy++) {
				   window[i] = matr[x + fx - 1][y + fy - 1]; 
				   i++;
			   }
	  qsort(window,9,sizeof(int),cmp);
           result_temp[x][y] = window[4];
	   }
	   return result_temp[H][W];
}
Kr@ShAK вне форума Ответить с цитированием
Старый 15.03.2015, 20:20   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1) Вы возвращаете одно число, а не матрицу.
2) Лучше передать по указателям исходную и результирующую матрицы (куда будет записываться результат).
3) Не согласованы циклы по высоте/длине (первый индекс обычно высота, а второй - длина).
4) В заголовке второго for перемешаны x и y.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.03.2015, 21:59   #3
Kr@ShAK
Пользователь
 
Регистрация: 17.12.2013
Сообщений: 11
По умолчанию

BDA, спасибо предыдущую ошибку исправил

Цитата:
1) Вы возвращаете одно число, а не матрицу.
2) Лучше передать по указателям исходную и результирующую матрицы (куда будет записываться результат).
Пока убрал функцию вообще =)

Цитата:
4) В заголовке второго for перемешаны x и y.
А вот эту обидную опечатку исправил

Теперь новая проблема: при маленьких значениях (в некоторых местах в результирующей матрице не считает т.к. выводит -858993460), а на тех размерах которых нужно мне говорит "Stack overflow" =(((

Вот код
Код:
#define W 640
#define H 480
int i,j;

int cmp(const void *a, const void *b) {
     return *(int*)a - *(int*)b;
 }

void Generate(int a[H][W]){
	for (i = 0; i < H; i++)
		for (j = 0; j < W; j++)
			a[i][j] = rand()%100;
}

void Enter(int a[H][W]){
	for (i = 0; i < H; i++){
		for (j = 0; j < W; j++)
			printf("%3i\t",a[i][j]);
	printf("\n");
	}
}

int main(){
	
	int image[H][W], itog[H][W], window[9];
	int x,y,fx,fy;
	
	Generate(image);	

	//Median Filter
	for (x = 1; x < (H - 1); x++) 
		for (y = 1; y < (W - 1); y++) {
			i = 0;
			for (fx = 0; fx < 3; fx++)
				for (fy = 0; fy < 3; fy++) {
					window[i] = image[x + fx - 1][y + fy - 1]; 
					i++;
				}
			qsort(window,9,sizeof(int),cmp);
			itog[x][y] = window[4];
	   }	   

	printf("Image : ________________________\n");
	Enter(image);
	printf("Itog : ________________________\n");
	Enter(itog);

	_getch();
}
Kr@ShAK вне форума Ответить с цитированием
Старый 15.03.2015, 23:20   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#define W 640
#define H 480
int i,j;

int cmp(const void *a, const void *b) {
     return *(int*)a - *(int*)b;
 }

void Generate(int **a){
    for (i = 0; i < H; i++)
        for (j = 0; j < W; j++)
            a[i][j] = rand()%100;
}

void Enter(int **a){
    for (i = 0; i < H; i++){
        for (j = 0; j < W; j++)
            printf("%3i\t",a[i][j]);
    printf("\n");
    }
}

int main(){

    int window[9];
    int x,y,fx,fy;
    int **image = malloc(sizeof *image * H), **itog = malloc(sizeof *itog * H);
    for (x = 0; x < H; x++) {
        image[x] = malloc(sizeof **image * W);
        itog[x] = malloc(sizeof **itog * W);
    }

    Generate(image);

    for (y = 0; y < W; y++) {
        itog[0][y] = image[0][y];
        itog[H - 1][y] = image[H - 1][y];
    }

    for (x = 1; x < H - 1; x++) {
        itog[x][0] = image[x][0];
        itog[x][W - 1] = image[x][W - 1];
    }

    //Median Filter
    for (x = 1; x < (H - 1); x++)
        for (y = 1; y < (W - 1); y++) {
            i = 0;
            for (fx = 0; fx < 3; fx++)
                for (fy = 0; fy < 3; fy++) {
                    window[i] = image[x + fx - 1][y + fy - 1];
                    i++;
                }
            qsort(window,9,sizeof(int),cmp);
            itog[x][y] = window[4];
       }

    printf("Image : ________________________\n");
    Enter(image);
    printf("Itog : ________________________\n");
    Enter(itog);

    for (x = 0; x < H; x++) {
        free(image[x]);
        free(itog[x]);
    }
    free(image);
    free(itog);

    _getch();
    return 0;
}
Стандартный размер стека не позволил разместить массивы на нем.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.03.2015, 18:44   #5
Kr@ShAK
Пользователь
 
Регистрация: 17.12.2013
Сообщений: 11
По умолчанию

BDA, спасибо
Но такой вариант выделения памяти компиляцию не проходит, сделал вот так
Код:
	...
        image = (int**)malloc(H*sizeof(int*));
	itog = (int**)malloc(H*sizeof(int*));
    for (x = 0; x < H; x++) {
        image[x] = (int*)malloc(W*sizeof(int*));
        itog[x] = (int*)malloc(W*sizeof(int*));
    }
...
Вроде все работает, теперь буду думать и искать варианты распараллелить циклы подсчета.
Kr@ShAK вне форума Ответить с цитированием
Старый 16.03.2015, 18:59   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

В цикле нужно (int*)malloc(W*sizeof(int)); (размер int, а не int*).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсистема управления памятью страничным способом реализации и алгоритмом замещения страниц LRU anechka58 Софт 1 26.12.2012 22:29
Подсчет значений в ячейках массива при применении фильтра akd2009 Microsoft Office Excel 2 19.11.2012 19:53
Сброс (не удаление!) фильтра(ов) при сохранении файла Dimas77 Microsoft Office Excel 0 25.01.2011 13:07
проблема с определением параметра при реализации запроса Margarett Помощь студентам 3 14.03.2010 17:56
Проблема с памятью в С++ rJIaBkoM Помощь студентам 1 14.06.2008 14:25