Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: неизвестное количество параметров  (Прочитано 46703 раз)
0 Пользователей и 1 Гость смотрят эту тему.
resource
Молодой специалист

ru
Offline 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'ы
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++ » Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 22-03-2010 05:49 » 

Лёша, на чистом C так делать не возбраняется, потому что нету там никаких конструкторов. Утечки ресурсов могут случиться, если что-то как-то неаккуратно сделано. Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих.

На C++ так делать - тут согласен, всё равно, что из небоскрёба через окно выходить. Повезёт, если этаж будет не слишком большим. Есть механизм исключений, в конце концов.
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 22-03-2010 06:18 » 

Цитата: Вад
Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих

Смелое заявление. Думаю, что C или C++ тут абсолютно не при чем (в вопросах кошмарности). Всё зависит от программиста, а они разными бывают.

clearance, такой подход (exit), профессиональным нигде и никогда считаться не может. Нравится тебе это или нет, но это факт. Об этом, если ты заметил, тебе тут многие пытаются сказать. Вообще вся эта дискуссия плавно перетекает в оффтоп, но массовый оффтоп, оффтопом не считается  Улыбаюсь Проблема в том, что если писать "как душа просит", забиваю на очевидные вещи, о которых, напрмер майкрософт, предупреждает явным образом, то в конечно итоге ты когда-нибудь серьезно облажаешься. Примеры, которые привел тебе я, на самом деле описаны в MSDN. Твоя ситуация напоминает мне историю программистов dlink'а. Вследствие их "героических" действий, одной байкой про кривую винду стало больше. Но это уже длинная история, и реально получится оффтоп.
« Последнее редактирование: 22-03-2010 06:45 от resource » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 22-03-2010 07:39 » 

Цитата: Вад
Поэтому код на C часто пишут совершенно кошмарный, дублирующий освобождение ресурсов на каждый чих
Смелое заявление. Думаю, что C или C++ тут абсолютно не при чем (в вопросах кошмарности). Всё зависит от программиста, а они разными бывают.

Полагаю, именно в таком кошмарном стиле пишут в основном программисты, перешедшие от C к C++, или программисты, учившиеся у предыдущей категории. Сам долго бил себе по рукам, прежде чем окончательно (вроде) перестал писать на C++ так, как стоило бы писать на C (в смысле обработки ошибок). От этого код стал менее кошмарным. Всё зависит от программиста, а программист бывает слишком подверженным влиянию "первого языка".
Записан
resource
Молодой специалист

ru
Offline 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'ы

Цитата: Алексей1153++
бесят комментарии вида /*xxxx*/
какие есть
// появились с 99
большой блок закомментить можно через #if 0 ... #endif

Цитата: resource
Проблема в том, что если писать "как душа просит", забиваю на очевидные вещи, о которых, напрмер майкрософт, предупреждает явным образом, то в конечно итоге ты когда-нибудь серьезно облажаешься.

Цитата: resource
Примеры, которые привел тебе я, на самом деле описаны в MSDN.
но они пишут только для виндовс

а что они пишут, если нужно завершить программу, когда подключена dll ?
не завершайте программу ?
« Последнее редактирование: 22-03-2010 08:23 от clearance » Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #38 : 22-03-2010 08:24 » 

Цитата: clearance
если я верну false из f1 с помощью return'а, то невозможно различить, где он произошёл
Кто произошел? return? Какая разница где он произошел? Главное по какому поводу. Но тут можно ввести не TRUE/FALSE а числовой код ошибки.
А exit возможно различить где произошел?

Цитата: clearance
я специально void'ы оставил, чтобы не затрагивать возвращаемые значения (так как они могут использоваться уже для чего-нибудь на полную катушку)
Вообще мысль неясна

Цитата: clearance
а что они пишут, если нужно завершить программу, когда подключена dll ?
Речь шла об exit из самой dll. В этом случае надо завершить функцию из dll с соответствующим кодом ошибки.
« Последнее редактирование: 22-03-2010 08:30 от resource » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #39 : 22-03-2010 08:35 » 

Лёша, на чистом C так делать не возбраняется
а когда-нибудь, совершенно внезапно,  код на чистом C не может вставиться в проект на чистом C++ ? Улыбаюсь

Цитата
если я верну false из f1, то невозможно различить, где он произошёл
а зачем их различать ? Ты всё равно выходишь. Ну, верни не bool, а нумерованный тип с кодом процедуры

Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 22-03-2010 08:37 » 

Offtopic:

меня терзают смутные с.
Товарищ Бегинер ?  Улыбаюсь
Поставлю в угол.
Записан

clearance
Гость
« Ответ #41 : 22-03-2010 08:42 » 

Цитата: Алексей1153++
Ну, верни не bool, а нумерованный тип с кодом процедуры
void там, куда вернуть, чем
может функция уже возвращает полный набор значений
а может возвращает float какой-нибудь

Цитата: resource
А exit возможно различить где произошел?
конечно, его нет в f1 Ага
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 22-03-2010 08:45 » 

clearance, УжЕ , не ужЕ . Перепиши и всё )))
Записан

clearance
Гость
« Ответ #43 : 22-03-2010 08:47 » 

Цитата: resource
В этом случае надо завершить функцию из dll с соответствующим кодом ошибки.
то есть функция уже не может ничего возвращать
а если она возвращает указатель на память
то вернуть NULL
и опять не различишь что вернуло NULL, функция или её подфункция
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 22-03-2010 08:51 » 

Цитата: clearance
конечно, его нет в f1 Ага

Это потому, что код несерьезный. В реальном коде наверняка будет, и не один. А возвращаемое значение - одно и тоже может быть. К тому же как ты будешь смотреть что вернул exit? Напишешь для этого отдельную программу?

Цитата: clearance
то есть функция уже не может ничего возвращать
а если она возвращает указатель на память

Ты подучи сначала язык Си. Почитай что такое передача параметров по указателю
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 22-03-2010 08:54 » 

Алексей1153++, мне всё больше кажется, что ваш оффтоп #40, совсем даже и не оффтоп
Записан
clearance
Гость
« Ответ #46 : 22-03-2010 08:56 » 

Цитата: Алексей1153++
clearance, УжЕ , не ужЕ . Перепиши и всё )))
ну так на что переписать-то ?
значение используется дальше, когда оно из функции получено
занят весь диапазон
код нечем возвращать
скажешь структуру верни, или перенеси структуру, которая возвращается в параметры

Цитата: resource
Это потому, что код несерьезный. В реальном коде наверняка будет, и не один. А возвращаемое значение - одно и тоже может быть. К тому же как ты будешь смотреть что вернул exit? Напишешь для этого отдельную программу?
да я просто знаю, что если exit не вернул, значит всё в порядке - все подфункции всё проверили
ошибок нет - программа продолжается
Записан
clearance
Гость
« Ответ #47 : 22-03-2010 08:58 » 

Цитата: resource
Почитай что такое передача параметров по указателю
это предложение перейти на стиль от Майкрософт
in out inout
и параметры там тоже void, потому что уже передаются
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 22-03-2010 08:59 » 

похоже наконец-то пришло пополнение в "кунсткамеру"
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #49 : 22-03-2010 09:18 » new

clearance
1. замени bool f() на int f() и получишь искомое.
2. народ прав или ты один принц на белом коне, а остальные так грязь из под ногтей непонятно за что они деньги получают. Я это даже допускаю, но такое крайне редко.
3. попробуй вызвать exit из потока, завершение которого ожидается в деструкторе глобального объекта (для упрощения моделирования)
Записан

Странно всё это....
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines