И опять - приведение типов и деление.

Тема в разделе "Arduino & Shields", создана пользователем Gomez, 19 ноя 2017.

  1. Gomez

    Gomez Гик

    Опять затрону достаточно замусоленную тему насчет логики C языков "если целое делим на целое, то и в результате получим целое".
    Да, я понимаю, что указав явно при делении
    Код (C++):
       
        int a = 100;
        int b = 75;
        float c = (float)b / (float)a;
        Serial.println(c);
     
    получим требуемое.
    Но я переменную "a" получаю из функции, которая находит в массиве максимальное значение (ах да, в С опять же нет встроенных функций нахождения минимального и максимального значения в массиве, а также sort(), ну и ладно).
    Ну допустим
    Код (C++):

    float maxval(int a[], int size) {
      int mx = 0;
      for(int i=0; i<(size-1); i++) {
      if(a[i] > mx)
      mx = a[i];
      }
      return mx;
    }
     
    И вот как бы я не указывал при делении и при объявлении этой функции - int, float... - я получаю при делении целое значение - то есть, раз делю меньшее число на большее или равное - либо 1, либо 0.
    Что происходит с переменной в функции, что я не могу нормально, как гуманоид, а не робот, поделить два числа? ;)
    Может, мне конвертировать его в string, а потом снова в int, чтобы очистить его карму? ;)
     
  2. ИгорьК

    ИгорьК Гуру

    Я не поклонник Си, но не могу въехать: Вы не можете связать сами первую часть своего суперироничного поста со второй?
     
  3. Arduiner001

    Arduiner001 Гик

    Отмечу, что на мой взгляд, функция maxval написана неправильно. For пробежит все значения 0...size-2, так как в условии вы поставили оператор "меньше". Стоит либо написать
    Код (C++):
    for(int i = 0; i <= (size - 1); i++)
    либо
    Код (C++):
    for(int i = 0; i < size; i++)
     
    Gomez нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Функция действительно написана с ошибкой, но она, в первую очередь, от незнания основ Си а не его операторов.
     
  5. DIYMan

    DIYMan Guest

    Во-первых:
    Код (C++):
    float maxval(int a[], int size) {
      float mx = 0.;
      for(int i=0; i<size; i++) {
      if(a[i] > mx)
      mx = a[i];
      }
      return mx;
    }
     
    Во-вторых:
    Код (C++):
    float b = 2.5;
    float a = maxval(...);

    float result = b/a; // всё должно быть ок.
    // если не ок, то:
    result = b/(a*1.0);
     
    Gomez и ИгорьК нравится это.
  6. qwone

    qwone Гик

    Видите. Гуманоиды такие гуманоиды, что стремятся делить как конкретно каждому гуманоиду вздумается.


    Вот по этому для программирования ввели правила что и как делить правильно. И теперь гуманоидам не надо ссылаться на свою гуманоидность, а учить эти стандарты, даже если это противоречит внутреней гуманоидности конкретного гуманоида.
     
    Gomez и ИгорьК нравится это.
  7. Gomez

    Gomez Гик

    Arduiner001, DIYMan, спасибо за поправку!

    А ошибка в моих танцах бубном была в том, что иногда я и получал результат в виде float, но поскольку делил не на то, получал не то, что нужно. Как-то так. :D
     
  8. ИгорьК

    ИгорьК Гуру

    Ваша ошибка в том, что Вы не знаете предназначение float в начале функции и в надежде на то что это приведёт к приведению типа возвращаете из функции int.
     
  9. Gomez

    Gomez Гик

    ИгорьК, Вы правы. Я привык к "гуманоидному" автоприведению в php,
    и пока скетчи пишу по наитию, залезая в документацию только при крайнем затыке. :confused:
     
  10. warman

    warman Гик

    как вариант:
    Код (C++):
    int maxval(int a[], int size) {
      int mx = 0.;
      for(int i=0; i<size; i++) {
      if(a[i] > mx)
      mx = a[i];
      }
      return mx;
    }
    И через явное приведение типов
    Код (C++):
    float b = 2.5;
    int a = maxval(...);

    float result = (float) b/a;
     
    Gomez нравится это.