Arduino - Type error, help please

Thread Starter

flat5

Joined Nov 13, 2008
403
I've tried various types for 'h' and other ways to get what I need such as String h[1] and String h
What I need:
User inputs some characters but is not allowed to repeat any.
This becomes test_str. This is probably an awkward way to input data but it's the only way I have found. It would be easier to check the string as it is being made, I suspect.

error is reported on this line "if (h == test_str.substring(t+1))"

error: no match for 'operator==' (operand types are 'char' and 'String')

Code:
String answers; unsigned int randNumber; String send_char;  String test_str;
  Serial.flush();
  Serial.println("Enter the characters you want sent. Then press Esc to continue");
  Serial.setTimeout(10000);
  test_str.concat(Serial.readStringUntil(27)); // 10 seconds or Esc
  while (test_str.length() > 43)
  {
    Serial.println("Too many characters. Try again. Max:44");
    test_str = "";
    test_str.concat(Serial.readStringUntil(27));
  }
Serial.setTimeout(1000); // reset key timeout to a more reasonable length
test_str.toLowerCase();
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    char h;
    h = test_str[t];
    if (h == test_str.substring(t+1)) //  <----------------problem
    {
      Serial.println("Do not include the same character more than once.");
    }
  }
 
Last edited:

DumboFixer

Joined Feb 10, 2009
217
I've tried various types for 'h' and other ways to get what I need such as String h[1] and String h
What I need:
User inputs some characters but is not allowed to repeat any.
This becomes test_str. This is probably an awkward way to input data but it's the only way I have found. It would be easier to check the string as it is being made, I suspect.

error is reported on this line "if (h == test_str.substring(t+1))"

error: no match for 'operator==' (operand types are 'char' and 'String')

Code:
String answers; unsigned int randNumber; String send_char;  String test_str;
  Serial.flush();
  Serial.println("Enter the characters you want sent. Then press Esc to continue");
  Serial.setTimeout(10000);
  test_str.concat(Serial.readStringUntil(27)); // 10 seconds or Esc
  while (test_str.length() > 43)
  {
    Serial.println("Too many characters. Try again. Max:44");
    test_str = "";
    test_str.concat(Serial.readStringUntil(27));
  }
Serial.setTimeout(1000); // reset key timeout to a more reasonable length
test_str.toLowerCase();
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    char h;
    h = test_str[t];
    if (h == test_str.substring(t+1)) //  <----------------problem
    {
      Serial.println("Do not include the same character more than once.");
    }
  }
I think your problem is that substring returns a String and not a Char - the error message does point to this.

I don't know the exact syntax but something like Substring(t+1,1) should return just a single character though it may still be a String. If that's the case then try casting it to a char.
 

Thread Starter

flat5

Joined Nov 13, 2008
403
if (h == test_str.substring(t+1,1))

Thank you, DumboFixer. Same error message.
I'll Google casting and char
(not interested in fish right now)
 

djsfantasi

Joined Apr 11, 2010
9,156
Or instead of using .substring, use the .charAt() method. It ruturns a single character.

There is a method which converts a String type to a char type... char(). So you could do something like the following.

if(h == char(test_str.atChar(t+1))) ...

The following example sketch compiles.
Code:
void setup() {
}
void loop() {
  String test_str="abcdefghijklmnopqrstuvwxyz";
  char h = 'j';
  if(h == char(test_str.charAt(10))) {
  }
}
 
Last edited:

Thread Starter

flat5

Joined Nov 13, 2008
403
I'll play with that, djsfantasi. Thank you for being specific and providing a useful example.
I'll have time later to play with it.
 

Thread Starter

flat5

Joined Nov 13, 2008
403
Did I misunderstand something?
Code:
for (unsigned int t = 0; t < test_str.length(); t++)
  {
    char h;
    h = char(test_str.charAt(t));
    if (h == test_str.substring(t+1,1))  // <-----------error: no match for 'operator==' (operand types are 'char' and 'String')
    {
      Serial.println("Do not repeat a character.");
      subset_test();
    }
  }
