PDA

View Full Version : سلوك سلسلة غريب



marimhieta
11-26-2009 10:31, 10:31 AM
وقد يأتي أي شخص عبر ما يلي

لدي برنامج نصي مع الإعلانات التالية

رمز السلسلة = XXXXXX؛
string open = open؛ سلسلة توقف = توقف؛ string takeP = take؛
مستويات مزدوجة [3]؛
int Data [1]؛

ثم اتصل DLL معلنة كما يلي

void GetParmQuery (رمز السلسلة ، سلسلة مفتوحة ، توقف السلسلة ، سلسلة takeP ،
مستويات مزدوجة [] ، int البيانات []) ؛

القيم التي يتم إرجاعها من DLL هي كما هو متوقع ، أي أنه تم تغيير القيم الافتراضية للرمز وفتح ووقف و takeP.

إذا (open! = open)
طباعة (NE)؛
آخر
طباعة (EQ)؛

فشل الاختبار وأحصل على EQ المطبوعة

أي أفكار عما يحدث ويمكن إصلاحه بدون عمل فوضوي

شكر

Angelttguto
09-27-2021 09:56, 09:56 AM
if (open! = open) Print (NE)؛ طباعة أخرى (مكافئ) ؛ فشل الاختبار وأحصل على EQ المطبوعة
لماذا لا تخبرنا ما هو موجود في المتغير المفتوح بعد المكالمة؟ هل أنت متأكد من أنه يمكنك تمرير السلاسل كمؤشرات (كما تفعل بوضوح ذلك) ، هل قمت بتغييرها في DLL الخاص بك ثم لا تزال تعمل في MT4 دون حدوث انتهاك وصول؟ هل تخصيص ذاكرة جديدة للسلسلة الجديدة في DLL الخاص بك؟ لماذا لا تستخدم السلسلة بدلاً من ذلك حتى تتمكن من إرجاع المؤشر الجديد بعد ذلك؟ من المسؤول عن تحرير هذه الذاكرة المخصصة حديثًا؟ والسؤال الأكثر أهمية: لماذا تفعلون ذلك على الأرض؟

marimhieta
09-27-2021 11:17, 11:17 AM
لماذا لا تخبرنا ما هو موجود في المتغير المفتوح بعد المكالمة؟
أساسا يمكن أن يكون أي شيء على سبيل المثال سلسلة من 4 أحرف abcd

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

هل تخصيص ذاكرة جديدة للسلسلة الجديدة في DLL الخاص بك؟
إذا فهمت بشكل صحيح أنا نسخ البيانات إلى الذاكرة المخصصة من قبل البرنامج النصي

لماذا لا تستخدم السلسلة بدلاً من ذلك حتى تتمكن من إرجاع المؤشر الجديد بعد ذلك؟ من المسؤول عن تحرير هذه الذاكرة المخصصة حديثًا؟
استخدام سلسلة يعطي AV و كما أفهم تتم إدارة كافة الذاكرة بواسطة البرنامج النصي

والسؤال الأكثر أهمية: لماذا تفعلون ذلك على الأرض؟
مربكة بعض الشيء وأنا أتفق ولكن أنا باستخدام مجموعة المستويات لتمرير القيم الفعلية السلاسل لغرض آخر تماما

Angelttguto
09-27-2021 12:38, 12:38 PM
إذا فهمت بشكل صحيح أنا نسخ البيانات إلى الذاكرة المخصصة من قبل البرنامج النصي
لا يمكنك التأكد من كيفية معالجة ميتاتريدر للسلاسل داخليًا. ربما ستتلقى DLL الخاص بك فقط مؤشر إلى نسخة متوافقة مع C (خالية منتهية) من السلسلة التي سيتم تجاهلها بعد المكالمة ويتم تخزينها داخليًا في سلاسل بطريقة مختلفة تمامًا. ربما يكون مدير كومة الذاكرة المؤقتة هو المسؤول عن إدارة الكائنات المحسوبة والمرجعية وإنشاء عمليات نسخ لعمليات معينة ، وربما تكون داخليًا عبارة عن سلاسل باسكال وليس سلاسل C ، أو أنها تستخدم مكتبة متسلسلة متطورة تعمل تمامًا مع unicode أو شيء من هذا القبيل. من تعرف؟ لم يتم توثيقه في أي مكان! أنت تحاول مباشرة التعامل مع هياكل البيانات غير الموثقة في ميتاتريدر عبر واجهة غير موثقة! ما الذي تحاول القيام به لا يمكن القيام به بالطريقة التقليدية؟

