xlw: как использовать новый typedef для получения std :: string из ячеек Excel (и, возможно, заполнить std :: map)

Вступление

Я имею в виду XLW, оболочка Excel C API Марка Джоши и другие.

Прежде чем начать с моего примера, моих испытаний и моего вопроса, пара слов о том, как воспроизвести эти коды: после того, как вы загрузили и установили xlw со своего сайта, вы должны найти папку с именем XLL_Project, чье содержимое является решением Visual Studio («Template.sln«) если эта IDE / платформа была выбрана во время установки; это решение состоит из cppinterface.hто есть файл заголовка, который определяет, какие функции должны присутствовать в вашем окончательном .xll, и source.cpp, который определяет, как должны вести себя указанные функции.

Код

Пусть интерфейсная функция, подобная следующей, находится в cppinterface.h и его поведение в source.cpp:

// ===== cppinterface.h =====

std::string // Asks the user to enter the number of pancakes eaten for breakfast by different people. Analyzes the data and output which person ate the most pancakes
PancakeGlutton(const MyArray& people, // Range of people
const MyArray& pancakeNumber // Range of pancakes eaten by each person
);

// ===== source.pp =====

std::string PancakeGlutton(const MyArray& people, const MyArray& pancakeNumber)
{
if (people.size() != pancakeNumber.size())
throw("Error: arrays must have the same dimension!");
std::map< std::string, int > myMap;
for (unsigned long i = 0; i < people.size(); i++)
{
myMap.insert(std::pair< std::string, int >(people[i], pancakeNumber[i]));
}
return "x"; // Of course this a strange output just for the sake of this example
}

Как видите, есть попытка заселить std::map< std::string, int > с использованием xlw учебный класс MyArray: в электронной таблице Excel people может быть диапазоном строк, поэтому код C ++ должен видеть что-то вроде std::vector< std::string > и, следовательно, он должен использовать его для заполнения myMap с надлежащим std::pair< std::string, int >,

Тем не менее, это не строить.

Основная проблема заключается в том, что MyArray это typedef определяется в mycontainers.h:

// ===== mycontainers.h =====
// Line 68
// ...
typedef std::vector<double> MyArray;

Следовательно, он никак не может быть переведен в контейнер, способный управлять строками: просто удваивается. Хотя в его книгаглава, связанная с xlw Джоши говорит …

[…] Класс MyArray также определяется через typedef в MyContainers.h, По умолчанию это typedef в std::vector, Должно быть .size()конструктор, принимающий размер, и operator[] определены.

…недостаточно добавить

typedef std::vector< std::string > MyStrArray;

ни к mycontainers.h ни к любому заголовочному файлу моего проекта.

Вопросы

  1. Как я могу заселить это std::map< std::string, int> читая
    диапазон строк из Excel?
  2. Как я могу определить новые контейнеры через
    typedef в соответствии с моими желаемыми типами / классами для управления
    все возможные входы из Excel?

1

Решение

Класс MyArray предназначен только для представления массивов значений типа double. Typedef, так что вы можете использовать свой любимый такой класс.

Класс CellMatrix позволяет вводить данные любого типа. Вы просто проверяете каждый элемент CellMatrix на его тип, а затем делаете с ним все, что хотите.

2

Другие решения


По вопросам рекламы [email protected]