[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]

Ответ в тред 3901. [Назад]
 [ Скрыть форму ]
Имя
Не поднимать тред 
Тема
Сообщение
Капча Капча
Пароль
Файл
Вернуться к
  • Публикация сообщения означает согласие с условиями предоставления сервиса
  • В сообщениях можно использовать разметку wakabamark
  • На данной доске отображаются исходные имена файлов!
  • Разрешенные типы файлов: music, vector, image, code, pdf, flash, archive, text, video
  • Тред перестает подниматься после 500 сообщений.
  • Треды с числом ответов более 100 не могут быть удалены.
  • Старые треды перемещаются в архив после 40 страницы.

No.3901 Ответ
Файл: ababas.jpg
Jpg, 70.66 KB, 317×372 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
ababas.jpg
Я тут на C программу написал, которая копирует входной поток в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
http://pastebin.com/xe3kSfyY
Как это сделать без goto ? Что можно улучшить?
>> No.3902 Ответ
Файл: 1272977573048.jpg
Jpg, 63.76 KB, 422×407 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1272977573048.jpg
unwords . words
>> No.3904 Ответ
Файл: 0065-12679929208697.jpg
Jpg, 82.32 KB, 577×560 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
0065-12679929208697.jpg
> goto enter;
=>
> putchar (c); continue;
На си же можно так?
>> No.3905 Ответ
Файл: Снимок.PNG
Png, 190.07 KB, 393×433 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Снимок.PNG
Ну хоть открой k&r ради приличия.
>> No.3906 Ответ
Файл: afg.bmp
Bmp, 14.26 KB, 852×57 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
afg.bmp
>>3904
Да, можно. Немного сократил
http://pastebin.com/t8cSdBhg
Кстати, как в C можно выйти без goto из множества вложенных циклов?
> Ну хоть открой k&r ради приличия.
Он у меня открыт. Я из него упражнение делаю. Решил изучить C
>> No.3907 Ответ
>>3906
> Кстати, как в C можно выйти без goto из множества вложенных циклов?
Никак.

>>3902
Ты соснул, кстати. Прочитай условие внимательно.
>> No.3908 Ответ
>>3907
> Ты соснул, кстати. Прочитай условие внимательно.
Если имелось ввиду, что нужно заменить два или более пробелов на один, тогда так:

   #include <stdio.h>
   #include <stdlib.h>
   main ()
   {
int c, sp;
sp = 0;
while ((c = getchar()) != EOF)
{
   if (c == ' ')
   {
      putchar(c);
      while ((c = getchar()) == ' ')
         ;
   }
   putchar (c);
}
   }
>> No.3909 Ответ
>>3908
Нет же (я тоже сначала так подумал). Если в строчке есть что-то кроме пробелов или строка пустая, то оставить ее как есть, иначе вывести вместо нее " \n".
>> No.3910 Ответ
В оригинале: Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank.

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

Так что именно нужно было сделать?
>> No.3911 Ответ
>>3910
> each string
Да, похоже имелось в виду просто удаление дублирующих пробелов. Иначе было бы написано line, а не string.


Но это не важно. В коде у тебя все равно лапша жуткая. Избавься хотя бы от exit() чтоли.
>> No.3912 Ответ
>>3911
> В коде у тебя все равно лапша жуткая. Избавься хотя бы от exit() чтоли.
А что плохого в exit() ? Покажи свое решение, чтобы без лапши
>> No.3916 Ответ
getContents >>= putStr . unlines . filter ( not . all isSpace ) . lines
Адова выразительность, например.
>> No.3917 Ответ
Файл: t.c
C, 1.59 KB, 61 строк - Нажмите на картинку, чтобы скачать файл
view edit
t.c
>>3916
> Адова выразительность, например.
И как обычно, делает не то, что просили, например. 1) логика не та 2) в варианте на сишечке не используется дополнительная память.

>>3912
exit плох тем, что прибивает весь процесс. Обычно это не то, что хочется.
Вот тебе два варианта: первый как ты хотел, второй так же, но с дополнительным буфером. Осло, я немножко экономил там :3

