l'expression n'a pas évalué à une constante - c ++
J'ai écrit le code suivant pour la conversion d'un nombre décimal de base2.
pas le meilleur sans doute, mais il a travaillé sur eclipse.
cependant, lorsque j'essaie de le lancer sur visual studio, j'obtiens ce message d'erreur sur la ligne 10 (souligné): "expression n'a pas d'évaluer à une constante".
Pourquoi est-ce?
long base2(int number) {
int remainder, sizeOfRetNum, isNegative = 0;
if (number<0)
isNegative = 1;
int temp = number;
while (temp != 0) {
sizeOfRetNum++;
temp = temp / 2;
}
char ansString[sizeOfRetNum]; //********line 10********
int j = sizeOfRetNum - 1;
while (number != 0) {
remainder = number % 2;
number = number / 2;
if (remainder == 0)
ansString[j] = '0';
else
ansString[j] = '1';
j--;
}
long ansNum = atol(ansString);
if (isNegative == 1)
ansNum = -ansNum;
return ansNum;
}
source d'informationauteur John
Vous devez vous connecter pour publier un commentaire.
Est un De Longueur Variable Tableau et n'est pas standard en C++. Certains compilateurs comme GCC autoriser une prorogation, mais MSVS ne compilera pas.
Afin d'obtenir un tableau dynamique, vous aurez besoin d'utiliser un pointeur et
new
Ou, mieux encore, de retravailler la fonction à utiliser un
std::string
qui s'occupe de la gestion de la mémoire pour vous.sizeOfRetNum
n'est pas une valeur constante - en d'autres termes, sa valeur n'est pas connue au moment de la compilation.Lorsque vous souhaitez allouer de la mémoire et ne connaissent pas la valeur jusqu'à l'exécution, vous devez utiliser l'allocation dynamique de la mémoire. Ceci est fait en C++ avec
operator new
. Le mémoire que vous allouez-vous avecnew
aussi besoin d'être libérée avecdelete
oudelete[]
.Changement
char ansString[sizeOfRetNum];
àchar * ansString = new char[sizeOfRetNum];
. N'oubliez pas d'appelerdelete [] ansString;
avant le retour de fonction, ou vous avez une fuite de mémoire.