2016-11-11 2 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; 
} 

Как вы можете видеть, с функцией Append я увеличить длину массива, а затем присвоить целое число 5 в качестве последнего элемента. Однако, когда я запускаю программу это результат я получаю:

1 2 6 8 9 0 

Я ожидаю, что 0 быть 5, но это не так. Я думаю, что массив увеличился в размере, но последний элемент не принял значение, которое я ожидал ... любые предложения?

+0

'TAB т; Int N;' -> 'TAB т = {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. Функция append знает только о «глобальной» переменной (из строки 2), а цикл for в main знает только о «локальной» переменной (из строки 14).

2

В вашем исходном коде вы заявляете дважды TAB t. Первый является глобальным и видимым из функции append(), но скрыт вторым объявлением внутри функции main() =>TAB t = {1,2,6,8,9};.

Если заменить глобальное объявление TAB t; местным инициализирован формы TAB t = {1,2,6,8,9};, ваш массив будет виден с обеих append() и main().

0

В имени функции t этого имя в декларации в глобальном пространстве имен перед объявлением функции

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}; 
    ^^^^^^^^^^^^^^^^^ 

не отображается в функции.

Причина ошибки в том, что функция относится к глобальным переменным и, как таковая, имеет так называемый побочный эффект.

Не пытайтесь использовать глобальные переменные в определениях функций.

Также вы забыли увеличить 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 
Смежные вопросы