Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть ли аналог exception? чтобы в Си выйти из циклов и вложений... 
:(
    Опции темы
Anton Vatchenko
Дата 11.4.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



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

while(1) {
    int i = read(socket);
    if(i == -1) break;
    int j = read(socket);
    if(j == -1) break;
    int lost = 0;
    for(int k = 0; k < 20; k++) {
        a[k] = read(socket);
        if(a[k] == -1) { lost = 1; break;}
    }
    if(lost) break;
}


--------------------
user posted image
PM MAIL   Вверх
boombick
Дата 11.4.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 20.4.2005
Где: Moscow, Russia

Репутация: нет
Всего: 9



А что это за язык? и почему в общих вопросах по никсам?


--------------------
Все вышесказанное - имхо, и на истину в последней инстанции не претендует
------
UNIX and other
PM MAIL WWW ICQ   Вверх
powerfox
Дата 11.4.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Модератор: тема перенесена в общие вопросы по С/С++

Посмотри в стандартной библиотеке Си break и setjmp.h



--------------------
user posted image
PM WWW   Вверх
Anton Vatchenko
Дата 11.4.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



Блин, я именно про Линуксы спрашивал...


--------------------
user posted image
PM MAIL   Вверх
Daevaorn
Дата 11.4.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anton Vatchenko @  11.4.2007,  18:20 Найти цитируемый пост)
Блин, я именно про Линуксы спрашивал...

а это не имеет значения. решение тебе уже посказали
PM MAIL WWW   Вверх
powerfox
Дата 11.4.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Anton Vatchenko @  11.4.2007,  18:20 Найти цитируемый пост)
Блин, я именно про Линуксы спрашивал... 

Вопрос к линуксу не имеет отношения. Это вопрос по ЯП. 


--------------------
user posted image
PM WWW   Вверх
likehood
Дата 11.4.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



goto
PM MAIL   Вверх
Anton Vatchenko
Дата 11.4.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 21.5.2004

Репутация: нет
Всего: -1



А эти джампы не такие медленные как goto? А break не понял в каком контексте использовать? Он вроде не выйдет из вложенных функций...


--------------------
user posted image
PM MAIL   Вверх
Mayk
Дата 11.4.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(likehood @  11.4.2007,  21:35 Найти цитируемый пост)
goto 

Не худший вариант в случае одной функции.
Цитата(Anton Vatchenko @  11.4.2007,  21:08 Найти цитируемый пост)
моя функция read, а она может быть вызвана из другой функции и т. д... Не делать же типа того:

для многих не очень хорошо работает.

Цитата(powerfox @  11.4.2007,  21:12 Найти цитируемый пост)
setjmp




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
powerfox
Дата 11.4.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(Anton Vatchenko @  11.4.2007,  18:43 Найти цитируемый пост)
А эти джампы не такие медленные как goto?

Гм... А где тут медлительность может быть? По идее, просто начинает выполняться другая функция (в 2-х словах, если).


--------------------
user posted image
PM WWW   Вверх
MAKCim
Дата 11.4.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Anton Vatchenko @  11.4.2007,  17:43 Найти цитируемый пост)
А эти джампы не такие медленные как goto?

goto вообще быстрее (или по крайней мере не медленнее) вызова функции
(goto = jmp, вызов функции = call)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
ivashkanet
Дата 11.4.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Товарищи, а почему бы просто не вызвать
Код

return #errorCode; // вроде так зарезервированные в define  константы обозначаются (могу сиииильно ошибаться) :)
// Например
return null 

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

Механизм exception-ов вшит в сам язык, так что он может разворачивать стек (что он и делает), а вот программно так не сделать 

P.S. Все мое личное, ИМХО
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 11.4.2007, 18:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



ivashkanet
пример
Код

int do_code() {
    key_t key = ftok(KEY_PATH, 0);
    if (key < 0) 
        return errno; /* тут все нормально */
    int sem_id = semget(key, SEMAPHORES_COUNT, IPC_CREAT | IPC_EXCL | 0666);
    if (sem_id < 0) 
        return errno; /* тут тоже все хорошо */
    int shm_id = shmget(key, PAGE_SIZE, IPC_CREAT | IPC_EXCL | 0222);
    if (shm_id < 0) /* а вот тут уже не хорошо, потому как семафор уже создан и необходимо его освободить */
        goto destroy_sem;
    int fd = open(PATH, O_RDONLY);
    if (fd < 0) /* а тут совсем нехорошо, надо освободить и семафор, и shared memory */
        goto destroy_shm;
    void *ptr = malloc(PAGE_SIZE);
    if (ptr == NULL) /* а тут катастрофа - 3 открытых ресурса */
        goto destroy_file;
...
destroy_file:
    close(fd);
destroy_shm:
    shmctl(shm_id, IPC_RMID, NULL);
destroy_sem:
    semctl(sem_id, 0, IPC_RMID);
}

это я к чему, goto позволяет логично и наглядно решить проблему, которая описана выше
и пусть противники goto найдут более понятное решение  smile 

Это сообщение отредактировал(а) MAKCim - 11.4.2007, 18:54


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
powerfox
Дата 11.4.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Цитата(ivashkanet @  11.4.2007,  19:41 Найти цитируемый пост)
Механизм exception-ов вшит в сам язык, так что он может разворачивать стек (что он и делает), а вот программно так не сделать 

Я не уверен в этом. Можно реализовать какую-нибудь функции exception(bla-bla);
А там обрабатывать bla-bla и иметь набо goto.
Хотя я exception практически не юзал.


--------------------
user posted image
PM WWW   Вверх
bilbobagginz
Дата 11.4.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 3
Всего: 317



Цитата(powerfox)

Можно реализовать какую-нибудь функции exception(bla-bla);

powerfox, можно вручную реализовать и классы, и наследование... только на фига оно надо, если есть C++ smile

кроме того, есть переходный момент между C и C++, называется objective C.
может быть это то, что нужно человеку...но я правда не понимаю зачем писать что-то на Си, если можно использовать готовые средства Си++.





--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1409 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.