Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 12 из 87<  1 ... 9  10  11  12  13  14  15 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
Daemon писал(а):
оба класса должны быть полиморфными, а у тебя не так

Разве не достаточно хотя бы одной виртуальной функции?

Daemon писал(а):
адресса могут быть разными

да, действительно, там появляется смещение..

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)



Партнер
 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 26.07.2006
Daemon писал(а):
У тебя есть указатель на Base, приводишь его к типу Derv1, т.е. мы спускаемся по иерархии наследования. Но учти, что оба класса должны быть полиморфными, а у тебя не так, у тебя деструктор в обоих классах не виртуальный.

Насколько я понимаю я привожу указатель на Base не к типу Derv1 а к указателю на тип Derv1. А вот с термином "полиморфизм" я ещё к своему стыду не разобрался:) Так что ничего по этому поводу сказать не могу, зазве что то - что прога работает хАрАшо. Я её из книги взял.


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
Указатель на бейз = указатель типа бейз; Когда я "привожу указатель к типу дерв1", я получаю указатель типа дерв1, слово "указатель" никуда не делось)

Читай книгу дальше :)

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Anoss
Цитата:
Разве не достаточно хотя бы одной виртуальной функции?
Да, про деструкторы я перегнул палку. По стандарту, класс полиморфный - если он содержит, наследует или замещает хотя бы одну виртуальную ф-цию.

_________________
Ку ку


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 26.07.2006
Уважаемые форумчане! Кто нибудь может объяснить как работает функция "gcvt" ? Не как её использовать а именно как она работает? Она из stdlib.h.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
GrIfFiN7
А что не понятно-то? Как double в строку перевести? Тебе алгоритм написать?


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 26.07.2006
Было бы неплохо. Я свой написал, но, там малость непонятка получилась, стало интересно - как он пишется "по уму".


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
GrIfFiN7
Вот, наваял :)
Код:
char *my_gcvt( double value, int digits, char *buffer )
{
    if ( digits < 1 ) digits = 1;
    if ( digits > 17 ) digits = 17;

    char *cur_pos = buffer; // указатель на текущее место в выходном буфере

    // для отрицательных чисел нужно вывести знак
    if ( value < 0 )
    {
        *cur_pos++ = '-';
        value = -value;
    }

    // нормализуем число и считаем десятичную степень (экспоненту)
    int exponent = 0;
    while ( value >= 1.0 ) value /= 10.0, ++exponent;
    while ( value < 1.0 ) value *= 10.0, --exponent;
    double eps = 5 * pow( 10.0, -digits );      // eps - для компенсации ошибки округления
    value += eps;
    if ( value >= 10.0 ) value /= 10.0, ++exponent;

    // считаем первые digits цифр числа и записываем в промежуточный буфер
    char buf[_CVTBUFSIZE], *buf_iter = buf;     // массив с итератором
    for ( int i = 0; i < digits; ++i )
    {
        *buf_iter++ = ( char ) floor( value ) + '0';    // записываем цифру в массив
        value = ( value - floor( value ) ) * 10;        // вычисляем следующую цифру
    }
    *buf_iter = 0;  // конец строки

    if ( exponent >= digits || exponent < -1 )
    {
        // выводим число в экспоненциальной форме
        buf_iter = buf;
        *cur_pos++ = *buf_iter++;
        *cur_pos++ = '.';
        while ( *buf_iter ) *cur_pos++ = *buf_iter++;
        // выводим экспоненту
        *cur_pos++ = 'e';
        if ( exponent > 0 ) *cur_pos++ = '+'; else *cur_pos++ = '-', exponent = -exponent;
        *cur_pos++ = ( exponent / 100 ) + '0';
        exponent %= 100;
        *cur_pos++ = ( exponent / 10 ) + '0';
        *cur_pos++ = ( exponent % 10 ) + '0';
    }
    else
    {
        // выводим число в обычной форме
        buf_iter = buf;
        if ( exponent == -1 ) *cur_pos++ = '0', *cur_pos++ = '.';
        while ( *buf_iter )
        {
            *cur_pos++ = *buf_iter++;
            if ( exponent-- == 0 && *buf_iter ) *cur_pos++ = '.';
        }
    }
    *cur_pos = 0;   // конец строки

    return buffer;
}

