[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

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

>>3902
Ты соснул, кстати. Прочитай условие внимательно.
>> No.3908 Reply
>>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 Reply
>>3908
Нет же (я тоже сначала так подумал). Если в строчке есть что-то кроме пробелов или строка пустая, то оставить ее как есть, иначе вывести вместо нее " \n".
>> No.3910 Reply
В оригинале: Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank.

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

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


Но это не важно. В коде у тебя все равно лапша жуткая. Избавься хотя бы от exit() чтоли.
>> No.3912 Reply
>>3911
> В коде у тебя все равно лапша жуткая. Избавься хотя бы от exit() чтоли.
А что плохого в exit() ? Покажи свое решение, чтобы без лапши
>> No.3916 Reply
getContents >>= putStr . unlines . filter ( not . all isSpace ) . lines
Адова выразительность, например.
>> No.3917 Reply
File: t.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
t.c
>>3916
> Адова выразительность, например.
И как обычно, делает не то, что просили, например. 1) логика не та 2) в варианте на сишечке не используется дополнительная память.

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

Пинайте.
>> No.3922 Reply
File: 1236944911495.jpg
Jpg, 70.30 KB, 395×395 - Click the image to expand
edit Find source with google Find source with iqdb
1236944911495.jpg
File: 1236944911495.jpg
Jpg, 70.30 KB, 395×395
Your censorship settings forbid this file.
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 Reply
>>3920
Убежал блеать =(
>> No.3924 Reply
А на си нельзя выходить из глубоких циклов как на пхп?
while(true) // 2й
{
while(true) // 1й
{
    break(2); // выходим из 2го цикла
}
}
echo 'Вышли из цикла';
Алсо, можно извратится, и выходить из глубоких циклов выбрасыванием эксепшена. Но вообще, глубокие и сложные циклы лучше просто не строить
>> No.3925 Reply
>>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 Reply
>>3917
> Пинайте.
2)
Для getline нужно #define GNUSOURCE в начале
И поясни логику работы этого getline, что он делает?

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

И еще надо компилировать с опцией -std=c99 Потому что ты зачем-то записал в циклах объявление переменных int all_spaces = 0; и size_t i = 0; Переменные можно объявить раньше, а в циклах просто написать all_spaces = 0; и i = 0; соответственно.
>> No.3940 Reply
File: primemy2.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
primemy2.c
> Ты знаешь, что надо задефайнить и не знаешь, что делает гетлайн?
Я только учусь.
Я тут еше программу пишу, которая выводит числа кратные простым числам, которые меньше чем sqrt(100), простые числа до 100 и количество простых делителей для составных чисел до 100. Только последняя часть как-то неправильно работает. Что там не так?
ОП
>> No.3943 Reply
File: primemy2.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
primemy2.c
>>3940
Самофикс. Что можно сделать лучше?
>> No.3945 Reply
File: primemy6.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
primemy6.c
Еще раз самофикс
У меня хорошо получается?
>> No.3946 Reply
File: primemy6.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
primemy6.c
Финальная версия
>> No.3949 Reply
File: primemy6.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
primemy6.c
Еще небольшое улучшение
>> No.3951 Reply
>>3925
> setjmp/longjmp
сам ебанутый это ладно, но ненадо детей плохому учить.
>> No.3959 Reply
File: wiggins.jpg
Jpg, 61.05 KB, 802×984 - Click the image to expand
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 Reply
>>3959
Или даже лучше так, для обработки ошибок: int sieve_get(sieve, int, int*), int sieve_set(sieve, int, int)
>> No.3963 Reply
File: ulam_spiral2.c
C, 0.00 KB, 0 lines - Click the image to get file
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 Reply
File: 1279492321649.png
Png, 1.01 KB, 200×20 - Click the image to expand
edit Find source with google Find source with iqdb
1279492321649.png
В слове RIGHT ошибся. Ну ничего
>> No.3965 Reply
>>3963
> Это не проблема
До поры до времени. man структурное программирование
> И что этот тип должен делать?
Скрывать детали реализации.
> Xlib
bawwwwwww.jpg

Я хлиб толком не знаю, поэтому без подробностей, но ты же в курсе, что ты все там делаешь не так? Программа падает с фатал еррор и съедает весь процессор, перерисовывая картинку безо всякой нужды.
>> No.3967 Reply
File: 1235919642628.jpg
Jpg, 47.17 KB, 443×600
Your censorship settings forbid this file.
unrated
File: 1235919642628.jpg
Jpg, 47.17 KB, 443×600 - Click the image to expand
edit Find source with google Find source with iqdb
1235919642628.jpg
>>3965
> man структурное программирование
$ man структурное программирование
man: no entry for структурное in the manual.
man: no entry for программирование in the manual.
Похоже, каких-то пакетов не хватает.
>> No.3968 Reply
File: goto_292_rus__.png
Png, 25.38 KB, 740×201 - Click the image to expand
edit Find source with google Find source with iqdb
goto_292_rus__.png
>> No.3969 Reply
File: ulam_spiral4.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
ulam_spiral4.c
>>3965
> bawwwwwww.jpg
А чем еще можно так легко рисовать точки
> Программа падает с фатал еррор и съедает весь процессор, перерисовывая картинку безо всякой нужды.
Поправил
>> No.3973 Reply
>>3969
> А чем еще можно так легко рисовать точки
GDK? Cairo?

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

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

Кстати, вспомните всеми любимый и объектно-ориентированный пейтон, в котором "приватные" члены нихуя не приватные и ничего, никто пока не умер.
>> No.3994 Reply
>>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 Reply
Инкапсулировать в ФП можно замыканиями же!

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

Олсо, ты, кажется, опять все делаешь не так. Тебе нужны не кейкоды, а keysym'ы. Енжой йор икслиб.
>> No.4517 Reply
File: cpp-dummies.jpg
Jpg, 29.09 KB, 341×500 - Click the image to expand
edit Find source with google Find source with iqdb
cpp-dummies.jpg
Бамп. Буду дальше программировать, а то я это дело как-то забросил, все равно у меня нет личной жизни. Посоветуйте IDE под линукс. И еще скажите, чем так плох C++ ?
ОП
>> No.4519 Reply
File: 1225905084202.jpg
Jpg, 104.07 KB, 450×600 - Click the image to expand
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 Reply
>>4517
> Посоветуйте IDE под линукс.
kdevelop

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

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

а ещё, гипотетически, компилятор может неожиданно развернуть какой-нибудь небольшой цикл, в котором "натурально" используются inline-функции. и на выходе мы получим добрую кучу машинного кода. возможно, он даже будет работать быстрее, чем просто цикл с просто вызовами функции, но как-то это всё кровавыми вилами писано.
зачем нужны обычные, неинлайн функции?. ну, когда-то было принято считать, что под сегмент кода отводится ограниченное количество памяти, плюс, можно было и указатели поменьше использовать... но это предание старины глубокой :)
>> No.4594 Reply
>>4579
>>4584
А зачем ты возвращаешь char, а потом его не используешь? Используй void тогда.
Да, и неплохо бы поиграться со свитчем, в нем делаются одинаковые штуки.
>> No.4595 Reply
>>4594
> А зачем ты возвращаешь char, а потом его не используешь? Используй void тогда.
Спасибо, заменил
> Да, и неплохо бы поиграться со свитчем, в нем делаются одинаковые штуки
Тоже над этим думал. Что там можно поменять? Разве что поставиь перед свитчем условие, есть ли нажатие на одну из кнопок ← → ↑ ↓
Если есть, делаются одинаковые штуки, потом идет свитч
>> No.4599 Reply
>>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 Reply
>>3906
Растолкать пачку циклов по функциям и использовать return.
>> No.4657 Reply
>>3949
За строки типа #define END_2 END >> 1 у нас в лаборатории сразу лейкой по морде бьют.
Заменить на #define END_2 (END >> 1)
>> No.4658 Reply
>>4592
Если писать под контроллер, у которого 2 (два) килобайта памяти на код, все твои предания резко становятся суровой реальностью.
>> No.4703 Reply
File: snakemoveN1.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
snakemoveN1.c
Отчего тут ошибки?
>> No.4704 Reply
>>4703
> #include
>> No.4705 Reply
>>4704
И что с ним не так?
>> No.4706 Reply
File: snakemoveN1.c
C, 0.00 KB, 0 lines - Click the image to get file
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 Reply
> Ynw-- = (y[0]);
лол
>> No.4708 Reply
>>4706
Начнем с того, что это разные вещи. В первом случае от Ynw должна сначала отниматься 1, потом присваиваться y[0]. Второй и третий случаи делают Ynw = y[0]-1.
А теперь смотрим что же такое Ynw. unsigned int Ynw = 0; А теперь посчитай 0 - 1.
>> No.4709 Reply
File: snakemoveN1.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
snakemoveN1.c
Багфикс
Алсо, почитав http://lurkmore.ru/%2B%2Bi_%2B_%2B%2Bi окончательно запутался с этими ++ и --
>> No.4710 Reply
>>4709
Какой еще гениальный источник знаний приведешь, педивикию?
>> No.4711 Reply
>>4710
Ну а как распределяется приоритет между этими инкрементами-декрементами? Где об этом есть достоверная инфа?
>> No.4713 Reply
>>4711
> Где об этом есть достоверная инфа?
достоверная инфа: мутабельность для быдла
>> No.4714 Reply
>>4711
Зависит от компилятора же.
Кури первоисточник http://gcc.gnu.org/bugs/#known
>> No.4721 Reply
>>4711 как компилятор скомпилирует, таки будут распределяться.
>> No.4772 Reply
File: snakemoveN3.c
C, 0.01 KB, 0 lines - Click the image to get file
view edit
snakemoveN3.c
Осталось только прикрутить случайность координат к пикселю для пожирания и сделать нормальное удлинение змеи. Что бы еще такого сделать?
>> No.4773 Reply
>>4772
1. Когда я пытаюсь закрыть окно уничтожив его, я получаю только писк. Т.е. нужен выход не только по прерыванию.
2. Мне пришлось править твои дефайны при помощи xev, у меня это совсем другие кнопки, либо я что-то не понимаю.

