0

如何将二维数组传递给函数并像 myArray[i][j] 一样使用它,但不知道该函数内该数组的大小?

我可以知道主里面的大小。

我想像这样使用它:

TGraph *myGraph = new TGraph(nValues, myArray[0][j], myArray[1][j]);
// I'll not use a loop for j, since TGraph receives all the values in the array,
   like "x values" and "y values"  

如果我这样做它可以工作,但我必须传递给函数 Col1 和 Col2 ,它们是两个一维数组:

main() {
     ...
     graphWaveTransmittance("a", nValues, Col1, Col2,
                           " Au ", "Evaporated", "thickness 5nm", kGreen+1);
     ...
}



void graphWaveTransmittance(char *n, int nValues, float Param1[], float Param2[],
                      char *title, char *header, char *entry, Color_t color) {

     TGraph *myGraph = new TGraph(nValues, Param1, Param2);
     ...
}

数组:

float valuesArray[nCol][nValues];

for(int y=0; y<nValues; y++){
    for (int i=0; i<nCol; i++) {
        valuesArray[i][y] = values[i][y];
    }
    i=0;
}

注意:我之所以这样做是因为 values[ ][ ] 是一个数组,其中的值是从文本文件中读取的。在阅读文件之前,我不知道需要多少行。使用第二个数组 (valuesArray[ ][ ]),我可以使它的大小与读取的值的数量相同。

首先,我用“-1”将所有值放在 values[ ][ ] 中,它的大小非常大。然后我计算了行数,并将该值用于 valuesArray[][]。这是第一个有值的数组(大的):

const int nCol = countCols;
float values[nCol][nLin];

    // reads file to end of *file*, not line 
while(!inFile.eof()) {
    for(int y=0; y<nLin; y++){
        for (int i=0; i<nCol; i++) {
            inFile >> values[i][y];
        }
    i=0;    
    }
}

另一个问题,我看到不应该使用“while(!inFile.eof())”。我可以用什么代替?(此时我不知道 .txt 文件的总行数)

在 .txt 的列中导入值,到目前为止我有:

    vector<vector<float> > vecValues;  // your entire data-set of values

vector<float> line(nCol, -1.0);  // create one line of nCol size and fill with -1

bool done = false;
while (!done) 
{
    for (int i = 0; !done && i < nCol; i++) 
    {
        done = !(inFile2 >> line[i]);
    }
    vecValues.push_back(line);  
}

问题是这些值就像 vecValues[value][column number from .txt] 我想要 vecValues[column number from .txt][value]。

我怎样才能改变它?


我正在从这样的文件中读取:

main() {
    ...

    vector < vector <float> > vecValues; // 2d array as a vector of vectors
    vector <float> rowVector(nCol); // vector to add into 'array' (represents a row)
    int row = 0; // Row counter


    // Dynamically store data into array
    while (!inFile2.eof()) { // ... and while there are no errors,
        vecValues.push_back(rowVector); // add a new row,
        for (int col=0; col<nCol; col++) {
            inFile2 >> vecValues[row][col]; // fill the row with col elements
        }
        row++; // Keep track of actual row 
    }


    graphWaveTransmittance("a", nValues, vecValues, " Au ",
                   "Evaporated", "thickness 5nm", kGreen+1); 
       // nValues is the number of lines of .txt file
    ...
}


//****** Function *******//

 void graphWaveTransmittance(char *n, int nValues,
           const vector<vector <float> > & Param, char *title, char *header,
           char *entry, Color_t color) {

       // like this the graph is not good
       TGraph *gr_WTransm = new TGraph(nValues, &Param[0][0], &Param[1][0]);

       // or like this
     TGraph *gr_WTransm = new TGraph(Param[0].size(), &Param[0][0], &Param[1][0]);

注意:TGraph 可以接受浮点数,我之前的数组是浮点数

你知道为什么图表没有正确显示吗?

谢谢

4

2 回答 2

0

我最近遇到了类似的问题。我最终使用了二维向量,当传递给函数时不需要知道内部维度。

像这样声明向量

vector< vector<int> > vec(xRange, vector<int>(yRange, initialValue));

将 xRange 替换为您在 x 维度上的大小,将 yRange 替换为您在 y 方向上的大小,并将 initialValue 替换为您想要初始化二维向量的内容。

此时,您可以使用访问或更新矢量内容

vec[x][y]

要将 this 传递给函数,请使用 this

void myFunc(std::vector< std::vector<int> >& vec) {

务必

#include <vector>
于 2013-12-10T00:20:50.903 回答
0

正如 Michael Parker 已经提到的,您可以使用向量来解决这个问题。要使其在根中与图一起工作,请注意 TGraph 需要两个 double 或 float 数组作为参数。因此你必须使用

std::vector<std::vector<double> > 或者 std::vector<std::vector<float> >

在你的情况下。然后你的函数看起来像:

void drawGraph(const std::vector<std::vector<double> > & data)
{
    TGraph* graph = new TGraph(data[0].size(), &data[0][0], &data[1][0]);
    //...

}

&data[0][0]TGraph 根据需要将向量“转换”为数组。

关于您的第二个问题,!inFile.eof()我通常不使用 ,而是直接询问阅读过程是否成功,即在您的情况下:

if(!(inFile >> values[i][y]))
{
//at end of file 
}

我更喜欢在 while 循环中使用它,但这只是个人喜好问题。顺便说一句,通过使用向量,您不再需要预先运行整个文件来计算行数,只需使用push_back(...).

如果不知道行数和列数,可以使用 getline 读出文件并确定列数:

std::vector<std::vector<float> > data;
std::string buffer;
getline(infile,buffer)//I do not check that the file has at least one line here
istringstream firstLine(buffer);
float value;
while(firstline >> value)
{
    data.push_back(std::vector<float>(1,value));
}

while(getline(infile,buffer))
{
    istringstream line(buffer);
    float value;
    unsigned int counter = 0;
    while(line >> value)
    {
        data[counter].push_back(value));
        counter++;
    }
}

请注意,这需要:

 #include<sstream>

并且这假设列数不会随着文件大小而改变。

于 2013-12-10T01:05:01.530 回答