Определить, сохранить и распечатать все целые числа в заданном диапазоне - PullRequest
0 голосов
/ 24 марта 2012

Вот что я сделал:

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

int betweenArray(int a, int b){
    int *arr,i,range;
    range = b - a + 1;
    arr = (int *)malloc(range*sizeof(int));
    for(i=0;i<range;i++){
        arr[i] = a++;
    }
return * arr;

int main (int argc, const char * argv[]) {
    int a,b,i;
    int range;

    printf("Give numbers: ");
    scanf("%d %d",&a,&b);
    range = b - a + 1;


    for(i=0;i<range;i++)
        printf("%d\n",betweenArray(a,b)); 
    return 0;
}

Поэтому, когда я запускаю это и приводлю в качестве аргументов, например, 2 и 5, я получаю в результате: 2 2 2 2 вместо 2 3 4 5. Я не могу найти, где я допустил ошибку.

Ответы [ 4 ]

1 голос
/ 24 марта 2012

Проблема в том, что вы вычисляете последовательность, но вы возвращаете только ее первое число.

Возвращаемое значение betweenArray равно int вместо int *, и вы делаете return * arr; вместо return arr;.После исправления этого в main вам нужно будет сделать:

int *sequence = betweenArray(a,b);
for (i=0;i<range;i++)
    printf("%d", sequence[i];

Но было бы лучше, если бы функция возвращала массив и количество элементов в нем, например, так:

int *betweenArray(int a, int b, int *numElements){
    int *arr,i,range;
    range = b - a + 1;
    arr = (int *)malloc(range*sizeof(int));
    for(i=0;i<range;i++){
        arr[i] = a++;
    }
    if (numElements) {
        *numElements = range;
    }
    return arr;
}

int main (int argc, const char * argv[]) {
    int a,b,i;
    int *sequence;
    int range;

    printf("Give numbers: ");
    scanf("%d %d",&a,&b);

    sequence = betweenArray(a,b,&range);

    for(i=0;i<range;i++)
        printf("%d\n",sequence[i]);

    free(sequence); // Be nice, clean up.
    return 0;
}
1 голос
/ 24 марта 2012

Этот код страдает от множества проблем, все из-за единственного неправильного понимания указателей и их связи с массивами в C.

  • Ваш betweenArray должен возвращаться int*, а не int
  • Следовательно, вы не должны разыменовывать arr на обратной линии
  • Вы должны вызвать betweenArray один раз и сохранить его результат, а не вызывать его в цикле
  • Вам нужно позвонить free на результат, возвращенный с betweenArray
0 голосов
/ 24 марта 2012

Ваша функция возвращает первый элемент массива, который идентичен 'a'. На самом деле, я совершенно запутался в том, что ты хочешь здесь делать. Контекст, который вы используете дляweenArray (), является итератором, что невозможно в C напрямую.

Если вы хотите сделать это с помощью итератора, вы должны использовать три функции: 1), которая создает его (вероятно, как распределение структуры и значений настроек), 2) получение следующего значения из него или конца маркера, 3) deinit и DEALLOCATE.

OTOH это очень просто сделать с циклом 'for'.

0 голосов
/ 24 марта 2012

Вы вызываете между Array () с одинаковыми параметрами, которые не меняются для разных прогонов цикла for - таким образом, вы всегда получите один и тот же результат. Вам нужно будет либо вызвать между Array () с индексом, либо вызвать его один раз и вернуть массив.

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