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

[ATmega8][TWI][C] - przekazanie tablicy do funkcji

P4wlut3K 14 Lis 2011 22:28 1577 11
  • #1 10139725
    P4wlut3K
    Poziom 11  
    Witam. Łącze ATmega8 z wyświetlaczem po TWI/I2C. Transmisja działa ale mam problem z napisaniem funkcji która ułatwi mi wypisywanie na ekran.

    wywołanie w main:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    funkcja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Błędów nie ma ale wyświetla mi jakieś szlaczki. Jeśli jednak odkomentuję fragment kodu z ciała funkcji to wszystko wyświetla się poprawnie, wiec wydaje mi się, że mam złe wywołanie. Jak je zmienić by było poprawne ?
  • #2 10139916
    tmf
    VIP Zasłużony dla elektroda
    Zastanów się - skąd kompilator ma wiedzieć jaki rozmiar ma zdefiniowana tablica znaki? Definiujesz ją jako typ niekompletny i kompilator tego po prostu wiedzieć nie może. Musisz więc przekazywać oprócz tablicy znaki[] także jej rozmiar definiowany przy wywołaniu funkcji. Możesz też przyjąć, że tablica kończy się znakiem specjalnym, np. NULL i robić pętlę aż do natrafienia na taki znak.
    A sieczkę dostajesz bo w cudzysłowiu definiujesz literał, a nie kolejne elementy tablicy.
  • #3 10139961
    Fredy
    Poziom 27  
    Wypełnij tablicę znaków którą chcesz wysłać, zakończ ją zerem. Potem wyślij wskażnik na jej początek , a w funkcji wysyłaj kolejne znaki dopóki nie trafi sie zero.
  • #4 10140342
    kriss68
    Poziom 20  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    tylko pamiętaj, że string musi być zakończony \0 (każdy string stworzony przez char c = "cos tam" zakończony jest \0)
  • #5 10140638
    P4wlut3K
    Poziom 11  
    Skorzystałem z kodu od kriss68 i wywołuje go tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    niestety również podobna sytuacja tylko szlaczków więcej.
    Mi jednak zależy żeby wartości wpisywane do tablicy nie były literami tylko liczbami, ponieważ później chciałbym np. do pierwszego elementu tablicy dodać 1 a później znów go wyświetlić.
    Więc robiłem tak jak radzi tmf a przynajmniej tak mi się wydaje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    wywołanie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    lecz wywala błąd:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 10140698
    kriss68
    Poziom 20  
    A masz świadomość, że to "0xb0" zosanie wysłane nie jako liczba (1 bajt) a jako 4 znaki? Przy definicji funkcji wywal rozmiar tablicy.
  • #7 10140758
    mirekk36
    Poziom 42  
    musisz pan tak przekazywać arguemnty - jako zmienne a nie stałe dosłowne (literały) - co usilnie próbujesz robić i dlatego masz problem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 10142230
    kriss68
    Poziom 20  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    potem masz np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i wywołujesz to np tak (jeśli wielkość tablicy jest stała co w przypadku AVR w 90% przypadków jest prawdą :)):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jak chcesz zmienić któryś znak to po prostu wpisujesz do odpowiedniego elementu tablicy odpowiednią wartość: tablica[1] = 255;
  • #9 10142783
    P4wlut3K
    Poziom 11  
    Propozycję kodu od kriss68 jak i od mirekk36 działają. Jednak jestem ciekawy czy można to zrobić tak jak zakładałem na początku czyli wpisując wartości liczbowe do tablicy przy wywołaniu funkcji.
  • #10 10142973
    mirekk36
    Poziom 42  
    Ale twoja ciekawość bierze się stąd, że jeszcze może nie doczytałeś co to są stałe dosłowne (literały) i z czym to się wiąże, jak są traktowane, gdzie umieszczane itd.... stąd nie wiesz jak się nimi posługiwać a co gorsze niestety, wpadasz na niezbyt trafne pomysły w tym zakresie.
  • #11 10143043
    tmf
    VIP Zasłużony dla elektroda
    P4wlut3K napisał:
    Propozycję kodu od kriss68 jak i od mirekk36 działają. Jednak jestem ciekawy czy można to zrobić tak jak zakładałem na początku czyli wpisując wartości liczbowe do tablicy przy wywołaniu funkcji.

    Oczywiście, że można, tylko nie tak jak to zrobiłeś. Skoro tak naprawdę oczekujesz łańcucha (a przynajmniej tablicy złożonej z elementów 1-bajtowych) to możesz taką tablicę przekazać, z tym, że jeśli umieścisz coś w "" to będzie to traktowane jako tekst i tyle. Aby umieścić w takim tekście wartości binarne należałoby je wyescapować znakiem '\'. Natomiast nijak nie da się z typu niekompletnego wywnioskować o jego długości, stąd też pomysł z sizeof w ciele funkcji nie ma prawa zadziałać.
  • #12 10143146
    kriss68
    Poziom 20  
    A może taka nowa funkcja? Powiem szczerze, że nie wiem czy działa ale się kompiluje :)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ale ta funkcja będzie działać tylko gdy wartości wpisujesz od razu przy wywołaniu a robi się to tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA