OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 21 Ноябрь, 2019 17:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 07 Ноябрь, 2013 22:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Илья Ермаков писал(а):
Jordan писал(а):
(point_in_rect(x, y, p->pos_x, p->pos_y, p->size_w, p->size_h) != true)


эмм, а это как понимать - зачем Вы допустили такую "молодёжную" тавтологию, как сравнение с TRUE/FALSE?


В сях это бывает вполне оправдано - четко виден тип возвращаемого значения point_in_rect.
Это и про КП можно сказать. И на КП так же пишут.

Поэтому чётко видно тут одно --- некоторый раздел матчасти стоит повторить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Ноябрь, 2013 22:19 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Евгений Темиргалеев писал(а):
Вы с какой целью пришли в этот раздел? Чтобы пререкаться? Если да, то я пас.


Раздел для новичков, потому и пришёл, так как я сам новичок. Поумерю свою гордыню.

Евгений Темиргалеев писал(а):
Или давайте писать дальше на КП. Что там выходит? Вставка элемента в начало списка, поиск элемента.

И элемент списка лучше всё-таки возьмте int. Чтобы сравнить было проще. Ведь для обобщённого списка это не важно. Разве не так?


Всё так, чуть позже будет код.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Ноябрь, 2013 22:22 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Евгений Темиргалеев писал(а):
Поэтому чётко видно тут одно --- некоторый раздел матчасти стоит повторить.

Нет. В Сях (наиболее распространеннах - С89) нет никаких булевых типов. И нет ни TRUE ни FALSE. Поэтому если нужно вернуть Да/Нет, возвращают так как договорятся. Где то это 0 и 1, где-то это -1 и 0. Где-то это что-то еще. Иногда при этом определяют TRUE/FALSE макросами, и вот они могут быть нифига не равны 1 и 0 соответственно.

Поэтому еще раз - в Сях такая запись оправдана. В С++ современном уже менее оправдана, но там где С++ контачит с тем самым Сишным кодом, это все равно оправдано.

В КП безусловно за такое надо бить. (равно как и в java например)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Ноябрь, 2013 22:58 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Евгений Темиргалеев писал(а):
Поэтому чётко видно тут одно --- некоторый раздел матчасти стоит повторить.

Нет. ...
Вы на каком опыте выводы делаете? Моё высказывание на основе не одного года ведения лабораторных по Си, КП.

И логические операции, результат которых 0 и 1, в Си были с самого начала... Касательно макросов и проч. --- обратите внимание на приписочку в скобках тут.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 07 Ноябрь, 2013 23:19 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Евгений Темиргалеев писал(а):
Alexey Veselovsky писал(а):
Евгений Темиргалеев писал(а):
Поэтому чётко видно тут одно --- некоторый раздел матчасти стоит повторить.

Нет. ...
Вы на каком опыте выводы делаете? Моё высказывание на основе не одного года ведения лабораторных по Си, КП.

На основе опыта промышленной разработки на Си и С++ в течение как минимум 8 лет.

Цитата:
И логические операции, результат которых 0 и 1, в Си были с самого начала...

Логические операции да, но тут то у нас вызов функции. Которая может вернуть все что угодно, в соответствии с тем соглашением, которого придерживается автор данной функции (для данной функции :-) ).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Ноябрь, 2013 00:17 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 959
Откуда: Киев
Alexey Veselovsky писал(а):
Поэтому еще раз - в Сях такая запись оправдана.

Учитывая контекст задачи - нет и именно по тем причинам, что Вы озвучили. Оно может вернуть "правду", но совсем не TRUE
где
Код:
typedef int bool;
#define FALSE ((bool)0)
#define TRUE ((bool)!FALSE)


Код:
В С++ современном уже менее оправдана, но там где С++ контачит с тем самым Сишным кодом, это все равно оправдано.

Наоборот, проверка на равенство if (l == true) уже не вызовет логической ошибки, а при смене типа возвращаемого значения на целочисленное после очередной правки, выскочит предупреждение, в отличи от if (l)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Ноябрь, 2013 02:05 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Comdiv писал(а):
Alexey Veselovsky писал(а):
Поэтому еще раз - в Сях такая запись оправдана.

Учитывая контекст задачи - нет и именно по тем причинам, что Вы озвучили. Оно может вернуть "правду", но совсем не TRUE
где
Код:
typedef int bool;
#define FALSE ((bool)0)
#define TRUE ((bool)!FALSE)


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

Если кто-то пишет if (foo()), то не понятно что это значит. Если foo возвращает -1 в случае ошибки, а 0 в случае успеха, значит это обрабатывается ошибка. Если же не 0 в случае успеха, иначе 0, то это обрабатывается успешная отработка.

