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ł?
@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
@zwei: @zetisdead @MostlyRenegade @cisza666 w sumie czat nieźle to zaproponował, działa ( ͡°͜ʖ͡°) co prawda jest tworzona dodatkowa tablica ale nie przerabia już nic w locie
@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
@cisza666: @jacku to wszystko brzmi jak przedwczesna optymalizacja. Trzeba sprawdzić w dokumentacji, bo jeśli funkcja c_str() zwraca wskaźnik do oryginalnego bufora znaków spod danego Stringa, to nie ma mowy o żadnym narzucie i konwersji.
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ł?
String
mocno ratuje życie albo coś, tak też może być, to wtedy zostaw jak jest.Możesz też napisać:
playFile(drums[i].c_str())
ale to w sumie nic nie zmienia.
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();
}
}
c_str()
zstd::string
zwraca typconst char*
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
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