Joinu 19 Postado Fevereiro 9, 2011 Share Postado Fevereiro 9, 2011 (editado) 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 Fevereiro 9, 2011 por joinu Link para o comentário Compartilhar em outros sites More sharing options...
Furabio 257 Postado Abril 8, 2015 Share Postado Abril 8, 2015 Movido para a área correta. Link para o comentário Compartilhar em outros sites More sharing options...
Bruno 535 Postado Julho 14, 2015 Share Postado Julho 14, 2015 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 More sharing options...
Posts Recomendados