Esse keil me deixa louco...

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Esse keil me deixa louco...

Mensagempor j.silvestre » 24 Set 2008 14:58

Só um desbafo..

O keil as vezes força a amizade...

estou querendo usar a lib do keil atoi.....

a desgraçada funciona...

converte direitinho..

x = atoi("1234");

o x é uma var global....

transfiro o "x"; trasnfere(x);

só que eu ainda preciso dessa m**** do x. afinal ele é uma var global...
quando volto da rotina trasnfere(x) o bicho tá zerado...

e se eu crio uma variavel y, que não tenha sido gerado pelo função atoi..
a bagaça funciona...


é isso...

o negócio vai ter que ser na unha...


j.silvestre
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor Ander_sil » 24 Set 2008 15:18

Não entendi bem seu problema, mas já tentou declarar ela como
static char x;

att.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor j.silvestre » 24 Set 2008 15:23

o anderson


x é um int, a função atoi retorna um int.



valews..



j.silvestre
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor Rodrigo_P_A » 24 Set 2008 15:27

j.silvestre escreveu:o anderson


x é um int, a função atoi retorna um int.



valews..



j.silvestre


pode ser problema de pilha , eu acho. Tenta fazer o que o Ander_Sil disse pra ver se funciona, se funcionar deve ser problema de stack mesmo

faz como o
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor j.silvestre » 24 Set 2008 15:42

fiz e não funcionou...


valews..
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor Ander_sil » 24 Set 2008 17:03

ops então static int x;

mas já fez e não funcionou...

tentou passar um ponteiro indicando ela...
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor Sergio38br » 24 Set 2008 17:33

Boa tarde? Que função é esta "transfere( );"??, antes de usar esta função vc pode utilizar o x para outros fins e ele permanece com o valor anterior???

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor barboza » 24 Set 2008 18:22

Oi Silvestre!

Poderia postar o seu código para nos.
Acredito que a função "transfere()" possa estar recebendo o ponteiro para x e não o seu valor propriamente e dentro dela o conteúdo de x é alterado.

Ponteiros é a oitava maravilha, mas tem que tomar cuidado.....
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor j.silvestre » 24 Set 2008 22:50

olá

vou posta aqui... mas já estou fazendo de outra maneira. mas se alguem achar algum erro ...

--------------------------------------------------------------------------------------
void main(void)

