Как правильно использовать макросы для функций? - PullRequest
0 голосов
/ 21 января 2019

У меня есть массив с числами.Три вида числа (float, double и т. Д.), И когда я ищу конкретное число, оно должно возвращать / показывать местоположение в массиве этого числа.

Так что идея в том, что ямог бы поместить числа как -3, 1.25 в массив, не определяя определенно тип массива, так как мне нужно получить любое число.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define finder(find_num, array,type,format)\
void find_num(type array[], type ,int size)\
{\
    int location = 0, i;\
    for (i = 0; i < size; i++)\
    {\
        location++;\
        if (array[i] == num)\
            break;\
    }\
    if (location != arry[0]\
        printf("Location of the number is at %d place\n", result);\
    else\
        printf("Location of number not found\n");\
}

finder(funcfind, int array[], int %d\t, int %d\t);
finder(funcfind, int array[] ,double %f, int %d\t)

int main()
{
    int array[] = { 5,6,7,88,12,3,20 }, result = 0, num = 0, size = 0;
    size = sizeof(array);
    scanf("%d", &num);
    funcfind(array, num, size);
}

Мне нужно использовать макросы для этого упражнения, но я получаюзастрял на функции finder и funcfind, откуда происходит большинство моих ошибок.

** ОБНОВЛЕНИЕ:

#include <stdio.h>
#include <stdlib.h>
#define finder(find_num, array ,type ,format)\
void find_num(type array[], type num,int size)\
{\
    int location = 0, i;\
    for (i = 0; i < size; i++)\
    {\
        location++;\
        if (array[i] == num)\
            break;\
    }\
    if (location != array[0])\
        printf("Location of the number is at %d place\n", location);\
    else\
        printf("Location of number not found\n");\
}

finder(funcfind, array, double, int %d\t);
finder(funcfind, array, int, int %d\t);
finder(funcfind, array, float, int %d\t);

int main()
{
    int array[] = { 5,6,7,-3,1.5,3,20 }, num = 0, size = 0;
    size = sizeof(array) / sizeof(array[0]);
    scanf("%d", &num);
    funcfind(array, num, size);
}

Работает, но некоторые числа, такие как -3 и 1,5,не работает

Ответы [ 2 ]

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

Ваше определение макроса не определено правильно. Вы также используете его для определения двух функций с одинаковыми, что не разрешено.

Это:

finder(funcfind, int array[], int %d\t, int %d\t);

Расширяется до:

void funcfind(int %d\t int array[][], int %d\t, int size)
...

А это:

finder(funcfind, int array[] ,double %f, int %d\t)

К этому:

void funcfind(double %f int array[][], double %f, int size)
...

Неверный синтаксис.

Определите макрос следующим образом, чтобы создать отдельную функцию для каждого типа, затем вы можете использовать _Generic, чтобы выбрать, какую функцию вызывать:

#include <stdio.h>
#include <stdlib.h>

#define finder_impl(type)\
void find_ ## type(type array[], type num, int size)\
{\
    int location = 0, i;\
    for (i = 0; i < size; i++)\
    {\
        location++;\
        if (array[i] == num)\
            break;\
    }\
    if (location < size)\
        printf("Location of the number is at %d place\n", location);\
    else\
        printf("Location of number not found\n");\
}

finder_impl(int)
finder_impl(double)

#define findfunc(array, num, type) \
    _Generic ((num), \
              int: find_int,\
              double: find_double\
             )(array, num, type)

int main()
{
    int array[] = { 5,6,7,88,12,3,20 }, num;
    int size;
    size = sizeof(array) / sizeof(array[0]);
    scanf("%d", &num);
    findfunc(array, num, size);

    double array2[] = { 2.5, 4, 3.25, 7 }, num2;
    size = sizeof(array) / sizeof(array[0]);
    scanf("%lf", &num2);
    findfunc(array2, num2, size);
}
0 голосов
/ 21 января 2019

Если я передам предварительную обработку (gcc -E), результат будет:

void funcfind(int %d\t int array[][], int %d\t ,int size){ int location = 0, i; for (i = 0; i < size; i++) { location++; if (int array[][i] == num) break; } if (location != arry[0] printf("Location of the number is at %d place\n", result); else printf("Location of number not found\n");};
void funcfind(double %f int array[][], double %f ,int size){ int location = 0, i; for (i = 0; i < size; i++) { location++; if (int array[][i] == num) break; } if (location != arry[0] printf("Location of the number is at %d place\n", result); else printf("Location of number not found\n");}

тип равен int %d\t, поэтому первый параметр неверен, почему, например, int %d, а не int v?

потому что трудно угадать, чего вы хотите, я позволю вам продолжать исправлять проблемы

в любом случае в макросе - void find_num(type array[], type ,int size) странно и, возможно, должно быть void find_num(type array[], type num,int size), а звонки void find_num(type array[], type ,int size); и finder(funcfind, array ,double, int %d\t) - if (location != arry[0]\ должно быть if (location != array[0])\

, что дает:

void funcfind(int array[], int num ,int size){ int location = 0, i; for (i = 0; i < size; i++) { location++; if (array[i] == num) break; } if (location != array[0]) printf("Location of the number is at %d place\n", result); else printf("Location of number not found\n");};
void funcfind(double array[], double num ,int size){ int location = 0, i; for (i = 0; i < size; i++) { location++; if (array[i] == num) break; } if (location != array[0]) printf("Location of the number is at %d place\n", result); else printf("Location of number not found\n");}

если я сделаю отступ первой функции:

void funcfind(int array[], int num ,int size){
  int location = 0, i;
  for (i = 0; i < size; i++) {
    location++;
    if (array[i] == num)
      break;
  }
  if (location != array[0])
    printf("Location of the number is at %d place\n", result); 
  else
    printf("Location of number not found\n");
};

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

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