Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> очень красивая функция с помощью профессионалов 
:(
    Опции темы
segadir
Дата 7.9.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



написал простенькую функцию на Си
Код

/*-------------------------------------------------------------------------.
|                                                                           |
|    GetDate() - returns the current time in format fnowdate[]               |
|                            return global array nowdate[]                   |
|    fomat_date: man strftime                                               |
|                                                                           |
`-------------------------------------------------------------------------*/
void GetDate(void){
    struct tm tdat;
    long ltime;
    time(&ltime);
    tdat=*localtime(&ltime);
    strftime (nowdate,strlen(nowdate),fnowdate,&tdat);
}
, хотел бы с помощью профи на этом форуме, довести её до совершенства.
а именно:
Как вы уже заметили я использую глобальные массивы, что не есть гуд! 
Вот бы переделать её так что бы она стала указателем на результат, т.е.
Код

printf("Date:%s",GetDate("YYYY-MM-DD"));
printf("Time:%s",GetDate("hh-mm-ss"));
printf("sec:%s",GetDate("ss"));

эта функция очень маленькая, поэтому прошу !проффи! , мне очень хочеться посмотреть как можно до совершенства решить такую задачку.
спасибо.
PM MAIL   Вверх
djamshud
Дата 7.9.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Непрофессионал делает так:

Код

//lib
static char __stinternal_tbuf[128];

#define frm_date(format)({ \
time_t tm=time(0); \
strftime(__stinternal_tbuf,sizeof(__stinternal_tbuf),format,localtime(&tm)); \
__stinternal_tbuf;})

...

//src
int main(){
printf("%s\n",frm_date("%a %b %d %T %Y"));
return 0;}

Код

Tue Sep 07 17:10:37 2010


Сейчас вам еще покажут плюсовый пример на каком-нибудь boost-е.

Добавлено через 2 минуты и 51 секунду
Хм. Это этот дефайн легко превращается в обычную функцию. Изначально он был сложнее - буфер передавался как один из параметров дефайна, поэтому функция не подходила - sizeof(buf) не работал как задумано.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
segadir
Дата 7.9.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



можно обойтись без задания конкретной длины 128? ведь формат может быть по длинее. ну вообще довольно таки здорово! Спасибо!
allprofi Будут ли еще варианты?

Это сообщение отредактировал(а) segadir - 7.9.2010, 16:26
PM MAIL   Вверх
djamshud
Дата 7.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Код

#define frm_date(tbuf,format)({ \
time_t tm=time(0); \
strftime(tbuf,sizeof(tbuf),format,localtime(&tm)); \
tbuf;})


Вот раскопал оригинальный дефайн. Первым параметром передается заранее приготовленный буфер нужной длины. Но я от этого варианта отказался, потому что на деле 128 байт хватает с головой, а громоздкость кода значительно уменьшается.

Пожалуйста!


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 7.9.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



djamshud, глобальный буффер... smile сделайте его либо локальным, либо добавьте глобальный мьютекс.

Цитата(djamshud @  7.9.2010,  16:16 Найти цитируемый пост)
Сейчас вам еще покажут плюсовый пример на каком-нибудь boost-е.

именно. благо что говорится про Си. ибо в с++ нельзя использовать strftime().
единственный абсолютно правильный вариант - boost.format

PM WWW   Вверх
segadir
Дата 7.9.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



очень хотел бы услышать про то как можно отказаться от фиксированной (128)  длины массива, 
т.е. длина сама бы задавалась в зависимости от входной строки.
как вариант сделать - динамическим
но может есть что либо так сказать "по изящнее" ? а?
Код

# include <stdio.h>
# include <time.h>

char *getdate(char *format){
    static char buff[128];
    time_t tm=time(0);
    strftime(buff, sizeof(buff), format, localtime(&tm));
    return buff;
}

void main(){
    printf("%s\n",getdate("%Y/%m/%d %H:%M:%S"));
}

PM MAIL   Вверх
borisbn
Дата 7.9.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



IMHO функция по-любому лучше.
1. Можно сделать параметр форматирования по-умолчанию, например "dd.MM.yyyy hh:mm:ss"
2. Можно вернуть std::string
3. Буфер можно выделить на стеке

и зачем в конце делается 
Цитата(djamshud @  7.9.2010,  16:30 Найти цитируемый пост)
tbuf;})

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Sartorius
Дата 7.9.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 2
Всего: 37



Цитата(boostcoder @  7.9.2010,  18:44 Найти цитируемый пост)
ибо в с++ нельзя использовать strftime().
  smile Это почему?

PM MAIL ICQ   Вверх
segadir
Дата 7.9.2010, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



Цитата(borisbn @ 7.9.2010,  17:58)
2. Можно вернуть std::string
3. Буфер можно выделить на стеке

да но я думаю это спарведливо только к С++??? или нет?
PM MAIL   Вверх
borisbn
Дата 7.9.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(segadir @  7.9.2010,  18:04 Найти цитируемый пост)
да но я думаю это спарведливо только к С++??? или нет?

только 
Цитата(borisbn @  7.9.2010,  17:58 Найти цитируемый пост)
2. Можно вернуть std::string

а выделить память на стеке можно и в Си.
Правда в данном случае от неё толку не будет, потому, что вернуть char * на такую память нельзя
вернее можно, но получишь краш :(

кстати, твоё замечание нужно адресоватьи boost'овцам

Это сообщение отредактировал(а) borisbn - 7.9.2010, 18:10


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
icecrashldr
Дата 7.9.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Мне опять скучно ... 

1) Локальный буфер

Код

static char __stinternal_tbuf[128];
#define frm_date(format) { \
time_t tm=time(0); \
strftime(__stinternal_tbuf,sizeof(__stinternal_tbuf),format,localtime(&tm)); \
__stinternal_tbuf;}


Оформляем
Код

#define frm_date(format) { \
static char __stinternal_tbuf[128];
time_t tm=time(0); \
strftime(__stinternal_tbuf,sizeof(__stinternal_tbuf),format,localtime(&tm)); \
__stinternal_tbuf;}


