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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2010, 00:12   #1
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию ПРограмма вываливается с ошибкой.

Здравствуйте. Есть программа. Читает из файла слова, и проверяет не являются ли они ассемблерными мнемониками.
Вот ее код
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, и еще ни разу отладчиком не пользовался. А теперь, когда надо, не могу догнать как с ним работать. Он какой-то непонятный. Я вообще последний раз отладчиком пользовался турбо паскалевским)))). Вобщем как пользоваться тем отладчиком?
bullvinkle вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с ошибкой Алексей11111 Microsoft Office Excel 7 26.10.2009 11:12
вываливается прога R6034 [visual studio 2005 + mico] mannyz Общие вопросы C/C++ 0 28.07.2009 00:08
Помогите с ошибкой Wildangel0990 Помощь студентам 1 02.07.2009 18:58
Помогите с ошибкой Wildangel0990 Помощь студентам 6 02.07.2009 10:10
Структыры в С++ в борланд си, программа есть, но не работает... Помогите с ошибкой... Катюшенька Помощь студентам 2 29.03.2009 14:12