Это не как «Как смешанный тип данных (int, float, char и т. Д.) Должен храниться в массиве?» вопрос внимательно прочитайте пожалуйста! Предположим, у меня есть следующий пустой указатель, то я не знаю, что это тип до выполнения:Как нарисовать указатель void во время выполнения на C, таким образом, который можно использовать в остальном коде?
void* data;
теперь я знаю, что я могу сделать следующее, когда я знаю, тип data
(например int
):
int typed_data = *(int*)data;
используя switch case
заявление, которое я мог бы проверить переменную, чтобы определить, какие ввергнуть выполнять:
switch(type_id) {
case INT:
int typed_data = *(int*)data;
break;
case FLOAT:
float typed_data = *(float*)data;
break;
// ...
// etc.
}
Но, таким образом, я не смогу получить доступ к typed_data за пределами блока switch, рассмотрим приведенный ниже funstion в качестве примера; Она принимает два недействительных указателей, и в соответствии со значением type_id
, он бросает s
и x
исправить типы данных, а затем делает другие вещи с недавно определенными типизированными данными:
int sequential_seach(int n, void* s, void* x, type_id) {
int location = 0;
switch(type_id) {
case INT:
int *list = s;
int element = *(int*)x;
break;
case FLOAT:
float *list = s;
float element = *(float*)x;
break;
// ...
// etc.
}
while(location < n && list[location] != element) { // <---This will cause a compile error
location++;
if(location > n - 1) {
location = -1;
}
}
return location;
}
В приведенных выше функциях location
и list
не доступен за пределами swtich
блока, даже если type_id соответствует одному из case
значений и они были определены, они все еще находятся вне сферы, вне switch
блока, поэтому, когда компилятор достигает линию while
проживает, он жалуется, что location
и list
не определены. Но эти типизированные переменные необходимы для функции. Итак, как это решить? следует ли скопировать код while
в каждый case
? Это не выглядит очень хорошим решением. Что делать, если у меня был более длинный код, который нуждался в этих переменных в 100 разных местах?
Похоже, вы хотите другой язык. –
Будет ли «профсоюз» работать на вас? Вы можете сохранить структуру, которая представляет собой пару типов и объединение, которое позволяет вам обращаться к нему как к любому из возможных типов. –
Почему вы это пытаетесь? [tag: c] не подходит для такой системы динамического типа, вы можете попробовать другой язык или другой подход для решения проблемы. Кроме того, как уже упоминалось, «союз» может быть лучшим выбором. Разделение указателей, подобных этому, очень опасно, потому что вы потенциально вызываете неопределенное поведение. –