c Функции с массивами - PullRequest
       13

c Функции с массивами

0 голосов
/ 06 сентября 2018

Можно ли создать функцию, которая работает с массивами неопределенной длины?
Например, я сделал этот код, чтобы заполнить матрицу 3x3, и мне интересно, есть ли способ сделать это, но с матрицей nxn.

void fillMatrix(double mat[][COLS])
{
    int i,j;    

        printf("Enter the %d matrix elements:\n",COLS*ROWS);
        for(i=0;i<ROWS;i++)
        {
            for(j=0;j<COLS;j++)
            {
                scanf("%lf",&mat[i][j]);
            }                   
        }
        printf("\n");   
}

В этом коде я определил ROWS = COLS = 3.

Ответы [ 5 ]

0 голосов
/ 06 сентября 2018

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

у вас будет что-то вроде:

void fillMatrix(double** mat, int rows, int cols)    {
    int i,j;    

    printf("Enter the %d matrix elements:\n",rows*cols);
    for(i=0;i<rows;i++)
    {
        for(j=0;j<cols;j++)
        {
            scanf("%lf",&mat[i][j]);
        }                   
    }
    printf("\n");   
 }

где double ** mat - вектор векторов, которые вам нужно будет запросить в памяти, используя malloc для строк и malloc для столбцов.

0 голосов
/ 06 сентября 2018

Вы можете попробовать это:

void func(void *data, int row, int col)
{
    int (*a)[col] = (int(*)[col])data;
    //now you can access a[i][j] with i<row and j<col
    //data must be an continous array
    //replace int with your data type
}

Рабочий код:

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

int main()
{
    int n = 5;
    int (*a)[n];
    int b[5][5];

    a = (int(*)[n])b;
    b[0][0]=0;
    b[0][1]=1;
    b[2][1]=111;
    b[1][2]=666;
    b[4][3]=222;

    printf("%d\n", a[0][0]);
    printf("%d\n", a[0][1]);
    printf("%d\n", a[2][1]);
    printf("%d\n", a[1][2]);
    printf("%d\n", a[4][3]);

    return 0;
}
0 голосов
/ 06 сентября 2018

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

void foo(int col, int arr[][col]) {
//Do something
}
0 голосов
/ 06 сентября 2018

Можно ли создать функцию, которая работает с массивами неопределенной длины?

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

Помните, что при передаче в качестве аргумента массив превращается в указатель. Посмотрите также на некоторые C ссылки сайт, а затем обратитесь к стандарту C11 n1570 .

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

0 голосов
/ 06 сентября 2018

может быть, вы можете добавить новый параметр row к вашей функции fillMatrix(double mat[][COLS]), то есть fillMatrix(double mat[][col], int row)

другой способ:

double** matrix = (double**) malloc(sizeof(double*)*n);
for(int i = 0; i<n; i++){
    matrix[i] = (double*) malloc(sizeof(double)*n);
}

затем измените функцию на: fillMatrix(double** matrix, int n)

...