![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Krjuger |
![]()
Сообщение
#1
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем надо разработать класс,который будет переводить из обычной записи в постфиксную.
В общем никак не могу понять,что ему не нравица...Точнее я понимаю что за ошибку он выдает,но не могу понять как ее исправить....(Error 1 error C2533: 'PostWrite::{ctor}' : constructors not allowed a return type 22) |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Ты для начала описание класса заверши (точку с запятой поставь), а потом описывай методы:
class PostWrite! Добавлено через 16 мин. P.S. Зачем своя реализация stek, если есть std::stack? Подключи: include <stack>, и используй... |
Krjuger |
![]()
Сообщение
#3
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Мда ппц косяк,не заметил(((
Ладно исправил,потом кое что изменил.добавил возможный пример
ошибку выдает в PTR->c=a; в процедуре push(добавление элемента в стек).ошибка что то типа нет доступа для записи по какомото там адресу |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
А ты что хотел, чтобы у тебя PTR сам инициализировался? Ты выделяешь память под PRT вообще-то... PTR остается неинициализированным, вот тебе и ошибка доступа.
Не торопись, когда программу пишешь, программирование - не Formula I. |
Krjuger |
![]()
Сообщение
#5
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Мда моя безграмотность моя проблема.Ладно все эти ошибки я исправил,все стало нормально работать,вот только как лучше всего будет внести реализацию функций синуса косинуса и тд в эту программу?Я предполагаю создать какую нибудь буферную переменную и скидывать туда.
Сообщение отредактировано: Krjuger - 28.11.2009 18:49 |
Krjuger |
![]()
Сообщение
#6
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем попробовал добавить добавить поддержку функций,но моя попытка обернулась крахом,нужна помощ.
По задумке,я создал буферную переменную и если литера,то идет проверка и накапливание до тех пор пока в алфавите,а потом происходит сравнивание с множестов функций,если функция то записывается в стек ,как операция,если переменная то записывается в выходную строку.Но я не могу понять почему у мен ошибка. Для примера бралось a + (sin (b + c)).Происходила ошибка записи на моменте когда первый знак "+" должен был быть помещен в стек. |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Происходила ошибка записи на моменте когда первый знак "+" должен был быть помещен в стек. Ошибка у тебя происходит, когда ты пытаешься сделать:elseс неинициализированнй outstring. Тут программа вылетает. Это первое. Второе: если даже инициализировать строку: char outstring[80] = {0};, то программа правильно работать не станет. Она, конечно, теперь не вылетает, но результат выдает бредовый. Ищи ошибку в алгоритме. Третье: посмотри внимательно на свою строку func, и подумай, почему exp не будет определена как функция, даже если она присутствует во введенной пользователем строке? |
Krjuger |
![]()
Сообщение
#8
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Насчет экспоненты,да действительно она не будет присутстовавать,потому что для проверки на принадлежность в моем варианте необходимы пробелы с двух сторон а для экспоненты пробела после функции попросту нет,исправил.Над остальным пока думаю.
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Чего думать? Ты в одном месте заполняешь строку outstring через strcat (естественно, i при этом не изменяется), а в другом - через прямую запись: outstring[ i ] = ..., при этом то, что раньше было записано через strcat - перезаписывается. Вот тебе и источник проблем.
Теперь о функциях: нельзя так делать, как ты делаешь. Что у тебя происходит? Ты ПОБУКВЕННО запихиваешь название функции в стек, но он предназначен не для этого. Либо ставь каждой функции в соответствие какой-то номер (индекс, как угодно), и заталкивай его в стек, либо переписывай struct stek так, чтобы там хранился не один символ, а столько, сколько может понадобится для названия самой длинной функции. Но это потребует переделок программы. Еще раз: программа СИЛЬНО упростится, если вместо твоего самописного стека использовать std::stack<std::string>, подумай над этим... |
Krjuger |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Я бы с радостью,но со структурой и возможностями std::stack<std::string> я не знаком напроч,тогда раз лучше будет пойду ка я почитаю)
|
Krjuger |
![]()
Сообщение
#11
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем я решил доделать то что есть,я прекрасно поимаю,что то, что я пишу далеко от вершины грамотности и ужасно с точки зрения оптимизации,но других вариантов я пока что не вижу,потому что реализовывать через std по программе меня будут учить только в следующем семестре.В общем получилось что то в этом духе.
Вроде как бы оно работает с функциями правильно,вот только я не могу понять почему когда я функцию заменяю числом и записываю его в стек,по идее вместо чесла туда должна будет записаться литера стоящая под соответствующим номером в аски коде,но почему при каждом вызове программы эта буква(символ) меняется |
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
switch(*a)и так далее - это ты сам придумал? Так делать нельзя: Цитата(Стандарт С++) 6.4.2 The switch statement [stmt.switch] , у тебя под switch-ем выражение другого типа. Мало того, ты думаешь, что 'sin' = это то же самое что "sin"? Компилятор так не думает. Так что у тебя PostWrite::SetFunc() написана некорректно, и возвращает мусор. Переписывай через if-ы. И не забудь, что С-шные строки сравниваются не через ==, а через strcmp.1 The switch statement causes control to be transferred to one of several statements depending on the value of a condition. 2 The condition shall be of integral type, enumeration type, or of a class type for which a single conversion function to integral or enumeration type exists |
Krjuger |
![]()
Сообщение
#13
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
В общем я исправил все что надо и теперь с функциями более менее работает.Вот код
Появилась новая проблема,если попробовать пример (a * (b + c) + d) / 2 то программа правильно работает вплоть до момента когда доходит до d,содержание стека в момент обрабатывания операции + перед d,но когда переходит на обработку самой d, strcat(outstring, tmp);во первых сама переменная d туда уже не записывается в выходную строку и по неведомой причине портится стек. |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Раз:
{, два: {. Понимаешь в чем дело? Ты дописываешь символ в строку outstring, так ее после этого надо закрыть нулевым символом? Надо. Вот и закрываем. Теперь ошибки исчезли... Может, где еще проявятся, пройди по всей программе, там где ты делаешь outstring[i++] = чему_то, добавляй outstring[ i ] = '\0'; Если же строку нулем не закрыть, то добавляться tmp будет не к тому, что ты думаешь, а сначала strcat пробежит до первого попавшегося нуля, и только с того места пойдет добавление. А если ноль будет дальше, чем в 80 позиции? Вылет за границы строки. |
Krjuger |
![]()
Сообщение
#15
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Тогда чисто теоретический вопрос почему появились то проблемы со стеком,если бы я просто переменную d не смог бы записать,ну или коряво записывал бы, это понятно,тут то,что ты написал абсолютно верно,но почему же в момент записи моего значения в выходную строку портился стек.
|
Krjuger |
![]()
Сообщение
#16
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
С большими выражениями теперь более менее нормально, но ошибка появилась там,где ее не ждали.при варианте a+b*c получается ошибка в том что основной цикл переходит на 7 элемент,который забит мусором в результате цикл не прерывается ,а зацикливается.
|
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата но почему же в момент записи моего значения в выходную строку портился стек. А этого я тебе не говорил. Вот Билдер 2009, например, говорит:![]() Где здесь видно порчу стека? Другой компилятор по-другому отреагирует на выполнение этой программы. Ты чем пользуешься? Добавлено через 6 мин. Цитата при варианте a+b*c получается ошибка в том что основной цикл переходит на 7 элемент,который забит мусором в результате цикл не прерывается ,а зацикливается. Ничего не зациклилось, только что проверил, выдает ответ:a+b*c= |
Krjuger |
![]()
Сообщение
#18
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
У меня MVS 2008,а увидел что портится просто в дебагере пошагово просматривая вкладку Locals.Если ввести = то у меня тоже нормально,зато вот если просто ввести выражение то почему то не получается
Добавлено через 11 мин. Вот что именно происходит: До ![]() После ![]() Красный свидетельствует о том что на данной операции с "красными" переменными произведены изменения. Сообщение отредактировано: Krjuger - 2.12.2009 19:44 |
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
Так. Проблема - в том, что strchr ищет (и находит) символ '\0' в строке liter, и в любой другой строке тоже (ибо строка заканчивается этим символом, компилятор сам добавляет его к строковым литералам). Значит, надо проверять еще, что собственно символ, который проверяется - не NULL:
/* Повтоpяем , пока не дойдем до '=' */ Теперь корректно отрабатывает и со знаком =, и без него... Тестируй |
Krjuger |
![]()
Сообщение
#20
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
Я уже затюкал наверно с этой задачей,но опять нашлась ошибка.Припроходе по строке,если последнее действие умножение или деление,то происходит вылет за пределы строки и я из цикла не выхожу.
Описание класса совершенно не изменилось.Для примера использовать можно 10*a-b/2 ну или любое другое подобное выражение. |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 2:25 |