Сортировка файлов на SD

Тема в разделе "Arduino & Shields", создана пользователем AlexVS, 1 дек 2015.

  1. AlexVS

    AlexVS Гик

    По ходу работы устройства (использован IBoard PRO) данные записываются на SD Card. Имена файлов имеют формат YYYYMMDD.csv. При необходимости имена всех файлов, выводятся на веб-страницу, но порядок вывода - как придется. Хотелось бы получить сортированный список, но пока не получается, поскольку массивы и указатели для меня все же магия. Вот кусочек кода, который используется для перебора всех файлов, имена из String перекладываются в char, далее их бы запихать в массив, а потом отсортировать содержимое массива.
    Код (C++):
    void SortFile(File dir)
    {
      char ff[9]="\0";
      while (true)
      {
        File entry =  dir.openNextFile();
        if (! entry) {
          dir.rewindDirectory();
          break;
        } // no more files
        String fname = entry.name();
        if (fname.indexOf(".CSV") > 0)
        {
          fname.toCharArray(ff,9);
          Serial.println(ff);
        }
        entry.close();
      }
    }
    Помогите осилить, плиз, если можно.
     

    Вложения:

  2. Unixon

    Unixon Оракул Модератор

    Сделайте проще - не сортируйте, просто вычитывайте все даты по порядку. На сортировку в памяти у вас этой самой памяти не хватит на контроллере, а на процедуру сортировки с многократным повторным перечитыванием каталога еще и времени. Немного времени можно сэкономить прочитав первый элемент каталога и узнав ориентировочно одну дату из диапазона.
     
    AlexVS нравится это.
  3. AlexVS

    AlexVS Гик

    Если честно, то не понял, про какие даты вы говорите? Те которые в именах файлов?
    Все равно не понял как действовать :(
    Если про дату создания файлов, то ее нет, все файлы получаются от 01.01.2000, да и нет метода у SD.h, для работы с датой файла.
     
  4. Unixon

    Unixon Оракул Модератор

    Да, про вот эти:

    Перебирать в цикле даты и формировать в строке имя файла, считывать существующие файлы, пропускать несуществующие.
     
  5. Unixon

    Unixon Оракул Модератор

    Впрочем, тут есть одна проблема - библиотека все равно будет перечитывать весь каталог :(
     
  6. AlexVS

    AlexVS Гик

    А если все же пройтись по файлам и положить имена в массив, а потом перебирая даты, искать значение в массиве?
     
  7. AlexVS

    AlexVS Гик

    В таком варианте наверное побыстрее будет.
    Вот только подскажите как положить char ff[9] с именем файла, в массив из N элементов?
     
  8. Unixon

    Unixon Оракул Модератор

    Да, будет быстрее, но это сработает только если памяти хватит.
    Массив объявляется так:
    Код (Text):
    char filenames[N_FILES][MAX_FILENAME_LENGTH];
     
  9. AlexVS

    AlexVS Гик

    Как объявить 2х мерный массив, я знаю. Не могу найти пример как поместить туда элемент (или String или char[9] ), содержащий имя файла.
     
  10. AlexVS

    AlexVS Гик

    Ну вот, кажется нашел:
    Код (C++):
     memcpy(&filename[i][0], ff, 9);
    Остается выяснить как перемещаясь по строкам 2х мерного массива сравнивать значения с содержимым одномерного. Я ж говорю, что массивы, особенно char, и указатели - нечто волшебное для меня. :)
     
  11. Unixon

    Unixon Оракул Модератор

    Ничего волшебного в указателях нет, это просто адрес памяти, по которому лежит то, на что он указывает.
     
  12. ИгорьК

    ИгорьК Гуру

    Волшебство начинается здесь: р** - указатель на указатель.
     
  13. Unixon

    Unixon Оракул Модератор

    Да хоть p**********. И в чем же оно? Один раз пройти по ссылке - волшебство, два - супер-мега-фантастика, три и больше - вообще умопомрачительное колдунство, которого не может быть. :D
     
    ИгорьК нравится это.
  14. Sindbad

    Sindbad Гик

    А количество файлов заранее известно? Если нет, то не получится объявить массив для хранения их имен.
     
  15. AlexVS

    AlexVS Гик

    Ну вообще-то для этого существуют динамические массивы, с ручным выделением памяти под нужное кол-во элементов.
    Я нашел решение, все работает. Спасибо Unixon за идею с перебором дат.
     
  16. ИгорьК

    ИгорьК Гуру

    А за одно просто спасибо. Вот разобрался в вопросе относительно функции main в linux:
    Источник: http://younglinux.info/c/argc-argv
    Я что-то путался, то пишут с одной звездочкой, то с двумя. И никак не мог верного вопроса Гуглу задать, а тут удалось :)