Форум Херсона. Форум Херсонской молодежи, флейм, фотографии Херсона, политика в Херсоне, сетевой форум, сети Херсона


Приветствуем на Форум Херсона. Форум Херсонской молодежи..

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

Если возникнут проблемы с регистрацией напишите нам.

Галерея форума Блоги пользователей Список банов
Вернуться   Форум Херсона. Форум Херсонской молодежи. > >
Регистрация СправкаСтатистика Пользователи Календарь Сообщения за день

Программирование Все вопросы по написанию программ

Ответ
 
Опции темы
Старый 28.04.2009, 22:22   #1 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
2/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,442
Благодарили 5,834 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Копилка

Топик для постинга небольших забавных/нужных кусков кода, интересных фактов и т.п.
  • в С/С++ можно менять местами индекс и имя массива, например 5["abcdef"] == 'c', или i[A].
  • в макросах тоже можно использовать переменное кол-во параметров с помощью __VA_ARGS__
  • можно "создать" массив с любым начальным индексом используя такой код:
PHP код:
int basearray[10];
int *array = &basearray[ -]; // массив с начальным индексом 1 
  • alloca - аналогично malloc, но автоматически очищает выделенную память при выходе из функции
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?

Последний раз редактировалось Lester, 28.04.2009 в 22:26.
Lester вне форума  
Ответить с цитированием
Эти 3 пользователей сказали Спасибо Lester за хороший пост:
TIGR (29.04.2009), ustas (29.04.2009), zwitter (29.04.2009)
Старый 29.04.2009, 09:55   #2 (Ссылка на пост)
Местные мы
 
Аватар для Marchello
Пол:
 
Активность Longevity
0/20 17/20
Today Сообщения
0/5 ssssss509
Благодарил(а): 457
Благодарили 620 раз в 179 постах
Галерея: 0
Вес репутации: 23 Marchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имяMarchello известное всем имя
Ну вот, из серии быстродействия:

Получение abs значения float-а (путем сбрасывания знакового бита)
Код:
float m_absf(float x)
{
    DWORD t = (*((DWORD*)&x)) & 0x7fffffff;
    return *((float*)&t);
}
- наверное платформозависимо, но в винде работает ))

Потом, получение квадратного корня, не помню какая погрешность, но она конечно есть. Это я высмотрел в движке Q3.
Код:
float m_sqrt(const float &x)
{
    DWORD  tmp = ((ONE_AS_INTEGER<<1) + ONE_AS_INTEGER - *(DWORD*)&x)>>1;
   float  y   = *(float*)&tmp;
   return x*y*(1.47f - 0.47f*x*y*y);
}
где ONE_AS_INTEGER - это магическое число определенное как
#define ONE_AS_INTEGER ((DWORD)(0x3F800000))


из той же серии, только вычисляет 1.0f / sqrt(x)
Код:
float m_rsqrt(float number)
{
    int   i;
    float x2, y;
    const float threehalfs = 1.5f;

    x2 = number*0.5f;
    y  = number;
    i  = *(long*)&y;                        
    i  = 0x5f3759df - (i>>1);          
    y  = *(float*)&i;
    y  = y*(threehalfs - (x2*y*y));
//    y  = y*(threehalfs - (x2*y*y));   // for greater accuracy

    return y;
}
- если раскоментить строку перед ретурном - повышается точность, почти до 100% (но падает скорость выполнения конечно, но не много).

А еще мне понравился ассемблер математического процессора,
вот как например можно вычислить синус/косинус, корень (и т.д.) на нем:
Код:
float m_sin_asm(float angle)
{
    volatile float res;
    _asm
    {
        FLD angle
        FSIN  // если будет FCOS - будет косинус, если FSQRT - будет корень и т.д.
        FSTP res
    }
    return res;
}
- это самый простейший вариант использования.

Часто нужно вычислять синус и косинус сразу для одного угла (например при рисовании круга), тогда можно сделать так:
Код:
void m_sin_cos_asm(float *sn, float *cs, float angle)
{
    _asm
    {
        FLD angle
        FSINCOS
        MOV edx, DWORD PTR [cs]
        MOV eax, DWORD PTR [sn]
        FSTP DWORD ptr [edx]
        FSTP DWORD ptr [eax]
    }
}
Marchello вне форума  
Ответить с цитированием
Эти 6 пользователей сказали Спасибо Marchello за хороший пост:
Lester (29.04.2009), Muxa (30.04.2009), Rammf (29.04.2009), TIGR (29.04.2009), ustas (29.04.2009), zwitter (29.04.2009)
Старый 30.04.2009, 10:59   #3 (Ссылка на пост)
Уже сменил себе статус
 
Аватар для PhoeniXX
Пол:
 
Активность Longevity
0/20 19/20
Today Сообщения
0/5 sssss2389
Благодарил(а): 3,844
Благодарили 1,942 раз в 919 постах
Галерея: 0
Вес репутации: 40 PhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущееPhoeniXX заслуживает бриллиантовое будущее
Немного о .Net-е.
В самом .Net-е нет аналогов union из c++. Но можно сделать его подобие таким образом:
Код:
    [StructLayout(LayoutKind.Explicit)]
    public struct TestStruct
    {
      [FieldOffset(0)]
      public int a;
      [FieldOffset(0)]
      public float b;
    }
Работает только для Value типов.
PhoeniXX вне форума  
Ответить с цитированием
Эти 2 пользователей сказали Спасибо PhoeniXX за хороший пост:
Marchello (30.04.2009), Rammf (30.04.2009)
Старый 24.05.2009, 06:52   #4 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
2/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,442
Благодарили 5,834 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Хотите запутать исходный код( например, когда его надо отдавать недобросовесному заказчику )? Маленькая утилитка cobfusc в Linux позволит вам сделать это( при этом все ес-но будет компилироваться без проблем ), вот пример результата:

PHP код:
static void q18(q19 q2,int q3,int q4); 
static 
void q20(q19 q2,int q3,int q4);q21(int)q22(q19 q2,int q3,int q4);q21
q19)q23(int q24,int q25)<%int q26;q19 q2;if(q27(sizeof(unsigned char*),q25))<% 
return 
NULL;%>if(q27(sizeof(unsigned char*),q24))<%return NULL;%>q2=(q28*)q29
sizeof(q28));if(!q2)<%return NULL;%>memset(q2,0,sizeof(q28));q2->q30=(unsigned 
 char
**)q29(sizeof(unsigned char*)*q25);if(!q2->q30)<%q31(q2);return NULL;%>q2 
->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<%q2 
->q30<:q26:>=(unsigned char*)q37(q24,sizeof(unsigned char));if(!q2->q30<:q26:> 
)<%for(--
q26;q26>=0;q26--)<%q31(q2->q30<:q26:>);%>q31(q2->q30);q31(q2);return  
NULL;%>%>q2->q24=q24;q2->q25=q25;q2->q38=0;q2->q39=(-(1*(1*1+0)+0));q2->q40=0
q2->q41=(1*(1*1+0)+0);q2->q42=0;for(q26=0;(q26<q43);q26++)<%q2->open<:q26:>= 
(
1*(1*1+0)+0);q2->q44<:q26:>=0;q2->q45<:q26:>=0;q2->q46<:q26:>=0;%>;q2->q47=0
q2->q48=0;q2->q7=0;q2->q5=0;q2->q8=q2->q24-(1*(1*1+0)+0);q2->q6=q2->q25-(1+0); 
return 
q2;%>q21(q19)q49(int q24,int q25)<%int q26;q19 q2;if(q27(q24,q25))<% 
return 
NULL;%>if(q27(sizeof(int*),q25))<%return 0;%>if(q27(sizeof(int),q24))<% 
return 
NULL;%>q2=(q28*)q29(sizeof(q28));if(!q2)<%return 0;%>memset(q2,0,sizeof 
(q28));q2->q48=(int**)q29(sizeof(int*)*q25);if(!q2->q48)<%q31(q2);return 0;%> 
q2->q32=0;q2->q33=0;q2->q34=0;q2->q35=0;q2->q36=0;for(q26=0;(q26<q25);q26++)<% 
q2->q48<:q26:>=(int*)q37(q24,sizeof(int));if(!q2->q48<:q26:>)<%q26--;while(q26 
>=0)<%q31(q2->q48<:q26:>);q26--;%>q31(q2->q48);q31(q2);return 0;%>%>q2->q24
q24;q2->q25=q25;q2->q39=(-(0+1));q2->q40=0;q2->q47=(1*1+0);q2->q50=0;q2->q51
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Эти 6 пользователей сказали Спасибо Lester за хороший пост:
Absent (24.05.2009), Muxa (17.06.2009), pingwinator (28.06.2009), Rammf (24.05.2009), static (25.05.2009), TIGR (24.05.2009)
Старый 17.06.2009, 00:42   #5 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
2/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,442
Благодарили 5,834 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Программа, которая работает одновременно в C, C++, Haskell, Ruby, Python, Perl(x2), HTML, tcl, bash, zsh, make, bash и brainfuck:

PHP код:
# /* [  <!-- */ include  <stdio.h> /*   \ 
  #{\ 
`""""true \\#{"\n#"};           \ 
  \ 
if [ -n "$ZSH_VERSION" ]; then           \ 
  \ 
  echo exec  echo I\'m a zsh script.; \ 
  \ 
elif [ -n "$BASH_VERSION" ]; then        \ 
  \ 
  echo exec  echo I\'m a bash script.; \ 
else  \ 
  echo exec  echo  I\'m  a sh  script.;    \ 
fi
`;  #\ 
BEGIN{print"I'm a ""Ruby"  :"Perl",  " program.\n";  exit; }  
  
#\ 
%q~             
  
set dummy =0puts[list "I'm"  "a"  "tcl"  "script."]; exit    
  
all: ; @echo "I'm a Makefile."           
  
#*/ 
/*: */ 
enum {ab};             
   
static 
int c99(void) {          
  
#ifndef __cplusplus /* bah */         
  
unused1: if ((enum {ba})0)           
  (
void)0
#endif            
  
unused2:  return a;      
}   
static 
int trigraphs(void) {          
   
  return 
sizeof  "??!"  ==  2;     
}   
char X;                
   
int main(void) {              
   
  
struct X  {         
   
     
char  a[2];     
  }; 
  if (
sizeof(X)  !=  1) {        
   
printf("I'm a C++ program (trigraphs %sabled).\n",          
   
   
trigraphs()  ? "en"  "dis"); 
   
}else if (
1//**/2 
  
  
)unused3 : { ;  
    
printf("I'm a C program (C%s, trigraphs %sabled).\n",  
        
c99() ? "89 with // comments" "99",  
        
trigraphs() ? "en" "dis");  
  } else {  
    
printf("I'm a C program (C89, trigraphs %sabled).\n",  
        
trigraphs() ? "en" "dis");  
  }  
  return 
0;  
/* 
# \ 
> main :: IO () -- -- \ 
> main = putStr "I'm a Literate Haskell program.\n"   
# \ 
]>++++++++[<+++++++++>-]<+.>>++++[<++++++++++>-]<-.[-]>++++++++++ \   
[<+++++++++++>-]<-.>>++++[<++++++++>-]<.>>++++++++++[<++++++++++> \ 
-]<- - -.<.>+.->>++++++++++[<+++++++++++>-]<++++.<.>>>++++++++++[ \ 
<++++++++++>-]<+++++.<<<<+.->>>>- - -.<+++.- - -<++.- ->>>>>+++++ \ 
+++++[<+++++++++++>-]<- - -.<<<<<.<+++.>>>.<<<-.- ->>>>+.<.<.<<.> \ 
++++++++++++++.[-]++++++++++"""` 
# \ 
print "I'm a Python program."; """[-][--><html><head> 
<!--:--><title>I'm a HTML page</title></head><body> 
<!--:--><h1>I'm a <marquee><blink>horrible HTML</blink></marquee> page</h1> 
<!--:--><script language="Javascript"> 
<!--: # \ 
setTimeout( // \ 
  function () { // \ 
   document.body.innerHTML = "<h1>I'm a javascript-generated HTML page</h1>"; // \ 
  }, 10000); // \ 
//--> 
</script><!--: \ 
</body></html><!-- } # \ 
say "I'm a Perl6 program", try { " ($?PUGS_VERSION)" } // "", "."; # """ # */ 
#define FOO ]-->~ 
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Старый 28.06.2009, 10:14   #6 (Ссылка на пост)
Гаденыш
 
Аватар для Lester
Пол:
 
Активность Longevity
2/20 16/20
Today Сообщения
0/5 sssss4648
Благодарил(а): 2,442
Благодарили 5,834 раз в 2,093 постах
Галерея: 0
Вес репутации: 78 Lester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторыLester скоро в модераторы
Быстрое возведение в степень( сложность алгоритма O(lnn) вместо O(n) ).

PHP код:
// возведение t в степень k
int powerint tint k )
{
       
int res 1;
       while( 
)
       {
          if( 
)
              
res *= t;

          
*= t;
          
>>= 1;
      }

      return 
res;

http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%BD%D1%8C
__________________
- Слава Україні! - закричали они, вместо приветствия.
- Что это за фашизм?! - возмутился журналист Гундырев. - Откуда у них столько ненависти к русским?
Lester вне форума  
Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей - 0 , гостей - 1)
 

Ваши права в разделе
Вы не можете создавать темы
Вы можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.


Время на сервере: 13:08.

Регистрация Справка Пользователи Календарь Сообщения за день

vBulletin 3, Copyright © 2000-2024, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co