2016-04-07 24 views
0

Tam hata mesajı bir rvalue adresini alamazC hatası: türü 'boşluk'

dll.c:89:13: error: cannot take the address of an rvalue of type 'void' arr2[i] = &(*remove)(list);

Benim işlevi, 4 parametreleri, bir iki dizi bir uzunluk değeri, bir kaldırma fonksiyonu almak gerekiyordu ve bir ekleme işlevi. Daha sonra ilk dizinin değerlerini alır ve bunları bağlantılı bir listeye yerleştirir. Ardından, bağlantılı listeden değerleri kaldırır ve bunları 2. diziye ekler. Sorun yaşadığım kısım, değerleri ikinci diziye eklemek. Problemin işaretçilerle ilgili anlayışımla ilgili olduğunu biliyorum. Dizilerin void * olduğunu ve kaldırma işlevimin void * döndürdüğünü biliyorum, bu yüzden başlangıçta arr2[i] = (*remove)(list)'u denedim ancak bir derleyici hatası da aldım. Bu yüzden, bu geçmişte işe yaradığı için (iyi bir neden bilmiyorum) & ekledim ve şimdi bu hatayı alıyorum. Herhangi bir yardım için teşekkürler.

void transfer(char *arr1, char *arr2, int length, void (*insert)(List *, void *), void* (*remove)(List *)) { 
    List *list = List_create(); 

    for (int i=0; i < length; i++) { 
     (*insert)(list, &arr1[i]); 
    } 

    for (int i=0; i < length; i++) { 
     arr2[i] = &(*remove)(list); 
    } 
} 

sizin remove fonksiyonun imza buradan diyoruz

void remove(List *); 

olduğunu

#include <stdlib.h> 

typedef struct ListNode { 
    struct ListNode *next; 
    struct ListNode *prev; 
    void *value; 
} ListNode; 

typedef struct List { 
    int count; 
    ListNode *first; 
    ListNode *last; 
} List; 

List *List_create(void); 

void add_to_back(List *list, void *value); 
void *remove_from_back(List *list); 

void add_to_front(List *list, void *value); 
void *remove_from_front(List *list); 

void transfer(void *arr1, void *arr2, int length, void (*insert)(List *, void *), void* (*remove)(List *)); 
+1

The: bir işlev işaretçisi olarak

void* remove(List *); 

ileti bir C derleyicisinden görünmüyor. Bir C++ derleyici kullanırsanız, etiketleri değiştirin veya bir C derleyici deneyin. C ve C++ farklı dillerdir. – Olaf

+0

'void *' işaretçiyi herhangi bir nesne türüne gösterdiğinde kullanılan yer tutucu türüdür. Dizi öğelerinin türleri bilinmiyor olduğundan, dizine ekleyemezsiniz. Bunun gibi bir işlev, arayandaki 'sizeof (elementType)' den gelen bir 'boyut 'parametresi almalıdır. – Barmar

+0

İşlev işaretçiniz "kaldır", "void *" değil "void" değerini döndürür. Bu işlevi, gerçekten 'void * 'döndüren bir işlevin bir adresi olarak gönderirseniz, derleyicinin şikayet ettiğini görmelisiniz. Bu işlevi nasıl çağırdığınızı gösterdiyseniz (ve aynı zamanda adresi ilettiğiniz işlev) –

cevap

3

Başlık Dosya:

arr2[i] = &(*remove)(list); 

ama dönüş değeri olarak void öyle '

// arr2[i] = &(void); 

gibi ler Bunu kaldır kaldırılan öğe için bir işaretçi döndürür geliyordu düşünüyorum, ama sonra imza olması gerektiği gibi:

void* (*remove)(List *)) 
+0

aşağıdaki geçersiz 'transferi (void * arr1 için imzamı güncellenen, boşluk * ARR2, int uzunluk, void (* insert) (Liste *, void *), void * (* remove) (Liste *)) 'ama Im hala aynı hatayı size' transfer' yöntemini çağırın nasıl –

+0

alma? 'Kaldır' beyanının/tanımının imzası nasıl görünür? İşlev parametrenizin imzasını yalnızca ayarlamanız yeterli değildir. – cwschmidt

+0

actuallly hata mesajı biraz farklı 'hatadır: türü 'void *'' bir rvalue adresini alamaz. Henüz transferi aramadım ama eklenti ile benim başlık dosyasını gönderebilir ve ben kaldırırsanız fonksiyonları –