Ir ao conteúdo
  • Cadastre-se

Variável mudando sozinha! em C


JACK_SNOWSTALKER
Ir à solução Resolvido por Ansi C,

Posts recomendados

Olá amigos do fórum, vim questionar uma coisa, já aconteceu com vocês de uma variável mudar seu valor sozinha??? Recentemente aconteceu isso comigo!!! Uma variavel de carry que eu usava mudava de 1 para 0 sozinha em um programa em C! Eu tentei procurar o erro de lógica do código mas não havia, simplesmente não havia erro! após fazer varios printf para ver os valores ao longo do código eu descobri que ela mudava de valor em um trecho em que não havia menção alguma a ela! Após ir mais a fundo, descobri que a função sprintf estava mudando seu valor, mas não havia nenhuma menção a ela! Enfim, troquei o sprintf por uma operação que um amigo indicou ( valor inteiro + '0') para converter inteiro em caractere, e a variável (que não tinha relação alguma com essa operação) continuou com seu valor normalmente ao longo do código. Gostaria de saber, o que poderia causar esse problema???

Link para o comentário
Compartilhar em outros sites

já alterei o código pra versão correta, e acho que vocês vão me xingar se verem as coisas que estou fazendo, não que sejam malucas, mas são maneiras pouco eficientes de se fazer (estou com praso apertadissimo, então eficiencia fica de lado), vou editar aqui pra deixar como estava...

	while(valor1!=NULL && valor2!=NULL)	{		int1=atoi(&valor1->valor);		int2=atoi(&valor2->valor);				resulta=(int1+int2)+vaium;		if(resulta<10)		{			vaium=0;		}		if(resulta>=10)		{			vaium=1;			resulta=resulta%10;		}		valor1=valor1->proximo;		valor2=valor2->proximo;		sprintf(&resu,"%d",resulta);		enfileira(resultado,resu);	}

Tem duas estruturas (valor1,valor2), resulta é a variavel que recebe o resultado, uso atoi pra converter os char para inteiro, e depois sprintf para converter o digito em um char para salvar em outra estrutura (resultado), depois do sprintf a variavel vaium muda de valor, de 1 para 0. Coloquei printf em varias partes, e fui mexendo, e mexendo, ate que percebi que mudava exatamente depois do sprintf, substitui pelo inteiro + '0' e corrigiu o problema.

Link para o comentário
Compartilhar em outros sites

é muito interessante, eu trouxe no fórum para divulgar, e entender a causa, adoraria olhar a pilha de execução e fazer um debug completo pra entender aonde o sprintf muda ela, mas tempo é um luxo que não tenho no momento. E sim, ela não é mencionada no trecho de código, eu coloquei printf em todo o código onde ela é alterada, e ela é alterada realmente no sprintf.

Link para o comentário
Compartilhar em outros sites

Ai cara...da vergonha....resulta sempre terá 1 digito, e resu também tem um digito apenas.

 

Vou postar a função completa...essa já não tem o sprintf.

void soma(valores *a,valores *b,valores *resultado){	//declarando variaveis	int vaium=0;	int int1;	int int2;	int resulta;	char resu;	digito *valor1;	digito *valor2;	//atribuindo referencias aos ponteiros	valor1=a->comeco;	valor2=b->comeco;		printf("\nsomando\n");	//fazendo continha :3	while(valor1!=NULL && valor2!=NULL)	{		int1=atoi(&valor1->valor);		int2=atoi(&valor2->valor);				resulta=(int1+int2)+vaium;		if(resulta<10)		{			vaium=0;		}		if(resulta>=10)		{			vaium=1;			resulta=resulta%10;		}		valor1=valor1->proximo;		valor2=valor2->proximo;		resu=resulta + '0';		empilha(resultado,resu);	}	while(valor1!=NULL)	{			int1=atoi(&valor1->valor);		resulta=int1+vaium;		if(resulta>=10)		{			vaium=1;			resulta=resulta%10;		}		else		{			vaium=0;		}				resu=resulta + '0';		empilha(resultado,resu);		valor1=valor1->proximo;	}		while(valor2!=NULL)	{		int1=atoi(&valor2->valor);		resulta=int1+vaium;		if(resulta>10)		{			vaium=1;			resulta=resulta%10;		}		else		{			vaium=0;		}		resu=resulta + '0';		empilha(resultado,resu);		valor2=valor2->proximo;	}	if(vaium==1)	{		resu=1+'0';		empilha(resultado,resu);	}}
Link para o comentário
Compartilhar em outros sites

Ok!

kkkkk agora entendi o nome da variável também.

vaium  é um buff de múltiplos de 10.

 

Agora faz sentido, ele não mudou de valor sozinha, isso ocorre durante todo 

algoritmo, sempre que houver ou não múltiplo de 10 uma ou mais condições se tornará else::vaium = 0;

 

Valeu!

Link para o comentário
Compartilhar em outros sites

  • Solução



#include <stdio.h> // entrada e saída de dados //

#include <stdlib.h>

//* função principal do software

//* pós-dados: fim do programa

int main(void)

{

// Supomos que o local na memória é...

unsigned char vaium = 0; // 0x28FF1F

unsigned char hcuVal2 = 0; // 0x28FF1E

// Neste ponto você pode notar um fato

// como o nosso suposto copilador iniciou

// as variáveis na stack.

// Vamos atribuir valor as duas

vaium = 1;

hcuVal2 = 1;

// Imprimi-las...

printf("vaium=:%d""\n"

"Val2=: %d""\n",

vaium, hcuVal2);

// Agora vamos a experiencia...

// Entre com sprintf();

char hcNew = '1';

puts("Entrou com sprintf()");

sprintf(&hcuVal2, "%d", hcNew);

// Imprimi-las...

printf("vaium=:%d""\n"

"Val2=: %d""\n",

vaium, hcuVal2);

puts("Wow!!! vaium =: 0 ????");

// Se a experiencia foi bem sucedida como aqui

// você percebeu que ambas as variáveis tiveram

// o valor modificado... E Então você já

// entendeu o por que!

// Suponho que tenha relação com o que aconteceu

// com à variável vaium;

// Tudo neste problema veem do interno da função

// ??? " %d", ???; ela espera um int (16 bits);

// mais hcuVal2, tem apenas 8 bits, então a função

// invade os próximos bits na memória da stack.

//

// Isso me ocorreu enquanto dormia

// :) achei tão interessante que postei de celular mesmo.

// Tenha um boa noite.

return ( 0); //<

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...