Начало программирования.

Тема в разделе "WASM.BEGINNERS", создана пользователем Heineken, 22 ноя 2008.

  1. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    SII
    согласен :)
    только не я начинал холивар, я всего лишь ответил на один из постов, кодеров на паскалей, с просьбой привести код на Си.

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

    bugaga
    Это перегрузка, она ничего не имеет общего с переменным числом параметром
    такие фичи учат на Си практически на первых уроках :)

    SII
    № 159
    Никакой сложной читабельности в таких конструкциях нет, конечно же если надо писать километры кода - тогда да
    а когда нужно инициализировать две переменных, одна для начала массива, другая для конца массива, для одной задать прирощение +1, для другой -1 то такая запись будет очень и очень читабельна.

    Давайте не будем углубляться, что взяли С++ и Делфи из таких языков как Алгол, счас важнее то, что они берут друг от друга.
    А наблюдаем очень простую картину, как развивался делфи, сначала появились параметры по умолчанию, потом перегрузка :)
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    1) На клаву давить меньше надо
    2) Ум дисциплинирует
    А за читабельность кода... Ни в Pascal ни в С нечего делать без комментариев. Делаешь так. Пишешь перед циклом комментарии- что в первом поле делается, что во втором, что в третьем, зачем переменные инкременируются и так далее. Читаешь и всё понимаешь. Вся читабельность.
     
  3. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    а в си естьoperator ,
    она затмит собою все поскалевские достижения! ^_^

    ps: хотя даже осьмнадцатилетнему любому детине ясно что сейчас стОит программировать лишь на Лиспе и только на нём.
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    переменное число параметров выглядит так:
    label1.caption := format("%d%s%d=%d",[3,"+",4,3+4]);
     
  5. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    GoldFinch
    Извините, format - это аналог функции sprintf например
    но никак не образец пользовательской функции с переменным числом параметров.
    Могли б в качестве примера привести функцию Writeln :) что б далеко не рыскать :)
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    int main(){
    char a [24];
    int i= 0;
    a [0]= 67;
    while (a< 91&& i< 24) {
    a [i+1]= a[i++]+ 1;
    }
    return 0;
    }


    Можно было массив и явно инициализировать. Но этот код можно оформить в виде функции и употреблять где надо. Будет не длинее чем в Pascal объявление массива. Я за С, кто не понял.

    ... А можно было инициаоизацию и так написать:

    int main(){
    char a [24];
    int i= 0;
    a [0]= 67;
    while ((a[i+1]= a[i++]+ 1) < 91&& i< 24) { };
    return 0;
    }


    Это я прикалываюсь. Но работает...
    Видишь, я кручу как хочу тем, что знаю и умею. Вот она, свобода. Но комментарии всё равно всегда пишу. Кстати. Для читабельности.
    А можно было бы и максимально читабельным код сделать. Писать i= i+1 вместо i++
    Cмотрите сами, в общем.
     
  7. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    Для меня, как потребителя функции printf это не имеет ни какого значения, поскоку юзаться одно имя ф-кции, а стек пушиццо разное число и тип параметров.

    Код (Text):
    1. 00401E9B: E80CFFFFFF        call       .000401DAC
    2. 00401EA0: 68E41E4000        push        000401EE4
    3. 00401EA5: E87EFFFFFF        call        printf ;msvcrt  
    4. 00401EAA: 59                pop         ecx
    5. 00401EAB: 6878563412        push        012345678
    6. 00401EB0: 68EC1E4000        push        000401EEC  
    7. 00401EB5: E876FFFFFF        call        printf ;msvcrt
    8. 00401EBA: 83C408            add         esp,008
    9. 00401EBD: DB2DF41E4000      fld         t,[00401EF4]
    10. 00401EC3: E850F3FFFF        call       .000401218 ;sin
    11. 00401EC8: 83C4F8            add         esp,-008
    12. 00401ECB: DD1C24            fstp        q,[esp]
    13. 00401ECE: 9B                fwait
    14. 00401ECF: 68001F4000        push        000401F00
    15. 00401ED4: E85FFFFFFF        call        printf ;msvcrt
    16. 00401ED9: 83C40C            add         esp,00C ;
    Так что все претензии идут лесом.
    Его преимущества проявляються разве что на число-дробильном коде.
    Код (Text):
    1. 0040136C: F30F110424        movss       [esp],xmm0
    2. 00401371: F30F11442404      movss       [esp][04],xmm0
    3. 00401377: F30F11442408      movss       [esp][08],xmm0
    4. 0040137D: FF15A024D400      call        glColor3f ;OPENGL32
    5. 00401383: 83C4F4            add         esp,-00C
    6. 00401386: 0FB60E            movzx       ecx,b,[esi]
    7. 00401389: F30F2AD9          cvtsi2ss    xmm3,ecx
    8. 0040138D: 0FB64E01          movzx       ecx,b,[esi][01]
    9. 00401391: F30F111C24        movss       [esp],xmm3
    10. 00401396: F30F2AE1          cvtsi2ss    xmm4,ecx
    11. 0040139A: F30F11642404      movss       [esp][04],xmm4
    12. 004013A0: 0FB64E02          movzx       ecx,b,[esi][02]
    13. 004013A4: F30F2AC1          cvtsi2ss    xmm0,ecx
    14. 004013A8: F30F11442408      movss       [esp][08],xmm0
    15. 004013AE: FF15B824D400      call        glVertex3f ;OPENGL32
    И то, компиль не настока умен чтоб юзать пакеты скаляров, вмест одиночных.

    А на прикладухе почти такой же оптимайз как и у дельфе
    Код (Text):
    1. 00402E74: FF157C25D400      call        ShowWindow ;USER32
    2. 00402E7A: FF355C0ED400      push        d,[00D40E5C]
    3. 00402E80: FF158425D400      call        UpdateWindow ;USER32
    4. 00402E86: FF355C0ED400      push        d,[00D40E5C]
    5. 00402E8C: FF158025D400      call        GetDC ;USER32
    6. 00402E92: 8BF0              mov         esi,eax
    7. 00402E94: 33D2              xor         edx,edx
    8. 00402E96: 6A42              push        042
    9. 00402E98: FF354C0ED400      push        d,[00D40E4C]
    10. 00402E9E: FF35480ED400      push        d,[00D40E48]
    11. 00402EA4: 52                push        edx
    12. 00402EA5: 52                push        edx
    13. 00402EA6: 56                push        esi
    14. 00402EA7: FF154823D400      call        PatBlt ;GDI32
    15. 00402EAD: 56                push        esi
    16. 00402EAE: FF355C0ED400      push        d,[00D40E5C]
    17. 00402EB4: FF157025D400      call        ReleaseDC ;USER32
    18. 00402EBA: 8B8588744400      mov         eax,[ebp][00447488]
    19. 00402EC0: 8B0D940ED400      mov         ecx,[00D40E94]
    Да и смысл, мега-оптимайзить то что все равно потонет в тормозах RTL/API?

    (ммм... хстате фишку с xor-ом для пуша нолей дельфе тож использует =)))

    А вообще параметры мне както привычней иметь в 3-ёх регистрах в fastcall -овых вызовах, которые у дельфе по дефолту. В eax, edx, ecx. Все побыстрее и полутше, чем через стек, да и более по ассемблерски, да.
     
  8. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    А вот камень насчет читаемости кода в паскале и в с
    на Си:
    res = f1; // присваивание переменной
    res = f2(); // вызов функции без параметров
    res = f3(2); // вызов функции с параметрами
    тут все предельная ясно: скобки есть - значит вызывается функция, нет скобок - обычная переменная.

    На паскале:
    res := f1; // присваивание переменной
    res := f2; // вызов функции без параметров
    res := f3(2); // вызов функции с параметрами

    и чем в паскале вызов функции без параметров отличается от простого присваивания переменной? без поллитра не разобраться :) ну просто "отличная" читаемость кода.
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    beginner
    writeln это скорее оператор чем функция

    а если у тя есть функция f2 и переменная f1, могу только посочувствовать
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ты не говори загадками.
     
  11. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    GoldFinch
    ага, что ты имел ввиду? компилятор прекрасно выдаст сообщение об ошибке
    тока вопрос не в этом
    по синтаксису в паскале вызов функции без параметров и присваивание переменной - абсолютно ничем не отличаются. И это в языке, который позиционируется для обучения... представляю, как будет "легко" начинающему программисту разбираться в подобном коде. :)))))

    Интересно, так Writeln - оператор или функция?
    Пациент скорее жив, чем мертв? :))) Похоже те кто придумал паскаль, сами не знают что это такое :)))
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Вот именно
     
  13. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    beginner
    Я имею в виду, что различие между функцией и переменной должно заключаться в ее названии. Если идентификаторы имеют осмысленные названия, никакой путаницы не возникнет.
    Однобуквенное имя+цифра для функции - это не есть хорошо, а для переменной это хорошо только если эта буква несет какой-то смысл, как то x1,z3,...

    Я думаю следует называть подпрограммой (процедурой\функцией) - обособленный кусок кода, который вызывается в другом коде, и куда передаются параметры. А оператором - то что не вызывается, а компилируется на месте. Так вот в паскале writeln("1",2) не компилируется как вызов подпрограммы "writeln" с параметрами ("1",2), а компилируется как последовательность вызовов внутренних подпрограмм языка, для каждого случая разных.

    Алсо abs() sqrt() - это операторы, а не подпрограммы.
     
  14. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    глядите шире -- вся program myProgram begin end. это один оператор. и он "компилируется на месте"
    ;)
     
  15. beginner

    beginner New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    233
    GoldFinch
    кудато вас занесло не в ту степь :)
    однобуквенные названия - это всего лишь пример, на их месте могут быть любые осмысленные названия.
    И зачем такие сложности в таком языке, который якобы очень прост в изучении?
    Начинающий программер будет постоянно путаться в операторах, в функциях, в процедурах. Мрак какой то...

    Видя только кусок кода, такой как:
    res := Random;
    разве можно определить, что это, обычное присваивание переменной или вызов функции без параметров?
     
  16. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Heineken
    175 ответов.. Интересно, автора удовлетворил ответ ?
     
  17. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Два. Оператор program и пустое тело программы. Кстати ";" - это 1 оператор, а ";;" - это 2 оператора.
    Это азы теории программирования, это должен знать каждый считающий себя программистом.
    Или например S=Pi*r*r; где Pi - не переменная и не константа, а то что компилируется в инструкцию fldpi. Надо знать встроенные функции своего языка, помнить какие функции присутствуют в текущем модуле, а какие функции берутся из модулей используемых текущим модулем. Тогда путаницы не будет.
     
  18. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    CrystalIC
    каков вопрос, такая и тема.
    интересно, много ли людей спрашивает "с чего начать изучение линейной алгебры"?
     
  19. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Думаю ему стоит учить по типу как я: ставишь себе вопрос и пытаешся реализовать, например решил написать чтото, начинаешь писать, возникают вопросы, на которые ищешь ответы. Постепенно вопросов станем мало, это и будет 'знание языка'.
     
  20. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Должен и баста. Вот должен и всё тут. А вот С и функцию и процедуру определяет как функцию. Это как-то не того, да? Ну, да, раз там нет понятия процедуры... Нет-нет-нет, даже слушать не будем за такой язык!
    Я уже говорил, я постоянно путался в Pascal, только не знаю, во имя чего. А в С не путаюсь. Там просто всё. Хотя уже по второму кругу я пошёл.