1

各ノードにデータ (1.0 ~ 9.0 の double 値) を追加しました。今、各データにアクセスして、各ノードの double 値が負 (-1.0 から -9.0) になるように変更しようとしています。

void traverseList(struct List *list, void (*func) (void *)) {
    struct Node *current = list->head;
    while(current) {
        func(current->data);
        current = current->next;
    }
}

void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

上記を次のように呼び出しています。

traverseList(&list, &changeToNegative);
traverseList(&list, &print);

ただし、まだ正の値しか出力されません...新しいメモリ位置をデータに再割り当てしているため、古いメモリ位置をまだ指している方法がわかりません。どんな助けでも大歓迎です!

4

4 に答える 4

2

以下のようにコードを変更します。データへのポインターを割り当てる代わりに、以下のように値を割り当てます

void changeToNegative(void *data) {
   double newData = *((double*)data) * -1.0;
   *data = newData;
}

このようにして、データが指す値を変更し、変更が永続的になります。

于 2013-03-02T21:47:22.603 に答える
2

あなたのエラー:

void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

changeToNegative(void *data)変更している機能ではdata。あなたが変更する間*datavoid* data呼び出し関数の変更を反映するように、引数はアドレスで渡されます。

単純に次のようにします。

   void changeToNegative(void *data) { 
      *((double*)data) *=-1;   // nagt value pointed data pointer
   }
于 2013-03-02T21:49:47.887 に答える
0
void changeToNegative(void *data) {
    double* theData = (double*)data;
    *theData = (*theData) * -1.0;
}

data関数内のローカル コピーに変更されたデータのアドレスを割り当てていましたchangeToNegativeが、これは呼び出し元の関数には反映されません。代わりにdata、インプレースを逆参照して変更し、変更が呼び出し元に反映されるようにします。

于 2013-03-02T21:51:23.767 に答える
0
void changeToNegative(void *data) {
    double newData = *((double*)data) * -1.0;
    data = &newData;
}

この関数の最後の行は、最初に関数に渡された場所よりも新しい場所を指すように指定されたポインターを設定します。元のメモリ位置に保存されているデータには影響dataしません。代わりに、ポインターを逆参照して新しい値に設定します。

*data = *((double*)newData);
于 2013-03-02T21:55:28.543 に答える