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

dobrze że chociaż w tym języku co potrzeba a nie po łacinie bo to by oznaczało że zaraz wyzionie ducha.

QuadMan napisał(a):
Witam,
skoro mądrzy ludzie nie chcą niczego napisać, to może ja spróbuję

. Przede wszystkim, moim zdaniem, wskaźniki na tablice ( mam na myśli konstrukcje typu: (*ptr_to_tab)[TIMER_STATES] ) wyglądają słabo...

. 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ś ....

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ż

A to efekt szukania rozwiązania w pewnym momencie (chyba akt desperacji) zacząłem szukać problemu w przekazywaniu wartości z "pgm_read_byte"

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

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

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 ..."

mirekk36 napisał(a):
i teraz na koniec uważaj

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

Składnia: [ Pobierz ] [ Ukryj ]
język c
for(;;) /* FORever

*/
{
UART0_Sstring_P( Book1[2] );
_delay_ms(1000);
}
GeSHi
i co ?

jak ci się to widzi ?

... 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

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.