Ir para conteúdo

Por Que Não Da Para Fazer Isso Ou Aquilo ?


Joinu

Posts Recomendados

Gente, estava dando uma olhada na seção programação e vi um topico

http://www.xtibia.com/forum/topic/143198-1-espaco/

Não respondi diretamente lá pq faz tempo que o ultimo post foi feito...

Bem de qq maneira o que ele quer não tem como resolver.

MAS POQ RAIOS NÂO DA PARA RESOLVER ESSE PROBLEMA TÃO FACIL.????

 

 

Bem não sei se eh facil entender o pq mas vou tentar responder.

para quem abriu e leo o topico verificou que temos 2 "seres"(O tibia cliente e o Banco de dados) que indicam um unico item, o soul da vacaçao do cara.

Bem ele criou uma vocação e no banco de dados ele tem uma tabela com um campo a qual ele conseque alterar seu valor,

e o tamanho do dado que pode ser suportado por esse campo.

Por outro lado, temos o cliente do Tibia que foi desenvolvido na linguagem c++.

E dentro desse cliente temos uma variavel que guarda o valor desse campo.

Para os que conhecem pouco da linguagem c++ saiba que podemos criar variaveis numericas que pode suportar varios tamanhos de valores para essa variavel.

Por exemplo.

Um engenheiro esta projetando um sistema e cria uma variavel que ele sabe nunca na vida va passar o valor de 255

entao ele cria essa variavel do tipo char pois ele sabe que uma variavel do tipo char consegue armazenar um valor entre 0 e 255 compila seu programa e o mesmo funciona o resto de sua vida....

Bem quando se complia um programa escrito em c++ podemos escolher quando essa variavel vai ser criada, se é na hora de execução do programa ou se é na hora da compilação do mesmo. mas tb isso não interessa.

Na hora que vc cria uma variavel em qualquer linguagem de programação eh importantíssimo vc dizer o tamanho em bytes ela vai ocupar na memoria do pc e isso se faz escolhendo o tipo da variavel.

Isso pq na hora que for rodar o programa, ele terá que guardar esses bytes para poder ter esse tamanho disponivel na hora que vc for colocar algum valor lah.

 

Bem ai imaginemos agora que, temos o cliente tibia e pelo que eu li do problema do outro post e pela vivencia que tive com a linguagem c++ eu ja deduzi que quando o programador do cliente tibia criou essa variavel ele ja limitou ela para ateh no maximo o numero 255

 

Vou explicar o porque

 

Na hora que a gente executa um programa eu afirmei que ele precisa reservar a memoria para cada variavel que a gente criou e que ele reserva de acordo com o tipo de variavel que se criou, entao como foi criado uma variavel para se armazenar um byte (eu estou deduzindo isso) para armazenar o valor do soul do boneco na hora que rodamos o programa ele terá que guardar 8 bits da memoria ram (isso é uma afirmação pois sabemos que a união de 8 bits forma um byte)

 

Imagine que foi reservado dessa maneira :

 

00000000 <- cada zero desse representa um bit reservado na memoria ram na hora que se roda o programa.

 

Bem sabemos que para cada bit desse ligado (valor=1) ou desligado (valor=0) ha mudança de valor decimal.

E sabemos que todos os bits desligados =0 o valor decimal eh igual a zero.

 

ta vou dar um exemplo aki de ir somando os bits

00000000=0+00000001

00000001=1+00000001

00000010=2+00000001

00000011=3+00000001

00000100=4+00000001

00000101=5+00000001

00000110=6+00000001

00000111=7+00000001

00001000=8+00000001

00001001=9

...

11111111=255

 

tente reparar que sempre quando ele vai pular para a proxima casa da esquerda ele liga o bit e desliga todos os anteriores, entao ele vem ligando um a um ateh preenche tudo os bites a direita.

Tb repare que chegando no numero de 255 não tem mais bits para se ligar, ou seja para continuar somando vamos precisar de mais um conjunto de 8 bits (um byte)

Bem no caso do topico que foi postado o problema, sempre que ele aumentava o soul de 255 para 256 ele nos diz que no cliente volta para 0.. vamos simular aqui o problema

 

11111111=255+00000001

 

Veja que todos os bits estão ligados e como eu afirmei sempre que temos um conjunto de bits todos ligados e ele precisa ir para o proximo numero ele liga o proximo bit e desliga tdos os anteriores

 

00000001 00000000=256

 

veja que ele ligou um bit fora escopo de nossa variavel ou seja ele pode ter sobreescrevido alguma coisa (não sei se internamente o que o compilador faz nesse caso, se ele sobrescreve alguma coisa oi retorna somente o valor do ultimo byte para a variavel.)

Outros podem estar se perguntando... bem mas se ele sobreescreve alguma coisa pq não retorna o valor que sobreescreveu.

A resposta eh muito simples.

Quando compilamos um programa ele tira o nome da variavel e coloca nele o valor de um endereço dentro do nosso programa.

Tipo vc criou a variavel

char soul;

 

na hora que ele compila ele escolhe um endereço de memoria dentro de nosso programa.

Vamos supor que seja

0x5000 e toda vez que vc chama essa variavel ele vai direto nesse endereço e pega somente a quantidade de bits que vc informou no tipo da variavel

 

no exemplo em questão

existem 2 endereços de memoria

o 0x5000 e o 0x4fff

veja

 

0x4fff 0x5000

00000001 00000000=256

 

mas como o programa soh vai ler o conteudo do endereço 0x5000, repare que todos os bits estão desligados e então o valor é igual a 0

 

CASO O O TAMANHO DA VARIAVEL DO SOUL NO CLINETE SEJA MAIOR QUE BYTE O PROBLEMA ESTA NO OT SERVER

 

Deve ser isso gente...

Editado por joinu
Link para o comentário
Compartilhar em outros sites

  • 4 years later...
  • 3 months later...

O tópico foi fechado e movido para lixeira por estar inativo a mais de 10 dias. Caso seja preciso reabrir o mesmo, favor entrar em contato com a equipe.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...