Z początku się wystraszyłem tyle dostałem od Was długich podpowiedzi ze przez chwile skojarzyło mi sie to z wynikami badań w trakcie choroby. im bardziej chory pacjent tym więcej ma w karcie napisane
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
dobrze że chociaż w tym języku co potrzeba a nie po łacinie bo to by oznaczało że zaraz wyzionie ducha.
![Szczęśliwy :)](https://forum.atnel.pl/images/smilies/icon_e_smile.gif)
QuadMan napisał(a):
Witam,
skoro mądrzy ludzie nie chcą niczego napisać, to może ja spróbuję
![Puszcza oko ;-)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
. Przede wszystkim, moim zdaniem, wskaźniki na tablice ( mam na myśli konstrukcje typu: (*ptr_to_tab)[TIMER_STATES] ) wyglądają słabo...
![Puszcza oko ;-)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
. Bo dla większej ilości wymiarów to już w ogóle masakra. Wystarczy zapamiętać fakt, że tablice
wielowymiarowe zapamiętywane są w pamięci wierszami i tyle, wtedy to staje się proste dla tablicy o dowolnym rozmiarze. Jeśli na przykład, dla tablicy dwuwymiarowej potrzebujesz "dobrać się" do elementu (2,2) to jego adres będzie: 2+ 2*dlugosc_wiersza + adres poczatkowy. W Twoim przypadku to będzie tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To w sumie wszystko, dla tablicy o dowolnym rozmiarze będzie tak samo. Ale uwaga: takie podejście jest potrzebne jedynie, jeśli chcesz przekazać adres tablicy jako parametr do funkcji, jeśli masz tablicę wewnątrz jakiejś tam funkcji, to możesz operować normalnie indeksami. To w sumie oczywiste, ale wolałem wspomnieć, by nie było nieporozumień. Jeśli czegoś nie rozumiesz to pisz.
Pozdrawiam, QuadMan.
O Kurza twarz ! niech mnie dzwi ścisną jak Ty mądry nie jesteś !! coś nad czym siedziałem 3 dni (zliczyłem ilość przejrzanych stron: 543) z rezultatem zerowym a Tobie to zajęło może z 3hodziny bo tyle minęło czasu od wystawienia pytania na forum. Bardzo Ci dziękuje. Zadam pytanie skąd wiedziałeś że tak ma to wyglądać ? Gdzie o tym mogę poczytać ?
mirekk36 napisał(a):
Przede wszystkim to źle definiujesz tablice stringów w pamięci flash, bo jak już to tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
const char tb1[] PROGMEM = "ZBRODNIA.XXw";
const char tb2[] PROGMEM = "PAN.TADEUSZ";
const char tb3[] PROGMEM = "AVR.STUFF";
const char tb4[] PROGMEM = "PRZYKŁAD";
const char tb5[] PROGMEM = "MK.PASJA";
const char * const Book1 [] PROGMEM = {
tb1,
tb2,
tb3,
tb4,
tb5,
};
GeSHi
Rozumiem że mój sposób kategorycznie nie może być ? Widzę że mamy zaletę taką że ilość miejsca w flash jest dostosowywana za każdym razem do długości łańcucha + 0. Może w tym miejscu opisze jaki jest zamierzony cel całego programu w takich tablicach jak widzisz Mirku mieści się zbiór nazw książek program ma w łatwy sposób poprzez wpisanie komendy po RS (np nazwy książki) odnaleźć ją w tablicy i podać jej miejsce na regale.
to oczywiście program w wydaniu "abstrakcja 2016" jak sam podkreśliłeś , póki co mogę powiedzieć że znalazłem 1000 dróg którymi nie da się pójść.
Na pewno są inne drogi na konstrukcje tego programu pozostaje pytanie która droga jest dobra ?
mirekk36 napisał(a):
Radzę ci hmmm może lepiej powiedzieć POLECAM CI, postaraj się zastosować do porad odnośnie stosowania odpowiednich typów to będziesz miał po stokroć mniej problemów - ten twój kod albo ci się kompilował z tysiącem warningów albo może korzystasz z kociego Atmel Studio z wyłączonymi warningami i nawet ich nie widziałeś ....
![Smutny :(](https://forum.atnel.pl/images/smilies/icon_e_sad.gif)
heh tak to był , a nawet jest Atmel Studio i owszem masz racje był jeden alert tyczący się właśnie przekazywania tego przedziwnego wskaźnika do tablicy.
Co do typów tak oświeciło mnie w momencie gdy o tym przypomniałeś. Mój błąd.
mirekk36 napisał(a):
Powiedz mi - tzn ok - jeśli to próbujesz robić TYLKO PO TO ŻEBY "poczuć wskaźniki" to ok jeszcze rozumiem - uczysz się - chociaż w rozwiązaniach idziesz totalnie złą drogą .... Jeśli chcesz napisać kawałek kodu który ci potrzebny to
hmm no wiesz generalnie jak "próbujesz" coś robić to znaczy że z reguły nie czujesz gruntu pod nogami, Logika podpowiada -> Move forward ale też jak widać jeden wcale nie umyślny błąd na początku i później rodzi sie cała seria reperkusji z nim związana.
mirekk36 napisał(a):
1. powiedz po jaki gwint wewnątrz tej funkcji kopiujesz znak po znaku z przekazanego stringu do bufora tworzonego wewnątrz funkcji (brrrr na stosie - fuuuj) ... ???? Zamiast wprost wyświetlić ten string z pamięci Flash a masz na to przecież KUPĘ przykładów w Bluebooku a widzę, że go masz przecież
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
A to efekt szukania rozwiązania w pewnym momencie (chyba akt desperacji) zacząłem szukać problemu w przekazywaniu wartości z "pgm_read_byte"
![Smutny :(](https://forum.atnel.pl/images/smilies/icon_e_sad.gif)
mirekk36 napisał(a):
2. ok jak już się uparłeś i tworzysz ten bufor - to znowu - nie doczytałeś a OPISUJĘ to pięknie (że tak nieskromnie powiem) w Bluebooku - jak działają funkcje - co się gdzie tworzy i jak ....
twój buffer[] to zmienna lokalna/automatyczna - a więc? Co będą zawierały jej elementy po skreowaniu ? UWAGA! będą zawierały SIECZKARNIĘ - a na pewno nie same zera !!! Więc jeśli wkleisz znak po znaku nawet z tej nieszczęsnej tablicy przez salto mortale jakie próbujesz zrobić - to nie wkopiujesz ZERA przecież !!! a to co spowoduje ? Że nawet jeśli poprawnie uda ci się zapisać to salto mortale na wskaźnikach - to funkcja wysyłająca string będzie śmigała aż napotka zero w tej zmiennej buffer a że nie napotka
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
to będzie rąbała dalej po pamięci aż gdzieś tam napotka w końcu jakieś zero - zaś ty nawet nie zauważysz - nie zdążysz zauważyć że na początku miałeś napis ale później poleciały śmieci z pamięci i napis został przez nie zamieciony ... rozumiesz ?
Mirku możesz sie zaśmiać ale uwierz że o tym pamiętałem wiesz gdzie powstał dygres ? w momencie gdy stwierdziłem że jeśli wiem że mam odczytać np 10 bajtów to wypełniam je 10 odczytanymi bajtami. Zero śmieci po prostu czyste dane
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
czasem wolał bym dostać od kompilatora taki tekst który pamiętam z jednego z poradników video: "FIGA Z MAKIEM POWIEDZIAŁ KOMPILATOR , NIE SKOMPILUJE CI TEGO ..."
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
mirekk36 napisał(a):
i teraz na koniec uważaj
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
bo ci się to może przyda ... jeśli twoim celem było wysyłanie dowolnego stringa z tej twojej tablicy stringów, to jeśli ją zorganizujesz tak jak ci pokazałem wyżej jako tablicę wskaźników to możesz W OGÓLE pozbyć się tej twojej funkcji i zamiast niej w pętli głównej zrobić tak
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
Składnia: [ Pobierz ] [ Ukryj ]
język c
for(;;) /* FORever
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
*/
{
UART0_Sstring_P( Book1[2] );
_delay_ms(1000);
}
GeSHi
i co ?
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
jak ci się to widzi ?
![Puszcza oko ;)](https://forum.atnel.pl/images/smilies/icon_e_wink.gif)
... po co to przekazywanie w oddzielnych argumentach indeksu, albo już w ogóle niepotrzebnie długości stringa ?
Tylko zauważ że dodałem postfix _P do twojej funkcji czyli powinna ona być przerobiona na wysyłanie znaków ale z pamięci flash
Pięknie
![Bardzo szczęśliwy :D](https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif)
muszę cześć programu przerobić bo nie wiedziałem że da się to zrobić jednowymiarowo to co ja robiłem 2wymiarowo.
PS. Skoro mi było ciężko znaleźć coś o tym problemie może to właśnie jest dobry temat na kolejny video poradnik na temat wskaźników ?
Pozdrawiam i Bardzo WAM dziękuje.