Sari la conținut
ELFORUM - Forumul electronistilor

Problema programare pointeri, caractere


claudio

Postări Recomandate

Salut,

 

Am incercat sa fac un program de testare a porturilor unui microcontroler, dar primesc 18 warning-uri de genul acesta:

"warning: large integer implicitly truncated to unsigned type".

 

Treaba asta cu pointeri si caractere nu am reusit sa o inteleg.

Rog pe cineva sa-mi corecteze programul si deasemenea sa-mi dea si explicatiile

Multumesc mult.

 

Mai jos listingul programului:

#define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>uint8_t test=0;void test_mb(char mode, uint8_t port);int main(){	while(1)	{		test=0;		switch(test)		{			case 0: test_mb('light_port','A');			break;			case 1: test_mb('light_port','B');			break;			case 2: test_mb('light_port','C');			break;			case 3: test_mb('light_port','D');			break;			case 4: test_mb('blink_port','A');			break;			case 5: test_mb('blink_port','B');			break;			case 6: test_mb('blink_port','C');			break;			case 7: test_mb('blink_port','D');			break;		}	}}void test_mb(char mode, uint8_t port){	if(mode=='light_port')	{		switch(port)		{			case 'A':	DDRA = 0xFF;							PORTA = 0xFF;						_delay_ms(3000);						PORTA = 0x00;			break;			case 'B':	DDRB = 0xFF;							PORTB = 0xFF;						_delay_ms(3000);						PORTB = 0x00;			break;			case 'C':	DDRC = 0xFF;							PORTC = 0xFF;						_delay_ms(3000);						PORTC = 0x00;			break;			case 'D':	DDRD = 0xFF;							PORTD = 0xFF;						_delay_ms(3000);						PORTD = 0x00;			break;		}	}	if(mode=='blink_port')	{		switch(port)		{			case 'A':	DDRA = 0xFF;							PORTA = 0xFF;						_delay_ms(1000);						PORTA = 0x00;						_delay_ms(1000);			break;			case 'B':	DDRB = 0xFF;							PORTB = 0xFF;						_delay_ms(1000);						PORTB = 0x00;						_delay_ms(1000);			break;			case 'C':	DDRC = 0xFF;							PORTC = 0xFF;						_delay_ms(1000);						PORTC = 0x00;						_delay_ms(1000);			break;			case 'D':	DDRD = 0xFF;							PORTD = 0xFF;						_delay_ms(1000);						PORTD = 0x00;						_delay_ms(1000);			break;		}	}}
Link spre comentariu
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • claudio

    2

  • godFather89

    1

Top autori în acest subiect

if(mode=='light_port')

In primul rand, string-urile se pun intre apostrofi dublii "text".In al 2-lea rand, string-urile nu se declara char. char este un caracter si are dimensiunea de un byte. In majoritatea compilatoarelor, implicit este cu semn iar unsigned char fara semn. Daca vrei un sir de caractere, atunci il declari ca un vector de caractere (char test[] = "Test string";). De altfel in c nu se compara sirurile de caractere cu == deoarece sunt vectori, spre deosebire de c++ unde exista clasa string. String-urile se compara cu strcmp sau variatiile acestuia.Nu ai precizat in ce ai incercat sa compilezi programul...Sfat: Foloseste si else-urile in lanturile decizionale (if dupa if dupa if) pana la urma viteza conteaza pe un microcontroller. De altfel, puteai sa folosesti un switch pentru mode, la fel cum ai facut pentru port.incearca asa :
#define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>uint8_t test=0;void test_mb(char mode, uint8_t port);#define LIGHT_PORT 1#define BLINK_PORT 2int main(){   while(1)   {      test=0;      switch(test)      {         case 0: test_mb(LIGHT_PORT,'A');         break;         case 1: test_mb(LIGHT_PORT,'B');         break;         case 2: test_mb(LIGHT_PORT, 'C');         break;         case 3: test_mb(LIGHT_PORT,'D');         break;         case 4: test_mb(BLINK_PORT,'A');         break;         case 5: test_mb(BLINK_PORT,'B');         break;         case 6: test_mb(BLINK_PORT,'C');         break;         case 7: test_mb(BLINK_PORT,'D');         break;      }   }}void test_mb(char mode, uint8_t port){   if(mode==LIGHT_PORT)   {      switch(port)      {         case 'A':   DDRA = 0xFF;                     PORTA = 0xFF;                  _delay_ms(3000);                  PORTA = 0x00;         break;         case 'B':   DDRB = 0xFF;                     PORTB = 0xFF;                  _delay_ms(3000);                  PORTB = 0x00;         break;         case 'C':   DDRC = 0xFF;                     PORTC = 0xFF;                  _delay_ms(3000);                  PORTC = 0x00;         break;         case 'D':   DDRD = 0xFF;                     PORTD = 0xFF;                  _delay_ms(3000);                  PORTD = 0x00;         break;      }   }   else   if(mode==BLINK_PORT) //oricum ai doar 2 moduri, if-ul asta e in plus (decat daca vrei sa mai faci moduri)   {      switch(port)      {         case 'A':   DDRA = 0xFF;                     PORTA = 0xFF;                  _delay_ms(1000);                  PORTA = 0x00;                  _delay_ms(1000);         break;         case 'B':   DDRB = 0xFF;                     PORTB = 0xFF;                  _delay_ms(1000);                  PORTB = 0x00;                  _delay_ms(1000);         break;         case 'C':   DDRC = 0xFF;                     PORTC = 0xFF;                  _delay_ms(1000);                  PORTC = 0x00;                  _delay_ms(1000);         break;         case 'D':   DDRD = 0xFF;                     PORTD = 0xFF;                  _delay_ms(1000);                  PORTD = 0x00;                  _delay_ms(1000);         break;      }   }}
Link spre comentariu

Multumesc mult pentru raspuns.

M-ai lamurit acum si in plus mi-ai oferit o metoda mult mai buna de rezolvare.

Chiar nu avea rost sa ma complic cu stringuri si comparare de stringuri.

Iar ideea de a folosi if-if-if fara else, nu stiam ca influienteaza viteza de functionare, iar metoda de a folosi switch in switch mi se parea prea incurcata.

 

Numai bine. :aplauze

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări