парсер выражений
для начала пытаюсь сделать распознавание числа (считывание с одного edit и вывод в другой)
вылетает ошибка Access violation of adress 40009739 in module 'rtl60.bpl'. Read of adress FF8B9090.
double __fastcall TForm1::pars(double x)
{
String s=Edit1->Text;
char zifr[]="0123456789,";
double vih[100];
String chislo;
bool flag=false;
int k=0;
int i,z,j;
String h;
for (i=0;i<s.Length();i++)
{ switch(s)
{case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case ',':
flag=true;
while(flag==true){
for (z=i;z<s.Length();z++){
for (j=0;j<12;j++){
if (s[z]==zifr[j]){
chislo=chislo+s[z];}
else {flag=false;}
}
}}
vih[k]=StrToFloat(chislo);
k=k+1;
break;
}}
Edit2->Text=FloatToStr(vih[0]);
return 0;
}
В массиве zifr 11 значений. Делайте выводы.
Ещё замечание. Почему размер массива vih именно 100? А если этого не хватит? Используйте взамен, например, std::vector - он может динамически расширяться.
Ещё: заключайте код в теги [noparse]
Код:
P.S. за имена zifr, vih, chislo - расстреливать на месте. Также как и за Edit1, Edit2.
Цитата: koodeer
P.S. за имена zifr, vih, chislo - расстреливать на месте
из рогаток.
Как впрочем и за такой индийский код. Вот уж действительно - кроме как мат.выражения тут трудно подобрать. Аффтор - если надо "считывание с одного edit и вывод в другой" - то для этого всего навсего надо проверить что введенное есть число - и записать его в другой эдит. Все. Т.е. примерно такой код:
Код:
String result = edInput->Text;
try{
int test = StrToInt(result);
}
catch(...){
ShowMessage("введено не корректные данные");
return;
}
edOutput->Text = result;
try{
int test = StrToInt(result);
}
catch(...){
ShowMessage("введено не корректные данные");
return;
}
edOutput->Text = result;
например. Зачем все остальное?
Код:
for (i=0;i<=strlen(ch);i++)
{switch(ch)
{case 'x':
vih2[m]=FloatToStr(x);
m++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case ',':
for (j=0;j<12;j++){
if (ch==zifr[j]){
chislo=chislo+ch;}}
vih2[m]=chislo;
break;
case '+':
m++;
chislo="";
while(stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='-';
break;
case '-':
m++;
chislo="";
while (stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; stack[l]=NULL; m++; l--;}
stack[l]='-';
l++;
break;
case '*':
m++;
chislo="";
while (stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='*';
break;
case '/':
m++;
chislo="";
while(stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='/';
break;
case '^':
m++;
chislo="";
while(stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='^';
break;
case '(':
chislo="";
l++;
stack[l]='(';
break;
case ')':
while(stack[l]!='('){vih2[m]=stack[l];l--;m++;}
if (stack[l]=='('){l--;}
break;}}
if (stack[l]==NULL){l=l-1;}
m++;
for (i=l;i>=0;i--){vih2[m]=stack; m++;}
m=1;
l=2;
for (i=0; i<100;i++){
if (vih2=='+'){
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])+StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;
}
if (vih2=='*'){
l=2;
m=1;
if ((vih2[i-l]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-m]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;}}
z=StrToFloat(vih2[i-l])*StrToFloat(vih2[i-m]);
vih2[i-l]=FloatToStr(z);
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='/'){
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])/StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='-'){
l=2;
m=1;
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])-StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='^'){
l=2;
m=1;
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(pow(StrToFloat(vih2[i-l]),StrToFloat(vih2[i-m])));
vih2[i-m]=NULL;
vih2=NULL;}
}
Edit2->Text=vih2[0];
return 1;
}
{switch(ch)
{case 'x':
vih2[m]=FloatToStr(x);
m++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case ',':
for (j=0;j<12;j++){
if (ch==zifr[j]){
chislo=chislo+ch;}}
vih2[m]=chislo;
break;
case '+':
m++;
chislo="";
while(stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='-';
break;
case '-':
m++;
chislo="";
while (stack[l]=='+'|| stack[l]=='-'|| stack[l]=='*'|| stack[l]=='/'|| stack[l]=='^'){vih2[m]=stack[l]; stack[l]=NULL; m++; l--;}
stack[l]='-';
l++;
break;
case '*':
m++;
chislo="";
while (stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='*';
break;
case '/':
m++;
chislo="";
while(stack[l]=='*' || stack[l]=='/' || stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='/';
break;
case '^':
m++;
chislo="";
while(stack[l]=='^')
{vih2[m]=stack[l]; m++; stack[l]=NULL; l--;}
l++;
stack[l]='^';
break;
case '(':
chislo="";
l++;
stack[l]='(';
break;
case ')':
while(stack[l]!='('){vih2[m]=stack[l];l--;m++;}
if (stack[l]=='('){l--;}
break;}}
if (stack[l]==NULL){l=l-1;}
m++;
for (i=l;i>=0;i--){vih2[m]=stack; m++;}
m=1;
l=2;
for (i=0; i<100;i++){
if (vih2=='+'){
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])+StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;
}
if (vih2=='*'){
l=2;
m=1;
if ((vih2[i-l]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-m]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;}}
z=StrToFloat(vih2[i-l])*StrToFloat(vih2[i-m]);
vih2[i-l]=FloatToStr(z);
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='/'){
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])/StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='-'){
l=2;
m=1;
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(StrToFloat(vih2[i-l])-StrToFloat(vih2[i-m]));
vih2[i-m]=NULL;
vih2=NULL;}
if (vih2=='^'){
l=2;
m=1;
if ((vih2[i-2]==NULL)&&(i>2)){
l=2;
while(vih2[i-l]==NULL){
l++;
}
l++;
while(vih2[i-l]==NULL){
l++;
}}
if ((vih2[i-1]==NULL)&&(i>1)){
m=1;
while(vih2[i-m]==NULL){
m++;
}}
vih2[i-l]=FloatToStr(pow(StrToFloat(vih2[i-l]),StrToFloat(vih2[i-m])));
vih2[i-m]=NULL;
vih2=NULL;}
}
Edit2->Text=vih2[0];
return 1;
}
Алгоритм ОПЗ. При вводе некоторых выражений считает неправильно и со скобками и х выдаёт ошибку о том что не может переделать " во float. Что нужно подправить?
ДНК. Советую для этого дебаггер.