Przekazywanie danych między tablicami

0

Witam,

mam konkretny problem już opowiadam co i jak:

Mam parser który analizuje stringa i zamienia poszczególne znaki w stringu i dodaje je jako kolejne elementy tablicy np:

string "A,Bcd'" na {A3,B4,C5,D6}

Mam kawałek kodu który "gra" Beep'em poszczególne nuty oto kod tych dwóch elementów:

Parser:

 string mojstring;
            mojstring = dataGridView1.CurrentCell.ToString();
            int l = mojstring.Length;
            int i = 0;
            int j = 1;
            int k = 0;
            string[] tab;
            tab = new string[20];
            bool spr;
            while (i <= l - 1)
            {
                string x = mojstring.Substring(i, 1);
                char z = Convert.ToChar(x);
                if (i < l - 1)
                {
                    String y = mojstring.Substring(i + 1, 1);


                    if (spr = string.Compare(y, ",") == 0)
                    {
                        x = x + "3";
                        i = i + 1;
                    }
                    if (spr = string.Compare(y, "'") == 0)
                    {
                        x = x + "6";
                        i = i + 1;

                    }
                    if ((char.IsLower(z) == true) && (spr = string.Compare(y, ",") != 0) && (spr = string.Compare(y, "'") != 0))
                    {
                        x = z + "5";
                    }
                    if ((char.IsUpper(z) == true) && (spr = string.Compare(y, ",") != 0) && (spr = string.Compare(y, "'") != 0))
                    {
                        x = z + "4";
                    }
                }

                tab[j] = x;
                j = j + 1;
                i++;
            }

element "grający":

 //ten element Note jest w akcji wciskania guzika do grania  
            Note[] test =   
            {
                new Note(Tone.C2,   Dlugosc.CALA),
                new Note(Tone.C6,   Dlugosc.CALA)
            };
            Play(test);
        

         protected static void Play(Note[] tune)
        {
            foreach (Note n in tune)
            {
                Console.Beep((int)n.NoteTone, (int)n.NoteDuration);
            }
        } 

dodam iż Tone i dlugosc musza byc liczbami dlatego w innym miejscu kodu są one wylistowane żeby można było pobierać konkretne wartości:

protected enum Tone
        {
            REST = 0,
            C2  =   65,
            Cis2    =   69,
            D2  =   73,
            Dis2    =   77,
            E2  =   82,
            F2  =   87
//i tak dalej
        }
 protected enum Dlugosc
        {
            CALA = 1600,
            POLNUTA = CALA / 2,
            CWIERCNUTA = POLNUTA / 2,
            OSEMKA = CWIERCNUTA / 2,
            SZESNASTKA = OSEMKA / 2,
        } 

Jak zrobić aby tablica Note[] test która zostanie "zagrana" zawierała kolejne elementy tablicy parsera (tylko wartość nuty, długość dla każdej nuty jest taka sama!), a nie tak jak jest do tej pory wpisane na sztywno odołania do listy częstotliwości ?

wiem, zagmatwane na maksa :/

help!

0

wypełniaj ją w parserze, zamiast jakiegoś dziwnego tab?

string musicString = dataGridView1.CurrentCell.ToString();
Note[] noteArray = Parsuj(musicString);

wewnątrz Parsuj() nie powinno być odwołania do kontrolek formy (co jeśli zachce ci się ładować muzyczkę z innego źródła? nie będziesz musiał parsera przerabiać).

0
Azarien napisał(a)

wypełniaj ją w parserze, zamiast jakiegoś dziwnego tab?

string musicString = dataGridView1.CurrentCell.ToString();
Note[] noteArray = Parsuj(musicString);

wewnątrz Parsuj() nie powinno być odwołania do kontrolek formy (co jeśli zachce ci się ładować muzyczkę z innego źródła? nie będziesz musiał parsera przerabiać).

ok to ma sens, ale chyba nie do końca o to mi chodziło, bo nadal Parsuj(musicString) zwróci mi ze stringa "ab,cd" poszczególne elementy tablicy: {A1,B2,C1,D1}

struktura Note wygląda tak:

protected struct Note
        {
            Tone toneVal;
            Dlugosc durVal;



            public Note(Tone frequency, Dlugosc time)
            {
                toneVal = frequency;
                durVal = time;
            }

            public Tone NoteTone
            {
                get
                {
                    return toneVal;
                }
            }
            public Dlugosc NoteDuration
            {
                get
                {
                    return durVal;
                }
            }

        } 

więc mi chodziłoby aby tak zmienić program aby efektem finalnym było coś takiego (chodzi tylko o nuty czyli Tone, dlugość pozostaje stała):

 Note[] test =   
            {
                new Note(Tone.C2,   Dlugosc.CALA), // Tak wygląda linijka odwołania do konkretnej częstotliwości, liczby zapisanej w "Tone", wpisana na sztywno
                new Note(Tone.tab[1],   Dlugosc.CALA) // To chciałbym zrealizować czyli aby "C2" czy inna nuta która jest wynikiem parsowania została przekazana tutaj
            };

chyba że tak się nie da, a parsowanie lub elementy z parsera muszą zostać najpierw wykorzystane gdzie indziej w celu przerobienia ich na liczby?

0

Parsuj(musicString) zwróci mi ze stringa "ab,cd" poszczególne elementy tablicy: {A1,B2,C1,D1}

to przerób tak, żeby zwracało Nuty.

// wewnątrz parsera
Note[] tab = new Note[20]; // ten rozmiar raczej nie powinien być na sztywno, tylko odpowiadać rzeczywistej ilości elementów
...
tab[j] = new Note(...);
...
return tab;

albo stwórz drugą funkcję, która pobiera dane zwracane z twojego parsera i tworzyło właściwą tablicę. ale to chyba niepotrzebna robota.

1 użytkowników online, w tym zalogowanych: 0, gości: 1