Tried h = test_str[t];
instead of
h = char(test_str.charAt(t));
error: no match for 'operator==' (operand types are 'char' and 'String')
Tried declaring h as String but that brings many error messages.
This too is useless:
if (test_str.indexOf(test_str[t]) == test_str.substring(t+1))
 
Last edited:

djsfantasi

Joined Apr 11, 2010
9,156
Look at how I coded the test in my example. You need to use a similar construction in yours. I've modifed your code and it successfully compiles. The only modification that I made was to change your "test_str.substring(t+1,1)" to "test_str.charAt(t+1)" and to cast it to type char (to compare to h, which is type char). I used the char() function to do this, "char(test_str.charAt(t+1))"

Code:
String test_str = "abcdefghiklmnopqrstuvwxyz";

void setup() {
  // put your setup code here, to run once:
for (unsigned int t = 0; t < test_str.length(); t++)
  {
    char h;
    h = char(test_str.charAt(t));
    if (h == char(test_str.charAt(t+1))) { // <-------- no error
      Serial.println("Do not repeat a character.");
      //  subset_test();
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:

}
 

Thread Starter

flat5

Joined Nov 13, 2008
403
Yes! My Googling did not help me to understand 'casting'.
djsfantasi, your example says it clearly enough for my present needs.
The goto works well. The prog is not getting stuck in a loop.
Calling subset_test() did not work well.
I would like to use more functions but so many variables need to be passed and my attempts have not gone well.
I need to study how to break some routines into functions when they have to carry a lot of baggage.
I'm also having trouble with keyboard input. You can see how crudely I'm building test_str.
If I could test each character as the Serial is read, a few problems could be caught right away.
Such as a punctuation that is not in the array of characters or double entry of a character.
The timing kludge and goto could be removed too.
 

Thread Starter

flat5

Joined Nov 13, 2008
403
The full program as it was. post #24 is the update
Code:
// send random Morse code ver.2
// by flat5 May-8-2015
// choice of tone/notone or external oscillator.
// Plug speaker to Analog pin8 and gnd. Use a resistor or pot in series if you want to. I used 220 ohm.

#include <Arduino.h>
byte signalPin = 13; // will control oscillator speaker
unsigned int wpm = 20;
unsigned int elementWait = 1200 / wpm;
unsigned int row = 43;
unsigned int space = 2; // time between characters. It is good to send the chacters faster than the space between them for practice.
unsigned int pitch = 846; // near a volume peak on my sounder. needed because I'm using a 220 ohm resistor in series.
char* codes[] =
{ ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
  "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", // 26 letters
  "-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.",     // 10 numbers
  "--..--", ".-.-.-", "..--..", "..--.", "---...", ".-..-.", ".----.", "-...-"                  //  8 punctuation
};
char* code_char[] =
{ "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
  "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", // 26 letters
  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",                // 10 numbers
  ",", ".", "?", "!", ":", "\"", "'", "="                          // 8 punctuation, so far - 44 characters
};

void setup() {
  pinMode(signalPin, OUTPUT);
  noTone(8);
  Serial.begin(9600); //115200 - 9600
  randomSeed(analogRead(0));
  menu();
}

void loop()
{
  parser();
}

void menu() {
  Serial.println("Send a random group of characters for Morse practice");
  Serial.println("Press Spacebar [Enter] to start");
  Serial.println("Enter 's'(value) to adjust letter space (1-whatever)");
  Serial.println("Enter 'w'(value) to adjust wpm (Example: w20)");
  Serial.println("Enter 'p'(value) to set tone pitch <p31-24000 or <0 for off");
  Serial.println("Enter 'r'(value) to set how many characters in the row to send (1-88)");
  Serial.println("Enter 't'(characters) to set a select group of characters to send (44 max)");
  Serial.println("Enter 'u' to send just the punctuation characters");
  Serial.println("Enter 'm' to display this menu");
  Serial.println("Enter 'c' to clear screen on real terminals");
  Serial.print("Currently: s:"); Serial.print(space); Serial.print(" w:"); Serial.print(wpm);
  Serial.print(" r:"); Serial.print(row); Serial.print(" P:"); Serial.println(pitch);
  Serial.println();
}

void parser()
{
  unsigned int digits;
  unsigned int value = 0;
  do
  {
    digits = Serial.available();
  }
  while (digits < 1);
  char keypress = Serial.read();
  do
  {
    digits = Serial.available();
  }
  while (digits < 0);
  value = Serial.parseInt();
  Serial.flush();
  switch (keypress)
  {
    case 'm': case 'M': case 'h': case 'H': // display menu
      {
        menu();
        break;
      }
    case ' ': // Spacebar. generate code
      {
        random_code();
        break;
      }
    case 't': case 'T': // send a selected group of characters
      {
        subset_test();
        break;
      }
    case 'u': case 'U': // send the punctuation characters
      {
        send_punc();
        break;
      }
    case 's': case 'S': // letter space time length (1 is same time as a dit)
      {
        if (value != 0) space = value;
        Serial.print("Letter space(s) "); Serial.println(space);
        break;
      }
    case 'w': case 'W': // wpm
      {
        if (value != 0) wpm = value;
        elementWait = 1200 / wpm; // dit = 1200 / wpm
        Serial.print("wpm: "); Serial.println(wpm);
        break;
      }
    case 'r': case 'R': // how many to send (a row)
      {
        if (value != 0 && value < 89)
        {
          row = value;
          Serial.print(row); Serial.println(" characters will be sent");
          break;
        }
        else
        { Serial.print("value must be 1-88, presently "); Serial.println(row);
          break;
        }
      }
    case 'c': case 'C':
      {
        refresh_Screen(); // a real terminal is required for this to work
        break;
      }
    case 'p': case 'P':
      {
        pitch = value;
        if (pitch == 0)
        {
          pitch = 0;
          noTone(8);
          Serial.println("Tone echo is now off."); // stare at the led or use an external oscillator triggered by pin D13
          break;
        }
        if (pitch < 31 || pitch > 24000)
        {
          Serial.println("Pitch range is 31-24000");
          break;
        }
        Serial.print("Tone pitch in Hz:"); Serial.println(pitch, DEC);
        tone(8, pitch, 400); // give a sample
        break;
      }
  }
}

void refresh_Screen() // not compatable with all terminal programs
{
  Serial.write(27); // ESC
  Serial.write("[2J"); // clear screen
  Serial.write(27); // ESC
  Serial.write("[H"); // cursor to home
}

void dit() {
  digitalWrite(signalPin, HIGH);
  if (pitch != 0) tone(8, pitch);
  delay(elementWait);      // milliseconds - one dit
  digitalWrite(signalPin, LOW);
  noTone(8);
  delay(elementWait);
}

void dah() {
  digitalWrite(signalPin, HIGH);
  if (pitch != 0) tone(8, pitch);
  delay(elementWait * 3);
  digitalWrite(signalPin, LOW);
  noTone(8);
  delay(elementWait);
}

void letter_space() {
  delay(elementWait * space);
}

void random_code() { // send a random character's Morse equivlent
  char* code_char[] =
  { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
    "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", // 26 letters
    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",                // 10 numbers
    ",", ".", "?", "!", ":", "\"", "'", "="                          // 8 punctuation, so far - 44 characters
  };
  String send_char; String answers; String answers2;
  char* send_codes[row]; //array starts at 0. User inputs how many characters in a run (row on screen)
  //unsigned long seed = seedOut(31); randomSeed(seed);
  for (unsigned int t = 0; t < row; t++) // each run will be 'row' characters (+ 'row' spaces) but the last check needs a kludge
  {
    unsigned int randNumber = random(44); // 0 - 43, all characters.
    // see if the randNumber character is in string 'answers' or 'answers2' already.
    if (t < 44)
    {
      if (answers.indexOf(code_char[randNumber]) != -1) t = t - 1; // character already in array. try again
      else
      {
        answers.concat(code_char[randNumber]); answers.concat(" "); // add a space after each character for readability
        send_codes[t] = (codes[randNumber]); // build array of code character strings to be sent
      }
    }
    if (t > 43 )
    {
      if (answers2.indexOf(code_char[randNumber]) != -1) t = t - 1;
      else
      {
        answers2.concat(code_char[randNumber]); answers2.concat(" ");
        send_codes[t] = (codes[randNumber]);
      }
    }
  }
  for (unsigned int t = 0; t < row ; t++)
  {
    send_char = send_codes[t]; // send the code of a character
    for (unsigned int i = 0; i < send_char.length(); i++) // break it down to it's elements
    {
      String x;
      x = send_char.substring(i, i + 1);
      if (x == ".") dit(); else if (x == "-") dah(); // check both. don't send garbage
    }
    letter_space();
  }
  Serial.print(answers); Serial.println(answers2); Serial.println(); // show test answers & answers2, if any
}

void subset_test()   // Select characters for study -----------------still working on this one---------------
{
  String answers; unsigned int randNumber; String send_char;
label:
  String test_str;
  Serial.flush();
  Serial.println("Enter the characters you want sent. Then press Esc to continue");
  Serial.setTimeout(10000);
  test_str.concat(Serial.readStringUntil(27)); // 10 seconds or Esc
  if (test_str.length() > 43)
  {
    Serial.println("Too many characters. Try again. Max:44");
    goto label;
  }
  Serial.setTimeout(1000); // reset key timeout to a more reasonable length
  test_str.toLowerCase();
  for (unsigned int t = 0; t < test_str.length(); t++) // test to see if the string has duplicates
  {
    char h; // overcoming the string vs char compile error by CASTING
    h = char(test_str.charAt(t));
    if (h == char(test_str.charAt(t + 1))) //--------------------------
    {
      Serial.println("Do not repeat a character.");
      goto label;
    }
  }
  char* send_codes[test_str.length()];
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    randNumber = random(test_str.length() + 1);
    if (answers.indexOf(test_str[randNumber]) != -1) t = t - 1; // character already in array. try again
    else
    {
      answers.concat(test_str[randNumber]); answers.concat(" "); // add a space after each character for readability
      for (unsigned int i = 0; i < 44; i++)
      {
        if (test_str.substring(randNumber, randNumber + 1) == code_char[i]) // to index the correct code string
        {
          send_codes[t] = codes[i];
        }
        //else { // Serial.print(test_str.substring(randNumber)); Serial.println(" is not a character in the Morse array.");
        //} // Still working on this
      }
    }
  }
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    send_char = send_codes[t]; // send the code of a character
    for (unsigned int i = 0; i < send_char.length(); i++) // break it down to it's elements
    {
      String x;
      x = send_char.substring(i, i + 1);
      if (x == ".") dit(); else if (x == "-") dah(); // check both. don't send garbage
    }
    letter_space();
  }
  Serial.println(answers);
}

