Russian Qt Forum

Программирование => С/C++ => Тема начата: Alexu007 от Сентябрь 07, 2013, 15:58



Название: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 07, 2013, 15:58
При запуске программы выскакивает предупреждение, сама же программа компилируется и работает правильно. На что он ругается?

C:\QtSDK\Alexu007\LongArifm\LA1\widget.cpp:158: предупреждение: suggest parentheses around comparison in operand of '|'

ругается на эту строчку в программе, тут цикл выполняется дополнительно ещё раз, если r равно 1:

Код
C++ (Qt)
for (int j=0 ; j < b.amount | r; j++)
       {
        ....
       }


Название: Re: О чем предупреждает Qt?
Отправлено: alex312 от Сентябрь 07, 2013, 16:07
1. даже гуглтранслейт нормально переводит сообщение. Компилятор тебе намекает что неплохо бы расставить скобочки вокруг '|' .
2. Ну и вообще условие выхода из цикла какое то странное. Ты вообще можеш сказать нафига оно такое странное и  что будет результатом выражения
Код
C++ (Qt)
j < b.amount | r
   :o


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 07, 2013, 16:41
В конце цикла если j == b.amount и r = 1 - цикл делает ещё один проход. Одинаково работает:

 
Код
C++ (Qt)
j < b.amount + r

если r = 0 цикл заканчивается, если 1 - выполняется ещё раз


Название: Re: О чем предупреждает Qt?
Отправлено: Igors от Сентябрь 07, 2013, 16:50
Приоритет + выше сравнения, так и делайте, а использование битового | здесь мозголомка не вызванная никакой необходимостью


Название: Re: О чем предупреждает Qt?
Отправлено: alex312 от Сентябрь 07, 2013, 17:14
В конце цикла если j == b.amount и r = 1 - цикл делает ещё один проход.
Это ты написал что ты думаеш что оно так работает.
Вопрос: сколько будет циклов если amount == 11 и r == 1, и сколько, если r == 0 ?


Название: Re: О чем предупреждает Qt?
Отправлено: kambala от Сентябрь 07, 2013, 17:53
Alexu007, кажется ты попутал побитовое и логическое ИЛИ


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 07, 2013, 18:09
Это вот отсюда взято: http://cppalgo.blogspot.ru/2010/05/blog-post.html

|  || и + работают одинаково, я проверял. Автор почему-то выбрал именно |.


Название: Re: О чем предупреждает Qt?
Отправлено: kambala от Сентябрь 07, 2013, 18:14
интересно, зачем было вводить в язык 3 разных операции, если они работают одинаково?

куда именно смотреть по ссылке я не понял, там | вообще не упоминается.


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 07, 2013, 18:21
Вот тут точно, извините... http://cppalgo.blogspot.ru/2010/07/ab.html


Название: Re: О чем предупреждает Qt?
Отправлено: kambala от Сентябрь 07, 2013, 19:46
логически верно тут использовать ||


Название: Re: О чем предупреждает Qt?
Отправлено: lit-uriy от Сентябрь 08, 2013, 13:02
вообще компилятор в данном случае прав. Лучше использовать скобки, т.к. у них самый высокий приоритет и для человека они интуитивно понятны.

П.С.
Qt тут ни о чем не предупреждает, и тема вообще не имеет ни какого отношения к Qt.
Надо переместить в раздел Компиляторы или Языки


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 09, 2013, 07:59
C функциями всё работало. Решил сделать класс работы с длинными числами:

Код
C++ (Qt)
class BI
{
public:
   BI();
 
 
   struct BigInt
       {
       int amount;               // количество цифр в числе
       int digits[maxlen];      // массив цифр в обратном порядке
       };
 
 
  // ввод
  void input(BigInt, const QString);
 
  // вывод
  QString output(const BigInt);
 
  // операторы сравнения
  bool operator == (const BigInt, const BigInt);
 
  bool operator > (const BigInt, const BigInt);
 
  bool operator < (const BigInt, const BigInt);
 
  // длинное сложение
  BigInt operator + (const BigInt, const BigInt);
 
  // беззнаковое вычитание (всегда меньшее из большего)
  BigInt operator - (const BigInt, const BigInt);
 
  // умножение на короткое int
  BigInt operator * (const BigInt, const int);
 
  // длинное умножение
  BigInt operator * (const BigInt, const BigInt);
 
  // длинное деление
  BigInt operator / (const BigInt, const BigInt);
 
  // остаток длинного деления
  BigInt operator % (const BigInt, const BigInt);
 
 
};

Ругается на прототипы функций, что == (и остальные за ним) должны иметь только один аргумент. Чё за фигня? Функции 100% рабочие.


Название: Re: О чем предупреждает Qt?
Отправлено: Bepec от Сентябрь 09, 2013, 08:09
Правильно говорит. Первый и единственный аргумент - константный класс, который вы передаёте для работы.

А то, что у вас вторым указано - оно уже есть и не нуждается в передаче. Это будет всегда this.

PS откройте учебник C++ и почитайте про переопределение операторов.


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 09, 2013, 08:16
Да, но без классов с функциями всё работает. Что за константный класс?


Название: Re: О чем предупреждает Qt?
Отправлено: Bepec от Сентябрь 09, 2013, 08:21
Цитировать
PS откройте учебник C++ и почитайте про переопределение операторов.

Там всё разжёвано, по русски, внятным языком. Как именно надо переопределять операторы классов.


Название: Re: О чем предупреждает Qt?
Отправлено: Igors от Сентябрь 09, 2013, 13:15
Код
C++ (Qt)
friend bool operator == (const BigInt &, const BigInt &);


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 09, 2013, 20:05
До переопределения операторов ещё не дошёл пока. Как то нестабильно оно работает...

