C - Добавление массива к себе с использованием динамических массивов - PullRequest
1 голос
/ 03 января 2012

Я запустил другую ветку для этого, я попытался решить ее с помощью помощи, которую они мне оказали, но я не могу запустить программу. Может кто-нибудь сказать мне, что не так в программе и как это должно быть? Спасибо.

Предполагается, что программа добавляет к себе массив и заменяет оригинал суммой, поэтому при печати исходного массива печатается сумма. Это то, что я сделал до сих пор.

Обратите внимание, что необходимо использовать ADDER (a, a) в качестве вызова функции. Мне не разрешено это менять. Оба параметра должны быть переданы по ссылке.

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

int size; //global variable

void ADDER(int *a, int *b) {
    int i;
    for (i = 0; i < size; i++) {
        b[i] += a[i];
    }     
}

int main() {
    int n, i;
    printf("Enter the number of elements: ");
    scanf("%d", &n);
    int *a = (int *)malloc(n*sizeof(int));
    int *b;
    for (i=0; i<n; i++) {
        printf("Enter element number %d: ", i);
        scanf("%d", &a[i]);
    }
    ADDER(a,a);
    for (i=0; i<n; i++) {
        printf("%d", a[i]);
    }
}

Ошибка:

1> ------ Началась сборка: Проект: adderTest, Конфигурация: Отладка Win32 ------

1> adder.c

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (17): предупреждение C4996: 'scanf': эта функция или переменная может быть небезопасной. Попробуйте вместо этого использовать scanf_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS. Для получения подробной информации см. Интерактивную справку.

1> e: \ program files \ microsoft visual studio 10.0 \ vc \ include \ stdio.h (304): см. Объявление 'scanf'

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (18): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «типом»

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (19): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед «тип»

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (22): ошибка C2065: 'a': необъявленный идентификатор

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (22): ошибка C2109: для индекса требуется массив или указатель типа

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (24): ошибка C2065: 'a': необъявленный идентификатор 1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (24): предупреждение C4047: 'function': 'int *' отличается по степени косвенности от 'int'

1> e: \ мои документы \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c (24): предупреждение C4024: 'ADDER': разные типы для формального и фактического параметра 1

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (24): ошибка C2065: 'a': необъявленный идентификатор

1> e: \ мои документы \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c (24): предупреждение C4047: 'function': 'int *' отличается по уровням косвенности от 'int'

1> e: \ мои документы \ visual studio 2010 \ projects \ addertest \ addertest \ adder.c (24): предупреждение C4024: 'ADDER': разные типы для формального и фактического параметра 2

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (26): ошибка C2065: 'a': необъявленный идентификатор

1> e: \ Мои документы \ Visual Studio 2010 \ projects \ addertest \ addertest \ adder.c (26): ошибка C2109: для индекса требуется массив или указатель типа

========== Построение: 0 выполнено, 1 не выполнено, 0 обновлено, 0 пропущено ==========

Ответы [ 3 ]

7 голосов
/ 03 января 2012

У вас есть объект size в области видимости файла и блока (в функции main).

Чтобы исправить вашу программу, вы можете удалить определение объекта size в main функция или (предпочтительное решение) удаляет единицу в области видимости файла и передает ее в качестве нового аргумента в ADDER функцию.

Если вы компилируете с gcc, вы можете использовать предупреждение -Wshadow, которое будетпредупредить вас, когда переменная затеняет другую.

5 голосов
/ 03 января 2012

Самая большая проблема, которую я вижу, состоит в том, что у вас есть 2 size переменные

  • Глобальные size
  • Локальные size объявленные в main

Функция ADDER использует глобальную версию size, которая никогда не назначается, следовательно, она работает неправильно.Самый простой способ - избежать глобального и просто передать размер до ADDER.

void ADDER(int *a, int *b, int size) {
 ...
}
2 голосов
/ 03 января 2012
#include <stdlib.h>
#include <stdio.h>

/* global variable to store the size */
int g_size;

void ADDER(int *a, int *b) 
{
    int i;
    for (i=0 ; i<g_size ; i++) {
        b[i] += a[i];
    }

    return;     
}

int main(void) 
{
    int n, i;

    printf("Enter the number of elements: ");
    scanf("%d", &n);

    int *a = NULL;
    if ((a = (int *)malloc(n * sizeof(int))) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }

    for (i=0; i<n; i++) {
        printf("Enter element number %d: ", i);
        scanf("%d", &a[i]);
    }

    g_size = n;
    ADDER(a, a);

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

    free(a);
    return 0;
}

Я внес следующие изменения:

  • проверка ошибок для malloc()
  • после завершения, free() 'редактирование памяти
  • отформатировановывод
  • удален conio.h, так как он не нужен
  • и, наконец, заставил его работать!:)

РЕДАКТИРОВАТЬ: обновить код в соответствии с запросом автора ОП.

...