Хочешь усложнить, можно приделать рандомные бонусы, например, или уровни со стенками, как это было в какой-то змейке из стандартной поставки древней убунты.
>> No.4774 Reply
>>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 Reply
File: snakemoveN3.c
C, 0.01 KB, 0 lines - Click the image to get file
view edit
snakemoveN3.c
>>4774
> Для начала пусть попробует сделать свою змею чуть потолще, не один пиксель, а сегментами 4х4 например. кекеке
Это вообще элементарно. Мне бы понять, как убрать разрывы при удлинении змеи. Буду делать алгоритм перетасовки координат отдельных ячеек
>> No.4776 Reply
можно еще сделать змею с порталами
>> No.4777 Reply
>>4775
Тебе скачала вот это говно >>4774 из 11 параметров надо разрулить. И функцию из двух строчек выкинуть КЕМ.
>> No.4778 Reply
>>4775
Лажу в #define в скобки закрыл - молодец!
>> No.4779 Reply
>>4777
> говно >>4774 из 11 параметров надо разрулить.
Как? Что мне с ним сделать? Завернуть в структуру, и передавать в функцию в таком виде, потом внутри функции разыменовывать его?
>> No.4780 Reply
File: not-impressed-cat-is-not-impressed.jpg
Jpg, 186.52 KB, 500×483 - Click the image to expand
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 Reply
посоны, я тут от нечего делать многопользовательскую онлайн змейку забацал.
Мырить тут: http://92.55.29.182:8080/gwtSnakeGame-0.1/com.elewise.pg.GWTTest/SnakeGame.html
Исходники: http://subversion.assembla.com/svn/gwtsnakegame/
>> No.4868 Reply
кстати если нажать на "компьютер", то включиться автопилот
>> No.4869 Reply
>>4867
> /src/main/resources/com/elewise/pg/public
Сам не устаешь?
>> No.4870 Reply
>>4869
щито? Вы знакомы с понятием "IDE"?
>> No.4872 Reply
>>4870
Файлопанель на половину экрана это круто, да.
>> No.4873 Reply
File: gwtSnakeGame.PNG
Png, 132.35 KB, 1278×958 - Click the image to expand
edit Find source with google Find source with iqdb
gwtSnakeGame.PNG
>> No.4880 Reply
>>4867
поднимай давай.
>> No.4885 Reply
>>4880
поднял. Стоит вылизывать эту штуку? Она будет популярна у хомячков?
>> No.4889 Reply
>>4885
> Она будет популярна у хомячков?
Если допилить до нормального состояния, то возможно. Можно еще прикрутить всяких перделок, вроде порталов, стен и бонусов, дающих способность пожирать других змей например
>> No.5021 Reply
File: snakemoveN3.c
C, 0.01 KB, 0 lines - Click the image to get file
view edit
snakemoveN3.c
Сделал перестановку сегментов после пожирания точки.
Как в Си можно сделать случайное число в интервале от A до B?
>> No.5023 Reply
>>5021
random()*(B-A)+A
>> No.5025 Reply
>>5023
Это не то, что мне нужно. Оно дает каждый раз одно и то же
>> No.5031 Reply
>>5025
randomize()
>> No.5032 Reply
>>5031
> randomize()
$> man 3p randomize
Нет справочного руководства для randomize в разделе 3p
>> No.5033 Reply
>>5032
ты ленивый мудак, совершенно не нумеешь гуглить
#define randomize() srand((unsigned)time(NULL))
#define random(a, b) rand()*(b-a)+a
>> No.5034 Reply
>>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 Reply
А если так
#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 Reply
>>5035
> printf (" %d", random(10, 20));
> randomize();
Ох лол.

man srand
>> No.5037 Reply
>>5034
#define random(a, b) rand()*(b-a)/RAND_MAX+a
ну и, естественно, рандомайз нужно запускать один раз в начале программы, а уж потом генерить числа.
>> No.5045 Reply
>>5037
> #define random(a, b) rand()*(b-a)/RAND_MAX+a
Проверяй, прежде чем постить
#define random(a, b) ((rand() % (b - a + 1)) + a)
>> No.5046 Reply
File: snakemoveN3.c
C, 0.01 KB, 0 lines - Click the image to get file
view edit
snakemoveN3.c
Вроде, работает
>> No.5081 Reply
File: snakemoveN3.c
C, 0.01 KB, 0 lines - Click the image to get file
view edit
snakemoveN3.c
Небольшой багфикс, добавил возможность менять маштаб
>> No.5104 Reply
> Я тут на C программу написал, которая копирует входной поток в выходной с заменой каждой строки, состоящей из одного или нескольких пробелов, одним пробелом.
тред не читал
yoba = unlines . map mapLine . lines
  
    where mapLine []                   = []
          mapLine x | all ((==) ' ') x = " "
                    | otherwise        = x
>> No.5106 Reply
>>5104
Тред не читал.
import re, sys
[print(line) for line in sys.stdin if line else print(" ", end="")]
>> No.5109 Reply
>>5106
Тред читал.
while(<>){s/ +/ /g;print;}
>> No.5110 Reply
>>5106
> print
дальше не читал
>> No.5111 Reply
>>5109
s/^ +$/ /g, pазумеется. Засыпаю уже.
>> No.5475 Reply
Сделаю пока что-нибудь простенькое
Напишите программу для вывода входного потока по одному слову в строке.
#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 Reply
Вот например программа которая должна возвращать код символа, который следует после единиц:
#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 Reply
>>5475
do { line <- getLine; putStr $ unlines . words $ line }
>> No.5522 Reply
File: 1265445013086.jpg
Jpg, 345.28 KB, 635×595 - Click the image to expand
edit Find source with google Find source with iqdb
1265445013086.jpg
>>5521
не делай так больше
  
getLine >>= putStr . unlines . words
>> No.5524 Reply
а лучше так:
getLine >>= mapM putStrLn . words
>> No.5564 Reply
File: 1_13.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
1_13.c
Подсчет количества слов различной длинны
С юникодом работает неправильно, потому что юникодные символы могут занимать больше одного байта.
>> No.5565 Reply
>>5564

Скорее всего не с юникодом (UCS), а с utf-8. И работать utf-8 напрямую мягко говоря не рекомендуется. Нужно сначала сконвертить его в какой-нибудь ucs-32.
>> No.5627 Reply
File: result.txt
Txt, 0.00 KB, 0 lines
view edit
result.txt
File: some.c
C, 0.00 KB, 0 lines
view edit
some.c
File: 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 Reply
Я тут решил теперь написать консольный тетрис на ncurses
Как получать кейкоды нажатий клавиш ? (через getchar() нехочу, потому что например стрелочки ← → ↑ ↓ и кнопки Shift не дают никаких символов, да и вообще, это тупо как-то)
И как сделать такой сценарий?:
Ждем нажатия клавиши 0.5 сек.
если что-то нажато то
в зависимости от того, что нажато,
    мы или поворачиваем фигуру по или против часовой стрелки
    или немедленно опускаем фигуру вниз,
    или ничего не делаем и продолжам ждать.