файл bigintdec.h:

Код
C++ (Qt)
#ifndef BIGINTDEC_H
#define BIGINTDEC_H
 
#include "widget.h"
 
 
 
#define osn 10
#define maxlen 512
 
 
class BI
   {
   public:
 
       int amount;              // количество цифр в числе
       int digits[maxlen];      // массив цифр в обратном порядке
 
 
//   BI input(const QString);
//   QString output(BI);
 
 
       BI input(const QString st)
           {
 
           QString s1;
           int pos = 0;
           BI bgi;
 
           memset(bgi.digits, 0, sizeof(bgi.digits));
 
           for(int i = st.length() - 1; i >= 0 ; i--)
               {
               s1 = st[i];
               bgi.digits[pos++] = s1.toInt();
               }
 
           bgi.amount = st.length();
 
           return bgi;
           };
 
 
 
 
       QString output(const BI bdi)
           {
           QString str;
 
           for (int i= bdi.amount - 1; i >= 0; i--)
               {
               str += QString::number(bdi.digits[i],'g',6);
               }
 
           return str;
           };
 
 
};
 
#endif // BIGINTDEC_H

файл widget.cpp:

Код
C++ (Qt)
void Widget::MyEventHandler1()
{
   /*
   QString x = sender()->objectName();
   fnpresskey(x.remove(0, 11).toInt());
   */

 
   QString str = "00112233";
 
   BI bdj1;
   BI bdj2;
 
   bdj1 = bdj1.input(str);
 
   bdj2 = bdj1;
 
   ui->lineEdit_3->setText(bdj2.output(bdj2));
 
   return;

Так всё работает, но если перенести реализацию функций-членов в файл bigintdec.срр, а в объявлении класса оставить прототипы, и пересобрать проект - вылезает 3 ошибки:

C:\QtSDK\Alexu007\LongArifm\LA1\widget.cpp:140: ошибка: undefined reference to `BI::input(QString)'

C:\QtSDK\Alexu007\LongArifm\LA1\widget.cpp:144: ошибка: undefined reference to `BI::output(BI)'

:-1: ошибка: collect2: ld returned 1 exit status (внизу красными буквами "файл не найден").

Чё за фигня, файл не найден, как я понимаю - bigintdec.срр, оттуда реализации функций теряются - но он к проекту подключён...


Название: Re: О чем предупреждает Qt?
Отправлено: LisandreL от Сентябрь 09, 2013, 20:32
При переносе в cpp название класса перед названием функций добавить не забыли?


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 09, 2013, 20:53
При переносе в cpp название класса перед названием функций добавить не забыли?
Забыл. Спасибо. Заработало. Ну геморой!!!

Ещё вопросик, пжалста. При использовании в программе перед каждым вызовом функции-члена указывается вызывающий её объект (я с этим долго тормозил, никак понять не мог, чего ещё от меня хотят...):

Цитировать
   BI bdj1;
    BI bdj2;
 
    bdj1 = bdj1.input(str);
 
    bdj2 = bdj1;
 
    ui->lineEdit_3->setText(bdj2.output(bdj2));

Это значит для каждой копии объекта свои копии функций создаются, что-ли? Если-бы вызывались, например BI.input() - то понятно, функция input класса BI - но так не работает, а нафига перед каждой функцией название её объекта? А если объекты в цикле создаются сотнями, как к ним в программе обращаться?


Название: Re: О чем предупреждает Qt?
Отправлено: Alex Custov от Сентябрь 09, 2013, 21:03
а нафига перед каждой функцией название её объекта?

Начни уже учить С++, сколько ты ещё будешь задавать вопросы, о которых написано в любой обучающей книжке для начинающих?


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 11, 2013, 16:52
Как получить код символа QString?  QString str = "12AB";  Нужно каждый символ в int перевести: "1" = 1, "A" = 10 и т.д.







Название: Re: О чем предупреждает Qt?
Отправлено: gil9red от Сентябрь 11, 2013, 17:57
Код:
for(int i = 0; i < str.size(); i++)
{
   QChar c = str.at(i);
   qDebug() << (int)c.toAscii();
}

Или вы про перевод в другую систему счисления?
тогда,
Код:
bool b;
int number = str.toInt(&b, 16);
if(b)
  qDebug() << "удачно!";
else
  qDebug() << "что то не получилось...";


Название: Re: О чем предупреждает Qt?
Отправлено: Alexu007 от Сентябрь 11, 2013, 21:20
Спасиб, наверху то что надо. Мне не нужен авт. перевод в hex, нужно брать число по одной цифре(букве) и помещать в инт:  1 - 1, 9 -9, А - 10 и т.д.

Прога работает с dec, хочу "приучить её и к hex.


Название: Re: О чем предупреждает Qt?
Отправлено: lit-uriy от Сентябрь 13, 2013, 20:42
Alexu007, ты сделал функцию членом класса, стало быть один аргумент функции уже появился - объект (экземпляр этого класса).
т.е. убери "левый" аргумент (им будет экземпляр класса) в теле функуии вместо него используй указатель this.

либо, сделай функцию дружественной данному классу, тогда можешь всё оставить как есть.

И, к стати, операторы типа "+" (не "+=") следует делать константными

Книжку могу порекомендовать: Герб Саттер и Андрей Александреску "Стандарты программирования на С++"


Название: Re: О чем предупреждает Qt?
Отправлено: lit-uriy от Сентябрь 13, 2013, 20:43
чёт я запоздал с ответом :)


Название: Re: О чем предупреждает Qt?
Отправлено: Bepec от Сентябрь 14, 2013, 10:09
Вторая страница всегда незаметна :) С каждым бывает.