error: invalid types 'uint16_t {aka short unsigned int}[uint8_t {aka unsigned char}]' for array subscript

error: invalid types 'uint16_t {aka short unsigned int}[uint8_t {aka unsigned char}]' for array subscript

背景: 我目前正在为“Uncanny Eyes”开发 Adafruit 程序。我的意图是能够有几个瞬时开关,将静态图像绘制到一对 1.5" OLED 上。

此程序使用 Teensy 3.1 或 3.2。

收到错误消息后我目前卡住了

In function 'void drawEye(uint8_t, uint16_t)': uncannyEyes:146: error: invalid types 'uint16_t {aka short unsigned int}[uint8_t {aka unsigned char}]' for array subscript p = img[screenY][screenX];

我是 Stack Exchange 社区的新手,所以如果我做错了什么,我深表歉意!

#include <SPI.h>
#include <Adafruit_GFX.h>      // Core graphics lib for Adafruit displays
// Enable ONE of these #includes -- HUGE graphics tables for various eyes:
//#include "defaultEye.h"        // Standard human-ish hazel eye
//#include "noScleraEye.h"       // Large iris, no sclera
//#include "dragonEye.h"         // Slit pupil fiery dragon/demon eye
#include "goatEye.h"           // Horizontal pupil goat/Krampus eye
// Then tweak settings below, e.g. change IRIS_MIN/MAX or disable TRACKING.

// DISPLAY HARDWARE CONFIG -------------------------------------------------

#include <Adafruit_SSD1351.h>  // OLED display library -OR-
//#include <Adafruit_ST7735.h> // TFT display library (enable one only)

#ifdef _ADAFRUIT_ST7735H_
typedef Adafruit_ST7735  displayType; // Using TFT display(s)
#else
typedef Adafruit_SSD1351 displayType; // Using OLED display(s)
#endif

#define DISPLAY_DC      7 // Data/command pin for BOTH displays
#define DISPLAY_RESET   8 // Reset pin for BOTH displays
#define SELECT_L_PIN    9 // LEFT eye chip select pin
#define SELECT_R_PIN   10 // RIGHT eye chip select pin

// INPUT CONFIG (for eye motion -- enable or comment out as needed) --------

#define WINK_L_PIN      0 // Pin for LEFT eye wink button
#define BLINK_PIN       1 // Pin for blink button (BOTH eyes)
#define WINK_R_PIN      2 // Pin for RIGHT eye wink button
#define IMAGE_4      3 // Pin for RIGHT eye wink button
#define IMAGE_5      4 // Pin for RIGHT eye wink button
//#define AUTOBLINK         // If enabled, eyes blink autonomously

// Probably don't need to edit any config below this line, -----------------
// unless building a single-eye project (pendant, etc.), in which case one
// of the two elements in the eye[] array further down can be commented out.

// Eye blinks are a tiny 3-state machine.  Per-eye allows winks + blinks.
#define NOBLINK 0     // Not currently engaged in a blink
#define ENBLINK 1     // Eyelid is currently closing
#define DEBLINK 2     // Eyelid is currently opening
typedef struct {
  int8_t   pin;       // Optional button here for indiv. wink
  uint8_t  state;     // NOBLINK/ENBLINK/DEBLINK
  int32_t  duration;  // Duration of blink state (micros)
  uint32_t startTime; // Time (micros) of last state change
} eyeBlink;

struct {
  displayType display; // OLED/TFT object
  uint8_t     cs;      // Chip select pin
  eyeBlink    blink;   // Current blink state
} eye[] = { // OK to comment out one of these for single-eye display:
  displayType(SELECT_L_PIN,DISPLAY_DC,0),SELECT_L_PIN,{WINK_L_PIN,NOBLINK},
  displayType(SELECT_R_PIN,DISPLAY_DC,0),SELECT_R_PIN,{WINK_R_PIN,NOBLINK},
};
#define NUM_EYES (sizeof(eye) / sizeof(eye[0]))

uint8_t
  prevBtn        = 99,  // Button # pressed on last loop() iteration
  btnCount       = 0;   // Number of iterations same button has been held

// INITIALIZATION -- runs once at startup ----------------------------------

void setup(void) {
  uint8_t e;

  Serial.begin(115200);
  randomSeed(analogRead(A3)); // Seed random() from floating analog input

  // Both displays share a common reset line; 0 is passed to display
  // constructor (so no reset in begin()) -- must reset manually here:
  pinMode(DISPLAY_RESET, OUTPUT);
  digitalWrite(DISPLAY_RESET, LOW);  delay(1);
  digitalWrite(DISPLAY_RESET, HIGH); delay(50);

  for(e=0; e<NUM_EYES; e++) { // Deselect all
    pinMode(eye[e].cs, OUTPUT);
    digitalWrite(eye[e].cs, HIGH);
  }
  for(e=0; e<NUM_EYES; e++) {
    digitalWrite(eye[e].cs, LOW); // Select one eye for init
#ifdef _ADAFRUIT_ST7735H_ // TFT
    eye[e].display.initR(INITR_144GREENTAB);
#else // OLED
    eye[e].display.begin();
#endif
    if(eye[e].blink.pin >= 0) pinMode(eye[e].blink.pin, INPUT_PULLUP);
    digitalWrite(eye[e].cs, HIGH); // Deselect
  }
#ifdef BLINK_PIN
  pinMode(BLINK_PIN, INPUT_PULLUP);
#endif

for(uint8_t i=0; i<=6; i++) {
    pinMode(i, INPUT);
    digitalWrite(i, HIGH); // Enable pullup
}
}
// EYE-RENDERING FUNCTION --------------------------------------------------