Буфер будет локальным, и в пределах блока который был в дефайне, и "драки" имен между переменными быть не должно.

2) Глобальный буфер
Выше описанный спсоб будет работать, вот только в много поточном приложении будет плохо так что либо синхронизация(Mutex, CriticalSction) или
переменная нити(потока) __declspec(thread) для студии.


Sartorius, Можно, но только это микс С с С++, не которые личность утверждают что это от лукавого, но каждому свое.


borisbn
Цитата

вернее можно, но получишь краш :(

Креш не получи, так как память валидная, а вот гарантировать валидность данных, это не получится, так как при "закрутки" стека компилятор волен выбирать метод самостоятельно, так что это вы правы использовать НЕЛЬЗЯ.

PM MAIL WWW   Вверх
djamshud
Дата 8.9.2010, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder, во-первых, не каждое приложение многопоточно; во-вторых, многопоточность - костыль; в-третьих, буфер локален в пределах одного объектного файла. Но вообще, да :).

borisbn,

>и зачем в конце делается 

Чтобы "вернуть" указатель из макроса. См., как раскрывается макрос в код.

icecrashldr, 

>локальный буфер

В общем да, только я его немного пропатчу для ТС:) "({})" - GCC-шное расширение, но без него никак: обычный #define macro{...} раскроется в код и все испортит, #define macro ... и нормальной "локальной" tm не сделает, и код попортит.

segadir,

Код

//macro
#define frm_date(format,size)({ \
time_t tm=time(0); \
char tbuf[size]; \
memset(tbuf,0,sizeof(tbuf)); \
strftime(tbuf,sizeof(tbuf),format,localtime(&tm)); \
tbuf;})

//func
char const *frm_date(char const *format,size_t len){
static char *buf=0;
free(buf);
buf=malloc(len);
memset(buf,0,len);
time_t tm=time(0);
strftime(buf,len,format,localtime(&tm));
return buf;}


Но обнаружился неприятный баг strftime-а: если сформированная им строка-дата не влезает в отведенный буфер, функция мало того, что не выставляет \0 в его конец, так еще и возвращает неправильный return value. В приведенных примерах я это пофиксил, но думается мне, надо писать багрепорт в ГНУ, т.к. в мане про этот баг ни слова не нашел.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 8.9.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(djamshud @  8.9.2010,  10:56 Найти цитируемый пост)
во-вторых, многопоточность - костыль

это еще почему? smile 
PM   Вверх
djamshud
Дата 8.9.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



azesmcar, потому что рулит многопроцессность либо изначальное затачивание программы для многопоточного (десятки и сотни нитей) решения чего-нибудь на кластере. В обоих случаях это отдельно оговаривается и соответствующим образом проектируется все приложение, и обозначенной проблемы не будет. В этом топике я холиворить больше не будуsmile.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
azesmcar
Дата 8.9.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(djamshud @  8.9.2010,  11:12 Найти цитируемый пост)
В обоих случаях это отдельно оговаривается и соответствующим образом проектируется все приложение

 smile 

Цитата(djamshud @  8.9.2010,  11:12 Найти цитируемый пост)
и обозначенной проблемы не будет

а..это вы в контексте обозначенной проблемы? я думал вообще, так сказать глобально smile 
PM   Вверх
segadir
Дата 8.9.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



Подводя итоги:
Код

# include <stdio.h>
# include <string.h>
# include <time.h>

char *superbuff(unsigned long long int length);
char *getdate(char *format);

char *superbuff(unsigned long long int length){
    static unsigned char f_maloc = FALSE;
    static char *sbuff;

    if (f_maloc) {
     free(sbuff);
        sbuff = NULL;
        f_maloc = FALSE;
    }

    if (length){
        sbuff = malloc((length * sizeof(char)) + 1);
        if(!sbuff)
        {
          printf("Недостаточно памяти\n");
          exit(1);
        }
        f_maloc = TRUE;
    }
    return sbuff;
}

char *getdate(char *format){
    char *buff;
    buff = superbuff(strlen(format) * 2 + 1); // *2 : %Y - 2010
    time_t tm=time(0);
    strftime(buff, strlen(format) * 2 + 1, format, localtime(&tm));
    return buff;
}

printf("DATE %s\n",getdate("%Y/%m/%d %H:%M:%S"));

    superbuff(0);
    return 0;



профи (без сарказма) что скажите?  profit?
PM MAIL   Вверх
borisbn
Дата 8.9.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



segadir, если не секрет, какая необходимость использовать именно Си, а не Си++ ? 
Изучение ?
Компилятор не поддерживает плюсы ( какая-нибудь ARM-архитектура ) ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
segadir
Дата 8.9.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



1 - причина изучив Си перехожу на С++
2 - пока программирую под АВР микроконтроллеры
3 - а по чему бы и нет?   П.С. Си vs С++ вечная тема
PM MAIL   Вверх
djamshud
Дата 8.9.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



segadir, чем вам не нравится мой последний вариант с функцией? У вас все с одной стороны излишне сложно, а с другой - держится на подпорках. Например strlen data = strlen format * 2. Формат %T -> данные hh:mm:ss -> fail. Кроме того, strlen - некомильфо, медленная функция.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
segadir
Дата 8.9.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



djamshud, почему не нравится? кто сказал? очень даже оригинальненько,  smile  но мне тоже хочеться приложить руку к своему совершенству. 
Я у вас идейку повзаимствовал, с buf=malloc(len);
маленький минус: всёже нужно знать заранее размер строки


а где еще предложения (лень?  : true  : false)   , или тут только один профи djamshud, кстати есть у кого поучиться!

