none
une erreur abscon RRS feed

Toutes les réponses

  • C'est quoi comme type "cop" ?

    Comment il est initialisé ?


    Paul Bacelar, Ex - MVP VC++

    mercredi 3 août 2016 09:27
    Modérateur
  • cop est un char*

    il est initialisé dans le passage de paramètre


    Jean Noël Martin

    mercredi 3 août 2016 11:20
  • L'initialisation d'un pointeur par passage de paramètre, ça me fait une belle jambe.

    C'est quoi l'initialisation de la variable dont l'adresse est la valeur du pointeur passé en paramètre alors ?

    Faut tous vous dire ?!?!

    Mais, en gros, vous tentez des modifications dans une zone mémoire où vous n'avez pas le droit de le faire.

    Donc, je vous demande pourquoi "cop[0] = 0;" n'est pas une grossière erreur ?

    Pourquoi "cop[0]" serait une case mémoire dont vous avez le droit de modifier le contenu ?


    Paul Bacelar, Ex - MVP VC++

    mercredi 3 août 2016 14:47
    Modérateur
  • La valeur de cop est initialisée en passage de paramètre et remise à zero par cop[0] L'adresse de cop semble valide

    Jean Noël Martin

    mercredi 3 août 2016 14:52
  • >L'adresse de cop semble valide

    Vous êtes Néo de Matrix, vous voyez à travers la matrice ???

    0x00F5192C vous savez dans quelle page mémoire ça se trouve et vous avez fait les calculs d'index pour trouver le vecteur des droits sur cette pages de mémoires physiques ?

    En gros, vous nous prenez pour des jambons avec votre "semble valide".

    <Pourquoi "cop[0]" serait une case mémoire dont vous avez le droit de modifier le contenu ?> (bis)

    Et pour le prouver, il n'y a pas 2 solutions :

    C'est quoi l'initialisation de la variable dont l'adresse est la valeur du pointeur passé en paramètre alors ? (bis)

    Si vous n'êtes pas foutu de répondre à des questions précises, ça va pas le faire.

    Donnez-nous le code d'initialisation, et arrêtez avec vos "semble valide" !!!


    Paul Bacelar, Ex - MVP VC++

    mercredi 3 août 2016 17:49
    Modérateur
  • je vous met le code de la methode
    char* CStrConv::strxcpy( char* cop, int len, char* source)
    {
    	int i;
    	
    /*	i = len;
    	while( i > 0)
    	{
    		copy[i--] = 0;
    	}*/
    	i = 0;
    	cop[0] = 0;
    	if( cop != nullptr || source != nullptr)
    	{
    		while( source[i] != 0 && i < len)
    		{
    			cop[i] = source[i];
    			i++;
    		}
    		cop[i] = 0;
    	}
    	return( cop);
    };


    Jean Noël Martin

    mercredi 3 août 2016 17:56
  • Mais on s'en fout du code de la méthode.

    On veut le code qui initialise le contenu de la mémoire pointée par cop !!!!


    Paul Bacelar, Ex - MVP VC++

    jeudi 4 août 2016 07:58
    Modérateur
  • mais ce code est difficile à atteindre par le debuger

    J'ai fini par le traquer:

    	len = strlen( pNextToken);
    	Buffer = new char(40);
    	Token = CStrConv::strxcpy( Buffer, len +1, pNextToken);
    	sWord = pNextToken;
    	int npos = sWord.find( ",");
    et ce code marche sous debogguer pour plusieurs itérations et plante dans les mêmes conditions


    Jean Noël Martin



    jeudi 4 août 2016 08:08
  • >mais ce code est difficile à atteindre par le debuger

    Le débogueur affiche le CallStack dans une Vue dédiée, vous n'avez qu'à cliquer sur le niveau de l'appel pour vous retrouver dans le code de l'appel, avec mes valeurs des variables lors de l'appel.

    Il n'y a pas plus enfantin.

    L'extrait de code que vous nous fournissez est vraiment pas tout pourri !

    Pour allouer un tableau de char, c'est avec des [], pas des ().

    Ici, votre code alloue UN char qu'il initialise à 40, le caractère "(" en ASCII.

    Pour que "Buffer" pointe sur un buffer de 40 octets, c'est "Buffer = new char[40];" (mais que c'est laid).

    Si "len" est supérieur à 39, patatras. Je ne vois pas l'intérêt de mettre une valeur en dur, juste pour introduire un bug. Remplacer "40" par "len+1". => "Buffer = new char[len+1];"

    Mais comme je pense que vous n'utilisez pas gcc, vous n'avez pas le droit au VLA. Donc utilisez des std::dynarray à la place de ces foutus tableau C, on est en C++, putain.

    Cela n'explique pas votre problème, mais comme vous n'avez pas de certitudes sur le fait que cela vient de cette appel, et vu la qualité misérable du code, il est assez probable que le problème viennent d'un code proche d'aussi mauvaise qualité.

    Et le code de CStrConv::strxcpy est tout aussi malodorant. Le code avant le if fait l'assertion que "cop" est différent de nullptr (sinon un bon vieux crash) et après on test ça valeur. Même un code aussi trivial est à revoir.

    Mais encore mieux, comme l'a déjà indiqué Médinoc, ne réinventez pas la roue, et ici c'est même plus une roue carrée, c'est carrément une bombe H vue la qualité du code :

    http://www.developpez.net/forums/d1569922/c-cpp/outils-c-cpp/visual-cpp/cpp-cli/affectation-ne-se/


    Paul Bacelar, Ex - MVP VC++

    jeudi 4 août 2016 13:10
    Modérateur