Есть ли способ получить все виды типов данных? - PullRequest
0 голосов
/ 17 января 2019

Меня попросили написать код, который получает тип данных, не уточняя, какой тип (например, int, float, double ect ..) и, конечно же, его число. Код прост, найдите число в массиве и верните его местоположение в массиве. Это код, который я написал:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int findselectnum(int num, int array[], int size)
{
    int i = 0;
    for (i = 0; i <= size; i++)
    {
        if (num == array[i])
            return i;
    }
    return EOF;
}
int main()
{
    int array[] = { 1, 3, 5, 10, 88, 21, 100, 77, 0, 11, 2 }, num = 0, result = 0, size = 0;
    printf("Enter a number you wish to find\n");
    scanf("%d", &num);
    size = sizeof(array);
    result = findselectnum(num, array, size);
    if (result != EOF)
        printf("The number %d is in array[%d]\n", num, result);
    else
        printf("The number does not exists on the array");
}

Как видите, я могу использовать только тип int, поэтому числа с плавающей или двойной точностью не получат одинаковый результат. Итак, как я могу использовать все типы данных? Есть ли какая-то структура для этого? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Меня попросили написать код, который получает тип данных, не уточняя, какой тип (например, int, float, double ect ..) и, конечно, его число.

Так, как я могу использовать все типы данных?

Ты не можешь. Точнее говоря, сам процессор не может. Чтобы сравнить 2 числа, ЦП должен знать, какой размер у чисел, если числа целочисленные или с плавающей запятой, и (если это не просто сравнение на равенство), если число подписано или нет.

Есть 3 способа обойти это:

a) Дублирование кода (включая шаблоны в C ++, где компилятор автоматически генерирует N версий кода для N типов и использование макросов в C для аналогичных действий).

b) Поддерживает только самый большой тип (например, возможно double в C) и преобразует все в самый большой тип, так что вам нужна только одна функция для одного типа.

c) злоупотреблять переменными аргументами и иметь ветви времени выполнения, основанные на аргументе «что это за тип» (и повышенный риск ошибок программиста); как int findselectnum(char *data_type, int size, ...). В основном это заканчивается скрытым дублированием кода (например, вы дублируете цикл в каждом case из switch(data_type)).

В зависимости от реальной ситуации; Я бы использовал смесь первых двух вариантов - например, выясните, почему программное обеспечение было так плохо спроектировано, что оно должно выполнять одну и ту же работу с несколькими различными типами, а затем попытайтесь изменить дизайн, чтобы ему нужно было заботиться только о небольшом количестве различных типов; затем иметь небольшое количество различных функций для типов, которые «неизбежно необходимы» (например, может быть int findselectnum_int(int num, int array[], int size) и отдельный int findselectnum_double(double num, double array[], int size); ничего для float или short или чего-либо еще, потому что их можно было избежать).

0 голосов
/ 17 января 2019

Вы можете использовать тип void * вместо типа int [].

Это тип, используемый функцией memcpy (), чтобы он мог копировать данные любого типа.

Затем вы должны привести свой аргумент void *, чтобы сравнить его с переменной нужного вам типа.

Лично я бы не использовал C для выполнения такого рода задач.

C ++, возможно, немного более уместен, так как изначально обрабатывает такие механизмы (шаблоны): https://en.wikipedia.org/wiki/Template_(C%2B%2B)

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