<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>