Wpis z mikrobloga

Mirki mam funkcję która chce parametr const *char:

void playFile(const char *filename)
{
}

i mam tablicę stringów:

String drums[22]
{
"snare.wav", ....
}

co mógłbym zrobić żeby jak najszybciej i najwydajniej odpalać te pliki tą funkcją? Na razie mam tak i działa:

void playSample(byte i)
{
const char* pointer_to_string = drums[i].c_str();
playFile(pointer_to_string);
}

ale to chyba jest całkowicie naokoło rozwiązanie. Potrzebowałbym albo zdefniować tablicę jako "const char *" albo zmienić parametr funkcji na String, ktoś wie jak to zrobić?
(nazwy plików są stałe ale w trakcie programu inna funkcja przeskanuje inny folder i podmieni tablicę drums[22] na inne nazwy plików)
#arduino #elektronika ew. może ktoś z #csharp będzie wiedział?
  • 11
@jacku: no to zdefiniuj tablicę const char *, po co masz zajmować pamięć jakimiś wrapperami? Chyba, że gdzieś indziej ci ten String mocno ratuje życie albo coś, tak też może być, to wtedy zostaw jak jest.
@zwei: robilem tak i nie działało, już nie pamiętam dlaczego, może był jakiś problem z podmianą tej tablicy. Ale jak to jest właściwy kierunek i napewno zadziała to mogę to rozgrzebać

To jeszcze musi być kompatybilne z tym:

void add_filenames_to_array(File folderName)
{
byte i = 0;
while (true)
{
File entry = folderName.openNextFile();
if (!entry)
{
break;
}
drums[i] = entry.name(); //.name chyba jest Stringiem
i++;
entry.close();
}
}
@MostlyRenegade: to c_str() wziąłem z jakiegoś tutoriala i po prostu zadziałało, nie zgłębiałem jak. Próbowałem jakkolwiek zamienić te typy żeby pasowały, mogę z tego zrezygnować jeśli da się wszystko zrobić na const char*
@jacku: chatgpt
Twoje obecne podejście do odtwarzania plików dźwiękowych jest dobre, ale można je jeszcze nieco zoptymalizować. Aktualnie przekształcasz każdy element tablicy String w const char* za każdym razem, gdy wywołujesz funkcję playSample(). Możesz zoptymalizować to rozwiązanie, przechowując wcześniej przekształcone wskaźniki do stringów w tablicy, aby uniknąć zbędnego konwertowania przy każdym odtwarzaniu. Oto jak to zrobić:

// Zadeklaruj tablicę wskaźników do const char* i zainicjalizuj ją raz przy starcie programu.
const
@jacku: zmień program zachowując tablice ale żeby przerabiał w locie
ChatGPT
Jeśli chcesz zachować oryginalną tablicę String, ale przerabiać ją w locie bez konieczności utrzymywania osobnej tablicy wskaźników, możesz to zrobić, przechodząc przez konwersję String na const char* bezpośrednio w funkcji playSample(). Oto jak to zrobić:

cpp
Copy code
void playSample(byte i) {
// Konwertuj String na const char* i od razu użyj go w funkcji playFile.
playFile(drums[i].c_str());
}
W tym