2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Как лучше реализовать функцию pop()
Сообщение01.05.2014, 20:51 
Заслуженный участник


16/02/13
4196
Владивосток
Ну, опять же решения предлагает ++ — константы, классы, namespace или как там они называются. Скажите, а вам голый Цэ правда так критичен?

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение01.05.2014, 20:53 
Заслуженный участник


28/04/09
1933
Legioner93 в сообщении #857766 писал(а):
можно ли как-то побороть этот ад вложенных хедеров? Т.е. какая-нибудь ограниченная область действия макросов.
На данный момент $\text{---}$ никак (если только не ходить за макросами с тряпкой #undef'ом). Предложения по созданию аналога пространств имен для макросов неоднократно озвучивались. Правда, это был C++, про C не знаю. Например.
Legioner93 в сообщении #857766 писал(а):
Мне не нужны функции из A в C - только из B. А если понадобятся непосредственно из A - подключу отдельно.
Для этого есть пространства имен (namespace). Правда, в C++. :-)

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение01.05.2014, 21:12 


05/09/12
2587
iifat в сообщении #857772 писал(а):
Скажите, а вам голый Цэ правда так критичен?

Предлагаете включиться в баянный холивар? Пара коротких имхов по поводу С/С++

ЗЫ по поводу функций, уже сказали, что один из стандартных приемов - возвращать код ошибки, а внутри по переданным указателям делать все что угодно. Под возвращаемое значение компилятором выделится один регистр, который тут же проанализируется будет использован для других целей, переменная даже не создастся, а все нужные действия произойдут с переменными в ОЗУ.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 15:12 
Заслуженный участник
Аватара пользователя


28/07/09
1238
EtCetera
Выглядит интересно. Это не было добавлено в каком-нибудь компиляторе? Вроде совсем просто реализовать же.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 15:25 
Заслуженный участник


28/04/09
1933
Это мне неизвестно.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 17:25 
Заслуженный участник


16/02/13
4196
Владивосток
EtCetera в сообщении #857774 писал(а):
Предложения по созданию аналога пространств имен для макросов неоднократно озвучивались. Правда, это был C++, про C не знаю
Ну, заголовок по ссылке заканчивается на C/C++. Но там, как понимаю, речь о, по сути, замене того убожества, что в Цэ (и ++) называется макрогенерацией на что-нить более человеческое. В принципе-то, дело нехитрое.

-- 03.05.2014, 01:30 --

_Ivana в сообщении #857784 писал(а):
Предлагаете включиться в баянный холивар?
Таки убейте — не припоминаю, чтоб я вам чего-нить предлагал. Вы меня с кем-то путаете.
_Ivana в сообщении #857784 писал(а):
один из стандартных приемов - возвращать код ошибки
И недостатки этого приёма тоже были уже показаны.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 17:42 


10/04/12
705
Legioner93 в сообщении #857622 писал(а):
Здравствуйте! Возникла необходимость реализации стека в учебной программе. Нужен совет, как правильнее реализовывать функцию pop(1). А именно, интересует проблема обработки исключения "когда стек пустой".
Язык pure C.


Все просто, нужно задокументировать, что в случае пустого стека получаем UB. Потом добавить функцию is_empty() и в самом начале функции pop просто вызывать assert(!is_empty()).

Итого, нету оверхида в случае вызова pop, если пользователь на 200% уверен в том, что в стеке что-то есть, а это часто используемый сценарий. При отладке будем ловить ошибку. А если потребуется вдруг узнать, пустой ли стек, то все равно надо писать if, поэтому лишней писанины будет только одна строка с pop.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 18:23 
Заслуженный участник


28/04/09
1933
iifat в сообщении #858193 писал(а):
Но там, как понимаю, речь о, по сути, замене того убожества, что в Цэ (и ++) называется макрогенерацией на что-нить более человеческое.
Разве? Мне показалось, предлагается нечто менее радикальное:
Цитата:
The purpose of this proposal is to provide the simplest possible mechanism for protecting code from unintended macro substitution.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 18:40 
Заслуженный участник


16/02/13
4196
Владивосток
Предлагается дополнительная директива макроязыка. Если её включат в кой-нить существующий компилятор, это, разумеется, будет полезно и менее радикально. Только вот не все здравые идеи авторы радостно включают в компиляторы, нет?

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 19:00 
Заслуженный участник


28/04/09
1933
iifat в сообщении #858237 писал(а):
Только вот не все здравые идеи авторы радостно включают в компиляторы, нет?
Разве я это утверждал?

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 19:06 
Заслуженный участник


16/02/13
4196
Владивосток
Нет, но вы, похоже, таки знаете какой-то менее радикальный способ. Не поделитесь?

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение02.05.2014, 19:38 
Заслуженный участник


28/04/09
1933
Способ чего? Я теряю нить беседы...

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение03.05.2014, 06:24 
Заслуженный участник


16/02/13
4196
Владивосток
Ну, кто-то из нас явно теряет. Возможно, я. Возможно, не я. Думаю, тему мы таки исчерпали.

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение03.05.2014, 16:09 


03/05/14
9
warlock66613 в сообщении #857650 писал(а):
Зачем что-то выдумывать? Используйте стандартное решение для таких ситуаций:
Используется синтаксис C
int pop(stack **x, double *result);
Возвращаем 0 если всё хорошо и -1 если плохо, вот и всё. Если функция может фейлится по разным причинам, то выставляем глобальную переменную errno (это особая глобальная переменная, её можно использовать) в более-менее подходящее значение (список в статье по ссылке). Дополнительно можно продублировать ошибку кодом возврата (return -errno;).

Сделайте тоже самое, только наоборот:
Используется синтаксис C
double pop(stack **x, int* err=NULL);

В случае ошибки стека возвращается 0.0 (или NaN).
А err (если указано) уточняет результат возвращая код ошибки
Можно писать:
Используется синтаксис C
printf("%e",pop(stack));
// или
int err;
printf("%e",pop(stack,&err));
if (err) ...;
 

В реализации pop() необходимо проверить err на значение NULL

 Профиль  
                  
 
 Re: Как лучше реализовать функцию pop()
Сообщение04.05.2014, 19:58 
Заслуженный участник


27/04/09
28128
int13h в сообщении #858575 писал(а):
В случае ошибки стека возвращается 0.0 (или NaN).
Или 42. Это настолько же хорошо, насколько возвращать 0 или NaN: если смотреть на код ошибки, результат не нужен; если не смотреть, всегда можно напороться на непонимание, не лежал ли этот NaN уже в стеке. Итого: ненужное уточнение.

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

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group