Funkcja zawierajaca tablice - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Funkcja zawierajaca tablice (/watek-funkcja-zawierajaca-tablice) Strony:
1
2
|
Funkcja zawierajaca tablice - StaCh - 26-07-2017 Poniewaz jak pisalem chce zbudowac generator na bazie Ad9850 sterowany Arduino Nano i chce aby byly generowane rozne zestawy czestotliwosci. Zbudowalem kilka programow zawierajacych rozne zestawy ale wszystkie one roznia sie wylacznie parametrami typu: nazwa zestawu, tablica czestotliwosci, ilosc czestotliwosci w tablicy i ewentualnie czas trwania emisji pojedynczej czestotliwosci. Postanowilem po zapoznaniu sie z dokumentacja zbudowac funkcje ktora bedzie uruchamiala i sterowala AD9850 oraz wyswietlacz LCD 16x2 na podstawie dostarczonych informacji o: nazwie zestawu, ilosci czestotliwosci w zestawie, oraz tablicy czestotliwosci do wygenerowania w danym zestawie. Po wielu probach udalo mi sie wykonac program ktory przechodzi test kompilacji poprawnie ale niestety nie dziala poprawnie bowiem dziala tylko przekazanie nazwy do funkcji i ilosci czestotliwosci w zestawie natomiast tablica czestotliwosci nie jest odczytywana w zwiazku z tym generator generuje przypadkowe czestotliwosci. Ponizej kod programu "Funkcja1": Kod: //include LCD library Uklad z funkcja ma umozliwic mi zbudowanie menu wyboru zestawu do uruchomienia przy pomocy switch/case bo w kazdym case bedzie inny zestaw parametrow do uruchomienia tej samej funkcji. Czy ktos moze mi wskazac blad ktory zrobilem? Program w tej postaci jest weryfikowany poprawnie ale zestaw, tablica czestotliwosc podany w nawiasie nie jest przetwarzany przez funkcje. Prosze o pomoc w rozwiazaniu problemu. RE: Funkcja zawierajaca tablice - Robson Kerman - 26-07-2017 W ten sposób nie przekazuje się wartości tablicy do funkcji. Najpierw tworzysz tablicę, tak jak masz w komentarzu unsigned long freq[] = {60, 820, 2500, 20000, 65000, 207460, 479930, 527000, 749000, 986220, 110, 240, 620, 850, 118330, 209180, 321000, 544100, 631170, 705000, 350, 12800, 88500, 125680, 240000, 470000, 592500, 625230, 723010, 70, 570, 87500, 175160, 322060, 476500, 667000, 742000, 985670}; potem przekazujesz tablicę do funkcji w ten sposób: wykonaj (freq); (między innymi, bo możesz przekazać wskaźnik, co zresztą jest bardziejsze) W nagłówku funkcji nie musisz podawać ilości elementów tablicy. void wykonaj(string Name, int n, unsigned long freq[]); Tak więc ostatecznie będzie coś w ten deseń: wykonaj("Tinitus", 38, freq); RE: Funkcja zawierajaca tablice - StaCh - 26-07-2017 (26-07-2017, 12:46)Robson Kerman napisał(a): W ten sposób nie przekazuje się wartości tablicy do funkcji.Czyli wynika z tego, ze kazdy "case numer" musi zawierac pelna definicje tablicy wraz z zawartoscia (bo nie moze ona byc globalna) oraz nazwe zestawu i liczbe czestotliwosci w zestawie oraz wywolanie funkcji? Zawartosc tablicy przekazuje sie przez jej zdefiniowana nazwe. Zaraz sprobuje to przetestowac. Dziekuje! RE: Funkcja zawierajaca tablice - Robson Kerman - 26-07-2017 Case nie musi zawierać tablicy, może ją pobierać z funkcji, albo z pliku, czy co tam chcesz. Oczywiście tablice jak najbardziej powinny być lokalne, globalne to ZUO!!!. Przekazując tablicę do funkcji, udostępniasz jej oryginał i pozwalasz ją modyfikować, modyfikacja jest globalna, ale funkcja sama nie zmodyfikuje Ci zmiennej nie przekazanej, co jest zajebistością tego języka. RE: Funkcja zawierajaca tablice - StaCh - 28-07-2017 (26-07-2017, 15:52)Robson Kerman napisał(a): Case nie musi zawierać tablicy, może ją pobierać z funkcji, albo z pliku, czy co tam chcesz. Dziekuje za pomoc! Program dziala. Pewnie docelowo bede musial pobierac dane z pliku na SDcard bo 2k pamieci pozwala zdefiniowac nieco ponad 300 czestotliwosci w tablicach i wtedy brakuje pamieci do dzialania. Obecnie po skrotach w 4 tablicach mam zajete 61% pamieci RAM. W pamieci programu jest jeszcze sporo miejsca na obsluge modulu SD. RE: Funkcja zawierajaca tablice - Robson Kerman - 29-07-2017 Wartości tablic na SD to świetny pomysł, ponieważ możesz sobie to modyfikować na PC, dokładać nowe itp. Gdy miałem podobny problem (2500 tablic), to użyłem zamiast Arduino STM32 wraz z STlink, bo tam flash pokazuje się w komputerze jako dysk wymienny i możesz go wykorzystać zamiast SD. RE: Funkcja zawierajaca tablice - StaCh - 31-07-2017 Musze tylko opanowac poslugiwanie sie karta SD i manipulacja danymi. I to wcale nie musi byc karta o wielkiej pojemnosci. Dzieki. P.S. A moze lepiej uzyc karty z pamiecia EEPROM 256kB? Czy mozna ja wykorzystac jako magazyn tablic? RE: Funkcja zawierajaca tablice - StaCh - 09-09-2017 Wracam do tematu bo hardware juz gotowe nie bez problemow o czym w innych watkach. Chodzi o przekazanie _zawartosci_ pliku o okreslonej nazwie odczytanego z karty do tablicy "freq[]". Utknalem bo mam problemy z jezykiem programowania, ktorego nie znam. Funkcja wyglada nastepujaco: void odczytpliku(char Name[10], unsigned long freq[]) { File Preset; SD.begin(10); //pin 10 to CS karty Preset = SD.open(Name,FILE_READ); Serial.println(Name); // dla kontroli lcd.print(Name); while (Preset.available()) //wykonuj pętlę dopókiwszystkie dane { //nie zostaną zczytane Serial.write(Preset.read()); //wypisz zawartość pliku // freq = Preset.read(); //tutaj jest problem bo pomimo iz funcja sie kompiluje to odczyt jest skaszaniony } Preset.close(); } Problem jest jak przekazac odczytana zawartosc pliku o okreslonej nazwie do tablicy nazwanej " freq[]" aby jej zawartosc mozna bylo przekazac potem do funkcji wykonaj, ktora zajmuje sie kolejnym generowaniem czestotliwosci z listy zawartej w tablicy. Funkcja w tej postaci z linia wykomentowana daje na monitorze portu szeregowego nastepujacy wynik: Eyes {30,60,100,110,130,170,230,320,350,410, 500,700,730,800,850,950,2970,5170,5430,5500, 7500,8000,12690,15190,15870,17500,30000,32500,37500,42500, 47500,77500,87500,90000,93500,122060,157500,162120,175000,232030, 236420,312330,322530,326500,397500,434510,478500,526070,532410,534250, 653690,655200,667000,679930,722010,750000,753070,922530,927100} Jest to wynik prawidlowy bowiem zawiera nazwe pliku oraz w nawiasach tablice zawierajaca zestaw czestotliwosci do wygenerowania przez inna funkcje. Problemem dla mnie jest: jak zrobic aby zestaw ujety w nawiasach zostal przekazany do tablicy freq[] lacznie z nawiasami? Jesli uda mi sie to rozwiazac to bede mial jeszcze jedno zagadnienie do rozwiazania: jak przekazac do tablicy listing nazw plikow z karty? A moze po prostu utworzyc na karcie plik Katalog i w nim przygotowac wykaz plikow do odczytu i podstawienia do tablicy, ktora bedzie sluzyla do przegladania i wyboru pliku do odczytu i wygenerowania zestawu przez AD9850? Mam nadzieje ze jednak ktos sie odezwie zanim sam znajde rozwiazanie metoda prob i bledow :-( RE: Funkcja zawierajaca tablice - StaCh - 09-09-2017 Mam jeszcze jeden problem "programistyczny". Jak policzyc w pliku odczytanym z karty ilosc czestotliwosci do wygenerowania? Jest to potrzebne przy funkcji wykonaj bowiem na wyswietlaczu pokazuje sie informacja o nazwie zestawu czestotliwosci, aktualnie generowanej czestotliwosci i ilosci czestotliwosci pozostalych do wygenerowania. Ta ostatnia informacja pozwala ocenic ile czasu jeszcze bedzie trwalo generowanie zestawu bowiem kazda czestotliwosc jest generowana przez 3 minuty. Jesli nie znajde sposobu to bede sie musial obyc bez tej informacji i inaczej generowac (inna funkcja) kolejne czestotliwosci z zestawu. Odnosnie liczenia nasuwa sie pomysl policzenia przecinkow w tablicy :-) W zalaczeniu widok wyswietlacza podczas generowania zestawu. RE: Funkcja zawierajaca tablice - namok - 10-09-2017 Przekazywanie dużych zmiennych przez wartość to zły pomysł bo odkładają się na stosie co trwa i zajmuje pamięć. Przekazuj wskaźnik do tablicy a nie tablicę. |