首页 > 解决方案 > 指针声明疑点

问题描述

我正在执行此代码来表示 2d array T[i][j],我想获取值并使用它们进行迭代。所以,首先我声明T = {0},这些是我的矩阵的初始值,然后ifs 去完成矩阵。之后,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;
}

标签: cpointers

解决方案


首先,在编译器中打开警告。在 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], 等等。尽管它们等同于编译器,但后者的可读性要高得多。


推荐阅读