<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Loops on blog.iankulin.com</title><link>https://blog.iankulin.com/tags/loops/</link><description>Recent content in Loops on blog.iankulin.com</description><generator>Hugo</generator><language>en-AU</language><lastBuildDate>Sun, 21 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.iankulin.com/tags/loops/index.xml" rel="self" type="application/rss+xml"/><item><title>Named Loops</title><link>https://blog.iankulin.com/named-loops/</link><pubDate>Sun, 21 Aug 2022 00:00:00 +0000</pubDate><guid>https://blog.iankulin.com/named-loops/</guid><description>&lt;img src="https://blog.iankulin.com/images/img_2768.png" width="133" alt=""&gt;
&lt;p&gt;Here’s a neat thing I haven’t seen before. Other languages I’ve worked in haven’t had a neat way to break out of a set of nested loops to a particular loop. It’s not an issue that comes up a lot, but when it has I’ve solved it by creating a continue flag and having that as the first condition of each loop.&lt;/p&gt;
&lt;p&gt;To explain, say if we had these two loops (in C):&lt;/p&gt;
&lt;p&gt;int i;
int j;
char string[] = &amp;ldquo;This string&amp;rdquo;;
int length = strlen(string);&lt;/p&gt;
&lt;p&gt;for (i=0; i&amp;lt;=3; i++) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (j=0; j&amp;lt;length; j++) {
 printf(&amp;quot;char:%c num:%d\\n&amp;quot;, string\[j\], i);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;and for some unexplained reason, we need to break out of both loops when we encounter a lowercase ‘t’. There is a C command to break out of a loop - &lt;em&gt;break&lt;/em&gt;. But it only breaks out of the current loop:&lt;/p&gt;
&lt;p&gt;int i;
int j;
char string[] = &amp;ldquo;This string&amp;rdquo;;
int length = strlen(string);&lt;/p&gt;
&lt;p&gt;for (i=0; i&amp;lt;=3; i++) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (j=0; j&amp;lt;length; j++) {
 printf(&amp;quot;char:%c num:%d\\n&amp;quot;, string\[j\], i);
 if (string\[j\] == 't') {
 break;
 } 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Since the outside loop that is iterating ‘i’ is not broken out of, we still end up looping through to the letter ‘t’ four times. Like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:T num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:h num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:i num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char: num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:t num:0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:T num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:h num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:i num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char: num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:t num:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:T num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:h num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:i num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char: num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:t num:2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:T num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:h num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:i num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char: num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num:3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:t num:3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So in C/C++ I would convert the loops to &lt;em&gt;while&lt;/em&gt;, and set a &lt;em&gt;continue&lt;/em&gt; flag. First the whiles:&lt;/p&gt;
&lt;p&gt;int i;
int j;
char string[] = &amp;ldquo;This string&amp;rdquo;;
int length = strlen(string);&lt;/p&gt;
&lt;p&gt;i = 0;
while (i &amp;lt;=3) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;j=0;
while (j&amp;lt;length) {
 printf(&amp;quot;char:%c num:%d\\n&amp;quot;, string\[j\], i);
 if (string\[j\] == 't') {
 break;
 } 
 j++;
}

i++;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;Then the flag, which I&amp;rsquo;ve called &lt;em&gt;keepGoing&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;int i;
int j;
char string[] = &amp;ldquo;This string&amp;rdquo;;
int length = strlen(string) ;&lt;/p&gt;
&lt;p&gt;int keepGoing = true;
i=0;
while (keepGoing==true &amp;amp;&amp;amp; i &amp;lt;=3) {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;j=0;
while (keepGoing==true &amp;amp;&amp;amp; j&amp;lt;length) {
 printf(&amp;quot;char: %c num: %d\\n&amp;quot;, string\[j\], i);
 if (string\[j\]=='t') {
 keepGoing = false;
 }
 j++
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;This gives us the output we want and we can close the ticket. Note that I have&lt;br&gt;
typedef&amp;rsquo;d &lt;em&gt;true&lt;/em&gt; and &lt;em&gt;false&lt;/em&gt; off-screen in the code above.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:T num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:h num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:i num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char: num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:s num: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;char:t num: 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With Swift, we can just name the loops, then break out to a named loop level:&lt;/p&gt;
&lt;p&gt;littleLoop: for i in 0&amp;hellip;3 {
bigLoop: for char in &amp;ldquo;This string&amp;rdquo; {
print(&amp;ldquo;char:\(char) num:\(i)&amp;rdquo;)
if char==&amp;ldquo;t&amp;rdquo;{
break littleLoop
}
}
}&lt;/p&gt;
&lt;p&gt;Note that I didn&amp;rsquo;t need to name the internal &lt;em&gt;littleLoop&lt;/em&gt;, that was just showing off.&lt;/p&gt;</description></item></channel></rss>