Функция word язык с

I am trying to convert some C++ function to use in my python script and stumbled upon this:

int Crc16(args...)
{
   // Some calulations

   return (int)word(~ByteHi,~ByteLow)
}

This is the end of a CRC16 calculator which I need, I have no idea what this return does? Especially the «word» function. The ~ is the Bitwise complement and the final number returned is a single integer. I didn’t find anything on my search for this word() function. Could you help me?

prehistoricpenguin's user avatar

asked Apr 26, 2021 at 9:09

Searme's user avatar

3

From the usage you show, I would assume that it creates a 16 bit value from two bytes. It’s not part of c/c++ though. Probalby some function defined in your code.

uint16_t word(uint8_t hi, uint8_t low)
{
    return (hi << 8) + lo;
}

answered Apr 26, 2021 at 9:12

Devolus's user avatar

DevolusDevolus

21.5k13 gold badges65 silver badges112 bronze badges

2

After viewing the project’s readme, we know it’s possible to be an Arduino related utils, then check the doc here:

https://www.arduino.cc/reference/en/language/variables/conversion/wordcast/

Description Converts a value to the word data type.

Syntax

word(x)
word(h, l)
(word)x (C-style type conversion)

Parameters

x: a value. Allowed data types: any type.
h: the high-order (leftmost) byte of the word.
l: the low-order (rightmost) byte of the word.

Returns Data type: word.

Ted Lyngmo's user avatar

Ted Lyngmo

82.8k5 gold badges54 silver badges98 bronze badges

answered Apr 26, 2021 at 9:16

prehistoricpenguin's user avatar

It’s not standard C or C++(a) but, given the context (CRC16 and the variable names), it almost certainly takes two 8-bit bytes and forms a 16-bit word.


(a) Hence it’s probably defined somewhere in the libraries or source code you have available to you.

answered Apr 26, 2021 at 9:12

paxdiablo's user avatar

paxdiablopaxdiablo

844k233 gold badges1565 silver badges1937 bronze badges

Перейти к содержимому

Рассмотрим работу с Microsoft Word в C++. Для того чтобы C++ мог работать с Word-ом нужна библиотека-парсер, где будут описаны способы взаимодействия с этой программой. Для примера рассмотрим работу в компиляторах Borland C++ Builder и MS Visual C++.

В BCB для взаимодействия с Word достаточно подключения  библиотеки ComObj.hpp, она дает возможность работать с Ole, что позволяет принимать и посылать данные Word.

Пример такой программы:

{

  Variant wrd;

  wrd = CreateOleObject(«Word.Application»);

  wrd.OlePropertyGet(«Documents»).OleProcedure(«Open», «D:\word.doc»);

  wrd.OlePropertyGet(«ActiveDocument»).OlePropertyGet(«Content»).OleProcedure(«InsertAfter»,«Привет»);

  wrd.OlePropertyGet(«ActiveDocument»).OleProcedure(«Save»);

  wrd.OlePropertyGet(«ActiveDocument»).OleProcedure(«Close»);

}

