Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Програмаа вылетает с ошибкой во время работы 
V
    Опции темы
bullvinkle
Дата 23.3.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Добрый день. У меня есть программа. Читает из файла слова, и проверяет не являются ли они ассемблерными мнемониками.
Вот ее код:
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, и еще ни разу отладчиком не пользовался. А теперь, когда надо, не могу догнать как с ним работать. Он какой-то непонятный. Я вообще последний раз отладчиком пользовался турбо паскалевским)))). Вобщем как пользоваться тем отладчиком? 
PM MAIL ICQ   Вверх
RatHat
Дата 23.3.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



Еще бы увидеть хоть кусок того файла, из которого это всё читается...
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
bullvinkle
Дата 23.3.2010, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Да файл любой. Лишь бы там была хоть одна ассемблерная команда из таблицы что есть в моей программе.
Я тестирую на этом файле (в конечном итоге - это файл  нормальными ассемблерными инструкциями виртуального процессора, но до этого еще рано).
Код



add ; mull
or
  xor
off
            wer    raw
wer
 


Это сообщение отредактировал(а) bullvinkle - 23.3.2010, 14:18
PM MAIL ICQ   Вверх
borisbn
Дата 23.3.2010, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bullvinkle @  23.3.2010,  13:38 Найти цитируемый пост)
int j = (sizeof(table)/(sizeof(string)+sizeof(int)))-1;

совершенно непонятная строка.
sizeof(string) возвращает не длину строки, а размер класса string


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
RatHat
Дата 23.3.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



borisbn, ну так правильно, человек делит размер таблицы на размер одного элемента в таблице, получая тем самым количество элементов в таблице...
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
bullvinkle
Дата 23.3.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



НУ я догадывался, что sizeof(string) не очнь правильно.
Но вот такой код 
Код

int main()
{
    string s1 = "123212313213213213211656136543215461321";
    string s2 = "";
    string s3 = "123";
    string s4 = "231321321321321312";
    cout << sizeof(s1) << endl;
    cout << sizeof(s2) << endl;
    cout << sizeof(s3) << endl;
    cout << sizeof(s4) << endl;
}

Всегда говорит, что размер равен 4 байта. А мне это и надо. Т.е. не количество символов в строке, а сколько занимает класс.
РАзмер string может увеличится, если он будет содержать очень большую строку. Но в моем случае - это строки по 1 - 5 символов. Т.е. так и остается 4 байта.
PM MAIL ICQ   Вверх
borisbn
Дата 23.3.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



RatHat, да, протупил. но тогда всё равно неправильно. должно быть 
Код

j = (sizeof(table)/(sizeof(string)+sizeof(int)+sizeof(string)));

или, что ещё лучше
Код

j = sizeof( table ) / ( sizeof( table[ 0 ] );




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bullvinkle
Дата 23.3.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



borisbn, ТОЧНО! Спасибо!
Я просто фукцию search писал, когда в таблице не было дополнительного элемента - шаблона распознавания))))))
Спасибо, а то забыл, что таблицу менял))

А про то, как отладчиком пользоваться, никто не подскажет?
 
PM MAIL ICQ   Вверх
borisbn
Дата 23.3.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



bullvinkle, если бы сразу написал:
Код

j = sizeof( table ) / sizeof( table[ 0 ] );

то не нарвался бы на error


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
borisbn
Дата 23.3.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



и ещё. а ты уверен что в строке
Цитата(bullvinkle @  23.3.2010,  13:38 Найти цитируемый пост)
int k = i + (j - i)%2;

тебе нужен ОСТАТОК ОТ ДЕЛЕНИЯ на 2, а не ДЕЛЕНИЕ на 2


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
sdukshis
Дата 23.3.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



я написал небольшую глупость, но уже её удалил.

Это сообщение отредактировал(а) sdukshis - 23.3.2010, 18:04
PM MAIL   Вверх
bullvinkle
Дата 23.3.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.3.2008

Репутация: нет
Всего: нет



Опять неправильно сделал. Я перепутал, мне надо было целочисленное деление на 2, а не остаток.
Но функция работает (да и вся программа в целом после предыдущего исправления), хоть, оказывается, это совсем не бинарный поиск выходит)) поэтому и не перепроверил.
Спасибо!

Это сообщение отредактировал(а) bullvinkle - 23.3.2010, 18:55
PM MAIL ICQ   Вверх
RatHat
Дата 23.3.2010, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



Хм, сегодня все такие корректные, вежливые, аккуратные...мне даже ни разу не сказали, что я ламо коматозное...кошмар, что творится, в общем.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
GoldFinch
Дата 23.3.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



RatHat, все будет!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.