Имя: Пароль:
IT
 
знатокам "С" - помогите с передачей указателя
0 vde69
 
25.04.16
14:13
пишу класс, (ниже урезанный вариант...)
-------------------------------------------------------------

// описание пакета, данные передаются и принимаются именно в такой последовательности
typedef struct {
  uint8_t Id_Destination;   // ID получателя пакета
  uint8_t Id_Source;        // ID отправителя пакета
  uint8_t Type;             // Тип пакета
  uint8_t Func;             // Номер команды определяет тип дополнительных данных и правила их обработки
  uint8_t SizeDate;         // Размер дополнительных данных пакета
  uint8_t xor_Data;         // xor (контроль четности) дополнительных данных пакета
  uint8_t xor_Head;         // xor (контроль четности) заголовка, служит для определения корректности заголовка и выделения кадра из потока данных
  uint8_t Data[MAX_BUFFER]; // дополнительные данные
}
BusRS485_Pack;

volatile static voidFuncPtr _InPack;

class BusRS485 {
private:
  HardwareSerial port;       // указатель на Serial class
  uint8_t Id;                 // 0=master, 1..246=slave, 247=резерв
  uint8_t ControlPin;         // номер пина контроля RS-485
  BusRS485_Pack InPack;       // входящий пакет
  uint8_t FInPack;            // флаг входящего пакета, 0-ждем заголовок, 1-ждем дополнительные данные, 2-пакет загружен валиден, 3-пакет загружен, но не валиден
  
  void init(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);

public:
  BusRS485(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
  
  uint8_t Id_Destination (void);
  uint8_t Id_Source (void);
  uint8_t Type (void);
  uint8_t Func (void);
  uint8_t SizeDate (void);
  uint16_t Date (void);
  
  void begin(long Speed);
  void attachInPackInterrupt(void (
)());  
  void poll();         // процедура запуска обработки получения данных
  void on();           // включение шина + COM порт
  void off();          // выключение шины (только COM порт)
  void send(int8_t,    // ID получателя
            int8_t,    // тип пакета
            int8_t,    // номер функции
            int8_t,    // размер дополнительных данных
            uint16_t ); // указатель на буфер дополнительных данных
};

uint16_t BusRS485::Date (){
  return
InPack.Data;
}


-------------------------------------------------------------
вот его использование, по идее Bus.Date() должна возвращать указатель, но что-то не так, а что именно не пойму...
-------------------------------------------------------------


//#include <busrs485.h>
BusRS485 Bus(0, 0, 2); // this is master and RS-232 or USB-FTDI

void setup() {
  Bus.begin( 19200 );                      // baud-rate at 19200
  Bus.attachInPackInterrupt(BusInPack);    // подключим процедуру для обработки полученых пакетов
}

void loop() {
  Bus.poll(); // вызов процедур чтения порта
}

// процедура вызывается при получении валидного пакета
void BusInPack (){
  // тут делаем, что нам надо при получении пакета
  // например перешлем его другому адресату
  if (Bus.Id_Destination() == 0) {
    Bus.send(22,             // ID получателя
             Bus.Type(),     // тип пакета
             Bus.Func(),     // номер функции
             Bus.SizeDate(), // размер дополнительных данных
             Bus.Date())     // !!!!!!!! invalid conversion from 'uint16_t' to 'uint16_t*' !!!!!!!
  }
}



ps
сильно не ругайте, я "пасквелист"...
1 vde69
 
25.04.16
14:16
блин, звездочки зажрало...

вот тут с правильным форматированием http://arduino.ru/forum/programmirovanie/pomogite-s-peredachei-ukazatelya
2 ДенисЧ
 
25.04.16
14:19
uint16_t BusRS485::Date (){
  return &InPack.Data;
}
3 mingw
 
25.04.16
14:34
(2) Переменную лучше вытащить. Из Bus. А то вдруг грохнется.
4 Кирпич
 
25.04.16
14:38
ёпрст. паскаль без книжки уже выучил, теперь Си++ без книжки учит :)
5 Тролль главный
 
25.04.16
14:39
так Date или Data
6 Кирпич
 
25.04.16
14:42
(1) "блин, звездочки зажрало..." оно как бы намекнуло, что там звёздочка нафиг не нужна :)
7 Mort
 
25.04.16
15:07
+(2) Тип возвращаемого значения в функции забыл:

uint16_t* BusRS485::Date (){
  return &InPack.Data;
}
8 vde69
 
25.04.16
15:14
(7) разобрался...

uint8_t * BusRS485::Date (){
  return &(InPack.Data[0]);
}
9 H A D G E H O G s
 
25.04.16
15:37
(0) Ну как программится на C после 1С. Чувствуем некоторые жжения от соотношения реализовано/затраченовремени?
10 spock
 
25.04.16
15:41
(9) Провокатор чертов :-)
11 Кирпич
 
25.04.16
15:44
(9) а куда деваться. 1С в arduino ещё нету.
12 H A D G E H O G s
 
25.04.16
15:48
Я тут пилю некоторый аналог Хамачи на Дельфях. Вот это мозгопство с блокирующими сокетами и многопоточной обработкой. А на выходе - примитивная с виду программа с 5 кнопками.
13 ДенисЧ
 
25.04.16
15:49
(12) "Ну как программится на паскале после 1С. Чувствуем некоторые жжения от соотношения реализовано/затраченовремени?
14 H A D G E H O G s
 
25.04.16
15:52
(13) Да еще как. Я же не говорю, что C - хрень. Я говорю о том, что 1С делает нашу жизнь проще и делает 70% из коробки того, что пришлось бы делать руками в C/Pascal/и.т.д.
15 Smallrat
 
25.04.16
15:59
(11) я бы так категорично не высказывался))
http://www.youtube.com/watch?v=jAy5mULxsAg
16 vde69
 
25.04.16
15:59
(14) разумеется ты прав :) но я делаю то чего на 1с невозможно сделать :)

зы
кстати я всегда говорил, что 1с - рулез :)

ззы
с удивлением обнаружил, что низкоуровневые спецы (те которые пишут например под AVR на ассемблере) стоят сильно дешевле 1с ников....
17 vde69
 
25.04.16
16:01
(15) Опубликовано: 1 апр. 2016 г.
18 ДенисЧ
 
25.04.16
16:01
(16) Я бы так не сказал....
Видел вакансию у нас в деревне, где прогу на МК предлагали в два раза больше, чем средняя для 1с (опять же у нас в деревне)
19 Smallrat
 
25.04.16
16:01
(17) ну вот, вся интрига((.....
20 NorthWind
 
25.04.16
16:03
(16) вся фишка в спросе. Такой человек может очень долго искать работу, но в конечном итоге устроиться существенно лучше любого 1Сника, если найдет платежеспособного купца на свои знания и решит ему его проблемы.
21 Кирпич
 
25.04.16
16:05
(15) твоюж мать! Ж)))
22 mingw
 
25.04.16
16:08
(12) Лисапедист? Есть готовые аналоги. Бесплатные. Опенсорсные.
23 Господин ПЖ
 
25.04.16
16:10
(16) у них малый спрос. и спрос растет из весьма специфичных контор... можно пойти в военку разрабатывать что-нибудь встроенное для техники... но это сразу невыездной и смешная з/п
24 Кирпич
 
25.04.16
16:13
(18) "стоят сильно дешевле 1с ников...."
бог наказывает всех, кто не способен отличить кредит от сальдо.
25 H A D G E H O G s
 
25.04.16
16:14
(22) Я не использую в своих поделках, которые будут работать не у меня, компонентов, кроме как из типовой поставки.
26 Кирпич
 
25.04.16
16:17
(25) ты наверное уже всего Кнута переписал на паскале :)
27 NorthWind
 
25.04.16
16:19
uint16_t BusRS485::Date (){
  return InPack.Data;
}

Вы явно объявили тип возвращаемого значения - 16 бит целый.
Указатель даже под DOS занимает 32 бит.
Что у вас за система?
Если вы хотите вернуть указатель на элемент массива, то почему было не объявить
uint8_t* BusRS485::Date ()

?
28 Oftan_Idy
 
25.04.16
16:52
(0) Может поделишься с общественность что же за железку ты решил совокупить с 1С? И это реально нужно бизнесу?
Нежели реализуешь лампочки для плохих сотрудников и кнопочки для хороших?
29 ДенисЧ
 
25.04.16
16:56
(28) Лампочки это не серьёзно...
Про минет сотрудникам помнишь?
30 vde69
 
25.04.16
17:02
31 Oftan_Idy
 
25.04.16
17:09
(29) Дык я про это же и написал :)
32 Oftan_Idy
 
25.04.16
17:10
(30) А при чем тут 1С?
Основная теорема систематики: Новые системы плодят новые проблемы.