2011-12-28 23 views
1

まあ、私は少しCにこの冬休みを研究してきたし、私の冒険に私は動的配列で問題につまずきました。動的配列の末尾に値を追加は

それは本当にかなり単純なプログラムです。私がしようとしているのは、フィボナッチシリーズの番号を保持する配列を作成することです。コードは次のとおりです。

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

int dynamic_arry_append(int* arry, int* number, int* size); 

int main() { 

    int i, n, size = 3, *arry = NULL, fibarr[size]; 

    printf("Dynamic array, Fibonacci series. \n"); 
    printf("Capture upto element: "); 
    scanf("%d", &n); 

    i = 0; 
    // passing the first elements 
    fibarr[0] = 0; 
    fibarr[1] = 1; 
    fibarr[2] = 1; 

    while (i < n) { 
     printf("**%d\n",fibarr[0]); 
     dynamic_arry_append(arry, &fibarr[0], &size); 
     fibarr[0] = fibarr[1]; 
     fibarr[1] = fibarr[2]; 
     fibarr[2] = fibarr[1] + fibarr[0]; 
     i++; 
    } 

    for (i = 0 ; i < size ; i++) 
     printf("Element %d of the array: %d.\n", i, arry[i]); 

    return 0; 
} 

int dynamic_arry_append(int* arry, int* number, int* size) { 
    int i; 

    int bacon = *size; // first name i thought of 
    bacon++; 
    int *new_addr = realloc(arry, bacon * sizeof(int)); 

    if(new_addr != NULL) { 
     arry = new_addr; 
     arry[bacon-1] = *number; 
     // printf for easier debugging, or so i thought 
     for (i = 0 ; i < bacon ; i++) 
      printf("%d\t%d\n", i+1, arry[i]); 
     printf("\n"); 
     *size = bacon; 
    } else { 
     printf("Error (re)allocating memory."); 
     exit (1); 
    } 

    return 0; 
} 

少なくとも私の考えでは、しかし、実際に私が面白い結果を得る:

Dynamic array, Fibonacci series. 
Capture upto element: 5 
**0 // next fibonacci number 
1  5256368 
2  5246872 
3  1176530273 
4  0 

**1 
1  5256368 
2  5246872 
3  1768053847 
4  977484654 
5  1 

**1 
1  5256368 
2  5246872 
3  1551066476 
4  1919117645 
5  1718580079 
6  1 

**2 
1  5256368 
2  5246872 
3  977484645 
4  1852397404 
5  1937207140 
6  1937339228 
7  2 

**3 
1  5256368 
2  5246872 
3  1551071087 
4  1953724755 
5  842231141 
6  1700943708 
7  977484653 
8  3 

/* Code::Blocks output */ 
Process returned -1073741819 (0xC0000005) execution time : 17.886 s 
Press any key to continue. 

私は本当にこのエラーに困惑していて、周りに検索した後、私は何の解決策を見つけていない...誰が助けることはできますか?どうもありがとうございました。

+0

エラーは何ですか? 'のprintf( "ARRYの値:%のp \ nを"、(void *型)ARRY)あなたはarry''の値が印刷してみてくださいdynamic_arry_append' 'を呼び出す前に、fibonnaci細かい0 1 1 2 3 5 –

+0

を与える;' – pmg

+0

を@ hermant:はい、しかし、配列が、私は中の値を格納したい、とプログラムが – rubbyrubber

答えて

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

int * dynamic_array_append(int * array, int size); 

int main() { 

    int i, n, size=0, *array = NULL; 

    printf("Dynamic array, Fibonacci series. \n"); 
    printf("Capture upto element: "); 
    scanf("%d", &n); 

    for (i=0 ; i<n ; i++) 
     array = dynamic_array_append(array, i); 

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

    return 0; 
} 

int * dynamic_array_append(int * array, int size) 
{ 
    int i; 
    int n1, n2; 
    int new_size = size + 1; 
    int * new_addr = (int *) realloc(array, new_size * (int)sizeof(int)); 

    if (new_addr == NULL) { 
     printf("ERROR: unable to realloc memory \n"); 
     return NULL; 
    } 

    if (size == 0 || size == 1) { 
     new_addr[size] = size; 
     return new_addr; 
    } 

    n1 = new_addr[size-1]; 
    n2 = new_addr[size]; 
    new_addr[new_size-1] = new_addr[new_size-2] + new_addr[new_size-3]; 

    return new_addr; 
} 

/* 
Output: 

Dynamic array, Fibonacci series. 
Capture upto element: 10 
array[0] = 0 
array[1] = 1 
array[2] = 1 
array[3] = 2 
array[4] = 3 
array[5] = 5 
array[6] = 8 
array[7] = 13 
array[8] = 21 
array[9] = 34 

*/ 

ポイント:

  • 、新たに(再)割り当てられた配列をする必要がありますmainに返され、pointer-to-int(または)パスpointer-to-pointer-to-intに保存され、再割り当て後に1回更新されます。
  • fibarrは不要です。それは問題を解決しません。
  • あなたはsizenumberを渡す必要はありません。ちょうどsizeを送信し、nを計算するためにn-1n-2を選ぶでしょう。
  • highly inefficientと考えられます。もしあなたがnを知っていれば、n整数のメモリをワンショットで割り当てて、フィブリス系列を計算することができます。
+0

あなたはインターネットサークルを獲得しました...私はこれがどのように働いたか理解するために自分の道を尽くそうとします...ありがとうございます – rubbyrubber

+0

はい、私はそれが本当に必要ではなかったことを認識しています。 ..ありがとうございます:) – rubbyrubber

+0

@rubbyrubberクール.. 'C'の精神をお楽しみください:) –

0

fibarrポインタ(これは異なる名前なので)として宣言する必要があります。そして、&fibarrのように、そのポインタのアドレスdynamic_arry_appendに渡す必要があります。 mainfibarrcallocで初期化する必要があります。最後に、割り当てられた配列のサイズを動的に更新し、保持し、渡す必要があります。

+0

fibarrは次の数値を計算するためにのみ使用され、私はそのために3つの要素しか必要としません...保存していますarrryの実際の値 – rubbyrubber

1

問題がarryポインタ変数が関数dynamic_arry_appendに値によってが渡されることであってもよいです。つまり、その関数内の変数arryに加えた変更は、その関数外の変数には反映されません。たとえば:

int *a = NULL; 

someFunc(a); 

// a will still be NULL here no matter what someFunc does to it. 
+0

アドレスを渡そうとするとコンパイラエラーが発生する:警告:互換性のないポインタ型の 'dynamic_arry_append'の引数1を渡す – rubbyrubber

+0

これはおそらくあなたの関数が 'int *'ではなく 'int * * '。 – dreamlax

0

あなたは、配列の新しいアドレスを返却されていません...そして、あなたはあなたの記憶がないの読み込み/書き込みされています。デバッガですべてのエラーメッセージでプログラムを実行すると、問題がこの行にある表示されます。注意すべき

dynamic_arry_append(arry, &fibarr[0], &size); 
関連する問題