Поясним работу программы: посредством Ole создаётся объект (CreateOleObject()),  это приложение Word. После этого объект wrd открывает файл (OleProcedure(«Open», «D:\word.doc»). Затем в открывшийся файл word-а записывается слово «Привет».

Итак, функции OleProcedure, OlePropertyGet и OlePropertySet позволяют получить доступ ко всем объектам Word.

Похожая программа в MS Visual C++ содержит заголовочный файл Word.h и файл cpp. Рассмотрим их далее.

Файл Word.h для версии Word 2007. Для других версий — аналогично.

// Word.h

#define Uses_MSO2007

#import «C:\Program Files\Microsoft Office\Office12\MSWORD.OLB» auto_rename

cpp-файл:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include «stdafx.h»

#include <conio.h>

#include <iostream>

#include «Word.h»

using namespace System;

using namespace std;

int main(array<System::String ^> ^args)

{

  ::CoInitialize(NULL);

  using namespace Word;

  _ApplicationPtr wrd(L«Word.Application»);

  wrd->Documents->Open(&_variant_t(«D:\word.doc»));

  wrd->ActiveDocument->Content->InsertAfter(«Пока»);

  wrd->ActiveDocument->Save();

  wrd->ActiveDocument->Close();

  ::CoUninitialize();

}

В VC ++ 6.0 BYTE, WORD, DWORD — это целое число без знака, которое определено в WINDEF.h

typedef unsigned char BYTE;

typedef unsigned short WORD;

typedef unsigned long DWORD;

Другими словами, BYTE — это тип без знака, WORD — беззнаковый короткий тип, а DWORD — беззнаковый длинный тип.

В VC ++ 6.0 1 байт символа, short — 2 байта, int и long — 4 байта, поэтому можно считать, что переменные, определяемые BYTE, WORD, DWORD, — это 1 раздел, 2 байта, 4 слова. Раздел.

То есть: BYTE = unsigned char, WORD = unsigned short, DWORD = unsigned long

DWORD обычно используется для сохранения адреса или сохранения указателя

Разница между словом и словом

Определение WORD и DWORD в основном для: 1. Легко трансплантировать; 2. Более строгая проверка типов

WORD фиксируется на 2 байта, DWORD фиксируется на 4 байта

Int, с разными операционными системами, имеет разное количество байтов, в 32-битной операционной системе — 4 байта, в 16-битной операционной системе — 2 байта

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

Я пытаюсь преобразовать некоторую функцию C ++ для использования в моем скрипте python и наткнулся на это:

int Crc16(args...)
{
   // Some calulations

   return (int)word(~ByteHi,~ByteLow)
}

Это конец необходимого мне калькулятора CRC16, я понятия не имею, что делает этот результат? Особенно «словесная» функция. ~ — это побитовое дополнение, а последнее возвращаемое число — одно целое число. Я ничего не нашел при поиске этой функции word (). Не могли бы вы помочь мне?

3 ответа

Лучший ответ

После просмотра файла readme проекта мы знаем, что это могут быть утилиты, связанные с Arduino, а затем просмотрите документ здесь:

https://www.arduino.cc/reference/en/language/variables/conversion/wordcast/

Описание Преобразует значение в тип данных word.

Синтаксис

word(x)
word(h, l)
(word)x (C-style type conversion)

Параметры

x: a value. Allowed data types: any type.
h: the high-order (leftmost) byte of the word.
l: the low-order (rightmost) byte of the word.

Возвращает тип данных: word.


3

Ted Lyngmo
26 Апр 2021 в 12:22

Судя по показанному вами использованию, я предполагаю, что он создает 16-битное значение из двух байтов. Но это не часть c / c++. Возможно, какая-то функция определена в вашем коде.

uint16_t word(uint8_t hi, uint8_t low)
{
    return (hi << 8) + lo;
}


4

Devolus
26 Апр 2021 в 12:12

(а)


(а)


2

paxdiablo
26 Апр 2021 в 12:12

Visual C++: проверяем орфографию и формируем офисный документ с помощью Word

Приведём пример кода на Visual C++, работающего с Word. Подойдёт любая версия Visual Studio от сборки Express 2010 и выше. Похожий пример на работу с Excel приводился в этой заметке.

Создадим новый проект C++/CLI, на форме расположим поле ввода richTextBox1 и растянем его на всю форму (свойство Dock = Fill)

Добавим на форму стандартные файловые диалоги openFileDialog1, saveFileDialog1

Добавим верхнее меню menuStrip1 с пунктами Файл — Создать, Файл — Открыть, Файл — Сохранить, Файл — Выход, запрограммируем их:

Меню Файл — Создать:
richTextBox1->Clear();
Меню Файл — Открыть:
openFileDialog1->FileName = "";
openFileDialog1->Filter = "RTF files (*.rtf)|*.rtf|All files (*.*)|*.*";
if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK &&
    openFileDialog1->FileName->Length > 0) {
 try {
  System::IO::Stream ^myStream;
  if ((myStream = openFileDialog1->OpenFile()) != nullptr) {
   myStream->Close();
   richTextBox1->LoadFile(openFileDialog1->FileName);
  }
 }
 catch (...) {
  MessageBox::Show("Не могу открыть файл "+System::IO::Path::GetFileName(openFileDialog1->FileName)+
   "nПроверьте его имя, права доступа и формат (нужен RTF)","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Asterisk);
  return;
 }
}
Меню Файл — Сохранить:
saveFileDialog1->FileName = "";
saveFileDialog1->Filter = "RTF files (*.rtf)|*.rtf";
saveFileDialog1->DefaultExt = "rtf";
if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK &&
    saveFileDialog1->FileName->Length > 0) {
 try {
  richTextBox1->SaveFile(saveFileDialog1->FileName, RichTextBoxStreamType::RichText);
  /*
  //А вот код через потоки, но только для содержимого txt
  System::IO::Stream ^ fileStream = saveFileDialog1->OpenFile();
  System::IO::StreamWriter ^ sw = gcnew System::IO::StreamWriter (fileStream);
  sw->Write(richTextBox1->Text); sw->Flush(); sw->Close();
  */
 }
 catch (...) {
  MessageBox::Show("Не могу сохранить файл "+System::IO::Path::GetFileName(saveFileDialog1->FileName)+
   "nПроверьте его имя и права доступа","Ошибка",MessageBoxButtons::OK,MessageBoxIcon::Asterisk);
  return;
 }
}
Меню Файл — Выход:
this->Close();