Если ничего не нажато в течении 0.5 сек., то просто опускаем фигуру на 1 пункт
Как ожидать нажатие клавиши? Через getchar() я например не знаю, как так можно сделать
>> No.5684 Reply
File: 1286659223031.png
Png, 0.95 KB, 300×20 - Click the image to expand
edit Find source with google Find source with iqdb
1286659223031.png
>>5675
так разве в ncurses нет функции перехвата нажатия клавиши?
>> No.5687 Reply
>>5684
> так разве в ncurses нет функции перехвата нажатия клавиши?
Я не знаю, мне от ncurses нужно только умение выводить на экран разные символы в разных местах.
Разве функция чтения символа не должна быть независимо от ncurses? Программа showkey разве написана на ncurses?
Кстати, showkey под иксами не работает. Пишет "Не могу получить файловый дескриптор, соответствующий консоли"
И непонятно как сделать ожидание ввода, ну всмысле чтобы оно ждало пол секунды нажатие какой-то клавиши, если нажатия не происходит, опускает фигуру вниз.
>> No.5688 Reply
>>5687
Да ты же ньюфаг!
Используй механизм select!
>> No.5689 Reply
>>5688
А где про это можно почитать?
>> No.5690 Reply
>>5689
Google it!
>> No.5703 Reply
>>5690
Не нашел ничего, из чего мне было бы понятно, как этот select использовать. Мне нужен какой-то пример кода.
Пока что попробую через halfdelay сделать
>> No.5712 Reply
File: tetr.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
tetr.c
Пока что только такая заготовка. Надо будет разобраться
>> No.5715 Reply
>>5712
arr[10]={0,0,0,0,0,0,0,0,0,0};
Зачем ты сначала делаешь это, а потом еще и не используешь?
>> No.5723 Reply
>>5715
Всему свое время.
>> No.5729 Reply
File: tetr.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
tetr.c
>>5715
Вот теперь использую
>> No.26677 Reply
File: 200px-The_C_Programming_Language_Book_2th_Ed.jpg
Jpg, 10.03 KB, 200×264 - Click the image to expand
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 Reply
или например такая задача: есть текст, пользователь вводит регексп, он в рантайме преобразовывается в представление в виде конечного автомата компилируется в функцию.
>> No.26679 Reply
>>26678
Современные ОС сильно плохо относятся к такому коду. Можно компилировать для видеокарты.
>> No.26682 Reply
>>26677
LLVM
>> No.26683 Reply
>>26677
Если хочешь со всеми понтами и понижениями степени - проще всего будет компилировать файлы и подгружать сразу имхо. Менее дешевый вариант - обойтись без elf и подгружать ручками
>> No.26864 Reply
Допустим, есть массив
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 Reply
File: arrayexperiments.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
arrayexperiments.c
>>26864
Я вот попытался, но какая-то ерунда получилось. Сишный препроцессор не умеет в рекурсию
>> No.26867 Reply
>>26865
Ещё бы. Как в сишном макросе выйти из рекурсии если ветвления нет ни в каком виде?
>> No.26876 Reply
>>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 Reply
>>26876
вместо src *src
>> No.26878 Reply
>>26876
вместо src &src
>> No.26884 Reply
File: arrayexperiments.c
C, 0.00 KB, 0 lines - Click the image to get file
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 Reply
Что вы здесь за пиздец развели? Все нормальные компиляторы уже давно умеют так:
#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 Reply
>>26884
на самом деле src надо заменить на src-669AA582-7F8A-4B9A-AAD6-693DF777D3A8 еще, потмоу что инициализацию src эта штука завалит
PS на син не писал лет 5, забыл немного уже

кстати, можешь размятся и запилить отдельную версию для #ifdef DEBUG, потому что она дохера небезопасная
>> No.26889 Reply
>>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 Reply
>>26884
Поздновато я в этот тред зашел. Чувак, ты устроил феерию быдлокодинга. Возьми M4 уже.
>> No.26900 Reply
>>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 Reply
>>26900
> Так пока не умеют, так что пользуй memcpy:
Ну так в макросе этот memcpy и используется. Создается временный массив и копируется
> Можешь написать отдельную функцию для этого
Функции с переменным числом аргументов не инлайнятся
> Но уж макробыдлокод разводить — это просто зверство.
Чем этот макробыдлокод хуже этого
    int _[] = {6, 28, 222, 33};
    memcpy(a, _, 4 * sizeof(int));
