Помогите с char* массивом

glags
Offline
Зарегистрирован: 10.07.2012
char* filecat[]={"sys123456700", "sys123456701", "sys123456702", "sys123456703", "sys123456704", "sys123456705", "sys123456706"};

            File dir=SD.open("/");  //Чтение каталога
            dir.rewindDirectory();
            key=0;
            while(true) {
            file =  dir.openNextFile(); //Переход к следующему файлу
            if (!file) {// Больше файлов не осталось и выход
            goto menuself1;}
            filecat[key]=file.name(); //Присвоить элементу массива имя файла
            key++;
             }
menuself1:  delay(1000);

Помогите разобраться. Мне надо массив filecat[]; заполнить именами файлов с флешкарты, чтоб в дальнейшем из массива можно было достать имя файла по его номеру. После выполнения этой программы весь массив оказывается заполненным именем последнего файла. Имена файлов с карты читаются без проблем. Как нормально создать и заполнить такой массив? Помогите кто силен в этом или сталкивался с этой проблеммой.

mixail844
Offline
Зарегистрирован: 30.04.2012

вообще не особо знаком в работе с флешками но из знаний синтекса си,знаю что нельзя присваивать строку строке то есть

char buff1[10],buff2[10]={"name"};
buff1= buff2;//так нельзя!!

 

для присвоения-переписи массива символов массиву символов исползьуеться :

strcpy(buff1,buff2);

в вашем случае :

strcpy(filecat[key],file.name());

 

glags
Offline
Зарегистрирован: 10.07.2012

Большое спасибо, за оперативный ответ. Супер, у меня всё заработало, но я не совсем понял как работает оператор strcpy. Среди списка команд arduino я его не нашёл. Приблизительно я понял так переменная file.name() замещает переменную filecat[key] в позиции key, но почему нельзя напрямую в позицию key записать значение переменной file.name() оператором присвоения. Ведь filecat[key] это массив из которого можно читать элементы, почему в него нельзя их записать (тоесть присвоить элементу массива значение)?

leshak
Offline
Зарегистрирован: 29.09.2011

glags пишет:

Большое спасибо, за оперативный ответ. Супер, у меня всё заработало, но я не совсем понял как работает оператор strcpy. Среди списка команд arduino я его не нашёл.

Ищите ее в справочниках по языку C/C++ (ардуино - это некий их "огрызок"). 

glags пишет:

Ведь filecat[key] это массив из которого можно читать элементы

Да... только зайдатесь вопросом "массив чего"? Какого типа элементы? Ведь это не "массив строк", а массив "указателей на строки".

Вот вы напрямую сохранили ссылку на строку туда в массив, а при следующем вызове ваше file.name() - поменяло что хранится по этому адресу памяти. То есть смотрите. file.name()  - возвращают не строку, а адресс где лежит строка. И вы его запомнили в массив. Адресс. А она пошла пользоватся дальше этим куском памяти. И на этот адресс - загрузила новое имя. Соотвественно ваша ссылка, сохраненная в массиве - указывает, теперь, на новое имя файла. Жилец по этому адресу поменялся :)

А с strcpy, вы, фактически, взяли и сняли копию со строки. Сделали "ксерокопию" жильца и сохранили в собственной кладовке :) Ссылку на которую, теперь - имеете только вы. И значит - ее никто не поменяет (кроме вас).

Вообщем берите какой-нибудь учебник по C и вчитывайтесь в строки/указатели и т.п. Это вообщем-то одно из базовых вещей C. При этом и самое "взрымозгное" для новичка (да и не новички частно запутываются в них). В этом и сила C/C++ и его проклятие-сложность.

glags
Offline
Зарегистрирован: 10.07.2012

Спасибо всё понял в file.name() хранится адресс на строку, а strcpy копирует из данного адреса строку в filecat[key].

Leshak, а можно ваш скайп или асю, если вы живёте в Укранине то можно мобильный телефон чтоб пообщаться и в какое время вам удобно? Меня устроило б с 19-00 до 23-00 киевского времени.

Моё мыло ssglag@gmail.com.

leshak
Offline
Зарегистрирован: 29.09.2011

glags пишет:

Leshak, а можно ваш скайп или асю, если вы живёте в Укранине то можно мобильный телефон чтоб пообщаться и в какое время вам удобно? Меня устроило б с 19-00 до 23-00 киевского времени.

Моё мыло ssglag@gmail.com.

Отправил вам письмо.