1. Лучший говнокод

    В номинации:
    За время:
  2. Си / Говнокод #8371

    +133

    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
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    /* ... */
    /**************************************************************************************
      cpu_information () parse /proc/cpuinfo to get information about CPU 
     **************************************************************************************/
    int cpu_information (data* user_data, int pos)
    {
      FILE *cpufp/* /proc/cpuinfo */ /*, *sysfs_max_cpu_freq_fp  /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq */;
       
      char* ch = (char*)malloc (MAXLEN);
      char* line = (char*)malloc (MAXLEN);
      char* buf = (char*)malloc (MAXLEN);
      
      GtkTreeIter iter[2];
      // int y = 0;
      if ((cpufp = fopen(CPU_INFORMATION_FILE, "r")) == NULL)
        printf ("%s\n", "Error opening /proc/cpuinfo");
    
      while (fgets (ch, MAXLEN, cpufp) != NULL) 
      {
        if (!strncmp (ch, "processor", 9)) 
        {
          sscanf (ch, "%*s %*s %s", line);
          strcpy (buf, "CPU");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[0],NULL, pos, 0, buf, 1, line, -1);
        } else if (!strncmp(ch, "vendor_id", 9))
        {
          sscanf(ch,"%*s %*s %s", line);
          strcpy (buf, "Processor type:");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1); 
        } else if (!strncmp(ch, "model name", 10))
        {
          strcpy(buf, "Model name");
          ch[strlen(ch)-1] = '\0'; //delete '\n' symbol from the end of string
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, &ch[13], -1);
        } else if (!strncmp(ch, "cpu MHz", 7))
        {
          int curr_cpu_freq;
          sscanf(ch, "%*s %*s %*s %d\n", &curr_cpu_freq);
          sprintf(line, "%d", curr_cpu_freq);
          strcpy (buf, "Current Processor Speed in MHz");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line,-1);
          /*
    	 Begin parsing /sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_max_freq 
    	 
          sprintf (sysfs_max_cpu_freq_path, SYSFS_CPU_MAX_FREQ_FORMAT_STRING, y);
          if ((sysfs_max_cpu_freq_fp = fopen (sysfs_max_cpu_freq_path, "r")) == NULL) {
        	  printf("%s %s\n", "Error opening",  sysfs_max_cpu_freq_path);
          }
          while (fgets (line, MAXLEN, sysfs_max_cpu_freq_fp) != NULL)
          {
    	sscanf (line, "%d", &max_cpu_freq);
    	sprintf (line, "%d", max_cpu_freq/1000);
    	strcpy (buf, "Max Processor Speed in MHz");
    	gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[2],&iter[1], pos, 0, buf, 1, line,-1);
          }
          y++;
          
    	 End parsing 
           
          fclose (sysfs_max_cpu_freq_fp);*/
        }  else if (!strncmp(ch, "cache size", 10))
        {
          sscanf(ch, "%*s %*s %*s %s", line);
          strcpy (buf, "Processor cache size");
          strcat (line, " KB");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
    
        } else if (!strncmp(ch, "bogomips", 8)) 
        {
          sscanf(ch, "%*s %*s %s", line);
          strcpy (buf, "Processor speed in Bogomips");
          gtk_tree_store_insert_with_values (user_data->InformationTreeStore, &iter[1],&iter[0], pos, 0, buf, 1, line, -1);
          cpu_temperature (user_data,&iter[0], pos); //get CPU temperature.
        }
        pos++;
      }
    
      free (buf);
      free (line);
      free (ch);
      //free (sysfs_max_cpu_freq_path);
      fclose (cpufp);
      return 0;
    }
    /* ... */

    По просьбам трудящихся http://govnokod.ru/7979#comment116436

    По коду:
    1) хорошо бы проверять, что попытался выделить;
    2) ошибка произошла успешно — начинаем парсить...;
    3) для решения таких задач стоит обратить своё внимание на, например, PyGTK.

    P.S. Если уж совсем не в мочь и к строкам так тянет,
    то допилите под себя LiteC, у Г.Шилдта есть что подсмотреть.

    sayidandrtfm, 31 Октября 2011

    Комментарии (20)
  3. PHP / Говнокод #8264

    +152

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    if (asdfadfsdf != 1) {
    
    // всякий код
    
    define ('asdfadfsdf',1);
    }

    Типа проверка чтобы "всякий код" исполнялся только 1 раз...

    Tairesh, 21 Октября 2011

    Комментарии (20)
  4. PHP / Говнокод #8256

    +161

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    reset($queue);
          $query = 'SELECT COUNT(*)'
          .' FROM #__datsogallery'
          .' WHERE (0 != 0';
          while (list($key, $cat) = each($queue)) {
            $query .= ' OR catid = '.$cat;
          }
          $query = $query
          .') AND published = 1'
          .' AND approved = 1';
          $db->setQuery($query);
          $result = $db->query();

    Очень возбуждает строка 4.
    Это в официальном релизе компонента com_datsogallery к Joomla 1.5

    airrussia, 20 Октября 2011

    Комментарии (20)
  5. PHP / Говнокод #8139

    +150

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    $login='55526723433';
    for($n=0; $n!=strlen($login)-2; $n++)
    {
    	if( $login[$n] == $login[$n+1] && $login[$n] == $login[$n+2] )
    	{
    		echo 'есть повторение';
    		exit;
    	}
    }

    снова на ваш суд))

    суть проблемы: проверка содержания строки, есть ли более двух одинаковых символов.

    beetle, 09 Октября 2011

    Комментарии (20)
  6. SQL / Говнокод #8122

    −107

    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
    SELECT SUBSTR(exp, 1, 20) "expression", (CASE WHEN SUBSTR(exp, 6, 1) = '+' THEN (CASE WHEN SUBSTR(exp, 3, 1) = '+' THEN TO_NUMBER(SUBSTR(exp, 1, 2))
     + TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '-' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) - TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE 
    WHEN SUBSTR(exp, 3, 1) = '*' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) * TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '/' THEN 
    TO_NUMBER(SUBSTR(exp, 1, 2)) / TO_NUMBER(SUBSTR(exp, 4, 2)) END END END END) + TO_NUMBER(SUBSTR(exp, 7, 2)) ELSE CASE WHEN SUBSTR(exp, 6, 1) = '-' 
    THEN (CASE WHEN SUBSTR(exp, 3, 1) = '+' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) + TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '-' THEN 
    TO_NUMBER(SUBSTR(exp, 1, 2)) - TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '*' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) * 
    TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '/' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) / TO_NUMBER(SUBSTR(exp, 4, 2)) END END END END) 
    - TO_NUMBER(SUBSTR(exp, 7, 2)) ELSE CASE WHEN SUBSTR(exp, 6, 1) = '*' THEN (CASE WHEN SUBSTR(exp, 3, 1) = '+' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) + 
    TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '-' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) - TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN 
    SUBSTR(exp, 3, 1) = '*' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) * TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '/' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) / 
    TO_NUMBER(SUBSTR(exp, 4, 2)) END END END END) * TO_NUMBER(SUBSTR(exp, 7, 2)) ELSE CASE WHEN SUBSTR(exp, 6, 1) = '/' THEN (CASE WHEN SUBSTR(exp, 3, 1) = '+' THEN 
    TO_NUMBER(SUBSTR(exp, 1, 2)) + TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '-' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) - TO_NUMBER(SUBSTR(exp, 4, 2)) 
    ELSE CASE WHEN SUBSTR(exp, 3, 1) = '*' THEN TO_NUMBER(SUBSTR(exp, 1, 2)) * TO_NUMBER(SUBSTR(exp, 4, 2)) ELSE CASE WHEN SUBSTR(exp, 3, 1) = '/' THEN 
    TO_NUMBER(SUBSTR(exp, 1, 2)) / TO_NUMBER(SUBSTR(exp, 4, 2)) END END END END) / TO_NUMBER(SUBSTR(exp, 7, 2)) END END END END) "result" FROM lab3_2;

    Сидел я на прошлой лабе и делал значит задания по Oracle и вот последнее задание было таким:

    "Дана таблица с единственной колонкой (строкового типа) с выражениями вида:’xx*xx*xx’ где xx – символы цифр 0..9, * - один из символов математических операций: *+-/ Например, таким выражениями являются ‘01*23+34’ ‘32+13-12’ и т.д. Требуется создать таблицу и заполнить ее строками содержащими такие выражения (не менее 5 строк), составить оператор SELECT который используя данные из этой таблицы выведет строки вида ‘<исходное выражение>=<вычисленный результат>’. Задание выполнить без учета приоритетности операций."

    Вооружившись Notepad++ я составил вот такое вот запросище, которое работает между прочим :) Для повторения эксперимента нужно создать таблицу lab3_2 с полем exp строкового типа, ну и внести в нее пару каких-нибудь выражений.

    10a10b1s, 08 Октября 2011

    Комментарии (20)
  7. PHP / Говнокод #8087

    +146

    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
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    Собственно подборка говнокодов))хД
    1 говнокод
    
    if($rs===false){
            $rs='false';
    }
    elseif($rs=="dup"){
            $rs = "dup";
    }
    elseif($rs=="bad_link"){
            $rs = "bad_link";
    }
    else{
            $rs = 'true';
    }
    2 говнокод
    
    for($i=$tot;$i>0;$i--)
    обычные люди написали бы
    for($i=1;$i<=$tot;$i++)
    
    3 говнокод убивает))) Генерация четырехзначного случайного числа
    
    $generation="".mt_rand(0,1000)."".mt_rand(0,1000)."".mt_rand(0,1000)."".mt_rand(0,1000)."";
    
    4 говнокод JS Функция для получения случайного цвета 
    
    <script language="Javascript">
    <!--
    function genHex(){
    colors = new Array(14)
    colors[0]="0"
    colors[1]="1"
    colors[2]="2"
    colors[3]="3"
    colors[4]="4"
    colors[5]="5"
    colors[5]="6"
    colors[6]="7"
    colors[7]="8"
    colors[8]="9"
    colors[9]="a"
    colors[10]="b"
    colors[11]="c"
    colors[12]="d"
    colors[13]="e"
    colors[14]="f"
    
    digit = new Array(5)
    color=""
    for (i=0;i<6;i++){
    digit[i]=colors[Math.round(Math.random()*14)]
    color = color+digit[i]
    }
    document.getElementById('hexc').style.backgroundCo lor=color
    document.getElementById('hexn').innerText="#"+color
    }
    //-->
    </script>

    Собственно подборка говнокодов))хД тоже с форума моего форум недавно закрыл так как стало не перспективно делать мануалы по lineage 2 шяс работаем над aion (Сборки и т.д) ну точнее собираемся работать))

    andrei199614, 04 Октября 2011

    Комментарии (20)
  8. C++ / Говнокод #8083

    +163

    1. 1
    2. 2
    3. 3
    4. 4
    if ((intPas1Sel == 1) && (intMode11+intMode12    > 0)) { tgt [tgtNum].c1=tgtCode [prTgt [j].Num][0]; h2=h2 | 0x800 ; h1=h1 | (s << 12); }
    			if ((intPas2Sel == 1) && (intMode2               > 0)) { tgt [tgtNum].c3=tgtCode [prTgt [j].Num][1]; h2=h2 | 0x1000; h1=h1 | (s << 10); }
    			if ((intPas3ASel== 1) && (intMode3A1+intMode3A2  > 0)) { tgt [tgtNum].c3=tgtCode [prTgt [j].Num][2]; h2=h2 | 0x2000; h1=h1 | (s << 8 ); }
    			if ((intSecOver == 0) && (prTgt [j].unStateIdent > 0)) { tgt [tgtNum].cc=tgtCode [prTgt [j].Num][3]; h2=h2 | 0x8000; h1=h1 | (s << 14); }

    Так форматируют код профессионалы в нашей фирме

    russian_avionics, 04 Октября 2011

    Комментарии (20)
  9. PHP / Говнокод #7906

    +170

    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
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    $email = strip_tags($email);
    $email = str_replace("’", "", $email);
    $email = str_replace("(", "", $email);
    $email = str_replace(")", "", $email);
    $email = str_replace(";", "", $email);
    $email = str_replace(":", "", $email);
    $email = str_replace("<", "", $email);
    $email = str_replace("'", "", $email);
    $email = str_replace("UNION", "", $email);
    $email = str_replace("SELECT", "", $email);
    $email = str_replace("WHERE", "", $email);
    $email = str_replace("LIKE", "", $email);
    $email = str_replace("FROM”", "", $email);
    $email = str_replace("UPDATE", "", $email);
    $email = str_replace("INSERT", "", $email);
    $email = str_replace("ORDER", "", $email);
    $email = str_replace("GROUP", "", $email);
    $email = str_replace("ALTER", "", $email);
    $email = str_replace(" OR ", "", $email);
    $email = str_replace(" or ", "", $email);
    $email = str_replace("=", "", $email);
    
    $email1 = str_replace("’", "", $email1);
    $email1 = str_replace("(", "", $email1);
    $email1 = str_replace(")", "", $email1);
    $email1 = str_replace(";", "", $email1);
    $email1 = str_replace(":", "", $email1);
    $email1 = str_replace("<", "", $email1);
    $email1 = str_replace("'", "", $email1);
    $email1 = str_replace("UNION", "", $email1);
    $email1 = str_replace("SELECT", "", $email1);
    $email1 = str_replace("WHERE", "", $email1);
    $email1 = str_replace("LIKE", "", $email1);
    $email1 = str_replace("FROM”", "", $email1);
    $email1 = str_replace("UPDATE", "", $email1);
    $email1 = str_replace("INSERT", "", $email1);
    $email1 = str_replace("ORDER", "", $email1);
    $email1 = str_replace("GROUP", "", $email1);
    $email1 = str_replace("ALTER", "", $email1);
    $email1 = str_replace(" OR ", "", $email1);
    $email1 = str_replace(" or ", "", $email1);
    $email1 = str_replace("=", "", $email1);
    
    $location = str_replace("’", "", $location);
    $location = str_replace("(", "", $location);
    $location = str_replace(")", "", $location);
    $location = str_replace(";", "", $location);
    $location = str_replace(":", "", $location);
    $location = str_replace("<", "", $location);
    $location = str_replace("'", "", $location);
    $location = str_replace("UNION", "", $location);
    $location = str_replace("SELECT", "", $location);
    $location = str_replace("WHERE", "", $location);
    $location = str_replace("LIKE", "", $location);
    $location = str_replace("FROM”", "", $location);
    $location = str_replace("UPDATE", "", $location);
    $location = str_replace("INSERT", "", $location);
    $location = str_replace("ORDER", "", $location);
    $location = str_replace("GROUP", "", $location);
    $location = str_replace("ALTER", "", $location);
    $location = str_replace(" OR ", "", $location);
    $location = str_replace(" or ", "", $location);
    $location = str_replace("=", "", $location);
    
    $cinsiyet = str_replace("’", "", $cinsiyet);
    $cinsiyet = str_replace("(", "", $cinsiyet);
    $cinsiyet = str_replace(")", "", $cinsiyet);
    $cinsiyet = str_replace(";", "", $cinsiyet);
    $cinsiyet = str_replace(":", "", $cinsiyet);
    $cinsiyet = str_replace("<", "", $cinsiyet);
    $cinsiyet = str_replace("'", "", $cinsiyet);
    $cinsiyet = str_replace("UNION", "", $cinsiyet);
    $cinsiyet = str_replace("SELECT", "", $cinsiyet);
    $cinsiyet = str_replace("WHERE", "", $cinsiyet);
    $cinsiyet = str_replace("LIKE", "", $cinsiyet);
    $cinsiyet = str_replace("FROM”", "", $cinsiyet);
    $cinsiyet = str_replace("UPDATE", "", $cinsiyet);
    $cinsiyet = str_replace("INSERT", "", $cinsiyet);
    $cinsiyet = str_replace("ORDER", "", $cinsiyet);
    $cinsiyet = str_replace("GROUP", "", $cinsiyet);
    $cinsiyet = str_replace("ALTER", "", $cinsiyet);
    $cinsiyet = str_replace(" OR ", "", $cinsiyet);
    $cinsiyet = str_replace(" or ", "", $cinsiyet);
    $cinsiyet = str_replace("=", "", $cinsiyet);

    Большой проект. Часть переменных на турецком. Смесь из php с html. Файлы проекта сохранены в разных кодировках. Mysql конфиги иногда подключаются include'ом, иногда прямо в текущем файле.

    zorbis, 20 Сентября 2011

    Комментарии (20)
  10. PHP / Говнокод #7891

    +165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    <tr>
            <?php if (cmsCountModules("left")) { ?>
               <td><?php cmsModule("left"); ?></td>
            <?php } ?>
           <?php if (cmsCountModules("top")) { ?>
               <td><?php cmsModule("top"); ?></td>
           <?php } ?>    
           <?php if (cmsCountModules("right")) { ?>
               <td><?php cmsModule("right"); ?></td>
           <?php } ?>
         </tr>

    Здравствуй ГК!
    Сегодня я печалюсь про похапэ.

    da4ever, 18 Сентября 2011

    Комментарии (20)
  11. C++ / Говнокод #7890

    +162

    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
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    #ifdef _WIN32
    #define BEGIN_ASM
    #define END_ASM
    #define _DB(a) __asm _emit a
    #define _STR(a) a
    #else
    #define BEGIN_ASM asm (
    #define END_ASM );
    #define _DB(a) ".byte "#a";"
    #define _STR(a) a" \n\t"
    #endif
    
    #define PARAMETERS_ESP_VOID_VOID_VOID BEGIN_ASM _STR(_DB(0x8B) _DB(0x44) _DB(0x24) _DB(0x04)) _STR(_DB(0x8B) _DB(0x54) _DB(0x24) _DB(0x08)) \
     _STR(_DB(0x8B) _DB(0x4C) _DB(0x24) _DB(0x0C)) END_ASM
    #define SAVE_3_PARAMETERS BEGIN_ASM _STR(_DB(0x89) _DB(0x44) _DB(0x24) _DB(0xE4)) _STR(_DB(0x89) _DB(0x54) _DB(0x24) _DB(0xEC)) \
    _STR(_DB(0x89) _DB(0x4C) _DB(0x24) _DB(0xE8)) END_ASM
    #define LOAD_3_PARAMETERS BEGIN_ASM _STR(_DB(0x8B) _DB(0x44) _DB(0x24) _DB(0xE4)) _STR(_DB(0x8B) _DB(0x54) _DB(0x24) _DB(0xEC)) \
    _STR(_DB(0x8B) _DB(0x4C) _DB(0x24) _DB(0xE8)) END_ASM
    
    int rdtc()
    {
      _asm RDTSC
    }
    
    #pragma optimize( "gtp", on )
    #define VECTORP2DADDFPU \
    BEGIN_ASM \
     _STR(_DB(0xD9) _DB(0x00)) \
     _STR(_DB(0xD8) _DB(0x02)) \
     _STR(_DB(0xD9) _DB(0x19)) \
     _STR(_DB(0xD9) _DB(0x40) _DB(0x04)) \
     _STR(_DB(0xD8) _DB(0x42) _DB(0x04)) \
     _STR(_DB(0xD9) _DB(0x59) _DB(0x04)) \
    END_ASM
    
    void __stdcall __VectorP2DAddFPU() {
      VECTORP2DADDFPU;
    }
    
    // для даной функции компилятор сам зделает так чтобы использовались другие регистры процессора в место eax edx ecx и сохранения не понадобится
    #define Vector2DAdd(x,y,z) _asm lea eax,x _asm lea edx,y _asm lea ecx,z _asm call __VectorP2DAddFPU;
    
    void __stdcall _VectorP2DAddFPU(void *,void *,void *) {
    // сохранение в данном случае вызывается в ручную так как сам компилятор этого не зделает что приведет к не предвиденниму результату или к подению
      SAVE_3_PARAMETERS;
      PARAMETERS_ESP_VOID_VOID_VOID;
      VECTORP2DADDFPU;
      LOAD_3_PARAMETERS;
    }

    http://www.gamedev.ru/code/forum/?id=152492#m3

    >стоит ли писать велосипед, реализующий математику подобным образом?

    CPPGovno, 18 Сентября 2011

    Комментарии (20)