عربيالفرنسيةالإسبانية

Ad


OnWorks فافيكون

funcalc - الإنترنت في السحابة

قم بتشغيل funcalc في مزود استضافة OnWorks المجاني عبر Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

هذا هو الأمر funcalc الذي يمكن تشغيله في مزود الاستضافة المجانية OnWorks باستخدام إحدى محطات العمل المجانية المتعددة على الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت

برنامج:

اسم


funcalc - حاسبة Funtools (للجداول الثنائية)

موجز


funcalc [-n] [-a argstr] [-e expr] [-f file] [-l link] [-p prog] [اسم [أعمدة]]

OPTIONS


-a argstr # وسيطات مستخدم لتمريرها إلى البرنامج المترجم
-e expr # تعبير وظيفي
-f ملف # يحتوي على تعبير funcalc
-l libs # libs للإضافة إلى أمر الارتباط
-n # إخراج كود تم إنشاؤه بدلاً من التحويل البرمجي والتنفيذ
-p prog # إنشاء برنامج مسمى ، بدون تنفيذ
-u # die إذا كان أي متغير غير معرّف (لا تعلن تلقائيًا)

الوصف


funcalc هو برنامج آلة حاسبة يسمح ببناء التعبيرات التعسفية ،
تجميعها وتنفيذها على أعمدة في جدول Funtools (جدول FITS الثنائي أو حدث خام
ملف). إنه يعمل عن طريق دمج التعبير (التعبيرات) التي يوفرها المستخدم في برنامج قالب C ، بعد ذلك
تجميع وتنفيذ البرنامج. funcalc التعبيرات هي عبارات C ، على الرغم من بعضها
يتم دعم عمليات التبسيط المهمة (مثل الإعلان التلقائي عن المتغيرات).

funcalc يمكن تحديد التعبيرات بثلاث طرق: في سطر الأوامر باستخدام -e
[تعبير] التبديل ، في ملف باستخدام الامتداد -f [ملف] التبديل ، أو من stdin (إذا لم يكن كذلك -e
ولا -f محدد). بالطبع يحتوي ملف funcalc يمكن قراءة التعبيرات من
ستدين.

كل احتجاج funcalc يتطلب ملف جدول إدخال Funtools ليتم تحديده على أنه ملف
حجة سطر الأوامر الأولى. يعد ملف جدول Funtools الناتج هو الملف الاختياري الثاني
دعوى. يكون مطلوبًا فقط في حالة إنشاء ملف إخراج FITS (على سبيل المثال ، في الحالات التي يتم فيها إنشاء ملف
ال funcalc التعبير يطبع القيم فقط ، ولا حاجة إلى ملف الإخراج). إذا كان الإدخال والإخراج
تم تحديد الملفين ، يمكن للوسيطة الاختيارية الثالثة تحديد قائمة الأعمدة
التنشيط (باستخدام FunColumnActivate ()). لاحظ أن funcalc تحدد ما إذا كنت تريد أم لا
إنشاء رمز لكتابة ملف الإخراج بناءً على وجود أو عدم وجود ناتج
حجة الملف.

A funcalc يتم تنفيذ التعبير في كل صف من الجدول ويتكون من واحد أو أكثر من C
العبارات التي تعمل على أعمدة ذلك الصف (ربما باستخدام متغيرات مؤقتة).
ضمن تعبير ، يتم الرجوع إلى عمود من تيار صف باستخدام C الهيكل
بناء الجملة ليرة لبنانية[colname]> ، على سبيل المثال cur-> x ، cur-> pha ، إلخ. يمكن تعريف المتغيرات العددية المحلية
باستخدام تعريفات C في بداية التعبير ، وإلا يمكن تعريفها
تلقائيًا بواسطة funcalc (ليكون من النوع المزدوج). وهكذا ، على سبيل المثال ، مقايضة الأعمدة x
و y في الجدول باستخدام أي من المكافئ التالي funcalc
التعبيرات:

درجة حرارة مزدوجة
temp = cur-> x ؛
cur-> x = cur-> y ؛
cur-> y = temp ؛

أو:

temp = cur-> x ؛
cur-> x = cur-> y ؛
cur-> y = temp ؛

عند تنفيذ هذا التعبير باستخدام أمر مثل:

funcalc -f مبادلة.expr itest.ev otest.ev

سيحتوي الملف الناتج على قيم الأعمدة x و y التي تم تبديلها.

بشكل افتراضي ، يكون نوع بيانات المتغير الخاص بالعمود هو نفسه نوع بيانات ملف
العمود كما تم تخزينه في الملف. يمكن تغيير هذا بإلحاق ": [dtype]" بالأول
إشارة إلى هذا العمود. في المثال أعلاه ، لإجبار x و y على إخراجهما كمضاعفات ،
حدد النوع "D" بشكل صريح:

temp = cur-> x: D ؛
cur-> x = cur-> y: D ؛
cur-> y = temp ؛

تتبع محددات أنواع البيانات بناء الجملة القياسي لجدول FITS لتحديد الأعمدة باستخدام TFORM:

أ: أحرف ASCII

· ب: حرف 8 بت بدون توقيع

أنا: وقعت 16 بت كثافة العمليات

· U: عدد 16 بت بدون إشارة (غير مناسب قياسي)

· J: توقيع عدد 32 بت كثافة العمليات

· V: عدد صحيح 32 بت بدون توقيع (غير مناسب قياسي)

· E: تعويم 32 بت

· D: تعويم 64 بت

· X: بت (تعامل كمصفوفة من الأحرف)

لاحظ أن المرجع الأول فقط لعمود يجب أن يحتوي على نوع البيانات الصريح
محدد.

بالطبع ، من المهم التعامل مع نوع بيانات الأعمدة بشكل صحيح. واحد من
السبب الأكثر شيوعًا للخطأ في funcalc البرمجة هي الاستخدام الضمني للبيانات الخاطئة
اكتب لعمود في التعبير. على سبيل المثال ، الحساب:

dx = (cur-> x - cur-> y) / (cur-> x + cur-> y) ؛

عادة ما يتم إجراؤها باستخدام حساب الفاصلة العائمة. في الحالات التي يكون فيها x و y
الأعمدة عبارة عن أعداد صحيحة ، ويمكن القيام بذلك عن طريق قراءة الأعمدة كمضاعفات باستخدام حرف صريح
نوع المواصفات:

dx = (cur-> x: D - cur-> y: D) / (cur-> x + cur-> y) ؛

بدلاً من ذلك ، يمكن إجراء ذلك باستخدام صب النوع C في التعبير:

dx = ((double) cur-> x - (double) cur-> y) / ((double) cur-> x + (double) cur-> y) ؛

بالإضافة إلى الوصول إلى الأعمدة في الصف الحالي ، يمكن أيضًا الرجوع إلى
سابق صف باستخدام السابق-[colname]> وإلى التالي صف باستخدام التالي-[colname]>. لاحظ أن
if السابق-[colname]> محدد في funcalc التعبير ، الصف الأول ليس كذلك
معالجتها. لو التالي-[colname]> محدد في funcalc التعبير ، الصف الأخير
لم تتم معالجتها. في هذا الطريق، السابق و التالي مضمونة دائمًا للإشارة إلى صفوف صالحة.
على سبيل المثال ، لطباعة قيم العمود x الحالي والعمود y السابق ،
استخدم وظيفة C fprintf في ملف funcalc التعبير:

fprintf (stdout، "٪ d٪ d \ n"، cur-> x، prev-> y)؛

يمكن تحديد الأعمدة الجديدة باستخدام نفس ليرة لبنانية[colname]> بناء الجملة بإلحاق العمود
النوع (ومحددات tlmin / tlmax / binsiz الاختيارية) ، مفصولة بنقطتين. على سبيل المثال،
cur-> avg: D سيحدد عمودًا جديدًا من النوع double. محددات النوع هي نفسها
المستخدمة أعلاه لتحديد أنواع بيانات جديدة للأعمدة الموجودة.

على سبيل المثال ، لإنشاء وإخراج عمود جديد يمثل متوسط ​​قيمة x و y
الأعمدة ، يمكن تحديد عمود "متوسط" جديد:

cur-> avg: D = (cur-> x + cur-> y) /2.0

لاحظ أن النهائي '؛' ليس مطلوبًا للتعبيرات أحادية السطر.

كما هو الحال مع مواصفات نوع بيانات FITS TFORM ، يمكن أن يسبق محدد نوع بيانات العمود
من خلال العد الرقمي لتعريف مصفوفة ، على سبيل المثال ، "10I" تعني متجهًا من 10 ints قصيرة ، "2E"
يعني عوامات دقيقة واحدة ، وما إلى ذلك. العمود الجديد يحتاج فقط إلى أن يتم تعريفه مرة واحدة في
funcalc التعبير ، وبعد ذلك يمكن استخدامه دون إعادة تحديد النوع. هذا
يتضمن إشارة إلى عناصر مصفوفة عمود:

cur-> avg [0]: 2D = (cur-> x + cur-> y) /2.0 ؛
cur-> avg [1] = (cur-> x - cur-> y) /2.0 ؛

يتم التعامل مع نوع البيانات "X" (بت) كمصفوفة أحرف ذات أبعاد (numeric_count / 8) ، على سبيل المثال ،
تتم معالجة 16X كصفيف حرف 2 بايت. يتم الوصول إلى كل عنصر مصفوفة من 8 بتات بشكل منفصل:

cur-> stat [0]: 16X = 1 ؛
cur-> stat [1] = 2 ؛

هنا ، يتم إنشاء عمود 16 بت مع تعيين MSB على 1 وتعيين LSB على 2.

بشكل افتراضي ، تتم كتابة جميع الصفوف المعالجة في ملف الإخراج المحدد. أذا أردت
تخطي كتابة صفوف معينة ، ما عليك سوى تنفيذ عبارة C "continue" في نهاية ملف
funcalc التعبير ، حيث يتم تنفيذ كتابة الصف مباشرة بعد
يتم تنفيذ التعبير. على سبيل المثال ، لتخطي صفوف الكتابة التي يكون متوسطها هو نفسه
القيمة الحالية س:

cur-> avg [0]: 2D = (cur-> x + cur-> y) /2.0 ؛
cur-> avg [1] = (cur-> x - cur-> y) /2.0 ؛
إذا (cur-> avg [0] == cur-> x)
تواصل.

إذا لم يتم تحديد وسيطة ملف الإخراج على funcalc سطر الأوامر ، لا يوجد ملف الإخراج
فتح ولم تتم كتابة أي صفوف. هذا مفيد في التعبيرات التي تطبع المخرجات ببساطة
النتائج بدلاً من إنشاء ملف جديد:

fpv = (cur->av3:D-cur->av1:D)/(cur->av1+cur->av2:D+cur->av3);
fbv = cur-> av2 / (cur-> av1 + cur-> av2 + cur-> av3) ؛
fpu = ((double)cur->au3-cur->au1)/((double)cur->au1+cur->au2+cur->au3);
fbu = cur-> au2 / (مزدوج) (cur-> au1 + cur-> au2 + cur-> au3) ؛
fprintf (stdout، "٪ f \ t٪ f \ t٪ f \ t٪ f \ n"، fpv، fbv، fpu، fbu)؛

في المثال أعلاه ، نستخدم كلاً من مواصفات النوع الصريحة (لأعمدة "av") والنوع
casting (لأعمدة "au") لضمان تنفيذ جميع العمليات بشكل مزدوج
الدقة.

عند تحديد ملف الإخراج ، تتم معالجة جدول الإدخال المحدد وصفوف الإخراج
إلى ملف الإخراج. لاحظ أنه يمكن تحديد ملف الإخراج كـ "stdout" بتنسيق
من أجل كتابة صفوف الإخراج إلى الإخراج القياسي. إذا كانت وسيطة ملف الإخراج هي
تمرير ، يمكن أيضًا تمرير وسيطة ثالثة اختيارية لتحديد الأعمدة المراد معالجتها.

في جدول FITS الثنائي ، من المستحسن أحيانًا نسخ جميع امتدادات FITS الأخرى
إلى ملف الإخراج أيضًا. يمكن القيام بذلك عن طريق إلحاق علامة "+" باسم ملف
التمديد في اسم ملف الإدخال. يرى funtable للحصول على مثال ذي صلة.

funcalc يعمل من خلال دمج التعبير المحدد من قبل المستخدم في برنامج قالب C.
يسمى tabcalc.c. ثم يتم تجميع البرنامج المكتمل وتنفيذه. عامل
التصريحات التي تبدأ funcalc يتم وضع التعبير في قسم الإعلان المحلي
من البرنامج الرئيسي للقالب. يتم وضع جميع الأسطر الأخرى في النموذج الرئيسي للبرنامج
حلقة المعالجة الداخلية. يتم التعامل مع التفاصيل الأخرى لإنشاء البرنامج تلقائيًا. ل
على سبيل المثال ، يتم تحليل محددات الأعمدة لإنشاء بنية C لمعالجة الصفوف ، وهي
مرت ل FunColumnSelect () وتستخدم في FunTableRowGet (). إذا تم استخدام متغير غير معروف
في التعبير ، مما أدى إلى حدوث خطأ في الترجمة ، تتم إعادة محاولة إنشاء البرنامج بعد ذلك
تعريف المتغير المجهول ليكون من النوع المزدوج.

عادة، funcalc يضاف رمز التعبير إلى funcalc حلقة معالجة الصف. إنه ممكن
لإضافة كود إلى أجزاء أخرى من البرنامج عن طريق وضع هذا الرمز داخل توجيهات خاصة
النموذج:

[اسم التوجيه]
... الكود هنا ...
النهاية

التوجيهات هي:

· شامل إضافة التعليمات البرمجية والإعلانات في الفضاء العالمي ، قبل الروتين الرئيسي.

· محلي إضافة التصريحات (والتعليمات البرمجية) بعد الإعلانات المحلية في main

· قبل أضف الكود مباشرة قبل الدخول في حلقة معالجة الصف الرئيسي

· بعد أضف الكود مباشرة بعد الخروج من حلقة معالجة الصف الرئيسي

وبالتالي ، ما يلي funcalc سيعلن التعبير عن المتغيرات العالمية ويجعل روتينًا فرعيًا
المكالمات قبل حلقة المعالجة الرئيسية وبعدها مباشرة:

شامل
مزدوج v1 ، v2 ؛
حرفين مزدوجين (باطل) ؛
الانتهاء المزدوج (مزدوج الخامس) ؛
النهاية
قبل
v1 = init () ؛
النهاية
... صفوف العملية ، مع العمليات الحسابية باستخدام الإصدار 1 ...
بعد
v2 = إنهاء (v1) ؛
إذا (v2 <0.0) {
fprintf (stderr، "فشلت المعالجة٪ g ->٪ g \ n"، v1، v2) ؛
خروج(1)
}
النهاية

إجراءات روتينية مثل فيه() و ينهي() أعلاه يتم تمريرها إلى البرنامج الذي تم إنشاؤه للربط
يستخدم ال -l [وصلة توجيهات ...] يُحوّل. ستكون السلسلة المحددة بواسطة رمز التبديل هذا
أضيفت إلى خط الارتباط المستخدم لبناء البرنامج (قبل مكتبة funtools). ل
على سبيل المثال ، على افتراض ذلك فيه() و ينهي() موجودة في مكتبة libmysubs.a في
/ opt / special / lib directory ، استخدم:

funcalc -l "-L / opt / special / lib -lmysubs" ...

يمكن تمرير وسيطات المستخدم إلى برنامج funcalc مترجم باستخدام وسيطة سلسلة إلى ملف
"-محول مفتاح. يجب أن تحتوي السلسلة على جميع وسائط المستخدم. على سبيل المثال ، لتمرير
الأعداد الصحيحة 1 و 2 ، استخدم:

funcalc -a "1 2" ...

يتم تخزين الوسائط في مصفوفة داخلية ويتم الوصول إليها كسلاسل عبر ARGV (n)
دقيق. على سبيل المثال ، ضع في اعتبارك التعبير التالي:

محلي
int pmin ، pmax ؛
النهاية

قبل
pmin = atoi (ARGV(0)) ؛
pmax = atoi (ARGV(1)) ؛
النهاية

إذا ((cur-> pha> = pmin) && (cur-> pha <= pmax))
fprintf (stderr، "٪ d٪ d٪ d \ n"، cur-> x، cur-> y، cur-> pha) ؛