Немного не эффективно правда. По-хорошему, надо бы ещё добавить проверку на INF и NAN и обрезать не значащие нули. Можешь заняться. :)
З.Ы. Исправил небольшой косяк с округлением.


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 26.07.2006
Спасибо, очень интересный код!:) Но хотелось бы кое что уточнить - зачем нужны строки:
int exponent = 0;
while ( value >= 1.0 ) value /= 10.0, ++exponent;
while ( value < 1.0 ) value *= 10.0, --exponent;
и что такое _CVTBUFSIZE?


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
_CVTBUFSIZE - в MSDN пишут, что это максимально возможный размер результирующей строки (около 350 байт).
А строки, что ты указал, приводят число к значению x: 1 <= x < 10, число = x * 10^exponent.


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
Билли Бонс писал(а):
GrIfFiN7
Вот, наваял :)

Немного не эффективно правда. По-хорошему, надо бы ещё добавить проверку на INF и NAN и обрезать не значащие нули. Можешь заняться. :)
З.Ы. Исправил небольшой косяк с округлением.


Надо не только "добавить проверку на INF и NAN", а еще и указатель, так как, если тебе клиент передаст не указатель на буфер, а NULL, ты успешно завалишься.

p.s. Код читать невозможно. Конструкции типа:
Код:
if ( exponent == -1 ) *cur_pos++ = '0', *cur_pos++ = '.';
, дурной тон.


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Holmes Да ладно тебе придираться-то! Это ж пример просто - не хотел код раздувать на несколько экранов, вот и писал так для краткости.
З.Ы. А на NULL надо проверять, согласен, хотя от кривых рук всё равно не застрахуешься.


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
Мой любимый пример дурного тона — однажды меня попросили набросать переводчик из двоичной системы в десятичную, а я решил быть кратким:

Код:
#include "string.h"
#include "stdio.h"

int main(int argc, char * argv[])
{
unsigned int dec=0;
char *end, *p;

p=end=argv[1]+strlen(argv[1]);

while( (p--)>argv[1] ) dec |= ( (*p)-0x30 ) << (end-p-1);

printf("\n%s (bin) = %u (dec)\n\n",argv[1],dec);

return 0;
}


:D

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Код:
p=end=argv[1]+strlen(argv[1]);

while( (p--)>argv[1] ) dec |= ( (*p)-0x30 ) << (end-p-1);

Эти две строчки можно заменить на:
Код:
for(p=end=argv[1]+strlen(argv[1]);p-->argv[1];dec |= ( (*p)-0x30 ) << (end-p-1));

смотрится ещё веселее :)


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
mein Отлично)) но больше, пожалуй, не сократишь))
Должен признаться, у меня всё-таки еще были проверки..)

Код:
if(argc!=2)
 {
  printf("\nUsage: bintodec BINARY_NUMBER\n\n");
  return 0;
 }


if(strlen(argv[1])>32)
 {
  printf("\nThe number must consist of less than 33 binary digits.\n\n");
  return 0;
 }

p=argv[1];

while( *p )
{
   if(  (*p)!=0x31  && (*p)!=0x30)
     {
      printf("\nThe binary digits are 0 and 1\n\n");
      return 0;
     }
 p++;
}

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
Билли Бонс писал(а):
Holmes Да ладно тебе придираться-то! Это ж пример просто - не хотел код раздувать на несколько экранов, вот и писал так для краткости.
З.Ы. А на NULL надо проверять, согласен, хотя от кривых рук всё равно не застрахуешься.

:beer: Это точно.
Хотя можно быть параноиком и писать параноидальный код!


 

Member
Статус: Не в сети
Регистрация: 28.03.2006
Anoss
Anoss писал(а):
Мой любимый пример дурного тона — однажды меня попросили набросать переводчик из двоичной системы в десятичную, а я решил быть кратким:

Ухаха, зло :) Вот для таких целей и был создан язык Си , с его хаками, факами и истер эгами ! :)

_________________
Первый огонь был получен людьми из-за перегрева.
Пессимист отличается от оптимиста датой наступления конца света.


 

Member
Статус: Не в сети
Регистрация: 01.05.2006
Откуда: Питер
товарищи, глупый вопрос - как извлечь корень третьей степени на С?

_________________
В технике, модератор — это устройство для уменьшения тяги в топке паровой машины на холостом ходу, что позволяет снизить расход топлива.


 

Member
Статус: Не в сети
Регистрация: 28.03.2006
очевидно pow(x, 0.3333)

_________________
Первый огонь был получен людьми из-за перегрева.
Пессимист отличается от оптимиста датой наступления конца света.


 

Member
Статус: Не в сети
Регистрация: 01.05.2006
Откуда: Питер
Aside спасибо =)
все утро млин думал так и не догадался...

_________________
В технике, модератор — это устройство для уменьшения тяги в топке паровой машины на холостом ходу, что позволяет снизить расход топлива.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 12 из 87<  1 ... 9  10  11  12  13  14  15 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan