2012-05-16 3 views
5

Я хочу передать две матрицы в качестве аргумента. Эти матрицы имеют различный размер и я не понимаю, как я должен делать эту работу:Пропустить матрицу как аргумент

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


void f(int m[3][], int n); 

int main() 
{ 
    int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 
    int B[3][2]={{1,2},{3, 4}, {5, 6}}; 

    f(A, 3); 
    f(B, 2); 

    return 0; 
} 

void f(int m[3][], int n) 
{ 
    int i,j; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<n;j++) 
     printf("%5d", m[i][j]); 
    } 
    return; 
} 

Как я могу это сделать?

+2

Что не работает? Вы получаете ошибку времени компиляции? –

+1

Вы используете [C89] (http://en.wikipedia.org/wiki/C89_ (C_version) # C89), [C99] (http://en.wikipedia.org/wiki/C99) или какой-то компилятор специфический диалект C? Существуют различия в способах передачи матричных аргументов в функции, в зависимости от того, на какой языковой версии ваш компилятор настроен на прием. –

+0

@HunterMcMillen yes main.c | 5 | ошибка: тип массива имеет незавершенный тип элемента /main.c|12|error: тип формального параметра 1 не завершен – Nick

ответ

6

Единственный безопасный способ, который я знаю, чтобы сделать это, чтобы включать в себя размеры матрицы в параметрах, или сделать какое-то матрица структуры

Варианта А) размерами в качестве параметров

void f(int **m, int w, int h) 
{ 
    int i,j; 
    for(i=0;i<w;i++) 
    { 
     for(j=0;j<h;j++) 
     printf("%5d", m[i][j]); 
    } 
    return; 
} 

варианта B) Использовать структуру

typedef struct Matrix 
{ 
    int w, h; 
    int** m; 
} Matrix; 

void f (Matrix *m) 
{ 
    for (int i = 0; i < m->w; ++i) 
    { 
     for (int j = 0; j < m->h; ++j) 
     { 
      printf(%5d", m->m[i][j]); 
     } 
    } 
} 
+0

Ваш ответ одобрен для C89, я хотел бы отметить, что для C99 существуют гораздо более простые решения. –

+0

Я не знаком со стандартом C99. Из любопытства, что добавлено в C99, что облегчит решение? –

+4

У вас могут быть такие интерфейсы, как 'void f (size_t n, int m [3] [n])' с реальными 2D-матрицами с динамическими границами в качестве параметра. Вы можете взглянуть на https://gustedt.wordpress.com/2011/01/13/vla-as-function-arguments/ –

Смежные вопросы