ポインタの指しているアドレスは同じなのに表示される内容が違う。
行列に関するプログラムです。
ライブラリのヘッダファイル matrix.h
#ifndef MATRIX_H
#define MATRIX_H
#ifdef __cplusplus
extern "C"{
#endif
typedef struct{ int row,col; double *elements; } MATRIX;
extern int matrix_error_code;
extern MATRIX zero_matrix(MATRIX a);
extern MATRIX identity_matrix(MATRIX a);
extern void func_matrix(MATRIX a);
#ifdef __cplusplus
}
#endif
#endif
ライブラリのソースファイル matrix.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "matrix.h"
int matrix_error_code = 0;
MATRIX zero_matrix(MATRIX a) /*零行列をつくる*/
{
int i,size;
double *p;
size=a.row*a.col;
for(i=0;i<size;i++)
{
if((p = malloc(sizeof(double))) == NULL)
{
puts("メモリを確保できません.");
exit(0);
}
*p=0;
}
a.elements=p-size;
return a;
}
MATRIX identity_matrix(MATRIX a) /*単位行列をつくる*/
{
int i;
a=zero_matrix(a);
for(i=0;i<a.row;i++)
{
*(a.elements+i*a.col+i)=1.0000;
}
return a;
}
void func_matrix(MATRIX a)
{
int i,j;
double *p;
printf("b.elementsの値:%p\n",a.elements);
printf("b[1,1]の値:%lf\n",a.elements);
}
動作確認用のアプリケーションファイル test_matrix.c
#include <stdio.h>
#include "matrix.h"
int main(void)
{
int i,j;
MATRIX b;
b.row=2;
b.col=2;
b=identity_matrix(b);
for(i=0;i<b.row;i++)
{
for(j=0;j<b.col;j++)
{
printf("%3.4lf ",*(b.elements+i*b.col+j));
}
printf("\n");
}
printf("\n\n");
printf("b.elementsの値:%p\n",b.elements);
printf("b[1,1]の値:%lf\n",b.elements);
func_matrix(b);
return 0;
}
void func_matrix(MATRIX a)内のprintf("b.elementsの値:%p\n",a.elements);とtest_matrix.c内のprintf("b.elementsの値:%p\n",b.elements);で表示される値は同じなので、main関数のbがvoid func_matrix(MATRIX a)内のaに正しく引き渡されていると思うのですが、それぞれの次の行での、printf("b[1,1]の値:%lf\n",b.elements);とprintf("b[1,1]の値:%lf\n",a.elements);とでは表示される値が違い、理由がわからず困っています。
どうか回答をよろしくお願いします。
お礼
関数名の前に、他の行でも用いられているVVD_Flagをつけたら正常に動きました。 asuncionさんTacosanさん、回答ありがとうございました。