1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C#] Ciclo FOR a ignorar condição de execução

Discussão em 'Programação' iniciada por rastiff, 28 de Abril de 2018. (Respostas: 10; Visualizações: 264)

  1. rastiff

    rastiff Power Member

    Viva a todos,

    Deparei-me com um bug invulgar e estou a tentar perceber porque é que tal acontece. (é extremamente ocasional)

    Estou a tentar perceber como é que é possível o seguinte ciclo

    Código:
    for (int i = 0; i < myArray.Length; i++)
    {
       //code
    }
    
    ser executado quando i<myArray.Length é falso.

    Ideias sobre o que pode estar a acontecer?
     
  2. dagas46

    dagas46 Power Member

    Podes colocar o resto do código? Olhando só para isso, se não entra no for é porque o length do array é 0
     
  3. Hm tens mesmo de mostrar o codigo todo, porque mesmo que o length do array seja 0, nao devia correr, porque tens o < , para isso acontecer era se tivesses o <=
    E sera que faz sentido teres a mesma variavel a subir e na condicao?
     
  4. rastiff

    rastiff Power Member

    O problema não é não entrar.
    É entrar quando a condição é falsa.
    Por exemplo: i=99 e o myArray.Length =99
     
  5. dagas46

    dagas46 Power Member

    Isso não é possível. Tens um erro algures. Se puseres o resto do código talvez te consiga ajudar
     
  6. É impossivel, o pc nao falha numa coisa dessas, tens mesmo de por o código todo..
     
  7. xbostonx

    xbostonx Suspenso

    impossível, quando o ciclo for começa o "i" é sempre 0, declaraste um "int i" dentro do scope do for, nunca pode vir do scope anterior...
     
  8. rastiff

    rastiff Power Member

    @dagas46 @Digo Digo @xbostonx

    eu já ando nisto há alguns anitos e estou convosco sobre ser impossível, daí lhe chamar "bug". Queria era perceber melhor em que contexto poderia isto ter acontecido.

    Não posso revelar o código todo mas de qualquer das formas o resto do código deverá ser irrelavante para a questão que é o impossível estar a acontecer.
    Vejam a imagem abaixo e reparem que eu estou a fazer debug ao valor da condição de execução do FOR que naquele caso é false. E reparem que entrou na mesma no ciclo (eu apanhei esta situação porque apanhei uma excepção na linha a amarelo - phaseFreq tem o mesmo tamanho de omegas_algo e, portanto, já não tinha posição i onde escrever).

    [​IMG]
     
  9. dagas46

    dagas46 Power Member

    Não estás a utilizar tasks ou threads no código? Não há a possibilidade de ao verificar a condição no for ser verdadeiro e depois tornar-se falso?

    phaseFreq e omegas_algo não têm o mesmo tamanho. Se tivessem a excepção era lançada na primeira instrução dentro do for e não na segunda
     
    Última edição: 28 de Abril de 2018
  10. mcog_blaster

    mcog_blaster Power Member

    como é que
    se a linha
    Código:
     omega2 = omegas_algo[i];
    executou ?

    PS: para efeitos de optimização, o calculo de Length não devia acontecer a cada iteração do for.
     
  11. rastiff

    rastiff Power Member

    @dagas46
    ao bocado depois de fazer o post com a imagem quando estava a rever o texto e a imagem veio-me isso mesmo à cabeça!
    Na 2ª feira vou confirmar mas à primeira vista (não fui eu que desenvolvi esta parte do código) creio que não.
    Isto aconteceu uma vez em mais de 20 mil execuções daquele código nos últimos 2 dias. :paranoid: Muito estranho.
    Mas se de facto aquele código estiver a correr em mais do que uma thread sem qualquer protecção é possível que seja como referes. Sendo um conjunto muito pequeno de instrucções todas de rápida execução bateria certo com a probabilidade de ocorrência do problema ser mais baixa ainda que 1:20000.

    @mcog_blaster
    Se for um problema como o @dagas46 referiu é possível que tenha acontecido entre a execução das duas linhas que referes.


    Deixem confirmar na 2ª e eu depois dou feedback!
    Entretanto, obrigado a todos. :beerchug:
     

Partilhar esta Página