Strange Errors when using define on an array

I've been trying to set up a program to read UIDs from an RFID card/key chain and I get errors that aren't present in some of the examples.

My code:
#include <MFRC522.h>
#include <SPI.h>

#define RST_PIN 5
#define SS_PIN 53
#define LED_PIN 47

MFRC522 mfrc522(SS_PIN, RST_PIN);

#define CARD_UID {0xFF, 0xFF, 0xFF, 0xFF}
#define FOB_UID {0xFF, 0xFF, 0xFF, 0xFF}

MFRC522::MIFARE_Key key;

void setup()
{
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
while(!Serial);
SPI.begin();
mfrc522.PCD_Init();
delay(4);
mfrc522.PCD_DumpVersionToSerial();
Serial.println(F("Scan RFID card"));
}

void loop()
{
if (! mfrc522.PICC_IsNewCardPresent())
{
return;
}
if (! mfrc522.PICC_ReadCardSerial())
{
return;
}
if (mfrc522.uid == CARD_UID)
{
Serial.println("RFID Card detected");
delay(3000);
}
if (mfrc522.uid == FOB_UID)
{
Serial.println("RFID fob detected");
delay(3000);
}
}

Example code:
/*


  • Example to change UID of changeable MIFARE card.

  • This is a MFRC522 library example; for further details and other examples see: GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522
  • This sample shows how to set the UID on a UID changeable MIFARE card.
  • @author Tom Clement
  • @license Released into the public domain.
  • Typical pin layout used:

  •         MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
    
  •         Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
    
  • Signal Pin Pin Pin Pin Pin Pin

  • RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
  • SPI SS SDA(SS) 10 53 D10 10 10
  • SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
  • SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
  • SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
  • More pin layouts for other boards can be found here: GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522
    */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

/* Set your new UID here! */
#define NEW_UID {0xFF, 0xFF, 0xFF, 0xFF}

MFRC522::MIFARE_Key key;

void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));

// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
}

// Setting the UID can be as simple as this:
//void loop() {
// byte newUid[] = NEW_UID;
// if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
// Serial.println("Wrote new UID to card.");
// }
// delay(1000);
//}

// But of course this is a more proper approach
void loop() {

// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle. And if present, select one.
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
delay(50);
return;
}

// Now a card is selected. The UID and SAK is in mfrc522.uid.

// Dump UID
Serial.print(F("Card UID:"));
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();

// Dump PICC type
// MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
// Serial.print(F("PICC type: "));
// Serial.print(mfrc522.PICC_GetTypeName(piccType));
// Serial.print(F(" (SAK "));
// Serial.print(mfrc522.uid.sak);
// Serial.print(")\r\n");
// if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
// && piccType != MFRC522::PICC_TYPE_MIFARE_1K
// && piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
// Serial.println(F("This sample only works with MIFARE Classic cards."));
// return;
// }

// Set new UID
byte newUid[] = NEW_UID;
if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
Serial.println(F("Wrote new UID to card."));
}

// Halt PICC and re-select it so DumpToSerial doesn't get confused
mfrc522.PICC_HaltA();
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
return;
}

// Dump the new memory contents
Serial.println(F("New UID and contents:"));
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

delay(2000);
}

Output:
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino: In function 'void loop()':
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:10:18: error: expected primary-expression before '{' token
#define CARD_UID {0xD3, 0x37, 0xED, 0x2E}
^
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:37:22: note: in expansion of macro 'CARD_UID'
if (mfrc522.uid == CARD_UID)
^~~~~~~~
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:10:18: error: expected ')' before '{' token
#define CARD_UID {0xD3, 0x37, 0xED, 0x2E}
^
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:37:22: note: in expansion of macro 'CARD_UID'
if (mfrc522.uid == CARD_UID)
^~~~~~~~
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:11:17: error: expected primary-expression before '{' token
#define FOB_UID {0x13, 0x54, 0x0C, 0xB7}
^
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:42:22: note: in expansion of macro 'FOB_UID'
if (mfrc522.uid == FOB_UID)
^~~~~~~
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:11:17: error: expected ')' before '{' token
#define FOB_UID {0x13, 0x54, 0x0C, 0xB7}
^
C:\Users\Richardson Family\Documents\Arduino\RFID_test\RFID_test.ino:42:22: note: in expansion of macro 'FOB_UID'
if (mfrc522.uid == FOB_UID)
^~~~~~~

exit status 1

Compilation error: expected primary-expression before '{' token

Where is this line in the code you posted? I don't see it.

#define is a macro definition. It maps an identifier to a text value. The macro preprocessor does a simple text substitution. An array definition is invalid for a value so you get an error.

1 Like

The definition is valid, it's the use that isn't. Because you can't use assignment with an array.

Missed that, the error was on the compare attempt after the macro substitution.

1 Like

LOL my turn, compare as well as assignment.

that's just the UID on one of the RFID cards I have but for some reason, it's whats causing the error and I forgot to change the logs so they wouldn't have the UID

I can see that it's the UID. Two different people have just told you what is causing the error.

What "logs" are you referring to?

the "logs" I'm referring to are the error output. I'm not quite sure by what you mean that the use is invalid. are you saying that I can't compare an array with another array?

You can compare them algorithmically, but not with the '==' or other comparison operators. Similarly, you can't assign them with '=', except during initialization with constant values.

Quite simply as was explained

if (mfrc522.uid == CARD_UID)

is converted into

if (mfrc522.uid == {0xD3, 0x37, 0xED, 0x2E})

by the pre-processor, and that is not a valid statement.
Only if you assign it to a variable while declaring that variable, can you use that macro like that.
but even assigning it while declaring it, you still can not be comparing it with '==' since then you would be comparing the pointers to the 'arrays' and not the array itself. Hence the existance of functions like strcmp() memcmp() etc.

this is a valid statement

byte newUid[] = NEW_UID;

and you can use memcmp to compare newUid to mfrc522.uid (comparing 4 bytes from both starting addresses.)

I'm getting newUid was not declared in this scope

because some parts of that are commented out. I am not going to correct every line of the code (which btw you should post within </> code-tags) just explain to you why something is not a valid statement. for the rest you can contact the author of the code.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.