私は多かれ少なかれCでポインタを使用しているので、私はいくつかの恐ろしい間違いをすると申し訳ありません!この場合、浮動ベクトルのすべての要素を別の要素にコピーしようとしています。誰かがタイプでこのエラーが発生する理由を説明できますか?
I持って正常に動作します私のmain.cのファイル、内のコードの塊次
/* NOTE: hash_list is a global variable*/
void insertDataIntoOurHashList(int dia, int delay, char *aeO, char *aeD){
unsigned int numHash;
ListData *listData;
numHash = getHashValue(aeO);
/* If there's no list yet in this position, then... */
if (hash_list[numHash] == NULL) {
hash_list[numHash] = malloc(sizeof(List));
initList(hash_list[numHash]);
listData = malloc(sizeof(ListData));
listData->key = malloc(sizeof(char*)*strlen(aeD)+1);
strcpy(listData->key, aeD);
listData->key_sec = malloc(sizeof(char*)*strlen(aeO)+1);
strcpy(listData->key_sec, aeO);
listData->numTimes = 1;
listData->retrasos = (float*) malloc(sizeof(float)*7);
listData->retrasos[dia-1] = delay;
insertList(hash_list[numHash], listData);
}
else {
listData = findList2(hash_list[numHash],aeD,aeO);
/* If already exists a data with both equals keys, then... */
if (listData != NULL) {
listData->numTimes++; // We add in one the counter of the list
listData->retrasos[dia-1] = listData->retrasos[dia-1] + delay/2;
}
/* If exists a data with the same aeD as primary key but not with the aeO as secundary key, then... */
else {
listData = malloc(sizeof(ListData));
listData->key = malloc(sizeof(char*)*strlen(aeD)+1);
strcpy(listData->key, aeD);
listData->key_sec = malloc(sizeof(char*)*strlen(aeO)+1);
strcpy(listData->key_sec, aeO);
listData->numTimes = 1;
listData->retrasos = (float*) malloc(sizeof(float)*7);
listData->retrasos[dia-1] = delay;
insertList(hash_list[numHash], listData);
}
}
free(aeO);
free(aeD);
}
たListData * listDataプロパティはで定義された構造を指すポインタであります私のlinked-list.hファイル_hash_list_は、タイプのポインターのベクトルです一覧ところ、同じファイルで定義された型一覧、のリストに各1ポイント:私のmain.cのファイルに戻って、次に
/**
*
* The TYPE_LIST_KEY is used to define the type of the primary
* key used to index data in the list.
*
*/
#define TYPE_LIST_KEY char*
/**
*
* This structure holds the information to be stored at each list item. Change
* this structure according to your needs. In order to make this library work,
* you also need to adapt the functions compEQ and freeListData. For the
* current implementation the "key" member is used search within the list.
*
*/
typedef struct ListData_ {
// The variable used to index the list has to be called "key".
TYPE_LIST_KEY key;
char *key_sec;
// This is the additional information that will be stored
// within the structure. This additional information is associated
// to the key. You may include any field you may need useful.
float *retrasos;
int numTimes;
} ListData;
/**
*
* The item structure
*
*/
typedef struct ListItem_ {
ListData *data;
struct ListItem_ *next;
} ListItem;
/**
*
* The list structure
*
*/
typedef struct List_ {
int numItems;
ListItem *first;
} List;
、Iループのすべてを通じて私の_hash_list_のセルで、そのセルのポインタが指しているリストを渡し、リストからデータを取り出して別の関数に渡す関数に渡すと、私は意味します:
void insertInHash(){
int i;
for(i = 0; i < HASH_SIZE; i++){
if (hash_list[i] != NULL) {
dumpList2(hash_list[i]);
}
}
}
/* This function is called for every cell while looping the hash_list */
void dumpList2(List *l){
ListItem *current;
current = l->first;
while (current != NULL)
{
insertDataIntoOurTree(current->data->key_sec, current->data->key, current->data->retrasos);
current = current->next;
}
}
void insertDataIntoOurTree(char *aeO, char *aeD, float *delays){
List *list;
ListData *listData;
int i;
/* Case when the node exists! */
if (treeData != NULL) {
treeData->num++; // We add in one the counter of treeData
listData = findList(treeData->list, aeD); // We check if the new destination airport is inside the list of the node...
/* If the destination is inside the list... */
if(listData != NULL)
listData->numTimes++; // We add in one the counter of the list
/* If the destination isn't inside... */
else {
/* We create and initialize the new item the list of the node will contain! */
listData = malloc(sizeof(ListData));
listData->key = malloc(sizeof(char*)*strlen(aeD)+1); // Counting with the final '\0' byte!
strcpy(listData->key, aeD); // Remember the case as above with aeO and aeD
listData->numTimes = 1;
listData->retrasos = (float*) malloc(sizeof(float)*7);
//listData->retrasos[dia-1] = delay; // minus one cos we don't want to be out of bound! ;)
//copyDelays(listData->retrasos, delays);
for (i = 0; i < 7; i++) {
listData->retrasos[i] = 0.0;
}
copyDelays(listData->retrasos, delays);
insertList(treeData->list, listData);
}
}
/* THERE ARE MORE CASES DOWN HERE, BUT THEY DON'T MATTER NOW... */
}
機能copyDelaysは私のリンク-list.cファイルに定義されています。
void copyDelays(float *delaysToCopy, float *delays){
int i;
for (i = 0; i < 7; i++) {
if (delaysToCopy[i] == 0.0) {
memcpy(delaysToCopy[i], delays[i], sizeof(float));
}
}
}
そして、私はすべてのファイルをコンパイルしようとすると、最終的には、私がいることを、このエラーが出ます私は理解していません:
linked-list.c:234:14: error: passing 'float' to parameter of incompatible type 'const void *'
memcpy(delaysToCopy[i], delays[i], sizeof(float*));
^~~~~~~~~~~~~~~
/usr/include/secure/_string.h:65:59: note: expanded from macro 'memcpy'
__builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))
^~~~
/usr/include/secure/_common.h:38:55: note: expanded from macro '__darwin_obsz0'
#define __darwin_obsz0(object) __builtin_object_size (object, 0)
^~~~~~
1 error generated.
make: *** [linked-list.o] Error 1
いただきまし 'delaysToCopyと間違っ[i]の[i]の遅延を=;'? 'delaysToCopy [i]'と 'delay [i]'はポインタではなく浮動小数点数です。 – tkausl
次に、** _ free()_ **または** _ delete _ **の '** _遅延_ **'ベクトルを作成すると、私の '** _ delaysToCopy _ **'にはまだ値が入りますか? @ tkausl – wj127
はい、どうでしょうか? 'memcpy(dest、source、sizeof(float));' 'dest'と' source'の両方が浮動小数点ポインタである場合は、 '* dest = * source;'と_equivalent_です。 – tkausl