?
>> No.26939 Reply
>>26909
> Функции с переменным числом аргументов
Не нужны. Нормальные компиляторы умеют в анонимные массивы:
memcpy(a, (int[]){7, 29, 224, 36}, 4 * sizeof(int));
>> No.26977 Reply
>>26939
это c99 или c11?
>> No.26980 Reply
>>26977
С -std=c99 у меня компилится и работает, значит ещё с C99.
>> No.27324 Reply
как узнать максимально допустимый alloca(число) ?
(GCC x86-64 Linux)
>> No.27325 Reply
>>27324
ХЗ, из того, что нагуглил, все говорят, что это очень зависит от системы, так что пиши тестовую функцию, которая выделяет при каждом вызове всё больше памяти на стеке пока не выскочит сегфолт. Ну, или пользуй массивы переменной длины (не путать с динамическими массивами). Благо, они тоже с C99 есть.
>> No.27334 Reply
>>27325
> Ну, или пользуй массивы переменной длины
А в чем отличия этих двух строчек?
type a[n];
type *a = alloca( n*sizeof(type) );
>> No.27335 Reply
>>27334
в первой строчке n приводится к типу const long, во второй к типу long
>> No.27336 Reply
>>27334
и да, вторую никода в жизни не развернут в times n db 0
>> No.27340 Reply
Я это к тому, что для массивов переменной длинны тоже непонятно как узнать максимально допустимый размер `type a[число];'
>> No.27341 Reply
>>27334
В размере и замыле, очевидно же!
>> No.27393 Reply
>>27334
В первом случае, например, нельзя переопределить указать a. Или можно?
>> No.27394 Reply
>>27393
s/указать/указатель
>> No.27532 Reply
Как-нибудь можно не указывать список типов, принимаемых функцией, если функция эта принимается в другой функцией (коллбек). Например такой код:
#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 Reply
>>27532
Передай в функцию указатель на воид, а уже внутри скастуй этот указатель в указатель на функцию с требуемой сигнатурой и вызови. А вообще это неправильно, так как теряется информация о типе и можно передать что хочешь и никак не проверишь потом. Я бы за такое отрубал бы руки.
>> No.27537 Reply
>>27533
если обернуть это дело в typedef, руки уже можно не отрывать
>> No.27538 Reply
>>27537
а еще лучше в класс, который имеет метаданные о сигнатуре и выстреливает экспешн сам
>> No.27556 Reply
>>27538
Из чего сделать класс в чистом С?
>> No.27557 Reply
>>27556
Из говна и палок, как и всё остальное.
Сделай структуру и функцию, которая будет выделять память и копировать в выделенную память эту структуру.
>> No.27558 Reply
>>27556
в чистом си тайпдефы и надпись ПРИМЕНЯТЬ ОЧЕ ОСТОРОЖНО
А вообще myCall(pFun,&res,a,b,c) никто не отменял (С сигнатурой int myCall(MyFun* pFun,void* res,...)
>> No.27593 Reply
>>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 Reply
>>27593
нет. Написали же, костыль, чего ты выпендриваешся. Структурам измоморфны только POD-классы, но в этой задаче большего и не нужно
>> No.27601 Reply
>>27600
> Написали же, костыль, чего ты выпендриваешся
ОК, в С это костыль. А в плюсах что? В плюсах нужно писать отдельные функции, чтобы быстро перекидывать данные из обычного массива в развернутый связный список?
>> No.27602 Reply
>> No.27603 Reply
>>27602
> /list/list/list/
xzibit.h
>> No.27606 Reply
>>27601
нет. Данные можно копировать и через виртуальный буфер, если захотеть. В stl это уже реализованно
>> No.27686 Reply
>>27538>>27556
Есть мнение, что лучше использовать <язык-1>, чем делать кривой <язык-1> из <язык-2>. Либо писать на <язык-2> в духе <язык-2>, раз уж был выбран он.
>> No.27704 Reply
>>27686
по поводу c++ не понял твоего юмора. Даже в хаскеле функтор это класс, ибо нефиг без обертки пускать указатели на функции с нестабильным поведением. Или ты намекаешь на какое то динамическое говно типа лиспа, чтобы потом ловить ошибки
>> No.27706 Reply
>>27686
Лучше писать реализовывать абстрактные алгоритмические концепции на языке, который лучше всего для них подходит. «Такого языка нет» — дешевая отмазка. Грамотный программист наизнанку вывернется, но реализует первоклассные модули с сабтайпингом, если ему понадобится, хоть на Brainfuck.
>> No.27713 Reply
>>27706
Наизнанку будут выворачиваться обезьянки и фанаты. Грамотный программист знает цену времени, затраченного на выполнение задания.
>> No.27714 Reply
>>27713
> Грамотный программист знает цену времени, затраченного на выполнение задания.
...и поэтому будет использовать наиболее подходящий под необходимые ему концепции ЯП.
>> No.27717 Reply
>> No.27736 Reply
>>27714
Да, именно это я и хотел сказать.
>> No.28022 Reply
>>27704
Я о том, что дело начиналось с С, потом посоветовали подход С++ (>>27538), стали обсуждать, как его реализовать на С (>>27556). Нет смысла повторять работу Бьярне и делать С++ из С: если С++ больше подходит, то проще сразу писать на нём; если же по каким-то причинам нужно/хочется писать на С, то писать стоит и в духе С.
"Язык-1" - это С++, а "язык-2" - С.
>> No.28023 Reply
>>28022
ООП на С можно через gobject. И еще есть Vala которая через этот gobject работает
>> No.28024 Reply
>>28023
Можно, и много ещё интересного можно сделать, но зачем? Если, конечно, не ради развлечения/обучения или не обусловлено это явно ситуацией.
Хотя, если даже нет явных причин писать на языке с использованием парадигмы, им не поддерживаемой, но получается совмещать развлечение и обучение с выполнением задач, то почему бы и нет? С "нет смысла" я погорячился.
>> No.28029 Reply
>>28024
ну ВНЕЗАПНО для написания оконных интерфейсов gtk.
>> No.28033 Reply
>>28029
Одно дело, когда классы описаны за тебя и ты используешь готовую библиотеку (GTK+), а другое - когда тебе нужно систему классов описать в рамках объектного костыля для C под названием GObject.
>> No.28084 Reply
>>28033
Будто плюсы это не объектный костыль для С
>> No.28086 Reply
>>28023
> ООП на С можно через gobject
там все те же самые конструкции, что и на С++, но теперь их нужно писать в коде, а на плюсах они генерируются компилятором.
>> No.28087 Reply
>>28086
Можно заюзать препроцессор для С под названием Vala, который генерирует код. Кто-нибудь пробовал эту Vala использовать? Что можете сказать?
>> No.28090 Reply
>>28087
Гномоговно, прибитое гвоздями к gtk и gobject. Лучше уж Qt или D.
>> No.28095 Reply
Qt же тоже препроцессор и макросы использует, Meta Object Compiler называется.
>> No.28096 Reply
>>28095
В проекте на Qt я могу: 1) использовать или не использовать qt-шные макросы, 2) использовать стандартные или сторонние либы C++ и идеомы, 3) использовать сишные либы и подавляющее чисто чистосишных идеом. На vala можно лишь написать биндинг к чистосишный либе; кроссплатформенности нет; комьюнити мизерное.
>> No.28106 Reply
>>28096
Плюсоводы такие смешные. "Я буду использовать костыль, потому что этот костыль даёт свободу перестать им пользоваться - я могу начать носить его под мышкой. С++ - язык для свободолюбивых программистов!"
>> No.28122 Reply
тем временем qt 5
>> No.28123 Reply
>>28106
Однако же нет языка, который мог бы конкурировать с плюсами.
>> No.28124 Reply
>>28123
Смотря по каким параметрам. Что, например, такого могут плюсы, чего не могут нормальные языки вроде C#? Разумеется, кроме костыльного множественного наследования, доставляющего плюсоводам великое множество проблем.
>> No.28125 Reply
>>28124
> вроде C#
И сразу быстрофикс: имелось в виду "вроде C#, Java и многих других управляемых языков", конечно же.
>> No.28126 Reply
File: _217286.jpg
Jpg, 105.16 KB, 1920×1080 - Click the image to expand
edit Find source with google Find source with iqdb
_217286.jpg
>>28124
Зелено.
>> No.28127 Reply
>>28124
Назови сначала, что твои любимцы могут.
>> No.28128 Reply
>>28127
Например, мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода. Плюс лямбды, свойства и горы синтаксического сахара, которых в C++ нет и, наверное, уже не будет.
>> No.28129 Reply
>>28128
Да, и нормальная модель ООП вместо C++-костыля.
>> No.28142 Reply
>>28128
Лямбды в новом стандарте добавлены, синтаксический сахар - тоже.
> мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода
Кроссплатформенные приложения на C# до сих пор не пишут, стандартная библиотека вообще гвоздями к .NET прибита. Трудозатраты/быстродействие - дилемма, и тут выбор язык от задач зависит, никак не преимущество/недостаток какого-либо языка.
> Да, и нормальная модель ООП вместо C++-костыля.
Что же не поддерживает из ООП C++, чтобы его нельзя было назвать "нормальным объекто-ориентированным" языком?
>> No.28143 Reply
>>28142
> Кроссплатформенные приложения на C# до сих пор не пишут
Кроссплатформенность между десктопами, телефонами и игровыми консолями - это тоже кроссплатформенность.
> стандартная библиотека вообще гвоздями к .NET прибита.
Не вижу минусов. C# вообще не планировался для запуска приложений вне окружения .NET, поэтому его стандартная библиотека осталась жёстко стандартизованной - это спасло язык от зоопарка типов. По крайней мере, в C# невозможна ситуация, когда в одном приложении используются типы bool, BOOL, VARIANT_BOOL и какие-нибудь __bool и QBool.
> Что же не поддерживает из ООП C++
Не "не поддерживает", а "криво поддерживает". Существование самостоятельных функций и операторов в ООП-языке - это самый настоящий костыль, ящитаю. Множественное наследование и проблемы ромбовидного наследования. Проблемы с видимостью членов классов (приватные виртуальные методы, которые можно перегружать - это вообще пушка). Это из того, что вспомнил навскидку.
>> No.28145 Reply
>>28128
> Например, мой любимый C# может всё то, что может C++, только с гораздо меньшими трудозатратами и большим удовольствием от процесса написания кода.
C# не может быть скомпилирован напрямую в инструкции ассемблера (только в CIL). Как следствие, возрастают требования к аппаратным ресурсам + необходимость держать .NET рантайм для пережевывания этого CIL. Непригоден для написания драйверов
>> No.28146 Reply
>>28145
> C# не может быть скомпилирован напрямую в инструкции ассемблера (только в CIL)
Хотя на этот случай есть Native Image Generator http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx
Но дотнет при этом все равно нужен
>> No.28164 Reply
>>28145
> C# не может быть скомпилирован напрямую в инструкции ассемблера
Может, ты и сам вспомнил про ngen.
> необходимость держать .NET рантайм для пережевывания этого CIL
Как будто у плюсовых программ такой проблемы нет. Каждая вторая требует установленного Visual C++ Redistributable нужной версии или тащит с собой свою копию msvcr*.dll.
> Непригоден для написания драйверов
Да, такой низкий уровень недоступен для C#. В качестве утешения могу разве что вспомнить про .NET Micro Framework - его рантайм (tinyCLR) пишется на С(++), но в теории ничто не мешает написать над ним либу, которая бы переводила человечный API управления каким-нибудь периферийным девайсом в дрыганье GPIO-пинами. Поэтому чисто теоретически можно предположить, что в некоторых случаях драйвера таки можно писать на C#.
>> No.28172 Reply
>>28164
> Каждая вторая требует установленного Visual C++ Redistributable нужной версии
Это виндопроблемы (DLL hell)
> или тащит с собой свою копию msvcr*.dll.
Это они так борятся с DLL hell
Еще есть вариант статической линковки, коророго нет в .NET
http://russian.joelonsoftware.com/Articles/PleaseSirMayIHaveaLinker.html
>> No.28173 Reply
>>28172
> статической линковки, коророго нет в.NET
с помошью нехитрого костыля можно все управляемые библиотеки объединить в одну.
>> No.28174 Reply
> борются
самофикс
>> No.28177 Reply
File: Anders-Behring-Breivik-008.jpg
Jpg, 27.56 KB, 460×276 - Click the image to expand
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 Reply
>>28173
Я в том смысле, чтобы засунуть часть .NET в программу, чтобы она не требовала этого .NET такой-то там версии установленного в систему
>> No.28179 Reply
>>28178
Сильно толсто выйдет.
>> No.28184 Reply
>>28177
> и программа, написанная для x86, не запускалась на AMD64;
Чушь. AMD64 обратно совместим с x86
>> No.28185 Reply
>>28184
А ты ничего не путаешь? Может, это 64-ёхбитные процессоры от Intel совместимы и с x86, и с AMD64?
>> No.28186 Reply
>> No.28187 Reply
>>28184
Ересь. Прямо совместим, обратно не совместим. Обратно никак не получится, потому что, например, регистров больше.
>> No.28193 Reply
>>28172
> Еще есть вариант статической линковки, коророго нет в .NET
1. Засовываешь dll ку в ресурсы
2. В рантайме подгружаешь.
2. Profit!!!
>> No.28194 Reply
File: Valente-tribal2.jpg
Jpg, 579.70 KB, 5086×2847 - Click the image to expand
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 Reply
>>28194
> Альтернативный вариант развития событий:
Есть еще вариант ПЕРЕКОМПИЛИРОВАТЬ. Но в вендомирке не привыкли делиться исходниками.
>> No.28296 Reply
File: path8946.png
Png, 21.83 KB, 637×246 - Click the image to expand
edit Find source with google Find source with iqdb
path8946.png
Существуют ли визуализаторы исходного кода типа пикрилейтед? Чтобы по исходнику такое строило
>> No.28298 Reply
>>28296
Читал где-то, что для Python такая штука была. Названия не помню.
>> No.28299 Reply
>>28296
Напиши свою. Только блоки алгоритма сделай стандартными и добавь поддержку спецкоментариев.
>> No.28358 Reply
>>28299
Как в этих блок-схемах можно наглядно показывать указатель на указатель на указатель, бегающий по триде-массиву, например?
>> No.28359 Reply
>>28358
Копай в сторону register allocation, алгоримт расскраски etc.
>> No.28500 Reply
Оставлю тут немного своего байтоебства
#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 Reply
>>28500
> printf("%"PRId64, *a);
а что означает вот это место?
>> No.28518 Reply
>>28507
Это означает "напечатать uint64_t число"
В стандарте C99 про это есть.
http://www.delorie.com/djgpp/doc/libc/libc_623.html
>> No.28520 Reply
Вообще, правильнее использовать там PRIu64
>> No.28521 Reply
Т.е. PRId64 вообще для знакового int64_t
Но тут знакового никак не может получиться.
>> No.28522 Reply
File: котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
Jpeg, 63.88 KB, 578×609 - Click the image to expand
edit Find source with google Find source with iqdb
котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
>>28358
Примерно вот так.
>> No.28538 Reply
>>28522
> котэ-поехавший-зеленый-слоник-песочница-128719.jpeg
Мне почему-то вспомнился няша-няшильда-няшечка-песочница-тред.
>> No.28539 Reply
File: песочница-няша-няшильда-няшка-76655.jpeg
Jpeg, 137.93 KB, 538×807 - Click the image to expand
edit Find source with google Find source with iqdb
песочница-няша-няшильда-няшка-76655.jpeg
>>28538
Извиняюсь, картинка отклеилась.
>> No.28561 Reply
Требую пак с песочницей!
>> No.28563 Reply
>>28561
http://joyreactor.cc/post/163156 Моё гугл-фу не оче, но хоть что-то.
>> No.28618 Reply
File: 1343726876039.png
Png, 404.79 KB, 1600×1200 - Click the image to expand
edit Find source with google Find source with iqdb
1343726876039.png
>>28539
> песочница-няша-няшильда-няшка
thread go
>> No.28721 Reply
>>3901
Анон, рассуждаю абсолютно так же, как и на пике, только не вслух. Я сильно плохой?
>> No.28723 Reply
>>28721
Пфф, у нас на работе некоторые программизды и поядренее матюгаются.
>> No.28724 Reply
File: hacskel.png
Png, 94.70 KB, 378×480
edit Find source with google Find source with iqdb
hacskel.png
File: 1260353211336.png
Png, 67.79 KB, 317×372
edit Find source with google Find source with iqdb
1260353211336.png

Вот еще
>> No.28726 Reply
посоветуйте как быстро научится в рамках кутей, а не Pure C + ООП
>> No.28727 Reply
>>28726
научится думать
>> No.28739 Reply
>>28727
Кто научится?
>> No.28744 Reply
>>28721
Рассуждаю так вслух на олимпиадах. Всё вроде бы ок.
>> No.28765 Reply
Я тут пытаюсь минимальную программу под 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 Reply
>>28765
почитай Loaders & Linkers и не задавай глупых вопросов
и попробуй -O3
>> No.28768 Reply
>>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 Reply
>>28768
Сам нашел про __builtin_unreachable(); и __attribute__ ((noreturn)) Надо бы побольше читать документацию к gcc
>> No.28770 Reply
>>28769
Как у байтоёбов всё сложно.
>> No.28775 Reply
>>28769
Найди там ещё что-нибудь про syscall, наверняка есть в target-specific опциях компилятора.

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

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

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

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

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

Отдельно стоит отметить лишп, который сам по себе нормальный язык аля дедушка форт, но усодомирован до состояния "у меня уже функциональный синтаксис, но еще императивная структура".
>> No.28843 Reply
>>28837
> Просто признай, что скриптовые языки - удел слабых програмистов.
Удел продуктивных программистов, так-то.
>> No.28845 Reply
>>28837
Нормальные мужики выбирают языки, на которых быстрее всего будет программу написать. Это может оказаться и Java, и Python, и даже PHP. «Слабость», «императивная структура», «нормальность» ебёт исключительно борщеедов, которымх пла кормят одинаково за говнокод и за качественные решения.
>> No.28848 Reply
>>28837
> компилируемые в приличный байткод (C, C++, Pascal)
C, C++, Pascal компилируются в машинный код. В байткод компилируются явы и дотнеты всякие
>> No.28850 Reply
>>28845
> Нормальные мужики выбирают языки, на которых быстрее всего будет программу написать.
Язык программирования - инструмент. Одни инструменты подходят для одних задач, другие - для других. Если писать числодробильную программу моделирования каких-нибудь физических процессов на скриптовом языке, специально предназначенном для быстроты разработки в ущерб быстродействию готового кода, в итоге получим тормозную хуиту.
>> No.28859 Reply
>>28850
Ну, то есть, да.
>> No.28860 Reply
>>28850
проблема в том, что развертывание на тех же кутях не сильно медленнее руби/пейтона/ришоточки. Если речь не идет о вебе офк
>> No.28879 Reply
>>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 Reply
File: ring_buf.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
ring_buf.c
Моя реализация кольцевого буфера. Лицензия пусть будет WTFPL
>> No.30599 Reply
File: circ_buf.c
C, 0.00 KB, 0 lines - Click the image to get file
view edit
circ_buf.c
>>30591
Немного самофикс. Потом еще улучшу, чтобы размер увеличивался при полном заполнении. Можно будет circ_buf_push_tail и circ_buf_push_tail завернуть в макрос, потому что теперь они почти одинаковые. Есть ли замечания по коду?
>> No.30600 Reply
>>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 Reply
>>28848
На самом деле, в байткод код на этих трёх языках компилировать тоже можно.
мимозануда
>> No.30638 Reply
>>30615
Во что угодно тьюринг-полное можно скомпилировать что угодно тьюринг-полное.
>> No.30640 Reply
>>30638
Но не за конечное время.
Post was modified last time at 2013-04-04 02:26:52
>> No.49760 Reply
File: 1489298550113199376.jpg
Jpg, 46.80 KB, 476×540 - Click the image to expand
edit Find source with google Find source with iqdb
1489298550113199376.jpg
Эхх, это мой тред 10-летней давности, когда я самостоятельно сишку осваивал. Сишку освоил, пишу прошивки под контроллеры. А плюсы - говно, не рекомендую. Надо бы какой-нибудь Haskell или Lisp выучить для общего развития.
>> No.49767 Reply
File: 298.jpg
Jpg, 65.12 KB, 348×600 - Click the image to expand
edit Find source with google Find source with iqdb
298.jpg
>>49760
А теперь, няша, расскажи до какого порога осваивал? Какой возраст ну хотя бы примерно? Что посоветуешь нюфагу, есть ли смысл пушить МК без особого знания ТОЭ? Куда ещё можно отправится от сишечки?
>> No.49768 Reply
File: 122476732288.jpg
Jpg, 213.18 KB, 480×640 - Click the image to expand
edit Find source with google Find source with iqdb
122476732288.jpg
>>49767
> А теперь, няша, расскажи до какого порога осваивал?
Не знаю насчет порогов, не очень понятный для меня вопрос. Скажем так, я дошел до того, что читал драфты стандартов и отправлял багрепорты разрабам GCC.
> Какой возраст ну хотя бы примерно?
Примерно 30
> Что посоветуешь нюфагу, есть ли смысл пушить МК без особого знания ТОЭ?
Не уверен насчет моих советов, может быть они будут глупыми, вредными и плохими но попробую. Винду на самых начальных этапах лучше не использовать, полновесные сложные IDE тоже не использовать - надо чтоб процесс сборки программы не был какой-то непонятной магией, которая происходит по нажатию кнопочки в какой-то IDE. Надо понимать про единицы трансляции, объектные файлы, стадии линковки, символы всякие в объектных файлах и проч. Не лишним будет умение писать что-то на ассемблере, понимание вещей "что такое системный вызов?", "что такое ABI, API?", ну и всякие знания базовых алгоритмов и структур данных, можно всякие алгоритмы обхода деревьев и алгоритмов сортировок реализовывать в тренировочных целях, вообще это достаточно интересно. Можно всякие олимпиадные задачки решать. Можно углубиться в устройство операционных систем, что есть в ОС планировшик, который переключает процессы по определенным правилам... а еще есть всякие мьютексы, семафоры, масса всяких таких вещей, перечислять можно очень долго. Я думаю что очень важно, чтобы сам процесс программирования был интересен, как и процесс чтения кода, исправления ошибок там. Советую не заставлять себя через силу учить программирование ради каких-то больших айти-зарплат. Если сам процесс программирования ощущается какой-то нудно-утомительной ерундой, и делается это только чтоб поднять потом на этом денег, без удовольствия от процесса, лучше не надо этим заниматься, в мире полно других профессий.

Если отвечать на вопрос "С чего начать?" - можно начать с прохождения K&R или Дейтела какого-нибудь. В Дейтеле много воды, К&R как-то компактней. Там потом с остальными вещами можно как-нибудь разобраться, есть отдельные специальные книги по Unix-Posix штукам всяким, есть про программирование драйверов для Linux ядра, есть про всякие виндовс-специфичные вещи, есть про DirectX или OpenGL и прочее прочее - выбираешь направление и углубляешь свои знания в этом.

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

> Куда ещё можно отправится от сишечки?
Ну можно в C++ (хотя мне он не нравится), можно на Java переучиться, или там на C#. Если знаешь какой-то язык программирования, будешь легче выучивать какие-то другие языки, отталкиваясь от этих знаний. Если язык синтаксически-семантически-парадигменно похож на тот, что ты уже знаешь - будет легче переходить.
>> No.49770 Reply
>>49768
> Винду на самых начальных этапах лучше не использовать
Правильно, вместо того, чтобы иногда трахаться со сборкой редких либ, пусть постоянно трахается с системой. Да и с редакторами там всё хорошо: я вот сейчас на этом свободном линуксе использую саблайм и вскод. Почему? Потому что всё остальное - несусветное говно. Поэтому, видимо, люди и используют вимы с емаксами - остальное ещё хуже.
> надо чтоб процесс сборки программы не был какой-то непонятной магией
Кто же вам это в голову вложил-то? Что же вы все как заводные эту ерунду повторяете? Во-первых, на начальных этапах обучения, чем меньше информации тебе надо разгребать, тем лучше. Во-вторых, вы все так пишите, будто бы это какие-то сакральные знания. Ну, да, надо сначала скомпилировать файл, потом его надо слинковать, и только после этого можно запускать. Собственно, поздравляю, вы только что выучили, как проходит этот мистический процесс сборки.
Но тут есть несколько проблем:
1. Почему-то все забывают, что процесс компилирования выглядит не так. На самом деле - это препроцессинг -> компиляция -> компиляция -> линковка.
2. Не смотря на то, что в пункте 1 я соврал, я не соврал.
3. Никто не запрещает (и люди делают) иметь интерпретатор С, в котором никакой компиляции и линковки не будет.
4. Все почему-то забывают, что тот же гцц точно так же скрывает от тебя столько, сколько может, и компилировать ты им будешь примерно так: gcc file.c -o file.exe
5. Все почему-то забывают, что С - это не гцц/мсвц и даже не вставь-сюда-свой-любимый-компилятор, и копание в его опциях - это а) не имеет никакого отношения к языку С, и б) можно освоить, когда это будет нужно.
> С чего начать
K.N. King - C programming a modern approach
Учит программированию используя с99 и при этом рассказывая про с89 там, где они отличаются. Единственный недостаток - он рассказывает, как делать большинство заданий (кроме самых простых), поэтому их останется только закодировать.
>> No.49771 Reply
>>49768
> Не знаю насчет порогов, не очень понятный для меня вопрос. Скажем так, я дошел до того, что читал драфты стандартов и отправлял багрепорты разрабам GCC
Ну это как минимум круто. Я вот драфты через силу накатывал.

> полновесные сложные IDE тоже не использовать
Gedit и gnu binutils - весь мой "IDE".
> надо чтоб процесс сборки программы не был какой-то непонятной магией, которая происходит по нажатию кнопочки в какой-то IDE. Надо понимать про единицы трансляции, объектные файлы, стадии линковки, символы всякие в объектных файлах и проч.
Препроцессирование-->получение ассемблерного кода-->получение объектных файлов-->линковка.
А вот что там искать в объектных файлах?
> Не лишним будет умение писать что-то на ассемблере,
Ну какой-нибудь хеллоуворлд или memcpy() накалякаю без проблем.
даже jсс->jmp пропатчить смогу, как хацкер
> понимание вещей "что такое системный вызов?", "что такое ABI, API?",
Я надеюсь именно понимание, а не спрос за все подводные?
> ну и всякие знания базовых алгоритмов и структур данных, можно всякие алгоритмы обхода деревьев и алгоритмов сортировок реализовывать в тренировочных целях, вообще это достаточно интересно. Можно всякие олимпиадные задачки решать.
Угорел по этой теме месяца 3-4 назад, тоже запилил своё кольцо буферов с интерфейсом, перерешал десяток другой задачек разной сложности, а сейчас дописываю транслятор из арифметической строки в псевдоассемблер(вроде с КодВорс). Это всё весело и забавно конечно, но свой тру-конпелятор я уже наврятли когда-нибудь напишу.

> Я думаю что очень важно, чтобы сам процесс программирования был интересен, как и процесс чтения кода, исправления ошибок там.
Советую не заставлять себя через силу учить программирование ради каких-то больших айти-зарплат. Если сам процесс программирования ощущается какой-то нудно-утомительной ерундой, и делается это только чтоб поднять потом на этом денег, без удовольствия от процесса, лучше не надо этим заниматься, в мире полно других профессий.
Оно не может быть неинтересно, ОП, но вопрос больше о порогах и профориентации. Я бы вот с радостью учил парсеры, теорию компиляторов, ударился в прочий кампутер сайенс, но кормить меня за это никто не будет.
Или пошел бы в реверс, копаясь в чужом коде и байт-коде, но сколько же нужно глаз и руку набивать, чтобы взяли на работку? А есть еще драйверописательство, юниксокопательство, теже МК, ухххх.. жаль лишь хитпоинт только один.
В любом случае ты молодец. Я просто тред читал и себя узнал где-то в поинте 2013 года, потому и спросил.
Асло для новичка я бы посоветал КР(но не до конца), а дальше Шилдта в качестве мануала и man7 заодно.
>> No.49772 Reply
>>49770
> Правильно, вместо того, чтобы иногда трахаться со сборкой редких либ, пусть постоянно трахается с системой.
А можно пруфы, что в винде с системой надо меньше трахаться?
> Кто же вам это в голову вложил-то?
Никто. Личный опыт
> Что же вы все как заводные эту ерунду повторяете?
Докажи что ерунда.
> Во-первых, на начальных этапах обучения, чем меньше информации тебе надо разгребать, тем лучше.
Ничего сложного нет в том, чтобы понимать, что есть компилятор, который принимает на вход файлы с расширением .c и с такими-то опциями выдает бинарник.
> Во-вторых, вы все так пишите, будто бы это какие-то сакральные знания.
Я б не сказал что прям сакральные. Но некоторые вот и шагу ступить не могут без своей идешечки с волшебными кнопочками, которые там что-то непонятное делают и получается бинарь.
> 1. Почему-то все забывают, что процесс компилирования выглядит не так. На самом деле - это препроцессинг -> компиляция -> компиляция -> линковка.
Не всегда.
> 2. Не смотря на то, что в пункте 1 я соврал, я не соврал.
Ну-ну...
> 3. Никто не запрещает (и люди делают) иметь интерпретатор С, в котором никакой компиляции и линковки не будет.
Можно. И?
> 4. Все почему-то забывают, что тот же гцц точно так же скрывает от тебя столько, сколько может, и компилировать ты им будешь примерно так: gcc file.c -o file.exe
Ну так можно открыть ман для gcc и почитать о разных опциях для сборки, что можно сделать объектный файл, можно объектные файлы потом руками слинковать линкером и так далее. А когда просто начинают с IDE с волшебной кнопочкой "build", никто об этом даже и не думает.
> 5. Все почему-то забывают, что С - это не гцц/мсвц и даже не вставь-сюда-свой-любимый-компилятор, и копание в его опциях - это а) не имеет никакого отношения к языку С, и б) можно освоить, когда это будет нужно.
А никто вроде и не заставляет в них сразу начинать копаться по полной.
>> No.49773 Reply
>>49772
Не хочу начинать линуксосрач, но. Винда просто работает. Линукс работает только если ты скачал сборку для "мигрантов с виндовс" и "для новичков", и так получилось, что тебя настройки этой сборки на 100% устраивают. Да и там часто всё будет работать до первого обновления.
Мне нужны две системы - одна для программирования в виртуалке (я раньше использовал для этого мою старенькую хр, но теперь под ней почти ничего не работает), и одну для старой машины. Я решил использовать для этого прыщи и потрогал за короткое время больше тридцати пяти разных дистрибутивов, так что у меня есть представление о том, что я говорю, и писать об этом я могу хорошо и долго. Вот, кстати, из этих 35+ дистрибутивов IME было в стандартной поставке и одновременно с этим работало только в федоре и центоси. То есть, было оно в поставке у около-десяти дистрибутивов, но работало после активации только в двух. Или тут можно рассказать про тёмную тему, которую ты ставишь в редакторе текста, и наслаждаешься чёрным текстом на тёмно-коричневом фоне. А иногда системная тёмная тема делает то же самое, и хорошо, если ты запомнил, где у тебя какие пункты в меню.
Или вот тебе квест:
1. Установи IME для японского.
2. Сделай переключение языков через alt+shift
3. Сделай включение японского ввода через alt+`
4. Хардмод - удали английскую раскладку из системы, оставив только латиницу из японской локали.
Как осилишь - напиши сюда дистрибутив, и как ты это сделал.
> Ничего сложного нет
И именно поэтому меня каждый раз коробит от этого "выучи процесс компиляции". Ну, вашу же матушку, там нечего учить. Это для меня выглядит, как если бы кто-то утверждал, что редакторы с автосохранением ненужны, потому что оно от тебя скрывает, что можно сохранять файл через меню или ctrl+s. И вот обязательно надо осиливать ручное сохранение.
> когда просто начинают с IDE с волшебной кнопочкой "build", никто об этом даже и не думает
И правильно делают, потому что 1. оно нафиг не нужно; 2. у них в ближайшее время будут более важные вещи, чтобы задумываться.
> И?
И тут вдруг оказывается, что осиленные с таким трудом Забытые Священные Знания Древних О Процессе Компиляции неприменимы.

Вообще, у меня есть теория обучения (которую придумал, скорее всего, не один я, но многие её не знают и не используют). По этой теории любые лишние знания в начале обучения бесполезны и (поэтому) вредны. И это та причина, по которой я ненавижу институты и школы, в которых ты сначала выучишь весь сопромат, химию и физику, и только после этого тебе покажут молоток и гвоздь, но пользоваться ими не научат, потому что ты же учёный с такой-то базой в виде теории в голове - сам разберёшься. А пальцы?.. - да кому они нужны в современном мире.
>> No.49774 Reply
>>49773
> Не хочу начинать линуксосрач, но. Винда просто работает.
Увы, но нет. Винда в последнее время просто так не работает, и постоянно выдает какие-то выкрутасы, в духе https://habr.com/ru/post/505194/
> Я решил использовать для этого прыщи и потрогал за короткое время больше тридцати пяти разных дистрибутивов, так что у меня есть представление о том, что я говорю, и писать об этом я могу хорошо и долго.
Я на винде тоже долго сидел, так что я тоже знаю, что говорю. Вот тебе например ссылка http://www.stolyarov.info/lessons/why_unix.html
> Вот, кстати, из этих 35+ дистрибутивов IME было в стандартной поставке и одновременно с этим работало только в федоре и центоси.
> Или вот тебе квест:
> ...
Не знаю насчет IME и японских языков, я этим не интересовался и мне это не нужно, японский язык мне вводить никуда не требуется. Может там и есть с этим какие-то грабли, но к программированию это отношения не имеет. Наверняка есть особые дистрибутивы для японцев, где эти проблемы решены из коробки.
> И именно поэтому меня каждый раз коробит от этого "выучи процесс компиляции". Ну, вашу же матушку, там нечего учить.
Ну вот это "нечего учить" пусть и выучат. А вот раньше меня в школе учили в Delphi просто набросать кнопочек на формочку нажимать какую-то кнопочку build, и вот так появляется рабочая программа.
> И правильно делают, потому что 1. оно нафиг не нужно; 2. у них в ближайшее время будут более важные вещи, чтобы задумываться.
Почему ты так считаешь? Аргументы есть?
> И тут вдруг оказывается, что осиленные с таким трудом Забытые Священные Знания Древних О Процессе Компиляции неприменимы.
А я разве где-то написал, что это трудно осиливать? И кстати, ведь можно например перейти с языка Си на какой-нибудь Haskell, и то же самое сказать, что вот осиленные с таким трудом Забытые Священные Знания Древних О Программировании На Си там неприменимы. Знания забивания гвоздей неприменимы для того, чтобы пилить бревно, значит забивание гвоздей это плохо?
По-моему ты каким-то передергиванием занимаешься. Я вообще никому ничего не навязываю, можете сидеть на винде и компилировать всё в вижуалстудии, я совершенно ничего не имею против. Меня спросили "что посоветуешь" - я посоветовал. Заранее написал "Не уверен насчет моих советов, может быть они будут глупыми, вредными и плохими но попробую.". Не нравится - игнорируй. Мне вообще лень кому-то что-то доказывать.
> Вообще, у меня есть теория обучения (которую придумал, скорее всего, не один я, но многие её не знают и не используют). По этой теории любые лишние знания в начале обучения бесполезны и (поэтому) вредны.
Рад за тебя. Но твоя теория может быть не верна.
>> No.49775 Reply
>>49774
> И кстати, ведь можно например перейти с языка Си на какой-нибудь Haskell, и то же самое сказать, что вот осиленные с таким трудом Забытые Священные Знания Древних О Программировании На Си там неприменимы.

