Как вернуть массив из функции и пройти через него? - PullRequest
1 голос
/ 08 мая 2011
#include <iostream>

int* fib(int);

int main()
{
    int count;
    std::cout<<"enter number up to which fibonacci series is to be printed"<<std::endl;
    std::cin>>count;
    int *p=new int[count];
    p=fib(count);
    int i;
    for(i<0;i<=count;i++)
        std::cout<<p[i]<<std::endl;
    return 0;
}

int* fib(int d)
{
    int *ar=new int[d];
    int p=-1,q=1,r;
    int j;
    for(j=0;j<=d;j++)
    {
        r=p+q;
        ar[j]=r;
        p=q;
        q=r;
    }
    return ar;
    delete ar;
}

Почему я не могу напечатать весь массив рядов Фибоначчи таким образом?

Ответы [ 7 ]

4 голосов
/ 08 мая 2011

Несколько проблем с вашим кодом

for(i<0;i<=count;i++)

должно быть

for(i=0;i<count;i++)

и

for(j=0;j<=d;j++)

должно читаться

for(j=0;j<d;j++)

И удалите строку

delete ar;

, поскольку она не оказывает никакого влияния после оператора return.Кроме того, вы можете избавиться от инстанцирования

int *p=new int[count];

в main(), поскольку это делается и в вашей функции fib.В таком виде вы теряете только что выделенную память.

2 голосов
/ 08 мая 2011

Ваш я не инициализирован. Вместо того, чтобы сделать его i = 0, вы делаете i <0. И в цикле j максимальное число должно быть d. Так что J <D. Не j <= d. </p>

1 голос
/ 12 июля 2011

Вот пример ряда Фибоначчи, и я начал свою работу с a [0] = 1 и a [1] = 1. Ряд Фибоначчи обычно начинается с 0 и 1, но моя начинается с 1 и 1.

# include "stdafx.h" #include <iostream>

с использованием пространства имен std;

int main()
{
    int a[25];
    int i,j;
    int fib[25];
    int fibs;
    char z;

    a[0] = 1;
    a[1] = 1;


        fib[1] = a[0];
        fib[2] = a[1];
        fibs = 0;

    for ( i=2; i<25; i++ )
    {
        fibs = fib[1] + fib[2];
        fib[1] = fib[2];
        fib[2] = fibs;
        a[i] = fibs;
    }

    for(i=0; i<25; i++)
    {
        cout << "a[" << i << "]=" << a[i] << endl;  
    }
1 голос
/ 08 мая 2011

Проблема именно здесь:

int i;
for(i<0;i<=count;i++)
    std::cout<<p[i]<<std::endl;

Вы не присваиваете мне никакого начального значения.Измените его на:

for (int i = 0; i < count; i++)
    std::cout << p[i] << std::endl;
1 голос
/ 08 мая 2011

Вы выделяете один элемент слишком мало.Ваш код для удаления ar никогда не запускается, потому что он следует за возвратом.Вы также пропускаете p, потому что перезаписываете указатель, возвращенный fib().

На вашем месте я бы, вероятно, передал p в fib() и получил бы fib() для заполнения массива.

void fib(int n, int p[])
{
    p[0] = 1;
    p[1] = 1;
    for (int i=2; i<=n; i++)
        p[i] = p[i-2]+p[i-1];
}

Очевидно, что этот код требует n>=2, но я оставлю проверку ошибок в качестве упражнения для читателя!

Для вызова этого кода используйте такой код:

int p[] = new int[count];
fib(count, p);

Если вы хотите распечатать значения между i1 и i2, скажем, сделайте это так:

for (int i=i1, i<=i2, i++)
    std::cout<<p[i]<<std::endl;

Поскольку вы используете C ++, весь этот код будет проще с векторным классом C ++.

0 голосов
/ 08 мая 2011

Во-первых, вам не нужно выделять int *p=new int[count]; внутри main, потому что вы получите из функции fib указатель на уже выделенную память.

Во-вторых, все, что находится после оператора return, является недоступным кодом, поэтому вы можете удалить его или переместить до return.

Кроме того, если вы удалите массив внутри функции fib, вы вернете нулевой указатель.

И главная проблема в:

for(i<0;i<=count;i++)

кого правильно исправить:

for(i = 0; i <= count; i++)
0 голосов
/ 08 мая 2011

Одной из проблем является то, что вы выделяете массив на один элемент слишком коротким. Параметр в new[] - это количество элементов, не самый высокий индекс.

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

...