2011-04-19 3 views
3

C에서 [] []와 b [] []가 입력이고 x [] []가 출력입니다. a, b 및 x는 malloc되었지만 포인터를 곱하기 함수에 올바르게 전달하는 방법을 잘 모르겠습니다. 아래 당신이 void multiplication(float *a, float *b, float *x, int n);을 원하는동적 2D 배열을 함수로 전달합니다.

void multiplication(float a, float b, float x, int n); 

    void main() { 

     float **a, **b, **x; 
     int n;   // size of arrays (n x n) 

     multiplication(a, b, x, n); 
    } 

    void multiplication(float a, float b, float x, int n) { 

     // function 

    } 

답변

4

하는 것을 시도하고있는 무슨의 개요입니다. float을 사용해야하는 구체적인 이유가없는 한 일반적으로 인덱스와 배열 크기는 size_t이고 선호하는 부동 소수점 형식은 double이어야합니다.

a, bx은 연속적인 부동 소수점 값을 가리키며, a[n * x + y]을 사용하여 참조를 취소 할 수 있습니다.

:

C99는 거의 모든 컴파일러에 의존 할 수있는 모든 나는 알고,이 위에 재미있는 최적화 가능성의 모든 종류를 소개합니다

이와 같이 다음과 같은 것이 가능해야합니다.

void multiplication(size_t len; // <- semicolon not a mistake 
    double a[len][restrict const len], 
    double b[len][restrict const len], 
    double c[len][restrict const len]); 

이 패틱 구조는 배열의 길이가 동일하고 2D이며 크기가 런타임에 호출 코드에서 표시된다는 것을 컴파일러에 알립니다. 또한 모든 배열은 서로 alias이 아니므로 캐시 가능합니다.

C가 계속 고급화되고 C99은 여전히 ​​완벽하게 지원되지 않으며 많은 other improvements이 주류가되지 못한다는 단 하나의 꿈만 있습니다.

0

당신

승산 방법

모두 행렬의 첫 번째 요소의 주소를 전달해야 실제로 것은 큐 잇달아 소자 수단과 같은 배열의 요소가 배치되어있다. 그래서 첫 번째 요소의 주소를 알고 있다면 색인 번호를 늘리면 모든 배열 구성원을 쉽게 얻을 수 있습니다.

체크 this

당신이

0

글쎄, 당신은 C로 사물의 종류의 일을 위해 포인터를 이해해야합니다 도움이 여기에 간단한 코드입니다 수 있습니다 :

int n = 10; 

float * multiply (float *a, float *b) { 
    float *ans; 
    int i, j, k; 
    ans = malloc(sizeof(float)*n*n); 

    for (i=0; i<n; ++i) 
     for (j=0; j<n; ++j) { 
      ans[i*n+j] = 0.0; 
      for (k=0; k<n; ++k) 
       ans[i*n+j] += a[i*n+k] * b[k*n+j]; 
     } 

    return ans; 
} 

int main() { 
    float *a, *b, *ans; 

    a = malloc(sizeof(float)*n*n); 
    input(&a); 
    b = malloc(sizeof(float)*n*n); 
    input(&b); 

    ans = multiply(a,b); 
    output(ans); 

    return 0; 
} 

당신은 문제가 있다면이 코드를 이해하고 포인터 기술을 닦아보십시오. 그리고 언제나 우리에게 물어볼 수 있습니다.

0

여기에 동적으로 할당 된 배열을 함수에 전달하는 쉬운 방법이 있습니다.

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

void Function(int ***Array); 

int main() 
{ 
    int i, j, k, n=10; 

    //Declare array, and allocate memory using malloc. (Dimensions will be 10 x 10 x 10) 
    int ***Array=(int***)malloc(n*sizeof(int**)); 
    for (i=0; i<n; i++) 
    { 
     Array[i]=(int**)malloc(n*sizeof(int*)); 
     for (j=0; j<n; j++) 
     { 
      Array[i][j]=(int*)malloc(n*sizeof(int)); 
     } 
    } 

    //Initialize array in a way that allows us to check it easily (i*j+k). 
    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      for (k=0; k<n; k++) 
      { 
       Array[i][j][k]=i*j+k; 
      } 
     } 
    } 
    //Check array is initialized correctly. 
    printf("%d\n", Array[4][5][6]); 

    //Pass array to Function. 
    Function(Array); 

    //Check that Function has correctly changed the element. 
    printf("%d\n", Array[4][5][6]); 

    return 0; 
} 

void Function(int ***Array) 
{ 
    //Check that Function can access values correctly. 
    printf("%d\n", Array[4][5][6]); 
    //Change an element. 
    Array[4][5][6]=1000; 
} 

이 항목은 행렬 곱셈과 관련이 없지만 배열을 함수에 전달하는 방법을 보여야합니다. 당신의 함수가 배열의 크기를 알아야 할 필요가있을 것입니다.void Function(int ***Array, int n)을 호출하고이 함수를 Function(Array, n);

관련 문제