void send_punc() // send just punctuation characters
{
  String punc = (",.?!:\"'="); String answers; unsigned int randNumber; String send_char;
  for (unsigned int t = 0; t < 8; t++)
  {
    randNumber = random(8);
    if (answers.indexOf(punc[randNumber]) != -1)
    {
      t = t - 1; // character already in array. try again
    }
    else
    {
      answers.concat(punc[randNumber]); // build answers string
      answers.concat(" ");              // add a space after each character for readability
      send_char = codes[randNumber + 36]; // build code array to match answers index
      for (unsigned int i = 0; i < send_char.length(); i++) // break it down to it's elements
      {
        String x;
        x = send_char.substring(i, i + 1);
        if (x == ".") dit(); else if (x == "-") dah(); // check both. don't send garbage
      }
    }
    letter_space();
  }
  Serial.println(answers);
}
 
Last edited:

Thread Starter

flat5

Joined Nov 13, 2008
403
Multiple personality code. Yikes!
Code updated.
To do: multiple runs of option 't' using same characters.
That option is a bit of a mess.
Could use lots of help on that one. (hint hint)
 

djsfantasi

Joined Apr 11, 2010
9,156
Multiple personality code. Yikes!
Code updated.
To do: multiple runs of option 't' using same characters.
That option is a bit of a mess.
Could use lots of help on that one. (hint hint)
Not quite clear as to what your new requirement is? Please re-word it, so I can see if I can understand it better.

