Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Общие вопросы > что означает эта операция


Автор: Emmys 10.03.15, 18:58
Ребята, прошу тапками не кидаться. я новичек.
что означает эта операция . не понимаю
results->rawbuf[i]*USECPERTICK, DEC
и как мне результат этого вычисления присвоить переменной
String raw

полный код ниже:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void dump(decode_results *results) {
      int count = results->rawlen;
     
    recivRAW="";
      for (int i = 0; i < count; i++) {
        if ((i % 2) == 1) {
          
      
          Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
          
          
          
             if (i < count-1) {Serial.print (",");}
        }
        else {
              
          Serial.print((int)results->rawbuf[i]*USECPERTICK, DEC);
           if (i < count-1) {Serial.print (",");}
        }
        Serial.print(" ");
      }
      Serial.println("");
     
     
      
    }

Автор: amk 10.03.15, 22:59
Это не операция, это два выражения:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    results->rawbuf[i]*USECPERTICK
и
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DEC

USECPERTICK и DEC, судя по виду, какие-то константы определённые посредством #define (что в свою очередь указывает на программу на чистом C, не C++)
Имя первой расшифровывается скорее всего как "микросекунд на тик". Что означает вторая можно гадать.

Значением второго выражения является значение соответствующей константы

А первое вычисляется так:
Указатель results содержит адрес некоей структуры decode_results.
Эта структура имеет поле rawbuf (скорее всего указатель на область памяти, видимо как описанную как беззнаковые символы (байты), хотя может быть и массив)
Из этой области по смещению i извлекается байт, и умножается на константу USECPERTICK.

Как присвоить переменной?
Просто пишешь
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var = results->rawbuf[i]*USECPERTICK;

Автор: KILLER 11.03.15, 06:36
Цитата amk @
что в свою очередь указывает на программу на чистом C, не C++

А в чистом С можно в структурах объявлять методы?
Или что тогда ткое:
Цитата Emmys @
Serial.print

?

Цитата Emmys @
results->rawbuf[i]*USECPERTICK

Это операция умножения.

А DEC - судя по всему передается вторым параметром в метод print.

Автор: Emmys 11.03.15, 06:41
примерно понял. присвоить получилоось. меня DEC сбил с толку. спасибо вам большое

Автор: MyNameIsIgor 11.03.15, 08:00
Цитата KILLER @
А в чистом С можно в структурах объявлять методы?
Или что тогда ткое:

Скорее всего плюсы... но вообще :D

Автор: cppasm 11.03.15, 09:53
Цитата KILLER @
А в чистом С можно в структурах объявлять методы?

В структуре можно объявить указатель на функцию - этого достаточно ;)

Автор: KILLER 11.03.15, 10:19
Цитата cppasm @
В структуре можно объявить указатель на функцию - этого достаточно ;)

Ну и что, и какой в этом смысл? Это будет указатель на функцию - а не метод. Судя по его коду у него print - перегружен, т.к. в одном случае он вызывает:
Цитата Emmys @
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);

В другом случае:
Цитата Emmys @
Serial.print (",");

Т.е. на сколько можно судить - в первом случае в метод/функцию print передается два числовых значения, во втором случае строка.
На сколько я знаю в чистом Си нет перегрузки функций.

