Как иметь дело с массивами (объявленный на стеке) в C++?

Спасибо за вашу помощь Брайану и KJ. Фактическая проблема была в неправильной структуре папок, которую я создал. Когда я с этим разобрался, мои ключевые слова cumulusci начали работать. Об этом я и говорил: https://groups.google.com/forum/#!topic/robotframework-users/iaeUZU_htk4

CommonEnvironment.robot

*** 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

CommonKeywords.robot

*** 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
    ...

15
задан Owen 10 September 2008 в 19:27
поделиться

5 ответов

Вот хороший, очевидный способ:

class Parser
{
public:
   typedef double matrix[4][4];

   // ...

   const matrix& getMatrix() const
   {
      return matrix_;
   }

   // ...

private:
  matrix matrix_;
};

Теперь Вы работаете с описательным именем типа, а не массивом, но так как это typedef, компилятор все еще позволит передавать его неизменной API-функции, которая берет базовый тип.

16
ответ дан 1 December 2019 в 01:54
поделиться

Попробуйте это. Это компилирует чисто на 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;
}
6
ответ дан 1 December 2019 в 01:54
поделиться

Я использовал объединение как это для раздавания матриц в прошлом:

union matrix {
    double dflat[16];
    double dmatr[4][4];
};

Затем передают указатель в Вашему методу set и копируют данные в матрицу в Вашем классе.

существуют способы обработать это иначе (которые более универсальны), но это решение имеет тенденцию быть самым чистым в конце, по моему опыту.

4
ответ дан 1 December 2019 в 01:54
поделиться

я думал, что 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();
}
4
ответ дан 1 December 2019 в 01:54
поделиться

Для разработки выбранный ответ наблюдайте эту строку

const matrix& getMatrix() const

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

, Если Вы не знакомы с различием между ссылками и указателями в C++, , читает это

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

2
ответ дан 1 December 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: