const char* to char*

Тема в разделе "Arduino & Shields", создана пользователем snake32, 31 янв 2015.

  1. snake32

    snake32 Нерд

    Доброго времени!
    Написал такую ф-ию
    Код (Text):
    void TLogger::TrySetDir( String &in, String &out )
    {
      if(( in.length() > 0 )&&( in.charAt(0) == '%' ))
      {
        out += clock.year;
        //SD.mkdir( out.c_str() );
        out += "/" + clock.month + in.substring(1);
      }else
        out = in;
    }
    На закомментарином месте ругает. Как в С++ из объекта String получить char* ?
     
  2. Виталий

    Виталий Нерд

  3. snake32

    snake32 Нерд

    К сожалению, ничего для себя там не нашёл. Фишка в том что примеры там для статических строк, а у меня out - это динамическая строка. То есть длина может изменяться в процессе выполнения программы.
    При этом хочу получить такой код чтобы его не менять при изменении содержимого out.
    В С++ это возможно?
     
  4. altex

    altex Гик

  5. geher

    geher Гуру

    А попробовать явно преобразовать тип?
    Если я правильно понимаю, то c_str возвращает const char*.
    mkdir принимает char* как параметр.
    Тогда mkdir((char*) out.c_str())
    Это не совсем правильно, поскольку функция теоретически может изменять строку, передаваемую ей параметром, что несколько чревато (не зря же возвращаемое именно const char*).
    Но в данном конкретном случае mkdir строку даже не пытается изменить.
    решение через использование toCharArray является более правильным, но в случае программирования микроконтроллеров иногда приходится сходить с "правильного" пути ради экономии памяти (для toCharArray придется резервировать дополнительный буфер, куда будет перемещена строка).
     
    Последнее редактирование: 31 янв 2015
    snake32 нравится это.
  6. snake32

    snake32 Нерд

    Спасибо! решил пока обойтись статическими массивами, просто выделяю больше памяти.
    Тут ещё одни баг вылез. При подключении всех устройств(SD,NFC,LCD,RTC) начинал адски глючить. Бился с багом двое суток - думал программная ошибка. Три раза переписывал код почти полностью.
    Оказалось, что напруги просто не хватало. Я подключал ардуино через USB-удлинитель(так было удобнее) и с одним устройством всё нормально работало. Но когда их стало 4... выкинул удлинитель