String vs string (regex and GePrint) [SOLVED]

On 29/10/2015 at 12:18, xxxxxxxx wrote:

User Information:
Cinema 4D Version:    
Platform:      
Language(s) :

---------
Hi, one more question, maybe i'm doing it wrong (best choice !!)

When I'm trying to get back value from a STRING resource i have to push it into a String object...
When I'm trying to print some thing with GePrint("my life"), i have to push it from a String object...

Nothing wrong ? But if i want to use regex or to_string() std::stoi("002") it can be painfull. I have to convert and juggle withs 2 different type of string.

"String" came from C4D with #include "c4d_string"
and
"string" inside std library with #include <string> ....

Finally my fist question is simple. GePrint() just want C4D String. So how did you do to print Int32, Float ? Can't it can convert it on the way ?
 
And how did you do when you have to use std string for other library (my example is regex) ?

Maybe my arm is in one of my eyes ?? I'm doing it wrong ?

Thank in advance !! ;-)

On 29/10/2015 at 15:21, xxxxxxxx wrote:

FloatToString() and IntToString().

The String type in C4D is only useful in C4D.  In order to do other things (like regex), you need first to get a C-style string (CHAR* ) using GetCString() and then set that to std string.  For Unicode, it is even better.  You get a unicode encoded Int16 block using GetUcBlock().  Have no idea how that block gets converted into a std lib wide-char string - might be system dependent as well.

On 30/10/2015 at 02:58, xxxxxxxx wrote:

Hello,

as Robert already showed there are some convenience functions to convert basic datatypes to Strings: String::FloatToString(), String::IntToString() etc. You can also use FormatNumber().

We would like to remind all that one should not use classes from the standard library if possible. If it is needed to convert a String to a std::string this can be done with GetCStringCopy():

  
// This example converts the given String into a C-String to use it with the standard library.  
  
const String string = "foobar";  
  
// convert to c string and insert into std string.  
Char* cstring = string.GetCStringCopy();  
std::string stdString(cstring);  
  
DeleteMem(cstring);  

But if you want to use regular expressions you could also use the build-in class RegularExprParser.

Best wishes,
Sebastian

On 30/10/2015 at 04:01, xxxxxxxx wrote:

Many thanks for the code snippet. I'll keep in mind. Maybe you have the inversed one. I can't make work String::SetCString() ?

I did one myself to convert String to string... Beware it's ugly.

  
std::string timer_visibility::myToStringC(String& str){  
  
 std::string buffer;  
 buffer.clear();  
  
 UInt32 j = str.GetLength() - 1;  
 for (UInt32 i = 0; i <= j; i++)  
     buffer.push_back(str);  
  
 return buffer;  
}  

This is what I want to do, this is simple. I would like to enter frames number in a STRING resources and parse it like a printer dialog. So you can display and hide an object with this string 12,15,20-25,40

This way your object, with the selected tag, will be visible on the frame 12 , 15 and range from 20 to 25 and finally only visible on frame 40.

So i need to verify value from user (to be sure of what he put in) with this regex "([0-9]+)([,-]{1}[0-9]+)*"

And i need to split out my visibility string by coma(,) with a sregex_token_iterator. With all this groups i can find easily if the group is only one number. So it only one frame. Or if it's multi number with hyphen and this mean a range of frames.

Maybe I'm creating a new wheel. Useful or not. My code is a bit dirty for the moment but almost working. The last split with hyphen (-) not work but I'll figure it out.

I'll optimize my whole code after with your recommendations.

On 30/10/2015 at 06:12, xxxxxxxx wrote:

And to roll back i do this. Ugly too.

  
String timer_visibility::myToStringC4D(std::string& str){  
  
  String output;  
  char buffer;  
  UInt32 l = str.length();  
  
  for (UInt32 i = 0; i < l; i++)  
      output.Insert(i, Utf32Char(str _) );  
  
  return output;  
}  
_  

On 30/10/2015 at 10:08, xxxxxxxx wrote:

Hello,

this code seems to work perfectly fine:

  
std::string stdString("foo bar");  
  
String str;  
str.SetCString(stdString.c_str(), stdString.length());  
  
GePrint(str);  

best wishes,
Sebastian

On 30/10/2015 at 10:12, xxxxxxxx wrote:

Hi,

> So how did you do to print Int32, Float ?
here is my older code for C4D String that allow to print Int, Float and other types.

https://github.com/PluginCafe/utilities-and-snippets/blob/master/C%2B%2B/Remo/C4DPrintPublic.h

On 02/11/2015 at 04:29, xxxxxxxx wrote:

Hi,

Remotion4D. Thanks, your link and making this code public helped me to understand many things. I added it to my library

S_Bach, greatful snippet ! I replace my own with your ! It's seems work perfectly.

And Kuroyume0161 thanks your write. It just take me one day to remember to use String:: namespace...

So String::FloatToString(); and String::IntToString(); are now my best friends.

Thanks all, I'm a bit more confortable with C++ and the API now. So I see now how my question was simple. But it could be useful for anyone like me who didn't make c++ from many time and who discover in same time this API.