كيف لسلسلة فار في ج مبرمجة الموافقة المسبقة عن علم؟

StackOverflow https://stackoverflow.com/questions/1417109

سؤال

وأنا البرمجة الموافقة المسبقة عن علم 16f84a في هايتك C لقيادة شاشات الكريستال السائل HD44780. حتى الآن أنا عندي شاشات الكريستال السائل تهيئة ويمكن كتابة الأحرف الفردية والسلاسل إلى شاشات الكريستال السائل. الآن يجب أن أفعل شيئا من هذا القبيل:

وفار = 250؛
lcd_write_string ( "MyVar له قيمة:" + فار)؛
لذلك ينبغي أن تظهر شاشات الكريستال السائل "MyVar له قيمة: 250"

وقبل كل شيء كيف ينبغي أن سلسلة فار وسلسلة؟ ثانيا، يحتوي على فار متغير عدد ثنائي 8 بت (0-255 في عشري). إذا فار = 23؛ لابد من تقسيم عدد 8 بت إلى 2 لتمثيل 2 و 3 في أسكي لثم أن تظهر من خلال شاشات الكريستال السائل. كيف يمكنني أن أفعل هذا؟ يبدو لي أن تفعل قاعدة 10 التحويلات أو إذا شجرة لتقسيم كل الأرقام أرقام 2 لثم يتم عرضها في شاشات الكريستال السائل. هل هناك أسهل طريقة للتغلب على هذه؟

وذلك بفضل!

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

المحلول

لماذا لا مجرد استخدام printf("%d", var)؟

var = 250;
char *static_msg = "MyVar has value:";
char msg[sizeof(static_msg) + 4];

sprintf(msg, "%s %d", static_msg, var);
lcd_write_string(msg);

نصائح أخرى

لنفترض مجموعة أدوات الخاص بك لا تشمل مكتبة C القياسية، أو التي ترغب في معرفة كيفية القيام بذلك بنفسك، وهنا أود أن أنتهز نهج:

وتعلن منطقة عازلة من العديد من الشخصيات مثل LCD يمكن عرض. إرسال سلسلة الخاص بك ثابت في بداية هذا المخزن. تحديد عدد الأحرف واسعة المتغير الخاص بك سيكون (هناك بعض الرياضيات أنا تاركة هنا، ولكنها لممارسة معقولة على ما أظن). استخدام هذا الطول، وطول سلسلة ثابتة، ومعرفة مكان في المخزن المؤقت رقم سيارة الخاص بك سوف يذهب. باستخدام نفس البنى الرياضية كما كان من قبل، وكتابة الأرقام في هذا الفضاء، واحدا تلو الآخر. هناك خدعة للغة C (مطلوب وفق المعايير) التي تمكنك من معرفة قيمة حرف من رقم عشري من قبل '0' + digit التعبير. نأمل، ترى كيف يعمل. وأخيرا، إنهاء المخزن المؤقت ولكن تتوقع وظيفة lcd_write_string الخاص بك، والذي يطلق عليه في المخزن المؤقت.

وكما هو مبين من قبل المشاركين أخرى، وهذا يطبق أساسا جزء صغير من عائلة printf المكتبة القياسية للوظائف. أعتقد أنه من المفيد لمعرفة التنفيذ، حتى لو كنت تستطيع (ويجب!) استخدام المكتبة في التعليمات البرمجية الإنتاج.

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

إذا المترجم C يأتي مع وظائف المكتبة القياسية C، ثم sprintf يمكن استخدامها على غرار printf، من أجل إنتاج سلسلة.

ويمكن استخدامها sprintf لإنتاج سلسلة منسقة (كما char*)، والتي يمكن أن يفترض أن يتم إرسالها إلى وظيفة lcd_write_string.

والمشكلة مع sprintf () هي أنك لا تعرف كم عدد بايت تحتاج إلى تخصيص قبل استدعاء sprintf (). وعادة ما تستخدم في ksprintf التالية () كبديل.

typedef struct __kstring_t {
  size_t l, m;
  char *s;
} kstring_t;

int ksprintf(kstring_t *s, const char *fmt, ...)
{
  va_list ap;
  int l;
  va_start(ap, fmt);
  l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // not working with glibc 2.0
  va_end(ap);
  if (l + 1 > s->m - s->l) {
    s->m = s->l + l + 2;
    kroundup32(s->m);
    s->s = (char*)realloc(s->s, s->m);
    va_start(ap, fmt);
    l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap);
  }
  va_end(ap);
  s->l += l;
  return l;
}

لاستخدام ما يلي:

kstring_t *str = calloc(1, sizeof(kstring_t));
ksprintf(str, "%s, %d\n", aString, aInteger);
ksprintf(str, "a second line: %s\n", aString2);
free(str->s); free(s);

وksprintf () لا يعمل مع سي العمومية 2.0 لvsnprintf لا يرجع عدد البايتات في السلسلة. تحتاج إلى مضاعفة مرارا الذاكرة في التخصيص. لينكس الصفحة رجل "snprintf رجل" كما يعطي مثالا على ذلك. على النظام الخاص بك، يجب عليك التحقق من سلوك vsnprintf الخاص بك ()، وهي C99، C90 لا بالرغم من ذلك.

وهناك طريقة أخرى للقيام بذلك سيكون لاستخدام lcd_write_string كمؤشر وظيفة وقيام بذلك:

printf(lcd_write_string,"MyVar has value: %d",var)

وهذا يعمل بشكل صحيح على CCS صورة C مترجم، إذا أعلن lcd_write_string مثل

void lcd_write_string (char c);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top