No passado, quando eu fazia GMs de RPG, deparei-me vбrias vezes com esse problema e nгo encontrei uma maneira de resolvк-lo. Eu sempre acabava verificando, no cуdigo da enumeraзгo, o tamanho da array constante quando precisava dele
.
O problema em questгo consiste basicamente em obter, por um mйtodo como o do
sizeof, o tamanho de uma array constante de uma enumeraзгo, como a array
Segunda deste cуdigo:
pawn Код:
enum Constantes
{
Primeira,
Segunda[45],
Terceira[30]
};
new Array[10][Constantes];
Por mais que nгo aparente, nгo й possнvel obter apenas com
sizeof o tamanho da array
Segunda, que й 45
.
A expressгo
sizeof(Array), sintaticamente correta, resultaria em 10, o tamanho da primeira dimensгo da array
Array. Por sua vez, a expressгo
sizeof(Array[]), tambйm sintaticamente correta, equivaleria a 76, o tamanho da segunda dimensгo de
Array e tamanho total da enumeraзгo, sendo que as constantes
Primeira,
Segunda e
Terceira teriam respectivamente os tamanhos 1, 45 e 30.
Qualquer outra tentativa, como
sizeof(Segunda), geraria erros de compilaзгo ou nгo forneceria o tamanho verdadeiro da array
Segunda .
Estudando a situaзгo, descobri que a expressгo
sizeof(Array[Segunda]) resultava em 45, o tamanho certo, quando a array
Array era declarada desta forma:
Em vez desta
:
pawn Код:
new Array[10][Constantes];
Sendo assim, para o cуdigo original algo como
sizeof(Array[0][Segunda]) ou
sizeof(Array[][Segunda]) resultaria em 45. Isso, porйm, nгo passou de uma expectativa, visto que verifiquei que essas expressхes tambйm geravam erros de compilaзгo.
Percebi que provavelmente havia uma limitaзгo do compilador em relaзгo a aceitar uma sintaxe que funcionasse. A soluзгo que encontrei foi usar uma array intermediбria
:
pawn Код:
enum Constantes
{
Primeira,
Segunda[45],
Terceira[30]
};
new Array[10][Constantes];
new const Buffer[sizeof(Array[])];
#pragma unused Buffer
pawn Код:
printf("Tamanho da array 'Segunda': %d.", sizeof(Buffer[Segunda]));
A minha conclusгo й que se trata de uma incapacidade do compilador, que talvez nгo esteja presente em versхes mais recentes do Pawn com as quais o SA-MP nгo trabalha.
Espero ter ajudado
.