<div dir="ltr">+1 on Rud defensive approach.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Dec 17, 2021 at 4:07 PM Rud Merriam via DPRGlist <<a href="mailto:dprglist@lists.dprg.org">dprglist@lists.dprg.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<p>Since you opened the door (LOL). <br>
</p>
<p>Ardino code is C++ so as a C++ pedant I'll suggest a different
defensive approach... Macros are problematic. I think C allows the
following.<br>
</p>
<pre><font size="-1">enum Positions { // might do enum struct Positions : uint8_t {
US_LEFT = 0,
US_MID = 1,
US_RIGHT = 2,
IR_LEFT = 3.
IR_RIGHT = 4
};
const uint8_t TIME_DIFF {5};
const uint8_t SONAR_NUM {3};
const uint8_t IR_NUM {2};
const uint8_t BUFF_SIZE {SONAR_NUM + IR_NUM};
const uint8_t MAX_DISTANCE {200};
const uint8_t DIST_UNKNOWN {999);
uint32_t cm[BUFF_SIZE{0}; // will initialize entire array to 0</font></pre>
<div>
<div><font face="Comic Sans MS" color="#000080"> </font></div>
<pre></pre>
<p>I'd change the names to be lower case the same as regular
variables. Using an <i>enum struct</i> can cause challenges
since it doesn't convert to regular integers so must be cast: <i>uint8_t(US_LEFT)</i>.
But it is safer if you want to enforce its use only as the enum.
<br>
</p>
</div>
<div><font face="Comic Sans MS" color="#000080"> -73 - <br>
<b>Rud Merriam K5RUD</b> <br>
<a href="http://mysticlakesoftware.com/" target="_blank"> <i>Mystic Lake
Software</i> </a> <br>
<br>
</font>
</div>
<div>On 12/17/21 3:28 PM, John Gauthier via
DPRGlist wrote:<br>
</div>
<blockquote type="cite">
<div><font face="monospace">As a side
note, I believe there is great value in defensive programming
as a habit. In my code, I always use macros to define
constants, especially when using them as indicies of an array
representing a message. In this case, you could use</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">#define
US_LEFT 0</font></div>
<div><font face="monospace">#define
US_MID 1</font></div>
<div><font face="monospace">#define
US_RIGHT 2</font></div>
<div><font face="monospace">#define
IR_LEFT 3</font></div>
<div><font face="monospace">#define
IR_RIGHT 4</font></div>
<div><font face="monospace">#define
TIME_DIFF 5</font></div>
<div><font face="monospace">#define
BUFF_SIZE 8</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">#define
SONAR_NUM 3</font></div>
<div><font face="monospace">#define
IR_NUM 2</font></div>
<div><font face="monospace">#define
MAX_DISTANCE 200</font></div>
<div><font face="monospace">#define
DIST_UNKNOWN 999<br>
</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">assert(SONAR_NUM
+ IR_NUM <= BUFF_SIZE);<br>
</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">uint32_t
cm[BUFF_SIZE];</font></div>
<div><font face="monospace">for (i = 0; i
< BUFF_SIZE; ++i) {</font></div>
<div><font face="monospace"> cm[i] = 0;<br>
</font></div>
<div><font face="monospace">}</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">irSensorL.read();</font></div>
<div><font face="monospace">cm[IR_LEFT] =
irSensorL.ranging_data.range_mm / 10;</font></div>
<div><font face="monospace">if
(cm[IR_LEFT] > MAX_DISTANCE) {</font></div>
<div><font face="monospace"> cm[IR_LEFT]
= DIST_UNKNOWN;<br>
</font></div>
<div><font face="monospace">}<br>
</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">Coding
constants with macros makes it hard to make mistakes,
especially when making modifications to the code. It also
makes reading <br>
</font></div>
<div><font face="monospace">the code much
easier. This was a C coding standard at two companies where I
have worked.</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace"><br>
</font></div>
<div><font face="monospace">John G.</font><br>
</div>
<div><br>
</div>
> uint16_t maxDistance = 200; // Also used with NewPing.h
library<br>
> .<br>
> . // Other code here<br>
> .<br>
> irSensorL.read(); // Read IR sensor... This is working!<br>
> cm[3] = irSensorL.ranging_data.range_mm/10; // This
returns 268<br>
> if (cm[3] > maxDistance) {<br>
> cm[3] = 999; /<br>
> }<br>
> Serial.println(cm[3]); / cm[3] value is always = 999<br>
> sendData();<br>
<div>On 12/17/2021 10:13 AM, Pat Caron via
DPRGlist wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_default" style="font-size:small"><br>
<div class="gmail_default" style="font-size:small">What I
meant to say last night is the array size is cm[8]. The
values for SONAR_NUM == 3 and IR_NUM == 2<br>
This should not be overrunning the array as it only loops
through 5 times.<br>
I have tried setting maxDistance as uint32_t without any
difference.</div>
<div class="gmail_default" style="font-size:small">I have
commented out the sendData() function and added some
Serial.print statements prior to reassigning the values.
(shown in output)</div>
<div class="gmail_default" style="font-size:small"><br>
</div>
<div class="gmail_default" style="font-size:small">#define
SONAR_NUM 3<br>
#define IR_NUM 2<br>
uint32_t cm[8] = {0,0,0,0,0,0,0,0}; // Create array<br>
uint16_t maxDistance = 200; // Also used with NewPing.h
libraray<br>
char *position[] = {"us_Left", "us_Mid", "us_Right",
"ir_Left", "ir_Right", "cm[5]", "cm[6]", "cm[7]"};<br>
.<br>
. // Other code here<br>
.<br>
<br>
void oneSensorCycle() { // Sensor ping cycle complete, do
something with the results.<br>
for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {<br>
Serial.print("cm[");<br>
Serial.print(x);<br>
Serial.print("] = ");<br>
Serial.println(cm[x]);<br>
if ((cm[x] == 0) or (cm[x] > maxDistance)) {<br>
cm[x] = 999;<br>
}<br>
}<br>
if (troubleshoot) {<br>
for (uint8_t i = 0; i < (SONAR_NUM + IR_NUM); i++)
{<br>
Serial.print("| ");<br>
Serial.print(position[i]);<br>
Serial.print(" = ");<br>
Serial.print(cm[i]);<br>
Serial.print("cm ");<br>
}<br>
Serial.print("| ");<br>
Serial.print("Time = ");<br>
Serial.print(elapsedMillis);<br>
Serial.print("mS");<br>
Serial.println();<br>
}<br>
//else {<br>
// sendData();<br>
//}<br>
}<br>
<br>
<br>
Loop() {<br>
</div>
<div class="gmail_default" style="font-size:small"> .//
other code<br>
</div>
<div class="gmail_default" style="font-size:small">
oneSensorCycle()<br>
</div>
<div class="gmail_default" style="font-size:small"> . //
more code<br>
</div>
<div class="gmail_default" style="font-size:small">}<br>
<br>
Serial output:<br>
<br>
-- Miniterm on /dev/ttyUSB-sensors 115200,8,N,1 ---<br>
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by
Ctrl+H ---<br>
cm[0] = 0<br>
cm[1] = 95<br>
cm[2] = 91<br>
cm[3] = 85<br>
cm[4] = 246<br>
| us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm |
ir_Left = 999cm | ir_Right = 999cm | Time = 44mS<br>
<br>
...Pat C<br>
<br>
</div>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Fri, Dec 17, 2021 at
10:07 AM Chris Netter <<a href="mailto:netterchris@gmail.com" target="_blank">netterchris@gmail.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div lang="EN-US">
<div>
<p class="MsoNormal">The for loop stops at x < 8, so
it won’t overrun.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">What if you remove the sendData()
call? Does that help?</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Also, make sure you have declared
any global variables which are modified by interrupts
or other tasks as “volatile”, otherwise the compile
may decide to optimize away parts of your code.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Chris</p>
<p class="MsoNormal"> </p>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0in 0in">
<p class="MsoNormal" style="border:medium none;padding:0in"><b>From: </b><a href="mailto:paradug@gmail.com" target="_blank">Doug Paradis</a><br>
<b>Sent: </b>Thursday, December 16, 2021 11:46 PM<br>
<b>To: </b><a href="mailto:netterchris@gmail.com" target="_blank">Chris
Netter</a><br>
<b>Cc: </b><a href="mailto:patcaron@mail.com" target="_blank">Pat Caron</a>;
<a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a><br>
<b>Subject: </b>Re: [Dprglist] Arduino Code
Troubles</p>
</div>
<p class="MsoNormal"> </p>
<div>
<p class="MsoNormal">Pat,</p>
<div>
<p class="MsoNormal"> for (uint8_t x = 0; x <
(SONAR_NUM + IR_NUM); x++) {</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal"> If SONAR_NUM _ IR_NUM = 8
then you are overrunning the array which goes 0 to
7.</p>
</div>
<div>
<p class="MsoNormal"> </p>
</div>
<div>
<p class="MsoNormal">Regards,</p>
</div>
<div>
<p class="MsoNormal">Doug P.</p>
</div>
</div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 16, 2021 at 8:53 PM
Chris Netter via DPRGlist <<a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a>>
wrote:</p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0in 0in 0in 6pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal">So Markus and Karim already
pointed out that the original code snipped
works as designed.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">It’s also been pointed out
already that you are mixing data types. I
don’t think that’s the issue, but worth trying
to make both the array and maxDistance
uint16_t</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">As for this new code
snippet:</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">I don’t see any obvious
issue with the for loop. Are you positive
that <span style="font-size:12pt">SONAR_NUM +
IR_NUM == 8 ? if not, you are overshooting
the array and that can cause all kinds of
non-obvious issues.</span></p>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
<p class="MsoNormal"><span style="font-size:12pt">Also, what does
sendData() do? Could it have some
side-effects? Maybe its causing a stack
overflow, array bounds overflow, or similar,
which in turn causes non-obvious issues?</span></p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<p class="MsoNormal"> </p>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0in 0in">
<p class="MsoNormal"><b>From: </b><a href="mailto:dprglist@lists.dprg.org" target="_blank">Pat
Caron via DPRGlist</a><br>
<b>Sent: </b>Thursday, December 16, 2021
9:04 PM<br>
<b>To: </b><a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a><br>
<b>Subject: </b>Re: [Dprglist] Arduino Code
Troubles</p>
</div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">Hi guys, here is
a better example to show what is
happening taken from actual code:</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">.... other code<br>
for (uint8_t x = 0; x < (SONAR_NUM
+ IR_NUM); x++) { // SONAR_NUM + IR_NUM
= 8<br>
if ((cm[x] == 0) || (cm[x] >
maxDistance)) {<br>
cm[x] = 999;<br>
}</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> sendData();</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> }<br>
<br>
Printed values cm[0] to cm[5] (us_Left
to ir_Right) without the above if
statement<br>
| us_Left = 0cm | us_Mid = 95cm |
us_Right = 51cm | ir_Left = 84cm |
ir_Right = 252cm | Time = 45mS<br>
<br>
Printed values cm[0] to cm[5] with the
above if statement<br>
\| us_Left = 999cm | us_Mid = 999cm |
us_Right = 999cm | ir_Left = 999cm |
ir_Right = 999cm | Time = 44mS<br>
<br>
...Pat C</span></p>
</div>
</div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 16, 2021 at
8:45 PM Karim Virani <<a href="mailto:pondersome64@gmail.com" target="_blank">pondersome64@gmail.com</a>>
wrote:</p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<p class="MsoNormal">It's doing what it's
coded to do</p>
</div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 16,
2021 at 7:42 PM Pat Caron via DPRGlist
<<a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a>>
wrote:</p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">Hi
Murray, I did try that with the
same results. NewPing.h library
is looking for a uint16_t
although it didn't complain when
I tried that.</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12pt">...Pat C</span></p>
</div>
</div>
<p class="MsoNormal"> </p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 16,
2021 at 8:35 PM Murray Altheim via
DPRGlist <<a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a>>
wrote:</p>
</div>
<blockquote style="border-color:currentcolor currentcolor currentcolor rgb(204,204,204);border-style:none none none solid;border-width:medium medium medium 1pt;padding:0in 0in 0in 6pt;margin:5pt 0in 5pt 4.8pt">
<p class="MsoNormal">Hi Pat,<br>
<br>
What if you define maxDistance as
uint32_t?<br>
<br>
Cheers,<br>
<br>
Murray<br>
<br>
On 17/12/21 2:27 pm, Pat Caron via
DPRGlist wrote:<br>
> Hi guys, I'm looking for help
with the following Arduino code.<br>
> <br>
> uint32_t cm[8] =
{0,0,0,0,0,0,0,0}; // Create array<br>
> uint16_t maxDistance =
200; // Also used with NewPing.h
library<br>
> .<br>
> . // Other code here<br>
> .<br>
> irSensorL.read(); //
Read IR sensor... This is working!<br>
> cm[3] =
irSensorL.ranging_data.range_mm/10;
// This returns 268<br>
> if (cm[3] >
maxDistance) {<br>
> cm[3] = 999;
/<br>
> }<br>
> Serial.println(cm[3]);
/ cm[3] value is always = 999<br>
> sendData();<br>
> <br>
> The cm[3] value is always 999
when I run this.<br>
> If I comment out the if
cm[3]... statement cm[3] value is
then 268.<br>
> <br>
> ...Pat C<br>
> <br>
>
_______________________________________________<br>
> DPRGlist mailing list<br>
> <a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
> <a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a><br>
> <br>
<br>
-- <br>
<br>
........................................................................<br>
Murray Altheim <murray18 at
altheim dot com>
= = ===<br>
<a href="http://www.altheim.com/murray/" target="_blank">http://www.altheim.com/murray/</a>
=== ===<br>
= = ===<br>
In the evening<br>
The rice leaves in the garden<br>
Rustle in the autumn wind<br>
That blows through my reed
hut.<br>
-- Minamoto no
Tsunenobu<br>
<br>
_______________________________________________<br>
DPRGlist mailing list<br>
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a></p>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:9.6pt">_______________________________________________<br>
DPRGlist mailing list<br>
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a></p>
<p class="MsoNormal"> </p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:4.8pt">_______________________________________________<br>
DPRGlist mailing list<br>
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a></p>
<p class="MsoNormal"> </p>
</div>
</div>
</blockquote>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
DPRGlist mailing list
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a>
</pre>
</blockquote>
<p><br>
</p>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
DPRGlist mailing list
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a>
</pre>
</blockquote>
</div>
_______________________________________________<br>
DPRGlist mailing list<br>
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" rel="noreferrer" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a><br>
</blockquote></div>