Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString Обработка ввода чисел / 8 сообщений из 8, страница 1 из 1
30.03.2013, 20:26
    #38205643
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Вообщем началось мое болезненное знакомство с ООП и есть проблемы с вводом данных. Есть функция(запрещающая вводить в числа мусор в виде посторонних символов), которая прекрасно работает в командной строке и объектах при использовании массива символов, но если заменить массив символов на AnsiString программа вылетает, ругаясь на память. Я так понимаю строке AnsiString нужно ставить в соответсвие массив символов, но это только догадки. Буду рад если кто нибудь раскажет про этот тип данных.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
double __fastcall InputCheck(AnsiString buf)
{
char string[256];
unsigned int n;
bool point,AllNumbers;
do
{
strcpy(string,buf.c_str());
point=0;
AllNumbers=0;
for(n=0;((string[n]>='0' && string[n]<='9')||string[n]=='-'
||string[n]=='.')&&n<=strlen(string)&&string[0]!='.';n++)
{
if(string[n]=='-' && n!=0) break;
if(string[n]=='.')
{
if(point==1) break;
else point=1;
}
}
if(n==strlen(string)) AllNumbers=1;
else
{
buf=InputBox("Введите X:","X=",' ');
}
}while(AllNumbers==0);
return atof(string);
}

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
double X=InputCheck(InputBox("Введите X:","X=",' '));
}



Вариант AnsiString:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
double __fastcall InputCheck(AnsiString string)
{
unsigned int n;
bool point,AllNumbers;
do
{
point=0;
AllNumbers=0;
for(n=0;((string[n]>='0' && string[n]<='9')||string[n]=='-'
||string[n]=='.')&&n<=string.Length()&&string[0]!='.';n++)
{
if(string[n]=='-' && n!=0) break;
if(string[n]=='.')
{
if(point==1) break;
else point=1;
}
}
if(n==string.Length()) AllNumbers=1;
else
{
string=InputBox("Введите X:","X=",' ');
}
}while(AllNumbers==0);
return StrToFloat(string);
}

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
double X=InputCheck(InputBox("Введите X:","X=",' '));
}
...
Рейтинг: 0 / 0
31.03.2013, 05:30
    #38205835
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
kab18Вообщем началось мое болезненное знакомство с ООП ...Теперь начни знакомство со справкой Билдера.
Индекс у AnsiString начинается с 1.
Код: plaintext
1.
2.
3.
AnsiString a;
a[0] неверно
a[1] верно

З.Ы. Еще посмотри компонент MaskEdit.
З.З.Ы. Embarcadero не торт. Взяли и справку испортили. В Билдере 6 такая замечательная справка была...
...
Рейтинг: 0 / 0
31.03.2013, 07:44
    #38205844
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Благодарю)
...
Рейтинг: 0 / 0
31.03.2013, 08:56
    #38205851
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Изменил код с учетом замечаний, но ошибка сохранилась, возможно в функцию следует передавать не саму строку, а указатель, как в случае с массивом символов.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
double __fastcall InputCheck(AnsiString string)
{
int n;
bool point,AllNumbers;
do
{
point=0;
AllNumbers=0;
for(n=0;((string[n]>='0' && string[n]<='9')||string[n]=='-'
||string[n]=='.'||string[n]==',')&&n<=string.Length()&&(string[1]!='.'||string[1]!=',');n++)
{
if(string[n]=='-' && n!=1) break;
if(string[n]=='.'||string[n]==',')
{
if(point==1) break;
else
{
point=1;
if(string[n]==',') string[n]='.';
}
}
}
if(n==string.Length()) AllNumbers=1;
else
{
string=InputBox("Введите X:","X=",'0');
}
}while(AllNumbers==0);
return StrToFloat(string);
}

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
double X=InputCheck(InputBox("Введите X:","X=",' '));
}
...
Рейтинг: 0 / 0
31.03.2013, 09:07
    #38205852
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Извеняюсь, поменял начальное значение в цикле с 0 на 1, но программа по прежнему вылетает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
double __fastcall InputCheck(AnsiString string)
{
int n;
bool point,AllNumbers;
do
{
point=0;
AllNumbers=0;
for(n=1;((string[n]>='0' && string[n]<='9')||string[n]=='-'
||string[n]=='.'||string[n]==',')&&n<=string.Length()&&(string[1]!='.'||string[1]!=',');n++)
{
if(string[n]=='-' && n!=1) break;
if(string[n]=='.'||string[n]==',')
{
if(point==1) break;
else
{
point=1;
if(string[n]==',') string[n]='.';
}
}
}
if(n==string.Length()) AllNumbers=1;
else
{
string=InputBox("Введите X:","X=",'0');
}
}while(AllNumbers==0);
return StrToFloat(string);
}
...
Рейтинг: 0 / 0
31.03.2013, 12:37
    #38205926
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
kab18, в отладчике смотрел?

З.Ы. Ты всегда так текст форматируешь или специально для форума, чтобы остальным "удобно" было?
...
Рейтинг: 0 / 0
31.03.2013, 15:27
    #38206054
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Исправил твой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
		bool comma_is_present, incorrect_input;

		do
		{
			comma_is_present = false;
			incorrect_input = false;

			int nmax=string.Length();
			for (int n = 1; n <= nmax; n++)
			{
				if (string[n] == '.' || string[n] == ',')
				{
					if (comma_is_present)
					{
						incorrect_input=true;
						break;
					}

					comma_is_present = true;
					string[n] = '.';
				}
				else if (string[n] == '-' && n != 1)
				{
					incorrect_input=true;
					break;
				}
				else if( string[n] < '0' || string[n] > '9')
				{
					incorrect_input=true;
					break;
				}
			}

			if (incorrect_input) string = InputBox("Введите X:", "X=", '0');

		}while(incorrect_input);

                return StrToFloat(string);

мой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
		bool incorrect_input;
		double rez;

		do
		{
			incorrect_input=false;
			try
			{
				rez=string.ToDouble();
			}
			catch(EConvertError &E)
			{
				incorrect_input=true;
				ShowMessage(E.Message);
				string = InputBox("Введите X:", "X=", '0');
			}
		}while(incorrect_input);

		return rez;

...
Рейтинг: 0 / 0
31.03.2013, 15:39
    #38206061
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AnsiString Обработка ввода чисел
Спасибо
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString Обработка ввода чисел / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]