Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос по символьной строке


Автор: Гость_Shorr Kan 31.5.2005, 19:34
У меня возникла проблема с символьной строкой. Из Edit считываю строку - мне всегда казалось, что это массив. А компилятор говорит, что не может перевести INT в CHAR.... В чем может быть дело?

Автор: Guest 31.5.2005, 19:36
Т.е., считываю первый элемент массива, а он говорит, что ошибка перевода INT в CHAR

Автор: Mayk 31.5.2005, 19:51
Странный компилятор... Int в char по жизни переводится без проблем.
А можно посмотреть проблемный участок кода?

Автор: bel_nikita 31.5.2005, 23:20
код в студию! smile

Автор: Гость_Shorr Kan 1.6.2005, 04:02
Вот так я объявил строку в конструкторе
Код

char cFormula[256];



А это происходит по нажатию кнопочки...
Код


   char buf[256]="";
   char buf1[256]="";
   
   EditFormula->GetLine(cFormula, 256, 0);
   strcpy(buf1,cFormula);
   ListBox->ClearList();
   //EditFormula->Clear();

   int len=strlen(cFormula);
   if(len==0){
      MessageBox("Не набрана формула!","Ошибка",MB_OK|MB_ICONINFORMATION);
   }else{

      //ListBox->AddString(cFormula);
      int count_skoba = 0;
      for(int i=0;i<len;i++)
      {
         //itoa(i,buf1,10);

         ListBox->AddString(cFormula[i]);
         
         //count_skoba = count_skoba +1;
       
      }


Хотелось разделить ее побуквенно, и закинуть в listbox... Вот cFormula[i] не могу прочесть. Пишет - Cannot convert int to const char *. Компилятор - Borland 5.02

Автор: Mayk 1.6.2005, 05:27
Не стоит путать char с char* - это совершенно разные типы.
Код

      for(int i=0;i<len;i++)
      {
         char tmp[2] = {cFormula[i],0}; 
         //itoa(i,buf1,10);
         ListBox->AddString(tmp);
         
         //count_skoba = count_skoba +1;
       
      }

должен спасти мир.

Автор: Guest 1.6.2005, 10:32
Дело вот в чем:
есть формула вида (a+b)*c
надо разобрать формулу по частям
(a+b)
результат*с
Пока придумал вариант посимвольно искать круглую скобу и вырезать ее...
Может кто подскажет вариант поинтереснее?

А конструкция вида:
Код

====
char str[2];
str[0] = cFormula[i];
str[1] = 0;
ListBox->AddString(str);
====
работает, спасибо, правда работает странно, ожидал несколько другого эффекта
если передать туда строку 2+4 выводит:
======= 
+
2
4
========


Откуда такой эффект?

Автор: ManiaK 1.6.2005, 11:47
Эк ты залез в дебри... тут тебе скорей всего надо Рекурсивно-Нисходящий алгоритм реализовывать. А это дело не пятиминутное и требует достаточно высокого уровня знаний по языку...

Вот ссылочка по теории:
http://algolist.manual.ru/syntax/parsear.php

Автор: segmentation_fault 1.6.2005, 15:13
Если ты точно знаешь формат твоей формулы, например если формат всегда будет c(a+b) то можно сделать так:
читаешь с начала строки символы и пока символы являются цифрами записываешь их в переменную c. потом игнорируешь следующий символ (это будет '(' ) и потом опять пока идут цифры записываешь их в переменную a. Опять же игнорируешь следующий '+' и записываешь всё до символа ')' в b. И потом просто вычисляешь формулу.
Вариант конечно гораздо хуже нормальных алгоритмов разбора зато проще некуда.

Автор: AISIN 1.6.2005, 19:49
Цитата(Guest @ 1.6.2005, 10:32)
Дело вот в чем:
есть формула вида (a+b)*c
надо разобрать формулу по частям
(a+b)
результат*с
Пока придумал вариант посимвольно искать круглую скобу и вырезать ее...
Может кто подскажет вариант поинтереснее?
Откуда такой эффект?

Анализируешь каждый символ выставляешь приоритеты выполнения команд и потом переводишь символы в цифры и находишь свое арифмитическое выражение согласно выставленным приоритетам!

Автор: Любитель 7.6.2005, 01:40
Для любого выражения я использовал такой разбор:
1. Функция разбирает бинарную операцию (поиском её в строке и удалением лишних пробелом).
2. Функция разбирает выражения без скобок (использую функцию 1). Заметим, что любое выражение без скобок состоит из чередующихся операндов и операций и заносим их в массивы, отдельно ставим флаг, есть ли вначале знак операции (унарной). Создаём также 3ий массив - приоритет операций (он может вычисляться отдельной функцией). Затем пока значение максимального элемента в последнем массиве (я использовал STL) > 0 вызываем предыдущую функцию с соответствующими параметрами. Обнуляем элемент последнего массива.
3. Функция разбора любого выражения. Принцип в том, что ищем самые внутренние скобки. Я ещё делал скобки для функций (если перед скобками имя функции стоит, а не операция).

ЗЫ. Я так делал (чисто учебный, естественно) свой скриптовый язык. Мой 'экзамен' в 11 классе. Кому интересно могу написать (хотя, наверно, наиболее интересно мне smile ) smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)