Он собирается в ответвление сишки.
>> No.49776 Reply
>>49774
> выкрутасы
Это немного из другой оперы. Но я считаю, что последняя более-менее удобоваримая винда была семёркой (а первая - хп (и их было всего две)), так что я не в позиции что-то тут защищать. Но, как Касперски ещё когда-то давно сказал: если вам удобно и привыкли на винде, то и сидите на ней, а не занимайтесь ерундой. И я считаю, что рекомендация ньюфагам ставить прыщи - это сознательная диверсия с целью уменьшить себе конкуренцию на рынке труда.
> Наверняка есть особые дистрибутивы для японцев, где эти проблемы решены из коробки.
Ну, как всегда. УМВР, нинужно, и у вас дистрибутив неправильный. Японский-то (в большинстве случаев) работает. В большинстве случаев, конечно, не из коробки (и это очень интересно, когда ты выбираешь японский язык в настройках клавиатуры, а оно по-японски не пишет, но линуксовый-вей же; кто я, чтобы судить). Проблема тут - настроить.
> Ну вот это "нечего учить" пусть и выучат
Что выучат, если нечего? А в школе у тебя всё правильно было - обучение сверху вниз, называется. Надо будет чуть дальше формошлёпства погрузиться - тогда освоишь всё, что нужно.
> Аргументы есть
Тебе действительно нужны аргументы в пользу того, что человек севший осиливать программирование будет занят, собственно, осиливанием этого самого программирования, и у него на ближайшее время будет куча более интересных занятий, чем разгребание ключей компилятора?
> можно например перейти с языка Си на какой-нибудь Haskell
И опять у тебя некорректные сравнения, потому что хаскиль - это другой язык, а я тебе про самый обычный переход между реализациями одного языка в рамках даже одного стандарта.

Возможно, я слишком остро на это реагирую, но уж больно часто я слышу вот эту комбинацию из "ставь линукс, учи компиляцию, иде - магия, поэтому нинужно", будто им на ютубе какой-то модный блоггер рассказал, и все полезли повторять.
>> No.49777 Reply
>>49776
> Но, как Касперски ещё когда-то давно сказал: если вам удобно и привыкли на винде, то и сидите на ней, а не занимайтесь ерундой.
Для меня Касперски ни разу не авторитет в этом вопросе. Да и я никому ничего не навязывал, сидите где ходите. Меня спросили про рекомендации - я их дал.
> И я считаю, что рекомендация ньюфагам ставить прыщи - это сознательная диверсия с целью уменьшить себе конкуренцию на рынке труда.
Ну ок, я считаю иначе.
> Японский-то (в большинстве случаев) работает. В большинстве случаев, конечно, не из коробки (и это очень интересно, когда ты выбираешь японский язык в настройках клавиатуры, а оно по-японски не пишет, но линуксовый-вей же; кто я, чтобы судить). Проблема тут - настроить.
Ну вот я и предложил способ решения - взять какой-нибудь дистрибутив, который делают японцы для себя. В нем наверняка всё и так настроено из коробки, и ничего настраивать не требуется.
> Что выучат, если нечего?
Нет, не "нечего". Получить понимание, что есть отдельная штука "компилятор", есть отдельная штука "линкер", есть объектные файлы, есть ассемблер, есть динамические и статические либы... это по-твоему "нечего"?
> Тебе действительно нужны аргументы в пользу того, что человек севший осиливать программирование будет занят, собственно, осиливанием этого самого программирования, и у него на ближайшее время будет куча более интересных занятий, чем разгребание ключей компилятора?
Какое такое разгребание ключей? Блин... это разгребание на базовом уровне, достаточном чтобы получить из стольки-то .c файлов столько-то .o файлов, а потом это слинковать в исполняемый, оно от силы займет 30 минут. Только что ты говорил, что там учить нечего, а теперь говоришь про какое-то разгребание, что вообще происходит?
> И опять у тебя некорректные сравнения, потому что хаскиль - это другой язык, а я тебе про самый обычный переход между реализациями одного языка в рамках даже одного стандарта.
Т.е. хочешь сказать, что чтоб выучить флаги для MSVC после флагов от GCC, надо сильно много потратить времени?
> Возможно, я слишком остро на это реагирую, но уж больно часто я слышу вот эту комбинацию из "ставь линукс, учи компиляцию, иде - магия, поэтому нинужно", будто им на ютубе какой-то модный блоггер рассказал, и все полезли повторять.
Ну это мне не модный блоггер рассказал, а мой личный опыт.
>> No.49778 Reply
>>49771
> А вот что там искать в объектных файлах?
Ну например объектные файлы выставляют наружу некоторые символы. Скажем, static функции наружу не выставляются, а не-static - выставляются, и их можно вызывать из другого .c файла. Вот эти базовые вещи желательно понимать.