By the way, I am curious. What is this for?
 

Thread Starter

flat5

Joined Nov 13, 2008
403
djsfantasi, I guess you are not kidding. You programmers always say I'm not clear enough :)
OK, I wrote this program to improve my Morse code receiving skills. (and programming skills)

To practice receiving the code characters at any speed
to be able to send fast but put a long space between characters to think about what I heard
to practice a group that is giving me trouble
to practice just the punctuation characters which I am weakest with.

Doing these exercises can be fatiguing so it's nice to control the row length. Another reason for that option is to try to visualise what I am hearing instead of writing down the characters. Sending 4 or 5 character groups is what I'm mostly doing.

If you were referring to what I want the 't' option to do:
That option allows one to select a group of characters for study instead of all characters.
But it only runs once.
I want it to be able to run many times but have the characters in a different order each run.
Presently, one has to input the characters over and over again.
I also need an elegant way to stop this routine and get back to the parser().
I am unhappy with the way keyboard input is accomplished in this routine. I have had to work around it.

If you need further clarification I'll try :)
and seriously, any help with the code is appreciated! I am working very much alone in my study efforts!

Edit: about 't'
The result I want might be to press the Spacebar for the next run or press Esc to quit this routine. I will work on it too. It seems not too difficult but again, my input routine has made this more difficult. At least I think so.
 
