2017-02-04 1 views
0

면책 조항 : 이것은 과제를 처리하기위한 것이지만, 제 코드를 쓰는 사람을 찾고있는 것이 아닙니다. 나는 잘못된 방향과 올바른 방향에 대한 조언을 찾고 있습니다.클래스 멤버 (변수?)를 함수에 전달하는 방법은 무엇입니까?

형식화 된 데이터 (시간, 온도, 풍속)가있는 파일이 있습니다. 나는 3 개의 다른 "사슬"로 연결된 목록을 작성하기로되어있다. 각 체인은 동일한 데이터를 가지지 만 시간이있는 체인이 시간순으로 모든 데이터를 읽을 수 있도록 순서가 다릅니다. 임시 체인 체인은 임시 순차적 순서로 데이터를 읽고 풍속 체인은 풍속 순차로 데이터를 읽는다.

주어진 포인터에서 데이터를 성공적으로 읽을 수 있고 시간별 목록을 올바르게 구성 할 수있는 함수를 작성했습니다. 하지만 이제는 같은 함수를 사용하여 동일한 포인터를 읽고 다른 두리스트를 구성하려고합니다. 이에

timeHead-> 시간

:

whicheverLinkedListHeadIwant을 제가하고 싶은 것은이를 켭니다 기본적으로

void datalogger::addData(int timestamp, double temperature, double windspeed){ 

weatherdata *n; 
n = new weatherdata; 

n->time = timestamp; 
n->temp = temperature; 
n->wind = windspeed; 
n->next = nullptr; 

ll.addData(n, 1); 
} 

void linkedlist::addData(weatherdata *newData, int selectionNo){ 

weatherdata *selection; 

switch(selectionNo){ 
    //linkedlist: TIME 
    case 1: 
     selection = timeHead; 
     break; 
    //linkedList: TEMP 
    case 2: 
     selection = tempHead; 
     break; 
    //linkedList: WIND 
    case 3: 
     selection = windHead; 
     break; 
} 


int marker = 0; 
weatherdata *node; 
weatherdata *current; 
weatherdata *nextNumber; 

node = new weatherdata; 
node = newData; 
node->next = nullptr; 

//very first entry 
if (selection == nullptr){ 
    selection = node; 
    marker = 1; 
} 

//item should instead be in the first position 
if (newData->time < selection->time){ 
    nextNumber = timeHead; 
    selection = node; 
    node->next = nextNumber; 
} 

else { 
    //traverse the list until we find the correct place to put it in 
    current = selection; 
    nextNumber = selection->next; 

    //while "not yet at the end of the list" 
    while (nextNumber != nullptr){ 

     //if its the same as another item DELETE 
     if ((newData->time == current->time) || (newData->time == nextNumber->time)) { 
      marker = 1; 
      break; 
     } 

     //the new item goes between the current and nextNumber 
     else if ((current->time < newData->time) && (newData->time < nextNumber->time)){ 
      current->next = node; 
      node->next = nextNumber;   
      break; 
     } 

     //otherwise increment current and nextNumber for the next comparison 
     else { 
      current = nextNumber; 
      nextNumber = nextNumber->next; 
     } 
    } 

    //item goes at the end of the list 
    if ((nextNumber == nullptr) && (marker != 1)){ 
     current->next = node; 
    }   
} 

switch(selectionNo){ 
    case 1: 
     timeHead = selection; 
     break; 
    case 2: 
     tempHead = selection; 
     break; 
    case 3: 
     windHead = selection; 
     break; 
} 
} 

: 여기

는 관련 코드 -> 클라스 회원이되는 것

그런 식으로 동일한 함수를 사용하여 세 개의 연결된 목록을 모두 처리 할 수 ​​있습니다. 당신이 눈치 챘을 것 같은데, 내 linkedlist :: addData 함수의 시작 부분에 switch 문을 사용하여 "whicheverLinkedListHeadIwant"를 처리하는 코드를 얻을 수 있었지만, 내 인생에서 "어느 것이든지 ClassMemberIwant"를 얻을 수 없었습니다. 작업.

이 내가 무엇을 시도했다입니다 :

char* classMemberSelection = "temp"; 또는 char* classMemberSelection = "wind"

whicheverLinkedListHeadIwant->classMemberSelection;

그러나 컴파일러는 그냥 classMemberSelection 말하는 오류를 반환은 구성원이 아닙니다. 나는 그것이되고 싶은 두 번째 부분을 만드는 방법에 대한 손실이 있습니다.

이 질문이 맞지 않다면 죄송합니다. 나는 가능한 한 명확 할 수 있도록 최선을 다했지만이 모든 것을 가지고 초보자입니다. 프로젝트의 추가 부분을 게시해야한다면, 기꺼이 기꺼이받을 수 있습니다.

+0

를 호출 여기에 시도하는 몇 가지 아이디어는 다음과 같습니다 A) 세 가지 나열합니다. 세 가지 모두에 데이터를 추가하십시오. 그런 다음 모든 항목을 추가 한 다음 세 목록을 정렬하십시오. B) 삽입 할 항목을 매개 변수로 사용하는 링크 된 목록의 한 삽입 기능과 목록에서 항목을 배치해야하는 위치를 결정하기 위해 삽입 기능이 사용하는 세 가지 비교 기능 중 하나에 대한 포인터. – user4581301

+0

당신이 시도한 것이 작동하지 않는 이유에 대한 주석 : 코드를 읽을 수 있도록 만드는 데 사용하는 멋진 이름, 좋은 방법은 컴파일러에서 제거하고 오프셋과 주소로 바꾼 것입니다. 프로그램의'addData'는 0xFEDD00D와 같고'selection'은 스택 포인터 + 16입니다. "wind"는 런타임시 아무 것도 의미하지 않으며 컴파일러는 변수 이름이 아니라 단지 문자열입니다. – user4581301

+0

이것은 의심스러운'node = new weatherdata; node = newData; ' – greatwolf

답변

0

먼저 우리는 하나가 다른 것보다 작은 경우 당신에게 세 가지 기능,

bool comparetime(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->time < right->time; 
} 
bool comparetemp(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->temp < right->temp; 
} 
bool comparewind(weatherdata * left, 
       weatherdata * right) 
{ 
    return left->wind < right->wind; 
} 

이 모든 사람이 할 비교의 각 유형에 대해 하나입니다 정의합니다. 이제 우리는 매개 변수로 위의 기능 중 하나를 수행 할

void linkedlist::addData(weatherdata *newData, 
         bool (*comparefp)(weatherdata * left, 
              weatherdata * right)) 

void linkedlist::addData(weatherdata *newData, int selectionNo) 

을 조정할.다음으로 우리가 newData 간다 목록에서 위치를 찾아 그것을 팝업 할 :

while (nextNumber != nullptr && comparefp(newData, nextNumber)) 
// keep looking until end of list or we pass the insert location 
{ 
    lastNumber = nextNumber; 
    nextNumber = nextNumber.next; 
} 
// insert into list 
newData.next=nextNumber; 
lastNumber.next=newData; 

linkedlist::addData

void datalogger::addData(int timestamp, double temperature, double windspeed){ 

    weatherdata *n; 
    n = new weatherdata; 

    n->time = timestamp; 
    n->temp = temperature; 
    n->wind = windspeed; 
    n->next = nullptr; 

    // add to each list  
    timelist.addData(n, comparetime); 
    templist.addData(n, comparetemp); 
    windlist.addData(n, comparewind); 
} 
관련 문제