Página 1 de 2

Esse keil me deixa louco...

MensagemEnviado: 24 Set 2008 14:58
por j.silvestre
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

MensagemEnviado: 24 Set 2008 15:18
por Ander_sil
Não entendi bem seu problema, mas já tentou declarar ela como
static char x;

att.

MensagemEnviado: 24 Set 2008 15:23
por j.silvestre
o anderson


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



valews..



j.silvestre

MensagemEnviado: 24 Set 2008 15:27
por Rodrigo_P_A
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

MensagemEnviado: 24 Set 2008 15:42
por j.silvestre
fiz e não funcionou...


valews..

MensagemEnviado: 24 Set 2008 17:03
por Ander_sil
ops então static int x;

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

tentou passar um ponteiro indicando ela...

MensagemEnviado: 24 Set 2008 17:33
por Sergio38br
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

MensagemEnviado: 24 Set 2008 18:22
por barboza
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.....

MensagemEnviado: 24 Set 2008 22:50
por j.silvestre
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;
}
}
}

MensagemEnviado: 24 Set 2008 23:23
por j.silvestre
complementado..

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

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




j.silvestre

MensagemEnviado: 25 Set 2008 07:02
por joao
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

MensagemEnviado: 25 Set 2008 08:04
por Sergio38br
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

MensagemEnviado: 25 Set 2008 08:13
por barboza
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';

MensagemEnviado: 25 Set 2008 08:38
por Sergio38br
Barboza, que codificação vc esta usando?? os caracteres extendidos estão todos incompreeensiveis..

[ ]'s
Sergio

MensagemEnviado: 25 Set 2008 08:39
por barboza
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