0

我在将数组传递给 C 中的函数时遇到问题。我在 main 中声明了数组

然后,在一个函数内部,我填充它。

此时我离开我的函数并将数组传递给带有原型的另一个函数

并尝试访问该数组。

但是,一旦我退出填充数组的初始函数,我将无法访问该数组。它只返回 0.00000 和 nan 的值。

void ReadData(FILE *fpIn, int lines, double *pA );
void MinMaxAvg(double *pA, double *min, double *max, double *avg, int lines);

int main()
{
    FILE *fpIn = NULL;

    int lines = 0;

    double *pA = NULL;

    ReadData(fpIn, lines, pA);

    double min = 0;
    double max = 0;
    double avg = 0;

    MinMaxAvg(pA, &min, &max, &avg, lines);

    printf("%lf %s %lf %s %lf \n", avg, " ", min, " ", max);

    return 0;
}   

void ReadData(FILE *fpIn, int lines, double *pA )
{
    char fName[20];
    scanf( "%s", fName);

    fpIn = fopen ( fName, "rt");
// fpIn = fopen( "test1.txt", "rt");

    if ( fpIn == NULL)
    {
        printf( "Unable to open: ");
        exit(99);
    }

//Gets Lines

//int lines=0;
    char ch;

    while((ch=fgetc(fpIn))!=EOF)
    {
        if (ch=='\n') { lines++; }

    }

// clearerr(fName *fpIn);
    fclose(fpIn);
    fopen(fName, "rt");

//Makes Array

//double *pA;

    pA = (double *)malloc(lines*sizeof(double));

//Fills Array

    for (int i=0; i<lines; i++)
    {
        fscanf(fpIn, "%lf", &pA[i]);
    }

    for (int i=0; i<lines; i++)
    {
        printf("%lf \n", pA[i]);
    }
}

void MinMaxAvg(double *pA, double *min, double *max, double *avg, int lines)
{
    double total = 0;

    for (int i=0; i<lines; i++)
    {
        if ( i==0)
        {
            *min = pA[0];
            *max = pA[0];
        }
        else
        {
            if (pA[i] < *min)
            {
                *min = pA[i];
            }

            if (pA[i] > *max)
            {
                *max = pA[i];
            }
        }

        total += pA[i];

    }

    *avg = (total / (double)lines);

}

有什么建议么?

谢谢!

4

3 回答 3

3

您将文件中的行数计算到函数 ReadData() 中的局部变量“lines”中,但这并不意味着它被传递回 main。传递给 MinMaxAvg() 的“lines”变量值为零。

于 2013-02-07T15:05:47.017 回答
0

我刚刚测试了你的代码,它可以工作。我所做的唯一区别是 fscanf 中的标准输入,并且包括了 max、min、avg 和 lines。

#include <stdio.h>
#include <stdlib.h>


void MinMaxAvg(double *pA, double *min, double *max, double *avg, int lines)
{
    double total = 0;

    for (int i=0; i<lines; i++)
    {
    if ( i==0)
    {
        *min = pA[0];
        *max = pA[0];
    }
    else
    {
        if (pA[i] < *min)
        {
        *min = pA[i];
        }

        if (pA[i] > *max)
        {
        *max = pA[i];
        }
    }

    total += pA[i];

    }

    *avg = (total / (double)lines);

return;
}



int main(int argc, char** argv)
{
    double *pA = NULL;

    int lines = 3;

    double min,max,avg;

    pA = (double *)malloc(lines*sizeof(double));

    //Fills Array

    for (int i=0; i<lines; i++)
    {
        fscanf(stdin, "%lf", &pA[i]);
    }

     MinMaxAvg( pA, &min, &max, &avg,  lines);


    for (int i=0; i<lines; i++)
    {
        printf("%lf \n", pA[i]);
    }

    printf( "min: %f  max: %f  avg: %f" , min , max , avg );
}
于 2013-02-07T14:56:50.193 回答
-1

根据您的问题,如果您在函数中填充 pA,我怀疑您没有更改 pA 的内容,这可能是问题所在。查看您用于填充 pA 的例程可能会有所帮助/有用。

C函数按值调用,如果你只是传入一个指针(只是pA),要更改指针的值,你需要传递指针的地址(如果你愿意,指针指向一个指针)。然后你需要服从一次它来设置指针(指向指针),然后服从它两次来设置分配的内存/数组中的值。

所以对函数的调用是

void init(File *fpin, double **pA, int lines)
{
  /* Deference once to set the pointer to the pitner */
  *pA = (double *)malloc(lines*sizeof(double));

  for (int i=0; i<lines; i++)
  {
     /* deference twice to set the the element of the pointer to the pointer */
     fscanf(fpIn, "%lf", &(**pA)[i]);
  }
}

然后在调用例程时,需要传入 pA 的地址。

init(fpIn,&pA,lines);

这是一个可能有助于解释指向指针的链接: http ://www.thegeekstuff.com/2012/01/advanced-c-pointers/

好久没有做指针的指针了,但是如果你使用上面的,你可能需要做一些小的改动。

正如 larsmans 暗示的那样,我喜欢他的建议,即更改例程以将指针返回到您分配的内存并将该值放在 pA 中。

double* init(File *fpin, int lines)
{
  double *local = (double *)malloc(lines*sizeof(double));

  //Fills Array

  for (int i=0; i<lines; i++)
  {
    fscanf(fpIn, "%lf", &local[i]);
  }

  return(local);

}

然后在调用init

pA = init(fpIn,lines);

根据您要完成的工作,这可能更容易理解并且没有那么复杂。

于 2013-02-07T15:11:37.640 回答