Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2010, 00:27   #11
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Vago
я switch поставил только в качестве примера, я же написал. неужели самому нельзя смоделировать более нетривиальную ситуацию....
а если в some another code еще один switch? в default его впихнешь? ну вариант конечно, но вариант с goto более читабелен, не находишь?

вот тебе более нетривиальный пример.
Код:
void foo(int n)
{
	char *pc = new char;
	int *pi = new int[50];
	FILE *f1, *f2;

	if ((f1 = fopen("f1", "w")) == NULL) {
		cout << "error opening file" << endl;
		goto END_FOO;
	}

	if ((f2 = fopen("f2", "w")) == NULL) {
		cout << "error opening file" << endl;
		goto END_FOO;
	}

	if (some_errors()) {
		goto END_FOO;
	}

	/* some code */

	switch (n) {
	case 1:
		cout << "bad param" << endl;
		goto END_FOO;
		break;
	case 2:
		cout << "bad argument" << endl;
		goto END_FOO;
		break;
	case 3:
		cout << "what's that??" << endl;
		goto END_FOO;
		break;
	default
		break;
	}

	/* some another code */

END_FOO:
	foo();
	cout << "some error occur. clear resources" << endl;
	delete [] pi;
	delete pc;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.04.2010, 04:18   #12
gagen
Новичок
Джуниор
 
Регистрация: 04.03.2010
Сообщений: 2
По умолчанию

Извините конечно за то что сразу не сообразил , а не могли бы вы подкорректировать мою запись в вид содержащий goto , а то не особо соображу по тому, что вы написали.
gagen вне форума Ответить с цитированием
Старый 05.04.2010, 11:08   #13
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
более нетривиальный пример.
Код:
void GeneralErrMsg() {
    cout << "some error occur. clear resources" << endl;
}


void foo(int n) {
	
   char* pc;      //1 = new char;
   int* pi;       //1  = new int[50];
   FILE *f1, *f2;
   bool  isErr;   //2
   
   if ((f1 = fopen("f1", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
    }

   if ((f2 = fopen("f2", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
   }

   if (some_errors()) {
//1   goto END_FOO;
     GeneralErrMsg();    //2
     return;             //2
   }

   pc    = new char;       //2
   pi    = new int[50];    //2
   isErr = false;          //2

   /* some code */

   switch (n) {
      case 1:
         cout << "bad param" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      case 2:
         cout << "bad argument" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      case 3:
         cout << "what's that??" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      default:
      break;
   }

   if ( !isErr ) {
      /* some another code */
   } else {
      GeneralErrMsg();
   }

/*d
END_FOO:
	foo();   // Будем считать, что этот бессмысленный рекурсивный вызов был написан в полемическом запале :)
	cout << "some error occur. clear resources" << endl;
*/
    delete [] pi;
    delete pc;

}
Vago вне форума Ответить с цитированием
Старый 05.04.2010, 11:30   #14
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Код:
void GeneralErrMsg() {
    cout << "some error occur. clear resources" << endl;
}


void foo(int n) {
	
   char* pc;      //1 = new char;
   int* pi;       //1  = new int[50];
   FILE *f1, *f2;
   bool  isErr;   //2
   
   if ((f1 = fopen("f1", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
    }

   if ((f2 = fopen("f2", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
   }

   if (some_errors()) {
//1   goto END_FOO;
     GeneralErrMsg();    //2
     return;             //2
   }

   pc    = new char;       //2
   pi    = new int[50];    //2
   isErr = false;          //2

   /* some code */

   switch (n) {
      case 1:
         cout << "bad param" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      case 2:
         cout << "bad argument" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      case 3:
         cout << "what's that??" << endl;
//1      goto END_FOO;
         isErr = true;     //2
         break;
      default:
      break;
   }

   if ( !isErr ) {
      /* some another code */
   } else {
      GeneralErrMsg();
   }

/*d
END_FOO:
	foo();   // Будем считать, что этот бессмысленный рекурсивный вызов был написан в полемическом запале :)
	cout << "some error occur. clear resources" << endl;
*/
    delete [] pi;
    delete pc;

}
Хм, не сильно ваш пример лучше. Единственный плюс в нем - он без goto. На этом его преимущества заканчиваются.
В данном примере я соглашусь с pproger - с goto нагляднее получается.
MaTBeu вне форума Ответить с цитированием
Старый 05.04.2010, 11:43   #15
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Vago
Цитата:
пс. не надо только приводить пример с дополнительной фунцией помощником. это и так всем ясно, но это не всегда удобно
Код:
void GeneralErrMsg() {
    cout << "some error occur. clear resources" << endl;
}
ну я же просил...
я уже молчу о утечке памяти, которую ты внес в код...

Код:
void foo(int n) {

// я специально показал, что тут как будто выделяем память	
   char* pc;      //1 = new char;
   int* pi;       //1  = new int[50];

   FILE *f1, *f2;
   bool  isErr;   //2
   
   if ((f1 = fopen("f1", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
    // а ты ее не освободил. низачот.
    }
а, ты выделение перенес. не вариант. мне нужно использовать эту память постепенно, например сразу после открытия первого файла

Код:
void foo(int n) {
	
   char* pc;      //1 = new char;
   int* pi;       //1  = new int[50];
   FILE *f1, *f2;
   bool  isErr;   //2
   
   if ((f1 = fopen("f1", "w")) == NULL) {
      cout << "error opening file" << endl;
//1   goto END_FOO;
      GeneralErrMsg();    //2
      return;             //2
    }

    fread(pc, 1, 1, f1);

...
}
Цитата:
foo(); // Будем считать, что этот бессмысленный рекурсивный вызов был написан в полемическом запале
не, не будем. миллион раз уже сказал, что это просто пример, а не конкретный код из конкретного проекта. но раз ты уж такой дотошный, то отвечу. это плюсы, поэтому тут имеет место быть перегрузка, ибо сигнатуры функций различаются.
так что лучше посчитаем, что твой камент был написан в полемическом запале согласен?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 05.04.2010 в 12:02.
pproger вне форума Ответить с цитированием
Старый 05.04.2010, 12:20   #16
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
но это не всегда удобно
Чем это неудобно в данном примере?..

Цитата:
Сообщение от pproger Посмотреть сообщение
мне нужно использовать эту память постепенно, например сразу после открытия первого файла
Код:
   ...
   char* pc = NULL;   //1 = new char;
   int* pi = NULL;       //1  = new int[50];
   ...
   pc    = new char;       //2
   fread( pc, 1, 1, f1 );
   ...
   pi    = new int[50];    //2
   ...
   if ( pi != NULL )
      delete [] pi;
   if ( pc != NULL )
      delete pc;
...
Цитата:
Сообщение от pproger Посмотреть сообщение
так что лучше посчитаем, что твой камент был написан в полемическом запале согласен?
Нет Окуда ему взяться, запалу-то, на второй день Пасхи?... Под словом "бессмысленный" я имел в виду не формальную возможность / невозможность вызова, а то, где этот вызов делается. Вроде, выводим сообщение, что что-то пошло не так, освобождаем ресурсы и тут, бах, снова сами себя вызываем

Added 10:24 CET
О! Пардон! Мы не себя вызываем!.. Ну, сейчас и такой случай распишем...

Added 10:28 CET
Ну, в п/п этот вызов, естественно, перенести надо...
Код:
void GeneralErrMsg() {
   foo();
   cout << "some error occur. clear resources" << endl;
}

Последний раз редактировалось Vago; 05.04.2010 в 12:28.
Vago вне форума Ответить с цитированием
Старый 05.04.2010, 12:25   #17
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Vago
Цитата:
Чем это неудобно в данном примере?..
ну хотя бы дополнительной функцией. зачем мне делать отдельную функцию, если этот код будет работать только в функции foo(int n)?

Цитата:
Нет Окуда ему взяться, запалу-то, на второй день Пасхи?... Под словом "бессмысленный" я имел в виду не формальную возможность / невозможность вызова, а то, где этот вызов делается. Вроде, выводим сообщение, что что-то пошло не так, освобождаем ресурсы и тут, бах, снова сами себя вызываем
наша функция - void foo(int n);
гипотетически вызываем foo();
извини, но я в УПОР не вижу, где мы сами себя вызываем
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.04.2010, 12:31   #18
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Vago
Цитата:
Ну, в п/п этот вызов, естественно, перенести надо...
Код:
	char *pc = new char;
	int *pi = new int[50];
 ... 
тут еще пицот + 1 указатель
...
END_FOO:         
...
	foo(передаем сюда пицот + 1 параметр);
	cout << "some error occur. clear resources" << endl;
	delete [] pi;
	delete pc;
будешь в свой GeneralErrMsg передавать эти пицот + 1 параметров?
ты уже на данном этапе сравни разницу в коде. имхо, goto тут очень даже к месту, ибо красивее и понятнее
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 05.04.2010, 13:24   #19
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
будешь в свой GeneralErrMsg передавать эти пицот + 1 параметров?
Зачем? Если кто-то отважный уже сделал это за меня:
Код:
foo(передаем сюда пицот + 1 параметр);
Готовый обработчик ошибок вышел
Цитата:
Сообщение от pproger Посмотреть сообщение
ибо красивее и понятнее
Острее всех смысл этих слов ощущает обычно сопровождающий программист, вынужденный взяться за старый проект через два года после того, как автор уволился...
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler'ные вставки и goto coNsept C++ Builder 22 21.06.2010 15:22
goto Serg12 Помощь студентам 12 14.06.2010 17:31
GoTo Diego__ Microsoft Office Word 3 13.03.2010 19:55
чем заменить goto? Agronom Общие вопросы C/C++ 3 19.12.2009 19:43
php goto TDrive PHP 10 28.07.2009 00:04