Формат %T -> данные hh:mm:ss -> fail. Да ксожаленью, вы правы хоть программа и не упала, но всётаки так и есть :( буду думать:
1 вариант заранее разбирать входную строку на наличие сокращений %Y %D и тд - (не хорошо как-то)
2 вариант выделить памяти в 10 раз больше (ваще не рационально)
3 вариант  организовать полную динамичность по условию 
Код

while(10 символов прошло) выделить еще 10 ячеек памяти
return *все_кусочки



Это сообщение отредактировал(а) segadir - 8.9.2010, 15:48
PM MAIL   Вверх
boostcoder
Дата 8.9.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(segadir @  8.9.2010,  15:28 Найти цитируемый пост)
или тут только один профи djamshud

он конечно не дубень... но! я по глубоким убеждениям(и профф обязанностям) не изобретаю велосипеды. свой ответ я дал. и он _самый_правильный_.
PM WWW   Вверх
djamshud
Дата 8.9.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder, ваш ответ плюсовый и бустовый. А ваше мнение о самой правильности своего ответа лишь отражает ваше зазнайство:). Чем он, к примеру, правильнее QDate? А что, если (о боже!) нет с++?

segadir, да я всего лишь любитель:).

Это сообщение отредактировал(а) djamshud - 8.9.2010, 16:17


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
borisbn
Дата 8.9.2010, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(segadir @  8.9.2010,  15:28 Найти цитируемый пост)
1 вариант заранее разбирать входную строку на наличие сокращений %Y %D и тд - (не хорошо как-то)

что в CRT ( snprintf и т.п.), что в boost'е, что в Qt делают именно так

Это сообщение отредактировал(а) borisbn - 8.9.2010, 16:24


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 8.9.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(djamshud @  8.9.2010,  16:17 Найти цитируемый пост)
ваш ответ плюсовый и бустовый.

в своем первом посте я это подметил.

Цитата(djamshud @  8.9.2010,  16:17 Найти цитируемый пост)
А ваше мнение о самой правильности своего ответа лишь отражает ваше зазнайствоsmile

похоже я вас чем-то зацепил... я не намеренно.

Цитата(djamshud @  8.9.2010,  16:17 Найти цитируемый пост)
Чем он, к примеру, правильнее QDate?

QDate - Blob.
я бы не в коем случае не стал сие использовать. дабы не стать посмешищем для знакомых/коллег smile 

Цитата(djamshud @  8.9.2010,  16:17 Найти цитируемый пост)
А что, если (о боже!) нет с++?

если нет плюсов.. я бы сменил работу, на ту, где нет Си smile 

Это сообщение отредактировал(а) boostcoder - 8.9.2010, 16:27
PM WWW   Вверх
djamshud
Дата 8.9.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder,

>похоже я вас чем-то зацепил... я не намеренно.

Нее, я как слон:)

>QDate - Blob.

QDate != Blob.
Он делает ровно то, что должен уметь делать класс-дата. Это во-первых. А во-вторых, паттерны, антипаттерны - задротство, программирование ради программирования. Всегда нужно исходить из задач.

>если нет плюсов.. я бы сменил работу, на ту, где нет Си

Слабак!:)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
boostcoder
Дата 8.9.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(djamshud @  8.9.2010,  16:33 Найти цитируемый пост)
Он делает ровно то, что должен уметь делать класс-дата

делать то он делает. но все равно blob. будь у вас хорошие познания в с++ и паттернах, вы бы поняли что это blob.

Цитата(djamshud @  8.9.2010,  16:33 Найти цитируемый пост)
паттерны, антипаттерны - задротство

какой кочмар smile 
о чем же тогда пишут Саттер, Александреску, Страуструп... с вами все ясно. продолжать не вижу смысла. и это вы мне говорите про зазнайство? smile

Добавлено через 4 минуты и 28 секунд
Цитата(djamshud @  8.9.2010,  16:33 Найти цитируемый пост)
 Всегда нужно исходить из задач

существуют стандарты по написанию кода с++. и несоблюдение этих стандартов, частенько(почти всегда) заводит проект в стадию _невозможности_поддержки_/_невозможности_развития_.
так же, многие конторы, просто не позволят писать так, как тебе хочется/можется/нравиться. и я с этим абсолютно согласен.
PM WWW   Вверх
djamshud
Дата 8.9.2010, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder,

Саттер - не читал;
Александреску - читал, осуждаю; мужик на шаблонах свихнулся;
Страуструп - читал, в общем одобряю.

>будь у вас хорошие познания в с++ и паттернах, вы бы поняли что это blob.
>с вами все ясно. продолжать не вижу смысла

/me пошел плакать.

>и это вы мне говорите про зазнайство?

А чо не так? :)


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
segadir
Дата 8.9.2010, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



не мужики, я не лезу вас разьединять, но может поможите доработать функцию?
если каждый по своему её напишет мне от этого только выгода.
PM MAIL   Вверх
boostcoder
Дата 8.9.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(djamshud @  8.9.2010,  16:33 Найти цитируемый пост)
QDate != Blob.

глянул на доку... и, собственно соглашусь, не blob.
просто вспомнился QString.
PM WWW   Вверх
djamshud
Дата 8.9.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder,

>просто вспомнился QString.

Это да. Тоже считаю его монстроузным.

>существуют стандарты по написанию кода с++. и несоблюдение этих стандартов, частенько(почти всегда) заводит проект в стадию _невозможности_поддержки_/_невозможности_развития_.

Ну глупость же пишите. Все зависит от умения проектировать свои решения.

>так же, многие конторы, просто не позволят писать так, как тебе хочется/можется/нравиться. и я с этим абсолютно согласен.

Это плохие конторы, и мне очень жаль, что вам приходится работатать именно в них. Постановка производства софта на конвеер экономически, конечно, выгодно, но без пространства для маневра не будет творцов, а без творцов - шедевров.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
icecrashldr
Дата 8.9.2010, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



segadir, Готовое решение? шевели мозгами .. Могут написать код за тебя, можешь найти готовое решения, можешь реализовать как хочешь, лишь бы работало, но станиш ли от это лучше программировать? нет ... 


boostcoder, Соглашаюсь с вашими постами, вот только не все гладко, как пишет выше упомянутые люди. Конечно, когда дают новый проект, пишу мол типо как хочешь, тут конечно все(по крайней мере многое, ведь код всегда хочется сделать лучше) сработает. А вот мне например сейчас дали патчить xwin от cygwin, вот тут то и понимаешь, что паттерны применить как то не реально smile
Предлогал переписать. сказали ни ни, хотя я бы в одиночку бы справился ... 
PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Ну глупость же пишите.