Добавим к проекту внешнюю библиотеку:

  • Для Visual Studio 2010 и подобных:
    меню Проект, Свойства, Список Общие свойства — .NET Framework и ссылки,
    кнопка Добавить новую ссылку…, вкладка Обзор.

    Показать на файл c: Program Files (или Program Files (x86)) Microsoft Office Office 14 (или ваша версия) MSWORD.OLB, ссылка добавится в список.

  • Для Visual Studio 2015 и подобных: в Обозревателе решений щёлкнуть правой кнопкой мыши на корневом узле формы, выбрать команды Добавить – Ссылка, Нажать кнопку Обзор, показать на указанный файл.

Добавим пункт меню Правка — Проверить и реализуем для него следующий (примерный) код:

auto Word1 = gcnew Microsoft::Office::Interop::Word::Application();
//тип auto - тип соответствующей переменной выводится из выражения инициализации, как в C#
Object ^ t = Type::Missing; // Переменная с "пустым" значением
auto Doc = Word1->Documents->Add(t, t, t, t); // Открываем новый документ MS Word
Doc->Words->First->InsertBefore(richTextBox1->Text); // Вводим в документ MS Word текст из текстового поля
//Или:
//Word1->Selection->default = richTextBox1->Text; // Копируем содержимое текстового окна в документ
//Или:
//Word1->Selection->TypeText ("nАшибка"); //Вводим текст прямо в документ
Doc->CheckSpelling(t, t, t, t, t, t, t, t, t, t, t, t); // Непосредственная проверка орфографии
String ^ CorrectedText = Doc->Content->default;// Получаем исправленный текст
richTextBox1->Text = CorrectedText; // Возвращаем в текстовое поле исправленный текст
//Или: richTextBox1->Text = CorrectedText->Replace("r", ""); 
//Или: richTextBox1->Text = Word1->Selection->default;
Object ^ tt = Microsoft::Office::Interop::Word::WdSaveOptions::wdDoNotSaveChanges; //Не сохранять документ
Word1->Documents->Close(tt, t, t); // Закрыть документ Word без сохранения
Word1->Quit(tt, t, t);
Word1 = nullptr;

Если офис-2007 выдаёт ошибку «Неверно указана единица измерения», попробуйте заменить файл
C: Program Files (или Program Files (x86)) Microsot OfficeOffice121049 WWINTL.DLL на вот этот: скачать по ссылке

Перед заменой закройте все офисные программы и проверьте, что размеры оригинального и исправленного файлов совпадают.

Пример 2. Построение объекта в документе Word (на примере таблицы)

Аналогично предыдущему примеру, добавим к проекту ссылку на COM-объект:

  • В Visual Studio 2010: вкладка COM в окне ”Добавить ссылку” – показать на библиотеку Microsoft Word 14.0 Object Library (или ваша версия вместо 14).
  • В Visual Studio 2015: список COM в окне «Добавить ссылку» – пункт Библиотеки типов — включить чекбокс «Microsoft Word 14.0 Object Library» (или ваша версия вместо 14).

Добавим к приложению пункт меню Правка — Записать отчет и реализуем следующий код:

//Код для формирования таблицы и передачи её в Word:
array<String^> ^ Imena = {"Name1", "Name2", "Name3"};
array<String^> ^ Tel = {"101-22-33", "310-00-47","222-13-15"};
int Size= Tel->Length;

auto Word1 = gcnew Microsoft::Office::Interop::Word::Application();
Word1->Visible = true;
auto t = Type::Missing;

