2015-12-01 4 views
0

Я пишу программу, которая выполняет некоторую фильтрацию изображения с учетом BMP-файла. Мне дана функция, которая выполняет фильтрацию для меня, но требует определенных входных данных, которые я получаю от stdin, и моя программа должна поместить их в правильный формат. Одним из функциональных входов должен быть массив поплавков. Размер этого массива определяется шириной ввода массива квадратом пользователя. Таким образом, ввод 3 даст массив размером 9 (имитирующий матрицу. Для дальнейшего чтения о том, что я делаю, отметьте this Wikipedia link).Массив поплавков не получает правильного размера - C

Моя программа правильно принимает ширину фильтра. Он правильно вычисляет значение размера массива/матрицы. Однако, когда дело доходит до инициализации массива float для ввода значений, оно делает это неправильно.

Вот соответствующий код:

int filter_width; 
    filter_width = atoi(argv[3]); 

    // Initializing variables for the filter weights array 
    int filter_matrix_size; 
    filter_matrix_size = filter_width*filter_width; 
    float filter_weights[filter_matrix_size]; 

Для фильтра Ширина входа 3, я ДОЛЖЕН получать следующие значения для моих 3 переменных здесь:

фильтра Ширина: 3

Размер матрицы фильтра: 9

Размер filter_weights[] = 9

Но когда я тестирую свою программу, я получаю размер filter_weights[] равным 36. Я не знаю, откуда этот номер, и он уничтожает фильтрацию изображения. Я что-то упустил?

+4

sizeof (filter_weights) возвращает размер filter_weights в BYTES - количество поплавков в filter_weights умножает размер в байтах каждого поплавка. Если я правильно понял, что число с плавающей запятой с одинарной точностью составляет четыре байта, это объясняет, откуда взялось 36. –

+1

Как вы получаете размер? Если вы используете 'sizeof', это возвращает размер _in bytes_. –

+1

«когда я тестирую свою программу». Не говори, покажи. –

ответ

5

sizeof вычисляет общий размер массива, а не количество элементов. Предполагая sizeof(float) == 4 на вашей системе, то есть

sizeof(float) == 4 
sizeof(float[2]) == 8 (2 * sizeof(float)) 
sizeof(float[9]) == 36 (9 * sizeof(float)) 

Если вы хотите, количество элементов можно разделить на размер первого элемента

float arr[N]; 
(sizeof arr/sizeof arr[0]) == N 

sizeof arr == (N * sizeof(float)) 
sizeof arr[0] == sizeof(float) 

Программисты часто определяют макрос для этого:

#define LEN(A) (sizeof (A)/sizeof (A)[0]) 

float arr[N]; 
LEN(arr) == N 

хотя я лично держаться подальше от него, так как это может сбивать с толку при использовании с указателями вместо массивов.

float *arr = malloc(/*whatever*/); 
LEN(arr) == sizeof(float*) 
3

sizeof(filter_weights) будет 36, потому что он содержит девять четырехбайтовых float s. 9 x 4 = 36.

+0

Ах! Хорошо, я вижу, где 36 лет. Однако не следует 'float filter_weights [filter_matrix_size];' все еще создавать массив поплавков с 9 элементами? –

+4

@ KommanderKitten Это именно то, что он делает. И массив поплавков с 9 элементами содержит 36 байтов данных, что и говорит sizeof. –