Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

mmnet 1002 program w c odpalany z arumentami

radziu88 25 Jul 2010 02:00 1398 8
Computer Controls
  • #1
    radziu88
    Level 10  
    witam piszę właśnie program na arma 9 w c do sterowania przekaźnikami pod i2c
    i chce go wywoływać z konsoli z dwoma argumentami niestety przy kompilacji otrzymuje błędy których nie potrafię wyeliminować
    fragment kodu

    int main (int argc, char *argv[] )
    {
    	
           
    	if (inicjacja() !=0)
    	{
    		printf ("wystąpil blad przy dostepie do i2c");
    	}
    	if (argv[1]=='z')
    	{
    		printf ("zamykanie nr %s",argv[2]);
    		if (zamykanie(argv[2])!=0)
    		{
    		printf ("wystąpił bląd przy funkcji zamnij");
    		}
    	
    	}
    	
    	if(argv[1]=='o')
    	{
    		if (otwieranie(argv[2])!=0)
    		{
    		printf("wystompil blad przy funkcji otwieranie");
    		}
    	}
    	
    		
    	printf("koniec programu\n");
    	
    	return 0;
    }


    błędy
    radziu@radziu-laptop:~/Pulpit/ARM/moje$ arm-linux-uclibc-gcc rolety_1.0.c -o rolety_1.0
    rolety_1.0.c: In function 'main':
    rolety_1.0.c:124: warning: comparison between pointer and integer
    rolety_1.0.c:127: warning: passing argument 1 of 'zamykanie' makes integer from pointer without a cast
    rolety_1.0.c:134: warning: comparison between pointer and integer
    rolety_1.0.c:136: warning: passing argument 1 of 'otwieranie' makes integer from pointer without a cast
    


    bardzo proszę o pomoc w usunięciu błędów
  • Computer Controls
  • #2
    arrevalk
    Level 25  
    *argv[] to tablica ciągów znaków (C-strings), w związku z tym jeżeli chcesz odczytać z niej liczbę, to musisz ją przekonwertować (np funkcją atoi()).

    Twoje funkcje są zapewne zadeklarowane jako przyjmujące typ int jako parametr, czyli wywołanie funkcji otwieranie/zamykanie powinno wyglądać mniej więcej tak:
    
    otwieranie(atoi(argv[2]));
    

    I nie są to błędy a ostrzeżenia, które biorą się z tego że próbujesz do zmiennej int przypisać wskaźnik. Kompilator sygnalizuje Ci że mogło być to coś czego nie chciałeś zrobić.
  • #3
    radziu88
    Level 10  
    poprawiłem kod e następujący sposób

    int main (int argc, char *argv[] )
    {
    	
           
    	if (inicjacja() !=0)
    	{
    		printf ("wystąpil blad przy dostepie do i2c");
    	}
    	if (argv[1]=="z")
    	{
    		printf ("zamykanie nr %s",argv[2]);
    
    		if (zamykanie (atoi(argv[2]))!=0)
    		{
    		printf ("wystąpił bląd przy funkcji zamnij");
    		}
    	
    	}
    	
    	if(argv[1]=="o")
    	{
    		if (otwieranie(atoi(argv[2]))!=0)
    		{
    		printf("wystompil blad przy funkcji otwieranie");
    		}
    	}
    	
    		
    	printf("koniec programu\n");
    	
    	return 0;
    }


    program kompiluje się bez błędnie ale przy uruchamianiu
    ./rolety_1.0 z 2
    


    w odpowiedzi dostaje
    inicjacja
    inicjacja koniec 
    koniec programu
    


    czyli program nie uruchamia funkcji zamknij jakieś pomysły dlaczego ??
  • Computer Controls
  • Helpful post
    #4
    User removed account
    User removed account  
  • #5
    arrevalk
    Level 25  
    W języku C operatorem == nie da się porównać ciągów znaków, a tak Ty próbujesz to zrobić:
    //ciach...
    	if (argv[1]=="z")
    //ciach...
    	if(argv[1]=="o")
    //ciach...



    Jak już pisałem wcześniej argv jest tablicą wskaźników na ciągi znaków, czyli argv[1] jest WSKAŹNIKIEM NA CIĄG ZNAKÓW a nie znakiem/ciągiem znaków, więc powinieneś to robić albo w sposób podany przez _marek albo tak:
    
    if(argv[1][0] == 'z')
    //albo
    if(*argv[1] == 'z')
    

    (dodam że metoda polecana przez kol. _marek jest wygodniejsza).
  • #6
    radziu88
    Level 10  
    sposób kolegi _marek okazał się bardzo dobry i wykozystałem go w moim programie. ale niestety jak to zwykle bywa pojawił się kolejny problem.
    mianowicie
    
    int akcja (char dana, int wait)
    {
    	
    	printf ("akcja");
    	char bufor[10]; 
    	
    	bufor[1]=dana;
    	//zpisywanie do prtow	
    	if (write(plik,bufor,2) !=2)
    	{
    		printf ("bład w komunikacji1 \n");
    	}
    	//sleep (wait) ;//czekaj wait
    	//odczytawie zapisanej danej 	
    	if (read(plik,bufor,3)!=3)
    	{
    		printf("blad komunikacji2\n");
    	}
    	// zerownie portow
    	bufor[0]=255;
    	//printf ("%s \n",bufor[0]);
    	if (write(plik,bufor,0) !=0)
    	{
    		printf ("bład w komunikacji3\n");
    	}
    	//else printf ("zerowanie");
    	//porownywanie danej zapisanej i odczytanej
    	if (bufor[1]==bufor[2])
    	{
    		return 0;
    	} 
    	else 
    	{
    		return 1;
    	}
    


    i problemy są takie opcja sleep działa bardzo dzinie przekazuje do niej int wait =10 a ona czeka wiele dłużej niż 10s . oraz część oznaczona jako zerowanie portów nie działa poprawnie.

    powinno działać tak aby po zapisaniu i odczytaniu danych zapisać do portu same jedynki czyli 255 . u mnie niestety się to nie dzieje i port pozostaje w stanie części oznaczonej jako zapisywanie do portu .
  • #7
    User removed account
    User removed account  
  • #8
    radziu88
    Level 10  
    ok ale co ze sleepem ??
  • #9
    User removed account
    User removed account