Comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]

Hallo,

ich bekomme bzgl. des unten abgebildeten Codes folgende Fehlermeldung und verstehe nicht warum und was sie bedeutet:

warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]

const byte butPin[] = {
  6, 7, 5, 4
};
#define NUMBUTTONS sizeof(butPin)

void setup() {

for (int i = 0; i < NUMBUTTONS; i++)  // Buttons
  {
  }

}

void loop() {
  // put your main code here, to run repeatedly:

}

Wie kann ich dieses Problem beheben?

Gruß Chris

Das ist "nur" eine Warnung.
Du vergleichst hier

signed und unsigned int
Mach das

for (unsigned int i = 0; i < NUMBUTTONS; i++)

und gut ists.

Einfach mal lesen!
Oder/Und auch mal in die Doku schauen, z.B. welchen Datentype sizeof() dir liefert.

Da braucht es kein define.

Merke: Jedes vermeidbare define ist ein böses define!

Das fällt Dir früher oder später auf die Füsse.

Benutze die selben Datentypen!

const byte butPin[] = { 6, 7, 5, 4 };
const byte NUMBUTTONS = sizeof(butPin) / sizeof(butPin[0]);

void setup()
{
  for (byte i = 0; i < NUMBUTTONS; i++)  // Buttons
  {
  }
}

void loop()
{
  // put your main code here, to run repeatedly:
}

Das haben ganz viele schon gesagt und fallen auf die Nase, seitdem der ESP-Core eine restriktivere Behandlung durchführt...

Tipps hast eh schon bekommen.

Überleg dir, ob du die Array Anzahl überhaupt brauchst.
Ab C++11 gibts die range based for loop, und mit dem typen auto wird das noch einfacher

const uint8_t butPin[] = {
  6, 7, 5, 4
};

void setup() {

  for (auto &i : butPin) {
    pinMode(i, INPUT_PULLUP);
  }

}

void loop() {
  // put your main code here, to run repeatedly:

}

Das fällt dir bei großen Arrays auf die Füße!

Richtiger und universeller wäre:
constexpr size_t NUMBUTTONS {sizeof(butPin) / sizeof(butPin[0]});
Und: Das ist ohne zusätzlichen Speicherverbrach.
Sparsamkeit ist da kein Argument

Und noch besser: