2013-12-10 3 views
0

함수에 2D 배열을 전달하고 myArray [i] [j]와 같이 사용하려면 어떻게해야합니까?2D 배열을 함수로 전달하여 TGraph에서 사용합니다.

메인 내부의 크기를 알 수 있습니다.

나는 이런 식으로 사용하려는 :

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" 

나는이 작동하지만 두 개의 1D 배열 인 기능 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; 
} 

참고 값 [] []하여 판독 값 배열이기 때문에 I는 다음과 같이하여 만들었다 텍스트 파일에서. 파일을 읽기 전에 얼마나 많은 행이 필요한지 알 수 없습니다. 이 두 번째 배열 (valuesArray [] [])을 사용하면 읽을 수있는 값의 크기만큼만 만들 수 있습니다.

먼저 모든 값을 [-1]로 값 [] []에 넣었으며 크기는 매우 큽니다. 그런 다음 줄 수를 계산하고 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;  
    } 
} 

또 다른 질문, 나는 "동안 (! 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 ​​[값] [열 번호 .txt] vecValues ​​[열 번호 .txt] [값]을 갖고 싶습니다.

어떻게 변경할 수 있습니까?

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은 수레를 받아 들일 수, 내 이전 배열했다 수레

그래프가 제대로 표시되지 않는 이유를 아십니까 ?

+0

"** 2D 배열"도 표시하지 않으시겠습니까? –

+0

@Doms 초기 질문을 변경했습니다. TGraph를 참고하면 틀린 점을 알고 있습니까? – JMG

답변

0

내가 최근에 비슷한 문제로 실행 감사합니다. 두 차원의 vectors을 사용했는데, 함수에 전달할 때 내부 차원을 알 필요가 없습니다.

는 y 방향에 크기와 X 치수의 크기, yRange와 xRange를 교체하는 동안이

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

같은 벡터를 선언하고 당신과 당신의 2D 벡터를 초기화 할 것과로 초기.이 시점에서

, 액세스하거나 기능이 합격을

vec[x][y] 

를 사용하여 벡터 내용을 업데이트 할 수 있습니다,이

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

#include <vector> 
+0

벡터를 사용하려고했지만 항상 오류가 발생했습니다. 하지만 어쨌든 고마워요 – JMG

+0

무슨 오류가 있어요? 아마 내가 도울 수있어. –

+0

처음 스크립트를 실행했지만 두 번째 시간이 나타납니다. 경고 : 템플릿 쌍 중복 정의 /opt/local/lib/root/cint/cint/stl/_pair.h:31 : 경고 : 템플릿 reverse_iterator duplicate 정의 /opt/local/lib/root/cint/cint/stl/_iterator.h:269 : 경고 : 템플릿 벡터 중복 정의 /opt/local/lib/root/cint/cint/stl/_vector.h:44 : (이 텍스트를 충분히 포맷 할 수 없습니다. :) 그런 다음 세그먼트 화 오류 – JMG

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에 의해 필요에 따라 벡터 배열을 "변환" 는 다음 함수처럼 보인다. 내가 while 루프에서 이것을 사용하는 것을 선호

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

하지만 그게 문제가 :

대신 !inFile.eof()를 사용하는 두 번째 질문에 관해서는, 나는 일반적으로 직접 읽기 과정이 귀하의 경우 즉, 성공적인 여부를 물어 맛의. 그런데 벡터를 사용하면 줄 수를 계산하기 위해 더 이상 전체 파일을 실행할 필요가 없으므로 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> 

이며이 경우 파일 크기에 따라 열의 수가 변경되지 않는다고 가정합니다.

+0

일부 열과 행이 많은 텍스트 파일을 올바르게 가져올 수 있습니까? 초기 질문을 변경하여 일부 코드를 넣을 것입니다. – JMG

+0

선이나 열의 수를 모르기 때문에 if (! (inFile >> values ​​[i] [y]))를 사용할 수 없습니다. 배열을 가지고 있었지만 그것을 제거하고 싶습니다. – JMG

+0

벡터를 함수에 전달했지만 그래프가 어떻게 될지가 아닙니다. 어떻게되는지 압니까? 나는 "질문"에 의심을 갖게 될 것입니다. – JMG