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

[atmega16][C]problem z tablica

tomisk 30 Lip 2008 13:44 1296 7
REKLAMA
  • #1 5391867
    tomisk
    Poziom 11  
    Witam

    mam następujący problem jestem w trakcje pisania meni i wymyśliłem sobie że zrobię tablice char-ów w której pod danym indeksem będzie dany napis wszystko działa dobrze do 3 elementu tablicy gdy chce wyświetlić 4 lub 5 na wyświetlaczu wywala jakieś krzaki.

    typedef char 	*meni; //w pliku meni.h
    
    //w int main(void)
            meni meni_glowne;
    	meni_glowne = malloc(5*sizeof(char));
    	meni_glowne[1] = "1aaaaaaa";
    	meni_glowne[2] = "2aaaaaaa";
    	meni_glowne[3] = "3aaaaaaa";
    	meni_glowne[4] = "4aaaaaaa";
    	meni_glowne[5] = "5aaaaaaa";


    czym to jest spowodowane może ktoś wie??

    Pozdrawiam

    Proszę umieszczać kod , w znacznikach. [code]
    Proszę zapoznać się z regulaminem(p.15) i poprawić treść.
    [zumek]
  • REKLAMA
  • #2 5391901
    BoskiDialer
    Poziom 34  
    tomisk napisał:
    czym to jest spowodowane może ktoś wie??

    Tak, ja wiem.

    ... Co rozumiesz pod pojęciem "meni"?
    "meni" jest wskaźnikiem na znak. W przypisaniu do "meni_glowne" wskaźnika od malloc uzyskujesz miejsce na 5 znaków (zresztą sam jawnie napisałeś: 5*sizeof(char) ) - indeksując "meni_glowne" wychodzisz poza zakres (dla 5 elementów są one od 0 do 4) dodatkowo przypisujesz wskaźnik znaków do znaku - komórki tablicy znaków ("test" powoduje umieszczenie w pamięci ram ciągu znaków "test" oraz wstawienie w kodzie wskaźnika na tenże ciąg). Całość nie ma prawa działać, musiał byś to przeprojektować najlepiej do takiej postaci:
    //w int main(void) 
    char* menu_glowne[5];
    menu_glowne[0] = "1aaaaaaa"; 
    menu_glowne[1] = "2aaaaaaa"; 
    menu_glowne[2] = "3aaaaaaa"; 
    menu_glowne[3] = "4aaaaaaa"; 
    menu_glowne[4] = "5aaaaaaa";

    lub:
    //w int main(void) 
    char** menu_glowne = malloc(5*sizeof(char*));
    menu_glowne[0] = "1aaaaaaa"; 
    menu_glowne[1] = "2aaaaaaa"; 
    menu_glowne[2] = "3aaaaaaa"; 
    menu_glowne[3] = "4aaaaaaa"; 
    menu_glowne[4] = "5aaaaaaa";
  • REKLAMA
  • #3 5391953
    tomisk
    Poziom 11  
    meni = "Menu

    Co to jest Menu?
    - służy do udostępnienia użytkownikowi możliwość wyboru poleceń i funkcji programu. W celu wywołania któregoś z nich wystarczy kliknąć. Menu może również otwierać programy. W zależności od budowy może to być pasek menu, menu kontekstowe lub rozwijalne."

    tak ja to rozumiem

    dzięki za odpowiedz
  • REKLAMA
  • #4 5394898
    tomisk
    Poziom 11  
    Witam

    tym razem mam problem z if
    [color=green]void Wyswietlacz(meni y, int a)
    {
    	int i;
    	LCD_clear();
    	if (a <= 4)
    		{
    			LCD_putstrxy(y[a], 0, 0);
    			LCD_putstrxy(y[a + 1], 0, 1);
    		}
    	else 
    	{
    			LCD_putstrxy(y[a],0,2);
    	}
    
    }
    
    void MENI_Glowne(meni y)
    {
    	char x;
    	int a = 1;
    	Wyswietlacz(y, 1);
    	while (x != 'X')
    	{
    		x = Przycisk();
    		if (x == 'U')
    		{
    			if (a >= 1)
    			{	
    				a = a - 1;
    				Wyswietlacz(y, a);
    			}
    		}
    		if (x == 'D')
    		{
    			if (a <= 4)
    			{
    				a = a + 1;
    				Wyswietlacz(y, a);
    			}
    		}
    		if (x == 'E')
    		{
    			LCD_putstrxy("lala lala",2,3); 
    		}
    	
    	}
    }[/color] [color=yellow][/color]
    

    w funkcji MENI_Glowne sprawdzam czy dany przycisk zostal nacisniety w miejscu x = Przycisk() nastepnie wykonuje sie dana instrukcja i tu jest problem gdy x == 'U' lub 'D' poniewaz do funkcji Wyswietlacz(...) wchodzi a == 5 lub 1 nie wiem czemu nie przyjnuje pozostałych wartosci z tego zakresu. Dodam ze Przycisk zwraca 'U' 'D' 'X' 'E' lub 0
  • #5 5394974
    BoskiDialer
    Poziom 34  
    1/ Nie stosujesz znaczników code.
    2/ Nie inicjalizujesz zmiennej x, przez co pętla może nie być w ogóle wykonywana.
    3/ Jeśli trzymając przycisk do góry funkcja "Przycisk" będzie cały czas zwracać wartość 'U', to zamiast przechodzenia przez menu kod przeleci przez wszystkie wartości aż dojdzie do zera (sic!), podobnie jeśli jest z przyciskiem w dół, wtedy przeleci wszystkie wartości do 5. Musisz blokować wykonywanie aż do puszczenia przycisku.
  • #6 5395045
    tomisk
    Poziom 11  
    ok dzięki tak myślałem ale wcześniej wstawiałme tam _delay_ms() tylko robiłem wartości w granicach 5 teraz dałem 50 i działa postaram sie optymalnie ja dopasować jeszcze raz dzięki

    Pozdrawiam
  • REKLAMA
  • #8 5396720
    bobbyAIR
    Poziom 20  
    A ja mam pytanie z innej beczki. Po co alokować pamięć dla znaków dynamicznie, jeśli znaki są w nią wpisywane statycznie. Przecież przy kompilacji te napisy są stałe i i tak zostaną wrzucone w kod programu - efekt jest taki, że będą podwójnie zajmowac pamięć, Raz programu, drugi raz pamięć roboczą. Nie prościej zdeklarowac je jako zmienne pamięci programu i operowac na samych wskaźnikach do nich? jaka będzie oszczędność....
REKLAMA