Спасибо за вашу помощь Брайану и KJ. Фактическая проблема была в неправильной структуре папок, которую я создал. Когда я с этим разобрался, мои ключевые слова cumulusci начали работать. Об этом я и говорил: https://groups.google.com/forum/#!topic/robotframework-users/iaeUZU_htk4
*** Keywords ***
Call all python libraries and resources
import library SeleniumLibrary timeout=20
import library OperatingSystem
import resource C:/Python37/Lib/site-packages/cumulusci/robotframework/Keywords/CommonKeywords.robot
import resource C:/Python37/Lib/site-packages/cumulusci/robotframework/Salesforce.robot
import resource C:/Python37/Lib/site-packages/cumulusci/robotframework/CommonVariables.robot
[115 ] MyAppTestCases.robot
*** Settings ***
Resource C:/Python37/Lib/site-packages/cumulusci/robotframework/CommonEnvironment.robot
Suite Setup Call all python libraries and resources
Test Setup Setup Browser
Test Teardown End Session
*** Test Cases ***
Verify so and so
Login to Salesforce
Launch My App
*** Keywords ***
Login to Salesforce
Wait Until Page Contains Element ${signOn_username}
Input Text ${signOn_username} ${Username}
Wait Until Page Contains Element ${signOn_password}
Input Text ${signOn_password} ${Password}
Click Element ${loginButton}
${Pass}= RUN KEYWORD AND RETURN STATUS Wait Until Page Contains Element' ${MostRecentlyViewed}
run keyword if '${Pass}'=='True' Log "SF Home page loaded successfully"
... ELSE Fail "SF Home page did not load successfully"
Launch My App
Open App Launcher # this is the cumulusci keyword - and it works well now!
Select App Launcher App MyApp
...
Вот хороший, очевидный способ:
class Parser
{
public:
typedef double matrix[4][4];
// ...
const matrix& getMatrix() const
{
return matrix_;
}
// ...
private:
matrix matrix_;
};
Теперь Вы работаете с описательным именем типа, а не массивом, но так как это typedef
, компилятор все еще позволит передавать его неизменной API-функции, которая берет базовый тип.
Попробуйте это. Это компилирует чисто на gcc 4.1.3:
typedef double FourSquare[4][4];
class Parser
{
private:
double matrix_[4][4];
public:
Parser()
{
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
matrix_[i][j] = i*j;
}
public:
const FourSquare& GetMatrix()
{
return matrix_;
}
};
void api_func( const double matrix[4][4] )
{
}
int main( int argc, char** argv )
{
Parser parser;
api_func( parser.GetMatrix() );
return 0;
}
Я использовал объединение как это для раздавания матриц в прошлом:
union matrix {
double dflat[16];
double dmatr[4][4];
};
Затем передают указатель в Вашему методу set и копируют данные в матрицу в Вашем классе.
существуют способы обработать это иначе (которые более универсальны), но это решение имеет тенденцию быть самым чистым в конце, по моему опыту.
я думал, что matrix_ по существу совпадет с двойным **
В C существуют истинные многомерные массивы, не массивы указателей на массивы, таким образом, двойным [4] [4] является непрерывный массив четырех двойных [4] массивы, эквивалентные двойному [16], не (дважды*) [4].
нет никаких преобразований в типы массива, хотя существуют преобразования в ссылки, или указатели на массивы, Бросая значение к двойному [4] [4] попытались бы создать один на стеке - эквивалентный станд.:: строка (parser.getMatrix ()) - за исключением того, что массив не предоставляет подходящего конструктора. Вы, вероятно, не хотели делать это, даже если Вы могли.
, Так как тип кодирует шаг, Вам нужен полный тип (дважды [] [], не сделает). Можно дать иное толкование, бросает пустоту* к ((дважды [4] [4]) *) и затем берут ссылку. Но это является самым легким к определению типа матрица, и возвратите ссылку корректного типа во-первых:
typedef double matrix_t[4][4];
class Parser
{
double matrix_[4][4];
public:
void* get_matrix () { return static_cast<void*>(matrix_); }
const matrix_t& get_matrix_ref () const { return matrix_; }
};
int main ()
{
Parser p;
matrix_t& data1 = *reinterpret_cast<matrix_t*>(p.get_matrix());
const matrix_t& data2 = p.get_matrix_ref();
}
Для разработки выбранный ответ наблюдайте эту строку
const matrix& getMatrix() const
Здорово, Вы не должны волноваться об указателях и кастинге. Вы возвращаетесь ссылка к базовому матричному объекту. По моему скромному мнению, ссылки являются одной из лучших функций C++, который я пропускаю при кодировании в прямом C.
, Если Вы не знакомы с различием между ссылками и указателями в C++, , читает это
Во всяком случае, действительно необходимо знать, что, если эти Parser
объект, который на самом деле владеет базовым матричным объектом, выходит из объема, любой код, который пытается получить доступ к матрице через ту ссылку, будет теперь ссылаться на объект из объема, и Вы откажете.