LINUX.ORG.RU

Царям сишки

 


3

2

А могут ли многоуважаемые цари, короли и императоры сишки создать такую функцию для сортировки, которая бы работала для 3 элементов быстрее, чем стандартный qsort()? Я не могу и не думаю, что это возможно. Но я знаю, что истинный царь смог бы. Итак, конкурс объявляю открытым. Победителю достанется... силенд, может быть?



Последнее исправление: lisper-pipisper (всего исправлений: 2)

Пользуясь случаем, хочу спросить, какого типа в Си выражение *ptr. Например:

my_type x;
my_type *p = &x;

*p /* <-- какой тип? */

В C++ понятно какой - my_type &, ссылка то есть. Но в Си ссылок нет. Вот туплю сижу.

anonymous
()
Ответ на: комментарий от lisper-pipisper

Не, тогда бы мы с копией данных работали, ведь в Си семантика значений.

my_type foo();

foo(); /* вот тут тип my_type, но мы при изменении изменять будем копию */

По сути, мы никак сами не можем в языке выразить саму операцию разыменования, т.к. мы не сможем описать тип возвращаемого значения.

anonymous
()
Ответ на: комментарий от lisper-pipisper

Ну так ответ неверный. Если бы в си была семантика ссылок, как почти везде, то да. В общем проблема в том, что в языке си есть операции, которые нельзя описать псевдофункцией. В C++ - можно, а в си - нет. Меня это беспокоит.

my_type foo()
my_type & bar()

А ведь я всегда считал, что си более целостен, чем кресты. Вот ведь отстой-то.

anonymous
()
Ответ на: комментарий от anonymous

6.5.3.2 Address and indirection operators
...
The unary* operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’
...

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

anonymous
()
Ответ на: комментарий от lisper-pipisper

C++

struct my_ptr { int * p; };
...

int & deref(my_ptr p) { return *p; }

...

deref(x) = 10; // ok

C

struct my_ptr { int * p; };
...

/* Что мне тут написать??? */ deref(my_ptr p) { return *p; }

Если я напишу int, то потом не смогу модифицировать исходный объект - я буду модифицировать его копию.

anonymous
()
Ответ на: комментарий от anonymous

Да это-то понятно... Но смотри пример выше.

anonymous
()
Ответ на: комментарий от anonymous

Слишком много опечаток

struct my_ptr { int * p; };
...

int & deref(my_ptr ptr) { return *ptr.p; }

...

deref(x) = 10; // ok

В общем совершенно неясно, что делать на си. Макрос сделать можно, безусловно, но это совсем другая история.

anonymous
()
Ответ на: комментарий от anonymous

Да, си отстой в плане концептуальном, но как тебя это беспокоит на практике?

anonymous
()
Ответ на: комментарий от anonymous

Но в Си ссылок нет. Вот туплю сижу.

*p /* <-- какой тип? */

в данном случае тип my_type

Hint:

typedef int my_type;
my_type x;
my_type* p = &x;

*p; /* int */
emulek
()
Ответ на: комментарий от emulek

Если deref будет возвращать int, то он не будет работать. Ну не присвоешь ты значение тогда!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.