PDA

View Full Version : مبتدی: linker errore



mortezamsp
پنج شنبه 24 دی 1388, 18:38 عصر
معنی این خطا چیه ؟ خواهشا زود !

Error 3 error LNK2005: "int __cdecl MSP_memset(int *,int,int)" (?MSP_memset@@YAHPAHHH@Z) already defined in MainProc.obj MSP_NetworkNodeClass.obj DistanceVectore


منظورش اینه که من تابع msp_memset رو دوبار include کردم ؟ نباید اینطور باشه ! چون در فایل هدری که تابع msp_memsetm در اون هست ، از دستور ifndef استفاده کردم ! پس منظورش چیه ؟



بعدش ، منظور از فتحعلی ارور (fatal errore) چیه ؟

Error 14 fatal error LNK1120: 1 unresolved externals E:\Visual Studio 2008\Projects\DistanceVectore\Debug\DistanceVector e.exe 1 DistanceVectore

clover
پنج شنبه 24 دی 1388, 18:59 عصر
منظورش اینه که من تابع msp_memset رو دوبار include کردم ؟
نه لزوما، میگه دوبار تعریف کردید، شاید در تابع main یا یه جای دیگه.

بعدش ، منظور از فتحعلی ارور (fatal errore) چیه ؟
خطای مهلک، همون خطا

mortezamsp
پنج شنبه 24 دی 1388, 19:04 عصر
خب من هرچی نگاه میکنم چیزی پیدا نمیشه !
شما میشه نگاه کنین ببینین عیب این برنامه مسخره کجاست ؟؟؟؟

ببین نقشه فایلاش اینطوریه :


main.cpp : include msp_newnetworkclass.cpp
msp_newnetworkclass.cpp : include msp_newnetworkclass.h
msp_newnetworkclass.h : include msp_networknodeclass.cpp
msp_networknodeclass.cpp : include msp_networknodeclass.h , msp.h


تا حالا 200 بار این صفحه رو ریلود کردم ! نیومدی !

clover
پنج شنبه 24 دی 1388, 19:40 عصر
1- نام هدر فایل به حروف کوچک و بزرگ حساس است. نام ها تصحیح شد.
2- سازنده یNetworkNode اعلان شده بود اما پیاده سازی نشده بود.
3- در تابع NewNetwork :: readInputfile اشاره گری به نام header تعریف شده اما فضای مورد نیاز تخصیص داده نشده بود.

mortezamsp
پنج شنبه 24 دی 1388, 20:01 عصر
آقا یه دنیا ممنون . نفهمیدم چطور درست شد :گیج: ولی بهرحال ممنوووووون . شما 12 منو گردید 14 !

چرا iostream و conio و اینها رو اگر تو main اظافه میکردی ایراد میگرفت ولی حالا که تو یکی از کلاس ها زدید درست گرفت ؟
فکرمیکنم اگه تو main اظافه کنی باید همه اونو بشناسن ! چون بالاتر از همه اظافشون کرده بودم!

clover
پنج شنبه 24 دی 1388, 20:10 عصر
نفهمیدم چطور درست شد
وقتی هدر فایل ها را بدون رعایت کوچکی و بزرگی حروف تعریف کنید، برنامه قادر به پیدا کردن هدر فایل نیست، پس اعلان توابع در هدر فایل با پیاده سازی آن در فایل cpp به عنوان دو اعلان جدا از هم در نظر گرفته می شوند. در واقع هیچ کدام از هدر های شما در فایل های مورد استفاده ضمیمه نشده بود.


چرا iostream و conio و اینها رو اگر تو main اظافه میکردی ایراد میگرفت ولی حالا که تو یکی از کلاس ها زدید درست گرفت ؟
من این مورد را تغییری ندادم

فکرمیکنم اگه تو main اظافه کنی باید همه اونو بشناسن
متوجه منظورتون نمیشم.
در هر فایلی باید هدر ها را به صورت جداگانه اضافه کنید مگر اینکه یکی از هدر ها شامل تعریف هدر دیگر هم باشد.