مربكة بعض الشيء وأنا أتفق ولكن أنا باستخدام مجموعة المستويات لتمرير القيم الفعلية السلاسل لغرض آخر تماما
لا يمكن أن تكون كلها مشفرة في قيم صحيحة؟ إذا كانت هذه السلاسل تمثل عددًا محدودًا من الأوامر أو الحالات ، فقم فقط بترميزها كأعداد صحيحة. حدد ثابتًا لكل أمر أو وضع محتمل أو حالة أو ما هو ممكن من أجل قراءة أفضل ، تمامًا كما يحدث في ميتاتريدر أيضًا: (OP_BUY ، OP_SELL ، MODE_FOO ، MODE_BAR ، وما إلى ذلك). استخدام خيوط لأشياء من هذا القبيل يبدو غريبا جدا. هناك سبب لعدم القيام بذلك بهذه الطريقة ، في أي مكان آخر. (باستثناء PHP ربما ، لأن kidpies بي بي لا تعرف ما هو ثابت)

marimhieta
09-27-2021 13:59, 01:59 PM
ما الذي تحاول القيام به لا يمكن القيام به بالطريقة التقليدية؟
إذن ما هي الطريقة التقليدية لتمرير قيم سلسلة متعددة مرة أخرى من DLL (أستخدم دلفي 7 بالمناسبة) أقبل أن أتمكن من القيام بعمل ما أثناء وصفك باستخدام الأعداد الصحيحة ولكنني فهمت أن السلاسل يمكن تمريرها كمؤشرات للذاكرة انظر كتلة
http://docs.mql4.com/basis/variables/extfunctionsشكر

Angelttguto
09-27-2021 15:19, 03:19 PM
إذن ما هي الطريقة التقليدية لتمرير قيم سلسلة متعددة مرة أخرى من DLL (أستخدم دلفي 7 بالمناسبة) أقبل أن أتمكن من القيام بعمل ما أثناء وصفك باستخدام الأعداد الصحيحة ولكنني فهمت أن السلاسل يمكن تمريرها كمؤشرات للذاكرة انظر كتلة
http://docs.mql4.com/basis/variables/extfunctionsشكر
هناك شيء مكتوب حول مؤشرات إلى كتل الذاكرة وشيء يبدو وكأنه سلاسل باسكال ، فإنه لا معنى له حقا (ربما يكون أكثر منطقية في الروسية الأصلية) وأنها لا تتحدث عن تعديل السلسلة لاستخدامها لاحقا من قبل النصي mql4 على الإطلاق . ما يمكن أن أقوله من تجربتي الخاصة هو أن السلاسل التي تم تمريرها إلى DLL ستكون ببساطة مؤشرات على سلاسل غير مجمدة. في Pascal ، قد تستخدم نوع PChar لهذا الغرض. لم يكن لدي سوى حالة واحدة حيث شعرت بالحاجة إلى إرجاع سلسلة من دلل إلى السيناريو وكان ذلك عندما كتبت ملزمة بيثون بلدي. تظهر الدالة التي تقوم بإرجاع قيمة كائن سلسلة python إلى البرنامج النصي mql4 استدعاء هذا: الدالة Code المدرج PyGetString (item: PPyObject): # 91؛ color = Red # 93؛ PChar # 91؛color # 93 ؛؛ STDCALL. var gs: TGILState؛ بدء gs: = PyGILState_Enure ()؛ PyGetString: = PyString_AsString (عنصر)؛ PyGILState_Release (ع)؛ النهاية؛ (يمكنك العثور على التعليمات البرمجية المصدر الكامل (LazarusFPC) المرفقة كملف .rar في نهاية هذا الموقع:
http://sites.google.com/site/prof/metatrader-python-integration) أعلاه سيعود مؤشر إلى السلسلة (تم إنشاؤه بواسطة DLL python) ، ببساطة باستخدام قيمة إرجاع fuction. ستقوم MT4 بنسخ السلسلة من المؤشر المرتد على الفور إلى ذاكرتها الخاصة. عندما أوصيت بالطريقة التقليدية ، كنت أشير إلى الطريقة التقليدية لحل المشكلة ، وليس الطريقة التقليدية في إعادة السلاسل. الطريقة التقليدية لحل المشكلة (مهما كانت) لن تشمل على الأرجح أي استخدام للسلاسل التي يتم إرجاعها إلى البرنامج النصي. لذلك هنا السؤال مرة أخرى: ماذا تحاول أن تفعل؟

