2016-11-11 3 views
0

配列の最後に特定の要素(x)を追加するサブプログラムを作成しようとしました。Cでサブプログラムを使用して配列を追加する

typedef int TAB[50]; 
TAB t; 
int N; 

int append(int x){ 
    N++; 
    t[N - 1] = x; 
    return 0; 
} 

int main(){ 
    int i; 
    N = 5; 
    TAB t = {1,2,6,8,9}; 
    append(5); 
    for (i = 0; i < N; i++){ 
     printf("%d ", t[i]); 
    } 
    return 0; 
} 

をあなたは、私は、配列の長さを増加させ、その後、その最後の要素として、整数5を割り当てる機能はappendで見ることができるように:これは私がこれまで行ってきたものです。しかし、私がプログラムを実行すると、これは私が得る結果です:

1 2 6 8 9 0 

私は0が5であると予想しますが、そうではありません。私は配列のサイズが増加したと思うが、最後の要素は私が期待した値を取っていない...任意の提案?

+0

'TABさtである。INT N;' - > 'TABさt = {1,2,6、 8,9}。 int N = 5; '、' N ++; t [N-1] = x; ' - >' t [N ++] = x; ' – BLUEPIXY

+0

サブプログラムとは何ですか? – Qix

+0

@Qix:時代錯誤: - }はCより古いです。Cには "サブプログラム"はありませんが、機能はありません。 – Olaf

答えて

2

名前がtの2つの変数があります。 append関数は、(2行目の) "グローバル"変数のみを認識し、mainforループは14行目の "ローカル変数"を知っています。

2

ソースコードでは、TAB tを2回宣言しています。最初はグローバルであり、append()関数からは可視ですが、main()関数内の2番目の宣言では非表示になります。=>TAB t = {1,2,6,8,9};です。

あなたは地元の初期化フォームTAB t = {1,2,6,8,9};でグローバル宣言TAB t;を交換する場合は、あなたの配列はappend()main()の両方から見えるようになります。関数宣言

TAB t; 
^^^^^ 
int N; 

int append(int x){ 
    N++; 
    t[N - 1] = x; 
    ^^ 
    return 0; 
} 

だから関数は、グローバル配列を変更する前に、関数名t

0

は、グローバル名前空間で宣言で宣言された名前です。メインで宣言された配列

int main(){ 
    int i; 
    N = 5; 
    TAB t = {1,2,6,8,9}; 
    ^^^^^^^^^^^^^^^^^ 

は、この関数では表示されません。

間違えた理由は、関数がグローバル変数を参照しているため、いわゆる副作用があるからです。

関数定義でグローバル変数を使用しないでください。

また、新しい値を追加した後にNを増やすのを忘れてしまった。

プログラムは、以下のよう

#include <stdio.h> 

#define N 50 

typedef int TAB[N]; 

size_t append(int *a, size_t n, int value) 
{ 
    a[n++] = value; 

    return n; 
} 

int main(void) 
{ 
    TAB t = { 1, 2, 6, 8, 9 }; 
    size_t n = 5; 

    n = append(t, n, 5); 

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

    return 0; 
} 

を見ることができるプログラムの出力は

1 2 6 8 9 5 
関連する問題