String в char*

anton_1992
Offline
Зарегистрирован: 14.11.2015

Здравствуйте! Помогите с такой проблемой.

При выполнении 2-3 циклов этого кода все перестает работать.

Я считаю что используемый для преобразования буфер переполняется и его надо как-то очищать в конце каждого цикла... как это лучше всего сделать? 

 
char * RandomTrec(int zz, int xx){ // функция генерации имени файла в заданных пределах
  char* result;
  int t100;
  t100=random(zz, xx+1);
  String xxx = ".mp3";
  String Name2 = "track";
  String nomber = String(t100);

  String trackName2 = String(Name2 + nomber +  xxx );  //генерируем имя файла

  unsigned char* buf = new unsigned char[100]; // преобразуем стринг в чар
  trackName2.getBytes(buf, 100, 0);
//const char*Name = trackName2.c_str();
  char *Name = ( char*)buf;
  result=Name;

  
  return result;
 }

 

 

Seth
Offline
Зарегистрирован: 01.02.2014

ты создаешь буфер функцией new, а удалять в конце не удаляешь (delete buf) в результате они остаются в памяти и она заканчивается.

anton_1992
Offline
Зарегистрирован: 14.11.2015

 

Большое Спасибо! Скажите, а как в таком случаи очистить еще и String trackName2? 

Seth
Offline
Зарегистрирован: 01.02.2014

Когда очистить? Это строка создается в функции и там же уничтожается. 

Но очищается она так trackName2 = ""; но это лишнее

anton_1992
Offline
Зарегистрирован: 14.11.2015

Я наверное тупой... подскажите в каком виде и куда именно поставить delete buf... что-то не хочет работать...

 

Seth
Offline
Зарегистрирован: 01.02.2014

Да и вообще реализация функции в корне неправильна.

char* result;
char *Name = ( char*)buf;
 result=Name;

  return result;

Для чего столько манипуляций?

Это пререливание их пустого в порожнее... Потому что возвращается указатель на переменную которая уничтожается при выходе из фукции. Формально по указанным адресам может оставаться правильная информация и программа может работать, а может, что вероятнее! там уже будут другие данные принадлежащие другим переменным и функциям. В результате чего программа также может виснуть.

Правильно делать, передать функции указатель на буфер (строку) в которую она и поместит результат своей работы. Либо создать буфер new в функции и вернуть указатель на него, а удалить его (delete) где-то снаружи, когда он станет не нужен.

anton_1992
Offline
Зарегистрирован: 14.11.2015

Все заработало. Сейчас объясню в чем дело: у меня в проекте есть mp3-шилд, котороый должен вопсроизводить звуковый файлы при определенных условиях. Библиотека данного шилда, при обращении к нему с просьбой проиграть конкретный файл, требует тип char*. Я долго мучался с этим, ведь если запихать имена всех файлов в один массив и затем по одному их вытаскивать, то нехватит памяти. Поэтому я решил что проще генерировать название файла из составляющих. Как это сделать для char* я не нашел, поэтому прибег к такой конструкции (гернерация в String, затем String в Char*).  

Seth
Offline
Зарегистрирован: 01.02.2014

String.c_char() это и есть указатель char* на строку

т.е.

String str = "filename";
myFunc(str.c_char()); 

 

anton_1992
Offline
Зарегистрирован: 14.11.2015

Ну, теперь буду знать!) Большое Спасибо!)