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

[AVR][c] - Problem z porównaniem tablic

Citek 09 Lip 2009 23:00 2829 8
  • #1 6760595
    Citek
    Poziom 22  
    Witam
    Mam taki mały kłopot. Chcę porównać dwie tablice pod względem zawartości i sprawdzić czy są takie same.
    Poszperałem trochę po necie i znalazłem funkcję strcmp. Próbuję z jej skorzystać, ale jest coś nie tak, bo ciągle dostaję +1...

    Oto mój program...
    #include <avr/io.h>
    #include <string.h>
    #include <util/delay.h>
    #include <hd44780_at8.c>
    
    unsigned char wys;
    char tab1[5]="Slowo";
    char tab2[5]="Slowo";
    
    int main(void)
    {
    
    	LCD_Initalize();
    	LCD_Clear();
    	LCD_WriteText("Test LCDka");
    	_delay_ms(1000);
    	LCD_Clear();
    	while(1)
    	{   
    		for(int k=0;k<5;k++)
    		{
    			LCD_GoTo(k,0);
    			LCD_WriteData(tab1[k]);
    			LCD_GoTo(9+k,0);
    			LCD_WriteData(tab1[k]);
    		}
    		LCD_GoTo(6,0);
    		LCD_WriteText("vs");
    		_delay_ms(1000);
    		LCD_GoTo(0,1);
    		int strcmp( const char *tab1, const char *tab2 );
    		if (strcmp<0)
    		{
    			LCD_WriteText("-1");
    		}
    		if (strcmp==0)
    		{
    			LCD_WriteText(" 0");
    		}
    		if (strcmp>0)
    		{
    			LCD_WriteText("+1");
    		}
    	}
    } 
    
  • Pomocny post
    #2 6760647
    Brutus_gsm
    Poziom 25  
    
          int strcmp( const char *tab1, const char *tab2 );
          if (strcmp<0)
          {
             LCD_WriteText("-1");
          }
          if (strcmp==0)
          {
             LCD_WriteText(" 0");
          }
          if (strcmp>0)
          {
             LCD_WriteText("+1");
          } 
    
    ; Nie tak się tego używa. Zamień na:
    
    
          int wynik= strcmp(tab1, tab2 );
          if (wynik<0)
          {
             LCD_WriteText("-1");
          }
          else if (wynik==0)
          {
             LCD_WriteText(" 0");
          }
          else if (wynik>0)
          {
             LCD_WriteText("+1");
          } 
    
    
  • #3 6760655
    H0miczek
    Poziom 20  
    Funkcja strcmp:
    Compares the C string str1 to the C string str2.
    This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminanting null-character is reached.

    nie zakonczyles tablic znakiem pustym..
    poza tym dokladnie tak jak Brutus napisal
  • #4 6760941
    arrevalk
    Poziom 25  
    A czy przypadkiem kompilator nie zakańcza ciągu znaków samemu gdy jest on znany w trakcie kompilacji? Co innego ciągi znaków tworzone dynamicznie w trakcie działania programu.
  • #5 6761041
    adaszek
    Poziom 11  
    jeżeli tablice są tych samych typów i tych samych rozmiarów, to porównaj bezpośrednio zawartość pamięci zaczynającą się od pierwszego elementu tablicy i o długości n*sizeof(typ elementów tablicy)
  • #7 6782215
    Citek
    Poziom 22  
    Dzięki za pomoc, tylko zauważyłem jeszcze coś.
    Jeżeli mam podane ile elementów ma tablica to w żaden sposób nie mogę uzyskać wartości 0, nawet jak tablice są takie same.
    Przy tablicach dynamicznych wszystko działa bez problemu.

    Dodano po 37 [sekundy]:

    Próbowałem rozwiązać ten problem i doszedłem do takiego czegoś, że:
    tab1[7]="Slowo\n"
    tab2[7]="Slowo\n"
    to wtedy wszystko działa, ale czemu tablica musi być aż 7 elementowa, czyżby znak pusty (\n) zajmował dwa bajty, czy może to wina kompilatora, ponieważ zauważyłem, że zwiększając liczbę elementów z 7 na 8 tylko w jednej tablicy zajętość ramu nie wzrasta. Dopiero jak dam 9 lub drugą tablicę poprawię też na 8 to kompilator odnotowuje wzrost 2 bajtów.
  • #8 6782548
    Freddie Chopin
    Specjalista - Mikrokontrolery
    "Slowo" to 5 liter

    '\n' nie jest "znakiem pustym" (cokolwiek by to mialo niby być), tylko znakiem nowej linii. Zajmuje 1 znak

    '\0' to znak kończący łańcuch znaków. Bez niego twoje tablice są zasadniczo "nieskończone".

    Zsumuj ile wszystko zajmuje.

    4\/3!!
  • #9 6829205
    Citek
    Poziom 22  
    Dobra teraz wszystko mi działa poprawnie na tablicach 6 elementowych (5 elementów - wyraz + 1 element - pusty znak), czyli tak jak powinno być.
    Pozostaje jeszcze ta druga ciekawostka, dlaczego w kompilatorze (korzystam z AVR Studio) po zwiększeniu jednej tablicy o jeden element nic nie następuje, dopiero po dodaniu kolejnego elementu widać rezultaty. Odczytuję to w:
    Data: 37 bytes (3.6% Full)
    (.data + .bss + .noinit)
    Czyżby to była jakaś optymalizacja kompilatora???
REKLAMA