为啥这个for循环不执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥这个for循环不执行?相关的知识,希望对你有一定的参考价值。

把这个循环删掉,直接对GPIO->CRL赋值是可以点亮灯的,但是用for循环后就是不对

从你的描述中,我猜测你在尝试使用 STM32 的 GPIO 控制来点亮一个 LED 灯。我认为你在代码中使用了一个循环,但是当你把这个循环删除后,灯却可以点亮。反之,当你加入循环后,灯却不能点亮。我可以提供一些可能的原因:

    循环导致代码延迟过长,GPIO 只能短暂地输出高电平,灯不会一直亮。在删除循环后,灯可以亮是因为 GPIO 能够足够长时间地输出高电平,使得灯可以被看作一直处于亮的状态。

    循环中的某些变量的值没有正确设置或者没有正确更新。这可能导致 GPIO 控制的电平不正确,从而导致灯无法点亮。

    为了更好地帮助你解决问题,我需要更多的上下文信息,比如你的硬件平台、你的代码实现、你所期望的输出结果等等。如果你能提供更多信息,我将非常乐意为你提供帮助。

参考技术A 如果在for循环中直接赋值,可能会出现一些不可预料的问题。尤其是当设备在某个particular时间点改变GPIO->CRL值时,LED可能会受到影响而不会点亮。因此,使用for循环赋值之前,最好先用GPIO->ODR去检查s哪些位被置位以及清除再置位。

尽管条件仍然成立,为啥这个 for 循环似乎没有执行?

【中文标题】尽管条件仍然成立,为啥这个 for 循环似乎没有执行?【英文标题】:Why doesn't this for loop seem to execute although the condition is still true?尽管条件仍然成立,为什么这个 for 循环似乎没有执行? 【发布时间】:2016-02-11 00:20:16 【问题描述】:

在下面的 SSCCE 中,为什么 for 循环不为 $a 执行大于 3,尽管条件应该让它执行直到 $a 变为 5。

而最后一条语句的输出就更奇怪了。

我想要实现的是,我想删除元素/变量word 具有Select one 值的元素,这样生成的数组是:

Array ( [0] => stdClass Object ( [word] => alpha [sentence] => A is the first letter in the word Alpha. ) [1] => stdClass Object ( [word] => beta [sentence] => B is the first letter in the word Beta. ) )

问题是什么搞砸了,我能做些什么来解决它?

<?php 

$objectOne = new stdClass;
$objectOne->word = 'alpha';
$objectOne->sentence = 'A is the first letter in the word Alpha.';

$objectTwo = new stdClass;
$objectTwo->word = 'beta';
$objectTwo->sentence = 'B is the first letter in the word Beta.';

$objectThree = new stdClass;
$objectThree->word = 'Select one';
$objectThree->sentence = '';

$items = array($objectOne, $objectTwo, $objectThree, $objectThree, $objectThree, $objectThree );


print_r($items);//check
echo '<br><br>count($items) >> '.count($items).'<br><br>';//check


for ($a=0; $a < count($items); $a++) 
    echo '<br><br>We are entering index '.$a.'<br><br>';//check
    echo '<br>'.$items[$a]->word.'<br>';//check

    if ( ($items[$a]->word)=="Select one"  ) 
        echo '<br>YES if ( ($items['.$a.']->word)=="Select one"  ) AT '.$a.' INDEX.<br>';//check
        unset($items[$a]);
        /**/array_splice($items, $a, 1);
    

    echo '<br><br>We are leaving index '.$a.'<br><br>';//check



echo '<br><br>AFTER:-<br>';//check
print_r($items);//check

?>

输出:

Array ( [0] => stdClass Object ( [word] => alpha [sentence] => A is the first letter in the word Alpha. ) [1] => stdClass Object ( [word] => beta [sentence] => B is the first letter in the word Beta. ) [2] => stdClass Object ( [word] => Select one [sentence] => ) [3] => stdClass Object ( [word] => Select one [sentence] => ) [4] => stdClass Object ( [word] => Select one [sentence] => ) [5] => stdClass Object ( [word] => Select one [sentence] => ) )

count($items) >> 6



We are entering index 0


alpha


We are leaving index 0



We are entering index 1


beta


We are leaving index 1



We are entering index 2


Select one

YES if ( ($items[2]->word)=="Select one" ) AT 2 INDEX.


We are leaving index 2



We are entering index 3


Select one

YES if ( ($items[3]->word)=="Select one" ) AT 3 INDEX.


We are leaving index 3



AFTER:-
Array ( [0] => stdClass Object ( [word] => alpha [sentence] => A is the first letter in the word Alpha. ) [1] => stdClass Object ( [word] => beta [sentence] => B is the first letter in the word Beta. ) [2] => stdClass Object ( [word] => Select one [sentence] => ) ) 

【问题讨论】:

这行有问题echo '&lt;br&gt;YES if ( ($items['.$a.']-&gt;word)=="Select one" ) AT '.$a.' INDEX.&lt;br&gt;';//check @Saty 是的。它只会打印到 $a 的值变为 3。我正在编辑问题以发布示例的完整输出。 试试unset($items[$a]-&gt;word); 【参考方案1】:

条件并不总是正确的。 for 循环中的条件会在每次迭代中重新计算数组的大小。每当删除一个项目时,数组的长度就会发生变化。

每次检查条件时$acount($items)的值如下:

$a | count($items) | $a < count($items)
---------------------------------------
 0 | 6             | true 
 1 | 6             | true
 2 | 6             | true
 3 | 5             | true  -- $items[2] was removed
 4 | 4             | false -- $items[3] was removed

您应该将数组的大小存储在一个变量中并使用它来代替。此外,由于array_splice 不保留数字键,您在尝试访问$items[4]$items[5] 时最终会收到未定义的偏移通知。该行不是必需的。

$count = count($items);
for ($a=0; $a < $count; $a++) 

更好的是,您可以使用foreach 代替for 并使用$item 代替$items[$a]

foreach ($items as $a=>$item) 
    echo '<br><br>We are entering index '.$a.'<br><br>';//check
    echo '<br>'.$item->word.'<br>';//check
    ...
    unset($items[$a]); //can't use $item because it is a copy and not a reference

【讨论】:

【参考方案2】:

使用temp 变量进行迭代,因为您在 for 执行期间取消设置 main 的键。也许,这应该可行:-

$temp = $items;
for ($a=0; $a < count($temp); $a++) 
  echo '<br><br>We are entering index '.$a.'<br><br>';//check
  echo '<br>'.$items[$a]->word.'<br>';//check

  if ( ($items[$a]->word)=="Select one"  ) 
      echo '<br>YES if ( ($items['.$a.']->word)=="Select one"  ) AT '.$a.' INDEX.<br>';//check
      unset($items[$a]);
      /**/array_splice($items, $a, 1);
  

  echo '<br><br>We are leaving index '.$a.'<br><br>';//check

【讨论】:

这将引发错误,因为 array_splice 不保留数字键。

以上是关于为啥这个for循环不执行?的主要内容,如果未能解决你的问题,请参考以下文章

尽管条件仍然成立,为啥这个 for 循环似乎没有执行?

为啥for 循环不执行?

一个for循环为啥能够把这个数组的每个值输出

golang for循环取值为啥不按顺序输出?

JS函数中for循环结束后为啥不执行下条语句,怎么让其执行?

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?