Я не хочу Вас напрягать пока сам не попробую …
Я такой вариант попробую, но все же хотелось -бы разобраться что не так с сортировкой

исправленый код , вроде я все учел , по крайнее мере в соответствии с учебником …
но все - же работает неправильно . если судить по дампам масив создается , память выделяется , указатели верные ссылаются на верное место , но … после qsort массив указателей сбивается , указатели улетают в конец массива соответственно я ничего не вижу…
С другой стороны если тот же массив иницировать изначально списком , а не брать из еепром , то сортировка работает нормально … остается предположить , что мое заполнение массива указателей значением еепром конфликтует с операторами сортировки
// #include <dumpmon.h>
#include <stdlib.h>
#include <string.h>
#include <EEPROM.h>
char fd[20];
char *MyStr[30];
void setup() {
Serial.begin(19200);
// dumpmonSetup(19200);
WriteEEP(); //заполнить еепром для проверки
MySort(); // попытка отсортировать
}
void loop() {
}
void MySort(void) {
int z, zz;
char *s;
for (z = 0; z < 7; z++) {
EEPROM.get(z * 20, fd);
Serial.println(fd);
s = (char *)calloc(20, 1);
if (s == NULL) {
Serial.println("Memory not");
} else {
Serial.println("Memory Yes");
MyStr[z] = s;
strcpy(MyStr[z], fd);
}
}
Serial.println("------------end array eeprom----------------");
for (z = 0; z < 7; z++) Serial.println(MyStr[z]);
Serial.println("------------end array ram----------------");
/// watch(MyStr, "Ms");
// breakpoint("in watch");
int qq = sizeof(MyStr) / sizeof(char *);
qsort(MyStr, qq, sizeof(char *), MyCmp);
// watch(MyStr, "Mstr");
// breakpoint("out watch");
for (z = 0; z < 7; z++) {
Serial.println(MyStr[z]);
}
Serial.println("-------------sorted ----------------");
for (z = 0; z < 7; z++) {
free(MyStr[z]);
MyStr[z] = NULL;
}
}
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, 20); // очищенная строка
EEPROM.put(0, mem);
ff.toCharArray(mem, 20); // очищенная строка
f0.toCharArray(mem, 20); //строка со значением определенной длины 20 символов
mem[19] = 0; // 20 символ - код строки от (0-150)
EEPROM.put(20, mem);
ff.toCharArray(mem, 20);
f1.toCharArray(mem, 20);
mem[19] = 5;
EEPROM.put(40, mem);
ff.toCharArray(mem, 20);
f2.toCharArray(mem, 20);
mem[19] = 2;
EEPROM.put(60, mem);
ff.toCharArray(mem, 20);
f3.toCharArray(mem, 20);
mem[19] = 4;
EEPROM.put(80, mem);
ff.toCharArray(mem, 20);
f4.toCharArray(mem, 20);
mem[19] = 3;
EEPROM.put(100, mem);
ff.toCharArray(mem, 20);
f5.toCharArray(mem, 20);
mem[19] = 1;
EEPROM.put(140, mem);
ff.toCharArray(mem, 20);
f5.toCharArray(mem, 20);
mem[19] = 1;
EEPROM.put(140, mem);
}