воскресенье, 24 марта 2013 г.

While(1) ??????

Когда используешь While(1) (gcc ubuntu), оказывается в командной строке в теле этого бесконечного цикла, автоматически будет работать ввод символов, а ввывод символов работать не будет. Вполне возможно, что их как-то и можно выводить, но мне это уже не интересно..
Хотя такое происходит не во всех случаях... почему-то именно в программировании TCP. Это очень глупо с моей стороны -плохо знаю С.

V-USB. AVR. LibUSB. Ubuntu

Откомпилировал я прогу hidtool, которая идет в примерах библиотеки V-USB, и столкнулся с такой ошибкой (в виндовсе такого нет):

Error sending message: error sending control message: Device or resource busy
error writing data: Communication error with device
Ответ был найден здесь: http://forums.obdev.at/viewtopic.php?t=1474 .

Упрошенный вид кода таков:
usb_set_configuration(dev, 1);
while(usb_claim_interface(dev, 0)!= 0){
    if(usb_detach_kernel_driver_np(dev, 0)<0) printf("Error 123");
}
Вписывается он после: dev = openDevice();
Возникает потому что:

Postby christian » Wed May 28, 2008 5:22 pm
The first error indicates that Linux insists that you claim an interface. That's somewhat strange, since it should be possible to query the device's string descriptors (through endpoint 0) when the device is otherwise busy.
Полезные ссылки:
http://codebot.wordpress.com/2010/01/05/libusb-dokumentaciya/
http://microsin.ru/content/view/955/44/

вторник, 5 марта 2013 г.

C/C++ чем * отличается от &

Статья
В С/С++ существует понятие указателя. Указатель – это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера.

int *a; //создается указатель  с типом данных int

Тип данных определяет возможные действия над указателем. Так же не стоит забывать про void.

int b=2;//создаем переменную со значением 2

a=&b;//записываем в указатель а АДРЕС значения переменной b

То есть оператор & возвращает адрес переменной.

Теперь небольшой фокус:
int *a;
int b=2;
a=&b;
 
int v;
v=*a;//в значение переменной v будет находиться 2

//, здесь*a -называется разыменованием

//тоесть по сути это равнозначно v=b; 


Теперь самое интересное! Операции над указателями.

Над указателями определено 5 основных операций.
1)    Определение адреса указателя: &p, где p – указатель (&p – адрес ячейки, в которой находится указатель).

2)     Присваивание. Указателю можно присвоить адрес переменной p=&q, где p – указатель, q – идентификатор переменной.

3) Определение значения, на которое ссылается указатель: *p (операция косвенной адресации).

4) Увеличение (уменьшение) указателя. Увеличение выполняется как с помощью операции сложения (+), так и с помощью операции инкремента (++). Уменьшение – с помощью операции вычитания (–) либо декремента (––).

Например, пусть p1 – указатель, тогда р1++ перемещает указатель на:
     -1 байт, если *p1 имеет тип char; 
  -4 байта, если *p1 имеет тип int (в 32 разрядной операционной системе) или 2 байта (в 16 разрядной операционной системе);
  -4 байта, если *p1 имеет тип float.

5)    Разность двух указателей. Пусть р1 и р2 – указатели одного и того же типа. Можно определить разность р1 и р2, чтобы найти, на каком расстоянии друг от друга находятся элементы массива.