rotelot
09-27-2021 16:40, 04:40 PM
كما تنص 7Bit تقوم بمعالجة الذاكرة التي قمت بها (DLL) التي قمت بتخصيصها ولا تعرف كيفية تعامل MQL مع تخصيص الذاكرة إلى تلك السلسلة أو كيفية تخزين حجمها الديناميكي (الطول) MQL سلسلة tstr؛ tstr = DLLreturnNullString ()؛ هذا يعمل لأن يتم إعطاء مؤشر MQL مؤشر إلى سلسلة Term (أن DLL الخاص بك الذاكرة المخصصة) ثم يتعامل MQL مع تخصيص الذاكرة الخاصة به وقائمة حجم قوائمسلسلة التخصيص الداخلي ونسخ البيانات إلى هذه الذاكرة MQL الجديدة. كل شيء جيد لأنك تسمح لـ MQL ببناء نسخته الخاصة من السلسلة. MQL String tstr؛ DLLchangethisString (tstr)؛ هذا أمر خطير لعدة أسباب: أ) لا تعرف مقدار الذاكرة (إن وجد) MQL المخصصة المؤشر الخاص بك DLL يسترد. ب) إذا قمت بتغيير السلسلة ، فلن يعرفها MQL عنها ، وإذا قمت بتغيير طولها ، فلن تقوم MQL بتحديث ”معرفتها” الخاصة بطول السلسلة C) إذا حاولت تغيير أو قراءة السلسلة و أكثر من خطوة الذاكرة التي خصصتها MQL لها ثم لديك خطأ حماية D) في تجربتي ، في حين أن MQL سوف تسمح للأوتار أن تصل إلى 64KB في حجم إيم متأكد من أن الذاكرة لا يتم دوماً أن يتم حجزها ككتلة واحدة متجاورة من الذاكرة. إذا كنت لا تزال مستمرة في هذا الطريق (وننصحك بعدم معرفتك) فإن أفضل طريقة هي MQL int len؛ سلسلة tstr = ؛/pad 255 حرفاً في وقت التعريف بحيث يتم تخصيص الذاكرة DLLchangethisString (len، tstr)؛ طباعة (StringSubstr (tstr، 0، ليون))؛ بهذه الطريقة يمرر DLL الخاص بك طول السلسلة الجديدة بحيث يكون لديك على الأقل بعض المعرفة بطولها الجديد. لقد رأيت رأس C الذي يفصل بنية سلسلة MQL (ولكن لم يستخدمه أبداً) والذي يشير إلى حقيقة أن طول السلسلة يتم تخزينه في INT (4 بايت) قبل بدء السلسلة. حتى في DLL الخاص بك قد تحاول decrementing مؤشر سلسلة الموردة بواسطة MQL (بواسطة 4 بايت) وكتابة عدد صحيح لهذا الموقع الذاكرة لتحديد طول جديد HOWEVER Ive لم يحاول أبدالا أعرف إذا im الصحيح على هذا ، وأنا لن أنصح القيام به هذا لأنك تعبث بمعرفة MQL لما فعلته مع هذه السلسلة إذا قمت بتغيير طولها من 255 إلى 10 ، فربما تسرّب MQL الذاكرة التي جعلتها DLL الخاص بها جهلة.

marimhieta
09-27-2021 18:01, 06:01 PM
حسناً يا شباب شكرا للمساعدة يبدو أن مستندات MQL غير واضحة إلى حد ما. سأركز الآن على إرجاع سلاسل جديدة من DLL (كدالة دالة في دلفي) بدلاً من تغيير تلك الموجودة وسأبحث في الحد من استخدام السلاسل في المستقبل كما تقترح 7 بت