Как я могу изменить одну переменную одного типа в C? - PullRequest
7 голосов
/ 13 мая 2010

Я хочу сделать это:

int main () {
  bla bla bla

  void *onetype;

  switch (USER_INPUT_TYPE) {

      CASE CONVERT_TO_CHAR:
          convert onetype VOID TO CHAR >>> HOW???

      CASE CONVERT_TO_INT:
          convert onetype VOID TO INT >>> HOW???

   LOT OF CASES...
   }
}

Да, я знаю приведение типов, но приведение типов является «временным» изменением.

Итак, есть ли способ сделать это в C?

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

Стоп Стоп Стоп! Пожалуйста, посмотрите, что вы делаете, это приведение типов, я ЗНАЮ ЭТО, вы создаете другую переменную желаемого типа, например int i = (int) onetype, я не хочу этого, я хочу что-то еще, например onetype = (int ) onetype, без воссоздания их, без выделения другой переменной.

Большое спасибо, ребята!

Ответы [ 3 ]

7 голосов
/ 13 мая 2010

То, что вы хотите, это информация о типе во время выполнения - иметь переменную, в которой тип может быть определен только во время выполнения. C НЕ имеет этой функциональности в языке - после компиляции программы типы стираются и существуют только большие двоичные объекты памяти. Динамические языки поддерживают информацию о типах и реализуют ее изначально.

Вы можете разработать свою собственную систему маркировки типов:

typedef union {
int i;
char c;
float f;
} evil;

typedef struct {
  evil value;
  int type;
} tagged_t;

enum {
  TYPE_INT, TYPE_CHAR, TYPE_FLOAT
};

tagged_t bar;
bar.value.c = 'a';
bar.type = TYPE_CHAR;

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

1 голос
/ 13 мая 2010

Похоже, ваш сценарий выглядит следующим образом

  • void* onetype содержит указатель на строго типизированную переменную
  • USER_INPUT_TYPE сообщает тип этой переменной

Если это так, попробуйте следующее

switch (USER_INPUT_TYPE) {
case CONVERT_TO_CHAR:
  char c = *((char*)onetype);
  ...
  break;
case CONVERT_TO_INT:
  int i = *((int*)onetype);
  ...
  break;


}
0 голосов
/ 13 мая 2010
int lolcakes = *(void*)onetype;

Это предполагает, что вы точно знаете, что onetype указывает на int. Использование этого типа кастинга невероятно небезопасно.

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