【问题标题】:Passing an array created from fscanf into a new function将从 fscanf 创建的数组传递给新函数
【发布时间】:2013-03-24 14:33:09
【问题描述】:

我已经成功地对一个文本文件进行 fscanf 并保存到一个数组 E2N1 中。我试图将它作为指针传递给函数,但它不起作用。每当我尝试调用 E2N1[0][0] 时,它都会说 E2N 既不是数组也不是指针。我一直在寻找解决方案。 (抱歉,E2N 本来就是 ​​E2N1) 我使用 fscanf 作为:

int E2N1[noz.rowE2N][Q.N];

FILE* f = fopen("E2N.txt", "r");
for(i=0; i<noz.rowE2N; i++){
    for (j=0; j<Q.N; j++){
        fscanf(f,"%d",&E2N1[i][j]);

    }
    fscanf(f,"\n");

}
fclose(f);

我又不能将 E2N1 传递给函数。

您的帮助将不胜感激。

函数是:

double *dudtF = stiffness(&U, &massM, &noz, &newV, &E2N1, &I2E, &B2E, &PP, &QQ);

我把函数头写成:

double *stiffness(double *U, double *massM, MESH *meshN, double *V1, int *E2N1, int *I2E, int *B2E, ordApprox *pp, ordApprox *qq)

V1、I2E、B2E 是三个数组,我正在尝试对它们执行与 E2N1 相同的操作。

【问题讨论】:

  • 你能说明你是如何将它传递给函数的吗?数组就像地址,因此您必须将指向数组的指针传递给您的函数。
  • 我又不能将 E2N1 传递给函数。 - 什么函数?
  • @ykmizu:能不能也提供相关代码?
  • 根据提供的详细信息,我相信您已保存到名为:E2N 的数组中,但您正在尝试访问 E2N1。也许这就是问题所在。
  • 抱歉,E2N 本来就是 ​​E2N1。

标签: c scanf


【解决方案1】:

您不能通过点引用来引用传递给函数的多维数组,如下所示:

int iVals[10][10];
foo(iVals);

void foo(int** pvals)
{
    // accessing the array as follows will cause an access violation
    cout << pvals[0][1]; // access violation or unpredictable results
}

您需要在函数原型中指定数组的第二维 例如:

foo(int ivals[][10])
{
    cout << ivals[0][1];  // works fine
}

如果不知道尺寸,那么我建议您遵循此处列出的原则:

void foo(int *p, int r, int c)
{
    for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            printf("%d\n", p[i*c+j]);
        }
    }
}

int c[6][6];

// pointer to the first element
foo(&c[0][0], 6, 6);

// cast
foo((int*)c, 6, 6);

// dereferencing
foo(c[0], 6, 6);

// dereferencing
foo(*c, 6, 6);

我希望这会有所帮助。

您也可以使用 SAFEARRAY - 请参阅: http://limbioliong.wordpress.com/2011/06/22/passing-multi-dimensional-managed-array-to-c-part-2/

【讨论】:

    【解决方案2】:

    这是如何将矩阵从一个函数转移到另一个函数的示例...

    void foo (int **a_matrix)
    {
    int value = a_matrix[9][8];
    a_matrix[9][8] = 15;
    }
    
    void main ()
    {
    #define ROWS 10
    #define COLUMNS 10
    
    int **matrix = 0;
    matrix = new int *[ROWS] ;
    for( int i = 0 ; i < ROWS ; i++ )
    matrix[i] = new int[COLUMNS];
    
    matrix[9][8] = 5;
    
    int z = matrix[9][8] ;
    
    foo (matrix);
    
    z = matrix[9][8] ;
    }
    

    【讨论】:

      【解决方案3】:

      您不需要传递为&amp;E2N1,只需传递为E2N1 没有&amp;,因为数组名称本身会转换为指针。

      double *dudtF = stiffness(&U, &massM, &noz, &newV, E2N1, &I2E, &B2E, &PP, &QQ);
      

      另外,你需要把它当作int ** 作为它的二维数组。

      double *stiffness(double *U, double *massM, MESH *meshN, double *V1, int **E2N1, int *I2E, int *B2E, ordApprox *pp, ordApprox *qq)
      

      【讨论】:

      • 如另一个答案所述。调用方的 E2N1 不是指针数组。它是一个按行主要顺序的完全顺序的二维数组。在这种情况下,指针对指针并不是您认为的灵丹妙药。
      【解决方案4】:

      数组的有趣之处在于它们实际上充当了指针。

      如果您有数组char a[3],则该变量等效于char* p,如果您有数组char b[3][4],则变量b 等效于char** q。换句话说,您应该考虑更改方法中的处理以将引用引用(并且可能再次引用)到整数。

      试试谷歌...这是我得到的一些结果。

      http://www.dailyfreecode.com/code/illustrate-2d-array-int-pointers-929.aspx

      http://www.cs.cmu.edu/~ab/15-123S09/lectures/Lecture%2006%20-%20%20Pointer%20to%20a%20pointer.pdf

      【讨论】:

      • 不要将 E2N1 参数声明为指向指针的指针。它是调用方的线性序列二维数组,它不是指针数组,这是完全不同的东西。
      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2020-07-28
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多