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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2013, 13:17   #1
noizy
Новичок
Джуниор
 
Регистрация: 22.02.2013
Сообщений: 2
По умолчанию Работа функции

Погуглить не дало результатов, вопрос следующий
Есть написанная мной функция на проверку правильности ввода float-a
Код:
float TestForFloat() {
	float x=0;                                  //переменные
	bool tffb=0;
	while (tffb!=1) {
		char ch=0;                     //обнуление переменных
		short i=0;
		short zap=0;
		char * inpt=(char*)malloc(1024);
		scanf("%s",inpt);             //ссчитывание в временную строку inpt
                      sscanf(inpt, "%f",&x);       //занесение в отдельную переменную для дальнейшей проверки (см. вопрос)

/*Посимвольная проверка по ASCII-коду и проверка на единственность запятой (код 44)*/

		for (i=0; i<=strlen(inpt)-1;i++) { 
			ch=inpt[i];
			if (ch==44) 
				zap++;
			if ((((ch<48)||(ch>57))&&(ch!=44))||(zap>1)) {
				printf("Некорректный ввод, повторите: ");
				break;
			}
		}

/*Проверка на количество занесенных символов, условие выхода и перенесение из строки в float x */

		if (i!=strlen(inpt))              //*метка* &&(x<=2)
			fflush(stdin);
		else {
			sprintf(inpt,"%f",x);
			tffb++;
			}
	}
	return x;
}
Внимение, вопрос. В ходе программы приходится проверять несколько флоатов и для некоторых из них указаны дополнительные условия (<=2, например). Можно ли это как-то указать в аргументе функции или каким-либо еще образом, чтобы не писать проверку каждый раз и не дописывать в ней условие?

P.S. *метка* указывает место в программе, куда неплохо было бы встроить код. Можно, конечно, вложенным условием
Заранее спасибо
noizy вне форума Ответить с цитированием
Старый 22.02.2013, 14:50   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) scanf() возвращает число успешно прочитанных аргументов.
2) Если я правильно понимаю Ваш вопрос, Вы хотите передавать в функцию в качестве аргумента некоторое произвольное условие. Это можно сделать, например, с помощью указателя на функцию:
Код:
float TestForFloat(bool (*condition)(float)){
  //...
  if(condition(x)){
    //Всё в порядке
  } else {
    //Переданное в функцию условие не выполнено
  }
}

//...

bool IsNoMoreThan2(float f){
  return f<=2;
}
//...

float result = TestForFloat(IsNoMoreThan2);
Abstraction вне форума Ответить с цитированием
Старый 22.02.2013, 15:27   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

a) память выделяется в цикле
б) нигде не освобождается
в) нигде не указывается сколько читать, т.е. буфер можно переполнить.
waleri вне форума Ответить с цитированием
Старый 06.03.2013, 17:42   #4
noizy
Новичок
Джуниор
 
Регистрация: 22.02.2013
Сообщений: 2
Хорошо

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Цитата:
Сообщение от waleri Посмотреть сообщение
Большое спасибо, память освободил, всё работает
noizy вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа функции ЕСЛИ drimdonetsk Microsoft Office Excel 4 11.09.2012 14:28
С#...Работа с указателями на функции. Serg94 C# (си шарп) 2 21.04.2012 22:05
Работа агрегатной функции max() AlexInspire SQL, базы данных 2 21.02.2010 18:13
Работа функции Sleep delphinewerklin Общие вопросы Delphi 1 17.02.2010 18:30
C++,функции,работа со стрингами NamelessEndless Помощь студентам 3 12.11.2008 00:46