перечислимые типы данных и gcc - PullRequest
0 голосов
/ 05 марта 2009

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

Пример кода:

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
    }
}

enum {

    UNDEFINED = -1,
    STATE_NICE,
    STATE_GREEDY
} E_STATE;

int main (int argc, char *argv [])
{
    somefun (STATE_NICE);
}

Ответы [ 5 ]

1 голос
/ 05 марта 2009

На самом деле работает для меня:

bash $ cat bar.c
#include <stdio.h>

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
      default:
        printf("Hello?\n");
    }
}

int main (int argc, char *argv [])
{
    enum {

        UNDEFINED = -1,
        STATE_NICE,
        STATE_GREEDY
    } E_STATE;

    somefun (STATE_NICE);
    return 0;
}
bash $ gcc -Wall bar.c -o bar
bar.c: In function 'main':
bar.c:22: warning: unused variable 'E_STATE'
bash $ ./bar
Hello?
bash $ 

Сделал пару изменений, но без них. (1) добавил тег в коммутатор, чтобы он имел что-то; (2) добавили #include <stdio.h> и printf, чтобы я мог сказать, что он запущен; (3) добавлен return 0; для устранения неинтересного предупреждения.

Он успешно работал без изменений, просто ничего не видно.

Итак, что такое ОС, какова аппаратная архитектура?

Обновление

Код изменился, пока я его пробовал, поэтому вот тест обновленной версии:

bash $ cat bar-prime.c
#include <stdio.h>

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
      default:
        printf("Hello?\n");
    }
}

enum {

    UNDEFINED = -1,
    STATE_NICE,
    STATE_GREEDY
} E_STATE;


int main (int argc, char *argv [])
{

    somefun (STATE_NICE);
    return 0;
}
bash $ gcc -Wall bar-prime.c -o bar-prime && ./bar-prime
Hello?
bash $ 

Все еще работает. Вы получаете основной файл в вашей версии? Вы пытались получить трассировку стека?

1 голос
/ 05 марта 2009

Я скомпилировал и выполнил этот код точно (вырезал и вставил) на своем компьютере, используя gcc версии 4.2.4, без ошибок или ошибок сегментации. Я полагаю, что проблема может быть где-то еще.

1 голос
/ 05 марта 2009

Во-первых, перечисление определено в main () и не существует для somefun (). Вы должны определить enum вне main, хотя я не вижу, как это вызывает сбой.

После определения enum вне main вы должны определить somefun как somefun (E_STATE nState) и протестировать снова.

0 голосов
/ 09 марта 2009

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

0 голосов
/ 05 марта 2009

Ваша ситуация похожа на аппаратное обеспечение Sun Sparc или подобное. Пожалуйста, отправьте uname -a и вывод dmesg

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