На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как получить значения многомерного массива чрез указатель , Не работает код
    Добрый день.

    В теле функции ShowDigit нужно работать либо с массивом SegMapN1 либо SegMapN2 в зависимости от переданного параметра. Соответственно, чтобы не писать один и тот же код для всех массивов, нужно в зависимости от параметра получить указатель на требуемый массив и уже работать с указателем. Подскажите как правильно это реализовать, поскольку так как это сделал я не работает. Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве (поскольку условие SegMap[Num][0][i] > 0 ни разу не выполняется). Спасибо.

    ExpandedWrap disabled
      unsigned char SegMapN1[10][2][8] = { // Первый массив
          
          { { 4, 3, 2, 3, 2, 1, 0, 0 }, { 1, 1, 1, 2, 2, 1, 0, 0 } }, // 0
          { { 3, 2, 0, 0, 0, 0, 0, 0 }, { 1, 1, 0, 0, 0, 0, 0, 0 } }, // 1
          { { 4, 3, 4, 2, 3, 0, 0, 0 }, { 1, 1, 2, 2, 2, 0, 0, 0 } }, // 2
          { { 4, 3, 2, 3, 4, 0, 0, 0 }, { 1, 1, 1, 2, 2, 0, 0, 0 } }, // 3
      };
       
      unsigned char SegMapN2[10][2][8] = { // Второй массив
          
          { { 1, 4, 3, 2, 0, 0, 0, 0 }, { 1, 2, 1, 1, 0, 0, 0, 0 } }, // 4
          { { 4, 1, 4, 2, 3, 0, 0, 0 }, { 1, 1, 2, 1, 2, 0, 0, 0 } }, // 5
          { { 4, 1, 2, 3, 2, 4, 0, 0 }, { 1, 1, 2, 2, 1, 2, 0, 0 } }, // 6
          { { 4, 3, 2, 0, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 0, 0 } }, // 7
          { { 1, 4, 3, 4, 2, 3, 2, 0 }, { 1, 1, 1, 2, 2, 2, 1, 0 } }, // 8
          { { 4, 1, 4, 3, 2, 3, 0, 0 }, { 2, 1, 1, 1, 1, 2, 0, 0 } }  // 9
      };
       
      void ShowDigit(unsigned char Num, unsigned char Digit)
      {
          unsigned char i;
          unsigned char ***SegMap; // указатель на массив
          
          switch (Digit) //получение указателя в зависимости от параметра Digit
          {
              case 1: SegMap = (unsigned char ***)SegMapN1; break;
              case 2: SegMap = (unsigned char ***)SegMapN2; break;
              default: SegMap = (unsigned char ***)SegMapN1; break;          
          }
              
              
          for(i = 0; i < 8; i++) // обработка массива через указатель
          {
              if (SegMap[Num][0][i] > 0) //пропускать нулевые элементы
              {
                  PORTC = 1 << (SegMap[Num][0][i] - 1);
                  PORTB = 1 << (SegMap[Num][1][i] - 1);
                  _delay_ms(100);
              }
          }
      }
    Сообщение отредактировано: freebits -
      Цитата freebits @
      Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве

      Естественно компилируется - у тебя явное пребразование к неправильному типу (unsigned char ***).

      Здесь тебе лучше сделать
      ExpandedWrap disabled
        unsigned char *p1;
        unsigned char *p2;
         
        case 1:
           p1 = SegMap1[Num][0];
           p2 = SegMap1[Num][1];
           break;
      Сообщение отредактировано: Олег М -
        Цитата Олег М @
        Цитата freebits @
        Проект компилируется, но при обращении к массиву получается не те значения, что имеются на самом деле в массиве

        Естественно компилируется - у тебя явное пребразование к неправильному типу (unsigned char ***).

        Здесь тебе лучше сделать
        ExpandedWrap disabled
          unsigned char *p1;
          unsigned char *p2;
           
          case 1:
             p1 = SegMap1[Num][0];
             p2 = SegMap1[Num][1];
             break;

        Ура, спасибо! Так все работает)
          M

          freebits, спасибо, что отблагодарил форумчанина, который тебе помог - это правильно!
          Но, пожалуйста, не забывай пользовать функцию форума "вопрос решен". Будет ваще по фэн-шую.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0236 ]   [ 16 queries used ]   [ Generated: 19.04.24, 11:02 GMT ]