PDA

View Full Version : مبتدی: جداسازی اعداد از متن در C یا c++ برای میکرو AVR



hassan p.b
دوشنبه 07 تیر 1400, 19:02 عصر
سلام ضمن تشکر از راهنمایی دوستان عزیز مخصوصا مهندس مصافی
من ابتدا عرض کنم در سی مبتدی هستم بنابراین حتما لطف فرموده و راهنمایی لازمه را دریغ ننمایید ضمن تشکر مجدد
موضوع:
جدا سازی اعداد اعشاری از کلمات همراه و ارسالش به سونسگمنت می باشد من در همین اول راه ماندم
نحوه دریافت اطلاعات از پورت سریال است بدین صورت:
ss 123.34g
sd 234.456g
همانطور ملاحظه می فرمایید علاوه بر حروفات ، فاصله هم هست که مورد نیاز نیست فقط اعداد و ممیز اهمیت دارد
در جستجو در سایت برنامه نویس دوستان از حذف با دستور replace هم نوشتند که من نتونستم متاسفانه،
ممنون خواهم شد راهنمایی بفرمایید مثال هایی هم از محیط ویژوال دیدم که در سی و سی پلاس پلاس میکروها چندان کاربرد نداشتند و یا من تنونستم تفسیر نمایم
ممنون
حسن

hassan p.b
دوشنبه 07 تیر 1400, 19:06 عصر
نمونه مورد نظر که من نتونستم بعلت کمبود دانش در سی از ان بهره ببرم:
https://barnamenevis.org/showthread.php?352960-%D8%AC%D8%AF%D8%A7-%D9%83%D8%B1%D8%AF%D9%86-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D8%B2-%D9%8A%D9%83-%D8%B1%D8%B4%D8%AA%D9%87

hassan p.b
دوشنبه 07 تیر 1400, 19:11 عصر
نمونه فعالیت بنده:
string str = "86587F22015204DBC72B3E0AAD38E9D9";
str = str.Replace("1", "").Replace("2", "").Replace("3", "").Replace("4", "").Replace("5", "").Replace("6", "").Replace("7", "").Replace("8", "").Replace("9", "").Replace("0", "");
با خطای زیر مواجه شدم:
ادرس عکس:
https://s19.picofile.com/file/8437376034/erorr.jpg
ممنون

hassan p.b
سه شنبه 08 تیر 1400, 10:01 صبح
این کد و پیدا کردم ولی اعشار جدا نمی کنه

#include <iostream>

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
char *string = "abhsgs234cid*(hshshs349*(20hsh 246 2.45shkd ss 123.45g", *ptr = string;
while (*ptr) {
if (isdigit(*ptr)) {
long val = strtol(ptr, &ptr, 10);
printf("%ld\n", val);
} else {
ptr++;
}
}
return 0;
}

hassan p.b
سه شنبه 08 تیر 1400, 10:05 صبح
کد دیگه که عالی کار می کنه ولی ممیز رو حذف می کنه:


#include <iostream>

#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str="abcdjslgkslga4747l52kenhkle7l4j63.6len6lejl";
int i=0;
while(str[i]!='\0')
{
if(str[i]>='0' && str[i]<='9')// check that if the value belong to
// this condition or not , if yes then print
printf("%c",str[i]);
i++;
}
return 0;
}

hassan p.b
چهارشنبه 09 تیر 1400, 00:21 صبح
اتفاق جالب:
من تو کد بلاکس برنامه نوشتم حالا وقتی به کد ویژن می ارم کتابخانه ها نیستند مانند regex و iostream حالا باید چکار کرد برای رفع این مشکل
مممنون

hassan p.b
چهارشنبه 09 تیر 1400, 01:28 صبح
راستی تو کد بالاکس میشه برای میکرو هم برنامه نوشت ولی خطای کامپایلر می گیره:
Project/Target: "avr1 - Debug":
The compiler's setup (GNU GCC Compiler for AVR) is invalid, so Code::Blocks cannot find/run the compiler.
Probably the toolchain path within the compiler options is not setup correctly?!
Do you have a compiler installed?
Goto "Settings->Compiler...->Global compiler settings->GNU GCC Compiler for AVR->Toolchain executables" and fix the compiler's setup.