auto Doc1 = Word1->Documents->Add(t, t, t, t);
Word1->Selection->TypeText("ТАБЛИЦА ТЕЛЕФОНОВ"); // Вводим текст в документ MS WORD с текущей позиции
System::Object ^ t1 = Microsoft::Office::Interop::Word::WdDefaultTableBehavior::wdWord9TableBehavior; 
 // Параметр, указывающий, показывать ли границы ячеек
System::Object ^ t2 = Microsoft::Office::Interop::Word::WdAutoFitBehavior::wdAutoFitContent; 
 // Параметр, указывающий будет ли приложение Word автоматически изменять размер ячеек
 // в таблице для подгонки содержимого
Word1->ActiveDocument->Tables->Add(Word1->Selection->Range, Size, 2, t1, t2); 
 // Создаем таблицу из Size строк и 2 столбцов
for (int i = 1; i<=Size; i++) { // Заполняем таблицу
 Word1->ActiveDocument->Tables[1]->Cell(i, 1)->default->InsertAfter(Imena[i - 1]);
 Word1->ActiveDocument->Tables[1]->Cell(i, 2)->default->InsertAfter(Tel[i - 1]);
}
Object ^ t3 = Microsoft::Office::Interop::Word::WdUnits::wdLine; 
 // Назначаем единицы измерения в документе приложения MS Word
Object ^ LastString = Size;
 // Параметр, указывающий на последнюю строку в документе MS Word
Word1->Selection->MoveDown(t3, LastString, t); 
 // Перевести текущую позицию (Selection) за пределы таблицы, чтобы здесь вывести какой-либо текст
Word1->Selection->TypeText("Какой-либо текст после таблицы");
Object ^ FileName = "report.doc"; //Подготовили имя файла для сохранения
Word1->ActiveDocument->SaveAs(FileName, t, t, t, t, t, t, t, t, t, t, t, t, t, t, t);

 Скачать этот пример в архиве .ZIP с проектом Visual C++ (15 Кб)

31.03.2015, 11:41 [12307 просмотров]


 

В программе строки могут определяться следующим образом:

  • как строковые константы;
  • как массивы символов;
  • через указатель на символьный тип;
  • как массивы строк.

Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

Любая последовательность символов, заключенная в двойные кавычки «», рассматривается как строковая константа.

Для корректного вывода любая строка должна заканчиваться нуль-символом », целочисленное значение которого равно 0. При объявлении строковой константы нуль-символ добавляется к ней автоматически. Так, последовательность символов, представляющая собой строковую константу, будет размещена в оперативной памяти компьютера, включая нулевой байт.

Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.

Для помещения в строковую константу некоторых служебных символов используются символьные комбинации. Так, если необходимо включить в строку символ двойной кавычки, ему должен предшествовать символ «обратный слеш»: ‘»‘.

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

При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

char m2[]=«Горные вершины спят во тьме ночной.»;
char m3[]={‘Т’,’и’,’х’,’и’,’е’,’ ‘,’д’,’о’,’л’,’и’,’н’,’ы’,’ ‘,’п’,’о’,’л’,’н’,’ы’,’ ‘,’с’,’в’,’е’,’ж’,’е’,’й’,’ ‘,’м’,’г’,’л’,’о’,’й’,»};

В этом случае имена m2 и m3 являются указателями на первые элементы массивов:

  • m2        эквивалентно &m2[0]
  • m2[0]     эквивалентно ‘Г’
  • m2[1]     эквивалентно ‘o’
  • m3        эквивалентно &m3[0]
  • m3[2]     эквивалентно ‘x’

 
При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

char m2[80]=«Горные вершины спят во тьме ночной.»;

Для задания строки можно использовать указатель на символьный тип.

В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

m4 = m3;
*m4       эквивалентно m3[0]=‘Т’
*(m4+1)   эквивалентно m3[1]=‘и’

Здесь m3 является константой-указателем. Нельзя изменить m3, так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4.

Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

Массивы символьных строк

Иногда в программах возникает необходимость описание массива символьных строк. В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

char *poet[4] = {«Погиб поэт!», «- невольник чести -«,
«Пал,» , «оклеветанный молвой…»};

В этом случае poet является массивом, состоящим из четырех указателей на символьные строки. Каждая строка символов представляет собой символьный массив, поэтому имеется четыре указателя на массивы. Указатель poet[0] ссылается на первую строку:
*poet[0] эквивалентно ‘П’,
*poet[l] эквивалентно ‘-‘.

Инициализация выполняется по правилам, определенным для массивов.
Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
последовательности.
Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