может хватит самолюбие тешить.

Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Все зависит от умения проектировать свои решения.

об этих стандартах я и говорю. вы же, не понимая моей мысли, ни имея представления о _стандартах_проектирования_, пытаетесь возвысить себя, на, я бы сказал, _пустом_многословии_. заканчивайте с этим. ну... не верный вы способ выбрали.

Цитата(djamshud @  8.9.2010,  17:21 Найти цитируемый пост)
Это плохие конторы, и мне очень жаль, что вам приходится работатать именно в них.

естественно!
ведь стандарты проектирования разрабатывают глупцы, не ровень вам smile 
пустое все...

Добавлено @ 17:42
Цитата(icecrashldr @  8.9.2010,  17:33 Найти цитируемый пост)
xwin от cygwin

во первых - если это Си, то да, тут мало пространства для выбора.
во вторых - если с++, но проект нужно изрядно расширить, то в этом случае, нужно углубленно проанализировать имеющийся проект. что весьма не тривиально. и от этого зависит правильность принятия решения. так же, замечу, что анализом может заниматься далеко не каждый программист. и естественно, и от этого фактора, так же, зависит правильность принятия решения. выполнив оба требования, и только после этого принимать решение, изменять проект используя паттерны, или же писать с нуля используя паттерны. я обычно предпочитаю второе.

Это сообщение отредактировал(а) boostcoder - 8.9.2010, 17:45
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



В основном конечно С, но где то видел С++.
Мало того куча багов, производительность желает лучшего, так еще и баги жестокие.
Какое рефакторинг? если делать так по новому. Вот только время, не кто на это не выделит, а это 1307 файлов(пакрайней мере в моей версии) и каждый файл 1000 строк, вот его и пересмотреть то не возможно.

Так что паттерны это хорошо, вот только не всегда применимы...

Часть партянки.. для смеха ...
Код

  case WM_CREATE:

      /* */
      SetProp (hwnd,
           WIN_WINDOW_PROP,
           (HANDLE)((LPCREATESTRUCT) lParam)->lpCreateParams);
      
      /* */
      SetProp (hwnd,
           WIN_WID_PROP,
           (HANDLE)winGetWindowID (((LPCREATESTRUCT) lParam)->lpCreateParams));

      /*
       * Make X windows' Z orders sync with Windows windows because
       * there can be AlwaysOnTop windows overlapped on the window
       * currently being created.
       */
      winReorderWindowsMultiWindow ();

      /* Fix a 'round title bar corner background should be transparent not black' problem when first painted */
      {
        RECT rWindow;
        HRGN hRgnWindow;
        GetWindowRect(hwnd, &rWindow);
        hRgnWindow = CreateRectRgnIndirect(&rWindow);
        SetWindowRgn (hwnd, hRgnWindow, TRUE);
        DeleteObject(hRgnWindow);
      }

      SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)XMING_SIGNATURE);

      IzIME_SendCurrentValue(hwnd);

      return 0;

    case WM_INIT_SYS_MENU:
      /*
       * Add whatever the setup file wants to for this window
       */
      SetupSysMenu ((unsigned long)hwnd);
      return 0;

    case WM_SYSCOMMAND:
      /*
       * Any window menu items go through here
       */
      if (HandleCustomWM_COMMAND ((unsigned long)hwnd, LOWORD(wParam)))
      {
        /* Don't pass customized menus to DefWindowProc */
        return 0;
      }
      if (wParam == SC_RESTORE || wParam == SC_MAXIMIZE)
      {
        WINDOWPLACEMENT wndpl;
    wndpl.length = sizeof(wndpl);
    if (GetWindowPlacement(hwnd, &wndpl) && wndpl.showCmd == SW_SHOWMINIMIZED)
          needRestack = TRUE;
      }
      break;

    case WM_INITMENU:
      /* Checks/Unchecks any menu items before they are displayed */
      HandleCustomWM_INITMENU ((unsigned long)hwnd, wParam);
      break;

    case WM_ERASEBKGND:
      /*
       * Pretend that we did erase the background but we don't care,
       * since we repaint the entire region anyhow
       * This avoids some flickering when resizing.
       */
      return TRUE;

    case WM_QUERYENDSESSION:
        return TRUE;
    case WM_ENDSESSION:
        ExitProcess(0);
        return TRUE;
    case WM_DISPLAYCHANGE: 
        winAdjustVideoModeShadowGDI2(s_pScreen);
        break;
    case WM_PAINT:
      /* Only paint if our window handle is valid */
      if (hwndScreen == NULL)
    break;

      /* BeginPaint gives us an hdc that clips to the invalidated region */
      hdcUpdate = BeginPaint (hwnd, &ps);
      /* Avoid the BitBlt's if the PAINTSTRUCT is bogus */
      if (ps.rcPaint.right==0 && ps.rcPaint.bottom==0 && ps.rcPaint.left==0 && ps.rcPaint.top==0)
      {
    EndPaint (hwnd, &ps);
    return 0;
      }

      /* Try to copy from the shadow buffer */
      if (!BitBlt (hdcUpdate,
           ps.rcPaint.left, ps.rcPaint.top,
           ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
           s_pScreenPriv->hdcShadow,
           ps.rcPaint.left + pWin->drawable.x, ps.rcPaint.top + pWin->drawable.y,
           SRCCOPY))
    {
      LPVOID lpMsgBuf;
      
      /* Display a fancy error message */
      FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | 
             FORMAT_MESSAGE_FROM_SYSTEM | 
             FORMAT_MESSAGE_IGNORE_INSERTS,
             NULL,
             GetLastError (),
             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
             (LPTSTR) &lpMsgBuf,
             0, NULL);

      ErrorF ("winTopLevelWindowProc - BitBlt failed: %s\n",
          (LPSTR)lpMsgBuf);
      LocalFree (lpMsgBuf);
    }

      /* EndPaint frees the DC */
      EndPaint (hwnd, &ps);
      return 0;

    case WM_MOUSEMOVE:
      /* Unpack the client area mouse coordinates */
      ptMouse.x = GET_X_LPARAM(lParam);
      ptMouse.y = GET_Y_LPARAM(lParam);

      /* Translate the client area mouse coordinates to screen coordinates */
      ClientToScreen (hwnd, &ptMouse);

      /* Screen Coords from (-X, -Y) -> Root Window (0, 0) */
      ptMouse.x -= GetSystemMetrics (SM_XVIRTUALSCREEN);
      ptMouse.y -= GetSystemMetrics (SM_YVIRTUALSCREEN);

      /* We can't do anything without privates */
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      /* Has the mouse pointer crossed screens? */
      if (s_pScreen != miPointerGetScreen(g_pwinPointer))
    miPointerSetScreen (g_pwinPointer, s_pScreenInfo->dwScreen,
                   ptMouse.x - s_pScreenInfo->dwXOffset,
                   ptMouse.y - s_pScreenInfo->dwYOffset);

      /* Are we tracking yet? */
      if (!s_fTracking)
    {
      TRACKMOUSEEVENT        tme;
      
      /* Setup data structure */
      ZeroMemory (&tme, sizeof (tme));
      tme.cbSize = sizeof (tme);
      tme.dwFlags = TME_LEAVE;
      tme.hwndTrack = hwnd;

      /* Call the tracking function */
      if (!(*g_fpTrackMouseEvent) (&tme))
        ErrorF ("winTopLevelWindowProc - _TrackMouseEvent failed\n");

      /* Flag that we are tracking now */
      s_fTracking = TRUE;
    }
      
      /* Hide or show the Windows mouse cursor */
      if (g_fSoftwareCursor && g_fCursor)
    {
      /* Hide Windows cursor */
      g_fCursor = FALSE;
      ShowCursor (FALSE);
    }

      /* Kill the timer used to poll mouse events */
      if (g_uipMousePollingTimerID != 0)
    {
      KillTimer (s_pScreenPriv->hwndScreen, WIN_POLLING_MOUSE_TIMER_ID);
      g_uipMousePollingTimerID = 0;
    }

      /* Deliver absolute cursor position to X Server */
      winEnqueueMotion(ptMouse.x - s_pScreenInfo->dwXOffset,
               ptMouse.y - s_pScreenInfo->dwYOffset);

      return 0;
      
    case WM_NCMOUSEMOVE:
      /*
       * We break instead of returning 0 since we need to call
       * DefWindowProc to get the mouse cursor changes
       * and min/max/close button highlighting in Windows XP.
       * The Platform SDK says that you should return 0 if you
       * process this message, but it fails to mention that you
       * will give up any default functionality if you do return 0.
       */
      
      /* We can't do anything without privates */
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      /* Non-client mouse movement, show Windows cursor */
      if (g_fSoftwareCursor && !g_fCursor)
    {
      g_fCursor = TRUE;
      ShowCursor (TRUE);
    }

      winStartMousePolling(s_pScreenPriv);

      break;

    case WM_MOUSELEAVE:
      /* Mouse has left our client area */

      /* Flag that we are no longer tracking */
      s_fTracking = FALSE;

      /* Show the mouse cursor, if necessary */
      if (g_fSoftwareCursor && !g_fCursor)
    {
      g_fCursor = TRUE;
      ShowCursor (TRUE);
    }

      winStartMousePolling(s_pScreenPriv);

      return 0;

    case WM_LBUTTONDBLCLK:
    case WM_LBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[0] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, wParam);

    case WM_LBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[0] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, wParam);

    case WM_MBUTTONDBLCLK:
    case WM_MBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[1] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button2, wParam);

    case WM_MBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[1] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button2, wParam);

    case WM_RBUTTONDBLCLK:
    case WM_RBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[2] = TRUE;
      SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, Button3, wParam);

    case WM_RBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      g_fButton[2] = FALSE;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, Button3, wParam);

    case WM_XBUTTONDBLCLK:
    case WM_XBUTTONDOWN:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
    SetCapture(hwnd);
      return winMouseButtonsHandle (s_pScreen, ButtonPress, HIWORD(wParam) + 5, wParam);

    case WM_XBUTTONUP:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;
      ReleaseCapture();
      winStartMousePolling(s_pScreenPriv);
      return winMouseButtonsHandle (s_pScreen, ButtonRelease, HIWORD(wParam) + 5, wParam);

    case WM_MOUSEWHEEL:
      if (SendMessage(hwnd, WM_NCHITTEST, 0, MAKELONG(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) == HTCLIENT)
    {
      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);
      return 0;
    }
      else break;

    case WM_SETFOCUS:
      if (s_pScreenPriv == NULL || s_pScreenInfo->fIgnoreInput)
    break;

      {
    /* Get the parent window for transient handling */
    HWND hParent = GetParent(hwnd);
    if (hParent && IsIconic(hParent)) ShowWindow (hParent, SW_RESTORE);
      }

      winRestoreModeKeyStates ();

      /* Add the keyboard hook if possible */
      if (g_fKeyboardHookLL)
    g_fKeyboardHookLL = winInstallKeyboardHookLL ();
      return 0;
      
    case WM_KILLFOCUS:
      /* Pop any pressed keys since we are losing keyboard focus */
      winKeybdReleaseKeys ();

      /* Remove our keyboard hook if it is installed */
      winRemoveKeyboardHookLL ();
      if (!wParam)
    /* Revert the X focus as well, but only if the Windows focus is going to another window */
    DeleteWindowFromAnyEvents(pWin, FALSE);
      return 0;

    case WM_SYSDEADCHAR:      
    case WM_DEADCHAR:
      /*
       * NOTE: We do nothing with WM_*CHAR messages,
       * nor does the root window, so we can just toss these messages.
       */
      return 0;

    case WM_SYSKEYDOWN:
    case WM_KEYDOWN:

      /*
       * Don't pass Alt-F4 key combo to root window,
       * let Windows translate to WM_CLOSE and close this top-level window.
       *
       * NOTE: We purposely don't check the fUseWinKillKey setting because
       * it should only apply to the key handling for the root window,
       * not for top-level window-manager windows.
       *
       * ALSO NOTE: We do pass Ctrl-Alt-Backspace to the root window
       * because that is a key combo that no X app should be expecting to
       * receive, since it has historically been used to shutdown the X server.
       * Passing Ctrl-Alt-Backspace to the root window preserves that
       * behavior, assuming that -unixkill has been passed as a parameter.
       */
      if (wParam == VK_F4 && (GetKeyState (VK_MENU) & 0x8000))
      break;

#if CYGWINDOWING_DEBUG
      if (wParam == VK_ESCAPE)
    {
      /* Place for debug: put any tests and dumps here */
      WINDOWPLACEMENT windPlace;
      RECT rc;
      LPRECT pRect;
      
      windPlace.length = sizeof (WINDOWPLACEMENT);
      GetWindowPlacement (hwnd, &windPlace);
      pRect = &windPlace.rcNormalPosition;
      ErrorF ("\nCYGWINDOWING Dump:\n"
          "\tdrawable: (%hd, %hd) - %hdx%hd\n", pDraw->x,
          pDraw->y, pDraw->width, pDraw->height);
      ErrorF ("\twindPlace: (%ld, %ld) - %ldx%ld\n", pRect->left,
          pRect->top, pRect->right - pRect->left,
          pRect->bottom - pRect->top);
      if (GetClientRect (hwnd, &rc))
        {
          pRect = &rc;
          ErrorF ("\tClientRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
              pRect->top, pRect->right - pRect->left,
              pRect->bottom - pRect->top);
        }
      if (GetWindowRect (hwnd, &rc))
        {
          pRect = &rc;
          ErrorF ("\tWindowRect: (%ld, %ld) - %ldx%ld\n", pRect->left,
              pRect->top, pRect->right - pRect->left,
              pRect->bottom - pRect->top);
        }
      ErrorF ("\n");
    }
#endif
      
      /* Pass the message to the root window */
      return winWindowProc(hwndScreen, message, wParam, lParam);

    case WM_SYSKEYUP:
    case WM_KEYUP:


      /* Pass the message to the root window */
      return winWindowProc(hwndScreen, message, wParam, lParam);

    case WM_HOTKEY:

      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);
      return 0;

    case WM_ACTIVATE:

      /* Pass the message to the root window */
      SendMessage (hwndScreen, message, wParam, lParam);

      if (LOWORD(wParam) != WA_INACTIVE)
    {
      /* Raise the window to the top in Z order */
          /* ago: Activate does not mean putting it to front! */
          /*
      wmMsg.msg = WM_WM_RAISE;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
          */
      
      /* Tell our Window Manager thread to activate the window */
      wmMsg.msg = WM_WM_ACTIVATE;
      if (fWMMsgInitialized)
        if (!pWin || !pWin->overrideRedirect) /* for OOo menus */
          winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }
      /* Prevent the mouse wheel from stalling when another window is minimized */
      if (HIWORD(wParam) == 0 && LOWORD(wParam) == WA_ACTIVE &&
      (HWND)lParam != NULL && (HWND)lParam != (HWND)GetParent(hwnd))
    SetFocus(hwnd);
      return 0;

    case WM_ACTIVATEAPP:
      /*
       * This message is also sent to the root window
       * so we do nothing for individual multiwindow windows
       */
      break;

    case WM_CLOSE:
      if (GetWindowLongPtr (hwnd, GWL_STYLE) & WS_CAPTION) 
        {
      winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, MK_LBUTTON);
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, MK_LBUTTON);            
        }

      /* Branch on if the window was killed in X already */
      if (pWinPriv->fXKilled)
        {
      /* Window was killed, go ahead and destroy the window */
      DestroyWindow (hwnd);
    }
      else
    {
      /* Tell our Window Manager thread to kill the window */
      wmMsg.msg = WM_WM_KILL;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }
      return 0;

    case WM_DESTROY:

      /* Branch on if the window was killed in X already */
      if (pWinPriv && !pWinPriv->fXKilled)
    {
      ErrorF ("winTopLevelWindowProc - WM_DESTROY - WM_WM_KILL\n");
      
      /* Tell our Window Manager thread to kill the window */
      wmMsg.msg = WM_WM_KILL;
      if (fWMMsgInitialized)
        winSendMessageToWM (s_pScreenPriv->pWMInfo, &wmMsg);
    }

      RemoveProp (hwnd, WIN_WINDOW_PROP);
      RemoveProp (hwnd, WIN_WID_PROP);
      RemoveProp (hwnd, WIN_NEEDMANAGE_PROP);

      break;

    case WM_MOVE:
      /* Adjust the X Window to the moved Windows window */
#ifdef XBCONSOLE
      if (winAdjustXWindow (pWin, hwnd))
        {
      winMouseButtonsHandle (s_pScreen, ButtonPress, Button1, 0);
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, 0);
        }
#else
    winAdjustXWindow (pWin, hwnd);
#endif
      if (GetWindowLongPtr (hwnd, GWL_STYLE) & WS_CAPTION) 
        {
      winMouseButtonsHandle (s_pScreen, ButtonRelease, Button1, MK_LBUTTON);            
        }
      return 0;

PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



это кусок какого-нибудь wndproc? smile

Добавлено через 2 минуты и 3 секунды
уточню: если проект написан на Си, то это не означает что нельзя использовать паттерны с++. другое дело, что нет компилятора с++, или по каким-то соображениям это недопустимо.
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Ага smile 

Цитата

уточню: если проект написан на Си, то это не означает что нельзя использовать паттерны с++. другое дело, что нет компилятора с++, или по каким-то соображениям это недопустимо. 

Это без проблем ... 

Вот только "врукить" осталось, как сделать отрисовку при движении окон  smile  smile  smile . Единственное что пока что не как не могу побороть ((((
PM MAIL WWW   Вверх
djamshud
Дата 8.9.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



boostcoder, одному анонимусу возвышаться над другим? Увольте:). И не принимайте все так близко к сердцу;).

Вы меня немного не так поняли или я не совсем так выразился. Я знаком с паттернами по книге design patterns (хз кто автор) и некоторым публикациям в интернетах. И я прекрасно вижу, когда использую те или иные из них, или когда использую антипаттерны. Я же говорю, что слепое следование правилам "во! паттерн! ###ись!" и "антипаттерн? нет пути!" - зло. И еще большее зло, когда их навязывай тебе твой работодатель. Во-первых,.. Ой, сейчас я рожу много буков, погуглите лучше criticism of patterns.

Добавлено через 16 секунд
The book's authors are Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides with a foreword by Grady Booch.

Во кого я читал.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
icecrashldr
Дата 8.9.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



А вот так у нас пишет TEAM LEADER, после такого хочется вообще забить на это *** (Я не знаю как выразится)

Код

                            while(iter != mContents.end()) 
                            {
                                CStringW strType = L"";
                                DWORD dwSize = 0;
                                
                                strType = iter->first;
                                dwSize = iter->second;

                                if ((strType == L"text") && (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got TEXT...", nDeviceID);
                                    CStringW strData = Utils::UTF8To16(pData, dwSize);

                                    // Copy UNICODE text to WindowsClipboard
                                    if (pPipeSet->CopyTextToWinClipboard(strData, nDeviceID))
                                    {
                                        // device clipboard text was set to win clipboard
                                        // so ignore WM_DRAWCLIPBOARD invoked by sending this content from device to win
                                        IZPipeSet::bIgnoreWinClipboard = TRUE;
                                    }
                                    
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                }
                                else if ((strType == "image") && (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got IMAGE...", nDeviceID);

                                    BYTE *pImageData = (BYTE *)realloc(NULL, dwSize);
                                    memcpy(pImageData, pData, dwSize);

                                    pPipeSet->CopyImageToWinClipboard(hwndOwner, pImageData, dwSize, nDeviceID);

                                    if (pImageData)
                                        free(pImageData);
                                    pImageData = NULL;

                                    // modify data from pipe if needed
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                }
                                else if ((strType == "html")&& (dwSize > 0) && (dwDataSize > 0))
                                {
                                    Log::write(L"Clipboard Thread: Got HTML...", nDeviceID);

                                    BYTE *pHTMLData = NULL;
                                    
                                    if (((pData[0] == 0xFF) && (pData[1] == 0xFE))||  // little-endian order
                                        ((pData[0] == 0xFE) && (pData[1] == 0xFF))    ) // big-endian order
                                    {
                                        Log::write(L"Clipboard Thread: Copying HTML to Win...UTF16 with BOM detected...", nDeviceID);

                                        // UTF-16 html
                                        // Only work with english symbols in html
                                        BYTE *bufUTF16 = NULL;
                                        
                                        // allocate memory without BOM                                    
                                        bufUTF16 = (BYTE *)realloc(NULL, dwSize);
                                        
                                        // copy html content UTF-16 without BOM
                                        memcpy(bufUTF16, pData + 2, dwSize - 2);
                                        bufUTF16[dwSize-2] = 0x00;
                                        bufUTF16[dwSize-1] = 0x00;
                                                
                                        if ((pData[0] == 0xFE) && (pData[1] == 0xFF)) // Big Endian needs to reverse bytes to Little Endian
                                        {
                                            try
                                            {
                                                int nBytes = dwSize - 2;
                                                for(int i = 0; i < nBytes; i += 2)
                                                {
                                                    BYTE TempByte = bufUTF16[i];
                                                    bufUTF16[i] = bufUTF16[i+1];
                                                    bufUTF16[i+1] = TempByte;
                                                }
                                            }
                                            catch (...)
                                            {
                                                // memory operation exception
                                                Log::write(L"Clipboard Thread: Copying HTML to Win... *** !!! ERROR MEMORY EXCEPTION !!!***", nDeviceID);
                                                MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L"Gateway", MB_TOPMOST | MB_ICONERROR);
                                            }
                                        }
                                
                                        CStringW strUTF16 = (LPCWSTR)bufUTF16;

                                        //// save to file
                                        //Utils::WriteDataToFile(L"c:\\utf16_html_orig.bin", pData, dwSize);
                                        //Utils::WriteDataToFile(L"c:\\utf16_html_reversed.bin", bufUTF16, dwSize);
                                        
                                        
                                        // logging
                                        CStringW strLog = L"Clipboard Thread: Copying HTML to Win...UTF16...|";
                                        strLog += strUTF16;
                                        strLog += L"|";
                                        Log::write(strLog, nDeviceID);
                                        // logging

                                        // Convert UTF16 to UTF8
                                        DWORD nCountBytes = 0;
                                        int nUTF8Count = 0;
                                        
                                        nUTF8Count = CMarkup::UTF16To8(NULL, (LPWSTR)bufUTF16, NULL);
                                        if (nUTF8Count > 0)
                                        {
                                            pHTMLData = (BYTE *)realloc(NULL, nUTF8Count + 1);
                                            nCountBytes = CMarkup::UTF16To8((char *)pHTMLData, (LPWSTR)bufUTF16, nUTF8Count);
                                            if (nCountBytes > 0)
                                            {
                                                pHTMLData[nUTF8Count] = '\0';
                                                if (pPipeSet->CopyHTMLToWinClipboard((char *)pHTMLData, nCountBytes + 1, nDeviceID))
                                                {
                                                    // Ignore WM_DRAWCLIPBOARD invoked by sending this content from device to win
                                                    IZPipeSet::bIgnoreWinClipboard = TRUE;
                                                }
                                                else
                                                {
                                                    Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR while preparing or setting clipboard", nDeviceID);
                                                    MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                                }
                                            }
                                            else
                                            {
                                                Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR! cannot convert to UTF8", nDeviceID);
                                                MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                            }
                                        }
                                        else
                                        {
                                            Log::write(L"Clipboard Thread: Copying HTML to Win...ERROR! cannot convert to UTF8", nDeviceID);
                                            MessageBox(AfxGetMainWnd()->GetSafeHwnd(), L"Error while preparing HTML clipboard content.", L" Gateway", MB_TOPMOST | MB_ICONERROR);
                                        }
                                        
                                        // free memory
                                        if (bufUTF16)
                                        {
                                            free(bufUTF16);
                                            bufUTF16 = NULL;
                                        }
                                    }
                                    else
                                    {
                                        Log::write(L"Clipboard Thread: Copying HTML to Win...UTF8 without BOM detected...", nDeviceID);
                                        
                                        // UTF-8 html Open office set clipboard without BOM
                                        pHTMLData = (BYTE *)realloc(NULL, dwSize + 1);
                                        memcpy(pHTMLData, pData, dwSize);
                                        pHTMLData[dwSize] = '\0';
                                        
                                        pPipeSet->CopyHTMLToWinClipboard((char *)pHTMLData, dwSize + 1, nDeviceID);
                                    }

                                    if (pHTMLData)
                                    {
                                        free(pHTMLData);
                                        pHTMLData = NULL;
                                    }
                                    
                                    if ((dwDataSize - dwSize) > 0) // exists more content data in common data block
                                    {
                                        BYTE *pNewData = (BYTE *)realloc(NULL, dwDataSize - dwSize);
                                        memcpy(pNewData, pData + dwSize, dwDataSize - dwSize);
                                        free (pData);
                                        // remove copied part of data
                                        pData = pNewData; // point to newsized and rest data memory block
                                    }
                                    dwDataSize -= dwSize; // new size of data block
                                
                                }
                                else
                                    Log::write(L"Clipboard Thread: Error: Unsupported clipboard content type!", nDeviceID);

                                iter--;
                            }


PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



в данной ситуации, switch() очень легко заменить на, к примеру:
Код

typedef native_id_type id_type;
typedef boost::function<int()> callback_type;
typedef std::map<id_type, callback_type> function_map;

// т.к. заранее известно кол-во case`ов, их нужно как-то регать.
// как-то так:

int wm_create_function(...) {
   ...
}

function_map[WM_CREATE] = boost::bind(wm_create_function, args...);

// вызываем так:
if ( function_map.find(id) == function_map.end() ) {
   throw std::invalid_argument("message");
}
function_map[id](args...);


вот так разбили этот огромный кусок на кучу мелких. и за одно избавились от switch()(который я не приемлю, так же как и goto)(но это имхо).

Добавлено через 1 минуту и 13 секунд
зы
код не проверял smile 

Это сообщение отредактировал(а) boostcoder - 8.9.2010, 19:14
PM WWW   Вверх
icecrashldr
Дата 8.9.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Вариантов масса, меню на все вкусы .. smile

Вот только ТИМУ  это не объяснить, он утверждает, 
Цитата

но оно же работает

PM MAIL WWW   Вверх
boostcoder
Дата 8.9.2010, 19:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(icecrashldr @  8.9.2010,  19:16 Найти цитируемый пост)
но оно же работает

уау! был у меня в команде такой товарысч. точно так же говорил. погнал к х... его.
PM WWW   Вверх
bsa
Дата 8.9.2010, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(icecrashldr @ 8.9.2010,  20:16)
Вот только ТИМУ  это не объяснить, он утверждает, 
Цитата

но оно же работает

Поддерживаю boostcoder. Гнать его надо. Правильная работа программы не является достаточным условием ее качественности.

Дай своему тиму ссылку на форум (а лучше две - одна на часто задаваемые вопросы этого раздела), пусть попробует нас переубедить.
PM   Вверх
xvr
Дата 9.9.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(icecrashldr @  8.9.2010,  19:06 Найти цитируемый пост)
А вот так у нас пишет TEAM LEADER, после такого хочется вообще забить на это ***

Хорошо так пишет - этакая хорошо структурированная спагетина из помеси С++ и realloc'ов  smile 
Цитата(icecrashldr @  8.9.2010,  19:06 Найти цитируемый пост)
(Я не знаю как выразится)

Как в анекдоте:
- Что сказал папа, когда узнал, что ты разбил его машину?
- Матерные слова опустить?
- Конечно
- Тогда ничего

Цитата(bsa @  8.9.2010,  21:44 Найти цитируемый пост)
Поддерживаю boostcoder. Гнать его надо. Правильная работа программы не является достаточным условием ее качественности.
Угу, всенепременно!


Цитата(bsa @  8.9.2010,  21:44 Найти цитируемый пост)
Дай своему тиму ссылку на форум (а лучше две - одна на часто задаваемые вопросы этого раздела), пусть попробует нас переубедить. 

Ему некогда - он КОД пишет  smile 

PM MAIL   Вверх
icecrashldr
Дата 9.9.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



Цитата

Ему некогда - он КОД пишет  smile 

Ага, вот только есть одна проблема...
Я написал и отладил(уже несколько месяцов все работает стабильно) NT сервис + драйвер.
Сервис предоставляет способ общения с драйвером обходя повышения привилегий.
Работа построена через пайпы.
Handle пайпа закрывается только по факту закрытия со стороны клиента(Либо при выгрузки драйвера, отключения устройства)
И уже были случаи когда пайп не закрывался со стороны клиента, соответсвено  утечка ресурсов в двух местах.(А как я это вычислял ... )
А как было весело, отлаживать его stack overflow(он на стеке создавали переменные больше метра, грубо говоря "распыляя память"), и при этом он утверждал "ты же системный программист".
А вот гнать его не получится, скорее всего меня уволят ((

П.С.
 Про архитектуру не спрашивайте, это не я придумывал ...
PM MAIL WWW   Вверх
bsa
Дата 9.9.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



icecrashldr, "гнать его надо" - это не указание к действию, а отношение к специалисту.
PM   Вверх
icecrashldr
Дата 9.9.2010, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 5.7.2010

Репутация: нет
Всего: нет



 smile 
PM MAIL WWW   Вверх
xvr
Дата 9.9.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @ 9.9.2010,  12:51)
icecrashldr, "гнать его надо" - это не указание к действию, а отношение к специалисту.

Судя по коду я бы слово специалист взял в кавычки  smile 

PM MAIL   Вверх
boostcoder
Дата 9.9.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(bsa @  9.9.2010,  12:51 Найти цитируемый пост)
"гнать его надо" - это не указание к действию, а отношение к специалисту. 

в моем случае, это было действие smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.