二维数组转化为指针
Two dimensional array into a pointer
我定义了一个我称之为 Neuron
的结构。
在我的 main 中,我创建了一个二维数组:
Neuron N_network[4][10]; //create a neural network
我有打印结构元素的函数:
void print_stat_neuron(Neuron * neuron_info)
我应该写什么来打印 N_network[i][j]
(作为 print_stat_neuron()
函数的参数)?
我尝试简单地使用 &(N_network[i][j])
并收到一条错误消息。
我有编译器 gcc -Wall -Wextra 的休闲错误消息:
2ex4.c: In function 'init_network':
2ex4.c:168:2: warning: implicit declaration of function'print_stat_neuron' [-Wimplicit-function-declaration]
print_stat_neuron(&N_network[4][1]);
^
2ex4.c: At top level:
2ex4.c:191:6: warning: conflicting types for 'print_stat_neuron' [enabled by default]
void print_stat_neuron(Neuron * neuron_info)
^
2ex4.c:168:2: note: previous implicit declaration of 'print_stat_neuron' was here
print_stat_neuron(&N_network[4][1]);
您需要将参数更改为Neuron (*neuron_info)[10]
。现在您可以将此函数称为
print_stat_neuron(N_network);
或
print_stat_neuron(&N_network[0]);
您显示的错误消息来自于在使用函数之前未声明该函数,因此编译器推导出该函数的类型(extern int print_stat_neuron();
没有指定参数的数量或类型),然后反对你用 void
类型的 return 定义它。请注意,在 C 中,extern int print_stat_neuron();
不是没有参数的函数的原型;那是 extern int print_stat_neuron(void);
.
此代码编译干净:
typedef struct Neuron
{
int x;
} Neuron;
void print_stat_neuron(Neuron *neuron_info);
int main(void)
{
Neuron N_network[4][10];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 10; j++)
print_stat_neuron(&N_network[i][j]);
}
return 0;
}
这会在使用前声明该函数。在使用之前定义函数也是可以接受的(这样可以节省单独的声明)。当然,如果函数将在定义它的源文件之外使用,它应该在头文件中声明,并且头文件应该在定义的地方和使用的地方都使用。如果函数没有在定义它的源文件之外使用,它应该是 static
.
在 Mac OS X 10.10.5 上使用 GCC 5.3.0 检查干净的编译(不幸的是,我的 El Capitan 机器在保修期内):
$ gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition -c neuron.c
$
我定义了一个我称之为 Neuron
的结构。
在我的 main 中,我创建了一个二维数组:
Neuron N_network[4][10]; //create a neural network
我有打印结构元素的函数:
void print_stat_neuron(Neuron * neuron_info)
我应该写什么来打印 N_network[i][j]
(作为 print_stat_neuron()
函数的参数)?
我尝试简单地使用 &(N_network[i][j])
并收到一条错误消息。
我有编译器 gcc -Wall -Wextra 的休闲错误消息:
2ex4.c: In function 'init_network':
2ex4.c:168:2: warning: implicit declaration of function'print_stat_neuron' [-Wimplicit-function-declaration]
print_stat_neuron(&N_network[4][1]);
^
2ex4.c: At top level:
2ex4.c:191:6: warning: conflicting types for 'print_stat_neuron' [enabled by default]
void print_stat_neuron(Neuron * neuron_info)
^
2ex4.c:168:2: note: previous implicit declaration of 'print_stat_neuron' was here
print_stat_neuron(&N_network[4][1]);
您需要将参数更改为Neuron (*neuron_info)[10]
。现在您可以将此函数称为
print_stat_neuron(N_network);
或
print_stat_neuron(&N_network[0]);
您显示的错误消息来自于在使用函数之前未声明该函数,因此编译器推导出该函数的类型(extern int print_stat_neuron();
没有指定参数的数量或类型),然后反对你用 void
类型的 return 定义它。请注意,在 C 中,extern int print_stat_neuron();
不是没有参数的函数的原型;那是 extern int print_stat_neuron(void);
.
此代码编译干净:
typedef struct Neuron
{
int x;
} Neuron;
void print_stat_neuron(Neuron *neuron_info);
int main(void)
{
Neuron N_network[4][10];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 10; j++)
print_stat_neuron(&N_network[i][j]);
}
return 0;
}
这会在使用前声明该函数。在使用之前定义函数也是可以接受的(这样可以节省单独的声明)。当然,如果函数将在定义它的源文件之外使用,它应该在头文件中声明,并且头文件应该在定义的地方和使用的地方都使用。如果函数没有在定义它的源文件之外使用,它应该是 static
.
在 Mac OS X 10.10.5 上使用 GCC 5.3.0 检查干净的编译(不幸的是,我的 El Capitan 机器在保修期内):
$ gcc -std=c11 -O3 -g -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes \
> -Wold-style-definition -c neuron.c
$