По ходу работы устройства (использован 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(); } } Помогите осилить, плиз, если можно.
Сделайте проще - не сортируйте, просто вычитывайте все даты по порядку. На сортировку в памяти у вас этой самой памяти не хватит на контроллере, а на процедуру сортировки с многократным повторным перечитыванием каталога еще и времени. Немного времени можно сэкономить прочитав первый элемент каталога и узнав ориентировочно одну дату из диапазона.
Если честно, то не понял, про какие даты вы говорите? Те которые в именах файлов? Все равно не понял как действовать Если про дату создания файлов, то ее нет, все файлы получаются от 01.01.2000, да и нет метода у SD.h, для работы с датой файла.
Да, про вот эти: Перебирать в цикле даты и формировать в строке имя файла, считывать существующие файлы, пропускать несуществующие.
А если все же пройтись по файлам и положить имена в массив, а потом перебирая даты, искать значение в массиве?
В таком варианте наверное побыстрее будет. Вот только подскажите как положить char ff[9] с именем файла, в массив из N элементов?
Да, будет быстрее, но это сработает только если памяти хватит. Массив объявляется так: Код (Text): char filenames[N_FILES][MAX_FILENAME_LENGTH];
Как объявить 2х мерный массив, я знаю. Не могу найти пример как поместить туда элемент (или String или char[9] ), содержащий имя файла.
Ну вот, кажется нашел: Код (C++): memcpy(&filename[i][0], ff, 9); Остается выяснить как перемещаясь по строкам 2х мерного массива сравнивать значения с содержимым одномерного. Я ж говорю, что массивы, особенно char, и указатели - нечто волшебное для меня.
Ничего волшебного в указателях нет, это просто адрес памяти, по которому лежит то, на что он указывает.
Да хоть p**********. И в чем же оно? Один раз пройти по ссылке - волшебство, два - супер-мега-фантастика, три и больше - вообще умопомрачительное колдунство, которого не может быть.
А количество файлов заранее известно? Если нет, то не получится объявить массив для хранения их имен.
Ну вообще-то для этого существуют динамические массивы, с ручным выделением памяти под нужное кол-во элементов. Я нашел решение, все работает. Спасибо Unixon за идею с перебором дат.
А за одно просто спасибо. Вот разобрался в вопросе относительно функции main в linux: Источник: http://younglinux.info/c/argc-argv Я что-то путался, то пишут с одной звездочкой, то с двумя. И никак не мог верного вопроса Гуглу задать, а тут удалось