Pages: 1 2 3 [4] 5 6   Go Down
Author Topic: The HATRED for String objects - "To String, or not to String"  (Read 10034 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Offline Offline
Brattain Member
*****
Karma: 452
Posts: 18694
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A fairly simple fix in fact is to have a naming convention for class variables, eg.

Code:
int m_myVariable;   // m_ = member; or:
int myVariable_;    // using trailing underscore on class variables
Logged

North Queensland, Australia
Offline Offline
Edison Member
*
Karma: 53
Posts: 1802
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes I prefer namespaces or trailing '_G'

The example is a good point I think as many are avoiding 'this->' to keep their code 'pretty', whereas blatant use will save you without even knowing it was a problem. i_NewVal is fine as its callee scope is non-dependant. Further templated functions would require further qualification.

The important part of my post was showing how the global was the sole cause of problems, the code otherwise would not have compiled.
Quote
So rather than receiving an error about 'i' being undefined in the class ( 'this->' is required to make the name dependant ), the previous definition of 'i' is silently used.
Logged


NZ
Offline Offline
Jr. Member
**
Karma: 1
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Interesting and thank for clarifying this.

One question tho

When allocation static memory does that automatically become a global variable ?

Kim
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm not sure I understand your last question... Are you asking if qualifying a variable as "static" makes it global ?

Scope and lifetime are two related but distinct properties of a variable.
Logged

UK
Offline Offline
Faraday Member
**
Karma: 92
Posts: 3969
Where is your SSCCE?!?!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Interesting and thank for clarifying this.

One question tho

When allocation static memory does that automatically become a global variable ?

Kim

No.  A global (i.e., defined in the "global" scope) variable and static variable are different.

A global can be accessed anywhere.  A static can only be accessed in the function it is defined in.  A static variable retains its value across subsequent calls to the function.

The memory for a static is, as the name suggests, static - it is always at the same location, so theoretically it can be accessed globally through the address:

Code:

int *superGlobal;

void myFunc()
{
  static int localStatic = 4;
  superGlobal = &localStatic; // Assign address of localStatic to superGlobal pointer
  localStatic++;
}

void myOtherFunc()
{
  int myLocal;
  myFunc();
  myLocal = *superGlobal; // "myLocal" now contains whatever localStatic contains.
}

Not something that is done often - it's more common to either return the value from the function, or return a pointer to the static variable.  Such functions, though, are not re-entrant, and are frowned on in today's multithreaded environments.  Perfectly fine on the Arduino though smiley
Logged

Why not visit my eBay shop? http://stores.ebay.co.uk/Majenko-Technologies
Replacement for the Arduino IDE: UECIDE - Proper serial terminal, graphing facilities, plugins, overhauled internals.
Java isn't bad in itself, but it has enabled morons to write programs.

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-eek-blue

I hope you are aware that the code above is fine as an "extreme" didactic example, but it's definitely a coding horror(1). And the reason is, it's the perfect recipe for spaghetti code smiley-wink



(1) As in "Code Complete 2"; see Jeff Atwood's blog icon for an effective visual representation of the concept smiley
Logged

Pittsburgh, PA, USA
Offline Offline
Faraday Member
**
Karma: 58
Posts: 4036
I learn a bit every time I visit the forum.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re-entrant code can build up the stack really fast if you're not very, very careful. Remember, UNO has only 2k of RAM for stack and heap space.

Logged

Examples can be found in your IDE.

NZ
Offline Offline
Jr. Member
**
Karma: 1
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks

Coming from Assembly and a bit of basic, I'm trying to get my head around the GNU C compiler and the way it does things.
Been reading the GNU documentation, but sometimes it is "clear as mud" :-)

K
Logged

UK
Offline Offline
Shannon Member
****
Karma: 184
Posts: 11197
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re-entrant code can build up the stack really fast if you're not very, very careful.

You're thinking of recursive code?
Logged

I only provide help via the forum - please do not contact me for private consultancy.

Pittsburgh, PA, USA
Offline Offline
Faraday Member
**
Karma: 58
Posts: 4036
I learn a bit every time I visit the forum.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Right. Functions that call themselves or call others that call them, etc.

It's been a while since I wrote that kind of stuff.
Logged

Examples can be found in your IDE.

UK
Offline Offline
Faraday Member
**
Karma: 92
Posts: 3969
Where is your SSCCE?!?!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Right. Functions that call themselves or call others that call them, etc.

It's been a while since I wrote that kind of stuff.


Re-entrant is entirely different.

Re-entrant code can be safely called by two different threads at the same time without trashing any global / static variables.  They often involve passing of pointers to work areas to the function, so each thread has its own bit of memory.
Logged

Why not visit my eBay shop? http://stores.ebay.co.uk/Majenko-Technologies
Replacement for the Arduino IDE: UECIDE - Proper serial terminal, graphing facilities, plugins, overhauled internals.
Java isn't bad in itself, but it has enabled morons to write programs.

Pittsburgh, PA, USA
Offline Offline
Faraday Member
**
Karma: 58
Posts: 4036
I learn a bit every time I visit the forum.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Something else I wouldn't try with a 328P chip.

Long live the state machine!
Logged

Examples can be found in your IDE.

UK
Offline Offline
Faraday Member
**
Karma: 92
Posts: 3969
Where is your SSCCE?!?!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Something else I wouldn't try with a 328P chip.

Long live the state machine!

Hell yeah smiley

I had fun a bit back trying to move a few non-re-entrant library routines (from the printf family) into kernel space on RetroBSD so as to reduce user-process size (kind of a pre-cursor to shared libraries) a bit back... Not nice trying to convert them to re-entrant smiley-wink
Logged

Why not visit my eBay shop? http://stores.ebay.co.uk/Majenko-Technologies
Replacement for the Arduino IDE: UECIDE - Proper serial terminal, graphing facilities, plugins, overhauled internals.
Java isn't bad in itself, but it has enabled morons to write programs.

Offline Offline
God Member
*****
Karma: 10
Posts: 651
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The String class is kind of like training wheels on a bicycle.  Babies need them in order to learn how to ride (or code), but as soon as you want to do anything remotely useful you have to take them off and throw them away. 

So many of the "Why don't they fix this bug?" complaints could easily be rewritten as:

"Wah!  I want to be able to do BMX tricks but I'm scared to let go of my training wheels."
Logged

0
Offline Offline
Tesla Member
***
Karma: 118
Posts: 8962
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The String class is kind of like training wheels on a bicycle.  Babies need them in order to learn how to ride (or code), but as soon as you want to do anything remotely useful you have to take them off and throw them away. 

So many of the "Why don't they fix this bug?" complaints could easily be rewritten as:

"Wah!  I want to be able to do BMX tricks but I'm scared to let go of my training wheels."

Wow, another String class whiner!  smiley-roll Sad that the String class whiners almost never correct/adjust the usually simple they constantly whine about. Sad
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Pages: 1 2 3 [4] 5 6   Go Up
Jump to: