Передача разных типов данных в функцию

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Здравствуйте коллеги !

Есть следующий код

void setup() {                  
  Serial.begin(9600);
  test("АБВГД");
  
  int a = 100; 
  test(String(a));
}


void test(String str) {
  int s = 0;
  while(str[s] != 0)
  {
    if (byte(str[s]) != 208 && byte(str[s]) != 209) { 
      Serial.println(byte(str[s]));
    }
    ++s;
  }
}


void loop() {
}

Хотелось бы избавиться от записи test(String(a)); заменив на test(a) (а - типа integeg, byte). Для этого необходимо в функции test(String str) как то детектировать какой тип переменно ей передается. КАк это можно сделать. 

В идеале - функции test(String str)  скармливаем переменные любых типов, а она сама принемает решение, как их выводить, в зависимости от типа данных.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Как вариант, добавить еще одну функцию:

void test( int val )
{
  test( String( val ) );
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Вы пытаетесь обмануть компилятор. Допустим такую конструкцию можно придумать. Мне правда, очень интнресно - по какому признаку вы предполагаете отличать одни данные от других, находясь внутри подпрограммы?. В ооп это просто, у объектов там есть поля: класс объекта. А как тут, с простейшими днными. Обратите внимание, при передачие стринга в serial.print приходится указывать размер данных либо терминировать их нулем. Как вы думаете почему так ?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Возможно :)

На самом деле такая идея возникла на фоне Serial.Print (http://arduino.ru/Reference/Serial/Print) и lcd.print (http://arduino.cc/en/Reference/LiquidCrystalPrint#.UxYfDx-RiVI).

Как это реализовано ?

Я попытался отследить как вызывается lcd.print, но не получилось.

 
  void createChar(uint8_t, uint8_t[]);
  void setCursor(uint8_t, uint8_t); 
  virtual size_t write(uint8_t);
  void command(uint8_t);
  
  using Print::write;
private:
  void send(uint8_t, uint8_t);
  void write4bits(uint8_t);
  void write8bits(uint8_t);
  void pulseEnable();

это выдернуто из библиотеки LiquidCrystal. Подскажите, где можно найти реализацию этого решения в библиотеке...

 

com
Offline
Зарегистрирован: 06.09.2013

roman2712@mail.ru пишет:

Возможно :)

НЕВОЗМОЖНО

это не одна и та же функция с разными аргументами, это разные функции с одинаковыми именами, и называется это перегрузкой функций

почитайте http://www.programmersclub.ru/13/

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Так это то что надо. Получается, если я создам несколько функций с разными типами передаваемых в функции переменных, при этом с одинаковым названием, то все это будет работать ? Надо проверить :) 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Проверил, Работает :)

void setup() {                 
  Serial.begin(9600);
  test("АБВГД");
  int a = 100;
  test(a);
}

 
void loop() {
}

void test(String str) {
  print(str);
}

void test(int str) {
  print(String(str));
}


void print(String str) {
  int s = 0;
  while(str[s] != 0)
  {
    if (byte(str[s]) != 208 && byte(str[s]) != 209) {
      Serial.println(byte(str[s]));
    }
    ++s;
  }
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Только не понятно зачем это вам ? Поделитесь - какая была цель, а то мне иногда то же хочется поюзать подобное, но никак цель не могу придумать :)

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

У меня есть дисплей от мотороллы C205 (он же от t190, t191, с200). Хочется выводить на него инфу, просто написав "lcd_print(что то , что нужно вывести на дисплей)", не задумываясь какие типы данных я на него передаю. (по аналогии с библиотекой LiquidCrystal). Я понимаю что это не совсем рационально, с точки зрения ресурсов МК, но для отладки взаимодействия с пользователей через экран так проще. 

+ хочу понять как это в  LiquidCrystal организовано, так как самой функции print нет, есть только ссылка на клас.

 

com
Offline
Зарегистрирован: 06.09.2013

roman2712@mail.ru пишет:

Хочется выводить на него инфу, просто написав "lcd_print(что то , что нужно вывести на дисплей)", не задумываясь какие типы данных я на него передаю.

... а потом кончится память

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А чем не устраивает lcd.print из библиотеки жидких кристаллов ?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

 "lcd.print из библиотеки жидких кристаллов ?" - это из бибилиотеки :) Если кто нить подскажет как это прикрутить к моей функции, то устроит :)