حاسبة إزاحة حقول struct
تضع مُصرّفات C وC++ كل عضو في struct عند إزاحة بالبايت تحترم محاذاته الطبيعية، ثم تضيف حشوًا للنوع كاملًا كي تبقى مصفوفات الـstruct محاذاة.
شغّل الأداة مجانًا
هذا التخطيط هو بالضبط ما تبلّغ عنه الماكرو offsetof والمُعامل sizeof، ومع ذلك فإن عدّ الحشو يدويًا عبر ABI و#pragma pack ما يزال يُحدث أخطاء صامتة في البروتوكولات الثنائية وروابط FFI ومقالب الذاكرة. تقبل حاسبة إزاحة حقول الـstruct قائمة مرتّبة من الحقول بأنواع سلمية معروفة في C أو بحجم ومحاذاة صريحين، وتطبّق قواعد الرفع نفسها التي يستخدمها المُصرّف، وتعيد إزاحة كل حقل والحشو قبله وحجم الـstruct الكلي والمحاذاة العامة والحشو الختامي. قيم pack الاختيارية تمثّل البنى المعبّأة، وabi الاختياري يختار LP64 أو LLP64 أو ILP32 لعرض long والمؤشرات. يشترك مسار المتصفح المجاني وواجهة API المدفوعة مسبقًا في وحدة تحليلية نقية واحدة، فلا تختلف مفاتيح التمارين عن أوراكل الإنتاج. فشل التحقق يرفع invalid_input ولا يُحاسب.
طريقة الاستخدام
أدخل القيم في النموذج أعلاه. تتحقق الأداة منها قبل الحساب ثم تعرض النتيجة في الصفحة نفسها.
راجع بياناتك
اتبع التسميات والوحدات الموضحة بجانب كل حقل. إذا كانت قيمة مفقودة أو خارج النطاق، توضح الصفحة الحقل الذي يحتاج إلى تصحيح.
أعد الحساب أو نفّذه آليًا
استخدم أداة الويب للفحوص الفردية، واستخدم الواجهة البرمجية عند دمج الإمكانية نفسها في سير عمل آلي.
حالات الاستخدام
احصل على النتيجة الآن
أدخل مجموعة من القيم وشاهد النتيجة من دون إعداد جدول بيانات أو برنامج نصي.
قارن السيناريوهات
غيّر قيمة واحدة في كل مرة وأعد الحساب لمعرفة ما الذي يؤثر في النتيجة.
أتمت العمل المتكرر
استخدم الواجهة البرمجية عندما تحتاج إلى تشغيل الحساب نفسه داخل منتجك أو سير عملك.
الأسئلة الشائعة
كيف أحسب إزاحات حقول struct في C؟
أرسلوا fields كمصفوفة مرتّبة من {name, type} (أو {name, size, alignment}). تعيد API إزاحة كل عضو وpadding_before وstruct_size وstruct_alignment وفق قواعد الرفع القياسية في C.
هل يطابق هذا الماكرو offsetof؟
نعم للأعضاء السلمية تحت ABI المختار وقيمة pack الاختيارية. تتبع الإزاحات وsizeof قواعد الوضع نفسها التي يستخدمها المُصرّفون للبنى السلمية الطبيعية أو المعبّأة.
ماذا يفعل pack؟
يمثّل pack القيمة #pragma pack(n). المحاذاة الفعلية لكل حقل هي min(natural_alignment, n). احذفوا pack للتخطيط الطبيعي (غير المعبّأ).
ما ABI المدعومة؟
lp64 (الافتراضي: long والمؤشر 8 بايت)، وllp64 (Windows 64 بت: long 4 والمؤشر 8)، وilp32 (long والمؤشر 4). الأنواع ثابتة العرض مثل uint32_t متماثلة في الثلاثة.
كم تكلفة حاسبة إزاحة حقول struct؟
أداة المتصفح مجانية. تستخدم طلبات API رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل استدعاء ناجح؛ الإدخال غير الصالح لا يُحاسب.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/struct-field-offset \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"fields":[{"name":"a","type":"char"},{"name":"b","type":"int"},{"name":"c","type":"char"}]}'const res = await fetch("https://api.kit.forhosting.com/dev/struct-field-offset", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"fields": [
{
"name": "a",
"type": "char"
},
{
"name": "b",
"type": "int"
},
{
"name": "c",
"type": "char"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/struct-field-offset",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"fields": [
{
"name": "a",
"type": "char"
},
{
"name": "b",
"type": "int"
},
{
"name": "c",
"type": "char"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/struct-field-offset", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"fields":[{"name":"a","type":"char"},{"name":"b","type":"int"},{"name":"c","type":"char"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"fields":[{"name":"a","type":"char"},{"name":"b","type":"int"},{"name":"c","type":"char"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/struct-field-offset", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"fields": [
{
"name": "a",
"type": "char"
},
{
"name": "b",
"type": "int"
},
{
"name": "c",
"type": "char"
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.struct_field_offset",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |