Doit-on initialiser les NSUInteger ?

colas_colas_ Membre
février 2015 modifié dans Objective-C, Swift, C, C++ #1

Bonjour !


 


Mon programme a bugué et finalement j'ai trouvé l'erreur (merci instruments !). Elle était dans cette méthode :



- (void)computeNumberOfLines
{
NSUInteger result ;

while ([self necessaryHeightForNumberOfLines:result] <= [self sizeCollectionView].height)
{
result = result + 1 ;
}

_numberOfLines = result - 1;
}

Il me renvoyait des nombre énormes !!


 


En fait, j'ai corrigé ma méthode en ceci :



- (void)computeNumberOfLines
{
NSUInteger result = 0 ;

while ([self necessaryHeightForNumberOfLines:result] <= [self sizeCollectionView].height)
{
result = result + 1 ;
}

_numberOfLines = result - 1;

Et... plus de bug !


 


Késako ???!!!!


C'est normal ?


 


Merci !


Réponses

  • MalaMala Membre, Modérateur

    T'es sûr que c'est corrigé? Si tu passes pas dans ton while, NSUInteger moins 1 ça fait quoi? ;)


  • colas_colas_ Membre
    février 2015 modifié #3

    OK ! ça répond pas à  ma question mais c'est sûr que 



    - (void)computeNumberOfLines
    {
    NSInteger result = 0 ;

    while ([self necessaryHeightForNumberOfLines:result] <= [self sizeCollectionView].height)
    {
    result = result + 1 ;
    }

    if (result - 1 < 0)
    {
    _numberOfLines = 0 ;
    }
    else
    {
    _numberOfLines = result - 1;
    }
    }

    est mieux !


     


     


    EDIT :


    Donc le problème n'était pas un problème d'initialisation, mais un problème de (NSUInterger)0 -1 ?


  • MalaMala Membre, Modérateur


    EDIT :


    Donc le problème n'était pas un problème d'initialisation, mais un problème de (NSUInterger)0 -1 ?




    Oui, il y avait un problème de rebouclage sur un entier non signé.


     


    Et pour répondre à  ta question, si tu n'initialises pas "result" sa valeur est indéterminée donc aussi des problèmes en perspectives de manière aléatoire. D'ailleurs à  l'analyse clang le dit bien...


  • J'ai l'habitude ;-)
  • AliGatorAliGator Membre, Modérateur


    OK ! ça répond pas à  ma question mais c'est sûr que


    - (void)computeNumberOfLines
    {
    NSInteger result = 0 ;

    while ([self necessaryHeightForNumberOfLines:result] <= [self sizeCollectionView].height)
    {
    result = result + 1 ;
    }

    if (result - 1 < 0)
    {
    _numberOfLines = 0 ;
    }
    else
    {
    _numberOfLines = result - 1;
    }
    }

    est mieux !



    EDIT :

    Donc le problème n'était pas un problème d'initialisation, mais un problème de (NSUInterger)0 -1 ?
    Oui c'était bien le problème. Pourquoi ne pas garder un NSUInteger et tester "if (result > 0)" ou "if (result == 0)" plutôt que d'utiliser un NSInteger intermédiaire et tester "if (result - 1 < 0)"?!
  • T'aurais jamais ce bug en Swift :)


  • Et pourquoi pas :



    - (void)computeNumberOfLines
    {
    NSInteger result = 1 ;

    while ([self necessaryHeightForNumberOfLines:result] <= [self sizeCollectionView].height)
    {
    result = result + 1 ;
    }

    _numberOfLines = result - 1;
    }
  • DrakenDraken Membre
    février 2015 modifié #9


    T'aurais jamais ce bug en Swift :)




    "Nous sommes comme des nains jugés sur des épaules de géants, de telle sorte que nous puissions voir plus de choses et plus éloignés que n'en voyaient ces derniers". Une phrase que j'adore, prononcée au XIIe siècle par le philosophe Bernard de Chartres sur l'importance des penseurs de l'antiquité dans la pensée moderne. 


  • FKDEVFKDEV Membre
    février 2015 modifié #10


    Et pourquoi pas :

    Ou même:

    - (void)computeNumberOfLines
    {
    NSInteger numberOfLines = 0;
    do
    {
    numberOfLines = numberOfLines + 1;
    } while ([self heightForNumberOfLines:numberOfLines] <= [self sizeCollectionView].height);

    _numberOfLines = numberOfLines - 1;
    }
  • C'est à  mon sens la meilleur solution 


     




    Ou même:



    - (void)computeNumberOfLines
    {
    NSInteger numberOfLines = 0;
    do
    {
    numberOfLines = numberOfLines + 1;
    } while ([self heightForNumberOfLines:numberOfLines] <= [self sizeCollectionView].height);

    _numberOfLines = numberOfLines - 1;
    }


Connectez-vous ou Inscrivez-vous pour répondre.