Передача перечислений по значению referencegarbage, возвращаемому в main

Я создаю функцию проверки для определенного типа данных перечисления. Функция проверки возвращает 0 (ложь) или 1 (истина), если переданная строка действительна. В то же время, если строка действительна, подтип перечисления затем заполняется правильной записью.

Как и код, он правильно заполняет подтип в функции. Я печатаю запись на экране для проверки. Но когда я возвращаюсь к главному (см. ниже), я получаю значение мусора (иногда «11871397»), когда печатаю строку.

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

int val_subscriberType (char str[], const enum ns1__subscriberType *subType )
{
    if (strcmp(upStr, "PREPAID") == 0)
    {
        enum ns1__subscriberType subType = ns1__subscriberType__prepaid;
        printf("SubscriberFunction: %d \n", subType);
        return 1;
     }
     else if (strcmp(upStr, "POSTPAID") == 0)
     {
        enum ns1__subscriberType subType = ns1__subscriberType__postpaid;
        printf("SubscriberFunction: %d \n", subType);
        return 1;
     }    
     return 0;
}

Основной

char *recRetTest = "aggressive";
enum ns1__recurrentRetrySchemaType recRet;
if ( val_recurrentRetrySchemaType (recRetTest, &recRet))
{
    printf ("\nRecurrent Retry Schema main: %d \n", recRet);
}

P.S. Я убрал лишний код, где конвертирую строку в верхний регистр и т.д.


person Matthew McNaughton    schedule 05.11.2010    source источник


Ответы (1)


Ваша основная проблема заключается в том, что вы повторно объявляете subType в ветвях оператора if, который скрывает объявление параметра; короче говоря, вы присваиваете значение объекту, отличному от параметра.

Удалите const в объявлении параметра и перепишите назначения как

if (strcmp(upStr, "PREPAID") == 0)
{
  *subType = ns1__subscriberType__prepaid; 
  ...
person John Bode    schedule 05.11.2010