Вступление
Я имею в виду 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
ни к любому заголовочному файлу моего проекта.
Вопросы
std::map< std::string, int>
читаяtypedef
в соответствии с моими желаемыми типами / классами для управленияКласс MyArray предназначен только для представления массивов значений типа double. Typedef, так что вы можете использовать свой любимый такой класс.
Класс CellMatrix позволяет вводить данные любого типа. Вы просто проверяете каждый элемент CellMatrix на его тип, а затем делаете с ним все, что хотите.