Comdiv писал(а):
Код:
В С++ современном уже менее оправдана, но там где С++ контачит с тем самым Сишным кодом, это все равно оправдано.

Наоборот, проверка на равенство if (l == true) уже не вызовет логической ошибки, а при смене типа возвращаемого значения на целочисленное после очередной правки, выскочит предупреждение, в отличи от if (l)

Не выскочит. Точнее так: не факт что выскочит.
Вот такой код:
Код:
int main() {
    int a = 42;
    if (a==true){}
    return 0;
}

собирается без предупреждений на gcc 4.5.4 с опцией -Wall

Но вообще, тут правильно заметили - пишите в этой ветке все на КП, и не заморачивайтесь Сишным геморроем :-) Ветка не про это.

За сим умолкаю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Ноябрь, 2013 11:53 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Alexey Veselovsky в viewtopic.php?p=83634#p83634 писал(а):
На основе опыта промышленной разработки на Си и С++ в течение как минимум 8 лет.
Вот об чем и речь. Ваш опыт тут не совсем подходит. Учат --- пониманию. Основного.

Alexey Veselovsky писал(а):
Логические операции да, но тут то у нас вызов функции. Которая может вернуть все что угодно, в соответствии с тем соглашением, которого придерживается автор данной функции (для данной функции :-) ).
Вызов функции (всегда) стоит в выражении, результат которого определяется типом и значением. Которые нужно уметь определять. Чтобы, например, правильно записать while, из которого тут то у нас выковырнуто выражение, говорим про результат 0/не 0 или false/true (если есть bool). И когда студент пишет
while (f(...) != 0) ... вместо while (f(...)) ...
или
WHILE f(...) = TRUE вместо WHILE f(...) DO ...
то это говорит о том, что он недоучил/недопонимает либо while либо "операции и выражения". И речь в процессе обучения идёт не о том, чтобы "бить" за нарушение корпоративного стандарта кодинга, а о том, чтобы человек начал понимать, что он пишет.

А всяческие придумки "промышленных" авторов данных функций, вида:
Код:
#define TRUE 5
#define FALSE 7
int F (args) { ... return TRUE; ... return FALSE; }

#define true -1
#define false 1
int g (args) { ... return true; ... return false; }
лучше тактично умолчать. Плохому все и сами быстро научаются.

Alexey Veselovsky писал(а):
Но вообще, тут правильно заметили - пишите в этой ветке все на КП, и не заморачивайтесь Сишным геморроем :-) Ветка не про это.

За сим умолкаю.
И вообще, с Вами, тов. Веселовский, я больше не разговариваю. Надеялся, что у меня этот Сишный геморрой из головы уже выветрился. :-) А тут Вы со "своими" C98 etc. В болото усё это!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 08 Ноябрь, 2013 12:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Кстати, товарищи, есть непочатое поле для непосредственного применения промышленного опыта: viewforum.php?f=131.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 26 Декабрь, 2013 14:33 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 959
Откуда: Киев
Alexey Veselovsky писал(а):
Вот такой код:
Код:
int main() {
    int a = 42;
    if (a==true){}
    return 0;
}

собирается без предупреждений на gcc 4.5.4 с опцией -Wall

Оказалась под рукой Visual Studio. Без каких-либо спец. настроек выдаёт сообщение:
Код:
warning C4805: '==' : unsafe mix of type 'int' and type 'bool' in operation

А gcc и clang с любыми опциями (-Wall это не всё, несмотря на название) молчат на эту тему, да. Жаль.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 27 Декабрь, 2013 18:47 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Ещё можно сделать так.

Код:
#define eq ==


Для наглядности можно посмотреть файл iso646.h

Если гулять так гулять, то :)

Код:
#define IF if
#define THEN {
#define ELSIF } else if {
#define ELSE } else {
#define END }
#define AND &&
#define OR  ||


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 27 Декабрь, 2013 21:15 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Comdiv писал(а):
А gcc и clang с любыми опциями (-Wall это не всё, несмотря на название) молчат на эту тему, да. Жаль.


Возможно данные компиляторы обрабатывают исходник после препроцессора, так как true и false это обычные макросы, компиляторы не находят проблемы.

Есть выход, скомпилить C++ компилятором. g++ -Wall -pedantic


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 27 Декабрь, 2013 21:30 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Проблему с обобщённым списком я решил. Копипащу и не парюсь. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 27 Декабрь, 2013 21:51 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Jordan писал(а):
Comdiv писал(а):
А gcc и clang с любыми опциями (-Wall это не всё, несмотря на название) молчат на эту тему, да. Жаль.


Возможно данные компиляторы обрабатывают исходник после препроцессора, так как true и false это обычные макросы, компиляторы не находят проблемы.

true и false это не макросы. Макросы это TRUE и FALSE.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 27 Декабрь, 2013 21:53 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Alexey Veselovsky писал(а):
true и false это не макросы. Макросы это TRUE и FALSE.


Код:
#ifndef _STDBOOL_H
#define _STDBOOL_H

/* ISOC99 boolean */

#define bool   _Bool
#define true   1
#define false   0

#endif /* _STDBOOL_H */


В си макросы. Мы же говорим о си? Что бы отловить такие ошибки в си, лучше использовать С++ компилятор. Так как совместимость есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Декабрь, 2013 14:24 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Jordan писал(а):
Проблему с обобщённым списком я решил. Копипащу и не парюсь. :)
Устранение стоящей на пути проблемы отказом от её решения.

Шутки шутками, но так и получается keep at simple. Можно сходу пробивать проход в 10-метровой стене, а можно поискать место пониже и перешагнуть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 17 Январь, 2014 15:39 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 841
Откуда: Казань
Да, есть два подхода:
1) Можно просто делать разные списки для разных типов данных.
2) Можно сделать обобщенный список, то есть список который может хранить разные типы данных, но при этом нужно будет динамически выделять память не только для элемента списка, но и для данных элемента списка.
Для иллюстрации второго подхода написал небольшую программку, которая создает список, элементами которого является строка, другой список целых чисел и целое число. (Программа компилировалась при помощи компилятора Oberon-07М, для других компиляторов могут потребоваться незначительные изменения)
Код:
MODULE List;

  IMPORT Memory, Console;

  TYPE
    AnyPtr = RECORD
             END;
    Integer = POINTER TO RECORD (AnyPtr)
                v: INTEGER
              END;
    Text = POINTER TO RECORD (AnyPtr)
             s: ARRAY 256 OF CHAR
           END;
    Node = POINTER TO RECORD (AnyPtr)
             item: POINTER TO AnyPtr;
             next: Node
           END;

  VAR k, m, n, p, r: Integer;
    s: Text;
    node1, node2: Node;

  PROCEDURE PrintList(CONST n: Node);
  VAR node: Node;
    first: BOOLEAN;
  BEGIN
    Console.String("(");
    first := TRUE;
    node := n;
    WHILE node # NIL DO
      IF first THEN
        first := FALSE;
      ELSE
        Console.String(", ");
      END;
      IF node.item IS Integer THEN
        Console.Int(node.item(Integer).v);
      ELSIF node.item IS Text THEN
        Console.String(node.item(Text).s);
      ELSE
        PrintList(node.item(Node));
      END;
      node := node.next;
    END;
    Console.String(")");
  END PrintList;

  PROCEDURE Do;
  BEGIN
    (* Создаем основной список *)
    NEW(k);
    k.v := 5;
    NEW(m);
    m.v := 10;
    NEW(n);
    n.v := 15;
    NEW(node1);
    node1.item := k;
    NEW(node1.next);
    node1.next.item := m;
    NEW(node1.next.next);
    node1.next.next.item := n;
   
    (* Создаем второй список *)
    NEW(p);
    p.v := 2;
    NEW(r);
    r.v := 4;
    NEW(node2);
    node2.item := p;
    NEW(node2.next);
    node2.next.item := r;


    (* Заменяем второй элемент списка вторым списком *)
    node1.next.item := node2;
 
    (* Заменяем первый элемент списка строкой *)
    NEW(s);
    s.s := "Hello";
    node1.item := s;

    (* Печатаем список *)
    PrintList(node1);
  END Do;
       

BEGIN
  Do;
END List.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Февраль, 2014 15:42 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Rifat

Спасибо за код.

Вопрос есть. Что значит код

NEW(node1.next.next);
node1.next.next.item := n;

Откуда второй next, в записи Node определён один next.

Я понял пример данной реализации. Проверка типа, при обращении. И ручное привидение типа.

По такому принципу в старых версиях delphi, списки делали, там правда был нетипизированный массив. Для каждой ячейки выделяли память и приводили тип.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Февраль, 2014 12:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9160
Откуда: Россия, Орёл
Только в Delphi это было небезопасно, там контроля при приведении типа не было.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 16 Февраль, 2014 09:39 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 841
Откуда: Казань
Jordan писал(а):
Rifat
NEW(node1.next.next);
node1.next.next.item := n;
Откуда второй next, в записи Node определён один next.

node1 - начало списка
node1.next - указывает на второй элемент списка (или на NIL, в нашем случае не NIL)
node1.next.next - указывает на третий элемент списка (или на NIL, в нашем случае не NIL)
node1.next.next.item := n - присваивает значение третьему элементу списка.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB