С++ возврат двумерного массива из функции

Тема в разделе "Arduino & Shields", создана пользователем strinda, 28 дек 2018.

  1. strinda

    strinda Гик

    Вопрос вот какой. Для одного из проектов - потребовалось научится возвращать двумерный массив из функции. Посмотрел пару -тройку видео по С++. Написал код.

    Код (C++):


    int** getArray () {
    int** arr = new int* [3];
      for (int i = 0; i < 3; i ++) {
        arr [i] = new int [3];
        for (int k = 0; k < 3; k ++) {
          arr[i][k] = i+k;
        }
      }

    return arr;

    }

    void setup() {
    Serial.begin (9600);
    for (int a = 0; a < 100; a ++) {
      int** arr = getArray();
      Serial.println (arr[2][2]);
    }
    }

    void loop() {

    }
    Вопросов два:
    1) после 53 раза ответ "4" (верный) меняется на "4353", что очень похоже на указатель на память или что-то подобное. Сосбвтенно, вопрос - почему?
    2) Почему запись содержит два **
    int** arr = new int* [3];
    ведь по-сути создается массив в каждой ячейке которого лежит просто указатель на другой массив, то есть это - массив из указателей. Тот же вопрос и тут:
    int** arr (указатели на указатели?)
     
  2. parovoZZ

    parovoZZ Гуру

    Черепить сейчас вообще не хочу, но
    я делаю так:
    Код (C++):
    uint8_t    data[9];
    ....
        data[5] = SHT1x_Get_Humidity;          

        SHT_USI_Start_Transceiver(&data[5]);
     
    в самой функции:
    Код (C++):
    uint8_t SHT_USI_Start_Transceiver (uint8_t *data)
    {
    USIDR = *data;
    .....
    *(data++) = SHT_USI_Transfer (USISR_8bit);
    .....
    *data = SHT_USI_Transfer (USISR_8bit);
    .....
    }
    Возвращается у меня data[5] и data[6].
     
  3. Это не двухмерный массив, это массив указателей.
    Вот так двухмерный.
    int* arr = new int[3,3];
     
    Последнее редактирование: 29 дек 2018
  4. SergeiL

    SergeiL Оракул Модератор

    А мне казалось двумерный массив ;)
     
    Последнее редактирование: 28 дек 2018
  5. parovoZZ

    parovoZZ Гуру

    Это синонимы.
     
  6. SergeiL

    SergeiL Оракул Модератор

    Ну, да, ;) у нас это так же как, кладет и ложит. :)
    Тоже синонимы :)
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Ну, зачем, человек же может шутки не понять и будет голову ломать.
     
  8. Это не шутка, это я сам запутался в языках.
     
  9. mcureenab

    mcureenab Гуру

    int** arr это указатель на указатель.

    int arr1[10];
    int *arr2 = arr1;

    arr1 это массив. В памяти размещается один объект - масссив из 10ти целых чисел.
    arr2 это указатель на массив. В памяти размещается адрес массива arr2. Замечаем, что имя массива без квадратных скобок автоматически приводится к указателю на элемент массива. Т.е. arr2 принимает значение

    &(arr1[0]).
     
    parovoZZ нравится это.
  10. parovoZZ

    parovoZZ Гуру

    а здесь скобки обязательны или это просто по красоте?
     
  11. parovoZZ

    parovoZZ Гуру

    А вопрос на засыпку - в одномерном массиве элементы массива расположены друг за другом, а в двухмерном или даже трехмерном как? Как в таких массивах обращаться к элементам не через порядковый номер элемента, а через указатель?
     
  12. Тоже по порядку. Строка за строкой. y*размер строки + x
     
  13. parovoZZ

    parovoZZ Гуру

    arr[0][0]
    arr[0][1]
    arr[0][2]

    вот так? или как-то по-другому?
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Кто или что мешает написать тривиальный код и посмотреть?
    Код (C++):
    static const int n2[3][2] = { 1, 2, 3, 4, 5, 6 };

    void setup(void) {
        Serial.begin(57600);
        const int * ptr = & n2 [0][0];
        for (int8_t i = 0; i < 6; i ++) {
            Serial.print(* ptr ++);
            Serial.print(' ');
        }
        Serial.println();
    }


    void loop(void) {}
     
  15. parovoZZ

    parovoZZ Гуру

    Будь добр, покажи вывод))
     
  16. Asper Daffy

    Asper Daffy Иксперд

    Чё? Самому запустить не судьба? Ну, ладно

    1 2 3 4 5 6