Отдельная тема - динамически загружаемые библиотеки (.dll, .so, .dylib) - как их подгружать, как такие-то функции из них вызвать и так далее.
> > понимание вещей "что такое системный вызов?", "что такое ABI, API?",
> Я надеюсь именно понимание, а не спрос за все подводные?
Ну все подводные обычно знать не надо, то только в узкой области может быть нужно, если разрабатываешь ядро или компилятор какой-нибудь. А общее понимание - да, полезно.
>> No.49780 Reply
>>49777
> Получить понимание, что есть отдельная штука "компилятор", есть отдельная штука "линкер", есть объектные файлы, есть ассемблер, есть динамические и статические либы... это по-твоему "нечего"?
Ну... да? То есть, ты только что всё описал. Но и это не нужно, потому что вот взял я сишный интерпретатор, и теперь у меня есть только магический бинарь и исходник. И ни компилятора, ни линкера, ни объектных файлов - ничего.
> это разгребание на базовом уровне, достаточном чтобы получить из стольки-то .c файлов столько-то .o файлов, а потом это слинковать в исполняемый, оно от силы займет 30 минут
Это, конечно же, неправда. Человек либо нагуглит, либо в книжке у него будет написана строка, которую нужно скопировать в консольку, и он её просто будет копировать. Займёт это гораздо меньше 30 минут. А вот если человек в начале обучения пойдёт читать гццшный мануал, или сделает --help=???, то уйдёт гораздо больше 30 минут, и пользы от этого особой не будет.
> Т.е. хочешь сказать, что чтоб выучить флаги для MSVC после флагов от GCC, надо сильно много потратить времени?
Я хочу сказать, что при переходе с компилятора на интерпретатор знания о компиляции и её флагах не перенесутся.

Если так уж хочется, чтобы "учили компиляцию", то советуйте, хотя бы, учить именно компиляцию. То есть, парсинг, деревья, оптимизации, генерацию кода и всё такое. В этом, хотя бы, смысл есть. Сейчас это выглядит так, будто первокурсникам рассказали, что вот эта вот кнопочка в ихневой иде, она не магия, а она компилирует (без подробностей), линкует (без подробностей, а то и не объясняя, что такое "линкует"), и только потом запускает. И они такие: "ох, нифига себе! вот оно как! пойду пацанам в интернете покажу, какой я теперь умный". Это примерно, как слово "алгоритм", или (как у тебя в ссылке выше (бай зе вей, там такая хрень написана, что я бы порекомендовал тебе пересмотреть своих авторитетов)) "алгебра".
>> No.49781 Reply
>>49780
> Но и это не нужно, потому что вот взял я сишный интерпретатор, и теперь у меня есть только магический бинарь и исходник.
А зачем ты его взял? Сишным интерпретаторм мне ни разу пользоваться не доводилось, зачем ты его в пример приводишь? Что ты этим хочешь показать? В 99.999% случаев язык Си "используют" через компилятор, а не через некий интерпретатор. И как ты бинарь из интерпретатора получать собрался?
> Сейчас это выглядит так, будто первокурсникам рассказали, что вот эта вот кнопочка в ихневой иде, она не магия, а она компилирует (без подробностей), линкует (без подробностей, а то и не объясняя, что такое "линкует"), и только потом запускает.
Почему "без подробностей"? Без каких подробностей? Почему ты мне приписываешь то, что я не писал?

Мне вот например доводилось писать и править сборочные скрипты, которые вообще ни от какой IDE не зависят, и там, да, нужно понимать про объектные файлы, которые потом таким-то образом линкуются. Это по-твоему бесполезные знания?
>> No.49782 Reply
>>49780
> Я хочу сказать, что при переходе с компилятора на интерпретатор знания о компиляции и её флагах не перенесутся.
Ну почему же не перенесутся. Часть перенесется. Флаги в компиляторе MSVC и в GCC будут другими, а общие принципы там те же. Объектные файлы, экспортируемые символы, линковка, бла-бла-бла...
>> No.49785 Reply
>>49782
Если уж говорить про интерпретатор Си или крестов, давайте рассмотрим реальный пример: https://root.cern.ch/cling
> Cling Metaprocessor provides convenient and easy to use interface for changing the interpreter's internal state or for executing handy commands. Cling provides the following metaprocessor commands:

> syntax: .(command), where command is:

> .x filename.cxx - loads filename and calls void filename() if defined
> .L library | filename.cxx - loads library or filename.cxx
> .printAST - shows the abstract syntax tree after each processed entity
> .I path - adds an include path
Там оказывается можно загружать какие-то библиотеки. Выходит, знания о разделяемых библиотеках оказываются не бесполезными?

Если поподробнее изучить возможности этого интерпретатора, окажется что он (сюрприз!) не совсем соответствует стандартному языку C или C++ - уже хотя бы потому, что в стандартах C и C++ режим интерпретатора как таковой вообще не описывается. Об этом можно почитать в статье https://www.researchgate.net/publication/256082045_Cling_-_The_New_Interactive_Interpreter_for_ROOT_6

Так что это уже получается немного другой язык, не C и не C++. Кстати, есть еще Jancy такой Си-подобный скриптовый язык https://habr.com/ru/company/tibbo/blog/258427/
>> No.49786 Reply
Когда чуть более года назад я начал учить Сишечку по K&R, то поставил в Окна какую-то аскетичную ИДЕ с названием наподобии Сстудио или такое да-да, я просто не помню названия, зато помню, что её индусы очень сильно любят. Ну поставил, шоб всё как у людей, а кроме редактора мне ничего и не нужно было. Однако в ней был местный отладчик! Нет, не тот что gdb с тысячами имён и оболочек, а местный самородок, создателями же спизженный/написанный, судя по его работе. Дичь начиналась уже с попыток отладить керниганоричивские removeTab() - оно просто не выдерживало подобное и часто зависал, проёбывал брейкпоинты, выдавал SegFault на пустом месте итд. Забив на такой отладчик, я ещё какое-то время дебажил принтами, но код со временем становился всё более сложным и сложным, и я понял, что без gdb мне дальше не уйти.
Узнал, что в юниксах все мне нужные вещи работают из коробки и переполз на убунту. Ну и пока норм, так как для меня все принципиальные различия между виндой и юниксом заключаются в различиях между ABI и API, а в дебри пока не лез. Всё таки соглашусь с мнением: если Си - значит нужон Unix.
Алсо какие флажки в gcc могут понадобиться ньюфагу кроме "--help -Ox -S -c -E -gx -fno/f-<something>"?
>> No.49787 Reply
>>49786
> Алсо какие флажки в gcc могут понадобиться ньюфагу кроме "--help -Ox -S -c -E -gx -fno/f-<something>"?
Например, компилировать с варнингами -Wall -Wextra - https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html. Опции из категории -fsanitize не будут лишними, описаны тут https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html

Ну и еще полезно в каком-нибудь Valgrind прогонять, но это уже не имеет отношения к компилятору
>> No.49792 Reply
>>49786
> какие флажки в gcc могут понадобиться ньюфагу
CFLAGS = \
-std=c89 -pedantic -Wall -Wextra -Wformat=2 \
-O3 -march=native -mtune=native -Wl,--build-id=none -s

-std=c89 -pedantic — строгая проверка соответствия кода стандарту ANSI C89. Он самый старый и самый переносимый между остальными компиляторами. Не обязательно.
-Wall -Wextra — куда ж без них. Для пущего эффекта можно добавить -Werror, любой ворнинг будет останавливать компиляцию; на любителя.
-Wformat=2 — проверка форматирования в printf. Нельзя вызывать printf(str) — если в str вдруг окажется строка с лишними спецификаторами (пользователь ввёл, например), будет undefined behaviour. Правильно: printf("%s", str) или fputs(str, stdout).
Это что касается статических проверок.
-O3 -march=native -mtune=native — оптимизации, о которых я пока мало знаю. Максимальная (-O3), для вот этого процессора (-mtune=native), и вот этой архитектуры (-march=native), на которых компилируется код.
-Wl,--build-id=none -s — флаги для линкера. Немножко уменьшает вес бинария и количество лишних секций, чтобы не мозолили глаза в дампах.
Остаются ещё две лишние, для их удаления придётся дополнительно вызвать
strip -R .note -R .comment $(BIN)

Рекомендую освоить make всем, кто ещё не. Очень экономит время.
Приложенный файл компилирует все исходники, каждый в свой бинарий. Можно вызывать make <имя>, чтобы скомпилять только один. Дополнение имён по табу должно срабатывать.
Для мелких учебных программок, состоящих из одного файла — в самый раз.
>> No.49795 Reply
File: Makefile.gz
Gz, 0.00 KB, 0 files - Click the image to get file
view
Makefile.gz
>>49792
> Приложенный файл
Забыл. Раз уж забыл, заодно поясню.
MAKEFLAGS = -rR
Отмена встроенных переменных и правил. Плюс к переносимости и скорости выполнения.

$(V).SILENT:
По умолчанию компиляция происходит молча. Выполняемая команда выводится, только если передать
$ make V=1


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]