Ошибка C при использовании констант enum - PullRequest
0 голосов
/ 19 марта 2012

Я хочу написать функцию, которая будет принимать строку, которая представляет шестнадцатеричное число и преобразует ее в целое число, я хочу поместить шестнадцатеричные цифры в перечисление, но когда я использую элемент из перечисления, я получаю ошибкуво время компиляции.

Вот код:

#include <stdio.h>

int htoi (char h[]);
enum HexDigits {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F};

int main () {
    enum HexDigits h = 9;

    return 0;
}

int htoi (char h[]) {

}

и вот ошибка, которую я получаю:

C: \ Users \ KiKo-SaMa \ Desktop\ C> gcc hello.c -o hello

hello.c: 4: 17: ошибка: ожидаемый идентификатор перед числовой константой

В чем может быть проблема с тем, что яделать?

Ответы [ 5 ]

4 голосов
/ 19 марта 2012

Что делает перечисление, так это присваивает символические имена тому, что по существу является целым числом, по умолчанию начиная с индекса 0. Например;

enum BoolValue { FALSE, UNKNOWN, TRUE };

по существу делает что-то близкое к;

const int FALSE   = 0;
const int UNKNOWN = 1;
const int TRUE    = 2;

Ваша проблема в том, что вы пытаетесь поместить числа в ваше перечисление вместо символических имен, что имеет смысл, если вы перепишете его по существу;

const int 0 = 0;
const int 1 = 1;

... и т.д..

Я не уверен, что enum - это решение проблемы, которую вы пытаетесь решить.

4 голосов
/ 19 марта 2012

Неправильно использовать такое определение перечисления, оно должно выглядеть следующим образом:

enum Hex
    {       
        ZERO = 0,
        ONE = 1,
        A = 10,
        B = 11,
    };

, если ваша проблема заключается в преобразовании строки в int с использованием atoi

3 голосов
/ 19 марта 2012

Члены перечисления должны быть названы, и их имена (как и любое другое имя) не могут начинаться с цифры. Если вы хотите использовать цифры, вы должны добавить что-то впереди, например, буква или подчеркивание (например, H0 или _0).

Кроме того, в качестве дополнительного предложения гораздо проще просто добавить действительные символы в строку и затем использовать strchr() для преобразования:

const char *hexchars = "0123456789ABCDEF";

// this takes a single hex character and returns its decimal representation (or -1 in case of an invalid character)
int hex_to_dec(char h) { return strchr(hexchars, h) ? strchr(hexchars, h) - hexchars : -1; }

Также обратите внимание, что вы также можете просто использовать шестнадцатеричное представление числовых констант: 0x0, 0x1, ... 0xF.

2 голосов
/ 19 марта 2012

Используйте strtol() для преобразования строк из любой числовой базы 2-36.

strtol(const char *nptr, char **endptr, int base)

База 0 - это особый случай, который принимает префикс "0x" для базы 16 "Префикс 0 "для 8, и не префикс для 10.

char a[5]="0x0a";
char b[3]="0b";
printf ("%li\n",strtol(a,NULL,0));
printf ("%li\n",strtol(b,NULL,16));

Более подробные примеры с проверкой ошибок см. На справочной странице .

1 голос
/ 19 марта 2012
enum HexDigits h = 9; // assigning numerical 9 or enum variable

9 в этом случае может быть взято как числовое 9, а '9' в перечислении HexDigits.

Переменные, используемые внутри определения enum, должны соответствовать соглашениям об именах переменных языка. Допустимы только допустимые имена переменных.

Но почему вы должны определять enum ?? Разве с ++ не поддерживает шестнадцатеричные числа самостоятельно?

проверить enum на странице MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...