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

Funkcja która zwraca tablice ??

darek1632 02 Wrz 2009 14:12 8344 4
  • #1 6971589
    darek1632
    Poziom 15  
    Napisałem sobie funkcje która działała w programie głównym. Często będę ją powtarzał więc zdeklarowałem i zdefiniowałem ja:
    
    unsigned int get_ID ( void ) // pobiera 5 bajtów z tablicy 16bajtowej i zapisuje do 5 bajtowej
       
        {
    	
          unsigned int c;
          volatile uint8_t i;
    	   unsigned int ID16[16];	 
    	   unsigned int ID5[5];
    	
    	    i=0;
    		
    	    while(i<16)
    		  { 
                   c = uart_getc();
                   if ( c & UART_NO_DATA )
                 { }
                
                 else
    			
                  {
                    ID16[i]=c;
    			    i++;  
    		      }
    			
    		  }
    		   
    		for(i=0;i<5;i++)
     
     		    {
    			
    			ID5[i]=ID16[i+5]; 
    			
    			}
    	
    	return (ID5);
    	

    W programie głównym funkcja dawała mi 5 bajtową tablice którą potem w pętli porównywałem. Teraz nie wiem jak zrobić aby funkcja zwracała mi tablice ??
    Pozdrawiam
  • Pomocny post
    #2 6971604
    _Robak_
    Poziom 33  
    Moze niech zwraca wskaznik na tablice, ktora wczesniej zadeklaruj.
  • Pomocny post
    #3 6971615
    loocasm
    Poziom 15  
    Tablice tak zdefiniowane są lokalne, czyli widoczne tylko w obrębie funkcji. Najprostszym wyjściem będzie zdefiniowanie ich na początku programu, przed wszystkimi funkcjami (m.in. przed main), jako globalne. Wtedy każda funkcja będzie je widziała i mogła swobodnie modyfikować ich zawartość.
    Drugim rozwiązaniem jest pisanie funkcji tak, by przyjmowały tablice (czyli wskaźniki na typ zmiennej) jako argument i zwracały "tablice", wtedy to wygląda tak
    int* funkcja (int *argument)
    Ale to są podstawy C... :)
  • #4 6976354
    darek1632
    Poziom 15  
    Dzięki za odpowiedzi, zrobiłem taką funkcje jak proponował loocasm i wygląda to tak:
     unsigned int IDrfid[5], IDadmin[5];
    .....
    void get_ID(void) 
      
        {
    	
        unsigned int c;
        volatile uint8_t i;
    	unsigned int ID16[16];	 
    	
    	
    	
    	    i=0;
    		
    	    while(i<16)
    		  { 
                   c = uart_getc();
                   if ( c & UART_NO_DATA )
                 { }
                
                 else
    			
                  {
                    ID16[i] = c;
    			    i++;  
    		      }
    			
    		  }
    		   
    		for(i=0;i<5;i++)
     
     		    {
    			
    			IDrfid[i] = ID16[i+5]; 
    			
    			}
    	
    	
    	
    	
    	} 

    Działa mi to ok. Co do drugiej propozycji loocasm i _Robak_ to nie wiem czy ta funkcja tak może być:
    unsigned int IDrfid[5], IDadmin[5];
    ....
    unsigned int* get_ID(unsigned int *ID ) 
      
        {
    	
        unsigned int c;
        volatile uint8_t i;
    	unsigned int ID16[16];	 
    	
    	
    	
    	    i=0;
    		
    	    while(i<16)
    		  { 
                   c = uart_getc();
                   if ( c & UART_NO_DATA )
                 { }
                
                 else
    			
                  {
                    ID16[i] = c;
    			    i++;  
    		      }
    			
    		  }
    		   
    		for(i=0;i<5;i++)
     
     		    {
    			
    			IDrfid[i] = ID16[i+5]; 
    			
    			}
    	
    	return (*IDrfid);
    	
    	
    	}

    Nie czuje trochę tych wskaźników wiec proszę o wyrozumiałość. Pozdrawiam
  • #5 6976489
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Jeśli nie czujesz wskaźników, to znak, że czas przeczytać jakąś książkę.

    Funkcja przyjmuje parametr, po to, żeby go potem nigdzie nie użyć. Do tego zwracasz nie wskaźnik, a element wskazywany. Nie mówiąc już o tym jakie to bezsensowne, skoro tablicą jest tak czy siak globalna... Pozatym gdybyś to skompilował, to być może zastanowiłyby cię warningi jakie produkuje kompilator.

    To nie jest kwestia wyrozumiałości - to jest forum, a nie szkółka programowania, a to o co pytasz to są podstawy C. Są książki, kursy, strony internetowe, nawet na wikipedii jest książka o C. Tylko chcieć.

    4\/3!!
REKLAMA