mortezamsp
پنج شنبه 24 دی 1388, 20:16 عصر
ببین : تو تابع main اول iostram ,conio ,string و اینها را اظافه میکنی بعدش میای map_networknodeclass رو اظافه میکنی . خب ! چون اول اون فایل ها رو اظافه کردی ، حالا دیگه لازم نیست تو msp_networknode دوباره تعریفشون کنی . خودش اینارو میشناسه .درسته ؟؟


حالا یه چیز دیگه ! ببین تو فایل هدر msp.h یه متغیر دارم به اسم LoopCounter .
int LoopCounter = 0 ; چیکارکنم وقتیکه در دوجا msp.h تاظافه شد ، اشکال redefinition برای LoopCounter نگیره ؟ من اول فایل msp.h دستور #ifndef رو اظافه کردم . فکرمیکنم معنی این دستور اینه : اگر این فایل قبلا include نشده ، آنرا include کن . درسته ؟

clover
پنج شنبه 24 دی 1388, 21:10 عصر
تو تابع main اول iostram ,conio ,string و اینها را اظافه میکنی بعدش میای map_networknodeclass رو اظافه میکنی . خب ! چون اول اون فایل ها رو اظافه کردی ، حالا دیگه لازم نیست تو msp_networknode دوباره تعریفشون کنی . خودش اینارو میشناسه .درسته ؟؟
خیر، هدر هایی که در فایل main.cpp ضمیمه می کنید فقط برای همان فایل مورد استفاده قرار می گیرند.
عکس این مطلب می تواند درست باشد، یعنی اگر شما هدر فایل هایی را در فایل map_networknodeclass.h اضافه کنید و بعد این فایل را به فایل main.cpp ضمیمه کنید کلیه هدر فایل ضمیمه به map_networknodeclass.h به main.cpp هم ضمیمه شده اند(در واقع مانند این است که کل کد map_networknodeclass.h را در ابتدای فایل main.cpp نوشته باشیم).

فکرمیکنم معنی این دستور اینه : اگر این فایل قبلا include نشده ، آنرا include کن . درسته ؟
معنی این دستور به صورت دقیق این است:
ifndef SAMPLE_H# : اگر شناسه ی SAMPLE_H تا به حال اعلان نشده است.
define SAMPLE_H# : شناسه ی SAMPLE_H را اعلان کن.
کدها را تا رسیدن به پایان بلاک شرط اجرا کن.
endif# : پایان بلاک شرط.

هردفعه ای که هدر sample.h را در جایی ضمیمه می کنید کدهای این هدر فایل اجرا می شوند. در دفعه ی اول چون شناسه ی SAMPLE_H تا کنون در جایی از برنامه اعلان نشده است، شرط برقرار است بنابر این شناسه ی SAMPLE_H اعلان شده و بقیه کدهای داخل بلاک شرطی هم اجرا می شوند. در دفعات بعدی چون شناسه ی SAMPLE_H یکبار اعلان شده است، شرط برقرار نیست و کدهای داخل بلاک شرطی اجرا نمی شوند بنابر این از تعریف چند باره ی کلاس ها ، توابع و یا متغیر های (کلا شناسه های) داخل هدر فایل (آنهایی که درون بلاک شرطی هستند) جلوگیری می شود.


چیکارکنم وقتیکه در دوجا msp.h تاظافه شد ، اشکال redefinition برای LoopCounter نگیره ؟
فکر می کنم روش معمول همان است که خودتان استفاده کرده اید (استفاده از دستور پیش پردازنده ifndef#)

موفق باشید

mortezamsp
پنج شنبه 24 دی 1388, 21:14 عصر
مرسیییییییییییییییییییی.

من اون مشکل LoopCounter رو اینطوری حل کردم :


#ifndef MSP_H
#define MSP_H
int MSP_LoopCounter = 0 ;
#endif
#ifdef MSP_H
......
#endif