Проблема с функцией, которая обеспечивает диапазон чисел (C). Почему? - PullRequest
2 голосов
/ 10 апреля 2020

Я создал функцию, которая предоставляет диапазон чисел, основанный на одном числе, и количество цифр, которое вы хотите получить, которые находятся за пределами номера (я знаю, что это объяснение было немного расплывчатым, поэтому здесь пример):

Number of origin: 10
Number of numbers to count away from the origin: 5
Output:
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

Так вот код:

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

void plusMinus(int*change, int num, int funcTo){

    int range = funcTo * 2;
    int start = num - funcTo;
    int i;
    for (i=0; i<=range; i++){
        change[i] = start + i;
    }
}

int main()
{
    int* pointer;
    plusMinus(&pointer, 250, 5);
    int x;
    for (x=0; x<=10; x++){
        printf("%d\n", &pointer[x]);
    }
    return 0;
}

, а вот требуемый вывод:

245
246
247
248
249
250
251
252
253
254
255

и Вот текущий вывод:

245
249
253
257
261
265
269
273
277
281
285

Код также возвращает два предупреждения, но я понятия не имею, что они означают. Вот первый:

warning: passing argument 1 of 'plusMinus' from incompatible pointer type [-Wincompatible-pointer-types]

, а вот второй:

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]

1 Ответ

0 голосов
/ 10 апреля 2020

Первый параметр функции имеет тип int *

void plusMinus(int*change, int num, int funcTo){

, но вы передаете аргумент типа int **

int* pointer;
plusMinus(&pointer, 250, 5);

Кроме того, указатель pointer равен неинициализирован и имеет неопределенное значение. В результате программа имеет неопределенное поведение.

В этом вызове printf

printf("%d\n", &pointer[x]);

спецификатор преобразования %d ожидает объект типа int во время передачи объект типа int *.

Вот ваша обновленная программа

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    int range = 2 * funcTo + 1;
    int start = num - funcTo;

    for ( int i = 0; i <range; i++ )
    {
        a[i] = start + i;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

Его вывод

245 246 247 248 249 250 251 252 253 254 255 

Более интересно написать функцию как рекурсивная функция.

Вот и вы.

#include <stdio.h>

void plusMinus( int *a, int num, int funcTo )
{
    a[0] = num - funcTo;

    if ( funcTo ) 
    {
        plusMinus( a + 1, num, funcTo - 1 );

        a[2 * funcTo] = num + funcTo;
    }
}

int main(void) 
{
    int funcTo = 5;
    int a[2 * funcTo + 1];

    plusMinus( a, 250, funcTo );

    for ( int i = 0; i  < 2 * funcTo + 1; i++ )
    {
        printf( "%d ",  a[i] );
    }
    putchar( '\n' );

    return 0;
}

Вывод программы такой же, как показано выше.

245 246 247 248 249 250 251 252 253 254 255 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...