Last edited:

djsfantasi

Joined Apr 11, 2010
9,156
Here are some ideas of making the characters in a different order for each 'run'.

Code:
Define an array to hold the characters in your group (with a size equal to the most number of characters you exepct to have in a group)
Define an array to hold random numbers, equal in size to the character group array

Input into the character group array, the characters in the group you want to practice.

Each time you want to change the order ([I]and the first time[/I])...
[INDENT]For each character, insert a random number into the second array.
Sort the second array, swapping the character each time you swap a value in the second array.[/INDENT]

When the sort finishes - you'll have a different order of the characters without re-entering them.
Have you gone on the Arduino forum site? ...Or the reference pages? I find that a useful resource
 

Thread Starter

flat5

Joined Nov 13, 2008
403
Reference pages are of some help, of course. I'll have to look deeper into the forum to see if that works for me. Hope so.

Group array
Define an array to hold the characters in your group
(with a size equal to the most number of characters you expect to have in a group)

Index array
Define an array to hold random numbers, equal in size to the character group array

Input into the character group array, the characters in the group you want to practice.

All this confuses me:

Each time you want to change the order (and the first time)...
I ? is index?
/I, no idea
For each character, insert a random number into the second array.
Sort the second array, swapping the character each time you swap a value in the second array.​
When the sort finishes - you'll have a different order of the characters without re-entering them.

---
Just re-entering the routine after the character subset is defined seems like it should work (to my simple mind).
I have not gotten it to work though. At best it works once or twice and then a reset of the board is required.
repeat: is the re-entry point but does not work well.
Code:
void subset_test()   // Select characters for study -----------------still working on this one---------------
{
  unsigned int randNumber; String send_char;
label:
  String test_str;
  Serial.flush();
  Serial.println("Enter the characters you want sent. Then press Esc to continue");
  Serial.setTimeout(10000);
  test_str.concat(Serial.readStringUntil(27)); // 10 seconds or Esc
  if (test_str.length() > 43)
  {
    Serial.println("Too many characters. Try again. Max:44");
    goto label;
  }
  Serial.setTimeout(1000); // reset key timeout to a more reasonable length
  test_str.toLowerCase();
  String answers(test_str.length());
  for (unsigned int t = 0; t < test_str.length(); t++) // test to see if the string has duplicates
  {
    char h; // overcoming the string vs char compile error by CASTING
    h = char(test_str.charAt(t));
    if (h == char(test_str.charAt(t + 1))) //-------------------------
    {
      Serial.println("Do not repeat a character."); // "Repeated character not allowed."
      goto label;
    }
  }
  //repeat:
  char* send_codes[test_str.length()];
repeat:
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    randNumber = random(test_str.length() + 1);
    if (answers.indexOf(test_str[randNumber]) != -1) t = t - 1; // character already in array. try again
    else
    {
      answers.concat(test_str[randNumber]); answers.concat(" "); // add a space after each character for readability
      for (unsigned int i = 0; i < 44; i++)
      {
        if (test_str.substring(randNumber, randNumber + 1) == code_char[i]) // to index the correct code string
        {
          send_codes[t] = codes[i];
        }
        //else { // Serial.print(test_str.substring(randNumber)); Serial.println(" is not a character in the Morse array.");
        //} // Still working on this error trap
      }
    }
  }
  for (unsigned int t = 0; t < test_str.length(); t++)
  {
    send_char = send_codes[t]; // send the code of a character
    for (unsigned int i = 0; i < send_char.length(); i++) // break it down to it's elements
    {
      String x;
      x = send_char.substring(i, i + 1);
      if (x == ".") dit(); else if (x == "-") dah(); // check both. don't send garbage
    }
    letter_space();
  }
  Serial.println(answers);
  Serial.flush();
  while (Serial.available() == 0) // wait for data
  {
    char keypress = Serial.read();
    //Serial.print(keypress);
    if (keypress == 32)
    {
      answers = "";
      goto repeat;
    }
    else
    {
      if (keypress == 27)
      {
        Serial.println("Esc");
        return;
      }
    }
  }
}
 
