سؤال

هذا السؤال سبق الجواب هنا:

لدي ملف مصدر C++ و الثعبان الملف المصدر.أود C++ source file أن تكون قادرة على استخدام محتويات الثعبان ملفات المصدر كبيرا سلسلة حرفية.أنا يمكن أن تفعل شيئا مثل هذا:

char* python_code = "
#include "script.py"
"

لكن هذا لن ينجح لأن هناك حاجة إلى أن يكون \'s في نهاية كل سطر.يمكنني يدويا نسخ ولصق في محتويات كود بايثون و تحيط كل سطر مع اقتباسات و إنهاء ، لكن هذا القبيح.على الرغم من الثعبان المصدر سوف يكون فعال جمعها في C++ التطبيق ، أود أن يبقيه في ملف منفصل لأنها أكثر تنظيما يعمل بشكل أفضل مع المحررين (emacs ليس ذكيا بما يكفي للاعتراف بأن ج سلسلة حرفية هو الثعبان رمز التبديل إلى وضع الثعبان في حين كنت داخله).

من فضلك لا أقترح استخدام PyRun_File ، هذا ما أحاول تجنب في المقام الأول؛)

هل كانت مفيدة؟

المحلول

C/C++ المعالج يعمل في وحدة من الرموز ، سلسلة حرفية هو واحد رمزية.على هذا النحو, لا تستطيع التدخل في منتصف سلسلة حرفية مثل ذلك.

هل يمكن أن preprocess script.py في شيء مثل:

"some code\n"
"some more code that will be appended\n"

و #تشمل ذلك.أو يمكنك استخدام xxd​ -i لتوليد ج ساكنة مجموعة جاهزة لإدراجها.

نصائح أخرى

هذا لن يحصل عليك طوال الطريق هناك، لكنه سيحصل عليك إغلاق لعنة جميلة.

افترض script.py يحتوي على هذا:

print "The current CPU time in seconds is: ", time.clock()

أولا، لفه مثل هذا:

STRINGIFY(print "The current CPU time in seconds is: ", time.clock())

ثم، قبل أن تتضمنه، قم بذلك:

#define STRINGIFY(x) #x

const char * script_py =
#include "script.py"
;

ربما هناك إجابة أكثر تشددا من ذلك، لكنني ما زلت أبحث.

أفضل طريقة لفعل شيء من هذا القبيل هو تضمين الملف كمورد إذا كان لدى بيضتك / مجموعة الأدوات هذه القدرة.

إن لم يكن (مثل الأنظمة المضمنة، وما إلى ذلك)، يمكنك استخدام فائدة BIN2C (شيء مثل http://stud3.tuwien.ac.AC.AT/~E0025274/Bin2c/bin2c.c.). سوف يستغرق التمثيل الثنائي للملف وبصق ملف مصدر C يتضمن مجموعة من البايتات تهيئة هذه البيانات. قد تحتاج إلى القيام ببعض التغيير والتبديل للأداة أو ملف الإخراج إذا كنت تريد إنهاء الصفيف " 0".

قم بدمج تشغيل الأداة المساعدة BIN2C في MICFILE (أو كخطوة ما قبل البناء من كل ما تستخدمه لقيادة Builds الخاص بك). ثم فقط امتلك الملف الذي تم تجميعه ويرتبط به مع تطبيقك ولديك سلسلة (أو أي صورة أخرى للملف) يجلس في جزء من الذاكرة الممثلة بمجموعة الصفيف.

إذا كنت بما في ذلك ملف نصي كسلسلة، فسيكون شيء واحد يجب أن تكون على دراية به هو أن نهايات السطر قد لا تتطابق مع الوظائف التي تتوقعها - قد يكون هذا شيئا آخر تريد إضافته إلى الأداة المساعدة BIN2C أو أنك ستحتاج إليه للتأكد من مقابض التعليمات البرمجية أي نهايات السطر الموجودة في الملف بشكل صحيح. ربما تعديل الأداة المساعدة BIN2C للحصول على مفتاح "-S" الذي يشير إلى أنك تريد أن يتم تطبيع ملف نصي غير رياضي كسلسلة حتى يتم تطبيع نهايات السطر وستكون البايت الصفر في نهاية الصفيف.

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

يمكنك استخدام رابط كجزء من عملية البناء الخاصة بك (للقيام بالمعالجة المسبق وتضمين التعليمات البرمجية). أعترف أن نتيجة ذلك ربما لا مثالية، نظرا لأنك ينتهي بك الأمر إلى رؤية التعليمات البرمجية في كلا المكانين. ولكن في أي وقت أرى "بيثون"، "C ++"، و "Preprocessor" في قرب Closs، أشعر أنه يستحق ذكره.

هنا هو كيف أتمتة التحويل باستخدام cmd.exe

------ html2h.bat ------

@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g 
echo.
echo ";

كان يطلق عليه مثل

cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"

وتعلق على الكود

#include "../Debug/src/html.h"
printf("%s\n", html_page);

هذا نهج تعتمد على النظام ولكن، كأشعة الناس، لم يكره تفريغ عرافة.

يستخدم fopen, getline, ، و fclose.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top