c - 指针声明疑点
问题描述
我正在执行此代码来表示 2d array T[i][j]
,我想获取值并使用它们进行迭代。所以,首先我声明T = {0}
,这些是我的矩阵的初始值,然后if
s 去完成矩阵。之后,a
更改并更新矩阵的值,这就是为什么我使用指针来获取新值,而不是 的初始值T
,整个 0 数组。但问题是,我在打印所有矩阵时得到了相同的结果。
我认为问题出在这个声明中:
float T[3][3] = {0}; float (*pT)[3] = T;
编码:
#include<stdio.h>
#include <math.h>
int main(void) {
float Z = 0.2;
float R = 0.03;
float ra = 0.01;
float ks = 1.0;
float ke = 1.0;
float kw = 1.0;
float kn = 1.0;
float ro = 1.0;
float c = 1.0;
float w = 1.0;
float Ta = 1.0;
float gm = 1846.35;
int nr = 3; /* valores de nr apenas multiplos de 3*/
int nz = 3;
int i, j, a;
float T[3][3] = {0};
float (*pT)[3] = T;
for (a = 0; a < (10*10*10*10); a++){
float vetorq [nz];
for (i = 0; i < nr; i++){
float h = 1;
float b = 1;
float c = nz/10;
vetorq [i] = (h * exp(- (nz - b)*(nz - b)/ 2*c*c));
for (j = 0; j < nz; j++){
float an = (((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra) * kn * ((R - ra)/nr) * nz)/ Z;
float ae = (((i + 2.0) * ((R - ra)/nr) + ra) * ke / nz * nr) / (R - ra);
float aw = (((i + 1.0) * ((R - ra)/ nr) + ra) * kw * Z / nz * nr)/ (R - ra);
float asul = (((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra) * ks * ((R - ra)/nr) * nz)/ Z;
float ap = an + ae + aw + asul + (ro * c * w);
float aef = 0;
if (i == 0 && j == 0){
*(*(T + i) + j) = an * ((*(*(T + i) + j + 1)) / ap) + ae * ((*(*(T + i + 1) + j)) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i != 0 && i != nr - 1.0 && j == 0){
*(*(T + i) + j) = ae * ((*(*(T + i + 1) + j)) / ap) + aw * ((*(*(T + i - 1) + j)) / ap) + asul * ((*(*(T + i - 1) + j)) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i == nr - 1 && j == 0){
aef = ((((i + 2.0) * (R - ra)/ nr) + ra) * Z * vetorq[i] / nz);
*(*(T + i) + j) = an * ((*(*(T + i) + (j + 1))) / ap) + aw * ((*(*(T + i - 1) + j)) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i != nr - 1 && j != 0 && j != nz - 1){
aef = ((((i + 2.0) * (R - ra)/ nr) + ra) * Z * vetorq[i] / nz);
*(*(T + i) + j) = asul * ((*(*(T + i) + (j - 1))) / ap) + an * ((*(*(T + i) + (j + 1))) / ap) + aw * ((*(*(T + i - 1) + j)) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i == nr - 1 && j == nz - 1){
aef = ((((i + 2.0) * (R - ra)/ nr) + ra) * Z * vetorq[i] / nz);
*(*(T + i) + j) = aw * ((*(*(T + i - 1) + j)) / ap) + asul * ((*(*(T + i) + (j - 1))) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i != nr - 1 && i != 0 && j == nz - 1){
*(*(T + i) + j) = aw * ((*(*(T + i - 1) + j)) / ap) + asul * ((*(*(T + i) + (j - 1))) / ap) + ae * (*(*(T + i + 1) + j) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i == 0 && j == nz - 1){
*(*(T + i) + j) = ae * ((*(*(T + i + 1) + j)) / ap) + asul * ((*(*(T + i) + (j - 1))) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else if(i == 0 && j != nz - 1 && j == 0){
*(*(T + i) + j) = ae * ((*(*(T + i + 1) + j)) / ap) + an * ((*(*(T + i) + (j + 1))) / ap) + asul * ((*(*(T + i) + (j - 1))) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
else (i != 0 && i != nr - 1 && j != 0 && j!= nz - 1);{
*(*(T + i) + j) = ae * ((*(*(T + i + 1) + j)) / ap) + aw * ((*(*(T + i - 1) + j)) / ap) + an * ((*(*(T + i) + (j + 1))) / ap) + asul * ((*(*(T + i) + (j - 1))) / ap) + ((gm * Z/ nz * ((i + (1.0 / 2.0) * ((R - ra)/nr)) + ra)) * (R - ra)/ nr) + (ro * c * w * Ta) + (aef / ap);}
printf("%d ", *(*(T + i) + j));
}
printf("\n \n ");
}
printf("\n \n \n");
}
return 0;
}
解决方案
首先,在编译器中打开警告。在 GCC 或 Clang 中,添加-Wall -Werror
到命令行开关。请注意警告和错误消息并在继续之前修复它们。
其次,Clang 说:
yc:87:51:警告:表达式结果未使用 [-Wunused-value] 否则 (i != 0 && i != nr - 1 && j != 0 && j!= nz - 1);{ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else
子句不带条件。当它之前的所有其他测试都失败时,它给出了一个要执行的语句。如果您希望在其他测试失败时执行大括号中的语句,则删除括号和分号中的条件:
else {
如果您希望仅在其他测试失败并且您在此处的条件为真时才执行语句,则更else
改为else if
并删除分号:
else if (i != 0 && i != nr - 1 && j != 0 && j!= nz - 1) {
第三,Clang 说:
yc:91:29:警告:格式指定类型“int”但参数具有类型 '浮动' [-Wformat] printf("%d", *(*(T + i) + j)); ~~ ^~~~~~~~~~~~~~~~~~ %F
%d
是为int
。里面的元素T
有 type float
。%f
是为float
(或%e
或%g
)。将其更改为:
printf("%f ", *(*(T + i) + j));
四、停止使用*(*(T + i) + j))
。使用T[i][j]
, 和T[i+1][j]
, T[i][j+1]
, 等等。尽管它们等同于编译器,但后者的可读性要高得多。
推荐阅读
- python - 如何在 Selenium 中定位标签按钮(Angular 组件)?
- c# - 错误:GetResultCore(布尔值 waitCompletionNotification)
- python - 为给定的数据点创建简单的 networkx 图形布局
- php - 输入类型文件多个jQuery laravel
- javascript - 如何使用 JavaScript 中的输入值进行计算?
- mysql - 字符串以数字开头,查询后返回不同的结果
- python - 使用 Dropbox URL 获取 Dropbox 文件内容
- javascript - 如何使用数组数组查找数组
- python - 错误:在 tensorflow 2 中训练 inception v3
- android - 如何在谷歌地图中获取标记位置