Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] Ошибка


Автор: ISerg1986 12.1.2014, 11:34
Пишу на QT
В коде программы использую define
первые строки программы
Код

#define VID 0xC251
#define PID 0x1701
int init(unsigned int VID, unsigned int PID)
{

можно и так
Код

#define VID 1
#define PID 2

int init(unsigned int VID, unsigned int PID)
{

В любом случае, возникает Ошибка -- expected',' or '...' before numeric constant.
QT жалуется на первые строки.

Вот так
Код

#define VID1 1
#define PID1 2

ошибки не будет

Скажите, в чём тут ошибка? Почему QT не нравятся VID PID, ведь если они заданы некорректно, ошибка должна быть на строке int init(unsigned int VID, unsigned int PID), но не в начале.


Автор: borisbn 12.1.2014, 11:46
define - это просто замена одного другим (как будто ты это делаешь в текстовом редакторе - чаще всего Ctrl+H).
Вот это:
Цитата(ISerg1986 @  12.1.2014,  11:34 Найти цитируемый пост)
#define VID 0xC251
#define PID 0x1701
int init(unsigned int VID, unsigned int PID)
{

превращается в это
Код
#define VID 0xC251
#define PID 0x1701
int init(unsigned int 0xC251, unsigned int 0x1701)
{

а так писать нельзя. В параметрах функции должны быть не константы, а названия переменных.
Сделай так:
Код
#define VID 0xC251
#define PID 0x1701
int init(unsigned int a_VID, unsigned int a_PID)
{


Добавлено через 2 минуты и 15 секунд
А теперь поворчу)))
Цитата(ISerg1986 @  12.1.2014,  11:34 Найти цитируемый пост)
Пишу на QT

1) QT - это QuickTime. Я думаю, ты имел в виду Qt.
2) Причём тут Qt - так и не понял
3) По названию темы должно быть понятно, что в ней.
В общем, за оформление - двойка ))

Автор: ISerg1986 12.1.2014, 12:58
Цитата

define - это просто замена одного другим

Да. Я знаю и согласен.

Но в строке 
Код

#define VID 0xC251
#define PID 0x1701

Нет ошибки. Нет синтаксической, нет логической. Всё чинно, благородно )

Ошибка должна быть тут
Код

int init(unsigned int VID, unsigned int PID)
{

Но Qt указывает на первые строки. Обманывает (


Цитата

А теперь поворчу)))
1) QT - это QuickTime. 

Ну и я поворчу )))
1)Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].

Везде QT большими буквами.

2) Показывает ошибку не на той строке. Вводит в заблуждение.

3) В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку - это есть.
Если вопрос актуален только для некоторой версии библиотеки - для всех версий Qt
Проставьте несколько ключевых слов темы - сделано.
В вопросе укажите полную версию версию библиотеки - нет, но и не требуется.
Не забывайте пользоваться кнопкой "Код". -это есть.

Вроде всё есть, фреймворк указан, код есть, полный текст ошибки есть, всё есть.
Твёрдая четвёрка.  smile 

Автор: kuzulis 13.1.2014, 09:59
Цитата

Но Qt указывает на первые строки. Обманывает (


Не Qt, а компилятор. И ничего не обманывает. 

Автор: borisbn 13.1.2014, 10:13
Цитата(ISerg1986 @  12.1.2014,  12:58 Найти цитируемый пост)
Но Qt указывает на первые строки.

Как набор h-ников, lib-ин и dll-ек (Qt) может указывать на ошибки в твоём коде ?

Цитата(ISerg1986 @  12.1.2014,  12:58 Найти цитируемый пост)
Везде QT большими буквами.

и там неправильно

Автор: bsa 13.1.2014, 10:26
Цитата(ISerg1986 @  12.1.2014,  13:58 Найти цитируемый пост)
Но в строке
Код
#define VID 0xC251
#define PID 0x1701

Нет ошибки. Нет синтаксической, нет логической. Всё чинно, благородно )
А в  этих строках и нет ошибок.
Тебе уже объяснили, что препроцессор (это такая "утилитка", которая вызывается компилятором перед компиляцией файла, она обрабатывает инструкции начинающиеся с решетки) сильно по барабану, что и чем заменять. Он тупо заменяет в тексте все слова VID и PID на указанные тобой значения. Поэтому, когда компилятор доходит до строки "int init(unsigned int VID, unsigned int PID)", то он видите ее уже не так, а "int init(unsigned int 0xC251, unsigned int 0x1701)".

Чтобы проблем не было все опытные программисты имеют определенные правила именования макросов, переменных, констант и функций. Так вот, в стиле Qt все макросы (#define) должны состоять только из заглавных букв, цифр и знаков подчеркивания. Все остальные элементы пишутся маленькими буквами. Если имя состоит из нескольких слов, то каждое слово начинается с заглавной буквы. Типы и значения перечислений должны начинаться с заглавной буквы, а переменные, константы и функции должны начинаться с маленькой.
Например:
Код
#define VID 0xC251
#define PID 0x1701

int initDevice(unsigned int deviceVid, unsigned int devicePid)
{
...
}

Автор: vinter 13.1.2014, 10:46
Цитата(bsa @  13.1.2014,  11:26 Найти цитируемый пост)
Так вот, в стиле Qt все макросы (#define) должны состоять только из заглавных букв, цифр и знаков подчеркивания.

Насколько я знаю, это вообще общий совет. Присущий не только стилю Qt, но вообще стилям  в целом. Это хорошая практика.

Автор: ISerg1986 13.1.2014, 21:25
Код

#include "mainwindow.h"
#include <QApplication>
#include "lib/libusb.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{

libusb_init(NULL);



    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}



Теперь такая ошибка-" undefined reference to libusb_init@4"

Тут проблема в libusb.h или настройках компилятора?







Автор: borisbn 14.1.2014, 09:29
Цитата(ISerg1986 @  13.1.2014,  21:25 Найти цитируемый пост)
Тут проблема в libusb.h или настройках компилятора?

Ни то, ни то.
Судя по ошибке "undefined reference" компилятор уже закончил работу, а ошибку выдал линковщик, который не видит библиотеки libusb. Для того, чтобы он увидел добавь в .pro файл следующее
Код
unix:LIBS += -L/usr/local/lib -llibusb
win32:LIBS += c:/path/to/libs/libusb.lib

Если тебе не нужна кроссплатформенность, и нужен только linux, то можешь добавить просто
Код
LIBS += -L/usr/local/lib -llibusb


Автор: bsa 14.1.2014, 10:28

M
bsa
Пожалуйста, один топик - один вопрос.

Автор: ISerg1986 14.1.2014, 10:54
Цитата

 который не видит библиотеки libusb

Тоже была такая идея. Но я добавлял LIBS += -L/usr/local/lib Мало опыта и знаний.

Цитата

Пожалуйста, один топик - один вопрос.

Ок.
 Я просто решил задать тут, чтобы не засорять форум моими глупыми вопросами. )

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