Проблемы с сортировкой

Скажите пожалуйста , где я торможу…
код должен считать данные из еепром и отсортировать их.
из епром данные читаются , а вот после сортировки результата 0.



#include <EEPROM.h>
#include <stdlib.h>
#include <string.h>
char fd[20];

void setup() {
  Serial.begin(19200);
  while (!Serial) {
    ;  // wait for serial port to connect. Needed for native USB port only
  }
  Serial.print("Read float from EEPROM: ");
  WriteEEP();  //заполнить еепром для проверки
  MySort(); // попытка отсортировать
}

void loop() {
  /* Empty loop */
}


void MySort(void) {
  int z, zz;
  char *MyStr[30]; // массив указателей на строки для сортировки
  zz = 0;
  for (z = 20; z < 160; z += 20) {
    EEPROM.get(z, fd);
    Serial.println(fd);  // строки считаные из еепром
    //  if (strlen(fd) != 0) {  // если строка пустая игнорируем
    *MyStr[zz] = fd; // а вот тут видимо болт
    zz++;
    //  }
  }

  int SiZe = sizeof(MyStr) / sizeof(char *);
  qsort(MyStr, SiZe, sizeof(char *), MyCmp);
  for (z = 0; z < zz; z++) {
    Serial.println(MyStr[z]);
  }
}


int MyCmp(const void *p1, const void *p2)
{
    const char *s1 = *(const char **)p1;
    const char *s2 = *(const char **)p2;
    return strcmp(s1, s2);
}


void WriteEEP(void) {  

  char mem[20];
  const String ff = "                   ";
  String f0 = "A.CURRENT";
  String f5 = "Akai";
  String f2 = "Costa";
  String f3 = "India";
  String f4 = "Traton";
  String f1 = "Old";
  ff.toCharArray(mem, 18); // очищенная строка
  f0.toCharArray(mem, 18); //строка со значением определенной длины 20 символов
  mem[19] = 0;  // 20 символ - код строки от (0-150)
  EEPROM.put(20, mem);
  ff.toCharArray(mem, 18);
  f1.toCharArray(mem, 18);
  mem[19] = 5;
  EEPROM.put(40, mem);
  ff.toCharArray(mem, 18);
  f2.toCharArray(mem, 18);
  mem[19] = 2;
  EEPROM.put(60, mem);
  ff.toCharArray(mem, 18);
  f3.toCharArray(mem, 18);
  mem[19] = 4;
  EEPROM.put(80, mem);
  ff.toCharArray(mem, 18);
  f4.toCharArray(mem, 18);
  mem[19] = 3;
  EEPROM.put(100, mem);
  ff.toCharArray(mem, 18);
  f5.toCharArray(mem, 18);
  mem[19] = 1;
  EEPROM.put(120, mem);
}

судя по всему проблема в 29 строке , но не могу понять , что ей не нравится.
потому , как даже комментируя сортировку - по указателям массива ничего нет(мусор)
спасибо

 *MyStr[zz] = fd;

Что тут происходит?

Может воспользоваться встроенной системной функцией сортировки и не городить огород? Тем более, если не умеете? Есть же готовая функция qsort, которая всё отсортирует в лучшем виде.

Дак он ей и пользуется, в 35 строке, тока неправильно.

Ой, а я и не заметил. Я добрался только до 30-ой строки, сравнил её с 25-ой, охренел и выпал в осадок :frowning:

зато таких вапще без собеседования берут в мэйл групп ведущими программистами. В Али сортировка примерно через такой же gluteus написана.

это наврядли, слышал, что сейчас по блату тока родственников

с такими роцтвенниками врагов не надо.

Ты все строки читаешь в один и тот же массив, не написал нуль-терминатора, и вообще какой-то кошмар написал.

заполнение массива для сортировки строками из еепром

Это так. Но не строками , а одним и тем же указателем.

25-30 считывание данныхь с еепром чтобы положить в массив для сортировки с шагом 20 т.к 20 ячеек занимает строка в еепром… Что тут страшного ,?

почему неправильно?Вроде все так… к тому же если

char *MyStr[3]={"привет","аллоя","енот"}; 
 int z, zz;
 
 int SiZe = sizeof(MyStr) / sizeof(char *);
  qsort(MyStr, SiZe, sizeof(char *), MyCmp);
  for (z = 0; z < SiZe; z++) {
    Serial.println(MyStr[z]);
  }



int MyCmp(const void *p1, const void *p2)
{
    const char *s1 = *(const char **)p1;
    const char *s2 = *(const char **)p2;
    return strcmp(s1, s2);
}



то сортирует все правильно … Проблема в том что он не хочет занести в массив мои данные с еепром… ну я так думал…

Для того, чтобы понять, что он хочет, а чего нет, достаточно объяснить себе пошагово, что происходит в данном случае: char *MyStr[3]={"привет","аллоя","енот");

почему одним и тем,же , разве при добавлении новой строки , она не добавит в массив новый указатель на новую строку? (у меня пока с указателями туговато идет)
но я так понял , что 3 моих строки размещены в памяти а 3 указателя на адреса строк размещены в самом массиве. Тоже самое я пытаюсь сделать в 29 строке. добавляю строку в память и новый указатель записывается в массив.Индекс новый значит и указатель на новое место записан…

На какую новую?

Сколько переменных в данном коде?

a=1;
a=2;
a=34;

Вот это ключевой момент - три разных строки размещены в памяти по разным адресам и эти адреса хранятся в массиве указателей.

Чтение из EEPROM в один и тот же массив не создаёт никаких новых строк и не меняет никаких адресов.

Возможно, но я пользуюсь стандартной функцией - она вроде нормально все сортирует… Как раз чтобы не изобретать велосипед…:slight_smile:

конечно, в этом и смысл… иначе как потом сортировать …только вот не строки в массив строки в память помещаются а я в массив пихаю указатели на эти строки, чтобы потом использовать qsort

про нуль терминатор непонял