SPISettings settings(24000000, MSBFIRST, SPI_MODE3); // Teensy 3.1 max SPI

void drawEye(      // Renders one eye.
  uint8_t   e,     // Eye array index; 0 or 1 for left/right
  uint16_t img) { // Pointer to image data

  uint8_t  screenX, screenY;
  uint16_t p;

  // Set up raw pixel dump to entire screen.  Although such writes can wrap
  // around automatically from end of rect back to beginning, the region is
  // reset on each frame here in case of an SPI glitch.
  SPI.beginTransaction(settings);
#ifdef _ADAFRUIT_ST7735H_ // TFT
  eye[e].display.setAddrWindow(0, 0, 127, 127);
#else // OLED
  eye[e].display.writeCommand(SSD1351_CMD_SETROW);    // Y range
  eye[e].display.writeData(0); eye[e].display.writeData(SCREEN_HEIGHT - 1);
  eye[e].display.writeCommand(SSD1351_CMD_SETCOLUMN); // X range
  eye[e].display.writeData(0); eye[e].display.writeData(SCREEN_WIDTH  - 1);
  eye[e].display.writeCommand(SSD1351_CMD_WRITERAM);  // Begin write
#endif
  digitalWrite(eye[e].cs, LOW);                       // Chip select
  digitalWrite(DISPLAY_DC, HIGH);                     // Data mode
  // Now just issue raw 16-bit values for every pixel...

  for(screenY=0; screenY<SCREEN_HEIGHT; screenY++) {
    for(screenX=0; screenX<SCREEN_WIDTH; screenX++) {
      p = img[screenY][screenX];
      // SPI FIFO technique from Paul Stoffregen's ILI9341_t3 library:
      while(KINETISK_SPI0.SR & 0xC000); // Wait for space in FIFO
      KINETISK_SPI0.PUSHR = p | SPI_PUSHR_CTAS(1) | SPI_PUSHR_CONT;
    }
  }

  KINETISK_SPI0.SR |= SPI_SR_TCF;         // Clear transfer flag
  while((KINETISK_SPI0.SR & 0xF000) ||    // Wait for SPI FIFO to drain
       !(KINETISK_SPI0.SR & SPI_SR_TCF)); // Wait for last bit out
  digitalWrite(eye[e].cs, HIGH);          // Deselect
  SPI.endTransaction();
}




// MAIN LOOP -- runs continuously after setup() ----------------------------

void loop() {

   uint8_t i;

  // Scan buttons 2-6 looking for first button pressed...
  for(i=0; (i<2) && (digitalRead(i+2) == HIGH); i++);

  if(i < 2) {               // Anything pressed?  Yes!
    if(i == prevBtn) {      // Same as last time we checked?  Good!
      if(++btnCount == 3) { // 3 passes to 'debounce' button input
        if(digitalRead(2) == LOW) {
          drawEye(0, sclera[0][0]);
          drawEye(1, sclera[0][0]);
        }
//        if(digitalRead(3) == LOW) {
//          drawEye(0, polar);
//          drawEye(1, polar);
//        }
//        if(digitalRead(4) == LOW) {
//          drawEye(0, sclera[0][0]);
//          drawEye(1, polar[0][0]);
//        }
//        if(digitalRead(5) == LOW) {
//          drawEye(0, polar[0][0]);
//          drawEye(1, sclera[0][0]);
//        }
//        if(digitalRead(6) == LOW) {
//          drawEye(0, eyeImage[3]);
//          drawEye(1, eyeImage[3]);
//        }
      }
    } else btnCount = 0; // Different button than before - start count over
    prevBtn = i;
  } else prevBtn = 99;   // No buttons pressed

}

并且 header goatEye.h 没有数组数据,因为 post 将是巨大的

#define SCREEN_HEIGHT 128
#define SCREEN_WIDTH 128


const uint16_t sclera[SCREEN_HEIGHT][SCREEN_WIDTH] = {};
const uint16_t polar[SCREEN_HEIGHT][SCREEN_WIDTH] = {};

感谢您的帮助!

问题在这里:

void drawEye(      // Renders one eye.
  uint8_t   e,     // Eye array index; 0 or 1 for left/right
  uint16_t img) { // Pointer to image data

函数 drawEye 需要单个 uint16_t,而不是 two-dimensional 数组。所以当你试图获取它的数组索引时,你会得到一个错误,因为它不是一个数组。

您需要像这样定义函数:

void drawEye(      // Renders one eye.
  uint8_t   e,     // Eye array index; 0 or 1 for left/right
  const uint16_t img[SCREEN_HEIGHT][SCREEN_WIDTH]) { // Pointer to image data

并这样称呼它:

    if(digitalRead(2) == LOW) {
      drawEye(0, sclera);
      drawEye(1, sclera);
    }

变量img不是指针,它是一个unsigned short int,不能像p = img[screenY][screenX];

那样访问

将您的参数更改为 uint16_t* img 并像那样访问它 p = img[screenY*screenX];,然后调用然后像那样调用函数 drawEye(0, sclera);