Hello!
String handling is an important concept of C++. The Arduino library provides the String class. The String class is discouraged due to memory usage, and char arrays are suggested, along with string.h manipulations. What bothers me about char arrays is that you need to know the maximum string length at the delcaration, and the maximum string size cannot be stored in a variable! Dynamic memory allocation is difficult. So, I tried using vector char arrays, and a library I made with a class named "VectorString". I installed the StandardCplusplus library.
VectorString.h:
#ifndef VectorString_h
#define VectorString_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <StandardCplusplus.h>
#include <vector>
using namespace std;
class VectorString{
public:
VectorString(const char*);
void concat(const char*);
void concat(char*);
void concat(char);
void assign(const char*);
void assign(char*);
char charAt(word);
word length();
char* getString();
private:
vector <char> vec;
};
#endif
VectorString.cpp:
#include "VectorString.h"
VectorString::VectorString(const char* sz){
for(word i = 0; i < strlen(sz); i++){
vec[i] = sz[i];
}
}
void VectorString::assign(const char* sz){
for(word i = 0; i < strlen(sz); i++){
vec[i] = sz[i];
}
}
void VectorString::assign(char* sz){
for(word i = 0; i < strlen(sz); i++){
vec[i] = sz[i];
}
}
void VectorString::concat(const char* sz){
word eoa = vec.size();
for(word i = 0; i < strlen(sz); i++){
vec[i+eoa] = sz[i];
}
}
void VectorString::concat(char* sz){
word eoa = vec.size();
for(word i = 0; i < strlen(sz); i++){
vec[i+eoa] = sz[i];
}
}
void VectorString::concat(char c){
word eoa = vec.size();
vec[eoa] = c;
}
char VectorString::charAt(word n){
return vec[n];
}
word VectorString::length(){
return vec.size();
}
char* VectorString::getString(){
const word vecSize = vec.size();
char buf[vecSize] = "\0";
for(word i = 0; i < vecSize; i++) buf[i] = vec[i];
return buf;
}
I made a test code using the library:
#include <VectorString.h>
VectorString vec("This is the initial string.");
void setup(){
Serial.begin(9600);
Serial.println(vec.getString());
vec.assign("This is the new string.");
Serial.println(vec.getString());
vec.concat(" This is the appended string.");
Serial.println(vec.getString());
Serial.print("Character at position 7: ");
Serial.println(vec.charAt(7));
}
void loop(){
}
And got the following compiler error:
In file included from sketch_jul22a.cpp:1:
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/VectorString.h:23: error: ISO C++ forbids declaration of 'vector' with no type
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/VectorString.h:23: error: expected ';' before '<' token
I tried copying vector.cpp and vector from the StandardCplusplus library folder into the VectorString library folder, changed:
#include <StandardCplusplus.h.>
#include <vector>
into:
#include "vector"
and got the following errors:
In file included from C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/VectorString.h:10,
from sketch_jul22a.cpp:1:
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:36: error: expected type-specifier before 'allocator'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:36: error: expected '>' before 'allocator'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:45: error: function definition does not declare parameters
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:369: error: return type specification for destructor invalid
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:369: error: invalid use of incomplete type 'struct std::vector<T, Allocator>'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:36: error: declaration of 'struct std::vector<T, Allocator>'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:377: error: two or more data types in declaration of 'reserve'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:377: error: 'size_type' was not declared in this scope
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:393: error: two or more data types in declaration of 'resize'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:393: error: 'size_type' was not declared in this scope
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:393: error: expected primary-expression before 'const'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:408: error: two or more data types in declaration of 'downsize'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:408: error: 'size_type' was not declared in this scope
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:477: error: two or more data types in declaration of 'operator=='
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:491: error: two or more data types in declaration of 'operator<'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:497: error: two or more data types in declaration of 'operator!='
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:502: error: two or more data types in declaration of 'operator>'
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:508: error: two or more data types in declaration of 'operator>='
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:514: error: two or more data types in declaration of 'operator<='
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/vector:520: error: two or more data types in declaration of 'swap'
In file included from sketch_jul22a.cpp:1:
C:\Users\Ken Leung\Downloads\arduino-1.0.1\libraries\VectorString/VectorString.h:24: error: template argument 2 is invalid
What can I change in my library to make the functions work properly? Is my library any better than the String class?
Thanks!