Пинайте.
>> No.3922 Ответ
Файл: 1236944911495.jpg
Jpg, 70.30 KB, 395×395
Ваши настройки цензуры запрещают этот файл.
unrated
>>3920
> Да-да
Твоя программа делает не то, что нужно. Что "да-да"?
> пикрелейд
У тебя отличный пикрелейтед, показательный очень. Как пиздеть на форумах так у вас всё красиво, полный компрехеншн и ленивота. А когда доходит до дела, то начинается ручной анбоксинг, mallocBytes и сплошные бангпаттерны.
aij (I# i) (I# j) = D# (
    case i +# j of
        n -> 1.0## /## int2Double#
        	(((n *# (n+#1#)) `uncheckedIShiftRA#` 1#) +# (i +# 1#)))
> Хуясебе!!1
Вариант с гетлайном в три раза короче. Перепиши свой поделие на гетчар и путчар, потом будешь рассказывать про лаконичность. Но для начала таки реализуй правильную логику.
>> No.3923 Ответ
>>3920
Убежал блеать =(
>> No.3924 Ответ
А на си нельзя выходить из глубоких циклов как на пхп?
while(true) // 2й
{
while(true) // 1й
{
    break(2); // выходим из 2го цикла
}
}
echo 'Вышли из цикла';
Алсо, можно извратится, и выходить из глубоких циклов выбрасыванием эксепшена. Но вообще, глубокие и сложные циклы лучше просто не строить
>> No.3925 Ответ
>>3924
В си есть неведомая ебаная хуйня под названием setjmp/longjmp.
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>

int main() 
{
        jmp_buf buf;
        if (!setjmp(buf))
                for (int i = 0; i < 10; i++)
                        for (int j = 0; j < 10; j++) {
                                printf("(i,j) = (%d,%d)\n", i, j);
                                if (10 * i + j == 42)
                                        longjmp(buf, 1);
                        }
        else
                puts("voila!");

        /* rest of the program */
        return 0;
}
>> No.3934 Ответ
>>3917
> Пинайте.
2)
Для getline нужно #define GNUSOURCE в начале
И поясни логику работы этого getline, что он делает?

И еще надо компилировать с опцией -std=c99
Потому что ты зачем-то записал в циклах объявление переменных int allspaces = 0; и sizet i = 0;
Переменные можно объявить раньше, а в циклах просто написать all_spaces = 0; и i = 0; соответственно.
>> No.3936 Ответ
>>3934
> И поясни логику работы этого getline, что он делает?
Ты знаешь, что надо задефайнить и не знаешь, что делает гетлайн?
> Потому что ты зачем-то
Потому что это удобно. Можно написать --std=gnu99 и убить еще и гетлайн-зайца.
>> No.3937 Ответ
>>3917
> Пинайте.
2)
Для getline нужно #define _GNU_SOURCE в начале
И поясни логику работы этого getline, что он делает?

И еще надо компилировать с опцией -std=c99 Потому что ты зачем-то записал в циклах объявление переменных int all_spaces = 0; и size_t i = 0; Переменные можно объявить раньше, а в циклах просто написать all_spaces = 0; и i = 0; соответственно.
>> No.3940 Ответ
Файл: primemy2.c
C, 1.52 KB, 52 строк - Нажмите на картинку, чтобы скачать файл
view edit
primemy2.c
> Ты знаешь, что надо задефайнить и не знаешь, что делает гетлайн?
Я только учусь.
Я тут еше программу пишу, которая выводит числа кратные простым числам, которые меньше чем sqrt(100), простые числа до 100 и количество простых делителей для составных чисел до 100. Только последняя часть как-то неправильно работает. Что там не так?
ОП
>> No.3943 Ответ
Файл: primemy2.c
C, 1.87 KB, 56 строк - Нажмите на картинку, чтобы скачать файл
view edit
primemy2.c
>>3940
Самофикс. Что можно сделать лучше?
>> No.3945 Ответ
Файл: primemy6.c
C, 1.89 KB, 57 строк - Нажмите на картинку, чтобы скачать файл
view edit
primemy6.c
Еще раз самофикс
У меня хорошо получается?
>> No.3946 Ответ
Файл: primemy6.c
C, 1.79 KB, 56 строк - Нажмите на картинку, чтобы скачать файл
view edit
primemy6.c
Финальная версия
>> No.3949 Ответ
Файл: primemy6.c
C, 1.89 KB, 57 строк - Нажмите на картинку, чтобы скачать файл
view edit
primemy6.c
Еще небольшое улучшение
>> No.3951 Ответ
>>3925
> setjmp/longjmp
сам ебанутый это ладно, но ненадо детей плохому учить.
>> No.3959 Ответ
Файл: wiggins.jpg
Jpg, 61.05 KB, 802×984 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
wiggins.jpg
>>3940
> Я только учусь.
Ну так в ман слазий же. Олсо есть стандартная fgets(), но она еще более кучеряво работает.

>>3949
Читал только последний вариант. Я так понимаю ошибку ты исправил?
> Как можно сделать, чтобы нумерация массива начиналась не с нуля?
Никак, потому что нумерация массива напрямую связана с адресной арифметикой и arr[count] это всего лишь *(arr+count), можно даже написать наоборот count[arr] все равно проканает.
> Что можно сделать лучше?
Распили свою портянку на несколько функций.
Избавься от дефайнов.
В качестве упражнения попробуй сделать отдельный тип sieve и функции для работы с ним sieve sieve_create(int), void sieve_free(sieve), int sieve_get(sieve, int) и void sieve_set(sieve, int, int).
А то свалил все в одну кучу, читать не возможно.
> /*Заполняем нулями
> /*Увеличивает на единицу
> /*Печатаем все
Пик стронгли рилейтед.
>> No.3960 Ответ
>>3959
Или даже лучше так, для обработки ошибок: int sieve_get(sieve, int, int*), int sieve_set(sieve, int, int)
>> No.3963 Ответ
Файл: ulam_spiral2.c
C, 3.56 KB, 130 строк - Нажмите на картинку, чтобы скачать файл
view edit
ulam_spiral2.c
>>3959
> Читал только последний вариант. Я так понимаю ошибку ты исправил?
Да.
> Распили свою портянку на несколько функций.
> Избавься от дефайнов.
Это не проблема
> В качестве упражнения попробуй сделать отдельный тип sieve и функции для работы с ним sieve sievecreate(int), void sievefree(sieve), int sieveget(sieve, int) и void sieveset(sieve, int, int).
И что этот тип должен делать?

Кстати, я тут еще написал скатерть Улама через Xlib
>> No.3964 Ответ
Файл: 1279492321649.png
Png, 1.01 KB, 200×20 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1279492321649.png
В слове RIGHT ошибся. Ну ничего
>> No.3965 Ответ
>>3963
> Это не проблема
До поры до времени. man структурное программирование
> И что этот тип должен делать?
Скрывать детали реализации.
> Xlib
bawwwwwww.jpg

Я хлиб толком не знаю, поэтому без подробностей, но ты же в курсе, что ты все там делаешь не так? Программа падает с фатал еррор и съедает весь процессор, перерисовывая картинку безо всякой нужды.
>> No.3967 Ответ
Файл: 1235919642628.jpg
Jpg, 47.17 KB, 443×600
Ваши настройки цензуры запрещают этот файл.
unrated
>>3965
> man структурное программирование
$ man структурное программирование
man: no entry for структурное in the manual.
man: no entry for программирование in the manual.
Похоже, каких-то пакетов не хватает.
>> No.3968 Ответ
Файл: goto_292_rus__.png
Png, 25.38 KB, 740×201 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
goto_292_rus__.png
>> No.3969 Ответ
Файл: ulam_spiral4.c
C, 3.91 KB, 141 строк - Нажмите на картинку, чтобы скачать файл
view edit
ulam_spiral4.c
>>3965
> bawwwwwww.jpg
А чем еще можно так легко рисовать точки
> Программа падает с фатал еррор и съедает весь процессор, перерисовывая картинку безо всякой нужды.
Поправил
>> No.3973 Ответ
>>3969
> А чем еще можно так легко рисовать точки
GDK? Cairo?

>>3967
От рута надо пускать же.
>> No.3974 Ответ
>>3973
> От рута надо пускать же.
То же самое пишет.
>> No.3982 Ответ
>>3973
> GDK? Cairo?
А что можете сказать про wxWidgets?
>> No.3983 Ответ
>>3982
> можете
Ты мне тут не выкай, дядя.
> А что можете сказать про wxWidgets?
Если ты оп, то у него нету сишного апи.
>> No.3984 Ответ
Файл: ulam_spiral5.c
C, 3.59 KB, 156 строк - Нажмите на картинку, чтобы скачать файл
view edit
ulam_spiral5.c
>>3983
> Ты мне тут не выкай, дядя.
Дык я может не только у тебя спрашиваю.
> у него нету сишного апи.
C++ и С вроде как очень похожи.
Вот кстати вынес шаг спирали в отдельную процедуру. Или лучше сделать, чтобы туда передавались параметры?
>>3959
> В качестве упражнения попробуй сделать отдельный тип sieve и функции для работы с ним
Что такое функция-процедура я понимаю. А вот отдельный тип это что значит? Предлагаешь создать какой-нибудь long long long int ?
>> No.3985 Ответ
>>3984
> C++ и С вроде как очень похожи.
Ни в коем случае.
> чтобы туда передавались параметры?
Обязательно. Суть в том, чтобы изолировать кусок кода и можно было сказать "вот функция, она делает то-то и то-то в зависимости от этих параметров, а как она это делает, нас не заботит". А от того, что ты вот так вынес кусок кода пользы немного, программа по прежднему плохо структурирована: у тебя овер9к глобальных переменных и два куска кода, которые эти переменные меняют, лапша.
> А вот отдельный тип это что значит?
Про структуры не читал чтоли еще?
Суть токова: тебе нужно манипулировать объектами "решето", решето представляет из себя массив (кусок памяти) известной длины. Логично это дело обединить, для этого надо создать структуру c двумя полями: указателем на память и длиной же. Теперь твое решето можно таскать как единое целое, но для работы с ним по-прежнему придется влезать внутрь структуры. Это плохо по нескольким причинам: (1) можно что-то ненароком сломать и привести тем самым объект в негодность (2) детали реализации по-прежнему размазыны по всей программе. Чтобы избавиться от этого недостатка нужно запилить интерфес для работы с решетом, т.е. функции для создания и удаления объекта одним махом, функции для манипуляции отдельными ячейками.

Теперь когда ты все спрятал, можешь вынести вес код в отдельный модуль, выставив наружу только интерфейс. Предположим, завтра ты пизданешься окончательно и решишь использовать для решета не массив, а список, тогда ты перепишешь только код в своем модуле, а остальная программа останется без изменений и будет работать. Профит же.
>> No.3986 Ответ
>>3985
Ах да, все это называется моджным словом "инкапсуляция", которое ОО-быдло выдает чуть ли не за уникальную фичу ООП.
В сишечке известно также как opaque type/pointer/structure.
>> No.3987 Ответ
>>3986
> «инкапсуляция», которое ОО-быдло выдает чуть ли не за уникальную фичу ООП.
Я жду кулстори о том, как ты инкапсулируешь без классов в своём ФП.
>> No.3988 Ответ
>>3987
А вот и ОО-быдло подтянулось. Причем здесь ФП вообще?
>> No.3989 Ответ
>>3988
ОК, не ООП и не ФП. Тогда что?
>> No.3990 Ответ
>>3989
Да где угодно. Это не фича языка или "парадигмы", это общий принцип. Я только что объяснил как это делается в сишечке.
>> No.3991 Ответ
>>3990
Ты объяснил как сделаать одельную структуру и функции для работы с ней, но кто мне запретит напрямую обращаться к этой структуре? Также ты упомянул opaque type/pointer/structure. Ну хорошо, в функции передаётся указатель на структуру. Кто мне запретит разыменовать его и всё сломать? Это же хуита, а не инкапсуляция. Этакий ФП-костыль, позволяющий получить то, что в ООП работает из коробки, причём работает гораздо лучше.
>> No.3993 Ответ
>>3991
Чтобы разыменовать и сломать тебе нужно иметь полное объявление структуры, которое тебе никто не предоставит в публичном хедере, без него конпелятор даст тебе по рукам. Можно, конечно, скопипасть и сломать, можно залезть в сырую память на свой страх и тоже сломать (кстати, то же можно сделать и в объекто-ориентированных говноплюсах. сюрприз?). Это называется ССЗБ. Суть не в том, чтобы сделать защиту от дурака, а в том, чтобы правильно организовать код.

Кстати, вспомните всеми любимый и объектно-ориентированный пейтон, в котором "приватные" члены нихуя не приватные и ничего, никто пока не умер.
>> No.3994 Ответ
>>3993
> Кстати, вспомните всеми любимый и объектно-ориентированный пейтон, в котором "приватные" члены нихуя не приватные и ничего, никто пока не умер.
С одной стороны. А с другой, если взять какой-нибудь язык с приличной системой модулей, например SML (ололо, ФП), то можно добиться полного сокрытия.
Делай раз:
signature YOBA =
sig
    type yoba
    val newI: yoba
    val newS: yoba
    val yobafun: yoba -> int
end

structure Yoba :> YOBA =
struct

datatype yoba =
         Yoba1 of int
       | Yoba2 of string

fun yobafun (Yoba1 i) = i
  | yobafun (Yoba2 s) = size s

val newI = Yoba1 42

val newS = Yoba2 "fourtytwo"
end
Делай джва:
- val x = Yoba.newS;
val x = - : Yoba.yoba
- val y = Yoba.newI;
val y = - : Yoba.yoba
- Yoba.yobafun x;
val it = 9 : int
- Yoba.yobafun y;
val it = 42 : int
fuckyeah.jpg
>> No.3995 Ответ
Инкапсулировать в ФП можно замыканиями же!

А вот как замутить полифорфизм в Си, например?
>> No.3997 Ответ
>>3995
> полифорфизм
Который из них?
Посмотри на gobject как вариант.
>> No.4003 Ответ
>>3995

Без костылей не ообйтись. Примерно так
enum ptype {pint,pstr,pch};
typedef struct {
   ptype tag;
   union {
      char c;
      int i;
      char * s;
   } v;
} pval;
  
pval somefun(pval a, pval b) {
  ...
}
>> No.4018 Ответ
>>3985
> > чтобы туда передавались параметры?
> Обязательно. Суть в том, чтобы изолировать кусок кода и можно было сказать "вот функция, она делает то-то и то-то в зависимости от этих параметров, а как она это делает, нас не заботит".
Ну хорошо, у меня есть кусок кода который изменяет переменную x или y в зависимости от значения переменных x и y т.е. делает шаг спирали. Я в http://dobrochan.ru/src/c/1007/ulam_spiral5.c его вынес в функцию spiralstep, которая работает с глобальными переменными. Допустим, я буду передавать в эту функцию значение переменных x и y, но как мне заставить эту функцию измениять значение х или y? В Си нет передачи аргументов по ссылке, вызываемая функция не может модифицировать переменные в вызывающей функции. Через return я могу вернуть только одно значение. Или нет?
> Суть токова: тебе нужно манипулировать объектами "решето", решето представляет из себя массив (кусок памяти) известной длины. Логично это дело обединить, для этого надо создать структуру c двумя полями: указателем на память и длиной же.
У меня есть кусок кода, который определенным образом заполняет кусок памяти. Другой кусок кода читает этот кусок памяти и рисует точки по спирали. Так что мне нужно сделать с этим куском памяти? И что мне нужно сделать с куском кода? Могу указателей там наделать, если надо. Что-то я плохо тебя понимаю.
>> No.4019 Ответ
Перейду наверно на C++
Там можно передавать значение по ссылке
ОП
>> No.4020 Ответ
>>4018
> Допустим, я буду передавать в эту функцию значение переменных x и y, но как мне заставить эту функцию измениять значение х или y?
Передавай указатель.
> Или нет?
Да. Поэтому часто возвращаемое значение используется для сигнализации об ошибках, а если нужно вернуть какую-то величину, то передают ее адрес и меняют значение по этому адресу.
> Другой кусок кода читает этот кусок памяти и рисует точки по спирали.
Вот тут ошибка. Код, который рисует, не должен ничего знать про память, ему нужно всего лишь знать является ли очередное число простым.
> Так что мне нужно сделать с этим куском памяти?
Спрятать.
> И что мне нужно сделать с куском кода?
Постараться сделать его чистой функцией.
> Что-то я плохо тебя понимаю.
Похоже. Тебе надо, во-первых, внимательней читать k&r (как случилось, что ты про указатели забыл?), а, во-вторых, почитать что-нибудь про организацию программ, это будет лучше, чем читать мои посты.
>>4019
> Перейду наверно на C++
Твоя "проблема" решается расстановкой амперсандов и звездочек в существующей программе, и ты собрался переходить из-за этого на говноплюсы?
>> No.4037 Ответ
Файл: ulam_spiral7.c
C, 3.72 KB, 163 строк - Нажмите на картинку, чтобы скачать файл
view edit
ulam_spiral7.c
>>4020
Так нормально?
>> No.4039 Ответ
>>4037
1) зойчем ты понаставил везде ..f?
2) в switch обычно все варианты перечисляют явно, а default: оставляют на случай неведомой ебаной хуйни.
3)
if (arrf[countf] == 1) return 1;
return 0;
Фейспалмота. Зачем нужен иф и два ретёрна? Что будет, если countf окажется больше (END+1)?
4) Кстати, ты в курсе, что в этой задаче твое решето занимает в восемь раз больше памяти, чем необходимо?
5) ну и по мелочам еще корявостей всяких довольно много.
>> No.4040 Ответ
Файл: 123.bmp
Bmp, 0.84 KB, 145×144 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
123.bmp
>>4039
> 1) зойчем ты понаставил везде ..f?
Это типа переменная, которая в fункции
> 2) в switch обычно все варианты перечисляют явно, а default: оставляют на случай неведомой ебаной хуйни.
Там не может произойти неведомой ебаной хуйни. Зачем делать лишние проверки?
> Фейспалмота. Зачем нужен иф и два ретёрна?
А как?
> Что будет, если countf окажется больше (END+1)?
Не окажется. Потому что while (count != END)
> 4) Кстати, ты в курсе, что в этой задаче твое решето занимает в восемь раз больше памяти, чем необходимо?
Помечать простые числа через биты? Тогда потеряется гибкость. Я не смогу легко переделать свою программу, чтобы она рисовала точки на числах, у которых есть только один простой делитель, например.
> 5) ну и по мелочам еще корявостей всяких довольно много.
Ругай дальше, если что
>> No.4041 Ответ
>>4040
> Это типа переменная, которая в fункции
Не имеет смысла. Область видимости определяется лексически.
> А как?
return arr[countf] == 1; если уж на то пошло.
> Там не может произойти
> Не окажется.
Может и окажется. Рано или поздно (скорее рано) ты на эти грабли обязательно наступишь.
Если тебе не нравится такое голословное обещание, представь что ты пишешь отдельный модуль для работы со структурой чуть более сложной, чем один кусок памяти. Тогде тебе как автору надо гарантировать, что твой модуль ведет себя хорошо при этом ты не можешь полагаться на добропорядочность того, кто твоим модулем пользуется. Сегфолты и тихая порча данных мусором не являются примерами "хорошего поведения".
> Помечать простые числа через биты? Тогда потеряется гибкость.
Да. Я почему-то подумал, что тут ты проверяешь только на простоту. Все нормально тогда.
> Ругай дальше, если что
Пиши следущую программу и попутно читай книжки, дальше будет лучше. Одну программулину можно мусолить до бесконечности.
>> No.4042 Ответ
Файл: 0031-125233334731493.jpg
Jpg, 58.33 KB, 440×500 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
0031-125233334731493.jpg
>>4041
> return arr[countf] == 1;
Поясню бородатого - сравнение возвращает результат сравнения
>> No.4043 Ответ
Файл: 0029-1231499314472.jpg
Jpg, 19.89 KB, 560×340 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
0029-1231499314472.jpg
>>4042
ой, сажа
>> No.4044 Ответ
Файл: 125736120439981.jpg
Jpg, 14.64 KB, 200×200
Ваши настройки цензуры запрещают этот файл.
unrated
>>4042
>>4043
У меня появился персональный капитан-саженосец.
>> No.4045 Ответ
Файл: 12776.jpg
Jpg, 5.17 KB, 166×200 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
12776.jpg
>>4044
Рада стараться
>> No.4046 Ответ
Файл: 00064a15.jpg
Jpg, 171.78 KB, 800×713
Ваши настройки цензуры запрещают этот файл.
unrated
>>4045
> Рада
>> No.4047 Ответ
Файл: 30682.jpeg
Jpeg, 18.14 KB, 162×350 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
30682.jpeg
>>4046
Ханюша же
>> No.4048 Ответ
Файл: 1264782183926.png
Png, 11.18 KB, 190×224 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1264782183926.png
>>4047
В сортах шлбогинь не разбираюсь, на первых двух пикчах вроде разные, вот я и понадумал уже всякого.
>> No.4049 Ответ
Файл: Ханю19.jpg
Jpg, 9.68 KB, 104×150 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Ханю19.jpg
>> No.4068 Ответ
Файл: pointmove.c
C, 2.01 KB, 81 строк - Нажмите на картинку, чтобы скачать файл
view edit
pointmove.c
Пока что просто бегающий пиксель на экране. Потом будет змейка, пожирающая другие пиксели
Управление: ← → ↑ ↓
>> No.4103 Ответ
Файл: snakemove.c
C, 3.67 KB, 157 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove.c
Теперь уже есть змейка. Буду доделывать
>> No.4104 Ответ
Файл: snakemove.c
C, 4.00 KB, 145 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove.c
Как исправить белый пиксель в начале движения?
>> No.4105 Ответ
Файл: snakemove2.c
C, 4.04 KB, 148 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove2.c
>>4104 пофиксил
>> No.4113 Ответ
Файл: snakemove2.c
C, 5.20 KB, 168 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove2.c
теперь змея не может переходить через саму себя
и голова красного цвета
>> No.4114 Ответ
>>4113
// Что значит -> ?
разыменование и взятие элемента структуры же.
struct E_str {
  int first;
  char second;
};
...
struct E_str* e;
/* Можно так */
int one = (*e).first;
/* или со стрелкой*/
one = e->first;
>> No.4115 Ответ
Файл: 1260818123.jpeg
Jpeg, 50.16 KB, 439×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1260818123.jpeg
>>4114
Это можно и в книжке прочитать. Лучше бы ты пнул его за функцию с восемью параметрами и 113, 114,...
>> No.4116 Ответ
>>4115
> функцию с восемью параметрами
Билли одобряет, здесь вообще 11: http://msdn.microsoft.com/en-us/library/ms632679%28VS.85%29.aspx
Впрочем, для функции, которая вызывается всего один раз для каждого окна, это не так много, правда? ;-)
>> No.4117 Ответ
>>4115
> функцию с восемью параметрами
А как надо? Глобальных переменных наделать?
> и 113, 114,...
Я ж написал в комментариях, что они значат. Если запустить xev и понажимать ← → ↑ ↓ то будут эти цифры
>> No.4118 Ответ
>>4117
> А как надо? Глобальных переменных наделать?
Как на счёт структур?
>> No.4119 Ответ
>>4117
> А как надо? Глобальных переменных наделать?
Надо научиться структурировать свои программы. Объяснять тебе, похоже, бестолку. Читай маныкнижки, они рулез.
> Я ж написал в комментариях
Завтра выйдет новая версия иксов, в которой числа другие. Будешь прочесывать все свои программы в поисках комментариев?
>> No.4120 Ответ
>>4119
> книжки
Какие посоветуешь?
> Завтра выйдет новая версия иксов, в которой числа другие.
После чего нужно будет перепиливать весь софт, который использует захват событий с клавиатуры т.к. потеря обратной совместимости. Не будет такого. А вообще да, надо через дефайны сделать
>> No.4122 Ответ
>>4120
> Какие посоветуешь?
Форсят тут какой-то талмуд с незатейливым названием how to design programs. Я не читал, но, судя по оглавлению, это то, что тебе нужно. http://htdp.org/
> После чего нужно будет перепиливать весь софт
Нет :3

Олсо, ты, кажется, опять все делаешь не так. Тебе нужны не кейкоды, а keysym'ы. Енжой йор икслиб.
>> No.4517 Ответ
Файл: cpp-dummies.jpg
Jpg, 29.09 KB, 341×500 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
cpp-dummies.jpg
Бамп. Буду дальше программировать, а то я это дело как-то забросил, все равно у меня нет личной жизни. Посоветуйте IDE под линукс. И еще скажите, чем так плох C++ ?
ОП
>> No.4519 Ответ
Файл: 1225905084202.jpg
Jpg, 104.07 KB, 450×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1225905084202.jpg
>>4517
'Eclipse'/'NetBeans'/'IDE не нужна'.
Выбирай любую.
В C++ не так уж плох. Просто это самый мейнстримовый язык.
В итоге ты можешь встретить "специалиста", с которым может состояться след. диалог:
Ты: А в этом слове у меня в первом бите хранится xxx, а в пятом -- yyy. И тебе нужно всего лишь...
Он (раздражённо, затем гордо): Что?! Какие биты? Я программист на языке высокого уровня С++!
C++ преподносится как развитие C (C все считают устаревшим), а ООП -- как новейшая и лучшая парадигма.
О существовании других парадигм и о том, что ООП может являться неподходящей парадигмой для решения некоторого класса задач, как-то умалчивается.
Да, в свое время язык среднего уровня C позволил программистам не копаться в ассемблерном коде, но получать достаточно быстрые и переносимые программы. С++ добавил много запутанного и иногда не нужного функционала.
В учебниках по С++ обычно нигде не применяется термин "передача сообщений", неправильно трактуется инкапсуляция (как запрет на доступ к данным). На деле инкапсуляция подразумевает ограничение доступа к членам класса типа ReadOnly, WriteOnly, ReadAndWrite. В C++ это реализовать прозрачно не получится, прийдётся писать функции типа geti(), seti().
Плохо, что базовые типы сами по себе не являются классами, что заставляет использовать шаблоны для реализации STL, а не передачу параметров как обычных объектов.
Этот язык имеет достаточно подводных камней и эмпирических правил (вроде "Если класс будет наследоваться и наследники или наследники более глубокого уровня будут определять деструкторы, то деструктор базового класса должен быть виртуальным), следование которым необходимо, но компилятор не запрещает им не следовать. C++ позволяет программисту писать ужасный код, мешать высокий, средний и низкий уровень.
>> No.4520 Ответ
>>4517
> Посоветуйте IDE под линукс.
kdevelop

>>4519
доброчую
>> No.4521 Ответ
Файл: плачет1.jpg
Jpg, 262.49 KB, 815×831 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
плачет1.jpg
>>4517
Это ж надо умудриться было столько вбросов зделать в трех предложениях.
>> No.4522 Ответ
Файл: 1244922904307.jpg
Jpg, 30.85 KB, 368×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1244922904307.jpg
>>4521
Поделись паком, пожалуйста!
>> No.4523 Ответ
Файл: 1255921793744.jpg
Jpg, 114.15 KB, 500×500 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1255921793744.jpg
>>4522
А это не пак, это рандомные пикчи. Причем все вроде бы с боброчана.
>> No.4524 Ответ
>>4523
> плачет1.jpg
Хм, значит, это просто не твой пак.
>> No.4566 Ответ
Файл: snakemove3.c
C, 5.28 KB, 181 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove3.c
>> No.4567 Ответ
Буду выносить повторяющиеся куски кода в функции. Или так делать не надо?
Давайте я буду выполнять какие-нибудь реквесты, например. Змея уже надоела
>> No.4569 Ответ
>>4567
> Буду выносить повторяющиеся куски кода в функции.
В функции выноси отдельные действия. Например что бы не писать всегда
writeln "object " + object->name + " move";
object->move;
можно писать
void move(object object)
{
writeln "object " + object->name + " move";
object->move;
}

move(object);
>> No.4571 Ответ
>>4569
Насколько элементарные действия нужно делать функцией? На какие куски мне его лучше делить?
>> No.4572 Ответ
>>4571
Меньше двух строчек, думаю, смысла нет. А делить лучше по смыслу.
>> No.4573 Ответ
>>4572
> А делить лучше по смыслу
Вот и я о том же. Функция должна что-то делать, причём это что-то должно быть отдельным осмысленным действием-блоком, а не просто содержать повторяющиеся части кода
>>4569-кун
>> No.4579 Ответ
Файл: snakemove5.c
C, 5.91 KB, 205 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove5.c
Так нормально?
>> No.4584 Ответ
Файл: snakemove5.c
C, 5.83 KB, 208 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemove5.c
Еще вынес небольшую часть кода в функцию. То, что я использую inline функции, это хорошо или плохо?
>> No.4585 Ответ
И еще такой нубский вопрос. Зачем нужны не-inline функции, если все можно делать в inline
>> No.4587 Ответ
>>4585
Немного почитал. Насколько я понял, не-inline функции работают как безусловный переход с передачей указаных значений, inline функции работают просто как вставка этого куска кода. Я прав?
>> No.4589 Ответ
емнип, inline-функции могут вставляться куском кода в место вызова, а могут и не вставляться, на усмотрение компилятора в каждом случае. а вот это точно: inline-функции не могут рекурсиво вызываться.
>> No.4592 Ответ
>>4585 >>4589

а ещё, гипотетически, компилятор может неожиданно развернуть какой-нибудь небольшой цикл, в котором "натурально" используются inline-функции. и на выходе мы получим добрую кучу машинного кода. возможно, он даже будет работать быстрее, чем просто цикл с просто вызовами функции, но как-то это всё кровавыми вилами писано.
зачем нужны обычные, неинлайн функции?. ну, когда-то было принято считать, что под сегмент кода отводится ограниченное количество памяти, плюс, можно было и указатели поменьше использовать... но это предание старины глубокой :)
>> No.4594 Ответ
>>4579
>>4584
А зачем ты возвращаешь char, а потом его не используешь? Используй void тогда.
Да, и неплохо бы поиграться со свитчем, в нем делаются одинаковые штуки.
>> No.4595 Ответ
>>4594
> А зачем ты возвращаешь char, а потом его не используешь? Используй void тогда.
Спасибо, заменил
> Да, и неплохо бы поиграться со свитчем, в нем делаются одинаковые штуки
Тоже над этим думал. Что там можно поменять? Разве что поставиь перед свитчем условие, есть ли нажатие на одну из кнопок ← → ↑ ↓
Если есть, делаются одинаковые штуки, потом идет свитч
>> No.4599 Ответ
>>4579

если и выносить что-то в отдельную функцию, то это реакцию на нажатие клавиш. фактически у тебя четыре раза написан один и тот же немного отличающийся код (который после CASE LEFT, CASE RIGHT и т.д.). а если тебе придется ввести/исправить что-нибудь? будешь исправлять/вводить в четырех местах? имхо, здесь неплохо бы сделать отдельную функцию, в которую будет передаваться направление, что-нибудь вроде ChangeDirection(int dirx, int diry,...). тогда кейс превратится в что-то вроде:
CASE LEFT: ChangeDirection(-1, 0,...); break;
CASE RIGHT: ChangeDirection(1, 0,...); break;
и т.д.
тогда в теле функции будет что-то вроде: (x)+=dirx;(y)+=diry;
придется делать общую проверку на выход за границы, но на эту жертву можно пойти.

хех. когда-то я писал подобную программку, только моя змейка по гексогональному полю ползала :)
>> No.4656 Ответ
>>3906
Растолкать пачку циклов по функциям и использовать return.
>> No.4657 Ответ
>>3949
За строки типа #define END_2 END >> 1 у нас в лаборатории сразу лейкой по морде бьют.
Заменить на #define END_2 (END >> 1)
>> No.4658 Ответ
>>4592
Если писать под контроллер, у которого 2 (два) килобайта памяти на код, все твои предания резко становятся суровой реальностью.
>> No.4703 Ответ
Файл: snakemoveN1.c
C, 4.36 KB, 182 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN1.c
Отчего тут ошибки?
>> No.4704 Ответ
>>4703
> #include
>> No.4705 Ответ
>>4704
И что с ним не так?
>> No.4706 Ответ
Файл: snakemoveN1.c
C, 4.30 KB, 174 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN1.c
Так вроде работает
Однако, я совершенно не понимаю, почему компилятор ругается на
switch (e->keycode)
{
    case UP:
        Ynw-- = (y[0]); 
        Xnw = (x[0]);
.....


А на
 switch (e->keycode)
{
    case UP:
        Ynw = (y[0]-1); 
        Xnw = (x[0]);
.....
и на
 switch (e->keycode)
{
    case UP:
        Ynw = (y[0]); 
        Ynw--;
        Xnw = (x[0]);
.....
не ругается
>> No.4707 Ответ
> Ynw-- = (y[0]);
лол
>> No.4708 Ответ
>>4706
Начнем с того, что это разные вещи. В первом случае от Ynw должна сначала отниматься 1, потом присваиваться y[0]. Второй и третий случаи делают Ynw = y[0]-1.
А теперь смотрим что же такое Ynw. unsigned int Ynw = 0; А теперь посчитай 0 - 1.
>> No.4709 Ответ
Файл: snakemoveN1.c
C, 4.36 KB, 175 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN1.c
Багфикс
Алсо, почитав http://lurkmore.ru/%2B%2Bi_%2B_%2B%2Bi окончательно запутался с этими ++ и --
>> No.4710 Ответ
>>4709
Какой еще гениальный источник знаний приведешь, педивикию?
>> No.4711 Ответ
>>4710
Ну а как распределяется приоритет между этими инкрементами-декрементами? Где об этом есть достоверная инфа?
>> No.4713 Ответ
>>4711
> Где об этом есть достоверная инфа?
достоверная инфа: мутабельность для быдла
>> No.4714 Ответ
>>4711
Зависит от компилятора же.
Кури первоисточник http://gcc.gnu.org/bugs/#known
>> No.4721 Ответ
>>4711 как компилятор скомпилирует, таки будут распределяться.
>> No.4772 Ответ
Файл: snakemoveN3.c
C, 5.50 KB, 205 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN3.c
Осталось только прикрутить случайность координат к пикселю для пожирания и сделать нормальное удлинение змеи. Что бы еще такого сделать?
>> No.4773 Ответ
>>4772
1. Когда я пытаюсь закрыть окно уничтожив его, я получаю только писк. Т.е. нужен выход не только по прерыванию.
2. Мне пришлось править твои дефайны при помощи xev, у меня это совсем другие кнопки, либо я что-то не понимаю.

Хочешь усложнить, можно приделать рандомные бонусы, например, или уровни со стенками, как это было в какой-то змейке из стандартной поставки древней убунты.
>> No.4774 Ответ
>>4773
> можно приделать рандомные бонусы
Для начала пусть попробует сделать свою змею чуть потолще, не один пиксель, а сегментами 4х4 например. кекеке
inline void read_KeyPress (XEvent *eventp, unsigned int *x,
                   unsigned int  *y, unsigned int *mv,
                   char *plusminus, Display *d, Window w,
                   unsigned int s, unsigned int *LENGTH,
                   unsigned int *xrand, unsigned int *yrand)
ох вау!
>> No.4775 Ответ
Файл: snakemoveN3.c
C, 5.58 KB, 205 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN3.c
>>4774
> Для начала пусть попробует сделать свою змею чуть потолще, не один пиксель, а сегментами 4х4 например. кекеке
Это вообще элементарно. Мне бы понять, как убрать разрывы при удлинении змеи. Буду делать алгоритм перетасовки координат отдельных ячеек
>> No.4776 Ответ
можно еще сделать змею с порталами
>> No.4777 Ответ
>>4775
Тебе скачала вот это говно >>4774 из 11 параметров надо разрулить. И функцию из двух строчек выкинуть КЕМ.
>> No.4778 Ответ
>>4775
Лажу в #define в скобки закрыл - молодец!
>> No.4779 Ответ
>>4777
> говно >>4774 из 11 параметров надо разрулить.
Как? Что мне с ним сделать? Завернуть в структуру, и передавать в функцию в таком виде, потом внутри функции разыменовывать его?
>> No.4780 Ответ
Файл: not-impressed-cat-is-not-impressed.jpg
Jpg, 186.52 KB, 500×483 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
not-impressed-cat-is-not-impressed.jpg
>>4775
> Это вообще элементарно
> Это элементарно
> элементарно
--- p1.c	2010-08-29 15:20:29.000000000 +0400
+++ p2.c	2010-08-29 15:20:12.000000000 +0400
@@ -1,10 +1,10 @@
 #include <X11/Xlib.h>
  #include <stdio.h>
  #include <stdlib.h>
- #define LEFT_BORDER 400
- #define DOWN_BORDER 300
- #define x0 200
- #define y0 100
+ #define LEFT_BORDER (200*3)
+ #define DOWN_BORDER (200*3)
+ #define x0 (100*3)
+ #define y0 (100*3)
 
  #define UP 111
  #define DOWN 116
@@ -32,7 +32,7 @@
          unsigned int *x, unsigned int *y)
 {
     XSetForeground(d, DefaultGC(d, s), 0x000000);
-    XDrawPoint(d, w, DefaultGC(d, s), x[0], y[0]); //закрашиваем черным то место, где была голова
+    XDrawRectangle(d, w, DefaultGC(d, s), x[0], y[0], 2, 2); //закрашиваем черным то место, где была голова
 }
 
 
@@ -41,7 +41,7 @@
          unsigned int *x, unsigned int *y, unsigned int mv)
 {
     XSetForeground(d, DefaultGC(d, s), 0xFFFFFF);
-    XDrawPoint(d, w, DefaultGC(d, s), x[mv], y[mv]); //закрашиваем белым то место, где был зад
+    XDrawRectangle(d, w, DefaultGC(d, s), x[mv], y[mv], 2, 2); //закрашиваем белым то место, где был зад
 }
 
 
@@ -58,14 +58,14 @@
          unsigned int *x, unsigned int *y)
 {
     XSetForeground(d, DefaultGC(d, s), 0xFF0000);
-    XDrawPoint(d, w, DefaultGC(d, s), x[0], y[0]); //рисуем красную головку
+    XDrawRectangle(d, w, DefaultGC(d, s), x[0], y[0], 2, 2); //рисуем красную головку
 }
 
 inline void draweatpoint (Display *d, Window w, unsigned int s,
          unsigned int *xrand, unsigned int *yrand)
 {
     XSetForeground(d, DefaultGC(d, s), 0x00FF00);
-    XDrawPoint(d, w, DefaultGC(d, s), *xrand, *yrand); //рисуем точку для пожирания
+    XDrawRectangle(d, w, DefaultGC(d, s), *xrand, *yrand, 2, 2); //рисуем точку для пожирания
 }
 
 inline void read_KeyPress (XEvent *eventp, unsigned int *x,
@@ -79,23 +79,23 @@
     switch (e->keycode)
     {
         case UP:
-            Ynw = y[0]-1;
+            Ynw = y[0]-3;
             Xnw = x[0];
             break;
         case DOWN:
-            Ynw = (y[0]+1);
+            Ynw = (y[0]+3);
             Xnw = x[0];
             break;
         case LEFT:
             Ynw = y[0];
-            Xnw = x[0]-1;
+            Xnw = x[0]-3;
             break;
         case RIGHT:
             Ynw = y[0];
-            Xnw = x[0]+1;
+            Xnw = x[0]+3;
     }
-    if (((Xnw!=x[0]) ^ (Ynw!=y[0])) && ((Xnw) != (LEFT_BORDER-1)) \
-        && ((Ynw) != (DOWN_BORDER-1)) && (selfeat (x, y, Xnw, Ynw, *LENGTH)) \
+    if (((Xnw!=x[0]) ^ (Ynw!=y[0])) && ((Xnw) != (LEFT_BORDER-3)) \
+        && ((Ynw) != (DOWN_BORDER-3)) && (selfeat (x, y, Xnw, Ynw, *LENGTH)) \
         && ((Xnw) != 0) && ((Ynw) != 0) )
     {
         blacktohead (d, w, s, x, y);
@@ -126,9 +126,9 @@
  
 int main(void) 
 {
-    unsigned int xrand=5;
-    unsigned int yrand=5;
-    unsigned int LENGTH = 10;
+    unsigned int xrand=9;
+    unsigned int yrand=9;
+    unsigned int LENGTH = 3;
     unsigned int x[500], y[500];
     Display *d;
     Window w;
@@ -158,7 +158,7 @@
     count = 2;
     do
     {
-        x[count]=1+x0-count;
+        x[count]=3+x0-(count*3);
         y[count]=y0;
         count++;
     }
@@ -173,7 +173,7 @@
     mv=1;
     x[0]=x0;
     y[0]=y0;
-    x[1]=x0-LENGTH+1;
+    x[1]=x0-(LENGTH*3)+3;
     y[1]=y0;
     
                            /* event loop */
@@ -184,13 +184,13 @@
         if (e.type == Expose)
         {
             XSetForeground(d, DefaultGC(d, s), 0xFF0000);
-            XDrawPoint(d, w, DefaultGC(d, s), x[0], y[0]);
+            XDrawRectangle(d, w, DefaultGC(d, s), x[0], y[0], 2, 2);
             count=1;
             XSetForeground(d, DefaultGC(d, s), 0x000000);
             //рисуем змею
             do
             {
-                XDrawPoint(d, w, DefaultGC(d, s), x[count], y[count]);
+                XDrawRectangle(d, w, DefaultGC(d, s), x[count], y[count], 2, 2);
                 count++;
             }
             while (count != (LENGTH));
>> No.4867 Ответ
посоны, я тут от нечего делать многопользовательскую онлайн змейку забацал.
Мырить тут: http://92.55.29.182:8080/gwtSnakeGame-0.1/com.elewise.pg.GWTTest/SnakeGame.html
Исходники: http://subversion.assembla.com/svn/gwtsnakegame/
>> No.4868 Ответ
кстати если нажать на "компьютер", то включиться автопилот
>> No.4869 Ответ
>>4867
> /src/main/resources/com/elewise/pg/public
Сам не устаешь?
>> No.4870 Ответ
>>4869
щито? Вы знакомы с понятием "IDE"?
>> No.4872 Ответ
>>4870
Файлопанель на половину экрана это круто, да.
>> No.4873 Ответ
Файл: gwtSnakeGame.PNG
Png, 132.35 KB, 1278×958 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
gwtSnakeGame.PNG
>> No.4880 Ответ
>>4867
поднимай давай.
>> No.4885 Ответ
>>4880
поднял. Стоит вылизывать эту штуку? Она будет популярна у хомячков?
>> No.4889 Ответ
>>4885
> Она будет популярна у хомячков?
Если допилить до нормального состояния, то возможно. Можно еще прикрутить всяких перделок, вроде порталов, стен и бонусов, дающих способность пожирать других змей например
>> No.5021 Ответ
Файл: snakemoveN3.c
C, 6.93 KB, 255 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN3.c
Сделал перестановку сегментов после пожирания точки.
Как в Си можно сделать случайное число в интервале от A до B?
>> No.5023 Ответ
>>5021
random()*(B-A)+A
>> No.5025 Ответ
>>5023
Это не то, что мне нужно. Оно дает каждый раз одно и то же
>> No.5031 Ответ
>>5025
randomize()
>> No.5032 Ответ
>>5031
> randomize()
$> man 3p randomize
Нет справочного руководства для randomize в разделе 3p
>> No.5033 Ответ
>>5032
ты ленивый мудак, совершенно не нумеешь гуглить
#define randomize() srand((unsigned)time(NULL))
#define random(a, b) rand()*(b-a)+a
>> No.5034 Ответ
>>5033
Сам мудак. Оно выдает числа в совсем другом интервале
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define randomize() srand((unsigned)time(NULL))
#define random(a, b) rand()*(b-a)+a
int main(void) 
{
    unsigned int i;
    for (i = 1; i != 10; i++)
    {
        printf (" %d", random(10, 20));
        randomize();
    }
    return 0;
}
>> No.5035 Ответ
А если так
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define randomize() srand((unsigned)time(NULL))
#define random(a, b) rand()*(b-a)+a
int main(void) 
{
    unsigned int i;
    for (i = 1; i != 200; i++)
    {
        printf (" %d", random(10, 20));
        randomize();
    }
    return 0;
}
То оно вообще выдает одинаковые числа
>> No.5036 Ответ
>>5035
> printf (" %d", random(10, 20));
> randomize();
Ох лол.

man srand
>> No.5037 Ответ
>>5034
#define random(a, b) rand()*(b-a)/RAND_MAX+a
ну и, естественно, рандомайз нужно запускать один раз в начале программы, а уж потом генерить числа.
>> No.5045 Ответ
>>5037
> #define random(a, b) rand()*(b-a)/RAND_MAX+a
Проверяй, прежде чем постить
#define random(a, b) ((rand() % (b - a + 1)) + a)
>> No.5046 Ответ
Файл: snakemoveN3.c
C, 6.86 KB, 249 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN3.c
Вроде, работает
>> No.5081 Ответ
Файл: snakemoveN3.c
C, 6.97 KB, 253 строк - Нажмите на картинку, чтобы скачать файл
view edit
snakemoveN3.c
Небольшой багфикс, добавил возможность менять маштаб
>> No.5104 Ответ
> Я тут на C программу написал, которая копирует входной поток в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
тред не читал
yoba = unlines . map mapLine . lines
  
    where mapLine []                   = []
          mapLine x | all ((==) ' ') x = " "
                    | otherwise        = x
>> No.5106 Ответ
>>5104
Тред не читал.
import re, sys
[print(line) for line in sys.stdin if line else print(" ", end="")]
>> No.5109 Ответ
>>5106
Тред читал.
while(<>){s/ +/ /g;print;}
>> No.5110 Ответ
>>5106
> print
дальше не читал
>> No.5111 Ответ
>>5109
s/^ +$/ /g, pазумеется. Засыпаю уже.
>> No.5475 Ответ
Сделаю пока что-нибудь простенькое
Напишите программу для вывода входного потока по одному слову в строке.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\n' || c == '\t')
        {
            putchar ('\n');
            while (c == ' ' || c == '\n' || c == '\t')
                c = getchar();
        }
        putchar (c);
    }
    return 0;
}
>> No.5481 Ответ
Вот например программа которая должна возвращать код символа, который следует после единиц:
#include <stdio.h>
  
int main(void)
{
    int c;
    do c = getchar(); while (c == '1');
    printf ("char: %d", c);
    return 0;
}
И она вроде бы работает, но есть одно но
Если набрать скажем 111111 потом комбинацию ctrl+d которая дает символ EOF, то программа не завершается. Нужно жать ctrl+d два раза. Почему так? Как заставить реагировать с первого раза?
>> No.5521 Ответ
>>5475
do { line <- getLine; putStr $ unlines . words $ line }
>> No.5522 Ответ
Файл: 1265445013086.jpg
Jpg, 345.28 KB, 635×595 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1265445013086.jpg
>>5521
не делай так больше
  
getLine >>= putStr . unlines . words
>> No.5524 Ответ
а лучше так:
getLine >>= mapM putStrLn . words
>> No.5564 Ответ
Файл: 1_13.c
C, 0.77 KB, 44 строк - Нажмите на картинку, чтобы скачать файл
view edit
1_13.c
Подсчет количества слов различной длинны
С юникодом работает неправильно, потому что юникодные символы могут занимать больше одного байта.
>> No.5565 Ответ
>>5564

Скорее всего не с юникодом (UCS), а с utf-8. И работать utf-8 напрямую мягко говоря не рекомендуется. Нужно сначала сконвертить его в какой-нибудь ucs-32.
>> No.5627 Ответ
Файл: result.txt
Text, 0.22 KB, 20 строк
view edit
result.txt
Файл: some.c
C, 0.13 KB, 9 строк
view edit
some.c
Файл: 1286490304514.png
Png, 0.91 KB, 300×20
edit Find source with google Find source with iqdb
1286490304514.png

>>5564
недавно решил все же выучить си, и начал с книжки K&R, почуял странности с самого начала, простейшие пример (some.c) работал некорректно (result.txt). думал духи завелись, однако почитав
>>5565
на меня снизошло озарение

алсо, сижу на убунте

зачем я это написал? не знаю, решил поделиться
>> No.5675 Ответ
Я тут решил теперь написать консольный тетрис на ncurses
Как получать кейкоды нажатий клавиш ? (через getchar() нехочу, потому что например стрелочки ← → ↑ ↓ и кнопки Shift не дают никаких символов, да и вообще, это тупо как-то)
И как сделать такой сценарий?:
Ждем нажатия клавиши 0.5 сек.
если что-то нажато то
в зависимости от того, что нажато,
    мы или поворачиваем фигуру по или против часовой стрелки
    или немедленно опускаем фигуру вниз,
    или ничего не делаем и продолжам ждать.
Если ничего не нажато в течении 0.5 сек., то просто опускаем фигуру на 1 пункт
Как ожидать нажатие клавиши? Через getchar() я например не знаю, как так можно сделать
>> No.5684 Ответ
Файл: 1286659223031.png
Png, 0.95 KB, 300×20 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1286659223031.png
>>5675
так разве в ncurses нет функции перехвата нажатия клавиши?
>> No.5687 Ответ
>>5684
> так разве в ncurses нет функции перехвата нажатия клавиши?
Я не знаю, мне от ncurses нужно только умение выводить на экран разные символы в разных местах.
Разве функция чтения символа не должна быть независимо от ncurses? Программа showkey разве написана на ncurses?
Кстати, showkey под иксами не работает. Пишет "Не могу получить файловый дескриптор, соответствующий консоли"
И непонятно как сделать ожидание ввода, ну всмысле чтобы оно ждало пол секунды нажатие какой-то клавиши, если нажатия не происходит, опускает фигуру вниз.
>> No.5688 Ответ
>>5687
Да ты же ньюфаг!
Используй механизм select!
>> No.5689 Ответ
>>5688
А где про это можно почитать?
>> No.5690 Ответ
>>5689
Google it!
>> No.5703 Ответ
>>5690
Не нашел ничего, из чего мне было бы понятно, как этот select использовать. Мне нужен какой-то пример кода.
Пока что попробую через halfdelay сделать
>> No.5712 Ответ
Файл: tetr.c
C, 0.86 KB, 53 строк - Нажмите на картинку, чтобы скачать файл
view edit
tetr.c
Пока что только такая заготовка. Надо будет разобраться
>> No.5715 Ответ
>>5712
arr[10]={0,0,0,0,0,0,0,0,0,0};
Зачем ты сначала делаешь это, а потом еще и не используешь?
>> No.5723 Ответ
>>5715
Всему свое время.
>> No.5729 Ответ
Файл: tetr.c
C, 1.07 KB, 66 строк - Нажмите на картинку, чтобы скачать файл
view edit
tetr.c
>>5715
Вот теперь использую
>> No.26677 Ответ
Файл: 200px-The_C_Programming_Language_Book_2th_Ed.jpg
Jpg, 10.03 KB, 200×264 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
200px-The_C_Programming_Language_Book_2th_Ed.jpg
Каким образом на чистом С под GNU/Linux можно сделать функцию которая бы создавала в рантайме функцию и возврашала указатель на нее, чтобы через него эту функцию можно было вызывать.
Например, такая задача: пользователь вводит кучу чисел (например 2 4 5 6 38 1 31 13 15 28) и потом вводит формулу, в которую надо эти числа подставить, например в польской нотации (* (+ x 6) x) и чтобы программа вывела результат вычислений для каждого числа, подставляя само число в этот x. Стековый калькулятор это слишком медленно. Какие компилируемые в машинные инструкциии языки программирования позволяют эффективно решить такого рода задачи?
>> No.26678 Ответ
или например такая задача: есть текст, пользователь вводит регексп, он в рантайме преобразовывается в представление в виде конечного автомата компилируется в функцию.
>> No.26679 Ответ
>>26678
Современные ОС сильно плохо относятся к такому коду. Можно компилировать для видеокарты.
>> No.26682 Ответ
>>26677
LLVM
>> No.26683 Ответ
>>26677
Если хочешь со всеми понтами и понижениями степени - проще всего будет компилировать файлы и подгружать сразу имхо. Менее дешевый вариант - обойтись без elf и подгружать ручками
>> No.26864 Ответ
Допустим, есть массив
char *a = malloc(10);
И его надо забить какими-то байтиками. Это можно делать так
a[0]=2; a[1]=5; a[2]=3; a[3]=8;
итд... Но это неудобно
Как запилить макрос, которым бы можно было заполнять такой массив таким образом:
putarr(a, 2, 5, 3, 8);
?

Или если надо заполнить конкретные места в массиве, например:
a[3]=77; a[6]=55; a[7]=11; a[9]=66;
Чтобы это выглядело так:
putarrplace(a,
               3, 77,
               6, 55,
               7, 11,
               9, 66  );
Сишным препроцессором такое сделать можно? Если нет, чем это можно сделать?
>> No.26865 Ответ
Файл: arrayexperiments.c
C, 0.84 KB, 27 строк - Нажмите на картинку, чтобы скачать файл
view edit
arrayexperiments.c
>>26864
Я вот попытался, но какая-то ерунда получилось. Сишный препроцессор не умеет в рекурсию
>> No.26867 Ответ
>>26865
Ещё бы. Как в сишном макросе выйти из рекурсии если ветвления нет ни в каком виде?
>> No.26876 Ответ
>>26864
define PUTARR(a,b,type,n) type src[n]=b;memcpy(&(a),src,sizeof((b))))

использование PUTARR(a,{2,5,3,8},int,4)
коряво, но все же
>> No.26877 Ответ
>>26876
вместо src *src
>> No.26878 Ответ
>>26876
вместо src &src
>> No.26884 Ответ
Файл: arrayexperiments.c
C, 0.61 KB, 32 строк - Нажмите на картинку, чтобы скачать файл
view edit
arrayexperiments.c
>>26876
Не работает. Оно это {2,5,3,8} распознает как 4 аргумента, не как один.
Я вот пофиксил
#define PUTARR(a,type,...) { type src[]={__VA_ARGS__};memcpy((a),&src,sizeof(src)); }
Работает так
PUTARR(a,int,
            2,5,3,8);
Фигурные скобки там нужны, чтобы ограничить область видимости переменной type src[] иначе этот макрос был бы одноразовым. Можно даже сделать макрос без указания типа, только для этого надо использовать гну расширение http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
Пример в исходнике.

Но вообще это костыли какие-то. Да и не совсем понятно, как можно сделать заполнение конкретных мест в массиве из >>26864 (распарсить этот список аргументов _VAARGS__ никак нельзя через препроцессор?)
Может стоит изучить препроцессор m4 ? Или чем это лучше делать?
>> No.26886 Ответ
Что вы здесь за пиздец развели? Все нормальные компиляторы уже давно умеют так:
#include <stdio.h>
#include <stdlib.h>

int main() {
        int a[] = {1, 28, 55, 6, 27, 24, 2, 82, 14, 83};
        for (int i = 0; i != 10; i++)
                printf("%i ", a[i]);
        printf("\n");
        getchar();
        return 0;
}
Индусы, блджад.
>> No.26887 Ответ
>>26884
на самом деле src надо заменить на src-669AA582-7F8A-4B9A-AAD6-693DF777D3A8 еще, потмоу что инициализацию src эта штука завалит
PS на син не писал лет 5, забыл немного уже

кстати, можешь размятся и запилить отдельную версию для #ifdef DEBUG, потому что она дохера небезопасная
>> No.26889 Ответ
>>26886
А нормальные компиляторы умеют так:
int a[] = {1, 28, 55, 6, 27, 24, 2, 82, 14, 83};
for (int i = 0; i != 10; i++)
        printf("%i ", a[i]);
a* = {6, 28, 222, 33}; //захотелось мне поменять первые четыре элемента массива
for (int i = 0; i != 10; i++)
        printf("%i ", a[i]);
>> No.26897 Ответ
>>26884
Поздновато я в этот тред зашел. Чувак, ты устроил феерию быдлокодинга. Возьми M4 уже.
>> No.26900 Ответ
>>26889
Так пока не умеют, так что пользуй memcpy:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
        int a[] = {1, 28, 55, 6, 27, 24, 2, 82, 14, 83};
        for (int i = 0; i != 10; i++) printf("%i ", a[i]);
        printf("\n");
        int _[] = {6, 28, 222, 33};
        memcpy(a, _, 4 * sizeof(int));
        for (int i = 0; i != 10; i++) printf("%i ", a[i]);
        getchar();
        return 0;
}
Можешь написать отдельную функцию для этого (а с новыми женериками в си11 можно вообще развернуться по полной). Но уж макробыдлокод разводить — это просто зверство.
>> No.26909 Ответ
>>26900
> Так пока не умеют, так что пользуй memcpy:
Ну так в макросе этот memcpy и используется. Создается временный массив и копируется
> Можешь написать отдельную функцию для этого
Функции с переменным числом аргументов не инлайнятся
> Но уж макробыдлокод разводить — это просто зверство.
Чем этот макробыдлокод хуже этого
    int _[] = {6, 28, 222, 33};
    memcpy(a, _, 4 * sizeof(int));
?
>> No.26939 Ответ
>>26909
> Функции с переменным числом аргументов
Не нужны. Нормальные компиляторы умеют в анонимные массивы:
memcpy(a, (int[]){7, 29, 224, 36}, 4 * sizeof(int));
>> No.26977 Ответ
>>26939
это c99 или c11?
>> No.26980 Ответ
>>26977
С -std=c99 у меня компилится и работает, значит ещё с C99.
>> No.27324 Ответ
как узнать максимально допустимый alloca(число) ?
(GCC x86-64 Linux)
>> No.27325 Ответ
>>27324
ХЗ, из того, что нагуглил, все говорят, что это очень зависит от системы, так что пиши тестовую функцию, которая выделяет при каждом вызове всё больше памяти на стеке пока не выскочит сегфолт. Ну, или пользуй массивы переменной длины (не путать с динамическими массивами). Благо, они тоже с C99 есть.
>> No.27334 Ответ
>>27325
> Ну, или пользуй массивы переменной длины
А в чем отличия этих двух строчек?
type a[n];
type *a = alloca( n*sizeof(type) );
>> No.27335 Ответ
>>27334
в первой строчке n приводится к типу const long, во второй к типу long
>> No.27336 Ответ
>>27334
и да, вторую никода в жизни не развернут в times n db 0
>> No.27340 Ответ
Я это к тому, что для массивов переменной длинны тоже непонятно как узнать максимально допустимый размер `type a[число];'
>> No.27341 Ответ
>>27334
В размере и замыле, очевидно же!
>> No.27393 Ответ
>>27334
В первом случае, например, нельзя переопределить указать a. Или можно?
>> No.27394 Ответ
>>27393
s/указать/указатель
>> No.27532 Ответ
Как-нибудь можно не указывать список типов, принимаемых функцией, если функция эта принимается в другой функцией (коллбек). Например такой код:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
  
void my_char_plus(const void *a, const void *b, void *c)
{
    char tmp =  (*(char*)a + *(char*)b);
    memcpy(c,(void*)(&tmp),sizeof(char));
}
  
void operation(const void *funct(const void*,const void*,void*),
                      const void *a, const void *b, void *c )
{
    funct(a,b,c);
}
     
int main(void)
{
    char a, b, c;
    a = 5; b = 7;
    
    void *plus = &my_char_plus;
    operation(plus, (const void*)&a, (const void*)&b, (void*)&c);
    printf("%i\n", c);
    
    return 0;
}
Для случая
 void *plus = &my_char_plus;
писать void (*plus)(blablabla) вроде как необязательно. Но если в
void operation(const void *funct(const void*,const void*,void*),
Убрать эту ерунду (const void,const void,void*), компирятор ругается:
   error: called object ‘funct’ is not a function
>> No.27533 Ответ
>>27532
Передай в функцию указатель на воид, а уже внутри скастуй этот указатель в указатель на функцию с требуемой сигнатурой и вызови. А вообще это неправильно, так как теряется информация о типе и можно передать что хочешь и никак не проверишь потом. Я бы за такое отрубал бы руки.
>> No.27537 Ответ
>>27533
если обернуть это дело в typedef, руки уже можно не отрывать
>> No.27538 Ответ
>>27537
а еще лучше в класс, который имеет метаданные о сигнатуре и выстреливает экспешн сам
>> No.27556 Ответ
>>27538
Из чего сделать класс в чистом С?
>> No.27557 Ответ
>>27556
Из говна и палок, как и всё остальное.
Сделай структуру и функцию, которая будет выделять память и копировать в выделенную память эту структуру.
>> No.27558 Ответ
>>27556
в чистом си тайпдефы и надпись ПРИМЕНЯТЬ ОЧЕ ОСТОРОЖНО
А вообще myCall(pFun,&res,a,b,c) никто не отменял (С сигнатурой int myCall(MyFun* pFun,void* res,...)
>> No.27593 Ответ
>>27557
> Сделай структуру и функцию, которая будет выделять память и копировать в выделенную память эту структуру.
Ну если так рассуждать... Классы в С++ это структуры к которым прикрутили функции, предназначенные для работы конкретно с этой струкрурой. И например для двусвязного списка и обычного массива можно реализовать одинаковые по поведению функции, типа чтения, записи. Но как между классами эффективное взаимодействие сделать?
Например перебрасывать данные из обычного массива в обычный массив можно обычным memcpy.
Перебрасывание из связного списка в обычный массив это уже более затратная задача. Надо брать элемент связного списка, писать его в массив, прыгать в связном списке на следующий элемент, записывать следующий элемент в массив. Выходит, надо для копирования данных из массива в массив делать особый метод, чтобы это работало быстро?
А если есть связный список, состоящий из небольших массивов (развернутый связный список):
     +-+-+-+-+-+-+  +-+-+-+-+-+-+  +-+-+-+-+-+-+
...-->*|a|b|c|d|*<-->*|e|f|g|h|*<-->*|i|j|k|l|*<--...
     +-+-+-+-+-+-+  +-+-+-+-+-+-+  +-+-+-+-+-+-+
И необходимо в этот развернутый связный список скопировать данные из обычного массива? Тут, очевидно, быстрее будет копировать данные порциями, равными длинне куска в связном списке. И получается что нужно для этого реализовать особый метод FOR-COPYIN-FROM-ARRAY-TO-UNROLLED-LINKED-LIST-ONLY? Или все эти тонкости учитываются через какие-нибудь полиморфности?
>> No.27600 Ответ
>>27593
нет. Написали же, костыль, чего ты выпендриваешся. Структурам измоморфны только POD-классы, но в этой задаче большего и не нужно
>> No.27601 Ответ
>>27600
> Написали же, костыль, чего ты выпендриваешся
ОК, в С это костыль. А в плюсах что? В плюсах нужно писать отдельные функции, чтобы быстро перекидывать данные из обычного массива в развернутый связный список?
>> No.27602 Ответ
>> No.27603 Ответ
>>27602
> /list/list/list/
xzibit.h
>> No.27606 Ответ
>>27601
нет. Данные можно копировать и через виртуальный буфер, если захотеть. В stl это уже реализованно
>> No.27686 Ответ
>>27538>>27556
Есть мнение, что лучше использовать <язык-1>, чем делать кривой <язык-1> из <язык-2>. Либо писать на <язык-2> в духе <язык-2>, раз уж был выбран он.
>> No.27704 Ответ
>>27686
по поводу c++ не понял твоего юмора. Даже в хаскеле функтор это класс, ибо нефиг без обертки пускать указатели на функции с нестабильным поведением. Или ты намекаешь на какое то динамическое говно типа лиспа, чтобы потом ловить ошибки
>> No.27706 Ответ
>>27686
Лучше писать реализовывать абстрактные алгоритмические концепции на языке, который лучше всего для них подходит. «Такого языка нет» — дешевая отмазка. Грамотный программист наизнанку вывернется, но реализует первоклассные модули с сабтайпингом, если ему понадобится, хоть на Brainfuck.
>> No.27713 Ответ
>>27706
Наизнанку будут выворачиваться обезьянки и фанаты. Грамотный программист знает цену времени, затраченного на выполнение задания.
>> No.27714 Ответ
>>27713
> Грамотный программист знает цену времени, затраченного на выполнение задания.
...и поэтому будет использовать наиболее подходящий под необходимые ему концепции ЯП.
>> No.27717 Ответ
>> No.27736 Ответ
>>27714
Да, именно это я и хотел сказать.
>> No.28022 Ответ
>>27704
Я о том, что дело начиналось с С, потом посоветовали подход С++ (>>27538), стали обсуждать, как его реализовать на С (>>27556). Нет смысла повторять работу Бьярне и делать С++ из С: если С++ больше подходит, то проще сразу писать на нём; если же по каким-то причинам нужно/хочется писать на С, то писать стоит и в духе С.
"Язык-1" - это С++, а "язык-2" - С.
>> No.28023 Ответ
>>28022
ООП на С можно через gobject. И еще есть Vala которая через этот gobject работает
>> No.28024 Ответ
>>28023
Можно, и много ещё интересного можно сделать, но зачем? Если, конечно, не ради развлечения/обучения или не обусловлено это явно ситуацией.
Хотя, если даже нет явных причин писать на языке с использованием парадигмы, им не поддерживаемой, но получается совмещать развлечение и обучение с выполнением задач, то почему бы и нет? С "нет смысла" я погорячился.
>> No.28029 Ответ
>>28024
ну ВНЕЗАПНО для написания оконных интерфейсов gtk.
>> No.28033 Ответ
>>28029
Одно дело, когда классы описаны за тебя и ты используешь готовую библиотеку (GTK+), а другое - когда тебе нужно систему классов описать в рамках объектного костыля для C под названием GObject.
>> No.28084 Ответ
>>28033
Будто плюсы это не объектный костыль для С
>> No.28086 Ответ
>>28023
> ООП на С можно через gobject
там все те же самые конструкции, что и на С++, но теперь их нужно писать в коде, а на плюсах они генерируются компилятором.
>> No.28087 Ответ
>>28086
Можно заюзать препроцессор для С под названием Vala, который генерирует код. Кто-нибудь пробовал эту Vala использовать? Что можете сказать?
>> No.28090 Ответ
>>28087
Гномоговно, прибитое гвоздями к gtk и gobject. Лучше уж Qt или D.
>> No.28095 Ответ
Qt же тоже препроцессор и макросы использует, Meta Object Compiler называется.
>> No.28096 Ответ
>>28095
В проекте на Qt я могу: 1) использовать или не использовать qt-шные макросы, 2) использовать стандартные или сторонние либы C++ и идеомы, 3) использовать сишные либы и подавляющее чисто чистосишных идеом. На vala можно лишь написать биндинг к чистосишный либе; кроссплатформенности нет; комьюнити мизерное.
>> No.28106 Ответ
>>28096
Плюсоводы такие смешные. "Я буду использовать костыль, потому что этот костыль даёт свободу перестать им пользоваться - я могу начать носить его под мышкой. С++ - язык для свободолюбивых программистов!"
>> No.28122 Ответ
тем временем qt 5
>> No.28123 Ответ
>>28106
Однако же нет языка, который мог бы конкурировать с плюсами.
>> No.28124 Ответ
>>28123
Смотря по каким параметрам. Что, например, такого могут плюсы, чего не могут нормальные языки вроде C#? Разумеется, кроме костыльного множественного наследования, доставляющего плюсоводам великое множество проблем.
>> No.28125 Ответ
>>28124
> вроде C#
И сразу быстрофикс: имелось в виду "вроде C#, Java и многих других управляемых языков", конечно же.
>> No.28126 Ответ
Файл: _217286.jpg
Jpg, 105.16 KB, 1920×1080 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
_217286.jpg
>>28124
Зелено.
>> No.28127 Ответ
>>28124
Назови сначала, что твои любимцы могут.
>> No.28128 Ответ
>>28127
Например, мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода. Плюс лямбды, свойства и горы синтаксического сахара, которых в C++ нет и, наверное, уже не будет.
>> No.28129 Ответ
>>28128
Да, и нормальная модель ООП вместо C++-костыля.
>> No.28142 Ответ
>>28128
Лямбды в новом стандарте добавлены, синтаксический сахар - тоже.
> мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода
Кроссплатформенные приложения на C# до сих пор не пишут, стандартная библиотека вообще гвоздями к .NET прибита. Трудозатраты/быстродействие - дилемма, и тут выбор язык от задач зависит, никак не преимущество/недостаток какого-либо языка.
> Да, и нормальная модель ООП вместо C++-костыля.
Что же не поддерживает из ООП C++, чтобы его нельзя было назвать "нормальным объекто-ориентированным" языком?
>> No.28143 Ответ
>>28142
> Кроссплатформенные приложения на C# до сих пор не пишут
Кроссплатформенность между десктопами, телефонами и игровыми консолями - это тоже кроссплатформенность.
> стандартная библиотека вообще гвоздями к .NET прибита.
Не вижу минусов. C# вообще не планировался для запуска приложений вне окружения .NET, поэтому его стандартная библиотека осталась жёстко стандартизованной - это спасло язык от зоопарка типов. По крайней мере, в C# невозможна ситуация, когда в одном приложении используются типы bool, BOOL, VARIANT_BOOL и какие-нибудь __bool и QBool.
> Что же не поддерживает из ООП C++
Не "не поддерживает", а "криво поддерживает". Существование самостоятельных функций и операторов в ООП-языке - это самый настоящий костыль, ящитаю. Множественное наследование и проблемы ромбовидного наследования. Проблемы с видимостью членов классов (приватные виртуальные методы, которые можно перегружать - это вообще пушка). Это из того, что вспомнил навскидку.
>> No.28145 Ответ
>>28128
> Например, мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода.
C# не может быть скомпилирован напрямую в инструкции ассемблера (только в CIL). Как следствие, возрастают требования к аппаратным ресурсам + необходимость держать .NET рантайм для пережевывания этого CIL. Непригоден для написания драйверов
>> No.28146 Ответ
>>28145
> C# не может быть скомпилирован напрямую в инструкции ассемблера (только в CIL)
Хотя на этот случай есть Native Image Generator http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx
Но дотнет при этом все равно нужен
>> No.28164 Ответ
>>28145
> C# не может быть скомпилирован напрямую в инструкции ассемблера
Может, ты и сам вспомнил про ngen.
> необходимость держать .NET рантайм для пережевывания этого CIL
Как будто у плюсовых программ такой проблемы нет. Каждая вторая требует установленного Visual C++ Redistributable нужной версии или тащит с собой свою копию msvcr*.dll.
> Непригоден для написания драйверов
Да, такой низкий уровень недоступен для C#. В качестве утешения могу разве что вспомнить про .NET Micro Framework - его рантайм (tinyCLR) пишется на С(++), но в теории ничто не мешает написать над ним либу, которая бы переводила человечный API управления каким-нибудь периферийным девайсом в дрыганье GPIO-пинами. Поэтому чисто теоретически можно предположить, что в некоторых случаях драйвера таки можно писать на C#.
>> No.28172 Ответ
>>28164
> Каждая вторая требует установленного Visual C++ Redistributable нужной версии
Это виндопроблемы (DLL hell)
> или тащит с собой свою копию msvcr*.dll.
Это они так борятся с DLL hell
Еще есть вариант статической линковки, коророго нет в .NET
http://russian.joelonsoftware.com/Articles/PleaseSirMayIHaveaLinker.html
>> No.28173 Ответ
>>28172
> статической линковки, коророго нет в.NET
с помошью нехитрого костыля можно все управляемые библиотеки объединить в одну.
>> No.28174 Ответ
> борются
самофикс
>> No.28177 Ответ
Файл: Anders-Behring-Breivik-008.jpg
Jpg, 27.56 KB, 460×276 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Anders-Behring-Breivik-008.jpg
Что вы тут устроили? Мод-тян, что ты сделала с моим Доброчаном? Как сюда попали такие дилетанты? Почему они вдобавок еще и спорят между собой?

Глава 0

0 Вначале было слово, и слово было у Бога, и слово было Бог.

1 И сказал Бог: «да будет свет, и Земля, и зелень травная на ней, и рыбы морские в воде ее, и звери дикие на суше ее, и человек будет править ею». И стало так.

2 И правил человек Землёй, и зеленью на ней, и рыбами в воде её, и зверями на суше её, покуда мог;

3 Но расплодились твари и люди, и не смог более [он] управлять [ими]. И сотворил себе арифмометр.

4 Арифмометр же был прост и непрограммируем. [Человек] мог складывать на нем, и умножать, и делить; а что сверх того — то (было) не во власти его;

5 И сотворил тогда человек аналитическую вычислительную машину (Бэббиджа)

6 И писал программы для нее, выбивая их отверстиями на перфокартах для нее.

7 Отверстия же (или непробитые места) означали биты; биты слагались в байты, байты — в машинные слова, машинные слова — в инструкции; и был это машинный код;

8 И каждая инструкция (машинного кода) означала простое действие, которое выполняла машина.

9 И так, сочетая сии простые действия, то бишь, инструкции (машинного кода), программировал человек машину.

A Машинный код же был громоздкий и сложный, и были в нем десятки и сотни разных инструкций, и не мог человек запомнить их все;

B И тогда дал он каждой инструкции (машинного кода) название, краткое и запоминающееся, и назвал он их мнемониками; и так появился Ассемблер;

C И увидел Господь Ассемблер, что он хорош.

Глава 1

D Совершенствовал человек вычислительную машину, и создавал под нее программы,

E И программы становились все сложнее, и стало [людям] не хватать Ассемблера.

F Тогда сказал человек: «Сотворим же себе языки программирования, по образу и подобию Ассемблера, но с подпрограммами, циклами и ветвлениями», —

10 И сотворили люди языки программирования; иные создали Кобол, иные — Фортран, а иные — Паскаль;

11 Брайан Керниган и Денис Ритчи же сотворили C;

12 И посмотрели люди на C, и увидели, что он хорош; и стали писать на нем программы, и библиотеки, и операционные системы, и компиляторы, и компиляторы компиляторов;

13 И увидел сие Господь, и сказал: вот, хорошо весьма.

Глава 2

14 Страуструп же был хитрее всех людей на Земле;

15 Посмотрел он на Симулу (которая в те времена уже называлась Смоллток), и спросил человека:

16 «Что же ты не пишешь классы, не создаешь объекты, не посылаешь сообщения им?»

17 Человек же отвечал: «Керниган и Ритчи, создатели C, не предусмотрели сего».

18 Тогда взял Страуструп C и совокупил его с Симулой 67, и стали функции внутри struct; и совокупил он его с Алголом 68, и появились в C перегружаемые операторы; потом познал он его макросы, и вырос у C template;

19 И дал Страуструп сей язык человеку, и сказал: «вот, я сотворил тебе C++; пиши на нем»;

1A И увидел человек, что C++ есть C, но с классами, с перегружаемыми операторами и template;

1B И стал писать он на нем, и перегружать операторы, и создал на нем «iostream».

1C Господь Бог же сидел в то время в ФИДО, читая эху; и увидел он программу:
#include <iostream>
  
void main()
{
    std::cout << "Hello, world!";
}
1D И спросил Господь у человека: «ты чё, обосрался, что ли, мудак?»

1E Человек же сказал: «вот, Страуструп дал мне C++, и я писал на нем»;

1F И сказал Господь: «что ты это сделал? вот, за это посылаю я тебе индусов; они будут писать тебе говнокод, а ты будешь его поддерживать;

20 «В багах и мемори-ликах будут твои программы, а программисты твои станут опущенками среди других профессий».

Глава 3

21 В то время иные программы интерпретировались, а иные транслировались в машинный код;

22 И не было других программ, кроме [написанных] на машинном коде, и языки программирования — лишь удобные представления его;

23 Машинный код же на разных компьютерах был разный;

24 И не было согласия у них (людей); и программа, написанная для x86, не запускалась на AMD64;

25 Тогда сказал человек: «сотворим же еще одну машину, и да будет машинный код её стандартизирован и един для всех, и да будет сей код байт-кодом.

26 «А дабы не выбрасывать старое [оборудование], сделаем новую машину виртуальной, и да работает новая машина поверх старых машин»

27 И сотворили Яву.

28 Индусы же знали только C++, полиморфизм, инкапсуляцию и наследование; и люди сделали Яву целиком на классах и с синтаксисом, как у C++.

29 ООП же индусы не знали (как и операторы и множественное наследование); и люди сделали в Яве одиночное наследование, выкинули перегрузку операторов, разделили типы на ссылочные и примитивные, напидорасили абстрактных фабрик [XML-ей] в стандартной библиотеке и вообще скатили Яву в сраное, тормозное говно.

2A Microsoft же следовала стратегии «embrace, extend and extinguish»; и создала J++;

2B И подала Sun Microsystems на нее в суд за это; и создала тогда Microsoft NGWS, а ныне .NET Framework;

2C И была в .NET виртуальная машина, называемая CLR, и исполняла она программы, названные сборками, и исполяла она машинный код AKA байт-код, и был для байт-кода язык ассемблера — CIL.

2D Ява была кроссплатформенна лишь на словах из справки; .NET же был истиннно кроссплатформенен, но работал только под Windows;

2E Тогда пришел Мигель де Иказа и запилил со всей резкостью Mono; и стал тогда .NET кроссплатформенен.

*2F ...если не считать http://www.mono-project.com/Compatibility.*

30 Были и другие виртуальные машины, но если писать о них обо всех подробно, то, думаю, и всему миру тогда не вместить написанных книг.
>> No.28178 Ответ
>>28173
Я в том смысле, чтобы засунуть часть .NET в программу, чтобы она не требовала этого .NET такой-то там версии установленного в систему
>> No.28179 Ответ
>>28178
Сильно толсто выйдет.
>> No.28184 Ответ
>>28177
> и программа, написанная для x86, не запускалась на AMD64;
Чушь. AMD64 обратно совместим с x86
>> No.28185 Ответ
>>28184
А ты ничего не путаешь? Может, это 64-ёхбитные процессоры от Intel совместимы и с x86, и с AMD64?
>> No.28186 Ответ
>> No.28187 Ответ
>>28184
Ересь. Прямо совместим, обратно не совместим. Обратно никак не получится, потому что, например, регистров больше.
>> No.28193 Ответ
>>28172
> Еще есть вариант статической линковки, коророго нет в .NET
1. Засовываешь dll ку в ресурсы
2. В рантайме подгружаешь.
2. Profit!!!
>> No.28194 Ответ
Файл: Valente-tribal2.jpg
Jpg, 579.70 KB, 5086×2847 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Valente-tribal2.jpg
>>28193
Запихать в ресурсы весь рантайм .NET? Это сильно, лол.

Хотя в невозможности статической линковки есть и свои плюсы. Предположим, что в msvcr*.dll была обнаружена страшная дыра, дающая возможность переполнить какой-нибудь буфер и получить возможность удалённо выполнить произвольный код и воровать важные данные. Корпорация Microsoft, предположим, знает об этой дыре и уже выпустила патч. Как будут выглядеть действия пользователей/администраторов продукта в случае статически слинкованных программ:
1. Напомнить разработчикам о страшной дыре (если те ещё не в курсе);
2. Дождаться, пока те соизволят пересобрать программу с новой версией либы;
3. Получить патч, поставить его на все машины.
Альтернативный вариант развития событий:
1. Если программа мертва - рвать волосы на заднице, всячески ограничивать машинам с этой программой доступ во внешний мир.

В случае же, если та же напасть случится с окружением .NET, действия пользователей будут выглядеть так (вне зависимости от того, идёт ли разработка/поддержка программы):
1. Сделать "wuauclt /detectnow", установить обновления, ребутнуться.
ИЛИ
1. Включить установку заплатки на целевые машины в WSUS, дождаться плановой установки обновлений.

Пикрелейтед, в общем.
>> No.28206 Ответ
>>28194
> Альтернативный вариант развития событий:
Есть еще вариант ПЕРЕКОМПИЛИРОВАТЬ. Но в вендомирке не привыкли делиться исходниками.
>> No.28296 Ответ
Файл: path8946.png
Png, 21.83 KB, 637×246 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
path8946.png
Существуют ли визуализаторы исходного кода типа пикрилейтед? Чтобы по исходнику такое строило
>> No.28298 Ответ
>>28296
Читал где-то, что для Python такая штука была. Названия не помню.
>> No.28299 Ответ
>>28296
Напиши свою. Только блоки алгоритма сделай стандартными и добавь поддержку спецкоментариев.
>> No.28358 Ответ
>>28299
Как в этих блок-схемах можно наглядно показывать указатель на указатель на указатель, бегающий по триде-массиву, например?
>> No.28359 Ответ
>>28358
Копай в сторону register allocation, алгоримт расскраски etc.
>> No.28500 Ответ
Оставлю тут немного своего байтоебства
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{

int8_t n[] = {'9', '8', '7', '6', '5', '4', '3', '2'};
uint64_t* a = (uint64_t *)n;
*a =((*a & 0x0F000F000F000F00)>>8) +\
    ((*a & 0x000F000F000F000F)*10);

*a = 1000000 * ((*a >> 0 ) & 0xFF) +\
       10000 * ((*a >> 16) & 0xFF) +\
         100 * ((*a >> 32) & 0xFF) +\
               ((*a >> 48) & 0xFF);
//little-endian only. Можно переделать под big-endian
printf("%"PRId64, *a);

return 0;
}
>> No.28507 Ответ
>>28500
> printf("%"PRId64, *a);
а что означает вот это место?
>> No.28518 Ответ
>>28507
Это означает "напечатать uint64_t число"
В стандарте C99 про это есть.
http://www.delorie.com/djgpp/doc/libc/libc_623.html
>> No.28520 Ответ
Вообще, правильнее использовать там PRIu64
>> No.28521 Ответ
Т.е. PRId64 вообще для знакового int64_t
Но тут знакового никак не может получиться.
>> No.28522 Ответ
Файл: котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
Jpeg, 63.88 KB, 578×609 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
>>28358
Примерно вот так.
>> No.28538 Ответ
>>28522
> котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
Мне почему-то вспомнился няша-няшильда-няшечка-песочница-тред.
>> No.28539 Ответ
Файл: песочница-няша-няшильда-няшка-76655.jpeg
Jpeg, 137.93 KB, 538×807 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
песочница-няша-няшильда-няшка-76655.jpeg
>>28538
Извиняюсь, картинка отклеилась.
>> No.28561 Ответ
Требую пак с песочницей!
>> No.28563 Ответ
>>28561
http://joyreactor.cc/post/163156 Моё гугл-фу не оче, но хоть что-то.
>> No.28618 Ответ
Файл: 1343726876039.png
Png, 404.79 KB, 1600×1200 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1343726876039.png
>>28539
> песочница-няша-няшильда-няшка
thread go
>> No.28721 Ответ
>>3901
Анон, рассуждаю абсолютно так же, как и на пике, только не вслух. Я сильно плохой?
>> No.28723 Ответ
>>28721
Пфф, у нас на работе некоторые программизды и поядренее матюгаются.
>> No.28724 Ответ
Файл: hacskel.png
Png, 94.70 KB, 378×480
edit Find source with google Find source with iqdb
hacskel.png
Файл: 1260353211336.png
Png, 67.79 KB, 317×372
edit Find source with google Find source with iqdb
1260353211336.png

Вот еще
>> No.28726 Ответ
посоветуйте как быстро научится в рамках кутей, а не Pure C + ООП
>> No.28727 Ответ
>>28726
научится думать
>> No.28739 Ответ
>>28727
Кто научится?
>> No.28744 Ответ
>>28721
Рассуждаю так вслух на олимпиадах. Всё вроде бы ок.
>> No.28765 Ответ
Я тут пытаюсь минимальную программу под GNU/Linux на С написать
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
const char n[] = {'T', 'E', 'S', 'T', '\n'};
void _start(void)
{
  write(STDOUT_FILENO, n, sizeof(n)); 
  _exit(0);
}
Компилирую это так: gcc -o2 -nostartfiles -o hello hello.c И потом дизассемблирую черех objdump -d hello Получившийся результат меня не особо радует. Вместо непосредственного системного вызова, используются какие-то переходы непонятные по меткам:
Disassembly of section .plt:

0000000000400378 <_exit@plt-0x10>:
  400378:	ff 35 72 0c 20 00    	pushq  0x200c72(%rip)        # 600ff0 <_GLOBAL_OFFSET_TABLE_+0x8>
  40037e:	ff 25 74 0c 20 00    	jmpq   *0x200c74(%rip)        # 600ff8 <_GLOBAL_OFFSET_TABLE_+0x10>
  400384:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000400388 <_exit@plt>:
  400388:	ff 25 72 0c 20 00    	jmpq   *0x200c72(%rip)        # 601000 <_GLOBAL_OFFSET_TABLE_+0x18>
  40038e:	68 00 00 00 00       	pushq  $0x0
  400393:	e9 e0 ff ff ff       	jmpq   400378 <_exit@plt-0x10>

0000000000400398 <write@plt>:
  400398:	ff 25 6a 0c 20 00    	jmpq   *0x200c6a(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x20>
  40039e:	68 01 00 00 00       	pushq  $0x1
  4003a3:	e9 d0 ff ff ff       	jmpq   400378 <_exit@plt-0x10>

Disassembly of section .text:

00000000004003b0 <_start>:
  4003b0:	bf 01 00 00 00       	mov    $0x1,%edi
  4003b5:	48 83 ec 08          	sub    $0x8,%rsp
  4003b9:	ba 05 00 00 00       	mov    $0x5,%edx
  4003be:	be cf 03 40 00       	mov    $0x4003cf,%esi
  4003c3:	e8 d0 ff ff ff       	callq  400398 <write@plt>
  4003c8:	31 ff                	xor    %edi,%edi
  4003ca:	e8 b9 ff ff ff       	callq  400388 <_exit@plt>
Что это вообще за _GLOBAL_OFFSET_TABLE_ ? Зачем делать какие-то непонятные переходы? Почему просто не делать системные вызовы?
Решил заменить _exit(0); на асмовставку:
  asm(
  "mov $0, %rdi\n"
  "mov $60, %rax\n"
  "syscall\n");
$60 это системный вызов exit http://www.acsu.buffalo.edu/~charngda/linux_syscalls_64bit.html
$0 это код возврата
В итоге получается следующая картина:
Disassembly of section .plt:

0000000000400340 <write@plt-0x10>:
  400340:	ff 35 aa 0c 20 00    	pushq  0x200caa(%rip)        # 600ff0 <_GLOBAL_OFFSET_TABLE_+0x8>
  400346:	ff 25 ac 0c 20 00    	jmpq   *0x200cac(%rip)        # 600ff8 <_GLOBAL_OFFSET_TABLE_+0x10>
  40034c:	0f 1f 40 00          	nopl   0x0(%rax)

0000000000400350 <write@plt>:
  400350:	ff 25 aa 0c 20 00    	jmpq   *0x200caa(%rip)        # 601000 <_GLOBAL_OFFSET_TABLE_+0x18>
  400356:	68 00 00 00 00       	pushq  $0x0
  40035b:	e9 e0 ff ff ff       	jmpq   400340 <write@plt-0x10>

Disassembly of section .text:

0000000000400360 <_start>:
  400360:	48 83 ec 08          	sub    $0x8,%rsp
  400364:	ba 05 00 00 00       	mov    $0x5,%edx
  400369:	be 8d 03 40 00       	mov    $0x40038d,%esi
  40036e:	bf 01 00 00 00       	mov    $0x1,%edi
  400373:	e8 d8 ff ff ff       	callq  400350 <write@plt>
  400378:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
  40037f:	48 c7 c0 3c 00 00 00 	mov    $0x3c,%rax
  400386:	0f 05                	syscall 
  400388:	48 83 c4 08          	add    $0x8,%rsp
  40038c:	c3                   	retq
Зачем компилятор добавил инструкции после syscall и как ему это запретить делать? Компилятор вообще умеет генерировать код без всякой ненужной ерунды?
write это кстати тоже системный вызов. Мне что, все на ассемблер переписывать?
>> No.28766 Ответ
>>28765
почитай Loaders & Linkers и не задавай глупых вопросов
и попробуй -O3
>> No.28768 Ответ
>>28766
От -O3 ничего не меняется
И еще такой вопрос. На основании чего компилятор убирает код после _exit(0); ?
Вот например если
  asm volatile (
  "mov $0, %rdi\n"
  "mov $60, %rax\n"
  "syscall\n");
  printf("test");
то вызов printf там будет присутствовать после вставки. Если же сделать
  _exit(0);
  printf("test");
то никаких инструкций после вызова этого _exit уже нет. Как мне определить такое же поведение для асмовставки?
>> No.28769 Ответ
>>28768
Сам нашел про __builtin_unreachable(); и __attribute__ ((noreturn)) Надо бы побольше читать документацию к gcc
>> No.28770 Ответ
>>28769
Как у байтоёбов всё сложно.
>> No.28775 Ответ
>>28769
Найди там ещё что-нибудь про syscall, наверняка есть в target-specific опциях компилятора.

>>28770
Поешь добра, няша. Каждый ебёт то, что ему нравится.
>> No.28776 Ответ
>>28770
А то. Это тебе не хелловорлд из примера копипастить.
>> No.28777 Ответ
>>28776
Конечно, тут нужно красноглазить даже для того, чтобы написать обычный хелловорлд.
>> No.28779 Ответ
>>28777
Тебе понравится Python OS. Тут где-то даже тред был про неё.
>> No.28780 Ответ
>>28765
тебе стоит посмотреть на колибриОС, няша. В линуксе вообще байтосодомия не приветствуется идеалогически, поэтому ждать ее хорошей поддержки не стоит
>> No.28781 Ответ
>>28780
Хуже байтосодомии на Си может быть только байтосодомия на ассемблере. В Колибри не приветствуется код на чём-нибудь, кроме него.
>> No.28783 Ответ
>>28781
У нормальных людей - программирование на языке ассемблера. У тебя - байтосодомия. Задумайся.

>>28780
> идеалогически
"Идеологически", через "о".
>> No.28784 Ответ
>>28783
Задумался. Всё равно байтосодомия. Но мне она нравится.
>> No.28785 Ответ
>>28783
> У нормальных людей - программирование на языке ассемблера. У тебя - байтосодомия. Задумайся.
Нормальное программирование есть на C#, Python, *lisp, etc., иногда даже на C++ (зависит от программиста). На C и тем более на ассемблере любая программа превращается в байтосодомию. Просто ты привык содомировать байты и считаешь это нормальной практикой программирования. Задумайся.
>> No.28786 Ответ
Файл: lisplogo_fancy_256.png
Png, 41.29 KB, 256×223 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
lisplogo_fancy_256.png
>>28785
> Нормальное
> lisp
>> No.28787 Ответ
>>28785
> ты привык содомировать байты
Как что-то плохое.
> На C ... любая программа превращается в байтосодомию
Просто ты не умеешь программировать на C.
>> No.28788 Ответ
>>28787
Но ведь он прав. В C++ засчет неявных вызовов конструкторов и деструкторов, в принципе, можно инкапсулировать байтосодомию, а в сишечке все free() и malloc() надо прописывать вручную.
>> No.28789 Ответ
>>28788
ты не видел байтосодомию на плюсах, чувак. Это когда делается jump по адресу в массиве просто чтобы убрать оверхед. Я уже молчу про шалости в олдскульных графических движках, потому что извлечение корня из произведения далеко не самая байтосодомическая функция
>> No.28794 Ответ
>>28780
> колибриОС
> 64бит
>> No.28796 Ответ
>>28785
> Нормальное программирование есть на C#, Python, *lisp, etc.
Скриптование скриптов интерпретатора байткода виртуальной машины, сделанной на скриптах? Нет, это не нормальное программирование. Нормальное программирование - это когда ты можешь без проблем задействовать сопроцессор, например. Всё, где нельзя работать с железом, - не программирование, а гуманитарщина и бред.
>> No.28798 Ответ
>>28796
> Нормальное программирование - это когда ты можешь без проблем задействовать сопроцессор, например. Всё, где нельзя работать с железом, - не программирование, а гуманитарщина и бред.
О, да, как это знакомо. Всё ради того, чтобы программа была как можно менее переносимой и как можно более запутанной. Только так многие погромисты умудряются до сих пор получать деньги и доказывать начальству свою нужность. Это не программирование, а саботаж.
>> No.28799 Ответ
>>28798
Вообще не понимаю о чем вы спорите. НА дворе 21-й век, пишите на нескольких языках

PS все жду extern "java" в gcc
>> No.28800 Ответ
>>28799
> PS все жду extern "java" в gcc
Не понял. А какие предпосылки?
>> No.28801 Ответ
>>28800
Никаких предпосылок
конструкция extern "что то там" подразумевает линковку по измененным правилам. Например extern "C" подразумевает иную чем в c++ передачу параметров. Почему нельзя связать все это с жабой или хачкелем непонятно
Алсо, по понятным причинам нуэно будет научится описывать интерфейсы. Я не думаю, что это является проблемой в рамках той же конструкции extern.
extern "java" virtual class {
public: int getData();
    void setData(int);
}
>> No.28803 Ответ
>>28801
> Почему нельзя связать все это с жабой или хачкелем непонятно
Весь рантайм собрался вкомпилить вместе с жабой или хаскелем?
>> No.28804 Ответ
>>28803
зачем? Динамическая линковка же
>> No.28820 Ответ
>>28801
Так для этого биндинги всякие есть, или что?
>> No.28824 Ответ
>>28801
Для жабы требуется загруженая в память JVM, чтобы она пережевывала байткод. И надо при обработке этого extern "java" каким-то образом передавать байткод явы в нее(не будем же мы загружать по новой каждый раз эту ява-машину при выполнении extern "java" ? ). Хотя еще можно откомпилировать яву в нормальный нативный бинарник через gjc и вызывать его без всякой высокоуровневой содомии с байткодом
>> No.28828 Ответ
>>28824
Может быть я не прав, но у jvm же есть для этого специальный API, разве нет?
>> No.28831 Ответ
Первый выпуск RoboVM, компилятора байткода Java в машинный код
http://www.opennet.ru/opennews/art.shtml?num=35919
>> No.28835 Ответ
>>28796
Нет <...>. Это <...> называется «подмена понятий» <...>.

<...> Знаешь, есть такой анекдот: «Купил мужик машину и радуется: "И как я раньше без машины жил? А теперь всё могу: и на заправку съездить, и масло поменять, и колёса подкачать!"» Так вот то, что ты назвал нормальным программированием <...> — это поездки на заправку, замена масла и накачка колёс. <...> А для чего всё это? <...>

<...> Хуй нужен, чтоб делать им детей (и чтоб жилось веселей). Соха — чтоб землю пахать да хлеб выращивать. Утюг — чтоб белье разглаживать. А компьютер нужен, чтобы считать да запоминать. А не <...>
>> No.28837 Ответ
>>28835
да у тебя же БИНАРНОЕ ДЕРЕВО какое то.
Просто признай, что скриптовые языки - удел слабых програмистов.
Нормальные мужики выбирают либо компилируемые в приличный байткод (C, C++, Pascal), либо настолько матерую функциональщину на хачкеле/прологе, что написание аналога займет пару лет

Отдельно стоит отметить лишп, который сам по себе нормальный язык аля дедушка форт, но усодомирован до состояния "у меня уже функциональный синтаксис, но еще императивная структура".
>> No.28843 Ответ
>>28837
> Просто признай, что скриптовые языки - удел слабых програмистов.
Удел продуктивных программистов, так-то.
>> No.28845 Ответ
>>28837
Нормальные мужики выбирают языки, на которых быстрее всего будет программу написать. Это может оказаться и Java, и Python, и даже PHP. «Слабость», «императивная структура», «нормальность» ебёт исключительно борщеедов, которымх пла кормят одинаково за говнокод и за качественные решения.
>> No.28848 Ответ
>>28837
> компилируемые в приличный байткод (C, C++, Pascal)
C, C++, Pascal компилируются в машинный код. В байткод компилируются явы и дотнеты всякие
>> No.28850 Ответ
>>28845
> Нормальные мужики выбирают языки, на которых быстрее всего будет программу написать.
Язык программирования - инструмент. Одни инструменты подходят для одних задач, другие - для других. Если писать числодробильную программу моделирования каких-нибудь физических процессов на скриптовом языке, специально предназначенном для быстроты разработки в ущерб быстродействию готового кода, в итоге получим тормозную хуиту.
>> No.28859 Ответ
>>28850
Ну, то есть, да.
>> No.28860 Ответ
>>28850
проблема в том, что развертывание на тех же кутях не сильно медленнее руби/пейтона/ришоточки. Если речь не идет о вебе офк
>> No.28879 Ответ
>>28777
Вот хеллворд на C из ассемблерных вставок для x86-64 GNU/Linux:
const char msg[] = {'H','e','l','l','o',',',' ','W','o','r','l','d','\n'};
const char sz = sizeof(msg);

void _start(void)
{
  asm volatile (
  "mov $1, %%rax\n\t"  //  1 - SYS_write
  "mov $1,  %%rdi\n\t" //  1 - STDOUT_FILENO
  "mov %0, %%rsi\n\t"  // msg
  "mov %1, %%rdx\n\t"  // size
  "syscall\n"
  :
  : "g" (msg), "g" (sz)
  : "%rsi", "%rdx"
  );
  
  asm volatile (
  "mov $60, %rax\n\t" // 60 - SYS_exit
  "mov $0, %rdi\n\t"  //  0 - EXIT_SUCCESS
  "syscall\n");
  __builtin_unreachable();
}
Компилируется так: gcc -O2 -nostartfiles -nostdlib -o hello hello.c
>> No.30591 Ответ
Файл: ring_buf.c
C, 2.27 KB, 95 строк - Нажмите на картинку, чтобы скачать файл
view edit
ring_buf.c
Моя реализация кольцевого буфера. Лицензия пусть будет WTFPL
>> No.30599 Ответ
Файл: circ_buf.c
C, 2.60 KB, 102 строк - Нажмите на картинку, чтобы скачать файл
view edit
circ_buf.c
>>30591
Немного самофикс. Потом еще улучшу, чтобы размер увеличивался при полном заполнении. Можно будет circ_buf_push_tail и circ_buf_push_tail завернуть в макрос, потому что теперь они почти одинаковые. Есть ли замечания по коду?
>> No.30600 Ответ
>>30599
Я тут еще подумал над своим кодом. Вот эту штуку:
#define IFDEBUG(...)  if (deb_var == 1){__VA_ARGS__}
#define IFNDEBUG(...) if (deb_var == 0){__VA_ARGS__}
Имеет смысл заменить на:
#define IFDEBUG  if (deb_var == 1)
#define IFNDEBUG if (deb_var == 0)
При этом поменяются скобочки, было IFDEBUG(blabla;); станет IFDEBUG{blabla;};
>> No.30615 Ответ
>>28848
На самом деле, в байткод код на этих трёх языках компилировать тоже можно.
мимозануда
>> No.30638 Ответ
>>30615
Во что угодно тьюринг-полное можно скомпилировать что угодно тьюринг-полное.
>> No.30640 Ответ
>>30638
Но не за конечное время.
Post was modified last time at 2013-04-04 02:26:52
>> No.49760 Ответ
Файл: 1489298550113199376.jpg
Jpg, 46.80 KB, 476×540 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1489298550113199376.jpg
Эхх, это мой тред 10-летней давности, когда я самостоятельно сишку осваивал. Сишку освоил, пишу прошивки под контроллеры. А плюсы - говно, не рекомендую. Надо бы какой-нибудь Haskell или Lisp выучить для общего развития.


Пароль:

[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]