Pages: [1]   Go Down
Author Topic: Just struggling with this, any pointers would be welcome  (Read 383 times)
0 Members and 1 Guest are viewing this topic.
Haiti
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

I have looked at this and can't see the wood for the trees!

I am use in Arduino 1.03 and in my program I use

string.replace("T", "");

and it does delete the character, however I need to do this for a few fixed characters and therefore trying to place it in a function , the Serial.print does correctly print the characters to be replaced and is there as a debug statement.

//declared at the top of program

const char stripChars [6] PROGMEM = "{}DIT";


//Sanity call to function

String striped = stripMyStr("{A}AIATADA");

//function
String stripMyStr(String strToStrip){

         for (int i = 0; i < 5; ++i)
              {    //tried uint8_t myChar
                     myChar = pgm_read_byte (stripChars + i);             
                     Serial.print(myChar);
                     strToStrip.replace(myChar, "");
             
         }
         return strToStrip;
         }


Error message from Arduino IDE is :-

error: call of overloaded 'replace(uint8_t&, const char [1])' is ambiguous

Any help much appreciated, explanation as to where I am going wrong(plain English :-) very, very welcome.

Ian
Logged

France
Offline Offline
God Member
*****
Karma: 29
Posts: 898
Scientia potentia est.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

I suggest you just forget the String class and use standard C strings smiley
Logged

Haiti
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Though I do agree and as such the program does work without this function, but for once in my life I have time to solve the problem the way I wish, not just take an easy way, or put it another way, retired and being pedantic :-)
Logged

France
Offline Offline
God Member
*****
Karma: 29
Posts: 898
Scientia potentia est.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

There are some bugs in the String class, that's why I recommend not using it.

Anyway, your problem is that "myChar" is (most likely) declared as "char myChar", and that replace function expect a String, so you have to convert. I'm not sure, but try:
Code:
strToStrip.replace( (String) myChar, "");
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
sketch_mar16a.ino: In function 'String stripMyStr(String)':
sketch_mar16a:15: error: call of overloaded 'replace(char&, const char [1])' is ambiguous
/Applications/Arduino_1.0.4.app/Contents/Resources/Java/hardware/arduino/cores/arduino/WString.h:164: note: candidates are: void String::replace(char, char) <near match>
/Applications/Arduino_1.0.4.app/Contents/Resources/Java/hardware/arduino/cores/arduino/WString.h:165: note:                 void String::replace(const String&, const String&) <near match>

The error message is basically telling you what you need. This compiles:

Code:
//declared at the top of program

const char stripChars [6] PROGMEM = "{}DIT";

//Sanity call to function

String striped = stripMyStr("{A}AIATADA");

//function
String stripMyStr(String strToStrip)
  {
  for (int i = 0; i < 5; ++i)
    {
    char myChar = pgm_read_byte (stripChars + i);             
    strToStrip.replace(String (myChar), "");
    }
  return strToStrip;
  }

void setup ()
{
  Serial.begin (115200);
  Serial.print (stripMyStr ("{A}AIATADA"));
}  // end of setup

void loop () { }

Please note that in versions of the IDE up to and including 1.0.3, the String library has bugs as discussed here and here.

In particular, the dynamic memory allocation used by the String class may fail and cause random crashes.

I recommend reworking your code to manage without String. Use C-style strings instead (strcpy, strcat, strcmp, etc.), as described here for example.

Alternatively, install the fix described here:  Fixing String Crashes

Preferably upgrade your IDE to version 1.0.4 or above at: http://arduino.cc/en/Main/Software
Logged

Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
String striped = stripMyStr("{A}AIATADA");

I don't think it is a particularly good idea to call things in the constructor, particularly if you are doing serial prints, as you were. The constructor is called before the system is fully initialized.
Logged

Haiti
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Take a Gold Star!

I had tried casting the variable but further up and probably got it wrong, also bowled myself a googly by replacing

strToStrip.replace((String) myChar, "");

with

strToStrip.replace( myChar, 0x00);

which compiled and of course caused havoc.

Many, Many Thanks

Ian



Logged

Offline Offline
Edison Member
*
Karma: 29
Posts: 2047
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Does the alleged  replace()  method of the string class you are trying to use,   accept a null string
or empty string as an argument ?
Logged

Offline Offline
Edison Member
*
Karma: 29
Posts: 2047
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
const char stripChars [6] PROGMEM = "{}DIT";

I've only used the PROGMEN method a few times,   so I am not an expert,  but when I
was using it the other day and looked up the example,  they were telling me to use

Code:
prog_char   message[] PROGMEM = "this is the message" ;

So if you are using regular 'char' instead of 'prog_char',  that might be your problem.
Logged

Pages: [1]   Go Up
Jump to: