РЕШЕНО Как в указатель передать двумерный массив

Тема в разделе "Arduino & Shields", создана пользователем WhiteFox, 15 июл 2021.

  1. WhiteFox

    WhiteFox Нерд

    Объявляю указатель:
    Код (C++):
    private byte *_allAddress;
    Конструктор:
    Код (C++):
    MemoryOneWire::MemoryOneWire(OneWire *oneWire, unsigned int *maxCountSensor) {
      _oneWire = oneWire;
      _maxCountSensor = maxCountSensor;
      _allStatusAddress = new byte[_maxCountSensor];
      _allAddress = new byte[_maxCountSensor][8];
      memset(_allStatusAddress, 0, _maxCountSensor);
    }
    Ошибка:
    sketch\MemoryOneWire.h: In constructor 'MemoryOneWire::MemoryOneWire(OneWire*, unsigned int*)':
    MemoryOneWire.h:43:44: error: cannot convert 'byte (*)[8] {aka unsigned char (*)[8]}' to 'byte* {aka unsigned char*}' in assignment
    _allAddress = new byte[_maxCountSensor][8];
     
  2. b707

    b707 Гуру

    указатель на байт и указатель на массив байтов - это разные типы.
    Причем указатель на массив всегда содержит его размер, так что указатель на массив из трех байт и из 12 байт - тоже разные.
    Чтобы все правильно работало, ваш параметр _allAddress должен быть описан так:

    byte(* _allAddress)[_maxCountSensor];

    причем размер _maxCountSensor должен быть заранее известен

    Если же вы принудительно приведете тип указателя на двумерный массив к указателю на byte - он перестанет быть двумерным массивом. то есть вы не сможете обращаться к его элементам как ptr[x][y]
     
    Последнее редактирование: 15 июл 2021
    vvr, SergeiL, Asper Daffy и 2 другим нравится это.
  3. parovoZZ

    parovoZZ Гуру

    указатель надо делать void, а затем делать явное приведение типов.

    Как это? Через указатель даже нельзя sizeof() массива определить, не говоря уж об остальном.
     
  4. b707

    b707 Гуру

    не путай указатель на первый элемент (имя массива) и указатель на массив. У них разный тип
    почитай вот тут:
    https://www.codeproject.com/Articles/7042/How-to-interpret-complex-C-C-declarations
     
    SergeiL нравится это.
  5. WhiteFox

    WhiteFox Нерд

    Принял, однако мне это не подходит, ухожу в одномерный массив (
     
  6. SergeiL

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

    Так делать как раз не нужно.
    Зачем городить огород если можно все корректно объявить и использовать?
     
    vvr и Asper Daffy нравится это.
  7. SergeiL

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

    Информация правильная, обновил информацию об указателях.
    Я вообще очень люблю указатели, как мне кажется с указателями в Си все очень удобно и просто.
     
  8. parovoZZ

    parovoZZ Гуру

    а нафига он нужен, если он тупо привязан к конкретному массиву?
     
  9. Asper Daffy

    Asper Daffy Иксперд

    А статус темы, почему-то, "решено" :-(

    Определённо, нужен статус "капитулировано"!
     
  10. b707

    b707 Гуру

    Не к конкретному массиву, а к массиву конкретного размера. разницу чувствуешь?
    нафига у байта, лонга и флоата указатели разных типов? - чтоб компилятор знал как с ними верно работать
     
  11. parovoZZ

    parovoZZ Гуру

    Если у меня в памяти лежат массивы с отображением символов и они все с разными длинами, то мне по такому указателю нифига не передать. А длина массива неизвестна до тех пор, пока к нему не обратишься.
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Ну, да, вам не передать :(
    Ну, да, вам не известна :(
     
    SergeiL нравится это.
  13. parovoZZ

    parovoZZ Гуру

    я же с вами недавно обсуждал этот вопрос. И вы мне все дружно сказали - это невозможно.
     
  14. WhiteFox

    WhiteFox Нерд

    Двумерный массив мне нужен был для удобства, я могу обойтись без него.
    b707 дал понять, что без заранее известной первой размерности передать
    двумерный массив в указатель не получиться.
    (по крайней мере с одним указателем)
    Так зачем мне дальше что-то мусолить в поисках истины, просто перейду
    на одномерный массив, а обращаться буду по формуле (sensor * 8) + index.
    Поэтому статус "Решено".