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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 20:10   #1
igortokmak
 
Регистрация: 17.01.2010
Сообщений: 9
По умолчанию С++ лаба надо разобрать

const int table_size = 10;
struct asm_mnem{
char name[10];
int code;
int type;
};
enum {

register const char *n;
register crc32 hashval = 0xffffffff;
for (n = name; *n; n++)
hashval = (hashval >> 8) ^ consttab[(hashval ^ *n) & 0xff];
hashval ^= 0xffffffff;
return (hashval & (HASH_TABLE_SIZE-1));
}
int hentry[10000];
struct{
int next;
int namepos;
int data;
}hlists[5000];
char hnames[20000];
int nhlists = 0;
int nhnames = 0;
int main(int agrc, char* argv[]){
char buf[1024];
char ch=' ';
int i, j, k;
int left, right, mid, cmp;
int chain;
int key;
bool found;
asm_mnem mnems[table_size]=
{
{"add",1,1},
{"and",2,2},
{"div",3,1},
{"jmp",4,3},
{"ldd",5,3},
{"mov",6,4},
{"mul",7,1},
{"or", 8,2},
{"sub",9,1},
{"xor",10,1}
};
FILE *fmnem, *fout;
if ((fmnem=fopen("asm.txt","r"))==NULL ){
printf("Can not open a file!\n");
exit(1);
}
if ((fout=fopen("out.txt","w"))==NULL) {
printf("Can not open a file!\n");
exit(1);
}
for (i = 0; i<1000; i++)
hentry[i] = -1;
while (ch!=EOF){
for ( i=0; i<1024; i++){
buf[i] = ' ';}
left = 0;
right = table_size;
i = 0;
for (;{
ch = fgetc(fmnem);
if (ch == '\n' || ch == EOF){
break;}
buf[i] = ch;
i++;}
j = 0;
while (isspace(buf[j])){
j++; } //j-begin of mnem;
k = j;
while (isalnum(buf[k])){
k++; } //k - end of mnem;
buf[k] = 0;
//cmp
found=false;
while (left<=right)
{
mid=(left+right)/2;
cmp = stricmp(mnems[mid].name, buf+j);
if (cmp==0){
found = true;
break;}
else
if (cmp > 0){
right = mid-1;}
else {
left = mid+1;}
} //end_of_cmp
if (found){
fprintf(fout, "%s keyword, opcode = %d\n", buf+j, mnems[mid].code);}
else
{
char *cand = buf+j;
key = ComputeHashKey(cand);
chain = hentry[key];
while (chain != -1){
char *name = hlists[chain].namepos+hnames;
cmp = strcmp(cand, name);
if (cmp == 0){
fprintf(fout, "%s old name, hash = %d\n", cand, key);
break;}//if
chain = hlists[chain].next;
}//while
if (chain == -1){
chain = hentry[key];
hlists[nhlists].next = chain;
hlists[nhlists].namepos = nhnames;
hlists[nhlists].data = 0;
hentry[key] = nhlists;
nhlists++;
strcpy(hnames + nhnames, cand);
nhnames+=strlen(cand)+1;
fprintf(fout,"%s new name, hash = %d\n", cand, key);
}
}//else
} //end_of_file_reading
fclose(fmnem);
fclose(fout);
return 0;
}
igortokmak вне форума Ответить с цитированием
Старый 17.01.2010, 20:15   #2
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

я разобрал. что мне делать с разобраным? )))
_Ч_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобрать с матрицами svetlana891 Помощь студентам 4 18.06.2009 10:56
Помогите разобрать со String MasterofCDM Общие вопросы Delphi 12 06.06.2009 14:53
помогите задачу разобрать Настаська Помощь студентам 2 26.11.2008 16:16
Разобрать программу DarkDeivel Общие вопросы Delphi 13 21.09.2008 14:17
Помогите разобрать прогу! Mute Общие вопросы C/C++ 2 28.12.2006 11:34