Вопрос на основе связанного списка
Я делаю смарт-тележку с использованием RFID. Пользователь будет иметь RFID-карту. Как только он поднесет карту RFID-считыватель идентифицирует пользователя и создаст связанный список для этого конкретного пользователя. Связанный список будет содержат уникальные идентификаторы товаров, приобретенных пользователем, на основе Rfid. В моем коде проблема в том, что после обнаружения пользователя он не создается связанный список для предметов/не обнаруживаются предметы, купленные пользователем. И пользователь, и товары идентифицируются по своим уникальным идентификаторам (т. е. RFID-меткам). Он обнаруживает пользователя, но как только пользователь обнаружен, он не сопоставляет товары, купленные этим пользователем.
код для этого:
int count = 0; // count = 0
int i;
char input[12]; // character array of size 12
boolean flag = 0;
// flag =0
boolean comparetag(char x[12], char bb[12]) {
boolean ff = false;
int fg = 0;
for (int cc = 0; cc < 12; cc++) {
if (x[cc] == bb[cc]) {
fg++;
}
}
if (fg == 12) {
ff = true;
}
return ff;
}
struct Node {
char x[12];
struct Node *next;
};
struct Node* X;
struct Node* point;
void printList(struct Node *n) {
while (n != NULL) {
Serial.print(n->x);
n = n->next;
}
}
struct Node* Shopping(char[]) {
Serial.print(input);
// Print RFID tag number
Serial.print("Welcome User");
Serial.println();
Serial.print("Start Shopping ");
struct Node* head = NULL;
head = (struct Node*) malloc(sizeof(struct Node));
return head;
}
void setup() {
Serial.begin(9600);
}
void loop() {
if (flag == 0) {
if (Serial.available()) {
count = 0;
while (Serial.available() && count < 12) // Read 12 characters and store them in input array
{
input[count] = Serial.read();
count++;
delay(5);
}
if (comparetag(input, "1B006AFA9F14")) {
flag = 1;
point, X = Shopping(input);
} else {
Serial.println("not Registered User");
}
}
} else {
int c = 0;
if (Serial.available()) {
while (Serial.available() && c < 12) // Read 12 characters and store them in input array
{
Serial.print("Taking Input");
X->x[c] = Serial.read();
c++;
delay(5);
}
struct Node* second = NULL;
second = (struct Node*) malloc(sizeof(struct Node));
second = NULL;
X->next = second;
X = second;
}
}
printList(point);
}
1 ответ
Я не вижу кода для создания новых узлов или объединения их в список. Связанному списку нужен корень (известная переменная, указывающая на первого члена списка); способ создания или приобретения новых узлов и связывания их со списком по мере роста количества элементов; и способ отсоединить узел и «выбросить» его — вернуть ему память, когда он перестанет быть полезным.
Я дам несколько советов по поводу связанных списков, особенно в процессорах типа Uno с ограниченной памятью:
Не поддавайтесь искушению использовать
malloc()
иfree()
илиnew
иdelete
для системы, которая должна работать непрерывно. Выделение и освобождение небольших фрагментов памяти, особенно когда они чередуются с другими выделениями & Освобождение памяти приведет к фрагментации кучи (той части памяти, которая используется для выделения памяти во время выполнения). В результате в куче окажется множество отдельных фрагментов памяти, которые свободны, но слишком малы для других запросов на выделение, поэтому куче придется получить больше памяти, чтобы удовлетворить более крупные выделения. Это достигается за счет уменьшения пространства стека! В конце концов стек разрастется до кучи, и программа выйдет из строя.
Мое решение — определить глобальный массив структур узлов; их достаточно для удовлетворения самых больших потребностей программы, плюс еще несколько для безопасности; связать их в список свободных узлов; и передать приложению новые узлы, освободив один из свободного списка. О. В любом случае для связанного списка вам понадобятся функции link() и unlink(), поэтому для этого потребуется совсем немного больше кода.Поскольку мы говорим о процессорах с ограниченной памятью, если мне не нужно более 255 узлов, я связываюсь с индексами массива вместо указателей, экономя один байт на каждый узел. Индексация в массив требует немного больше кода, чем разыменование указателя, но компиляторы сумели свести к минимуму даже эти издержки.
- Как использовать RFID-RC522 с Arduino?
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
ваш вопрос не связан с RFID, как следует из названия.... ваш вопрос касается связанных списков.... обновите заголовок вопроса., @jsotola