الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استدعاء Function من ملف آخر

بدأه محمد بن مبارك في 3 مارس 2010 · 5 رد · 520 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الاخوة الاعزاء

السلام عليكم

سؤالي هو التالي: عندي ملف سي فيه function تقوم بجمع عددين وترجع مجموعهم(add1.c). وهناك header file لهذا الملف (add1.h) ومعرف فيه هذه ال function.

عندي ملف آخر يدعى main.c واريد استدعاء الوظيقة الموجودة في الملف الاول (add1.c) ، ولكن احصل على الخطأ التالي: [Linker error] undefined reference to `addnum'

مع العلم اني قمت بعمل include "add1.h" في ملف السي main.c

ملحوظة انا استخدم Dev-C++

مرفق ملفات السي والهيدر فيل.

ارجو المساعدة

مع خالص الشكر

/*

* add.c

*/

#include "add1.h"

int addnum(int a, int b)

{

return a+b;

}

===========================

/*

* add1.h

*/

#ifndef ADD1_H

#define ADD1_H

int addnum(int a, int b);

#endif

===========================

/*

* main.c

*/

#include <stdio.h>

#include "add1.h"

int main (void) {

int i,j, k;

i=4;

j=5;

int z = addnum(i,j);

printf("%d\n", z);

return 0;

}

تم تعديل هذه المشاركة بواسطة محمد بن مبارك في 3 مارس 2010 في 10:47

#2

أين الاخوة المشرفين والاعضاء؟

أرجوا المساعدة اذا أمكن.

#3

السلام عليكم........

لم اتعامل مع اكواد سي الا مرات قليلة ولكن واضح من الخطأ ان هناك خطأ في الربط بين الملفات

قم بتعديل الاتي:

حول add1.h الى add.h وهو المتعارف عليه ان يكون الheader file و source file لهما نفس الاسم.

في ملف add.c عدل تضمين ملف الترويسة من add1.h الى add.h

في main.c قم بتعديل <add1.h> الى <add.c>

ويكون الكود كما يلي:

هذا هو الheader file

/*
* add.h
*/
#ifndef ADD1_H
#define ADD1_H

int addnum(int a, int b);


#endif

وهذا هو source file

/*
* add.c
*/
#include "add.h"

int addnum(int a, int b)
{
return a+b;
}

وهذا هو main file

/*
* main.c
*/
#include <stdio.h>
#include "add.c"

int main (void) {
int i,j, k;
i=4;
j=5;
int z = addnum(i,j);
printf("%d\n", z);
return 0;
}

وشكرا.....

اذا واجهتك مشكلة قم بطرحها

#4

الا العزيز أحمد

شكرا على مساعدتك

بالنسبة ان يكون الheader file و source file لهما نفس الاسم، بالفعل تم ذلك.

ولكن بخصوص ال include

هل من الصحيح ان يتم عمل include"add.c" بدلا من include "add.h" ؟؟؟ مع أنه البرنامج اشتغل بعد هذا التعديل؟ ولكن هل هذا صحيح في قواعد اللغة.

لاني حسب معرفتي وقرآتي انه يتم فقط عمل الضم للهيدر فيل وليس للسورس فيل؟؟

مرة اخرى أكرر فائق شكري وتقديري

#5

عندما يكون حجم المشروع كبيرا يتم تقسيم الكود على مجموعه من الملفات كلٌ بإسم يوضح محتواه فمثلا نفترض انك تقوم بصنع مشروع مجموعه من الدوال التى تتعامل مع النصوص مثل التالى

// StringA.h

#ifndef STRING_ANSI_H
#define STRING_ANSI_H

int   IndexOf(const char* dest, const char* find, int start_index, int count, bool ignoreCase);  // 170 Line Code
int   LastIndexOf(const char* src, const char* find, int start_index, int count, bool ignoreCase); // 147 Line Code
bool  Remove(char* dest, const char* val, int start_index, int count, bool ignoreCase); // 83 Line Code
bool  Replace(char* dest, const char* find, const char* replace, int start_index, int count, bool ignoreCase); // 210 Line Code

#endif

كل داله من السابقين تحتاج منك على الأقل 80 سطر كود لذا فلابد منك لفصلهم فى ملفات مختلفه و ذلك لتسهل عليك تصفحهم و تنقيحهم او اضافة اصدارات جديده من هذه الدوال، لذا ستقوم بعمل ملفات اكوادد كلٌ بإسم الداله التى تحتويه و ذلك لإنه من غير المنطقى تسمية الملفات StringA_1.c، StringA_2.c و هكذا.

اقتباس
هل من الصحيح ان يتم عمل include"add.c" بدلا من include "add.h" ؟؟؟

لا هذا غير صحيح، و لن يعمل مع كل المترجمات (لم تعمل مع مترجم VC++ 9) و لكن الصحيح هو عمل Include لملفات الـ Header او Pre-Compiled Header.

بالنسبه للكود المرفق فى المشاركه رقم 1 قمت بتنفيذه لدى على مترجم VC++9 و قد عمل دون مشاكل و هذه هى النسخه التى اعمل عليها:

// File add1.h

#ifndef ADD1_H
#define ADD1_H

int addnum(int a, int b);

#endif

// File Add.c
#include "add1.h"

int addnum(int a, int b)
{ return a + b; }

// File mainp.c
// main entry point

#include <stdio.h>
#include "add1.h"

int main()
{
	int result = addnum(5, 5);

	printf("5 + 5 = %i\n", result);

	return 1;
}

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 5 مارس 2010 في 07:02

مدونتي: C++ Tips and Tricks

#6

بالفعل كلام الاخ محمد صحيح يتم عمل تضمين للheader

انا اسف بشان هذا الخطأ وهو بسبب طول غيابي عن كتابة الاكواد بسبب الامتحانات :blink:

اكرر اسفي...........

مواضيع مشابهة