Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
А в чистом С можно в структурах объявлять методы? Или что тогда ткое: ? Это операция умножения. А DEC - судя по всему передается вторым параметром в метод print. |
Автор: Emmys 11.03.15, 06:41 |
примерно понял. присвоить получилоось. меня DEC сбил с толку. спасибо вам большое |
Автор: MyNameIsIgor 11.03.15, 08:00 |
Скорее всего плюсы... но вообще |
Автор: cppasm 11.03.15, 09:53 |
В структуре можно объявить указатель на функцию - этого достаточно |
Автор: KILLER 11.03.15, 10:19 |
Ну и что, и какой в этом смысл? Это будет указатель на функцию - а не метод. Судя по его коду у него print - перегружен, т.к. в одном случае он вызывает: В другом случае: Т.е. на сколько можно судить - в первом случае в метод/функцию print передается два числовых значения, во втором случае строка. На сколько я знаю в чистом Си нет перегрузки функций. |
Автор: shm 11.03.15, 10:57 |
В Си нельзя объявлять переменные внутри for. |
Автор: cppasm 11.03.15, 11:13 |
Перегрузки в Си нету, значит плюсы. Добавлено В С99 можно... |
Автор: Kray74 11.03.15, 15:03 |
Зато есть ... |
Автор: amk 11.03.15, 17:16 |
Да, это смесь C и C++. Думаю, структура decode_results унаследована из чистого C. Отсюда использование С-шных дефайнов. |
Автор: korvin 11.03.15, 18:33 |
Группировать несколько функций с одинаковыми сигнатурами, но разными реализациями. В общем Serial в данном случае выступает в роли явной таблицы методов. |
Автор: KILLER 11.03.15, 19:46 |
Так в Си нет перегрузки функций а в С++ это достигается путем перегрузки методов. Разве нет? Добавлено Тогда это С++. Добавлено Если бы в Си была перегрузка функций - тогда бы я с тобой полностью согласлся, вышла бы эдакая эмуляция класса с методами, с одинаковой сигнатурой(хотя что мешало их просто перегрузить глобально), но в Си нет перегрузки функций и так вообще не будет компилится. |
Автор: 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, но с разным числом и типом параметров. В твоей реализации - по сути указатели в структуре ты просто инициализируешь разными функция. |