আরডুইনোতে স্ট্রিং-এ কীভাবে রূপান্তর করবেন?


90

আমি কীভাবে কোন ইনটকে, nএকটি স্ট্রিংয়ে রূপান্তর করব যাতে আমি যখন এটি সিরিয়ালের উপরে প্রেরণ করি তখন এটি একটি স্ট্রিং হিসাবে প্রেরণ করা হয়?

আমার এ পর্যন্ত যা আছে:

int ledPin=13;
int testerPin=8;
int n=1;

char buf[10];

void setup()
{
    pinMode(ledPin, OUTPUT);
    pinMode(testerPin, OUTPUT);
    Serial.begin(115200);
}

void loop()
{
    digitalWrite(ledPin, HIGH);
    sprintf(buf, "Hello!%d", n);
    Serial.println(buf);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(500);

    n++;
}

4
@ পাব্বি "প্রিন্টফ () আপনার এক্সিকিউটেবল অবজেক্টকে ~ 1000 বাইট আরও বড় করে তোলে, তাই আকার যদি সমস্যা হয় তবে আপনি এটি ব্যবহার করতে নাও চান"। playground.arduino.cc/Main/Printf
মার্সেলো রোমানি

উত্তর:


131

এটি ব্যবহার করুন:

String myString = String(n);

আপনি এখানে আরও উদাহরণ পেতে পারেন ।


4
আপনার কোনও স্ট্রিং অবজেক্ট, সিরিয়াল.প্রিন্ট বা প্রিন্টলন ইতিমধ্যে তাদের রূপান্তর করতে হবে না!
অ্যালেক্সিস পাকস

আমি কীভাবে 97 কে 'একটি' চরিত্রে বা 65 কে 'এ' চরিত্রে রূপান্তর করব সেই উপায়টি আমি সন্ধান করছি। আমি ASCII নম্বরটি অক্ষর বলতে চাইছি। আমি খুঁজে পেয়েছি যে এইভাবে কাজ করে না।
ওকি এরি রিনালাদি

@ ওকিইরিণালদী: আপনি ব্যবহার করতে পারেন - চর বার = 97; এটা কাজ করবে।
ক্যাসিও

25

itoa()অন্তর্ভুক্ত ফাংশন ব্যবহার করুনstdlib.h

char buffer[7];         //the ASCII of the integer will be stored in this char array
itoa(-31596,buffer,10); //(integer, yourBuffer, base)


13

আপনার কেবল এটির মতো স্ট্রিং অবজেক্টের চারপাশে এটি মোড়ানো প্রয়োজন:

String numberString = String(n);

আপনি এটি করতে পারেন:

String stringOne = "Hello String";                     // using a constant String
String stringOne =  String('a');                       // converting a constant char into a String
String stringTwo =  String("This is a string");        // converting a constant string into a String object
String stringOne =  String(stringTwo + " with more");  // concatenating two strings
String stringOne =  String(13);                        // using a constant integer
String stringOne =  String(analogRead(0), DEC);        // using an int and a base
String stringOne =  String(45, HEX);                   // using an int and a base (hexadecimal)
String stringOne =  String(255, BIN);                  // using an int and a base (binary)
String stringOne =  String(millis(), DEC);             // using a long and a base

9

এটি ইনট (স্বাক্ষরিত 16-বিট পূর্ণসংখ্যার) কে স্ট্রিংয়ে রূপান্তর করার জন্য গতি-অনুকূলিত সমাধান।

এই প্রয়োগটি বিভাগ ব্যবহার করা এড়িয়ে চলেছে যেহেতু আরডুইনোর জন্য ব্যবহৃত 8-বিট এভিআরের কোনও হার্ডওয়্যার ডিআইভি নির্দেশ নেই, সংকলক বিভাগকে সময় গ্রহণকারী পুনরাবৃত্তিক বিয়োগগুলিতে অনুবাদ করে। সুতরাং দ্রুততম সমাধানটি স্ট্রিং তৈরি করতে শর্তাধীন শাখা ব্যবহার করা হয়।

গতিশীল বরাদ্দ এড়াতে র‌্যামের শুরু থেকে প্রস্তুত একটি স্থির 7 বাইট বাফার। যেহেতু এটি মাত্র 7 বাইট, তাই স্থির র‌্যাম ব্যবহারের ব্যয়টি সর্বনিম্ন বিবেচিত হয়। সংকলককে সহায়তা করার জন্য, আমরা দ্রুত গতির কার্যকরকরণের ক্ষেত্রে ভেরিয়েবল ঘোষণায় রেজিস্টার সংশোধক যুক্ত করি।

