وظيفة SQRT () لا تعمل مع وسيطات متغيرة [مكررة
-
30-09-2019 - |
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
لا أعرف ما إذا كنت أفتقد شيئًا واضحًا ، لكن يبدو أنني غير قادر على حساب جذور مربعة من عامل في ج. يبدو أن وظيفة SQRT () تعمل فقط على الثوابت. هذا هو الكود الخاص بي:
#include <math.h>
#include <stdio.h>
int main()
{
double a = 2.0;
double b = sqrt(a);
printf("%f", b);
return 0;
}
عندما أقوم بتشغيل هذا البرنامج ، أحصل على الخطأ التالي:
gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.
ومع ذلك ، إذا استبدلت الوسيطة في SQRT () ثابت مثل 2.0 على سبيل المثال ، (b = sqrt(2.0)
) ، ثم يعمل بشكل جيد. هل من المفترض أن تعمل SQRT () مع المتغيرات أو شيء من هذا القبيل؟
شكرا للمساعدة
المحلول
تحتاج إلى الارتباط بمكتبة الرياضيات (استخدم "-lm" على سطر الأوامر). في الحالة الثابتة ، من المحتمل أن يكون المترجم ذكيًا ومسبقًا لـ SQRT (2.0) (وبالتالي فإن الكود الذي تم تجميعه هو أساسًا "B = 1.414 ... ؛ ')
نصائح أخرى
ربما تحتاج إلى إضافة -lm
عند التجميع. عندما تأخذ الجذر التربيعي للثابت ، يقوم المترجم بتحسين الكود عن طريق أخذ الجذر التربيعي أثناء تجميعه ، لذلك لا يستخدم sqrt
على الاطلاق.
استخدم الأمر gcc -Wall -o "test2" "test2.c" -lm
والتي من المحتمل أن تصلح هذا.
ويشمل ذلك مكتبة الرياضيات بالإضافة إلى مكتبة وقت التشغيل القياسية. في معظم الأنظمة ، تعد مكتبة الرياضيات تاريخياً كيانًا منفصلًا يحتاج إلى طلب صراحة.
في حالة GCC ، تحتاج إلى ربط المكتبة.
GCC Filename.c -lm.
ومع ذلك ، في حالة G ++ لا حاجة لربط المكتبة بحيث يعمل هذا بشكل جيد:
g ++ filename.c -o fileName بمجرد نجاح التجميع.
لتشغيل ببساطة إدخال ./filename في G ++. وأدخل ./A.out في مجلس التعاون الخليجي.
جمع مع:
gcc -Wall -o test2 test2.c -lm
تحتاج إلى الارتباط مع مكتبة الرياضيات.
قم بتضمين مكتبة الرياضيات باستخدام "مشغل"
#include " math.h "
برنامج التجميع باستخدام -lm
خيار لترفيه مكتبة الرياضيات لنفترض اسم برنامجنا test.c
نحن نتجمع على النحو التالي
gcc test.c -lm
لا تربط GCC المكتبات القياسية بشكل افتراضي. لذلك تحتاج فقط إلى القيام بذلك في حالة التجميع عبر GCC:
GCC Filename.c -lm .
ومع ذلك ، في حالة G ++ لا حاجة لربط المكتبة بحيث يعمل هذا بشكل جيد:
G ++ Filename.c -o اسم الملف
هذا يفي بالغرض بالنسبة لي. أعتقد أن هناك بعض المشكلات في مكتبة الرياضيات الخاصة بك. حاول ربطه مرة أخرى وانظر. رمز حكيم آخر مثالي تمامًا.