Dev-C++4.9.9.2、gcc version 3.4.2 (mingw-special)です。
二次元配列式のポインタ(要はダブルポインタ)が示している内容を、ある関数の中で書き換えないという意味で、
const指定をつけたいのですが、コンパイルエラーや警告が出てしまいます。
#include <stdio.h>
#include <stdlib.h>
#define ENABLE_TEST1
//#define ENABLE_TEST2
//#define ENABLE_TEST3
double test(const double* a,int n) {
double sum=0;
int i;
for(i=0;i<3;i++) {
sum+=a[i];
}
return sum;
}
#ifdef ENABLE_TEST1
double test1(double** a,int n) {
double sum=0;
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
sum+=a[i][j];
}
}
return sum;
}
#endif
#ifdef ENABLE_TEST2
double test2(const double** a,int n) {
double sum=0;
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
sum+=a[i][j];
}
}
return sum;
}
#endif
#ifdef ENABLE_TEST3
double test3(const (double**) a,int n) {
double sum=0;
int i,j;
for(i=0;i<n;i++) {
for(j=0;j<n;j++) {
sum+=a[i][j];
}
}
return sum;
}
#endif
int main(void) {
double** zikken;
int i,j;
zikken=malloc(sizeof(double*)*3);
if(!zikken)return 1;
for(i=0;i<3;i++) {
zikken[i]=malloc(sizeof(double)*3);
if(!zikken[i]) {
for(j=0;j<i;j++)free(zikken[j]);
free(zikken);
return 1;
}
for(j=0;j<3;j++) {
zikken[i][j]=i+j;
}
}
printf("%f\n",test(zikken[0],3));
#ifdef ENABLE_TEST1
printf("%f\n",test1(zikken,3));
#endif
#ifdef ENABLE_TEST2
printf("%f\n",test2(zikken,3));
#endif
#ifdef ENABLE_TEST3
printf("%f\n",test3(zikken,3));
#endif
for(i=0;i<3;i++)free(zikken[i]);
return 0;
}
#define ENABLE_TEST2のコメントアウトを外すと、このような警告が出ます。
しかし、このプログラムでは誤動作は確認できません。
F:\C\constmattest\constmattest.c: In function `main':
F:\C\constmattest\constmattest.c:77: warning: passing arg 1 of `test2' from incompatible pointer type
F:\C\constmattest\constmattest.c:44: error: syntax error before "a"
F:\C\constmattest\constmattest.c: In function `test3':
F:\C\constmattest\constmattest.c:47: error: `n' undeclared (first use in this function)
F:\C\constmattest\constmattest.c:47: error: (Each undeclared identifier is reported only once
F:\C\constmattest\constmattest.c:47: error: for each function it appears in.)
F:\C\constmattest\constmattest.c:49: error: `a' undeclared (first use in this function)
F:\C\constmattest\constmattest.c: In function `main':
F:\C\constmattest\constmattest.c:77: warning: passing arg 1 of `test2' from incompatible pointer type
関数の中で値を書き換えないconst指定にするにはどのようにすれば良いのでしょうか?
教えていただければ幸いです。
よろしくお願いします。