2016-10-22 7 views
0

私は多かれ少なかれ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 
+2

いただきまし 'delaysToCopyと間違っ[i]の[i]の遅延を=;'? 'delaysToCopy [i]'と 'delay [i]'はポインタではなく浮動小数点数です。 – tkausl

+0

次に、** _ free()_ **または** _ delete _ **の '** _遅延_ **'ベクトルを作成すると、私の '** _ delaysToCopy _ **'にはまだ値が入りますか? @ tkausl – wj127

+0

はい、どうでしょうか? 'memcpy(dest、source、sizeof(float));' 'dest'と' source'の両方が浮動小数点ポインタである場合は、 '* dest = * source;'と_equivalent_です。 – tkausl

答えて

1

問題は、memcpy()関数に渡した引数がma関数の署名付きのtch。次のようにのmemcpy()関数のシグネチャは次のとおりです(http://www.cplusplus.com/reference/cstring/memcpy/

void * memcpy (void * destination, const void * source, size_t num); 

あなたはdelaysToCopy[i]delays[i]だけで浮くのポインタではありません一方で、それは、その第一及び第二引数としてポインタを取る見ての通り。

あなたは自分のアドレスを取得するためにアンパサンド記号を使用する場合は、以下に示すように、それは、あなたの問題を解決する必要があります:

memcpy(&delaysToCopy[i], &delays[i], sizeof(float)); 
+0

ありがとうございます@J。マットこの説明は、私がこの場合のポインタで概念を誤解しているように見えるので、問題を理解させました... – wj127

関連する問題