سيطبع هذا التعبير قيم x و y و pha لجميع الصفوف التي تكون فيها قيمة pha
بين قيمتي إدخال المستخدم:

funcalc -a '1 12' -f foo snr.ev '[cir 512 512 .1]'
512 512 6
512 512 8
512 512 5
512 512 5
512 512 8

funcalc -a '5 6' -f foo snr.ev '[cir 512 512 .1]'
512 512 6
512 512 5
512 512 5

لاحظ أنه من مسؤولية المستخدم التأكد من صحة العدد من الوسائط
مرت. يُرجع الماكرو ARGV (n) قيمة NULL إذا كانت الوسيطة المطلوبة خارج الحدود
من العدد الفعلي للوضعيات ، مما يؤدي عادةً إلى SEGV إذا تمت معالجته بشكل أعمى. للتأكد
عدد الوسيطة ، استخدم ماكرو ARGC:

محلي
بذور طويلة int = 1 ؛
حد مزدوج = 0.8 ؛
النهاية

قبل
إذا (ARGC> = 1) البذور = أتول (ARGV(0)) ؛
إذا (ARGC> = 2) الحد = atof (ARGV(1)) ؛
srand48 (بذور) ؛
النهاية

إذا (drand48 ()> حد) تابع ؛

يتم توسيع الماكرو WRITE_ROW إلى ملف FunTableRowPut () المكالمة التي تكتب الصف الحالي. هو - هي
يمكن استخدامها لكتابة الصف أكثر من مرة. بالإضافة إلى ذلك ، يتم توسيع الماكرو NROW إلى ملف
رقم الصف قيد المعالجة حاليًا. يظهر استخدام هاتين الماكروتين في ما يلي
مثال:

إذا (cur-> pha: I == cur-> pi: I) تابع ؛
أ = cur-> pha ؛
cur-> pha = cur-> pi ؛
cur-> pi = a ؛
cur-> AVG: E = (cur-> pha + cur-> pi) /2.0 ؛
cur-> NR: I = NROW ؛
إذا كان (NROW <10) WRITE_ROW ؛

إذا كان -p [بروغ] تم تحديد التبديل ، لم يتم تنفيذ التعبير. بدلا من ذلك ، فإن
يتم حفظ الملف القابل للتنفيذ الذي تم إنشاؤه باستخدام اسم البرنامج المحدد لاستخدامه لاحقًا.

إذا كان -n تم تحديد التبديل ، لم يتم تنفيذ التعبير. بدلا من ذلك ، الكود الذي تم إنشاؤه
هو مكتوب ل stdout. هذا مفيد بشكل خاص إذا كنت تريد إنشاء ملف هيكلي
وإضافة التعليمات البرمجية الخاصة بك ، أو إذا كنت بحاجة إلى التحقق من أخطاء الترجمة. لاحظ أن التعليق
في بداية الإخراج يعطي الأمر المترجم المطلوب لبناء البرنامج على ذلك
منصة. (يمكن أن يتغير الأمر من منصة إلى أخرى بسبب استخدام
مكتبات مختلفة ، ومفاتيح التحويل البرمجي ، وما إلى ذلك)

كما تم ذكره سابقا، funcalc سيعلن عن متغير قياسي تلقائيًا (كملف
مزدوج) إذا تم استخدام هذا المتغير ولكن لم يتم التصريح عنه. تم تنفيذ هذا المرفق
باستخدام نص sed النصي المسمى funcalc.sed ، والذي يعالج إخراج المترجم لاستشعار ملف
خطأ متغير غير معلن. تم زرع هذا البرنامج النصي مع الخطأ المناسب
معلومات لدول مجلس التعاون الخليجي ، ونسخة cc على منصات Solaris و DecAlpha و SGI. إذا وجدت ذلك
الإعلان التلقائي عن الحجميات لا يعمل على النظام الأساسي الخاص بك ، تحقق من هذا البرنامج النصي sed ؛
قد يكون من الضروري إضافة أو تعديل بعض رسائل الخطأ التي يستشعرها.