char _int2str[7];
char* int2str( register int i ) {
  register unsigned char L = 1;
  register char c;
  register boolean m = false;
  register char b;  // lower-byte of i
  // negative
  if ( i < 0 ) {
    _int2str[ 0 ] = '-';
    i = -i;
  }
  else L = 0;
  // ten-thousands
  if( i > 9999 ) {
    c = i < 20000 ? 1
      : i < 30000 ? 2
      : 3;
    _int2str[ L++ ] = c + 48;
    i -= c * 10000;
    m = true;
  }
  // thousands
  if( i > 999 ) {
    c = i < 5000
      ? ( i < 3000
          ? ( i < 2000 ? 1 : 2 )
          :   i < 4000 ? 3 : 4
        )
      : i < 8000
        ? ( i < 6000
            ? 5
            : i < 7000 ? 6 : 7
          )
        : i < 9000 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 1000;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // hundreds
  if( i > 99 ) {
    c = i < 500
      ? ( i < 300
          ? ( i < 200 ? 1 : 2 )
          :   i < 400 ? 3 : 4
        )
      : i < 800
        ? ( i < 600
            ? 5
            : i < 700 ? 6 : 7
          )
        : i < 900 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    i -= c * 100;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // decades (check on lower byte to optimize code)
  b = char( i );
  if( b > 9 ) {
    c = b < 50
      ? ( b < 30
          ? ( b < 20 ? 1 : 2 )
          :   b < 40 ? 3 : 4
        )
      : b < 80
        ? ( i < 60
            ? 5
            : i < 70 ? 6 : 7
          )
        : i < 90 ? 8 : 9;
    _int2str[ L++ ] = c + 48;
    b -= c * 10;
    m = true;
  }
  else if( m ) _int2str[ L++ ] = '0';
  // last digit
  _int2str[ L++ ] = b + 48;
  // null terminator
  _int2str[ L ] = 0;  
  return _int2str;
}

// Usage example:
int i = -12345;
char* s;
void setup() {
  s = int2str( i );
}
void loop() {}

এই স্কেচটি এআরআর-জিসিসি ব্যবহার করে কোডের 1,082 বাইটে সংকলন করা হয়েছে যা আরডুইনো ভি 1.0.5 এর সাথে বান্ডিল হয়েছে (ইন্ট 2 হ'ল ফাংশনের আকার নিজেই 594 বাইট)। স্ট্রিং অবজেক্টটি ২,৯৯৮ বাইটে সংকলিত সমাধানের সাথে তুলনা করে, এই বাস্তবায়নটি আপনার কোডের আকারকে 1.2 কেবি কমাতে পারে (ধরে নেওয়া হয়েছে যে আপনার কোনও স্ট্রিংয়ের অবজেক্ট পদ্ধতির দরকার নেই, এবং আপনার সংখ্যা স্বাক্ষরিত ইনট টাইপের ক্ষেত্রে কঠোর)।

এই ফাংশনটি সঠিক এসেম্বলারের কোডটিতে লিখে আরও অনুকূলিত করা যায়।


4
ডিআইভি এড়ানোর বিকল্প বিকল্প হ'ল (2 ^ N / 10) দ্বারা গুণ করা এবং তারপরে ডানদিকে বিট দিয়ে স্থানান্তর করা। সুতরাং এন = 16, এক্স / 10 ~ = (এক্স * 6554) >> 16 এর জন্য। যাইহোক, বেশিরভাগ অঙ্কের জন্য পর্যাপ্ত পরিমাণে বন্ধ করুন।
ডেভিড আর ট্রিবিলে

1

সমাধানটি অনেক বড়। এই সহজ চেষ্টা করুন। দয়া করে একটি 7+ অক্ষর বাফার সরবরাহ করুন, কোনও চেক করা হয়নি।

char *i2str(int i, char *buf){
  byte l=0;
  if(i<0) buf[l++]='-';
  boolean leadingZ=true;
  for(int div=10000, mod=0; div>0; div/=10){
    mod=i%div;
    i/=div;
    if(!leadingZ || i!=0){
       leadingZ=false;
       buf[l++]=i+'0';
    }
    i=mod;
  }
  buf[l]=0;
  return buf;
}

আপনি যদি সূচক 'এল' বাতিল করেন এবং বাফারকে সরাসরি বৃদ্ধি করেন তবে বাফারের শেষে ফিরে যাওয়ার জন্য সহজেই পরিবর্তন করা যেতে পারে।



0

নীচে এখানে একটি স্ব-রচিত মাইটোোয়া () রয়েছে যা কোডের তুলনায় অনেক ছোট এবং চরের * মাইস্ট্রিংয়ে 7 (একটি সমাপ্তি 0 সহ) এর একটি ফিক্সড অ্যারে সংরক্ষণ করে যা প্রায়শই কাম্য হয়। এটি সুস্পষ্ট যে এর পরিবর্তে অক্ষর-শিফট দিয়ে কোডটি তৈরি করতে পারে, যদি কারও যদি ভেরিয়েবল-দৈর্ঘ্যের আউটপুট-স্ট্রিংয়ের প্রয়োজন হয়।

void myitoa(int number, char *mystring) {
  boolean negative = number>0;

  mystring[0] = number<0? '-' : '+';
  number = number<0 ? -number : number;
  for (int n=5; n>0; n--) {
     mystring[n] = ' ';
     if(number > 0) mystring[n] = number%10 + 48;
     number /= 10;
  }  
  mystring[6]=0;
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.