Last edited:

djsfantasi

Joined Apr 11, 2010
9,156
I didn't label the second array because I didn't want to accidentally make a preconception as to how it works. It is NOT an index... If I were to pick a name, I would call it order. Take a look at the examples below, as I walk through the algorithm.

1) Fill the first (Char) array with the character group desired:

Char Order
G
H
O
P

2) Fill the second array (Order) with a random number. (It represents the order of the group character):

Char Order
G 0.245
H 0.167
O 0.679
P 0.032

3) Perform a sort on the Order array, moving the corresponding position of the Char array:
The first step in a bubble sort looks like this:

Char Order
H 0.167 <-swap
G 0.245 <-swap
O 0.679
P 0.032

The final sorted list looks like this:

Char Order
P 0.032
H 0.167
G 0.245
O 0.679


Note the final order is different than the beginning order. By regenerating the random numbers and re-sorting, you'll get a different order.

I haven't written any code, because I feel its important to understand the algorithm before writing any code. The Arduino Forum contains many example sorting programs. The algorithm I've been describing is also known as a "shuffle" algorithm.
 

Thread Starter

flat5

Joined Nov 13, 2008
403
Thank you for spending the time to present that, djsfantasi.
I will practice that. I'm thinking about why use that approach instead of just using random and checking for duplicates. Perhaps it's faster than looping till a unique number is generated.
 

Thread Starter

flat5

Joined Nov 13, 2008
403
Does this work?
Code:
String test_str = "..........................................." ; // trying to protect memory space for the string
 test_str = "" ;
 

djsfantasi

Joined Apr 11, 2010
9,156
Not necessarily. Memory management of type String is done a little differently than other types. By assigning the null string to your variable, you are freeing the unused space from it's prior value to be used as the program wishes. You have more control of memory with character arrays, but give up the flexibility that String type methods give you. For example, you might have to write your own charAt function or use one from another library.

In the earlier days, variables of type String caused memory problems. With the latest release of the Arduino IDE the problems have been greatly minimized, if not solved.

Why are you worried about "memory protection"?
 

Thread Starter

flat5

Joined Nov 13, 2008
403
My 't' routine is unstable and I think it's memory corruption.
The behaviour is not exactly the same each time. Sometimes a character is missing from the answer string.
Sometimes an unexpected character is on screen.
Sometimes the routine hangs.
This can happen on the first run. If I use the goto to make another pass, it often works once and rarely twice and never three times.
I have over stepped variable memory before and had the same symptoms so...

Concerning the whole program, I shortened all print statements, meaning less text on screen and found a great trick.
Serial.print(F("text")); saves a lot of memory. Result is, I have plenty of local variable space at this time.

BTW, I have searched the Arduino site for 'bubble sort'. No hits! Under string object, no sort is listed! Well, there is this 'String Comparison Operators' and compareTo().
I'm slowly studying this site:
http://www.tutorialspoint.com/cplusplus
Actually learning something.
 
Last edited:
Top