Массив строк

Свободный массив

Описание

определяет свободный массив, где длина каждой строки определяется тем указателем, который эту строку инициализирует. Свободный массив не тратит память напрасно.

Операции со строками

Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

  • выделить блок оперативной памяти под массив;
  • проинициализировать строку.

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

char *name;
name = (char*)malloc(10);
scanf(«%9s», name);

Для ввода строки использована функция scanf(), причем введенная строка не может превышать 9 символов. Последний символ будет содержать ».

Функции ввода строк

Для ввода строки может использоваться функция scanf(). Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат «%s» для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

Для ввода строки, включая пробелы, используется функция

или её эквивалент

В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.

Функции вывода строк

Для вывода строк можно воспользоваться рассмотренной ранее функцией

printf(«%s», str); // str — указатель на строку

или в сокращенном формате

Для вывода строк также может использоваться функция

которая печатает строку s и переводит курсор на новую строку (в отличие от printf()). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

Функция ввода символов

Для ввода символов может использоваться функция

которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.

Функция вывода символов

Для вывода символов может использоваться функция

которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

Пример Посчитать количество введенных символов во введенной строке.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
  char s[80], sym;
  int count, i;
  system(«chcp 1251»);
  system(«cls»);
  printf(«Введите строку : «);
  gets_s(s);
  printf(«Введите символ : «);
  sym = getchar();
  count = 0;
  for (i = 0; s[i] != »; i++)
  {
    if (s[i] == sym)
      count++;
  }
  printf(«В строкеn»);
  puts(s);      // Вывод строки
  printf(«символ «);
  putchar(sym); // Вывод символа
  printf(» встречается %d раз», count);
  getchar(); getchar();
  return 0;
}

Результат выполнения
Количество введенных символов в строке

Основные функции стандартной библиотеки string.h приведены в таблице.

Функция Описание

char *strcat(char *s1, char *s2)

присоединяет s2 к s1, возвращает s1

char *strncat(char *s1, char *s2, int n)

присоединяет не более n символов s2 к s1, завершает строку символом », возвращает s1

char *strсpy(char *s1, char *s2)

копирует строку s2 в строку s1, включая », возвращает s1

char *strncpy(char *s1, char *s2, int n)

копирует не более n символов строки s2 в строку s1, возвращает s1;

int strcmp(char *s1, char *s2)

сравнивает s1 и s2, возвращает значение 0, если строки эквивалентны

int strncmp(char *s1, char *s2, int n)

сравнивает не более n символов строк s1 и s2, возвращает значение 0, если начальные n символов строк эквивалентны

int strlen(char *s)

возвращает количество символов в строке s

char *strset(char *s, char c)

заполняет строку s символами, код которых равен значению c, возвращает указатель на строку s

char *strnset(char *s, char c, int n)

заменяет первые n символов строки s символами, код которых равен c, возвращает указатель на строку s

Пример использования функций

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
  char m1[80] = «Первая строка»;
  char m2[80] = «Вторая строка»;
  char m3[80];
  system(«chcp 1251»);
  system(«cls»);
  strncpy(m3, m1, 6);  // не добавляет » в конце строки
  puts(«Результат strncpy(m3, m1, 6)»);
  puts(m3);
  strcpy(m3, m1);
  puts(«Результат strcpy(m3, m1)»);
  puts(m3);
  puts(«Результат strcmp(m3, m1) равен»);
  printf(«%d», strcmp(m3, m1));
  strncat(m3, m2, 5);
  puts(«Результат strncat(m3, m2, 5)»);
  puts(m3);
  strcat(m3, m2);
  puts(«Результат strcat(m3, m2)»);
  puts(m3);
  puts(«Количество символов в строке m1 равно  strlen(m1) : «);
  printf(«%dn», strlen(m1));
  _strnset(m3, ‘f’, 7);
  puts(«Результат strnset(m3, ‘f’, 7)»);
  puts(m3);
  _strset(m3, ‘k’);
  puts(«Результат strnset(m3, ‘k’);
  puts(m3);
  getchar();
  return 0;
}

Результат выполнения
Использование функций

Назад: Язык Си

Понравилась статья? Поделить с друзьями:
  • Функция автозаполнения в libreoffice calc ms excel позволяет
  • Функция sin в excel 2007
  • Функция word сравнение документов
  • Функция автозаполнения в excel это
  • Функция sheet в excel