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

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

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

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

03.12.2008, 16:18. Просмотров 1126. Ответов 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++
Заполнить стек значениями произвольного типа. Вывести содержимое стека в порядке поступления элементов в стек. как это и можно теорию...

Посчитать сумму всех цифр,входящих в текст - C++
Дан текст.Посчитать сумму всех цифр,входящих в текст. Пример. Если к 12 прибавить 2,то получим 14. Результат.10 Пояснение 1+2+2+1+4=10

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,885
Завершенные тесты: 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,885
Завершенные тесты: 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,885
Завершенные тесты: 1
04.12.2008, 11:39 #6
ну погоди term - это массив указателей на массив символов, symtable - тоже, а ты же копируешь один массив символов в другой, тогда почему же здесь ты делаешь так: strcpy(symtable[lastentry].importance, s);, а в тех случаях что я показал раньше, иначе, в чем отличия?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2008, 11:39
Привет! Вот еще темы с ответами:

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

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

Напечатать позиции всех входящих в строку символов в алфавитном порядке: проверка кода - Free Pascal
Для введенной пользователем строки напечатать позиции всех входящих в неё символов (кроме пробелов) в алфавитном порядке. Для символов,...

Строка: Составить программу печати в возрастающем порядке всех цифр, входящих в десятичную запись данного числа. - Turbo Pascal
Составить программу печати в возрастающем порядке всех цифр, входящих в десятичную запись данного числа.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.12.2008, 11:39
Ответ Создать тему
Опции темы

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