resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #30 : 19-03-2010 07:36 » |
|
Вот тебе пример - dll
Еще пример: есть класс, вызываешь exit. Думаешь деструктор будет вызван? А фиг. И ладно если он просто память освобождает, а ведь он может и сохранять какие-то данные, например на диск. Точнее должен это делать, но exit избавит тебя эт такого удовольствия.
Откуда вообще эта тяга к exit. Это еще досовский пережиток, забудь вообще про него. Собственно, Си конечно не в досе возник и не следует понимать последнюю фразу буквально, тут скорее речь шла о "былых временах".
|
|
« Последнее редактирование: 19-03-2010 09:30 от resource »
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #31 : 22-03-2010 01:12 » |
|
Вот тебе пример - dll
Еще пример: есть класс, вызываешь exit. Думаешь деструктор будет вызван? А фиг. И ладно если он просто память освобождает, а ведь он может и сохранять какие-то данные, например на диск. Точнее должен это делать, но exit избавит тебя эт такого удовольствия.
Откуда вообще эта тяга к exit. Это еще досовский пережиток, забудь вообще про него. Собственно, Си конечно не в досе возник и не следует понимать последнюю фразу буквально, тут скорее речь шла о "былых временах".
#include <stdio.h> #include <stdlib.h>
void f1(void); void f2(void);
int main(void) /* ANSI C89 */ { f1(); exit(EXIT_SUCCESS); }
void f1(void) { int c; c = getchar(); if (c == 'a') { printf("ok" "\n"); return; } f2(); }
void f2(void) { int c; c = getchar(); c = getchar(); if (c == 'a') { printf("ok" "\n"); return; } exit(EXIT_FAILURE); }
вот пример [guest@station test]$ ./test; echo $?; a ok 0 [guest@station test]$ ./test; echo $?; x a ok 0 [guest@station test]$ ./test; echo $?; x x 1 [guest@station test]$ A=entered; B=failed; [guest@station test]$ if ./test; then echo $A; else echo $B; fi; x x failed [guest@station test]$ if ./test; then echo $A; else echo $B; fi; x a ok entered [guest@station test]$
а вот вывод пример простой, переделай его на return'ы
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #32 : 22-03-2010 04:50 » |
|
пример простой, переделай его на return'ы
да пожалуйста int main(void) // ANSI C89 { f1(); return 0; }
bool f1(void) { int c; c = getchar(); if (c == 'a') { printf("ok" "\n"); return true; } return f2(); }
bool f2(void) { int c; c = getchar(); c = getchar(); if (c == 'a') { printf("ok" "\n"); return true; } return false; }
clearance, тебе же говорят - не привыкай выходить из дома через окно, однажды ты переселишься из избушки в небоскрёб А ещё (личное имхо, к прочтению не обязательно) - бесят комментарии вида /*xxxx*/ в одной строчке. Захочешь потом большой блок закоментить - и приехали ))
|
|
« Последнее редактирование: 22-03-2010 04:52 от Алексей1153++ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #33 : 22-03-2010 05:49 » |
|
Лёша, на чистом C так делать не возбраняется, потому что нету там никаких конструкторов. Утечки ресурсов могут случиться, если что-то как-то неаккуратно сделано. Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих.
На C++ так делать - тут согласен, всё равно, что из небоскрёба через окно выходить. Повезёт, если этаж будет не слишком большим. Есть механизм исключений, в конце концов.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #34 : 22-03-2010 06:18 » |
|
Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих
Смелое заявление. Думаю, что C или C++ тут абсолютно не при чем (в вопросах кошмарности). Всё зависит от программиста, а они разными бывают. clearance, такой подход (exit), профессиональным нигде и никогда считаться не может. Нравится тебе это или нет, но это факт. Об этом, если ты заметил, тебе тут многие пытаются сказать. Вообще вся эта дискуссия плавно перетекает в оффтоп, но массовый оффтоп, оффтопом не считается Проблема в том, что если писать "как душа просит", забиваю на очевидные вещи, о которых, напрмер майкрософт, предупреждает явным образом, то в конечно итоге ты когда-нибудь серьезно облажаешься. Примеры, которые привел тебе я, на самом деле описаны в MSDN. Твоя ситуация напоминает мне историю программистов dlink'а. Вследствие их "героических" действий, одной байкой про кривую винду стало больше. Но это уже длинная история, и реально получится оффтоп.
|
|
« Последнее редактирование: 22-03-2010 06:45 от resource »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #35 : 22-03-2010 07:39 » |
|
Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих
Смелое заявление. Думаю, что C или C++ тут абсолютно не при чем (в вопросах кошмарности). Всё зависит от программиста, а они разными бывают. Полагаю, именно в таком кошмарном стиле пишут в основном программисты, перешедшие от C к C++, или программисты, учившиеся у предыдущей категории. Сам долго бил себе по рукам, прежде чем окончательно (вроде) перестал писать на C++ так, как стоило бы писать на C (в смысле обработки ошибок). От этого код стал менее кошмарным. Всё зависит от программиста, а программист бывает слишком подверженным влиянию "первого языка".
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #36 : 22-03-2010 07:50 » |
|
Вад, дискуссия становится слишком абстрактной. Я наверное не понимаю о каком "освобождение ресурсов на каждый чих" идет речь. И если ты пишешь на C++, то что, не надо освобождать ресурсы? в общем, я если честно, уже не понимаю видимо о чем речь
|
|
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #37 : 22-03-2010 08:18 » |
|
Алексей1153++, меняется контекст если я верну false из f1 с помощью return'а, то невозможно различить, где он произошёл я специально void'ы оставил, чтобы не затрагивать возвращаемые значения (так как они могут использоваться уже для чего-нибудь на полную катушку) C++: у него вообще другой стиль например, принято писать std::cout по всему коду, вместо using namespace std; и cout'ы, endl'ы бесят комментарии вида /*xxxx*/ какие есть // появились с 99 большой блок закомментить можно через #if 0 ... #endif Проблема в том, что если писать "как душа просит", забиваю на очевидные вещи, о которых, напрмер майкрософт, предупреждает явным образом, то в конечно итоге ты когда-нибудь серьезно облажаешься. Примеры, которые привел тебе я, на самом деле описаны в MSDN. но они пишут только для виндовс а что они пишут, если нужно завершить программу, когда подключена dll ? не завершайте программу ?
|
|
« Последнее редактирование: 22-03-2010 08:23 от clearance »
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #38 : 22-03-2010 08:24 » |
|
если я верну false из f1 с помощью return'а, то невозможно различить, где он произошёл Кто произошел? return? Какая разница где он произошел? Главное по какому поводу. Но тут можно ввести не TRUE/FALSE а числовой код ошибки. А exit возможно различить где произошел? я специально void'ы оставил, чтобы не затрагивать возвращаемые значения (так как они могут использоваться уже для чего-нибудь на полную катушку) Вообще мысль неясна а что они пишут, если нужно завершить программу, когда подключена dll ? Речь шла об exit из самой dll. В этом случае надо завершить функцию из dll с соответствующим кодом ошибки.
|
|
« Последнее редактирование: 22-03-2010 08:30 от resource »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #39 : 22-03-2010 08:35 » |
|
Лёша, на чистом C так делать не возбраняется
а когда-нибудь, совершенно внезапно, код на чистом C не может вставиться в проект на чистом C++ ? если я верну false из f1, то невозможно различить, где он произошёл
а зачем их различать ? Ты всё равно выходишь. Ну, верни не bool, а нумерованный тип с кодом процедуры
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #40 : 22-03-2010 08:37 » |
|
Offtopic: меня терзают смутные с. Товарищ Бегинер ? Поставлю в угол.
|
|
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #41 : 22-03-2010 08:42 » |
|
Ну, верни не bool, а нумерованный тип с кодом процедуры void там, куда вернуть, чем может функция уже возвращает полный набор значений а может возвращает float какой-нибудь А exit возможно различить где произошел? конечно, его нет в f1
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 22-03-2010 08:45 » |
|
clearance, УжЕ , не ужЕ . Перепиши и всё )))
|
|
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #43 : 22-03-2010 08:47 » |
|
В этом случае надо завершить функцию из dll с соответствующим кодом ошибки. то есть функция уже не может ничего возвращать а если она возвращает указатель на память то вернуть NULL и опять не различишь что вернуло NULL, функция или её подфункция
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #44 : 22-03-2010 08:51 » |
|
конечно, его нет в f1 Это потому, что код несерьезный. В реальном коде наверняка будет, и не один. А возвращаемое значение - одно и тоже может быть. К тому же как ты будешь смотреть что вернул exit? Напишешь для этого отдельную программу? то есть функция уже не может ничего возвращать а если она возвращает указатель на память Ты подучи сначала язык Си. Почитай что такое передача параметров по указателю
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #45 : 22-03-2010 08:54 » |
|
Алексей1153++, мне всё больше кажется, что ваш оффтоп #40, совсем даже и не оффтоп
|
|
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #46 : 22-03-2010 08:56 » |
|
clearance, УжЕ , не ужЕ . Перепиши и всё ))) ну так на что переписать-то ? значение используется дальше, когда оно из функции получено занят весь диапазон код нечем возвращать скажешь структуру верни, или перенеси структуру, которая возвращается в параметры Это потому, что код несерьезный. В реальном коде наверняка будет, и не один. А возвращаемое значение - одно и тоже может быть. К тому же как ты будешь смотреть что вернул exit? Напишешь для этого отдельную программу?
да я просто знаю, что если exit не вернул, значит всё в порядке - все подфункции всё проверили ошибок нет - программа продолжается
|
|
|
Записан
|
|
|
|
clearance
Гость
|
|
« Ответ #47 : 22-03-2010 08:58 » |
|
Почитай что такое передача параметров по указателю это предложение перейти на стиль от Майкрософт in out inout и параметры там тоже void, потому что уже передаются
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #48 : 22-03-2010 08:59 » |
|
похоже наконец-то пришло пополнение в "кунсткамеру"
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #49 : 22-03-2010 09:18 » |
|
clearance 1. замени bool f() на int f() и получишь искомое. 2. народ прав или ты один принц на белом коне, а остальные так грязь из под ногтей непонятно за что они деньги получают. Я это даже допускаю, но такое крайне редко. 3. попробуй вызвать exit из потока, завершение которого ожидается в деструкторе глобального объекта (для упрощения моделирования)
|
|
|
Записан
|
Странно всё это....
|
|
|
|