-1

フォーラムをしばらく検索しましたが、この問題を解決できないようです。コンパイルして、私が必要とするほとんどすべてのことを行いますが、1 つだけ問題があります。構造体 chore へのポインターのポインターである chore_array を更新するたびに、新しい更新によって以前の割り当てがすべて置き換えられます。

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

本質的に与えられ、変更できないメイン関数では、chorelistを初期化し、 chorelist構造体の各メンバーにメモリを割り当てる関数を呼び出して、各メンバーに値と文字列を割り当てることができます。私の問題は、既に確立された日課リストを取り込む関数の呼び出しのたびに、日課の名前が置き換えられることです。

addChoreToLastの割り当てステートメントは無効ですか? 前もって感謝します

4

1 に答える 1

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++;
}
于 2013-04-13T19:29:07.183 に答える