{



unsigned char byte1,byte2;
*(pass + 1) =0x31; // for debug
*(pass +2) =0x32 ; // for debug
*(pass + 3) =0x33; // for debug

senha = atoi(pass);//7; // for debug *********
hex_to_ascii(senha); *************

// quando volta da função hex_to_asc tá zerado a "senha "...
// já fiz o diabo... e nada...
posso até salvar senha em outra variavel, antes de enviar mas também fica zerada , na volta da função hex_to_asc(senha);




/***********************************************************************************************************************************************/
/* hex_to_ascii */
/* TRANSFORMA NUMERO CHAR HEX EM 3 NUMEROS ASCII */
/***********************************************************************************************************************************************/
void hex_to_ascii( int n_hex)
{

unsigned char UN,DZ,CENT;

unsigned char resto;


resto = 0;

if(n_hex < 10)
{
// sendtoPC(" SENHA < 10 "); // FOR DEBUGG
CENT = 0x30;
DZ = 0x30;
UN = n_hex + 0x30;
if(flag_senha)
{
sc = CENT;
sd = DZ;
su = UN;
flag_senha = 0;
}
else
{
id1 = CENT;
id2 = DZ;
id3 = UN;
}
return; // sai da função



}


if(n_hex < 100)
{
// sendtoPC(" SENHA < 100 "); // FOR DEBUGG
CENT = 0x30;
DZ =(n_hex / 10);
UN = ( n_hex % 10);
DZ = DZ + 0x30;
UN = UN + 0x30;
if(flag_senha)
{
sc = CENT;
sd = DZ;
su = UN;
flag_senha = 0;
}
else
{
id1 = CENT;
id2 = DZ;
id3 = UN;
}
return; // sai da função
}


if( n_hex >= 100)

{
//sendtoPC(" SENHA >= 100 "); // FOR DEBUGG

CENT = (n_hex/100);
resto= n_hex %100;
if( resto >= 10)
{

DZ= (resto /10) ;
UN= (resto % 10);
CENT = CENT + 0x30; //cent = cent + 0x30;
UN = UN + 0x30; // un = un + 0x30;
DZ = DZ + 0x30; //dz = dz + 0x30;
}

else
{
DZ = 0 + 0x30; //dz = dz + 0x30;
UN = resto + 0x30; // un = un + 0x30;
}
if(flag_senha)
{
sc = CENT;
sd = DZ;
su = UN;
flag_senha = 0;
}
else
{
id1 = CENT;
id2 = DZ;
id3 = UN;
}
}
}
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor j.silvestre » 24 Set 2008 23:23

complementado..

se eu faço assim... ai não dá problema nenhum..

senha = 999;
hex_to_ascii(senha); *************




j.silvestre
j.silvestre
Byte
 
Mensagens: 260
Registrado em: 12 Out 2006 22:15

Mensagempor joao » 25 Set 2008 07:02

Ola J.silvestre,

Olha, eu só tenho uma pequena dúvida em relação ao seu código, porque na verdade ele realmente parece estar correto.

Qual é a linha que vc está criando a variável pass?

Tem como fazer apenas um simples teste, apenas para confirmar se é o atoi ou não o causador do problema?

muda essa linha de:
Código: Selecionar todos
senha = atoi(pass);//7; // for debug *********


para:
Código: Selecionar todos
senha = atoi("123");


E veja se a variável senha fica normal depois da chamada da função.
Porque realmente, vc está apenas passando o valor para a função hex_to_ascii e não um ponteiro. Então, eu recaio as dúvidas de que o que está errado é a linha de cima.
atoi, se dá erro, retorna 0 se não me engano. Então, quem sabe a sua variável está sendo passada de modo errado.
Se fosse para eu fazer, mudaria para isso:
Código: Selecionar todos
char pass[4];
 pass[1] = '1'; //0x31
 pass[2] = '2'; //0x32
 pass[3] = '3'; //0x33
 pass[4] = '\0'; //Para indicar que acabou o ponteiro de char


Será que não está ai o problema? nessa última linha?
vc pode também fazer isso que dá na mesma:
Código: Selecionar todos
char pass[4] = "123";

Porque ele coloca automaticamente o '\0'no final de "123"

Tenta ai e depois nos conta o resultado.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor Sergio38br » 25 Set 2008 08:04

Bom dia, olhe vc marcou como ponteiro a variavel pass, em sua composição

Código: Selecionar todos
unsigned char byte1,byte2;
*(pass + 1) =0x31; // for debug
*(pass +2) =0x32 ; // for debug
*(pass + 3) =0x33; // for debug


falta o mais importante *(pass + 0) , o inicio da matriz criada, como esta vazia teoricamente ela tem o valor "0", não sei como a função atoi vai se comportar quando encontra o primeiro elemento vazio.

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor barboza » 25 Set 2008 08:13

Oi Silvestre!

Uma coisa interessante e muito boa que o Keil faz e acho que � o seu problema e a aloca��o de mem�ria.

Como n�o vi o resto da sua fun��o main, suspeito que voc� esta verificando o valor de "senha" zerado pelo debug do Keil.

Acontece que por ser uma vari�vel usada somente para receber o valor de atoi e repassar para a sua fun��o hex_to_ascii() ela n�o precisa existir realmente depois disso, ent�o o keil aloca esta vari�vel nos registradores.

Seria o mesmo que:

Código: Selecionar todos
hex_to_ascii(atoi(pass));


Ent�o se quiser confirmar o que suspeito, use esta vari�vel no c�digo depois da fun��o hex_to_ascii();



Código: Selecionar todos
senha = atoi(pass);//7; // for debug *********
hex_to_ascii(senha);
lixo = senha + 1;


Pode declarar lixo como variavel local do main.

As dicas do Jo�o s�o bem pertinentes.
Outra coisa � usar os valores em ascii ao inv�s de hexa, pois quem ler seu c�digo ter� mais facilidade para interpretar.

Código: Selecionar todos
CENT = 0x30;

//troque para

CENT = '0';
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Mensagempor Sergio38br » 25 Set 2008 08:38

Barboza, que codificação vc esta usando?? os caracteres extendidos estão todos incompreeensiveis..

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor barboza » 25 Set 2008 08:39

Sergio38br escreveu:Bom dia, olhe vc marcou como ponteiro a variavel pass, em sua composição

Código: Selecionar todos
unsigned char byte1,byte2;
*(pass + 1) =0x31; // for debug
*(pass +2) =0x32 ; // for debug
*(pass + 3) =0x33; // for debug


falta o mais importante *(pass + 0) , o inicio da matriz criada, como esta vazia teoricamente ela tem o valor "0", não sei como a função atoi vai se comportar quando encontra o primeiro elemento vazio.

[ ]'s
Sergio


Bem observado.
Neste caso acho que atoi já retorna 0 para a senha.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.


.....

If no valid conversion could be performed, a zero value is returned.




http://www.cplusplus.com/reference/clib ... /atoi.html
Os homens mentiriam muito menos se as mulheres fizessem menos perguntas.
Avatar do usuário
barboza
Word
 
Mensagens: 948
Registrado em: 17 Out 2006 13:42
Localização: Longe de onde gostaria de estar

Próximo

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x