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, Супермодераторы



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

Сейчас этот форум просматривают: Google [Bot]


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

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