?? editor2numric.cpp
字號:
// editor2numric.cpp: implementation of the editor2numric class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "richtest.h"
#include "editor2numric.h"
#define MAXLINECNT 1024
#define BASELTH 4
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define NONE 0
#define INFO 1
#define TYPE 2
#define COUNT 4
#define DATA 8
#define LINEXCOLUMN 16
#define NAME 32
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void editor2numric::bump(int line_num1,int line_num2,CRichEditCtrl* edit,char* sss,int n)
{
char bag[5];
CString info;
info.Format(sss,n);
int length=sprintf(bag,"%d",line_num1);
for(int v=0;v<length;v++)
info+=bag[v];
info+="行——第";
length=sprintf(bag,"%d",line_num2);
for(v=0;v<length;v++)
info+=bag[v];
info+="行";
AfxMessageBox(info);
int line_index=edit->LineIndex(line_num1-1);
edit->SetSel(line_index,line_index+6);
}
void editor2numric::error_input(int line_num,CRichEditCtrl* edit,char* sss,int n)
{char bag[5];
CString info;
info.Format(sss,n);
int length=sprintf(bag,"%d",line_num);
for(int v=0;v<length;v++)
info+=bag[v];
CString hang="行";
info+=hang;
AfxMessageBox(info);
int line_index=edit->LineIndex(line_num-1);
edit->SetSel(line_index,line_index+6);
}
editor2numric::editor2numric(mydata *data,CRichEditView* in_editor)
{ pdata=data;
reditor=in_editor;
total_count=0;
};
editor2numric::editor2numric(mydata *data,CString* in_editor)
{ pdata=data;
total_count=0;
};
void editor2numric::file2double(mydata *data,CArchive& ar)
{ int count=0,i=0;
CFile* fp=ar.GetFile();
int lth=fp->GetLength();
char* bag0=new char[64];
double* ibag=new double[lth/2];
char* bag=bag0,c;
do{
count++;
ar>>c;
}while(c!='{'&&count<lth);
do{ count++;
ar>>c;
if(c>='0'&&c<='9')
*(bag++)=c;
else if((c==',')||c=='}')
{
*(ibag+i++)=atof(bag0);
bag=bag0;
if(c=='}')
goto tail;
}
}while(count<lth);
tail: data->set_data(NULL,BASELTH,type_dou,i,ibag);
delete []bag0;
delete []ibag;
}
int editor2numric::InputData()
{ BOOL matrix=0,mw_name=FALSE,bline=FALSE,bcolumn=FALSE,blc=FALSE,error=FALSE;
int where=0,the_line=0,the_column=0,current_line=0;
BOOL empty=TRUE;
int line_flag=0;
char *buffer0=new char[1000];
char *buffer=buffer0;
char *name[100];
int name_length[100];
memset(name_length,0,100*sizeof(int));
for(int u=0;u<100;u++)
name[u]=new char[128];
// char *name=name0;
int info_length=0;
mytype the_type;
int the_count=0,mwn=0;
int matrix_line[100];
int matrix_column[100];
double hl[2];
double *data0=new double[1000];
double *data=data0;
int type_line_num=0,count_line_num=0,last_data_line_num=0;
// int type_line_len,count_line_len,last_data_line_len;
// TODO: Add your command handler code here
CRichEditCtrl& edit=reditor->GetRichEditCtrl();
char* line=new char[1000];
int line_count=edit.GetLineCount();;
int i,line_flag_last=line_flag,j,real_count=0;
int char_count;
if(line_count)
{
// transfer_line(line,line_flag,line_flag_last);
for(i=0;i<line_count;i++)
{
char_count=edit.GetLine(i,line);
if(this->is_from_file(line,char_count))
{ static CString filename,line;
filename.Empty();
CFileDialog dlg(TRUE);
if(IDOK==dlg.DoModal())
{filename=dlg.GetFileName();
}
if(!filename.IsEmpty())
{static char* bag0,*bag;
CFile* filebin=new CFile(filename,CFile::modeRead);
if(filebin!=NULL)
{
CArchive ar(filebin,CArchive::load);
file2double(pdata,ar);
goto end;
}
}
}
}
if(line_count<2)
goto end;
line_flag_last=line_flag;
for(i=0;i<line_count;i++)
{
char_count=edit.GetLine(i,line);
int m=0;
for(m=0;m<4;m++)
*(line+char_count++)=';';
line_flag=analize_line(line,char_count,&where);
if(line_flag&INFO)
{
if(line_flag_last&DATA)
{if(((real_count>0)&&(real_count==the_count))||(the_count==0))
{info_length=buffer-buffer0;
if(!matrix)
pdata[total_count++].set_data(buffer0,info_length,the_type,real_count,data);
else
if(current_line!=the_line)
{error=TRUE;
char sss[]="矩陣行沖突";
bump(count_line_num,count_line_num,&edit,sss,sizeof(sss));
goto end;
}
else pdata[total_count++].mset_data(buffer0,info_length,the_type,name,name_length,matrix_line,matrix_column,mwn,data);
memset(name_length,0,mwn*sizeof(int));
empty=TRUE;
data=data0;
buffer=buffer0;
line_flag_last=NONE;
the_count=0;
real_count=0;
matrix=FALSE;
mwn=0;
mw_name=FALSE;
bline=FALSE;
bcolumn=FALSE;
current_line=0;
}
else if(the_count!=0)
{error=TRUE;
char sss[]="數據數量不符:第";
bump(count_line_num,last_data_line_num,&edit,sss,sizeof(sss));
goto end;
}
}
line_flag_last|=INFO;
for(j=where+1;j<char_count-1;j++)
*buffer++=*(line+j);
}
else if(line_flag&TYPE)
{ if((line_flag_last&TYPE)&&real_count<.5)
{error=TRUE;
char sss[]="數據類型反復定義:第";
bump(type_line_num,i+1,&edit,sss,sizeof(sss));
goto end;
}
else {if(real_count>.5)
{info_length=buffer-buffer0;
if(!matrix)
pdata[total_count++].set_data(buffer0,info_length,the_type,real_count,data);
else if(current_line!=the_line)
{error=TRUE;char sss[]="矩陣行沖突";
bump(count_line_num,count_line_num,&edit,sss,sizeof(sss));
goto end;
}
else pdata[total_count++].mset_data(buffer0,info_length,the_type,name,name_length,matrix_line,matrix_column,mwn,data);
memset(name_length,0,mwn*sizeof(int));
empty=TRUE;
data=data0;
buffer=buffer0;
line_flag_last=NONE;
the_count=0;
real_count=0;
matrix=FALSE;
mwn=0;
mw_name=FALSE;
current_line=0;
bline=FALSE;
bcolumn=FALSE;
}
the_type=(mytype)line2type(line,char_count,where);
type_line_num=i+1;
line_flag_last|=TYPE|INFO;
if(the_type==type_mw)
matrix=TRUE;
}
}
else if(line_flag&COUNT)
{ if(line_flag_last&COUNT)
{error=TRUE;char sss[]="數據數量反復定義:第";
bump(count_line_num,i+1,&edit,sss,sizeof(sss));
goto end;
}
else
{
the_count=line2count(line,char_count,where);
count_line_num=i+1;
if(the_count<0)
{error=TRUE;char sss[]="數據數量不能夠是負數:第";
error_input(i+1,&edit,sss,sizeof(sss));
goto end;
}
line_flag_last|=COUNT;
}
}
else if(line_flag&DATA)
{if(line_flag_last&TYPE)
{ mw_name=FALSE;
// line_flag_last-=16;
int count;
line_flag_last|=DATA;
count=line2double(line,char_count,data,where,real_count);
if(the_type==type_mw)
{blc=FALSE;
if(!(line_flag_last&LINEXCOLUMN)&&bcolumn==FALSE)//美定義行列,第一行為準
{
matrix_column[mwn]=count-real_count;
the_column=matrix_column[mwn];
bcolumn=TRUE;
};
mwn++;
if(count!=real_count)
current_line++;
if(current_line>the_line&&bline)
{error=TRUE;char sss[]="矩陣行沖突";
bump(i-the_line,i,&edit,sss,sizeof(sss));
goto end;
}
}
if(bcolumn)
if(count-real_count!=the_column)
{error=TRUE;char sss[]="矩陣列沖突";
bump(i,i+1,&edit,sss,sizeof(sss));
goto end;
}
if(count>real_count)
last_data_line_num=i+1;
real_count=count;
if(i==line_count-1)
{info_length=buffer-buffer0;
if(!matrix)
pdata[total_count++].set_data(buffer0,info_length,the_type,real_count,data);
else if(current_line!=the_line)
{error=TRUE;char sss[]="矩陣行沖突";
bump(count_line_num,count_line_num,&edit,sss,sizeof(sss));
goto end;
}
else pdata[total_count++].mset_data(buffer0,info_length,the_type,name,name_length,matrix_line,matrix_column,mwn,data);
}
if(real_count)
empty=FALSE;
}
else
{error=TRUE;char sss[]="數據類型未定義";
error_input(i+1,&edit,sss,sizeof(sss));
goto end;
}
}
else if(line_flag==LINEXCOLUMN)
{if(line_flag_last&LINEXCOLUMN&&blc==TRUE)
{error=TRUE;char sss[]="矩陣維數反復定義:第";
bump(i,i+1,&edit,sss,sizeof(sss));
goto end;
}
else
{
int ccc=line2double(line,char_count,hl,where,0);
if(ccc==2)
{ matrix_line[mwn]=hl[0];
matrix_column[mwn]=hl[1];
the_line=hl[0];
the_column=hl[1];
blc=TRUE;
// if(mw_name)
// mwn++;
}
count_line_num=i+1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -