2013-04-13 5 views
-1

잠시 동안 포럼을 검색했지만이 문제가 해결되지 않은 것 같습니다. 그것은 컴파일하고 내가 할 필요가있는 거의 모든 것을하지만, 한가지는 꺼져 있습니다. struct chore에 대한 포인터의 포인터 인 chore_array를 업데이트 할 때마다 새 업데이트가 이전의 모든 할당을 대체합니다.struct 포인터의 끝에 struct 포인터를 추가하십시오.

typdef struct _chore{ 
    char *chore_name; 
    int number; 
    char *due_date; 
    }chore; 
typedef struct _chorelist{ 
    chore **chore_array; 
    int occupied_number; 
    int size_of_array; 
    }chorelist; 

void addChoreToLast(chorelist *chore_list,chore *chore_input) 
{ 
    if(chore_list->occupied_number < chore_list->size_of_array) 
    { 
     chore_list->chore_array[chore_list->occupied_number]=chore_input; 
     chore_list->occupied_number++; 
    } 
    else 
    { 
     chorelist *pChoreList = (struct _chorelist*)malloc(sizeof(struct _chorelist)*chore_list->occupied_number); 
     memcpy(pChoreList,chore_list,sizeof(struct _chorelist*)+sizeof(struct _chore*)+1); 
     pChoreList = chore_list; 
     pChoreList->chore_array[pChoreList->occupied_number]=chore_input; 
     pChoreList->occupied_number++; 
    } 

코드 입력 :

Enter chore name  : Dishes 
Enter chore number : 1 
Enter Date to complete: 04/21/2013 

Enter another chore : Sweeping 
Enter chore number : 4 
Enter Date to complete: 05/02/2013 

코드 출력 :

Entered Chores are : Sweeping, Chore Number: 1, Date: 04/21/2013 
         Sweeping, Chore Number: 4, Date: 05/02/2013 

원하는 출력 : 기본적으로 제공되며 변경할 수 없습니다 내 주요 기능에

Entered Chores are : Dishes,  Chore Number: 1, Date: 04/21/2013 
         Sweeping, Chore Number: 4, Date: 05/02/2013 

, 그것은 initiali 함수를 호출한다. chorelist을 입력하고 chorelist 구조체의 각 멤버에게 메모리를 할당하여 각 멤버에 값과 문자열을 할당 할 수 있습니다. 제 문제는 이미 정의 된 작업 목록을 사용하는 각 함수 호출 후에 자질레의 이름이 바뀌는 것입니다.

내 할당 진술 문은 입니다. addChoreToLast? 미리 감사는

+1

'의 방어 적이기 (pChoreList, chore_list,는 sizeof (구조체 _chorelist를 *) +를 sizeof (구조체 _chore *) + 1);'당신은 수를 곱 깜빡 점유 된 슬롯의 BTW :이 경우 realloc() 쉽습니다. – wildplasser

+0

실제로, realloc이 필요합니다. 이전 목록을 비우는 것이 좋지만 어떤 경우에도 else 블록 전체가 뒤죽박죽이고 부정확합니다 (잘못된 변수를 설정하는 것입니다). –

답변

1

당신은 realloc를 사용할 수 있습니다

void addChoreToLast(chorelist *chore_list,chore *chore_input) { 
    chore **p = NULL; 
    if(chore_list->occupied_number == chore_list->size_of_array) { 
     p = realloc(chore_list->chore_array, (chore_list->size_of_array + 1) * sizeof(chore *)); 
     if(!p) { 
      perror("Can not allocate memory"); 
      return; 
     } 

     chore_list->size_of_array++; 
     chore_list->chore_array = p; 
    } 
    chore_list->chore_array[chore_list->occupied_number]=chore_input; 
    chore_list->occupied_number++; 
} 
+0

@ NicholasWilson 감사합니다! – Bechir

관련 문제