Передача массива целых чисел в качестве параметра функции в C - PullRequest
1 голос
/ 11 марта 2012

Пожалуйста, помогите мне, я застрял в этом.У меня есть функция, которая должна суммировать два массива целых чисел размера n, и я должен передать в качестве аргументов для функции первый элемент каждого массива.

 12 void sumVect(int * v[], int * w[] ,int n)
 13 //adds the second vector to the first vector; the vectors v and w have exactly n components
 14 {
 15         int i;
 16         for(i=0;i<n;i++)
 17         {
 18                 *v[i]+=*w[i];
 19         }
 20 
 21 }

Я дам вам весь код

#include <stdio.h>

void sumVect(int * v[], int * w[] ,int n)
//adds the second vector to the first vector; the vectors v and w have exactly n components
{
    int i;
    for(i=0;i<n;i++)
    {
        *v[i]+=*w[i];
    }

}


int main()
{   
    int i,j;
    int n = 4;  //the size of a vector
    int k = 5;  //the number of vectors
    int v[k][n];    //the vector of vectors

    printf("How many vectors? k=");
    scanf("%d",&k);

    printf("How many components for each vector? n=");
    scanf("%d",&n);

    for(i=1;i<=k;i++)   //read the content of each vector from the screen
    {
        printf("\nv%d   |\n_____|\n",i);

        for(j=0;j<n;j++)
        {
            printf("v%d[%d]=",i,j);
            scanf("%d", &v[i][j]);
        }
    }

    for(j=1;j<k;j++)
    {
        sumVect(&v[j], &v[j+1], n);
        for(i=0;i<n;i++)
        {
            printf("%d",v[j][i]);
        }
    }


    return 0;
}

Ответы [ 3 ]

4 голосов
/ 11 марта 2012

Обратите внимание, что вы передаете тип int [], но ваши формальные параметры в функции int *[]. Поэтому ваша подпись должна быть:

void sumVect(int v[], int w[] ,int n)

или

void sumVect(int *v, int *w,int n)

Также вы должны получить к ним доступ в функции, подобной

v[i] + w[i], поскольку v и w оба равны int * или int [] (зависит от формального параметра)

Также при звонке следует делать:

sumVect(v[j], v[j+1], n);

или

sumVect(&v[j], &v[j+1], n);

Это потому, что, поскольку v[j] является типом int [], &v[i] и v[i] будут вычислять по одному и тому же адресу.

1 голос
/ 11 марта 2012

Массивы и указатели обычно рассматриваются как одно и то же в c. Переменная массива содержит указатель на массив, а нотация [] является кратким обозначением арифметики указателя.

Обратите внимание, что тип n должен быть без знака.

void sumVect(int * v, int * w, uint n)
{
    while (n--)
    {
        *v++ += *w++;
    }
}
1 голос
/ 11 марта 2012

Это исправленная версия вашей функции sumVect.

void sumVect(int * v, int * w ,int n)
//adds the second vector to the first vector; the vectors v and w have exactly n components
{
    int i;
    for(i=0;i<n;i++)
    {
        v[i]+=w[i];
    }

}

Но в целом вам нужен ряд исправлений. Посмотрите на этот код:

int n = 4;  //the size of a vector
int k = 5;  //the number of vectors
int v[k][n];    //the vector of vectors

printf("How many vectors? k=");
scanf("%d",&k);

printf("How many components for each vector? n=");
scanf("%d",&n);

Вот выделение 2-мерного массива размером 5x4, и ваша программа спросит пользователя, каким должен быть размер массива. Самый простой способ исправить это - использовать массив массивов. Вот исправленный код:

int n = 4;  //the size of a vector
int k = 5;  //the number of vectors
int **v = NULL;    //the vector of vectors

printf("How many vectors? k=");
scanf("%d",&k);

printf("How many components for each vector? n=");
scanf("%d",&n);
v = malloc(sizeof(int*), k);
for( int i = 0; i < k; ++i)
   v[i] = malloc(sizeof(int), n);

В конце вы должны освободить выделенную память аналогичным образом, но пусть это будет ваша домашняя работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...