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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
=TrappeR=
3 / 3 / 1
Регистрация: 02.12.2008
Сообщений: 11
#1

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

03.12.2008, 16:18. Просмотров 1124. Ответов 5
Метки нет (Все метки)

Уже ни первый день бьюсь над ошибкой в подпрограмме транслятора?
Цель подпрограммы: сохранение всех входящих лексем(строк) в порядке поступления.
Описание: в динамическом массиве сохраняются только ранее неизвестные лексем. А порядок поступления обеспечивает массив указателей, ссылаясь на динамический массив.
Реализация:
Код
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++
Дан текст.Посчитать сумму всех цифр,входящих в текст. Пример. Если к 12 прибавить 2,то получим 14. Результат.10 Пояснение 1+2+2+1+4=10

Дана строка. Подсчитать процентное содержание всех символов входящих в данную строку. C++ - C++
Дана строка. Подсчитать процентное содержание всех символов входящих в данную строку. Для подсчета использовать массив структур, где...

Найти сумму всех чётных строк матрицы и отсортировать элементы нечётных строк по возрастанию - C++
1.Задана матрица целых чисел.Найти сумму всех четных строк матрицы и отсортировать элементы не четных строк по возрастанию.

Написать программу, которая предлагает пользователю ввести два числа, которые определяют диапазон, и выводит в консоль сумму всех чисел, входящих в - C++
Написать программу, которая предлагает пользователю ввести два числа, которые определяют диапазон, и выводит в консоль сумму всех чисел,...

Выделение лексем - C++
Написать программу, использующую механизм управления при помощи таблиц (управление осуществляется данными!). Нужно выделить следующие...

Класс лексем, разбить числа - C++
class Token { public: // Вид лексемы double value; // Для...

объединение лексем в единое целое - C++
Программа должна считывать тел. номер в виде xxx-xxxx, затем с помощью функции strtok разбить его на 2 лексемы, а потом склеить их и...

Сохранение строк с кириллицей в файлах - C++
Здорова, котаны! Есть одна проблема: когда загружаешь строку с русскими символами в файл, в самом файле и при выгрузке(через fstream),...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 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
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 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
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
04.12.2008, 11:39     Сохранение всех входящих лексем(строк) в порядке поступления #6
ну погоди term - это массив указателей на массив символов, symtable - тоже, а ты же копируешь один массив символов в другой, тогда почему же здесь ты делаешь так: strcpy(symtable[lastentry].importance, s);, а в тех случаях что я показал раньше, иначе, в чем отличия?
Yandex
Объявления
04.12.2008, 11:39     Сохранение всех входящих лексем(строк) в порядке поступления
Ответ Создать тему
Опции темы

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