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 *));
The: bir işlev işaretçisi olarak
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
'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
İş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) –