Здравствуйте. Есть программа. Читает из файла слова, и проверяет не являются ли они ассемблерными мнемониками.
Вот ее код
List.h
Код:
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
#include <string>
using namespace std;
struct list{ //ИНТЕРФЕЙС СВЯЗНОГО СПИСКА
string data;
list *next;
void initialize();
void add (string dat);
bool search(string dat);
};
#endif // LIST_H_INCLUDED
List.cpp
Код:
#include <iostream>
#include "list.h"
using namespace std;
void list::initialize() { //ЕГО РЕАЛИЗАЦИЯ
data = "";
next = NULL;
}
void list::add(string dat){
list *tmp = this;
while (tmp->next != NULL) tmp=tmp->next;
list *newList = new list;
tmp->next = newList;
newList->data = dat;
newList->next = NULL;
}
bool list::search(string dat){
list *tmp = this;
while(tmp!=NULL){
if(tmp->data == dat){
return true;
}
tmp = tmp->next;
}
return false;
}
Все, что выше - работает отлично. Там не должно быть проблем. Проблема однозначно в главном файле.
Main.cpp
Код:
#include <iostream>
#include <fstream>
#include <string>
#include "list.h"
const int hashTableSize = 1024; //РАЗМЕР ХЕШ ТАБЛИЦЫ
int strHash( const char *s){ // ХЕШИРОВАНИЕ
int h , a = 31415, b=27183;
for (h=0; *s!=0; s++, a = (a*b)%(hashTableSize-1))
h = (a*h + *s)%hashTableSize;
return (h<0) ? (h+hashTableSize) : h;
}
const struct { // ТАБЛИЦА АССЕМБЛЕРНЫХ КОМАНД
string name;
int code;
string temlate;
} table[]={
{"add", 1,"RRR"},
{"call", 16,"RM"},
{"dec", 4,"RRR"},
{"div", 20,"RRR"},
{"inc", 3,"RRR"},
{"jmp", 50,"RRM"},
{"mul", 21,"RRR"},
{"or", 13, "RR"},
{"sub", 2,"RRR"},
{"shl", 14,"RRS"},
{"shr", 15,"RRS"},
{"stb", 16,"RRC"}
};
int search (string str){ //БИНАРНЫЙ ПОИСК ПО ТАБЛИЦЕ
// ПРОСЛЕДИЛ ЧТО ВО ВРЕМЯ ЕГО И
//ВЫВАЛИВАЕТСЯ ПРОГРАММА
//НО ТОЛЬКО С ЧЕТВЕРТОГО РАЗА
int i = 0;
int j = (sizeof(table)/(sizeof(string)+sizeof(int)))-1;
while (i<=j){
int k = i + (j - i)%2;
if (str > table[k].name) i = k+1;
else if (str < table[k].name) j = k-1;
else{
return k; //ВОЗВРАЩАЕТ НОМЕР ЯЧЕЙКИ В ТАБЛИЦЕ ИМЕН
}
}
return -1; //ИЛИ -1 ЕСЛИ ТАКОГО НЕТ
}
int main(){
list hashTable[hashTableSize]; // ХЕШ ТАБЛИЦА
for (int i = 0; i < hashTableSize; i++) hashTable[i].initialize();
ifstream infile ("in");
if ( ! infile ){
cerr << "Error! Can not open file: " << infile << endl;
return -1;
}
char ch = '\0';
string word = "";
while (infile.get(ch)){
if ((int)ch > 64)
word+=ch;
else if ((int)ch < 65 && word.length() > 0) {
cout << "Strart" << endl;
int k = search(word); // УВЕРЕН, ЧТО ВЫПАДАЕТ ЗДЕСЬ
cout << "END Start"<<endl;
if ( k > -1){
cout << table[k].name << "\tis keyword. Opcode =\t" << table[k].code << endl;
word = "";
}
else {
if (!hashTable[strHash(word.c_str())].search(word)){
hashTable[strHash(word.c_str())].add(word);
cout << word << "\tis new name. Hash =\t" << strHash(word.c_str()) << endl;
word="";
}
else {
cout << word << "\tis old name. ERROR!! " << endl;
word = "";
}
}
}
}
}
ПРограмма работает, но только три раза)) Всмысле проверяет только три прочитанных слова. А потом на четвертом слове вываливается с ошибкой, что просит отправить микрософту отчет.
Что это может быть?
И еще попутно вопрос. Использую Code::Blocks + MinGw, и еще ни разу отладчиком не пользовался. А теперь, когда надо, не могу догнать как с ним работать. Он какой-то непонятный. Я вообще последний раз отладчиком пользовался турбо паскалевским)))). Вобщем как пользоваться тем отладчиком?