2011-01-23 6 views
0

다차원 배열을 가져야하는 클래스가 있습니다. 문제는 이러한 차원의 값이 다른 함수를 사용하여 클래스에서 계산되고 일부 공용 변수에 저장된다는 것입니다. 따라서 클래스 내의 다른 모든 함수는이 변수에 저장된 값을 읽을 수 있습니다. 함수의 정의는 다음과 같이이다 : max_ctrl_nomax_rep_nopublic 변수는차원 크기가 분명하지 않은 경우 다차원 배열이 작동하도록 전달

double calcSS(double tfpairexp[][max_ctrl_no][max_rep_no]) 

. 와 나는 이런 식으로 함수를 호출 :

calcSS(tfpairexp); 

을하지만 컴파일러는 함수의 정의에 오류가 있습니다. 그리고 그 vars 대신에 일정한 숫자를 넣으면 오류가 없습니다. 그러나 프로그램이 시작될 때의 차원을 알지 못합니다. 어떻게해야합니까?

업데이트

void tripleofgenes(int begind,int endind) {    
      for (int tf1=0; tf1<tfact; ++tf1) 
      { 
        for (int tf2=tf1+1; tf2<tfact; ++tf2) 
        { 
         double tfpairexp[cchips][max_ctrl_no][max_rep_no]; 
         double w,d; 
         int ctrl_no;int c, ctr; 
         for (int j = 0; j < cchips ; j += c) 
         { 
          c = chips[j].crepls; 
          int ctrl_no=0; 
          for (int *p = chips[j].ctrl ; p && (ctr=*p)>=0; ++p,ctrl_no++) { 
           for (int k = 0; k < c; ++k) 
           { 
            double tf1exp=chips[k+j].vals[tf1].val-((chips[k+j].useextra) ? chips[ctr].extra[tf1] : chips[ctr].mean[tf1].val); 
            double tf2exp=chips[k+j].vals[tf2].val-((chips[k+j].useextra) ? chips[ctr].extra[tf2] : chips[ctr].mean[tf2].val); 
            tfpairexp[j][ctrl_no][k]=interactionFunc(tf1exp,tf2exp,1); 
           } 
          } 
         } 
         for (int tg=begind; tg<=endind; ++tg) 
          if (tf1!=tg){ 

         calcSS(tfpairexp); 

         } 


        } 
      } 
     fclose(f); 
    } 

    double calcSS(double ***tfpairexp) 
    { 
    for (int row = 0; row <= 1 ; row++) 
       for (int col = 0; col <= 1 ; col++) { 
        int cond=0; 
        for (int j = 0; j < cchips; j += c) { 
         c = chips[j].crepls; // the number of replicants 
         int ctrl_no=0; 
         for (int *p = chips[j].ctrl; p && (ctr=*p)>=0; ++p,ctrl_no++) { 
    a = tfpairexp[j][ctrl_no][k];} 
    } 
    } 
    } 
    } 
용액에 함수 특성을 변경하는
+0

무효 tripleofgenes (INT begind, INT endind) {\t \t \t \t \t \t을 위한 {\t (INT TF2 TF1 = + 1; TF2 Pegah

+0

@Pegah :이 함수와 calcSS() 모두 클래스에 정의되어 있습니까? – Nawaz

+0

예. 둘 다 수업 중에 있습니다. – Pegah

답변

2

배열의 종류 당신이 사용하고있는 (C-스타일 : 그것은 당신의 문제를 해결하는 경우

double calcSS(double ***tfpairexp) 
{ 

     for(int i = 0 ; i < cchips ; i++) 
     { 
      for(int j = 0 ; j < max_ctrl_no ; j++) 
      { 
       for(int k = 0 ; k < max_rep_no ; k++) 
       { 
         //access elements as tfpairexp[i][j][k] 
       } 
      } 
     } 

} 

당신이 대답을 볼 수 있습니다)는 실제로 동적 크기와 함께 사용하도록 설계되지 않았지만 new을 사용하여 이러한 방식으로 할당 할 수 있습니다. 함수 호출을위한 한 가지 해결책은 차원에 대한 double *** 및 세 개의 size_t 매개 변수를 함수로 전달하는 것입니다.하지만 여전히 호출자에서 필요한만큼 큰 차원으로 배열을 선언해야합니다. 또는 프로세스 메모리가 손상되어 충돌 할 수 있습니다.

더 나은 해결책은 런타임에서 결정된 크기의 배열을 처리하기 위해 처음부터 설계된 vector을 사용하는 것입니다. 다중 D 벡터를 선언하고 직접 사용하거나 단일 차원 벡터로 이동하여 액세스 시간에 수학 비트를 수행하여 좌표의 세 배를 벡터로 색인으로 변환 할 수 있습니다.

어느 쪽이든, 당신은 여기에 내가 그 설정을 배치 권장하는 방법이다, 벡터 헤더가 필요합니다

#include <vector> // in your includes 

using std::vector; // at global scope immediately after all #includes 

일부 코드 샘플을. 다른 대답을 기반으로 제 3의 차원의 크기로 cchips을 사용하겠습니다.다차원 솔루션은 다음과 같은 :

// at global scope 
typedef vector< vector<double> > vec2double; 
typedef vector< vector<vec2double> > vec3double; 

// in the caller of your calcSS after you know how big to make the array { 
    vec3double tfairexp(cchips, vec2double(max_ctrl_no, vector<double>(max_rep_no))); 
    // now fill up tfairexp 
    calcSS(tfairexp); 
// } 

// important: pass a reference here, or you will copy the whole array at call time! 
void calcSS(vec3double &tfairexp) { 
    // you can use cchips etc here but don't have to: 
    for (size_t i = 0; i < tfairexp.size(); i++) { 
     for (size_t j = 0; j < tfairexp[0].size(); j++) { 
      for (size_t k = 0; k < tfairexp[0][0].size(); k++) { 
       // access tfairexp[i][j][k] here 
      } 
     } 
    } 
} 

솔루션은 동적 배열의 1+j+j*k 할당을 실제로 할 것이다. 대신 벡터를 "소유"하는 래퍼 클래스를 작성하고 차원 변환 항목을 수행하고 현재 작성중인 클래스에 사용하도록 할 수 있습니다. "차원 크기에 대한 공용 클래스 멤버 변수"접근 방식을 계속 사용하기 위해 일부 양식 희생을하고 있습니다. 그러나,이 하나 더 밀접하게 컴파일러는 C 스타일의 다차원 배열을 변환, 만 실행 당 하나 개의 메모리 할당을 수행하는 방법을 모델 :

// as a member of your class -- returns a live reference that can be assigned to! 
double &vec3_get(vector<double> &array, const size_t i, const size_t j, const size_t k) { 
    return array[i*max_ctrl_no*max_rep_no + j*max_rep_no +k]; 
} 

// in caller of calcSS { 
    vector<double> tfairexp(cchips*max_ctrl_no*max_rep_no); 
    // fill in by doing vec3_get(tfairexp, i, j, k) = val; 
    calcSS(tfairexp) 
// } 

// again, pass a reference to the vector! 
void calcSS(vector<double> &tfairexp) { 
    for (size_t i = 0; i < cchips; i++) { 
     for (size_t j = 0; j < max_ctrl_no; j++) { 
      for (size_t k = 0; k < max_rep_no; k++) { 
       // access vec3_get(tfairexp, i, j, k) here 
      } 
     } 
    } 
} 
+0

정말 고마워요. 코드는 다음과 같습니다. http://pastebin.com/UTg3Dd2P 배열을 채울 때 크기를 모를 것이라고 생각합니다. 좀 봐 주시겠습니까? – Pegah

+0

감사합니다. 나는 당신의 마지막 해결책을 시도하고 나의 문제는 해결되었다. 다시 감사합니다. – Pegah

+0

아니요, 필자는 그것을 채울 때 얼마나 큰지 알았습니다. 그러나 배열을 채울 때 (런타임에) 얼마나 큰지를 아는 것과 코드를 작성할 때 배열이 얼마나 큰지를 아는 것 사이에는 큰 차이가 있습니다 (컴파일 타임에 ->). 프로그램이 실행될 때까지 배울 수없는 모든 크기의 데이터는 새로운 연산자 또는 벡터 등 동적 할당을 사용하여 통합해야합니다. –

0
double calcSS(double tfpairexp[][max_ctrl_no][max_rep_no]) 

하나

double calcSS(double ***tfpairexp, int M, int N, int P); 

M, NP는 arrray 치수 어디!

또는 클래스 자체의 인스턴스를 전달할 수 있습니다. 결국 클래스에서 치수를 공개했습니다. 그리고이 함수가 클래스의 멤버 함수라면 아무 것도 전달할 필요가 없습니다. 이 같은 함수 자체에서 액세스 할 수 있습니다 using a function template

+0

답변 해 주셔서 감사합니다. 함수에서 tfpairexp의 값을 계산 한 다음 calcSS를 호출하여 tfpairexp에 저장된 값을 사용합니다. double calcSS (double *** tfpairexp, int M, int N, int P)와 같은 함수를 작성하면 배열의 값을 어떻게 검색해야합니까? 초 : 예, 처음에는 tfpairexp를 공개로 정의하고 싶었습니다. 그래서 모든 기능이 그것을 볼 수있었습니다. 그러나 치수 때문에 다시 같은 문제가있었습니다. 무슨 뜻인지 좀 더 설명해 주시겠습니까? – Pegah

+0

@ 페가 : C++을 처음 사용하십니까? 당신의 경험은 무엇입니까? 나는 당신이 C++에 관한 책을 구해야하고 그것을 먼저 읽어야한다고 생각한다. :-) – Nawaz

+0

불행히도 나는 새롭지 않다. 하지만 항상 포인터에 문제가 있습니다. 나는 이것을 다음과 같이 썼다 : double tfpairexp [cchips] [max_ctrl_no] [max_rep_no]; 다음을 상상해보십시오 : tfpairexp [0] [0] [1] = 10; 등등. 그리고 나서 : calcSS (tfpairexp); func 정의의 경우 : double calcSS (double *** tfpairexp). 그러나 여전히 오류가 발생합니다. 작성된 행에는 "적절한 기능 없음"이라고 표시됩니다. calcSS (tfpairexp); – Pegah

관련 문제