Как использовать std :: vector в функции C - PullRequest
3 голосов
/ 15 июля 2011

Функция C ожидает, что массив буферов будет находиться в области видимости во время выполнения. например

char values[x][y]

Функция C будет заполнять буферы
Я хотел бы использовать динамический массив, чтобы мне не приходилось жестко кодировать размеры
Как использовать std :: vector в этой ситуации?

Просто чтобы прояснить, я использую C ++. Функция C содержится в библиотеке, которую я не могу изменить.

Ответы [ 3 ]

8 голосов
/ 15 июля 2011

Если вы просто хотите передать динамический массив, инкапсулированный в std::vector, в подпрограмму c, вы можете передать указатель на заголовок базового массива в виде:

std::vector<char> myvector;
// size-up myvector as needed
foo(&myvector[0]); // pass a pointer to start of myvector to function foo

c++ Стандарт гарантирует, что базовый массив в std::vector всегда является смежным.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: В то время как объявление char values[x][y] создает «массив массивов» памяти для values на самом деле будет просто непрерывным блоком, по сути char linear_values[x * y].

Если вы добавите в std::vector число элементов x * y, это даст вам то же базовое динамически распределенное пространство массива.

Функция c получит доступ к массиву впорядок основной строки, поэтому первый ряд элементов будет первым, затем вторая полная строка и т. д. *

1 голос
/ 15 июля 2011

C не имеет стандартных библиотек структур данных.

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

Если оно критично , напишите свое. Это не слишком сложно и может быть весьма полезным.

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

Подробную информацию о realloc можно получить по адресу:

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

или в * nix системе:

man realloc

0 голосов
/ 15 июля 2011

Вы не можете.

По определению, C ничего не знает ни о одном из обязательных компонентов std::vector, включая, но не ограничиваясь:

  • C не имеет пространств имен, поэтому он не может понять пространство имен std.

  • C не имеет шаблонов, поэтому он не может понять тип std::vector<T>.

По сути, вам нужно, чтобы выглядел как функция C, но, по сути, это функция C ++.

Простейший способ добиться этого, вероятно, состоит в том, чтобы написать что-то похожее на функцию C, используя C ++ и запустив весь беспорядок через компилятор C ++, а не компилятор C.

...