Почему я не могу изменить значения массива, даже если оператор успешно вызван? TFT-сенсорный экран

#include <Adafruit_GFX.h>    // Базовая графическая библиотека
#include "LGDP4535.h" // Библиотека, специфичная для оборудования
#include <zTouchScreen.h>
#define BOXSIZE   40
// Назначаем понятные человеку имена некоторым общим 16-битным значениям цвета:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

LGDP4535 tft; // С помощью щита фиксируются все линии управления и данных

#define YP A3  // должен быть аналоговым выводом, используйте обозначение «An»!
#define XM A2  // должен быть аналоговым выводом, используйте обозначение «An»!
#define YM 9   // может быть цифровым выводом
#define XP 8   // может быть цифровым контактом

// Вам необходимо выполнить калибровку в соответствии с вашим ЖК-дисплеем
#define TS_MINX 930
#define TS_MINY 903
#define TS_MAXX 142
#define TS_MAXY 117

#define PENRADIUS 3
#define MINPRESSURE 10
#define MAXPRESSURE 1000

int matrix[2][3]; // Первоначальное объявление
int array[3]

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

// массив = начинается с 1, но чтение переменной начинается с 0
String ButtonAction[9]={"a", "b", "c", "d", "e", "f", "g", "h", "i"};
boolean ActiveMenu=true;

void setup(void) {
   Serial.begin(9600);
   tft.reset();
   tft.begin();
   ts.InitVariable(3, 240, 320, TS_MINX, TS_MAXX, TS_MINY, TS_MAXY, MINPRESSURE, MAXPRESSURE);
   tft.fillScreen(BLACK);
   DrawIt(CYAN, "draw");
   DrawIt(BLACK, "text");
}

void loop() {//НЕКОТОРЫЕ ДРУГИЕ ВЕЩИ}

unsigned long DrawIt(uint16_t color, String CurrentAction) {

  int timedcycle=0;

  if (CurrentAction == "text") {
     int matrix[2][3]={{25,150,265},{45,100,155}};
     int array[3]={3,3,3};

     tft.setRotation(3);
     tft.setTextColor(BLACK);
     tft.setTextSize(1);

     Serial.println("Text Columns");
  }

  else if (CurrentAction == "draw") {
    int matrix[2][3]={{260,140,20},{40,150,95}};
    int array[3]={3,3,3}; 
  }

  Serial.println(CurrentAction);

  for(int j=0; j<3; j++) {
     for(int i=0; i<array[j]; i++) {

       if (CurrentAction == "draw") {

         if (timedcycle == 7) {
           tft.fillCircle(100, 160, 15, WHITE);
         }         
         else {       
           tft.fillRect(matrix[1][j], matrix[0][i], 20,40, color);
         }

       }  
       else if (CurrentAction == "text") {
         if (timedcycle == 4) {
           true;
           //tft.fillCircle(100, 160, 15, БЕЛЫЙ);
         }         
         else {       
           tft.setCursor(matrix[0][j], matrix[1][i]);         
           tft.println(ButtonAction[timedcycle]);
         }

       }
     timedcycle++;  
     } 
  } 
}

Как видите, я пытаюсь нарисовать кое-что на сенсорном TFT-экране. Кажется, все работает, но что бы я ни делал, я не могу изменить значение массива.

Если я инициализирую переменную массива заранее определенным значением, оно не изменится, даже если оператор будет вызван правильно. Я вижу, что он работает через последовательный порт, но массив по-прежнему не меняется.

Я предполагаю, что что-то не так, но я не могу точно определить, что именно! Заранее спасибо!

, 👍1

Обсуждение

Вы определили три матрицы/массива; один в глобальном контексте и один на каждый блок в локальном контексте DrawIt. Определения в локальном контексте удаляются компилятором, поскольку они не используются (выпадают из контекста). Вместо этого вам нужно назначить глобальную матрицу/массив., @Mikael Patel

Итак, моя ошибка связана с объявлением переменных, поскольку мои значения отбрасываются естественным поведением компилятора. Я об этом не подумал, но то же самое происходит и на других языках, но я не учел функции «цикл» и «настройка». Спасибо за быстрое объяснение, @DarkXDroid


1 ответ


Лучший ответ:

2

Это потому, что вы каждый раз определяете новый массив, а не изменяете существующий.

int matrix[2][3]={{25,150,265},{45,100,155}};

Эта строка не присваивает новые значения существующему массиву matrix, вместо этого она создает новый массив с именем matrix, который существует только в текущей области действия, то есть в пределах {...}, определяемой if, в которой он находится.

Вместо этого вам нужно либо присвоить значения существующему массиву матриц напрямую послойно (вы не можете использовать {...} для их массового назначения):

matrix[0][0] = 25;
matrix[0][1] = 150;
... etc ...

В качестве альтернативы, поскольку значения статичны, вы можете заранее определить различные матрицы в глобальной области видимости, а затем переключаться между ними. Это можно сделать с помощью правильного типа указателя. Например:

int textMatrix[2][3] = {{260,140,20},{40,150,95}};
int (*matrix)[3];

void whateverTheFunctionIs() {
    if (whatever...) {
        matrix = textMatrix;
    }
}

В этом примере matrix — это указатель на массив указателей, что, по сути, является внутренним представлением двумерного массива. Он начинается с того, что ему вообще ничего не присваивается — он просто «болтается на ветру». Когда в вашей функции срабатывает if, адрес, на который указывает указатель matrix, меняется на адрес двумерного массива textMatrix, поэтому любой доступ к matrix[x][y] будет идентичен доступу к textMatrix[x][y].

,

Можете ли вы привести пример того, как этого можно добиться?, @DarkXDroid

Вместо этого, если вы используете int matrix..., вы просто назначаете новые значения отдельным срезам. Обратите внимание, что вы не можете использовать для этого нотацию {...}, а должны назначать каждое значение по отдельности. matrix[2][1] = 43, @Majenko

Так что лучший вариант — создать еще один массив с фиксированными значениями? Спасибо за ваш ответ, и я проверю это, чтобы принять ваш ответ, @DarkXDroid

Сейчас я за своим столом, поэтому могу дать гораздо более полный ответ... проверьте через минуту мою правку., @Majenko

Я получил ошибку с глобальной переменной: 182:13: ошибка: невозможно преобразовать 'int [2][3]' в 'int**' в присваивании. Тогда я попробую первое решение, @DarkXDroid

Честно говоря, я на самом деле не пробовал этот код — возможно, я допустил ошибку ;), @Majenko

Извините, определение matrix должно было быть: int (*matrix)[3];, @Majenko

Не волнуйтесь, я перепишу свой код снова, чтобы включить ваши правки для последующего отзыва. Спасибо за ваше время и внимание, @DarkXDroid