עבור לתוכן

בעיית קומפילציה בVC++ - טוען שהפונקציה כבר הוגדרה בmain

Featured Replies

פורסם

שגיאה לדוגמה

1>Parser.obj : error LNK2005: "void __cdecl addEntry(class MyString,int)" (?addEntry@@YAXVMyString@@H@Z) already defined in main.obj

הקוד:

#ifndef SymbolTable
#define SymbolTable
#include <string.h>
#include <iostream>
#include "MyString.h"
using namespace std;

MyString* Mysymbol;
int* value;
int symbolsNum=0;
void addEntry(MyString symbl, int address)
{
if (symbolsNum==0)
{
Mysymbol=new(nothrow) MyString[1];
Mysymbol[0]=symbl;
value=new(nothrow) int[1];
value[0]=address;
symbolsNum++;
}
else
{
MyString* tmpsymbol;
tmpsymbol = new(nothrow) MyString[symbolsNum];
int* tmpvalue;
tmpvalue = new(nothrow) int[symbolsNum];
for(int i=0; i<symbolsNum; i++)
{
tmpsymbol[i]=Mysymbol[i];
tmpvalue[i]=value[i];
}
delete [] Mysymbol;
delete [] value;
symbolsNum++;
Mysymbol=new(nothrow) MyString[symbolsNum];
value=new(nothrow) int[symbolsNum];
for(int i=0; i<symbolsNum-1; i++)
{
Mysymbol[i]=tmpsymbol[i];
value[i]=tmpvalue[i];
}
delete [] tmpsymbol;
delete [] tmpvalue;
Mysymbol[symbolsNum-1]=symbl;
value[symbolsNum-1]=address;
}
}

int FindPlace(MyString Str)
{
bool Ans = false;
int i=0;
while (Ans==false && i<symbolsNum)
{
if (strcmp(Mysymbol[i].get_string(), Str.get_string())==0)
Ans=true;
i++;
}
if (Ans)
return i-1;
else
return -1;
}

bool Contains(MyString Str)
{
if (FindPlace(Str)>=0)
return true;
else
return false;
}

int GetAddress(MyString Str)
{
int add = FindPlace(Str);
if (add>=0)
return value[add];
else
return -1;
}
void Test()
{
for (int i=0; i<symbolsNum; i++)
cout<<"Symbol: "<<Mysymbol[i]<<" Address: "<<value[i]<<endl;
}
#endif

אם יש צורך בקוד של הmain אני אוסיף אותו

כפי שאפשר לראות, כל הפונקציות הם מאותו קובץ, הפכתי את ה#include "SymbolTable.h" בmain להערה, וכך גם עשיתי לכל הפונקציות ששייכות לSymbolTable בmain, עדיין אותן שגיאות (9 שגיאות, אחת לכל משתנה גלובלי ואחת לכל פונקציה)

הצילו! זה דיי דחוף לי :(

תודה מראש

איל

עריכה: אני מניח שזה לא משנה, אבל כל הקוד נמצא בקובץ HEADER אחד ואין קובץ CPP מתאים

פורסם

בטח שזה משנה. כל קובץ שעושה אינקלוד לקובץ הזה בעצם מגדיר מחדש את הפונקציות האלה, וזה מה שגורם לבעיה.

לא ממשמשים פונקציות בקובץ h אלא אם הן פונקציות inline.

פורסם

לא ממשמשים פונקציות בקובץ h אלא אם הן פונקציות inline.

(או אם הן template ואין ברירה, ואז צריך להזהר.)

אם זה עדיין לא ברור: #include זה הוראה ל-preprocessor שגורמת לו לקחת את תוכן הקובץ הכלול ולשפוך את כל התוכן לתוך הקובץ הכולל.

פורסם
  • מחבר

אהא... טוב... זה מסביר, תודה

(תיקנתי ואין אף שגיאה... פשוט הנחתי שבגלל שאפשר לממש חלק מהפונקציות בקובץ H אז אפשר לממש גם את כולן בלי קובץ CPP... וכל מה שאני יודע על התהליך שלפני הקומפילציה זה שזה עושה לינק בין הקבצים)

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים