Domanda

Ho i seguenti file .h e .cpp

Se devo includerò i codici completi delle definizioni della funzione

Quando compilo il mio programma ottengo gli errori mostrati alla fine

hash.h

    #define BUCKETS 64
       #define B_ENTRIES 50000
       int curr_tanker;
       typedef unsigned long int ulong;
typedef struct bucket
{
    int bucket_id;
    ulong bucket_entries;
}bucket;

typedef struct tanker_record
{
    ulong tanker_id;
    ulong tanker_size;
    ulong num_of_entries;
    ulong bucket_entry_count;
   }tanker_record;
typedef struct fpinfo
{ 
    unsigned long chunk_offset;
    unsigned long chunk_length;
    unsigned char fing_print[33];

}fpinfo;

struct fpinfo* InitHTable(fpinfo *);
int CreateTanker(tanker_record tr[]);
int Hash_CreateEntry(struct fpinfo *,struct fpinfo he,tanker_record tr);
.

ht.cpp

#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include <iostream>

#include "ht.h"

struct fpinfo* InitHTable(struct fpinfo ht[][B_ENTRIES])
{
}
int CreateTanker(tanker_record tr[])
{
}
int
Hash_CreateEntry(struct fpinfo *t[][B_ENTRIES],struct fpinfo he,tanker_record tr[])
{
}
static void
WriteHTtoFile(struct fpinfo *t[][B_ENTRIES],int this_tanker)
{
}
.

main.cpp

#include<iostream>
#include"ht.cpp"
#include<conio.h>
#include<stdlib.h>

void main(int argc, char **argv)
{
static fpinfo hash_table[BUCKETS][B_ENTRIES];
static tanker_record tr[100];
InitHTable(&hash_table[0][0]);
CreateTanker(tr);
struct fpinfo fp;
... 
ar = Hash_CreateEntry(&hash_table[0][0], fp,tr[0]);
.

Ottengo i seguenti errori quando provo a compilarlo usando VC2010

.

1> Main.obj: Errore LNK2005: "Struct FPInfo * __CDECL INITHTABLE (Struct FPInfo (* Const) [50000])" (? Inithtable @@ yapaufpinfo @@ qay0mdfa @ @@ z) già definito in HT. OBJ

1> Main.obj: Errore LNK2005: "INT __CDECL Createtanker (Struct Tanker_record * Const)" (? Createtanker @@ yahqautanker_record @@@ z) già definito in ht.obj

1> Main.obj: errore LNK2005: "int __cdecl hash_createentry (struct fpinfo * (* const) [50000], struct fpinfo, cisterna strutturale_record * const)" (? hash_createentry @@ yahqay0mdfa @ paufpinfo @@ u1 @ qautanker_record @@@ z) già definito in ht.obj 1> Main.obj: errore LNK2005: "int curr_tanker" (? Curr_tanker @@ 3ha) già definito in ht.obj 1> Main.obj: Errore LNK2019: simbolo esterno irrisolto "int __cdecl hash_createentry (struct fpinfo *, struttura fpinfo, cisterna strutturale_record)" (? Hash_Createentry @@ yahpaufpinfo @@ u1 @ utanker_record @@@@ z) Riferito in funzione _main 1> Main.obj: Errore LNK2019: simbolo esterno irrisolto "Struct FPInfo * __CDECL INITHTABLE (Struct FPInfo *)" (? INTHTABLE @@ Yapaufpinfo @@ pau1 @@ z) Riferito in funzione _main

Grazie per il tuo aiuto !!

È stato utile?

Soluzione

Sei incluso ht.cpp da main.cpp, che includerà tutte le definizioni di funzioni già definite in ht.cpp stesso.

Volete includere invece ht.h.

Non aiuterà in questa situazione, ma dovresti anche proteggere il file di intestazione con le protezioni includono:

#ifndef HT_H
#define HT_H

// contents of ht.h

#endif
.

Hai inoltre bisogno degli argomenti delle dichiarazioni della funzione per adattarsi a quelle delle definizioni:

struct fpinfo* InitHTable(struct fpinfo[][B_ENTRIES]);
// Missing:                              ^^^^^^^^^^^

int CreateTanker(tanker_record tr[]); // OK

int Hash_CreateEntry(struct fpinfo*[][B_ENTRIES],struct fpinfo,tanker_record[]);
// Missing                         ^^^^^^^^^^^^^                            ^^
.

Altri suggerimenti

Aggiungi una "Includi Guard" nel tuo intestazione, in modo che i suoi contenuti non siano "visti" due volte dopo la pre-elaborazione.Per Microsoft, #pragma once all'inizio del file .h.In generale, aggiungi:

#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif
.

Assicurati di adottare uno schema di denominazione "unico" coerente per ciascuna delle tue intestazioni.__YOUR_HEADER_H farebbe, ad esempio customio.h in __CUSTOM_IO_H.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top