Проблема C ++, связанная с ENUM.Ответ, который я получаю, больше, чем список Enum - PullRequest
0 голосов
/ 11 октября 2018

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

код:

VIDYO_CLIENT_LOG_INFO_FORMATTED("GuiOnOutEvent NDKMETHOD License Error: errorid=%d vmConnectionPath=%d OutOfLicense=%d Result=%d Fault=%d", error, vmConnectionPath, OutOfLicenses, eventLicense->result, eventLicense->fault);

Что меня интересует, так это событие eventLicense-> result, или "Result ="% d "Это то, что я получаю:

GuiOnOutEvent NDKMETHOD License Error: errorid=0 vmConnectionPath=1 OutOfLicense=1 Result=26 Fault=0 [ VidyoClientVcsoapThread_3, <unknown func>, app/src/main/jni/ndkVidyoSample.c:62 ]

Как видите, результат: 26. Но мой Enum выглядит следующим образом:

typedef enum VidyoClientSoapResultCode_
{
VIDYO_CLIENT_SOAP_RESULT_FAILURE,               /*!< Result is some unknown general failure */
VIDYO_CLIENT_SOAP_RESULT_SUCCESS,               /*!< Result is success */
VIDYO_CLIENT_SOAP_RESULT_NOT_LICENSED,          /*!< Not licensed */
VIDYO_CLIENT_SOAP_RESULT_SEAT_LICENSE_EXPIRED,  /*!< Seat license expired */
VIDYO_CLIENT_SOAP_RESULT_WRONG_PIN,             /*!< Wrong PIN */
VIDYO_CLIENT_SOAP_RESULT_CONFERENCE_LOCKED,     /*!< Conference locked */
VIDYO_CLIENT_SOAP_RESULT_ROOM_DISABLED,         /*!< Room disabled */
VIDYO_CLIENT_SOAP_RESULT_GENERAL_FAULT,         /*!< General Fault */
VIDYO_CLIENT_SOAP_RESULT_INVALID_ARGUMENT_FAULT,/*!< Invalid argument fault */
VIDYO_CLIENT_SOAP_RESULT_MEMBER_NOT_ONLINE,     /*!< Status of member is not online */
VIDYO_CLIENT_SOAP_RESULT_NOT_OWNER_OF_ROOM,     /*!< Not owner of room */
VIDYO_CLIENT_SOAP_RESULT_USER_NOT_FOUND,        /*!< Specified user is not found */
VIDYO_CLIENT_SOAP_RESULT_UNEXPECTED_SUBELEMENT_IN_MESSAGE,  /*!< Unexpected sub element in SOAP message */
VIDYO_CLIENT_SOAP_RESULT_END_POINT_NOT_FOUND,   /*!< Endpoint not found */
VIDYO_CLIENT_SOAP_RESULT_FAILED_PLACE_DIRECT_CALL, /*!< Failed to place a direct call */
VIDYO_CLIENT_SOAP_RESULT_IPC_JOIN_FAILURE,      /*!< Failure to join room on other portal */
VIDYO_CLIENT_SOAP_RESULT_ALL_LINES_IN_USE,      /*!< All lines are in use */
} VidyoClientSoapResultCode;

Мой Enum несодержит 26 элементов, поэтому я не знаю, что это за ошибка.Как я могу проверить это?

РЕДАКТИРОВАТЬ:

Я изменил свой журнал, чтобы показать это:

 VidyoClientSoapResultCode result = eventLicense->result;
 VidyoClientSoapFault fault = eventLicense->fault;
 VIDYO_CLIENT_LOG_INFO_FORMATTED("GuiOnOutEvent NDKMETHOD License Error: errorid=%d vmConnectionPath=%d OutOfLicense=%d Result=%d Fault=%d", error, vmConnectionPath, OutOfLicenses, result, fault);

Просто чтобы быть уверенным, что я создаю объекты для них перед входом в систему какдесятичная дробьТеперь, насколько я знаю, для ENUM десятичный - это способ записи, правильно?Но все же, теперь я получаю еще более странный ответ:

10-11 08:34:43.954: I/VidyoClinetLib(7103): 10-11 08:34:43.965 INFO  AppGui        GuiOnOutEvent NDKMETHOD License Error: errorid=0 vmConnectionPath=1 OutOfLicense=1 Result=21324 Fault=32 [ VidyoClientVcsoapThread_3, <unknown func>, app/src/main/jni/ndkVidyoSample.c:64 ]

Может быть, эти новые данные помогут?Я имею в виду 21324 выглядит странно, но он постоянен, теперь каждый раз при ошибке я получаю это.Но это точно не в 0:31, как сказал Олив

Увидев комментарии Демосфена, я записал все значения ENUM, и в действительности они равны 0-16.(17 элементов).Так что все еще немного сбит с толку, может я не правильно вхожу в систему?

1 Ответ

0 голосов
/ 11 октября 2018

Обычно перечисления действительно инициализируются, начиная с 0 и увеличиваясь на 1 (если не указано явно).Не уверен, что это обязательное поведение для компилятора, но на большинстве систем он, безусловно, будет работать таким образом.

Вот несколько советов, как вы можете отлаживать:

  1. Определите значения перечисленияв явном виде, т. е. =0, =1 и т. д. Если вы по-прежнему получаете значение «за пределами», то вызываемая вами функция имеет ошибку и действительно возвращает значение «за пределами».Если нет, то, видимо, компилятор не инициализируется с 0,1, ...
  2. Рассмотрите возможность переключения на безопасный для типов вариант C ++ (из C ++ 11): enum class.Компилятор выдаст вам ошибку всякий раз, когда вы конвертируете между типом и int без явного static_cast, также просто используя имя константы enum (без пространства имен), вы получите ошибку.В случае, если происходит какая-то странная арифметика, компилятор скажет вам, и как только вы исправите все ошибки компиляции (и, если вы введете приведение типов, подумаете о них), ваш код, скорее всего, будет работать правильно.
...