Автор: shm 11.03.15, 10:57
Цитата Emmys @
for (int i = 0; i < count; i++) {

В Си нельзя объявлять переменные внутри for.

Автор: cppasm 11.03.15, 11:13
Перегрузки в Си нету, значит плюсы.

Добавлено
Цитата shm @
В Си нельзя объявлять переменные внутри for.

В С99 можно...

Автор: Kray74 11.03.15, 15:03
Цитата cppasm @
Перегрузки в Си нету

Зато есть ...

Автор: amk 11.03.15, 17:16
Цитата KILLER @
А в чистом С можно в структурах объявлять методы?
Да, это смесь C и C++. Думаю, структура decode_results унаследована из чистого C. Отсюда использование С-шных дефайнов.

Автор: korvin 11.03.15, 18:33
Цитата KILLER @
Ну и что, и какой в этом смысл?

Группировать несколько функций с одинаковыми сигнатурами, но разными реализациями. В общем Serial в данном случае выступает в роли явной таблицы методов.

Автор: KILLER 11.03.15, 19:46
Цитата korvin @
Группировать несколько функций с одинаковыми сигнатурами, но разными реализациями.

Так в Си нет перегрузки функций а в С++ это достигается путем перегрузки методов. Разве нет?

Добавлено
Цитата amk @
Да, это смесь C и C++.

Тогда это С++.

Добавлено
Цитата korvin @
В общем Serial в данном случае выступает в роли явной таблицы методов.

Если бы в Си была перегрузка функций - тогда бы я с тобой полностью согласлся, вышла бы эдакая эмуляция класса с методами, с одинаковой сигнатурой(хотя что мешало их просто перегрузить глобально), но в Си нет перегрузки функций и так вообще не будет компилится.

Автор: Emmys 11.03.15, 19:52
это ардуино проект

Автор: korvin 12.03.15, 11:57
Цитата KILLER @
Так в Си нет перегрузки функций а в С++ это достигается путем перегрузки методов. Разве нет?

Перегрузка тут немного не при чём. И как раз из-за её отсутствия (а также отсутствия классов) часто используют такой «паттерн». Типа того:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <stdio.h>
     
    typedef struct Printer Printer;
     
    struct Printer
    {
        void (*print_string)(char*);
        void (*print_int)(int);
        void (*print_double)(double);
        void (*print_endline)(void);
    };
     
    /* предполагается, что эти функции реализованы в отдельном файле
       и не видны, поэтому могут иметь какие угодно имена,
       просто тут в Ideone нет поддержки нескольких файлов
       */
    void Printf_print_string (char  *s) { printf("%s", s); }
    void Printf_print_int    (int    i) { printf("%d", i); }
    void Printf_print_double (double d) { printf("%f", d); }
    void Printf_print_endline(void)     { printf("\n"); }
     
    const Printer Printf = {
        Printf_print_string,
        Printf_print_int,
        Printf_print_double,
        Printf_print_endline
    };
     
    void Happy_print_string (char  *s) { printf("%s ;-)", s); }
    void Happy_print_int    (int    i) { printf("%d =)",  i); }
    void Happy_print_double (double d) { printf("%f B-]", d); }
    void Happy_print_endline(void)     { printf("Bye! ^_^ \n"); }
     
    const Printer HappyPrinter = {
        Happy_print_string,
        Happy_print_int,
        Happy_print_double,
        Happy_print_endline
    };
     
    void print_all(Printer *p, char *s, int i, double d)
    {
        p->print_string(s);
        Printf.print_string("\n\t");
        p->print_int(i);
        Printf.print_string("\n\t");
        p->print_double(d);
        Printf.print_string("\n\t");
        p->print_endline();
        Printf.print_string("\n");
    }
     
    int main(void)
    {
        print_all(&Printf, "printf", 1, 2.3);
        print_all(&HappyPrinter, "Hello!", 1, 2.3);
        return 0;
    }


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    printf
        1
        2.300000
        
     
    Hello! ;-)
        1 =)
        2.300000 B-]
        Bye! ^_^


http://ideone.com/TFXinS

Добавлено
Что-то я не понял, форум как-то неадекватно воспринимает ^_^ в коде.

Автор: KILLER 12.03.15, 12:13
Цитата korvin @
Перегрузка тут немного не при чём. И как раз из-за её отсутствия (а также отсутствия классов) часто используют такой «паттерн». Типа того:

Ну разве что так, но у автора там явно другой подход, т.к. всюду используется одна и таже функция print, но с разным числом и типом параметров. В твоей реализации - по сути указатели в структуре ты просто инициализируешь разными функция.

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