C++ 使用带函数的指针指向;return";多维数组

C++ 使用带函数的指针指向;return";多维数组,c++,arrays,pointers,multidimensional-array,C++,Arrays,Pointers,Multidimensional Array,我想将字符数组micPointsChar[]传递给函数initMicPoints()并将其解析为多维数组micPoints。我能够使用一维数组成功地完成此操作: char micPointsChar[30 + 1] = {}; float *initMicPoints(char micPointsChar[], float micPoints[3]); int main() { // Read in mic points from file char micPointsChar[4

我想将字符数组
micPointsChar[]
传递给函数
initMicPoints()
并将其解析为多维数组
micPoints
。我能够使用一维数组成功地完成此操作:

char micPointsChar[30 + 1] = {};
float *initMicPoints(char micPointsChar[], float micPoints[3]);

int main()
{
  // Read in mic points from file
    char micPointsChar[40] = "2,3.343,4.432\n";
    float micPoints[3] = {};
    float *newMicPoints = initMicPoints(micPointsChar, micPoints);
    for (int i = 1; i <= 3; i++)
    {
      Serial.print(newMicPoints[i]);
      Serial.print("\n");
    }
    return 0;
}


float *initMicPoints(char micPointsChar[], float micPoints[3])
{
  static int i = 1;
  static int micNum = 1;
  static int numMics = 1;
  float coordinateDec = 0;

  char *coordinate = strtok(micPointsChar, ",\n");
  coordinateDec = atof(coordinate);
  while (micNum <= numMics)
  {
    while (i <= ((micNum * 3)) && (coordinate != NULL))
    {
      if (i == ((micNum * 3) - 2))
      {
        micPoints[1] = coordinateDec;
      }
      else if (i == ((micNum * 3) - 1))
      {
        micPoints[2] = coordinateDec;
      }
      else if (i == ((micNum * 3) - 0))
      {
        micPoints[3] = coordinateDec;
      }
      coordinate = strtok(NULL, ",\n");
      coordinateDec = atof(coordinate);
      i++;
    }
    micNum++;
  }
  return micPoints;
}
但是,当我更改代码以处理多维数组时,
micPoints[360][3]

char micPointsChar[30 + 1] = {};
float *initMicPoints(char micPointsChar[], float micPoints[360][3]);

int main()
{
  // Read in mic points from file
    char micPointsChar[40] = "2,3.343,4.432\n";
    float micPoints[360][3] = {};
    float *newMicPoints = initMicPoints(micPointsChar, micPoints);
    static int i = 0;
    for (i = 1; i <= 3; i++)
    {
      Serial.print(*newMicPoints[i][0]);
      Serial.print("\n");
      Serial.print(*newMicPoints[i][1]);
      Serial.print("\n");
      Serial.print(*newMicPoints[i][2]);
      Serial.print("\n");
    }
    return 0;
}


float *initMicPoints(char micPointsChar[], float micPoints[360][3])
{
  static int i = 1;
  static int micNum = 1;
  static int numMics = 1;
  float coordinateDec = 0;

  char *coordinate = strtok(micPointsChar, ",\n");
  coordinateDec = atof(coordinate);
  while (micNum <= numMics)
  {
    while (i <= ((micNum * 3)) && (coordinate != NULL))
    {
      if (i == ((micNum * 3) - 2))
      {
        micPoints[i][0] = coordinateDec;
      }
      else if (i == ((micNum * 3) - 1))
      {
        micPoints[i][1] = coordinateDec;
      }
      else if (i == ((micNum * 3) - 0))
      {
        micPoints[i][2] = coordinateDec;
      }
      coordinate = strtok(NULL, ",\n");
      coordinateDec = atof(coordinate);
      i++;
    }
    micNum++;
  }
  return micPoints;
}
我是不是把事情弄得太复杂了?返回多维数组的最佳方法是什么?

首先,很遗憾

float *initMicPoints(char micPointsChar[], float micPoints[360][3])
被视为

float *initMicPoints(char* micPointsChar, float (*micPoints)[3])
您可以通过引用传递以保持大小:

float *initMicPoints(char* micPointsChar, float (&micPoints)[360][3])
然后返回
micPoints

返回类型应为
float(&)[360][3]
float(&)[360][3]

给人一种丑陋的感觉

float (&initMicPoints(char* micPointsChar, float (&micPoints)[360][3]))[360][3]
在呼叫站点:

float (&newMicPoints)[360][3] = initMicPoints(micPointsChar, micPoints);

首选语法更清晰的
std::array
std::vector

在这两种情况下,您都只是返回参数。所以这个返回值是多余的。相反,通过返回
void
来避免问题:

void initMicPoints(char micPointsChar[], float micPoints[360][3])
调用代码如下所示:

float micPoints[360][3] = {};
initMicPoints(micPointsChar, micPoints);
for (int i = 1; i <= 3; i++)
{
  Serial.print(micPoints[i][0]);
  Serial.print("\n");
float micPoints[360][3]={};
初始微点(微点、微点);

对于(inti=1;i,返回数组没有什么意义,因为您的函数没有构造它。您只是给调用者一个参数值的副本

标准C库中的一些传统函数可以做到这一点,比如
strcpy
。我记不起上一次看到一段代码使用了
strcpy
的返回值,它只是传入的目标指针

// redeclare and redefine to return nothing!
void initMicPoints(char micPointsChar[], float micPoints[3]);

int main()
{
  // Read in mic points from file
    char micPointsChar[40] = "2,3.343,4.432\n";
    float micPoints[3] = {};

    initMicPoints(micPointsChar, micPoints);
    for (int i = 1; i <= 3; i++)
    {
      Serial.print(micPoints[i]); // refer to original array, now initialized
      Serial.print("\n");
    }
    return 0;
}
//重新声明并重新定义为不返回任何内容!
void initMicPoints(char micPointsChar[],float micPoints[3]);
int main()
{
//从文件中读取麦克风点
char micPointsChar[40]=“2,3.343,4.432\n”;
浮点数[3]={};
初始微点(微点、微点);

对于(int i=1;i可能是重复的而不是重复的,这里不需要指向指针的指针多维数组语法是邪恶的。只需自己计算偏移量。
offset=y*width+height
offset=z*(width*height)+y*width+x
,等等。
float micPoints[360][3] = {};
initMicPoints(micPointsChar, micPoints);
for (int i = 1; i <= 3; i++)
{
  Serial.print(micPoints[i][0]);
  Serial.print("\n");
// redeclare and redefine to return nothing!
void initMicPoints(char micPointsChar[], float micPoints[3]);

int main()
{
  // Read in mic points from file
    char micPointsChar[40] = "2,3.343,4.432\n";
    float micPoints[3] = {};

    initMicPoints(micPointsChar, micPoints);
    for (int i = 1; i <= 3; i++)
    {
      Serial.print(micPoints[i]); // refer to original array, now initialized
      Serial.print("\n");
    }
    return 0;
}