Movido para a área correta.
- Fórum
- xTibia - Notícias e Suporte
- Soluções
- Archived
- Por Que Não Da Para Fazer Isso Ou Aquilo ?
3
2.1k
4 anos depois...
info
Grupo: Conde
Registrado: 07/04/15
Posts: 962
Reputação: +258
Gênero: Masculino

08 de abril de 2015 às 13:56
3 meses depois...


info
Grupo: Barão
Registrado: 04/08/08
Posts: 213
Reputação: +19
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 por joinu