powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString Обработка ввода чисел
8 сообщений из 8, страница 1 из 1
AnsiString Обработка ввода чисел
    #38205643
kab18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообщем началось мое болезненное знакомство с ООП и есть проблемы с вводом данных. Есть функция(запрещающая вводить в числа мусор в виде посторонних символов), которая прекрасно работает в командной строке и объектах при использовании массива символов, но если заменить массив символов на 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
AnsiString Обработка ввода чисел
    #38205835
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kab18Вообщем началось мое болезненное знакомство с ООП ...Теперь начни знакомство со справкой Билдера.
Индекс у AnsiString начинается с 1.
Код: plaintext
1.
2.
3.
AnsiString a;
a[0] неверно
a[1] верно

З.Ы. Еще посмотри компонент MaskEdit.
З.З.Ы. Embarcadero не торт. Взяли и справку испортили. В Билдере 6 такая замечательная справка была...
...
Рейтинг: 0 / 0
AnsiString Обработка ввода чисел
    #38205844
kab18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю)
...
Рейтинг: 0 / 0
AnsiString Обработка ввода чисел
    #38205851
kab18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изменил код с учетом замечаний, но ошибка сохранилась, возможно в функцию следует передавать не саму строку, а указатель, как в случае с массивом символов.
Код: 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
AnsiString Обработка ввода чисел
    #38205852
kab18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извеняюсь, поменял начальное значение в цикле с 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
AnsiString Обработка ввода чисел
    #38205926
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kab18, в отладчике смотрел?

З.Ы. Ты всегда так текст форматируешь или специально для форума, чтобы остальным "удобно" было?
...
Рейтинг: 0 / 0
AnsiString Обработка ввода чисел
    #38206054
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил твой вариант
Код: 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
AnsiString Обработка ввода чисел
    #38206061
kab18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / AnsiString Обработка ввода чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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