2012-05-16 36 views
5

Tôi muốn chuyển hai ma trận làm đối số. Những ma trận này có kích thước khác nhau và tôi không hiểu cách tôi phải thực hiện công việc này:Truyền ma trận làm đối số

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

Làm cách nào để thực hiện việc này?

+2

Điều gì không hoạt động? Bạn đang nhận được một lỗi biên dịch thời gian? –

+1

Bạn đang sử dụng [C89] (http://en.wikipedia.org/wiki/C89_ (C_version) # C89), [C99] (http://en.wikipedia.org/wiki/C99) hoặc một số trình biên dịch phương ngữ đặc thù của C? Có những khác biệt trong cách mà bạn có thể chuyển đối số ma trận cho hàm, tùy thuộc vào phiên bản ngôn ngữ mà trình biên dịch của bạn được cấu hình để chấp nhận. –

+0

@HunterMcMillen yes main.c | 5 | error: loại mảng có loại phần tử không đầy đủ /main.c|12|error: loại thông số chính thức 1 chưa hoàn thành – Nick

Trả lời

6

Cách duy nhất an toàn mà tôi biết để làm điều này là để bao gồm các kích thước ma trận trong các thông số, hoặc thực hiện một số loại ma trận struct

Lựa chọn A) kích thước như thông số

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

Tùy chọn B) Sử dụng cấu trúc

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

Câu trả lời của bạn là ok cho C89, tôi chỉ muốn lưu ý rằng C99 có nhiều giải pháp dễ dàng hơn. –

+0

Tôi không quen với tiêu chuẩn C99. Trong sự tò mò, những gì được thêm vào C99 mà sẽ làm cho các giải pháp dễ dàng hơn? –

+4

Bạn có thể có các giao diện như 'void f (size_t n, int m [3] [n])' với các ma trận 2D thực với các giới hạn động như một tham số. Bạn có thể xem https://gustedt.wordpress.com/2011/01/13/vla-as-function-arguments/ –

Các vấn đề liên quan