Вопрос на основе связанного списка

Я делаю смарт-тележку с использованием 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

Обсуждение

ваш вопрос не связан с RFID, как следует из названия.... ваш вопрос касается связанных списков.... обновите заголовок вопроса., @jsotola


1 ответ


2

Я не вижу кода для создания новых узлов или объединения их в список. Связанному списку нужен корень (известная переменная, указывающая на первого члена списка); способ создания или приобретения новых узлов и связывания их со списком по мере роста количества элементов; и способ отсоединить узел и «выбросить» его — вернуть ему память, когда он перестанет быть полезным.

Я дам несколько советов по поводу связанных списков, особенно в процессорах типа Uno с ограниченной памятью:

  1. Не поддавайтесь искушению использовать malloc() и free() или new и delete для системы, которая должна работать непрерывно. Выделение и освобождение небольших фрагментов памяти, особенно когда они чередуются с другими выделениями & Освобождение памяти приведет к фрагментации кучи (той части памяти, которая используется для выделения памяти во время выполнения). В результате в куче окажется множество отдельных фрагментов памяти, которые свободны, но слишком малы для других запросов на выделение, поэтому куче придется получить больше памяти, чтобы удовлетворить более крупные выделения. Это достигается за счет уменьшения пространства стека! В конце концов стек разрастется до кучи, и программа выйдет из строя.

    Мое решение — определить глобальный массив структур узлов; их достаточно для удовлетворения самых больших потребностей программы, плюс еще несколько для безопасности; связать их в список свободных узлов; и передать приложению новые узлы, освободив один из свободного списка. О. В любом случае для связанного списка вам понадобятся функции link() и unlink(), поэтому для этого потребуется совсем немного больше кода.

  2. Поскольку мы говорим о процессорах с ограниченной памятью, если мне не нужно более 255 узлов, я связываюсь с индексами массива вместо указателей, экономя один байт на каждый узел. Индексация в массив требует немного больше кода, чем разыменование указателя, но компиляторы сумели свести к минимуму даже эти издержки.

,