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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2015, 16:22   #1
Неон
 
Регистрация: 13.04.2011
Сообщений: 5
Вопрос В массиве самовольно меняются значения

Возникла такая проблема:
есть глобальный массив структур, в который поочередно записываются элементы, сам процесс записи вынесен в функцию вот она

Код:
void putl(int kk,int t, int jt) 
{
     if(t==4)//числа-констатнты
    {
        lex[kk].nom=t;
        lex[kk].name=itoa(d,s,10);
    }
    else
    {
        lex[kk].nom=t;
        lex[kk].name=buf; //buf - глобальная переменная
        lex[kk].Nstr=jt;
    }
}
в функцию передаются три параметра kL - счетчик записанных значений и два числа для значений структуры.

Вызов функции описан так (для примера)
Код:
putl(kL,2,0);
проблема в следующем при первой записи в массив все хорошо записывается, при второй на второе место записывается на новое значение, но при этом меняется еще и первый элемент массива, становится точно таким же как и второй.

Что нужно исправить? Я уже ничего не могу придумать.
Неон вне форума Ответить с цитированием
Старый 27.11.2015, 16:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да у тебя видимо не в этой функе причина... Код весь в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2015, 16:29   #3
Неон
 
Регистрация: 13.04.2011
Сообщений: 5
По умолчанию

весь код большой очень (это учебный лексический анализатор), все остальное работает идеально, в принципе и вывод тоже работает, т.к. на экран записи выводятся сразу после создания, но вот по окончании разбора в массиве оказывается n записей о последнем элементе.
Уже два дня ничего не могу сделать, что за глюк?
Неон вне форума Ответить с цитированием
Старый 27.11.2015, 19:07   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

У вас name случаем не указатель?
p51x вне форума Ответить с цитированием
Старый 28.11.2015, 09:18   #5
Неон
 
Регистрация: 13.04.2011
Сообщений: 5
По умолчанию

p51x,
вы правы указатель
описание структуры
Код:
typedef struct tabl {
    int nom; //тип лексемы
    char *name; //строковое представление
    int Nstr; //номер в таблице грамматики для разделителей и ключевых слов
    } ptabl;
P.S. от проблемы избавилась(не решила) жутким способом, но хотелось бы понять как решить проблему.
Неон вне форума Ответить с цитированием
Старый 28.11.2015, 10:14   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Познакомьтесь с семейством функции https://msdn.microsoft.com/ru-ru/library/kk6xf663.aspx
p51x вне форума Ответить с цитированием
Старый 28.11.2015, 15:45   #7
Неон
 
Регистрация: 13.04.2011
Сообщений: 5
По умолчанию

Т.е. вместо присвоения использовать strcpy?
Не знаю по какой причине с таким вариантом при работе программы происходит неожиданное завершение работы, компиляция проходит без ошибок, а в середине работы прога зависает и все, прекращение работы (использую codeblocks).
Неон вне форума Ответить с цитированием
Старый 28.11.2015, 15:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а в середине работы прога зависает и все, прекращение работы
Происходит переполнение стека, данные попадают не туда, куда нужно, вот и вылет.
Кстати, а string использовать не хочешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.11.2015, 17:28   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Кстати, а string использовать не хочешь?
Я пробовал в структурах использовать тип string. Выяснил такую штуку. Если создаётся статическая одиночная структура, стринг работает нормально. Если создаю обычный массив структур типа MyStruct array[100], тоже всё в порядке. Но, если пытаюсь создать динамический массив типа MyStruct *Array и добавляю в этот массив элементы в циле типа Array = new MyStruct, вот тут начинаются проблемы. Fatal error ..... "обращение к несуществующей области памяти". С чаром такой "беды" не наблюдается. В чём дело я разобрался, но это разговор не этой темы.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 28.11.2015, 17:37   #10
Неон
 
Регистрация: 13.04.2011
Сообщений: 5
По умолчанию

Stilet,
думала изменить char *name на char name[8] (условия задачи позволяют), но пока оставлю как есть, надо доделать программу, а потом если останется время буду совершенствовать.

Всем спасибо, очень помогли.
Неон вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Skype самовольно конфигурит мой модем yaapelsinko Безопасность, Шифрование 1 18.09.2013 13:46
Поиск части значения в массиве staniiislav Microsoft Office Excel 1 28.05.2012 09:19
Поиск промежуточного значения в массиве Vladislav2011 Microsoft Office Excel 4 12.05.2011 13:43
Поиск значения в массиве edikamn Microsoft Office Excel 7 20.10.2010 15:52
Поиск заданого значения в массиве rembodogoliver Microsoft Office Excel 5 05.02.2010 23:07