logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Jak podmienić tekst w tablicy char tekstem z bufora RAM w C?

piloszkotosz 23 Lip 2024 13:08 525 20
  • #1 21164764
    piloszkotosz
    Poziom 5  
    Witajcie.
    proszę o wytłumaczenie, jak poradzić sobie z takim problemem.

    Mam dwie tablice. Jedna umieszczona jest w RAM

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Natomiast druga w EEPROM

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Text w ramie mogę sobie modyfikować z klawiaturki i zapisywać do eeprom.

    W momencie startu programu od nowa, dane z tablicy EEPROM są wczytywane do RAM i wyświetlane na wyświetlaczu lcd. Jeśli poprzednio nastąpiło nadpisanie któregoś z tekstów w RAM i zapisanie do EEPROM, to wyświetla się ten tekst po modyfikacji rzecz jasna. Kopiowanie i odczytywanie
    pomiędzy tymi tablicami działa mi prawidłowo. Używam metody

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Tekst z tablicy ram wyświetlam

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Utknąłem w innym miejscu.

    Mam pliki tekstowe zapisane na karcie microSD. Każdy plik zawiera kilka literek tekstu, mieszczących się w linijce wyświetlacza lcd.

    Pliki te, ich zawartość wczytywane są do bufora RAM

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Następnie wyświetlam je na ekranie lcd

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Tutaj też nie ma problemu.

    Staram się tekst odczytany z karty microSD (z bufora RAM) podmienić z danymi w np. tablicy i wyświetlić już z tablicy, nie z bufora i karty

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    lub przy starcie programu, kiedy następuje odczyt z karty do bufora RAM zapisać te dane do EEPROM i potem wyświetlać już z RAM.

    Czy wymagane jest jakieś rzutowanie, czy jak do tego podejść.

    Zarówno tekst w buforze, jak i tekst w tablicy są w ramie. Tablica zaczyna się od char. char bufor_1[20]; również jest char. Czy można tekst w tablicy nadpisać tekstem z bufora ?

    Czy może mi ktoś pomóc zrozumieć, jak to ogarnąć ?. Może jest inna metoda, a ja namieszałem ?

    Dodano po 1 [godziny] 58 [minuty]:

    W sumie udało mi się temat rozwiązać przy pomocy stron:

    https://www.ibm.com/docs/pl/i/7.5?topic=functions-strcpy-copy-strings

    https://cpp0x.pl/forum/temat/?id=16370

    Pomogła funkcja "strcpy" Jest może inna metoda ?
  • #2 21165030
    oscil1
    Poziom 20  
    piloszkotosz napisał:
    Pomogła funkcja "strcpy" Jest może inna metoda ?

    Nie ma. W języku C nie można przypisywać tablic, trzeba je kopiować.

    Jeżeli tablica zawiera C string (czyli ciąg znaków zakończony zerem) to możesz użyć strcpy. Jeżeli nie to musisz użyć memcpy (jeżeli tablice nie zachodzą na siebie) albo memmove jeżeli zachodzą.

    Oczywiście musisz pamiętać aby tablice były wystarczająco duże.
  • #3 21165361
    michal.zd
    Poziom 25  
    piloszkotosz napisał:
    Pomogła funkcja "strcpy" Jest może inna metoda ?

    Jak wyżej, trzeba kopiować, ale użyj funkcji strncpy, ta jedna literka w nazwie robi wielką różnicę, mianowicie określa maksymalną ilość znaków jakie można zmieścić w twojej tablicy czyli podajesz tam rozmiar owej tablicy.
    poprzednia funkcja może spowodować że nadpisze więcej niż jest miejsca.
  • Pomocny post
    #4 21165551
    oscil1
    Poziom 20  
    michal.zd napisał:
    ale użyj funkcji strncpy
    funkcja strncpy jest nezwykle niebezpieczna. Ma jedną przykrą właściwość że nie null terminuje stringu jeżeli max ilość znaków jest mniejsza niż długość stringu.

    Zakazana w kernelu Linuxa.

    Tak przy okazji opinia Linusa:
    Zrzut ekranu z komentarzem krytykującym funkcję strncpy w C.

    Jak chcesz coś bezpiecznego to musisz niestety sobie sam napisac jak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 21165649
    piloszkotosz
    Poziom 5  
    Dziękuję Wam za chęć pomocy.

    Ja pracowałem z tablicami zarówno w ram, jak i flash, eeprom, ale nigdy nie miałem potrzeby takiej, jak w moim temacie. Również temat karty microSD dotknąłem po raz pierwszy i dla tego mam braki. Piszę okazjonalnie. Rozumiem, że są to podstawy...

    Dopytam jeszcze o szczegóły:

    1. Jeśli chcę wyświetlić np. napis Ala na wyświetlaczu. Zajmuję tylko 3 kolumny. Czy tworząc określoną tablicę muszę zarezerwować trzy bajty w buforze, czy 4 (zero na końcu) ? Czyli jeśli mam wyświetlacz 2x16 i chcę zapisać pełne 16 znaków w wierszu, to robię tablicę 16 bajtów, czy 17. Np char bufor_1[17];

    2. Druga sprawa całkiem dla mnie nowa. Jeśli utworzę plik txt na karcie microSD. Jeśli umieszczę w pliku napis Ala od początku wiersza w notatniku win, to rzecz jasna będą to tylko 3 znaki i zajmą trzy kolumny na wyświetlaczu po wczytaniu z karty na lcd. A co z resztą wolnych kolumn ?

    Chodzi mi o to, że np. utworzę napis Ala i resztę wypełnię spacjami do końca wiersza lcd (tablica w programie). Potem, jak skopiuję napis Ala z karty, to są tylko 3 litery (+0). To spacji w pliku txt chyba nie ma ? Czy kliknięcie po napisie Ala kilka razy w notatniku win utworzy również spacje ?

    Piszę to wszystko w kontekście, że kopiując napis z karty i jakoby podmieniając napisy, to one powinny chyba być identyczne, mieć tyle samo bajtów i długości. Inaczej, to się to potem gryzie.

    Mianowicie napis podmieniony z bufora z napisem w tablicy nie zawsze odpowiada oryginałowi. Albo jest jakiś śmieć w którejś kolumnie wiersza, albo część danych nie wyświetla się.

    Zmieniałem wielkości tablicy w buforze (przydział bajtów) i to pomaga, ale błądzę trochę po omacku. A chcę wiedzieć, co robię i jaki będzie rezultat.

    Gdybyście mogli mi to wyjaśnić i odpowiedzieć na wszystkie pytana (a żebym nie dopytywał ponownie) to byłbym bardzo wdzięczny.
  • Pomocny post
    #6 21165664
    michal.zd
    Poziom 25  
    oscil1 napisał:
    Tak przy okazji opinia Linusa:

    aa tiaa, ale to nie problem, zawsze po wyjściu z niej wystarczy dać : desc[DESC_SZ-1] = 0;
    i problem znika.

    Dodano po 8 [minuty]:

    >>21165649
    AD.1. zawsze, końcowe zero jest nieodłącznym elementem c stringów, więc słowo 'Ala' będzie miało cztery znaki.
    "Jeśli mam wyświetlacz 2x16 i chcę zapisać pełne 16 znaków w wierszu, to robię tablicę 16 bajtów, czy 17" - char bufor_1[17];
    a najlepiej:
    
    #define LCD_LINE_SZ 17
    char bufor_1[LCD_LINE_SZ];
    

    dzięki czemu masz od razu gotowca do użycia :
     
    strncpy( bufor_1,  twoj_text, LCD_LINE_SZ);
    bufor_1[LCD_LINE_SZ-1] = 0;      // to zabezpieczenie, że dalej na pewno nie ma textu 
    


    AD.2. to nie takie proste, ten plik może zawierać więcej bajtów aniżeli ci sie wydaje, zależnie od strony kodowej, a jak ci się trafi 'Alą' to cztery. Do sprawdzenia długości stringu masz strlen( const char *s); użyj jej i będziesz wiedział ile ma znaków. uwaga zwraca długość znaków bez zera, więc całkowity rozmiar to +1.
    "Czy kliknięcie po napisie Ala kilka razy w notatniku win utworzy również spacje ?" tak, ale po co? możesz sprawdzić ,ale funkcja print na lcd sama rozpoznaje długość textu własnie po tym '0' na końcu. Tylko nadal to nie tak, że sobie skopiujesz tekst z pliku, plik nie zawiera nigdzie '0' bo nie może. Zamiast tego są znaki końca linii i powrotu karetki ( w zapisie w c "\r\n") oraz na końcu pliku EOF (end of file) - nie pamiętam kodu. Więc kopiowanie z karty wymagać będzie od ciebie troche więcej pracy, musisz rozpoznawać te znaki i kroić tekst sam, zamieniając je na zera po wczytaniu do Ram (zawsze czytaj do ram, bo zawsze trzeba coś z tym zrobić).
    "Mianowicie napis podmieniony z bufora z napisem w tablicy nie zawsze odpowiada oryginałowi." podejrzewam własnie te kodowanie, jeśli jesteś pewien programu, musisz także wiedzieć, że jeśli dałeś 'Enter' w pliku to zawiera on 5 znaków plus EOF: znaki ALA znak 13 i 10 i dopiero EOF. najlepiej znajdź w sieci program do podglądu binarnego plików, wówczas zobaczysz co tam jest.
    Zawsze z karty odczytuj do ram wyswietl z ram, a potem to zapisz do EEProm,
    piloszkotosz napisał:
    Zmieniałem wielkości tablicy w buforze

    nie zmieniaj, od razu zarezerwuj tyle ile masz znaków w wierszu wyświetlacza, plus zero na końcu.
  • #7 21165723
    JacekCz
    Poziom 42  
    oscil1 napisał:
    Nie ma. W języku C nie można przypisywać tablic, trzeba je kopiować.


    Można
    (jak tzw tablice wiszą na wskaźnikach) , z małą gwiazdką u dołu.
    W języku C w ogóle nie ma rasowych tablic, jest obszar pamięci i arytmetyka wskaźników, w tym operator (tak!!!) tablicowy
    Nie ma sprawdzania zakresu, bo nie ma informacji o zakresie. Tak naprawdę to w ogóle nie są tablice w normalnym sensie w innych językach programowania (łącznie z bardzo starymi językami)

    oscil1 napisał:
    funkcja strncpy jest nezwykle niebezpieczna


    W C prawie wszystko jest niebezpieczne, WSZYSTKO. Język powstał już w swoich latach powstania uwsteczniając dorobek designu języków - celem była łatwość tworzenia / przenoszenia kompilatorów. Jeden wielki "billion dollar bug"


    piloszkotosz napisał:
    Mam dwie tablice. Jedna umieszczona jest w RAM


    Znacznie więcej tablic czy "tablic" , w RAM, EEPROM, flash (pamięci stałe w tym przypadku)
    Oswoić jaki kod się wykonuje przed main() 'em itd.
    Są architektury procesorowe ze wspólną przestrzenią adresową, są z rozdzieloną (np AVR)

    Masz problem, bo nie masz abstrakcji, nie masz głębszego oswojenia. Moim zdaniem duże doświadczenie w C na pececie dopiero je wyrabia, zobaczyć ne debugerze przepełnione obszary, napisywanie zmiennych. Zobaczyć jak program jest zawieszany / zabijany przez podobne błędy itd.. Dopiero ktoś taki siadając do mikro pracuje z mikro, niuanse języka ma w środku.

    Uważam, że siadanie praktyków do mikroprocesorów, bez takich podstaw zawsze będzie ułomne. Coś tam z netu pozyska w szczegółowym przypadku, ale nie da panoramicznego widzenia
  • #8 21165790
    michal.zd
    Poziom 25  
    JacekCz napisał:
    Uważam, że siadanie praktyków do mikroprocesorów, bez takich podstaw zawsze będzie ułomne.

    JacekCz napisał:
    duże doświadczenie w C na pececie dopiero je wyrabia, zobaczyć ne debugerze przepełnione obszary, napisywanie zmiennych.

    To prawda.
    Właśnie to proponuję zrobić autorowi pytań. Zacząć od napisania programu na komputerze. Oczywiście nie przetestujesz dostępu do sprzętu, ale to co teraz robisz, kopiowanie stringów łatwiej zrozumieć debugując program na komp.
    Ba, nawet zanim daną funkcjonalność napiszesz dla uC warto ją przetestować właśnie w komputerze.
  • #9 21165799
    oscil1
    Poziom 20  
    JacekCz napisał:
    Można
    (jak tzw tablice wiszą na wskaźnikach) , z małą gwiazdką u dołu.


    Ale to nie są tablice tylko wskaźniki. To jest częsty błąd początkujących - mylenie wskaźników i tablic. Wynika to pewnie z tego, że tablice jeżeli są uźyte w wyrażeniach jaki "rvalue" rozkłądają (decay) się do referencji (ale nie wskaźnika!!!!) do pierwszego swojego elementu.

    Przypisanie wskaźników tylko kopiuje referencję bez kopiowania zawartości. To zupełnie co innego.
  • #10 21165815
    JacekCz
    Poziom 42  
    oscil1 napisał:
    Przypisanie wskaźników tylko kopiuje referencję bez kopiowania zawartości. To zupełnie co innego.



    Referencja vs wartosc, jedno z głębszych zagadnień programowania, mozna o tym godzinę, ale nie o tym wątek.

    Dodano po 56 [sekundy]:

    oscil1 napisał:
    Ale to nie są tablice tylko wskaźniki.


    A czy pisałem coś znacząco innego ?
    Tablic (w moim patrzeniu) to w C nie ma
  • #11 21166126
    michal.zd
    Poziom 25  
    oscil1 napisał:
    Ale to nie są tablice tylko wskaźniki

    JacekCz napisał:
    Tablic (w moim patrzeniu) to w C nie ma


    nieprawda, język C wspiera operacje na tablicach.
    To że mozna ją zdefiniować róznorako to inna inszość, dajmy przykład:
      
    char  napis[20];           // jest tablicą dwudziestoelementową typów 'char' co nadaje się na trzymanie tekstów
    struct  MyStruct  struktury[20];    // jest tablicą dwudziestoelementową typów 'MyStruct' 
    

    i najważniejsze, odwołania po indeksie (arytmetyka wskaźników) załatwia to za nas, to jest jednoznaczne ze wsparciem języka dla struktur danych. Czy zmienna 'struktury' jest wskaźnikiem czy tablicą? to wskaźnik na tablicę, ale to zupełnie nie przeszkadza.
    To w zasadzie element czystości kodu, jak programista podejdzie do tego zagadnienia. Ja lubię struktury[index] zamiast przesuwania wskaźnika. Jest czytelniej, tak polecam pisać na początku nauki.
    Gdybyś Jacku napisał: stringów (w moim patrzeniu) to w C nie ma - byłaby to prawda.
  • #12 21166141
    piloszkotosz
    Poziom 5  
    Dziękuję Wam za chęć pomocy.

    Muszę trochę sam popracować. Na razie przyjąłem wersję bez zapisu danych do eeprom. Również zrezygnowałem z tablicy w ram, dzięki czemu nie muszę niczego kopiować-podmieniać, chociaż mi to działa. Dane na lcd wczytuję bezpośrednio z bufora, gdzie przychodzą one z karty.

    Czasami wyświetli mi się jakiś śmieć, a więc najpierw muszę dopracować prawidłowy odczyt z karty. Zrozumieć, co jest co i wówczas powrócę do poprzedniej wersji. W sumie miało to być tak, że tekst (coś w rodzaju przewijanej gazety) miał się przy uruchamianiu wczytywać z karty, ale przy okazji w razie potrzeby chciałem mieć możliwość np. przy użyciu przycisku skopiować wczytany tekst do eeprom. Dzięki temu mogę wyjąć kartę i przy następnym włączeniu urządzenia dane zostaną pobrane do ram i wyświetlone. Karta byłaby potrzebna tylko przy zmianie stałych tekstowych co jakiś czas.

    Tematu nie zamykam, ponieważ może jeszcze będę chciał coś przedyskutować. Jeszcze raz dzięki.
  • #13 21166212
    simw
    Poziom 27  
    oscil1 napisał:
    W języku C nie można przypisywać tablic, trzeba je kopiować.

    Można za pomocą prostej sztuczki. Należy je opakować w strukturę, potem można przypisywać strukturę do struktury, a kopiowaniem "zajmie kompilator"
    Tylko pozostaje pytanie, że jeśli można to czy powinno się?
    Druga sprawa, jeśli można przypisywać struktury, to czemu nie można tablic, skoro to są po prostu fragmenty pamięci.
  • #14 21166233
    JacekCz
    Poziom 42  
    michal.zd napisał:
    JacekCz"]Tablic (w moim patrzeniu) to w C nie ma


    nieprawda, język C wspiera operacje na tablicach.[/quote]

    Wiesz, jestem skłonny sie zgodzić. Nie ma "rasowych" tablic ale są operacje na tablicach *)
    Wszystko przez relatywnie silny, a na pewno decydujaco ważny dla jezyka operator tablicowy.

    Mało która książka do C wyrażnie to nazywa (ale są co tak), wyrażnie kumają abstrakcję "operatora tablicowego" ci, ktorzy aktywnie to kodowali w C++, a zwlkaszcza w C# (tam typowo nazwe na indekser)


    *) czym @michal.zd dla mnie rasowa tablica ? Obiekt, który ma świadomość swojego rozmiaru, w konsekwencji podany jako parametr może być autonomicznie obsłużony przez funkcję 1..N (bez dodatkowej wiedzy o rozmiarach)
    Czy kod musi posiadać automatyczne zabezpieczenie o przejechaniu tablicy ? Lepiej żeby tak, ale nie jest to immanentna część definicji "rasowej tablicy".
    W praktyce, każdy język ktory zawiera ideę "tablicy z samoświadomoscią rozmiaru" wczesniej czy pózniej dorobi sie wersji biblioteki (np "debug") która przypilnuje

    Nie zmienię zdania, C posiada arytmetykę tablicową, posiada zdolność zarezerowania obszaru N sztuk (ale obszar to nie jest moja tablica) ale nie posiada tablic (tak, lekkie oszustwo propagandowe). Problem, że programista jednego języka nie ma dystynkcji

    Dodano po 5 [minuty]:

    @michal_zd

    Przychodzi bajt C do psychoanalityka
    Doktor pyta: i co pan widzi?
    Bajt: z prawej jakiś bajt, z lewej jakiś bajt, i nic innego nie stwierdzę, chyba k... jestem "tablicą C"

    Dodano po 3 [minuty]:

    [quote="simw napisał:21166212Można za pomocą prostej sztuczki. Należy je opakować w strukturę, potem można przypisywać strukturę do struktury


    Tak, o ile C ma dziadowskie / nie ma tablic, to ma relatywnie silne struktury (nie "odwiecznie", szczególnie od wersji ANSI lata 1980/90).
    Zresztą struktury C nie szokująco silniejsze, niz w najlepszych macroaseblerach
  • #15 21166312
    michal.zd
    Poziom 25  
    JacekCz napisał:
    Przychodzi bajt C do psychoanalityka
    Doktor pyta: i co pan widzi?
    Bajt: z prawej jakiś bajt, z lewej jakiś bajt, i nic innego nie stwierdzę, chyba k... jestem "tablicą C"


    Akurat słaby przykład. Biorąc pod uwagę tablicę struktur, element tablicy "wie" ze jest strukturą, no i że kolejny też nim jest.
    Problem leży w tym, że ostatni nie wie, że jest ostatni i myśli że jest otoczony tym samym typem co on
  • #16 21166365
    piloszkotosz
    Poziom 5  
    A więc napisałem drugi program tylko do działania karty i obsługi wyświetlacza lcd. Po to, a żeby krok po kroku sprawdzać, co się dzieje.

    W poprzednim trochę tego jest i są wyświetlane różne informacje w różnych częściach lcd. Pomyślałem sobie, że tu może również tkwić problem. W tamtej wersji tekst z karty (bufora) był wyświetlany od 3 kolumny, licząc od lewej.
    Pierwsze dwie kolumny (0,1) użyte do wyświetlania innych informacji z ram programu.

    Teraz wyświetlam tylko tekst z karty od pierwszego segmentu do ostatniego, czyli 20 bajtów +1 dla zera... Nie ma najmniejszych problemów, duszków, czy krzaczków. Próbowałem wyświetlić więcej znaków, niż zawiera wiersz i wielkość bufora. Również nie ma problemu poza tym oczywiście, że tych dodatkowych nie widać, ale te od 1-19 są normalnie widoczne.

    Co widać na fotkach niżej, ja dla każdej linii utworzyłem osobny bufor:

    char bufor_1(21); char bufor_2(21); itd.... Każdy wiersz-tekst jest osobnym plikiem. Tak było mi łatwiej zacząć z tymi tekstami. Gdybym użył jednego bufora np. char bufor(128); i jeden plik tekstowy, a w środku np. 12 linii tekstu jedna pod drugą, to wówczas doszły by kolejne znaki typu enter. itd..... Dodatkowo w programie nie używam funkcji print, tylko np. lcd_string... Czy tak normalnie można ? Czy ta metoda, to kosmos ?

    Zrzut ekranu z widokiem eksploratora plików pokazujący zawartość dysku wymiennego.


    Zrzut ekranu Notatnika z wyświetlonym tekstem


    Wyświetlacz LCD pokazujący cztery linie tekstu z numeracją.
  • #17 21166632
    JacekCz
    Poziom 42  
    michal.zd napisał:
    Problem leży w tym, że ostatni nie wie, że jest ostatni i myśli że jest otoczony tym samym typem co on


    Nie wie o sobie też ten pierwszy, nic o sobie nie wie (tab+3)[2]. Jest tylko jakiś obszar bajtów, nie tkwi w nim żadna wiedza czym są.
    Arytmetyka wskaźników to do pseudohackerstwa wydaje się coś super, ale rzczywystosc jest odwrotna: do niczego nie jest to potrzebne *) , żaden jezyk tego nie potzrebuje i nie jets przez to kaleki

    *) BYŁO potrzebne, w latach 1970 "zaprojektujmy jezyk tak, aby koszmarnie prostacki kompilator wyprodukował kod" (róbmy robote za kompilator), tak samo domniemanie każdego niezerowego wyrażenia dowolnego typu jako bool true (aby w 1970 oszczędzić jeden rozkaz maszynowy, porażka), przestało mieć sens w latach 1980, każdy kompilator np pascala, czy C if(x!=0) generował to wydajnie.

    Dodano po 4 [minuty]:

    piloszkotosz napisał:
    Czy tak normalnie można ? Czy ta metoda, to kosmos ?



    Nie umiem ci dokładnie pomóc.
    Umiem mgliście wskazać gdzie tkwi problem: w braku użycia abstrakcji, z mniejszych budowania większego, potem używania tego jako "czarnej skrzynki". Będziesz mial jak wielki spychacz drogowy zawsze PRZED SOBĄ decyzje wysokopoziomowe (strategiczne, projektowe) i detale implementacje, i nigdy nie zdemontujesz takiego myślenia
    Powinno być:
    "teraz piszę fajna uniwersalną wydajną funkcję niskopoziomową"
    "teraz projektuję wysokopoziomowy pomysł na oprogramowanie"
  • #18 21167210
    oscil1
    Poziom 20  
    JacekCz napisał:
    Problem, że programista jednego języka nie ma dystynkcji

    JacekCz napisał:
    Arytmetyka wskaźników to do pseudohackerstwa wydaje się coś super, ale rzczywystosc jest odwrotna: do niczego nie jest to potrzebne *) , żaden jezyk tego nie potzrebuje i nie jets przez to kaleki


    Bez tego "hackerstwa" nie mógłbyś programować żadnego sprzętu.
    Abyś mógł w C# mógł się cieszyć indexerami to pod maską mnóstwo wskaźników jest w użyciu.



    Wszystko ma swoje zastosowanie - C jakoś przetrwał (i ma się dobrze) 50 lat, za to widziałem wiele efemeryd, które miały być C killerem - ale nikt o nich nie pamięta.
  • #19 21167251
    JacekCz
    Poziom 42  
    oscil1 napisał:
    Bez tego "hackerstwa" nie mógłbyś programować żadnego sprzętu.


    1. W pełni da się programować sprzęt w języku który nie ma tak dalece posuniętej (przesadzonej / niebezpiecznej) arytmetyki wskaźników. Np w pascalu (dialekcie pascala)
    Co więcej, core "programowania sprzętu" C jest w ekstenszynach, a nie w samym języku. W C nie masz portu, interruptu, rejestrów, wstawek asm.

    2. O ile jest to "jakąś" prawdą o stricte niskopoziomowym systemowym, to zupełnie bez sensu dla czegoś już nieco wyższego poziomu (apliakcji/ złożonych wieloletnich systemów)
    Dla mnie "a billion dollar bug"

    oscil1 napisał:
    C jakoś przetrwał (i ma się dobrze) 50 lat, za to widziałem wiele efemeryd, które miały być C killerem - ale nikt o nich nie pamięta.


    3. Nie zawsze zwycięstwo rynkowe jest wg kategorii merytorycznych
  • #20 21167367
    michal.zd
    Poziom 25  
    Pozostaje mi nic innego jak zgodzić się z wami obami ;) (mial być rym, ale słabo wyszło, wiem)
    Dalszej dyskusji w tym temacie prowadzić tu nie warto.
  • #21 21173860
    piloszkotosz
    Poziom 5  
    Tekst zawarty w postach zawierał rozwiązanie problemu.

Podsumowanie tematu

W dyskusji poruszono problem podmiany tekstu w tablicy char w języku C, szczególnie w kontekście pracy z pamięcią RAM i EEPROM. Użytkownik zdefiniował dwie tablice w RAM oraz dwie w EEPROM, a także opisał proces wczytywania danych z EEPROM do RAM oraz ich wyświetlania na LCD. Uczestnicy dyskusji podkreślili, że w C nie można przypisywać tablic, a zamiast tego należy używać funkcji kopiujących, takich jak strcpy, strncpy, memcpy lub memmove. Zwrócono uwagę na bezpieczeństwo użycia strncpy oraz na konieczność dodawania znaku null na końcu ciągu. Użytkownik zadał dodatkowe pytania dotyczące rezerwacji pamięci dla ciągów znaków oraz obsługi plików tekstowych na karcie microSD. W odpowiedziach podano również sugestie dotyczące testowania kodu na komputerze przed implementacją na mikrokontrolerach.
Podsumowanie wygenerowane przez model językowy.
REKLAMA