Форум программистов, компьютерный форум CyberForum.ru

Сохранение всех входящих лексем(строк) в порядке поступления - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
=TrappeR=
3 / 3 / 1
Регистрация: 02.12.2008
Сообщений: 11
03.12.2008, 16:18     Сохранение всех входящих лексем(строк) в порядке поступления #1
Уже ни первый день бьюсь над ошибкой в подпрограмме транслятора?
Цель подпрограммы: сохранение всех входящих лексем(строк) в порядке поступления.
Описание: в динамическом массиве сохраняются только ранее неизвестные лексем. А порядок поступления обеспечивает массив указателей, ссылаясь на динамический массив.
Реализация:
Код
struct entry {
    char importance[31];
};

struct entry *symtable =            /* Таблица символов. */
    (struct entry *)malloc(100);
char **term = (char **)malloc(999); /* Массив указателей */
int lastentry = 0;                  /* Последняя использованная
                                       позиция в таблице символов.  */
int lastterm = 0;                   /* Последняя введенная лексема. */

int Table::lookup(const char *s)
{   /* поиск строки s среди лексем в порядке последнего вхождения */
    for (int i = lastentry; i >= 0; i--)
        if (strcmp(symtable[i].importance, s) == 0)
            return i;
    return 0;
}

void insert(const char *s)
{	/* сохранение входящих лексем в порядке поступления. */
    lastentry++;
    lastterm++;
    int buf = lookup(s);
    if  (buf == 0) {
        /* сохраним лексему в динамическом массиве: */
        strcpy(symtable[lastentry].importance, s); */
        /* сохраним позицию лексемы во входном потоке */
        term[lastterm] = symtable[lastentry].importance;  // !!!возможна ошибка
    } else {  /* лексема уже встречалась */
        /* сохраним только позицию лексемы во входном потоке */
        term[lastterm] = symtable[buf].importance;  // !!!возможна ошибка!!!
    }
}

int getterm(char *s, int index)
{	/* присвоение строке s лексемы по индексу index */
    if (index >= 0 && index <= lastterm) {
        strcpy(s, term[index]);	// !!!ошибка возврата index==2 значения!!!
    return 1;
    }
    return 0;
}

Ошибка состоит в неправильном выводе именно третьего сохраненного значения, к примеру ввожу лексему “int” выводит каракули. Все предыдущие и последующие значения выводятся правильно!
Заранее благодарен. :drink:
Добавлено через 19 часов 42 минуты 54 секунды
Добавляю: ошибка состоит в неправильном выводе именно третьего сохраненного значения, к примеру ввожу лексему “int” выводит каракули. Все предыдущие и последующие значения выводятся правильно!
Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.12.2008, 16:18     Сохранение всех входящих лексем(строк) в порядке поступления
Посмотрите здесь:

C++ Посчитать сумму всех цифр,входящих в текст
объединение лексем в единое целое C++
Сортировка строк в алфавитном порядке C++
Разбивка на лексемы и состовление из лексем строк C++
C++ Обработка строк. Печать по одному разу в алфавитном порядке всех строчных гласных русских букв, входящих в текст
Строки. Программа печати в возрастающем порядке всех цифр, входящих в запись числа C++
Написать программу, которая предлагает пользователю ввести два числа, которые определяют диапазон, и выводит в консоль сумму всех чисел, входящих в C++
Класс лексем, разбить числа C++
Выделение лексем C++
Вывести содержимое стека в порядке поступления элементов в стек C++
Сохранение строк с кириллицей в файлах C++
C++ Написать анализатор кода, определяющий тип лексем

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,844
Завершенные тесты: 1
03.12.2008, 17:06     Сохранение всех входящих лексем(строк) в порядке поступления #2
для копирования массива символов юзай strcpy
=TrappeR=
3 / 3 / 1
Регистрация: 02.12.2008
Сообщений: 11
03.12.2008, 18:59  [ТС]     Сохранение всех входящих лексем(строк) в порядке поступления #3
Цитата Сообщение от WooDooMan Посмотреть сообщение
для копирования массива символов юзай strcpy
так я и копирую: strcpy(s, term[index]); где term[index] - указатель на массив указателей!
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,844
Завершенные тесты: 1
04.12.2008, 09:17     Сохранение всех входящих лексем(строк) в порядке поступления #4
а тут:
term[lastterm] = symtable[lastentry].importance;
или тут:
term[lastterm] = symtable[buf].importance;
=TrappeR=
3 / 3 / 1
Регистрация: 02.12.2008
Сообщений: 11
04.12.2008, 11:34  [ТС]     Сохранение всех входящих лексем(строк) в порядке поступления #5
Цитата Сообщение от WooDooMan Посмотреть сообщение
а тут:
term[lastterm] = symtable[lastentry].importance;
или тут:
term[lastterm] = symtable[buf].importance;
в этих двух случаях, если я правильно понимаю, сохраняются только указатели из динамического массива symtable[] в массиве указателей term[].
Код
[U][B]Пример:[/B][/U] сохраняются две строки “a1” и “a1” (одинаковые!):
insert(“a1”);
           /* в первом случае заносим строку в динамический массив */
	strcpy(symtable[lastentry].importance, s); 
	/* и сохраняем указатель на эту строку “a1” *.
	term[lastterm] = symtable[lastentry].importance;
insert(“a1”);
	/* во втором случае так как строку уже сохранялось, 
               за что отвечает ф-я buf = lookup();,
	    сохраним только указатель на первую строку “a1” */
	term[lastterm] = symtable[buf].importance;
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,844
Завершенные тесты: 1
04.12.2008, 11:39     Сохранение всех входящих лексем(строк) в порядке поступления #6
ну погоди term - это массив указателей на массив символов, symtable - тоже, а ты же копируешь один массив символов в другой, тогда почему же здесь ты делаешь так: strcpy(symtable[lastentry].importance, s);, а в тех случаях что я показал раньше, иначе, в чем отличия?
Yandex
Объявления
04.12.2008, 11:39     Сохранение всех входящих лексем(строк) в порядке поступления
Ответ Создать тему
Опции темы

Текущее время: 05:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru