Skocz do zawartości

Sposób na rozbudowane if, switch...


Pomocna odpowiedź

Napisano (edytowany)

Cześć, podsuncie jakiś pomysł...

Uczepiłem się tego dfplayerem to mam😭, chcę by mój dfp wygrał mi aktualną datę, godzinę i dzień tygodnia. Wszystkie te dane, tzn. dzień tygodnia, miesiąca, miesiąc, rok i oczywiście godziny mam w formie liczbowej (int). Do każdej tej liczby muszę przyporządkować konkretny numer pliku wav.

Teraz, zrobienie tego na if... kupa pisania...

Zrobienie na switchu nie lepiej... 31dni, 12 miesięcy, rok, 24 godziny, 60 minut...

127szt case...

Pętla for? Jeszcze inaczej? Ale jak?

Pomożecie?

Edytowano przez SOYER
(edytowany)

Cześć!

A gdyby nie nr pliku a nazwę pliku? Co zawierają, (lub mają zawierać) te pliki?

Jeśli masz numer dnia to ustaw nazwę pliku np na

nazwa_aktualnego_pliku_dnia = "dzien_" + str(nr_dnia) + ".vav" ; // to dzień, miesiąc, rok, godzina, mnuta, sekunda analogicznie

Jeśli pliki masz sensownie ponumerowane to możesz numer uzyskać np dodając nr pierwszej pozycji zawierającej dzień do numeru dnia minus jeden.

Edytowano przez bjrk
Nowy pomysł
(edytowany)

Nie bardzo łapię...

Nazwa pliku to 01, 02,03,04...11,12,13,...256. Takiego nazewnictwa wymaga dfp.

Pliki to sample dźwiękowe, "czwarty", "szesnasty", "lipca"...

Pliki z dniami miesiąca są nazywane kolejnymi numerami, podobnie dni tygodnia, miesiące...

Np. dni tygodnia to int od "0" do "6", a pliki z samplami to numery od "55" do "61"

Podobnie reszta...

 

 

Edit:

Poprawcie mnie jeśli się mylę,ale rozwiązanie jest chyba banalne, robię 6 krótkich funkcji, dla minuty, godziny, dnia tygodnia, dnia miesiąca, miesiąca, roku. W argument funkcji daję int-a z pobranej godziny, miesiąca itd.

W funkcji tylko 

dfp.play(argument funkcji);

Ok?

Czy da się prościej?

 

Edytowano przez SOYER
(edytowany)

Czyli nazwa pliku dla 26 dnia to numer pierwszego pliku z serii (np 5) plus nr wewnątrz serii czyli 26.

jeśli  styczeń ma nr 35, luty 36 itd to numer marca to 34+3, numer maja 34+5 itd

Nie pisałem o dniach tygodnia, bo tu jeszcze zależy jak je numerujesz

czyli

nr_pliku = pierwszy_z_serii + nr_wewnątrz_serii ;
nr_pliku_dnia_tygodnia = 55 + nr_dnia_tygodnia;

To odpowiedź na Twój post, ale mi połączyło:

Pewnie tak, wtedy nr pierwszego pliku z serii masz w środku funkcji.

Edytowano przez bjrk
połaczenie postów
  • Pomogłeś! 1
18 minut temu, SOYER napisał:

Edit:

Poprawcie mnie jeśli się mylę,ale rozwiązanie jest chyba banalne, robię 6 krótkich funkcji, dla minuty, godziny, dnia tygodnia, dnia miesiąca, miesiąca, roku. W argument funkcji daję int-a z pobranej godziny, miesiąca itd.

W funkcji tylko 

dfp.play(argument funkcji);

Ok?

Czy da się prościej?

Prościej znaczy krócej, jedna funkcja z 6 argumentami...

Prościej chyba się nie da...??

Prościej zawsze jakoś się da, ale czy będzie lepiej to nie wiem.😉 Ja myślałem ewentualnie o jednej funkcji z dwoma argumentami: numer_pierwszego, numer_aktualnego. Obliczasz pozycję i wywołujesz co tam chcesz, a pierwszy parametr to stała, może predefiniowana (#define)

A na przykład dla godziny (czas w minutach) coś w rodzaju:
 

int pliki[4];
int nr = 0;

static const int godziny = 10; // arbitralnie - od numeru 10 zaczną się godziny
static int minuty = 31; // minuty od 0 do 19
static int minuty_d = 41; // dziesiątki minut od 20

hour = time / 60; // time to aktualny czas w minutach od zera do 1440
mins = time % 60;

if (hour <= 20) pliki[nr++] = godziny + hour; // dla godzin do dwudziestej
else { // składamy z dwóch, np. "dwudziesta" i "pierwsza"
	pliki[nr++] = godziny + 20;
    pliki[nr++] = godziny + (hour - 20);
}
if (mins < 10) {
  pliki[nr++] = minuty; // zero
  if (mins) pliki[nr++] = minuty + mins;
}
else if (mins < 20) {
  pliki[nr++] = minuty + mins; // dziesięć i naście
}
else {
  pliki[nr++] = minuty_d + mins/10 - 2; // dwadzieścia i dalej
  if (mins % 10) pliki[nr++] = minuty + mins % 10;
}

// w tablicy plik masz numery plików, a w nr ile ich trzeba zagrać.

Masz 21 + 20 + 5 = 46 plików na powiedzenie godziny.

Ech, kiedyś to ćwiczyłem na Symbianie 🙂

 

  • Pomogłeś! 1
20 minut temu, bjrk napisał:

nr_pliku = pierwszy_z_serii + nr_wewnątrz_serii ;

Dzięki, dobry pomysł, ale mała poprawka:

nr_pliku = (pierwszy_z_serii-1)+ nr_wewnątrz_serii ;

a właściwie

 

nr_pliku = (pierwszy_z_serii-1)+ nr_dnia_ew.tyg_ew.godzinaitd;

 

3 minuty temu, bjrk napisał:

Moim zdaniem rozwiązuje, ale dobranoc.

Rozwiązuje dopiero połączenie Twojego pomysłu z moim... 

Pomysłowi @ethanak muszę się przyjrzeć na spokojnie...

Ja to widzę tak:

int godzina=get.hour();

Int plikGodzina=79+godzina;

int miesiac=get.month();

Int plikMiesiac=123+month;

I tak jeszcze 4 razy...

gadajCzas(plikMinuta, plikGodzina,plikdzien,plikMiesiac,plikDzienTygodnia);

gadajCzas(int min, int godz, int dzień,int miesiac,int dzienT){

dfp.play(min);

delay(3000);

dfp.play(godz);

delay(3000);

Itd.itp.

}

 

 

 

Tak dokładnie jest, jeden plik na każdy dzień i miesiąc, godzin i minut nie nagrywałem jeszcze. Tutaj właśnie przyda się pomysł @ethanak bo nie będę musiał nagrywać tyłu plików.

No wiesz - ja w Nokii chciałem oszczędzić miejsca (zegarek to była część playera do audiobooków, i wolałem wsadzić na kartę jedną książkę więcej niż za dużo komunikatów). Ale po prostu chciałem pokazać jeden ze sposobów.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...