Tried to run compiler executable 'C:\WinAVR/bin/avr-gcc.exe', but failed!
Tried to run compiler executable 'C:\WinAVR/avr-gcc.exe', but failed!

Skipping...
Nothing to be done (all items are up-to-date).

hassan p.b
چهارشنبه 09 تیر 1400, 02:04 صبح
موضوعی که فهمیدم این کتابخانه ها مربوط به C++ هستند

farhad_shiri_ex
چهارشنبه 09 تیر 1400, 16:55 عصر
سلام ضمن تشکر از راهنمایی مدیران عزیز جناب مهندس مصافی
اگر ایشون کمک تون کرده که پس چرا مجددا سوال کردید؟

اگر برای کامپایلرهای سی میکروکنترلری برنامه را مینویسید که خوب طبیعی که باید از نسخه های کتابخانه های استاندارد زبان برای معماری RISC استفاده کنید.
معمولا برای انجام چنین الگوریتم هایی که به string manipulation ها معروف هستند، بهترین راه استفاده از کدهای اسمبلی هست چرا که به مراتب هم کد کمتری مینویسید وهم کد بهینه تری میتونید بنویسید که خوب اهمیت زیادی در استفاده از منابع میکرو داره
البته نه اینکه با سی نتونید ولی قطعا optimize نوشتن این الگوریتم در سی کمی میتونه مشکل باشه چرا که برای انجام چنین چیزی حتما به چندتا حلقه نیاز دارید ولی در صورتیکه از اسمبلی استفاده کنید میتونید حتی از سری دستورات جدید پردازشگرتون به شرطی که پشتیبانی کنه استفاده کنید که در اینصورت میبنید که با کمترین opcode میتونید این الگوریتم را بنویسید که در throughput و latency دستورات هم به شدت صرفه جویی کنید


راستی تو کد بالاکس میشه برای میکرو هم برنامه نوشت ولی خطای کامپایلر می گیره:
بله البته که میتونید فقط قبلش حتما کامپایلر مناسب میکروکنترلر را باید نصب کنید.

hassan p.b
چهارشنبه 09 تیر 1400, 19:47 عصر
دوست گرامی من از ایشون برای اینکه نمی تونستم پست بزارم کمک کردند تشکر کردم لطفا عجول نباشیم برای هر کاری دلیلی هست، فقط تشکر کردم .

hassan p.b
چهارشنبه 09 تیر 1400, 19:48 عصر
خب ضمن تشکر از شما تو سی regex و iostream نیست

hassan p.b
چهارشنبه 09 تیر 1400, 19:50 عصر
سی پلاس پلاس نوشتم و اعشار رو هم جدا کردم ولی وقتی می ارم تو کد ویژن یا avr رو انتخاب می کنم تو کدبلاکس ان کتابخانه ها دیگه نیستند و کدم کار نمی کنه

hassan p.b
چهارشنبه 09 تیر 1400, 21:23 عصر
این پست و دیدم شاید برای ما تحریم باشیم باز کردنش مشکل دار هست ولی کار نکرد
https://stackoverflow.com/questions/36852541/read-a-line-from-a-txt-file-and-split-it-to-float-numbers/68198839#68198839

farhad_shiri_ex
پنج شنبه 10 تیر 1400, 11:03 صبح
دوست گرامی من از ایشون برای اینکه نمی تونستم پست بزارم کمک کردند تشکر کردم لطفا عجول نباشیم برای هر کاری دلیلی هست، فقط تشکر کردم .

من فقط سوال کردم، وقتی فرمودید که مشکلتون را حل کردند برام سوال شد، در ضمن عجول نبودم جواب سوالتون را دادم
ظاهرا شما عجول هستید

hassan p.b
پنج شنبه 10 تیر 1400, 11:35 صبح
مهندس من مشکل دارم شما ببخش به موضوع اصلی بپردازیم

hassan p.b
دوشنبه 14 تیر 1400, 14:47 عصر
بحث ادامه دار:
https://www.eca.ir/forums/thread89943-8.html