Как получить ширину / высоту двухмерного массива, на который указывает мой указатель? - PullRequest
0 голосов
/ 11 октября 2011

Если у меня есть эта ссылочная переменная:

float* image

Как я могу получить длину этого изображения в C?length = (width * height) но как я могу получить это значение?

Ответы [ 4 ]

2 голосов
/ 11 октября 2011
float * image

Просто указывает на один поплавок.Он также может быть использован с синтаксисом массива - то есть image[n], чтобы получить n-е число с плавающей точкой из местоположения изображения.Люди будут использовать указатели и malloc для создания динамического массива с плавающей точкой.Тем не менее, нет никакой информации, связанной с размером, хранящимся с самими данными.Это деталь, о которой должен заботиться кодер в C. Часто в таких случаях в C, когда вы передаете такой указатель в функцию, вам также передается сопутствующий размер, например:

void Foo(float* image, size_t numFloatsInImage)

Похоже, что image может указывать на блок непрерывной памяти, рассматриваемый как двумерный массив.Это что-то с шириной и высотой.Таким образом, вместо строго numberOfFloats у вас может быть что-то вроде этого изображения «3x3»:


    image ->  0  1  2  3  4  5  6  7  8
              0  0  0  1  1  1  2  2  2

Здесь в общей сложности 3x3 == 9 с плавающей точкой, причем первые 3 соответствуют строке 1, следующие 3 строки 2и последний - как строка 4. Это просто одномерный массив, используемый для представления двумерных данных.

Как я уже говорил ранее, это деталь того, как вы решили использовать язык, а неЧасть этого.Для безопасного использования вам придется передать ширину / высоту указателем:

void Foo(float* image, size_t width, size_t height)

Этого также можно избежать, просто создав структуру для хранения вашего изображения, обязательно всегда инициализируя / поддерживая вширина и высота корректны

 struct
 {
     float* image; // points to image data
     size_t width;
     size_t height;
 };

, затем всегда передайте структуру таким функциям, как foo

Еще одна хитрость может состоять в том, чтобы перераспределить float для хранения ширины и высоты в самом буфере:

 float* image = malloc(width*height + 2);
 image[0] = width;
 image[1] = height;
 // everything past image[2] is image data

В любом случае, существуют эти и многие другие специфические для реализации способы хранения / передачи этих данных.Тот, кто дает вам этот указатель, должен сказать вам, как получить длину / высоту, и рассказать, как использовать указатель.Нет никакого способа, которым C может понять, как это делается, это решение о реализации.

1 голос
/ 11 октября 2011

Простой указатель сам по себе не скажет вам размер буфера, на который он указывает.Если первый элемент каким-либо образом не кодирует размер буфера или в конце нет значения часового (аналогично тому, как реализованы строки), то эта информация имеет , которая должна предоставляться отдельно.

1 голос
/ 11 октября 2011

Если image не указывает на некоторую структуру данных, описывающую размеры изображения, вы обычно не можете найти размер предсказуемым и безопасным способом. Если вы попробуете, вы, скорее всего, испортите и / или сломаете программу. Если image указывает на необработанные пиксельные данные, вам нужно будет получать размер вместе с этим указателем, откуда бы вы ни брали данные.

0 голосов
/ 11 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...