من أجل الحفاظ على التحليل المعجمي لـ funcalc تعبيرات (معقولة) بسيطة ، اخترناها
لقبول بعض القيود على مدى دقة وضع تعليقات C ، والمسافات ، والأسطر الجديدة
في البرنامج الذي تم إنشاؤه. على وجه الخصوص ، تم الإعلان عن التعليقات المرتبطة بالمتغيرات المحلية
في بداية التعبير (أي ليس في a محلي ... النهاية كتلة) عادة في نهاية المطاف
في الحلقة الداخلية ، وليس مع الإعلانات المحلية:

/ * سينتهي هذا التعليق في المكان الخطأ (على سبيل المثال ، الحلقة الداخلية) * /
ضعف أ ؛ / * أيضًا في المكان الخطأ * /
/ * سيكون هذا في المكان الصحيح (الحلقة الداخلية) * /
إذا (cur-> x: D == cur-> y: D) تابع ؛ / * أيضًا في المكان المناسب * /
أ = cur-> x ؛
cur-> x = cur-> y ؛
cur-> y = a ؛
cur-> avg: E = (cur-> x + cur-> y) /2.0 ؛

وبالمثل ، في بعض الأحيان يتم حذف المسافات والأسطر الجديدة أو إضافتها بطريقة عشوائية على ما يبدو
طريقة. بالطبع ، لا تؤثر أي من هذه العيوب الأسلوبية على صحة
رمز تم إنشاؤه.

لأن funcalc يجب تحليل تعبير المستخدم باستخدام ملف (ملفات) البيانات الذي تم تمريره على
سطر الأوامر ، يجب فتح ملف (ملفات) الإدخال وقراءته مرتين: مرة واحدة أثناء البرنامج
جيل ومرة ​​أثناء التنفيذ. نتيجة لذلك ، لا يمكن استخدام stdin ل
ملف الإدخال: funcalc لا يمكن استخدامه كعامل تصفية. سننظر في إزالة هذا القيد
في وقت لاحق.

جنبًا إلى جنب مع تعليقات C ، funcalc يمكن أن تحتوي التعبيرات على تعليقات داخلية من سطر واحد
لم تنتقل إلى برنامج سي الذي تم إنشاؤه. تبدأ هذه التعليقات الداخلية بـ #
شخصية واستمر حتى السطر الجديد:

ضعف أ ؛ # لم يتم تمرير هذا إلى ملف C الذي تم إنشاؤه
# ولا هذا
أ = cur-> x ؛
cur-> x = cur-> y ؛
cur-> y = a ؛
/ * تم تمرير هذا التعليق إلى ملف C * /
cur-> avg: E = (cur-> x + cur-> y) /2.0 ؛

كما ذكرنا سابقًا ، يتم تحديد أعمدة الإدخال عادةً من خلال استخدامها داخلها
حلقة الحدث الداخلية. هناك حالات نادرة حيث قد ترغب في قراءة عمود و
قم بمعالجتها خارج الحلقة الرئيسية. على سبيل المثال ، قد تستخدم qsort عمودًا في الفرز الخاص بها
روتين المقارنة الذي لا تتم معالجته داخل الحلقة الداخلية (وبالتالي لا
محدد ضمنيًا كعمود يجب قراءته). للتأكد من قراءة هذا العمود بواسطة
حلقة الحدث ، استخدم صريح كلمة رئيسية. الوسيطات لهذه الكلمة الأساسية تحدد الأعمدة التي
يجب قراءتها في بنية سجل الإدخال حتى لو لم يتم ذكرها في
الحلقة الداخلية. على سبيل المثال:

صريح pi pha

سيضمن قراءة أعمدة pi و pha لكل صف ، حتى لو لم تتم قراءتهما
معالجتها في حلقة الحدث الداخلية. ال صريح يمكن وضع البيان في أي مكان.

أخيرًا ، لاحظ ذلك funcalc يعمل حاليًا على التعبيرات التي تتضمن جداول FITS الثنائية و
ملفات الأحداث الخام. سننظر في إضافة دعم لتعبيرات الصور في وقت لاحق ،
إذا كان هناك طلب على هذا الدعم من المجتمع.

استخدم funcalc عبر الإنترنت باستخدام خدمات onworks.net


خوادم ومحطات عمل مجانية

قم بتنزيل تطبيقات Windows و Linux

أوامر لينكس

Ad