2012-01-03 2 views
1

나는이 일을하는 데 약간의 어려움을 겪고 있으며, 인터넷상에서 높고 낮음을 검색했지만 아무 도움이되지 않습니다. 나는 기본적으로 임의의 행렬을 만들고 그것을 밖으로 인쇄하기 위해 노력하고있어, 나는 작업 및 테스트 된 기능 double random()을 다음과 같이 나는 구조를 정의 : 내가 제대로 메모리를 할당 한있는구조 내의 배열에 포인터 증가시키기

typedef struct matrep { 
     unsigned rows, columns; 
     double *data; 
    } MATRIX; 

,이를 사용하여 내 임의의 기능은 임의의 행렬을 만들 수 있지만, 무슨 일 나는 이동하지 알고, 포인터가 결코 이동하지

MATRIX *rand_matrix(MATRIX *mat) 
{ 
    for (int i=0; i < mat->rows; i++) 
    { 
     for (int j=0; j < mat->columns; j++) 
     { 
      *(mat->data) = random() ; 
     } 
    } 
    return mat ; 
} 

때문에 나는이 기능

void print_matrix(MATRIX *mat) 
{ 
    int i, j ; 
    if ((mat->data)==0 || (mat->rows)==0 || (mat->columns)==0) 
    { 
     printf("Empty matrix\n"); 
     return ;  
    } 
    printf("\n\nMatrix of dimensions %d x %d\n\n", mat->rows, mat->columns) ; 
    for (i=0; i < mat->rows; i++) 
    { 
     for (j=0; j < mat->columns; j++) 
     { 
      printf("\t%1.2lf", *(mat->data)); 
     } 
     printf("\n") ; 
    } 
} 
0123을 사용하여 매트릭스를 인쇄 할 때

위의 행렬에서 'j'로 임의의 문자를 교환하면 올바른 수의 행과 열로 행렬이 인쇄되지만 각 값은 j의 최대 값과 같습니다.

기본적으로 내가 도와 줄 수있는 바는 내 *(mat->data) 포인터를 늘리는 방법을 찾는 것입니다. 내가 화살표 연산자를 호출 할 때 자동으로 증가하는 것에 대해 들었지만 작동하지 않는 것 같고 시도 할 때 *(mat->data)++ 좋은 큰 오류가 발생합니다.

도움이 될만한 사람에게는 도움이 될 것입니다.

+0

자동으로 증가하지 않습니다. – sth

답변

0

mat-> data ++를 수행해야합니다. (mat-> data) ++는 mat-> data의 값을 평가하고 가능하지 않은 값을 증가 시키려고합니다.

+0

행 * (mat-> data) = random()을 * (mat-> data ++) = random()으로 변경하더라도 모든 숫자가 같은 모든 행렬이 여전히 0으로 끝납니다. – Leavenotrace

+0

Don 'mat-> data ++'를 실행하여 포인터를 증가시킨다. – user1123450

4

실제로 변경하고 싶지는 않습니다. mat->data; 제대로 할당 된 메모리를 계속 지적해야합니다. 대신,이를 변경해야합니다

  *(mat->data) = random() ; 

이 같은 뭔가 :

  mat->data[i * mat->columns + j] = random() ; 

(메모리 블록에 i * mat->columns + jdoublemat->data가 가리키는 참조),이 :

 printf("\t%1.2lf", mat->data[i * mat->columns + j]); 
012 : 이런 식으로 뭔가에
 printf("\t%1.2lf", *(mat->data)); 

(유사).

이것은 사실이 아니다, 나는 심지어 당신이 들었을 수도 유사한 아무것도 생각할 수 없다, [중 & hellip]

나는 당신이 자동으로 증가 화살표 연산자를 호출 할 때 대해 뭔가를 듣고 죄송합니다.


편집

추가 : 원하는 경우, 또 다른 방법을, 이런 식으로 뭔가를 작성하는 것입니다 :

모든 요소를 ​​통해 포인터 pTmp를 증가
MATRIX *rand_matrix(MATRIX *mat) 
{ 
    double *pTmp = mat->data; 
    for (int i=0; i < mat->rows; i++) 
    { 
     for (int j=0; j < mat->columns; j++) 
     { 
      *(pTmp++) = random() ; 
     } 
    } 
    return mat ; 
} 

. 어느 접근법이 더 명확한지는 모르겠습니다.그러나 어느 쪽이든, 나는 mat->data을 수정하는 것이 좋습니다.

+0

아마도 그는''->'(http://stackoverflow.com/questions/1642028)을 생각하고있을 것이다./what-is-the-the-name-of-this-operator)는 "go to"연산자입니다. – Dave

+0

대단히 고맙습니다. 두 번째 방법 인 pTmp를 시도해 보니 매력처럼 작동했습니다. 매트 -> 데이터가 어쩌면 도움이되지 않는 것 같지만 믹스에 추가 포인터를 추가하는 것이 왜 효과가 있는지 궁금합니다. 이전과 같은 장소를 가리키고 있습니까? 미안 해요. 바보 같은 질문인데 포인터로 정말 고생합니다. – Leavenotrace

+0

@Leavenotrace : 어리석은 질문이 아닙니다. 여분의 포인터는 증가시키는 것이 안전하기 때문에 차이를 만듭니다. 'pTmp'는'mat-> data'와 같은 장소를 가리 키기 시작하지만,'pTmp ++ '부분은 한 공간 앞으로 움직입니다. (* "(pTmp ++) = random()"문은'* pTmp = random()'과''pTmp ++ ''명령문이 뒤 따른다.) – ruakh

0

여기에`printf ("\ t % 1.2lf", * (mat-> data)); 당신은 항상 같은 기억을 가리키고 있습니다.

당신은 예를 들어, 인덱스 및 포인터 역 참조 [] 연산자를 사용할 수 있습니다 : 기본적으로

(mat->data)[2]

0

을 배열을 사용하여 매트릭스를 저장하기 위해, 당신은 밀접하게 2D 매트릭스를 모방 메모리, 즉 할당해야 각 행렬 (또는 배열) 요소는 rowscolumns으로 다른 값을 사용하여 고유하게 액세스해야합니다.

당신이 할 수있는 여러 가지 방법으로 C인치 하지만 다음은 같은 일을하는 가장 일반적인 방법 중 하나입니다. 이 경우 할당 해제가 없습니다 (예 : free()). 시도해보십시오. 직접 해보십시오. 도움이 필요하면 여기에 있습니다!

참고 : 나는 여러 변화가 당신의 코드에서 수행해야합니다 .. 그래서 내가 대답으로 일반적인 지침과 기준을 제공하기 위해 시도하고 있습니다 볼 수 있습니다!

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

int main() 
{ 
     int row, column; 
     int **matrix; 
     int i, j, val; 

     printf("Enter rows: "); 
     scanf("%d", &row); 
     printf("Enter columns: "); 
     scanf("%d", &column); 

     matrix = (int **) malloc (sizeof(int *) * row); 
     for (i=0 ; i<row ; i++) 
       matrix[i] = (int *) malloc (sizeof(int) * column); 

     val=1; 
     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         matrix[i][j] = val++; 
       } 
     } 

     for (i=0 ; i<row ; i++) { 
       for (j=0 ; j<column; j++) { 
         printf("%3d ", matrix[i][j]); 
       } 
       printf("\n"); 
     } 

     return 0; 
}