具有未定义的第二维的二维数组

时间:2017-10-13 03:46:31

标签: c++ arrays pointers audio multidimensional-array

我有一个问题,我不确定如何解决。我有一个打开.wav文件的C ++函数,将样本读入一个双精度数组,该数组的索引数与.wav文件中的样本数一样多,并返回指向该数组的指针。这非常有效。

我想要做的是读取多个.wav文件并将它们存储在二维数组中。虽然我知道会有多少数组,但每个数组的大小会有所不同,因为所有.wav文件都有不同的样本数。我不知道如何为多个文件正确存储这些数据。

这是对wav2sig的调用,该函数打开.wav并返回一个指针:

double* wav2sig(std::string filepath, int & num_samples)

以下是我正在处理的代码。粗略地说。

std::string paths[3] = {"man1.wav",
                          "man2.wav",
                          "man3.wav"};

double **data = new double[3][];   //this would work in java, but not here

int num_samples[3];

for(int i = 0; i < 3; i++) {
     data[i] = wav2sig(paths[i], num_samples[i]);
     for(int j = 50; j < 100; j++)
          std::cout << data[i][j] << " ";
     std::cout << std::endl;
}

我知道返回的指针具有所有正确的数据。我只是不知道如何正确存储其中几个。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我强烈建议对数组使用std::vector而不是指向动态分配内存的指针。它们同样易于使用,它们消除了管理记忆的麻烦。

更改wav2sig

的返回值
std::vector<double> wav2sig(std::string filepath);

我猜测num_samples用于返回返回数组中的元素数。当您使用std::vector<double>作为返回类型时,返回值的大小将捕获该值。因此,不需要额外的输出参数。

使用std::vector<std::vector<double>>作为2D数组。

std::vector<std::vector<double>> data;

相应地更新循环

// Separate reading of the data from files from outputting the data

// Read the data
for(int i = 0; i < 3; i++) {
   data.push_back(wav2sig(paths[i]);
}

// Output the data
for(int i = 0; i < 3; i++) {
   for(size_t j = 0; j < data[i].size(); j++)
      std::cout << data[i][j] << " ";
   std::cout << std::endl;
}