Почему я не могу изменить значения массива, даже если оператор успешно вызван? 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-экране. Кажется, все работает, но что бы я ни делал, я не могу изменить значение массива.
Если я инициализирую переменную массива заранее определенным значением, оно не изменится, даже если оператор будет вызван правильно. Я вижу, что он работает через последовательный порт, но массив по-прежнему не меняется.
Я предполагаю, что что-то не так, но я не могу точно определить, что именно! Заранее спасибо!
@DarkXDroid, 👍1
Обсуждение1 ответ
Лучший ответ:
Это потому, что вы каждый раз определяете новый массив, а не изменяете существующий.
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
- Как записать последовательность кнопок и сохранить ее в массиве
- Как вернуть значение массива символов в функции Arduino IDE?
- Использование массивов, двоичных данных и битового чтения
- Хранение значений широты и долготы в виде символов с заданной точностью
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Почему я не могу получить размер массива указателей
- Замена большой таблицы поиска оператором switch
Вы определили три матрицы/массива; один в глобальном контексте и один на каждый блок в локальном контексте DrawIt. Определения в локальном контексте удаляются компилятором, поскольку они не используются (выпадают из контекста). Вместо этого вам нужно назначить глобальную матрицу/массив., @Mikael Patel
Итак, моя ошибка связана с объявлением переменных, поскольку мои значения отбрасываются естественным поведением компилятора. Я об этом не подумал, но то же самое происходит и на других языках, но я не учел функции «цикл» и «настройка». Спасибо за быстрое объяснение, @DarkXDroid