1. C++ / Говнокод #3542

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    //
    Fraction Fraction::operator +(Fraction &ob)
    {
    	int f;int d; int c; int k; int l; int z;
    	char*p; char*x;
    	p=new char; x=new char;
    	Fraction tempOb;
    	if(strcmp(znam, ob.znam)==0)
    	{
    		f=atoi(tempOb.chisl);
    		d=atoi(ob.chisl);
    		c=atoi(chisl);
    		f=d+c;
    		k=atoi(tempOb.znam);
    		l=atoi(znam);
    		k=l;
    		p=itoa(f,p,10);
    		x=itoa(k,x,10);
    		strcpy(tempOb.chisl,p);
    		strcpy(tempOb.znam,x);
    	}
    	else
    	{
    		f=atoi(tempOb.chisl);
    		d=atoi(ob.chisl);
    		c=atoi(chisl);
    		k=atoi(ob.znam);
    		l=atoi(znam);
    		f=c*k+d*l;
    		z=atoi(tempOb.znam);
    		z=l*k;
    		p=itoa(f,p,10);
    		x=itoa(z,x,10);
    		strcpy(tempOb.chisl,p);
    		strcpy(tempOb.znam,x);
    	}
    	tempOb.operator ~();
    	return tempOb;
    }
    //

    Нашел баг с переполнением, если вводишь слишком большие числа. Пытаюсь сделать через char. Работает. Но такие фрагменты кода убивают. Реально сделать легче, а еще лучше если сразу через int?

    Запостил: ForEveR, 23 Июня 2010

    Комментарии (15) RSS

    • char*p; char*x;
      p=new char; x=new char;
      x=itoa(k,x,10);

      жесть. это работает?
      Ответить
      • ну а почему бы и нет, память там не особо часто выделяется
        Ответить
        • itoa пишет результат в x, потом еще и завершающий 0 добавляет. Код портит память.
          Ответить
          • Портит. Тут как повезёт с аллокатором. Написано же, что работает - значит везёт.
            Ответить
          • показать все, что скрыто> itoa пишет результат в x, потом еще и завершающий 0 добавляет. Код портит память.

            100% не испортит. ни один серьёзный аллокатор на 32битной архитектуре не выделит ровно один байт. будет выравнивание хотя бы до четырёх.
            Ответить
            • а если строка будет больше 4-х байт?
              Ответить
              • показать все, что скрытоа, ну это-то да.

                хотя сиплюс может завести мемпул для чаров, чтобы лишний раз не трогать общую кучу... кто знает... там выравнивания не нужны...
                Ответить
                • и тут фейл.. ты хоть одупляешь что такое мемпул? если тебе дается 1 байт, а ты пишешь в 5 - это ошибка в любом диспетчере памяти...
                  Ответить
                  • Я такого не говорил! Я не говорил, что если утебя есть мемпул и ты выделяешь 1 байт и пиешь 5 - то всё будет хорошо... Пиздец чё вы менгя все гне понгимаете. Если < 4 и\ память выделяется не из мемпула, то она будет выравнева на 4 байта и ошибки не будет для чисел < 999. Если сиплюс готовит мемпул специально для встроенных типов, в данном случае ровно по байту - то да, ошибка будет. Где я неправ? Я сперва глазами промазал прочитал как будто они хотят число 10 перевести, только потом дошло, что это радикс
                    Ответить
              • Не будет. Больше определенного колличества - выдает переполнение буфера
                Ответить
                • что за фейл?? itoa из разряда unsafe... если ей дать маленький буфер, она засрет память по соседству... мы тут недавно с cfdev спорили по этому поводу... в 90% случаев, никто и не поймет что произошло...
                  единственное почему оно работает, это то что гранулярность new под виндой в mscrt 8 байт...
                  Ответить
                  • А что иначе делать? Как устроить проверку на дурака, не меняя на char или меняя на char но грамотно?
                    Ответить
                    • чесно говоря не понял вопроса но постараюсь ответить...
                      либо передавать буфер размером больше 12 байт (p=new char[16]), любой инт влезет в такой буфер... либо в крайнем случае можно использовать snprintf...
                      Ответить
    • А освобождать память не судьба?
      Ответить
      • Ну это так. Тест. Вопрос можно ли это сделать проще...
        Ответить

    Добавить комментарий