Saya menggunakan adt generik yang memiliki typedefs tersebut:

typedef void *Element;
typedef Element(*copyElements)(Element);
typedef Element(*copyElements)(Element);
typedef void(*freeElements)Element);

Dan saya harus meneruskannya menggunakan fungsi create ini:

GenericAdt create(copyElements copy,freeElements destroy);

Jadi pertanyaan saya adalah: 1) ketika saya menulis fungsi salin yang ingin saya berikan ke fungsi buat ini, dapatkah saya menulisnya sebagai

SomeOtherType copy( SomeOtherType a);

Dan bukan sebagai

Element copy(Element);

???

  1. pertanyaan yang sama untuk fungsi gratis dapatkah saya menulisnya sebagai
void destroy(SomeOtherType a);

Dan bukan sebagai

void destroy( Element a);

???

1
raghad 9 Mei 2021, 17:34

1 menjawab

Jawaban Terbaik

Fungsi yang Anda berikan sebagai parameter ke create harus kompatibel dengan jenis parameter.

Agar dua tipe fungsi kompatibel, jumlah dan tipe argumen harus sama dan tipe yang dikembalikan harus sama. Dalam contoh Anda, SomeOtherType copy( SomeOtherType a) tidak kompatibel dengan tipe copyElements karena tipe yang dikembalikan berbeda dan tipe parameternya berbeda. Hal yang sama berlaku untuk void destroy(SomeOtherType a). Jadi Anda tidak dapat meneruskan ini ke fungsi create.

Buat fungsi-fungsi ini dengan tipe yang sesuai, dan berikan pointer yang relevan di dalam fungsi:

Element copy(Element e)
{
    struct SomeOtherType *oldvalue = (struct SomeOtherType *)e;
    
    struct SomeOtherType *newvalue = malloc(sizeof *newvalue ));
    // populate newvalue 
    return (Element)newvalue;
}

Juga mengenai typedef ini:

typedef void *Element;

Biasanya bukan ide yang baik untuk menyembunyikan pointer objek di belakang typedef karena dapat menyebabkan kebingungan bagi pembaca mengenai apakah pointer sedang digunakan atau tidak. Namun untuk penunjuk fungsi, ini lebih dapat diterima karena meningkatkan keterbacaan.

0
dbush 11 Mei 2021, 15:20