ロボット CPP プログラミングの基礎-03 変数の型 変数の型

ロボット CPP プログラミングの基礎-02 変数 変数


全文AI生成。


C++

#include<iostream>

using namespace std;

main()
{
    int a=10,b=35; // 4 bytes
    cout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;
    cout<<"Value of b : "<<b<<" Address of b : "<<&b <<endl;

    short s=20; //2 bytes
    cout <<"Value of s : "<< s << endl;

    float f1=20.03; //4 bytes
    double d1=50.55416416; //8 bytes
    cout <<"Value of f1 : "<< f1 << endl;
    cout <<"Value of d1 : "<< d1 << endl;

    char c1='A';
    cout<<c1<<endl;

    string s1="Hello Tridib";
    cout<<s1<<endl;

    string s2="Welcome to CPP !";
    cout<<s2<<endl;

    string combineStrings=s1+", "+s2;
    cout<<combineStrings<<endl;

    bool b1=true; //Boolean is true or false. FALSE IS ALWAYS ZERO, EVERY OTHER NUMBER IS TRUE.
    cout<<b1<<endl;
    b1=1515;
    cout<<b1<<endl;
    b1=-445;
    cout<<b1<<endl;
    b1=0;
    cout<<b1<<endl;

    //Positive numbers or unsigned numbers. Increases the positive range.
    unsigned short int u1=60445;
    cout<< u1 <<endl;

    const string myname="Tridib";
    cout << myname << endl;

}

コードは C++ で書かれており、さまざまなデータ型の宣言と初期化、およびcoutステートメントを使用してこれらの変数の値とアドレスを出力する方法が含まれています。以下は各行の詳細な分析です。

上記は、このコードの詳細な分析です。

  1. #include<iostream>: 入出力ストリームを含むライブラリ。これにより、プログラムで入出力関数を使用できるようになります。
  2. using namespace std;:std名前空間を使用して宣言します。std標準ライブラリの標準略語です。このようにして、各 name の前に記述することなく、標準ライブラリ内の名前を直接使用できますstd::
  3. main(): プログラムのメイン関数であり、すべての C++ プログラムはここから実行されます。
  4. int a=10,b=35;: 2 つの整数変数 a と b を宣言し、10 と 35 に初期化します。
  5. cout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;: cout「 a の値 : 」と変数 a の値を出力し、次に「 a のアドレス : 」と変数 a のアドレスを出力するために使用します。&演算子は変数のメモリアドレスを取得するために使用されます。endl新しい行を挿入するために使用されます。
  6. cout<<"Value of b : "<<b<<" Address of b : "<<&b <<endl;: 上記と同様ですが、変数 b の値とアドレスを出力します。
  7. short s=20;: 短整数変数 s を宣言し、20 に初期化します。ほとんどのシステムでは、short は通常 2 バイト (16 ビット) です。
  8. cout <<"Value of s : "<< s << endl;: cout「Value of s :」と変数 s の値を出力するために使用します。
  9. float f1=20.03;: 単精度浮動小数点変数 f1 を宣言し、20.03 に初期化します。通常、ほとんどのシステムでは float は 4 バイト (32 ビット) です。
  10. double d1=50.55416416;: 倍精度浮動小数点変数 d1 を宣言し、50.55416416 に初期化します。double は、ほとんどのシステムでは通常 8 バイト (64 ビット) です。
  11. cout <<"Value of f1 : "<< f1 << endl;: cout「f1 の値:」と変数 f1 の値を出力するために使用します。
  12. cout <<"Value of d1 : "<< d1 << endl;: cout「 d1 の値 : 」および変数 d1 の値を出力するために使用します。
  13. char c1='A';: 文字変数 c1 を宣言し、'A' に初期化します。
  14. cout<<c1<<endl;:cout変数 c1 の値 (文字「A」) を出力するために使用します。
  15. string s1="Hello Tridib";: 文字列変数 s1 を宣言し、「Hello Tridib」に初期化します。
  16. cout<<s1<<endl;:cout変数 s1 の値 (「Hello Tridib」) を出力するために使用します。
  17. string s2="Welcome to CPP !";: 別の文字列変数 s2 を宣言し、「CPP へようこそ!」に初期化します。
  18. cout<<s2<<endl;:cout変数 s2 の値 (「CPP へようこそ!」) を出力するために使用します。
  19. string combineStrings=s1+", "+s2;: s1 と s2 を結合して、新しい文字列 combinStrings を作成します。
  20. cout<<combineStrings<<endl;:cout出力変数 combinStrings の値 (「Hello Tridib, Welcome to CPP !」) を使用します。
  21. bool b1=true;: ブール変数 b1 を宣言し、true に初期化します。C++ では、ブール型の値は true または false のみです。
  22. cout<<b1<<endl;:cout変数 b1 の値 (true) を出力するために使用します。C++では、ブール値は出力時に「true」または「false」の文字列に自動的に変換されます。
  23. b1=1515;: 変数 b1 の値を整数 1515 に変更します。C++ では、ブール型の値は 0 または 0 以外の整数にすることもできます。
  24. cout<<b1<<endl;:cout変数 b1 の値を出力するために使用します。ゼロ以外の整数は true とみなされるため、ここでの出力は true になります。
  25. b1=-445;: 変数 b1 の値を -445 に変更します。
  26. cout<<b1<<endl;:cout出力変数 b1 の値を使用します。ゼロ以外の整数は true とみなされるため、ここでは

    出力は true です。

  27.  b1=0;: 変数 b1 の値を 0 に変更します。

  28. cout<<b1<<endl;:cout変数 b1 の値を出力するために使用します。ブール型の値は true または false のみであるため、ここでの出力は false になります。
  29. unsigned short int u1=60445;: unsigned short integer 変数 u1 を宣言し、60445 に初期化します。ほとんどのシステムでは、unsigned short は通常 2 バイト (16 ビット) です。
  30. cout<< u1 <<endl;:cout変数 u1 の値を出力するために使用します。符号なし型なので255以上の整数が出力可能です。
  31. const string myname="Tridib";: 定数文字列変数 myname を宣言し、それを「Tridib」に初期化します。const キーワードは、変数の値を変更できないことを示します。
  32. cout << myname << endl;:cout変数 myname の値 (「Tridib」) を出力するために使用します。

C++ は、複数の変数型をサポートするマルチパラダイム プログラミング言語です。以下は、C++ での主な変数の型とその説明です。

  1. 基本タイプ

    • 整数型: これらの型は、整数値を格納するために使用されます。署名付きタイプと署名なしタイプの両方。

      • int: 通常は 32 ビットですが、サイズはプラットフォームによって異なる場合があります。
      • short:通常は16ビット。
      • long: 通常は 32 ビットまたは 64 ビットですが、サイズはプラットフォームによって異なる場合があります。
      • long long: 通常は 64 ビット、サイズはプラットフォームによって異なる場合があります。
    • 浮動小数点型: これらの型は、小数点を含む値を格納するために使用されます。

      • float: 単精度、通常は 32 ビット。
      • double: 倍精度、通常は 64 ビット。
    • 文字タイプ: これらのタイプは、単一の文字または ASCII 値を格納するために使用されます。

      • char: 符号付きまたは符号なし、通常は 8 ビット。
    • ブール型:は、論理値を格納するために使用され、 OR 演算boolできますtruefalse

  2. 複合タイプ

    • 配列: 同じタイプの複数の要素を格納するために使用されます。
    • String : 複数の文字を格納するために使用される文字の配列。
    • 構造: 異なる型の複数の変数を組み合わせるために使用されます。
    • Union : メモリ内の異なるデータ型の複数の変数を共有するために使用されます。
  3. ポインタ型

    • int *p;: 整数へのポインタを定義します。
    • double *dp;: 倍精度浮動小数点数へのポインタを定義します。
    • char *cp;: 文字へのポインタを定義します。
  4. 参照型

    • int &ref;: 整数変数への参照を定義します。参照とそれが参照する変数はメモリ内の同じエンティティです。
  5. 列挙型

    • enum color { red, green, blue };: 赤、緑、青の 3 つの値を含む color という名前の列挙型を定義します。
  6. カスタムタイプ

    • クラス: カスタムのデータ型とメソッドを定義します。クラスは、属性 (変数) とメソッド (関数) を含めることができるユーザー定義のデータ型です。
  7. 特殊なタイプ

    • void: 型がないことを示します。関数に戻り値がvoid func()ないことを示すなど、関数の戻り値の型によく使用されます。
    • const: 定数を示します。一度値を与えると変更できません。たとえばconst int a = 10;、 a の値は変更できません。
    • volatile: 変数を示します。つまり、変数の値がいつでも変化することをプログラムが予測できないことを示します。たとえば、ハードウェア レジスタの値、実行中のプロセスなどです。
  8. 複合型のさらなる拡張(配列、ポインター、参照など):

    • ポインタの配列: 配列の要素はポインタ型です。たとえば、int *arr[5]整数への 5 つのポインタを含む配列が定義されます。
    • ポインターへのポインター: たとえば、int **pp;整数型の変数を指すことができるポインターへのポインターが定義されます。
    • 参照配列: たとえば、int &arr[5]5 つの整数参照を含む配列が定義されます。各参照は、参照する配列要素のエイリアスです。
  9. 関数ポインタ: 関数へのポインタ、たとえばint (*fp)(int)整数パラメータを受け取り、整数を返す関数ポインタが定義されます。

  10. スマート ポインター: C++11 では、動的に割り当てられたメモリの管理を支援するスマート ポインターが導入されています。スマート ポインターは、動的に割り当てられたメモリを安全な方法で自動的に管理するクラスです。いくつかのスマート ポインターの種類を次に示します。

    • std::unique_ptr<T>: このタイプのポインターは、スコープ外になると、その所有権を自動的に削除します。これは 1 つのオブジェクトのみを指すことができ、指すオブジェクトには常に所有者が存在することが保証されます。
    • std::shared_ptr<T>: このタイプのポインタを使用すると、複数のスマート ポインタが同じオブジェクトを共有できます。最後のスマート ポインタがスコープ外に出るかリセットされると、それが指すオブジェクトは自動的に削除されます。
    • std::weak_ptr<T>: このタイプのポインターは共有オブジェクトも指しますが、オブジェクトの参照カウントは増加しません。オブジェクトの破棄は、最後のオブジェクトがshared_ptrスコープ外に出るか、リセットされるときに発生します。weak_ptr

これらは C++ の主な変数の型です。オプションで、特定のプログラミングのニーズを満たすためにカスタムの型と構造を作成することもできます。

C++14 では、C++11 と C++17 の両方で拡張されたいくつかの新しい変数型が導入されています。以下は、C++14 で導入された新しい変数タイプの一部です。

  1. アトミック タイプ (アトミック タイプ) : これらのタイプは <atomic> ヘッダー ファイルで定義され、他のスレッドをブロックさせることなく個別に操作できる値を表すために使用されます。アトミック タイプには、整数、浮動小数点、およびポインタ タイプが含まれます。

    • atomic<T>: アトミック操作の基本タイプを定義します。アトミック操作は、他のスレッドからの干渉なしにデータを変更する、単一のスレッドで実行される操作です。
    • atomic_flag: 単純なアトミック ブール演算の実装に使用できるアトミック フラグを定義します。
  2. 配列の初期化{}: C++14では、中括弧を使用した初期化を可能にする新しい配列初期化メソッドが導入されています。例えば:

 
 

cpp复制代码

int arr[] = {1, 2, 3, 4, 5};
  1. ジェネリック ラムダ キャプチャ: C++14 ではジェネリック ラムダ キャプチャが導入されており、スコープ内にあるかどうかに関係なく変数をキャプチャできるようになります。例えば:

 
 

cpp复制代码

auto lambda = [captured_var = some_global_var](){ /* Use captured_var */ };
  1. 右辺値参照: 右辺値参照はさらに拡張され、使いやすく、より柔軟になりました。C++14 では、移動セマンティクスと完全転送のための機能が導入されていstd::moveますstd::forward
  2. 型推論: C++14 では、配列および関数型のパラメーターの抽出を含む、いくつかの新しい型推論ルールが導入されています。
  3. Unicode サポート: C++14 では、新しい文字タイプや関数を含む、より包括的な Unicode サポートが導入されています。
  4. スレッド ローカル ストレージ: C++14 ではスレッド ローカル ストレージが導入され、スレッドごとに変数の個別のコピーを保存できるようになります。
  5. バイナリ リテラル: C++14 では、2 進整数や 2 進浮動小数点数を含む、新しいバイナリ リテラルが導入されています。
  6. リテラルの浮動小数点数の表示0x1p+2n: C++14 では、たとえば16 進浮動小数点数を表すために、リテラルで浮動小数点数の表示を使用できます。

これらは、C++14 で導入された主な変数の型と関数の一部です。これらの機能により、言語の表現力とパフォーマンスが強化され、柔軟性と制御が向上します。

C++20 では、言語の表現力とパフォーマンスをさらに拡張するいくつかの新しい変数タイプと関数が導入されています。以下に、C++20 で導入された新しい変数の型と関数の一部を示します。

  1. 概念: 概念は、型が満たさなければならない条件を指定する言語機能です。コンセプトを使用してテンプレート パラメーターのタイプを制約し、テンプレートがインスタンス化されるときにそのタイプが特定の要件に確実に準拠するようにすることができます。これは、コードの読みやすさと保守性の向上に役立ちます。

 
 

cpp复制代码

template <typename T> concept bool C() { return requires (T t) { t++; }; }
template <C T> void f(T t) { ++t; }
  1. 構造化バインディング: C++20 では、式の値を複数の変数に直接割り当てることができる構造化バインディングが導入されています。これにより、配列、タプル、またはその他の複合型を構造化するときにさらに便利になります。

 
 

cpp复制代码

int a = 1, b = 2;
auto [c, d] = a + b; // c = 3, d = 3
  1. if constexpr : C++20 ではif constexpr、コンパイル時に異なるコード パスを条件付きで選択できるステートメントが導入されました。これは、条件付きコンパイルとコンパイル時の静的ディスパッチに役立ちます。

 
 

cpp复制代码

template <typename T> void f(T value) {
if constexpr (std::is_integral_v<T>) {
// 处理整数类型
} else if constexpr (std::is_floating_point_v<T>) {
// 处理浮点数类型
}
}
  1. 三元比較 (三元比較)<=> : C++20では、比較ベースの演算を実行するための三元比較演算子が導入されています。これを使用して、カスタム タイプの比較演算を実装できます。
  2. テンプレート エイリアス (テンプレート エイリアス) : C++20 ではテンプレート エイリアスが導入され、エイリアスを使用してテンプレートの宣言と使用を簡素化できるようになりました。
  3. フォールド式: C++20 では、二項演算子または三項演算子を展開するときに再帰的評価を可能にするフォールド式が導入されています。これは、高階関数や汎用アルゴリズムを実装する場合に役立ちます。
  4. ネストされた名前空間 (ネストされた名前空間) : C++20 では、コードをより適切に整理するために、名前空間内に別の名前空間を定義できます。
  5. コンテキストに応じた繰り返し名: C++20 では、特定のコンテキストで名前を繰り返し使用できるため、コードの可読性が向上します。
  6. モジュール: C++20 では、コンパイル速度とコード構成を向上させるためにコードを論理ユニットに分割する方法であるモジュールが導入されています。モジュールを使用すると、カプセル化を実装し、特定の関数またはライブラリを再利用できます。
  7. コンセプト ツール (コンセプト ツール) : C++20 は、コンセプトを定義および操作するためのツール セットを提供します。これは、コードの読みやすさと保守性の向上に役立ちます。

これらは、C++20 で導入された主な変数の型と関数の一部です。これらの機能により、言語の表現力とパフォーマンスがさらに強化され、柔軟性と制御が向上します。


Arduino

#include <avr/pgmspace.h>  
  
void setup() {  
  Serial.begin(9600);  
  
  int a = 10;  
  Serial.print("Value of a : ");  
  Serial.print(a);  
  Serial.print(" Address of a : ");  
  Serial.println(&a);  
  
  short s = 20;  
  Serial.print("Value of s : ");  
  Serial.println(s);  
  
  float f1 = 20.03;  
  Serial.print("Value of f1 : ");  
  Serial.print(f1);  
  Serial.println();  
  
  double d1 = 50.55416416;  
  Serial.print("Value of d1 : ");  
  Serial.println(d1);  
  
  char c1 = 'A';  
  Serial.print(c1);  
  Serial.println();  
  
  const char* s1 = "Hello Tridib";  
  Serial.println(s1);  
  
  const char* s2 = "Welcome to CPP !";  
  Serial.println(s2);  
  
  const char* combineStrings = pgm_read_word(&combineStrings); //pgm_read_word(&combineStrings) is used to get the address of the combineStrings variable in flash memory space and is not related to the original code  
  Serial.println(combineStrings);  
  
  bool b1 = true;  
  Serial.println(b1);  
  b1 = 1515;  
  Serial.println(b1);  
  b1 = -445;  
  Serial.println(b1);  
  b1 = 0;  
  Serial.println(b1);  
  
  unsigned short int u1 = 60445;  
  Serial.println(u1);  
}  
  
void loop() {  
  // put your main code here, to run repeatedly:  
}

Arduino IDE は C++ 変数タイプを使用するため、C++ のすべての一般的な変数タイプをサポートします。以下は、Arduino IDE で一般的に使用される C++ 変数タイプです。

  1. 基本タイプ

    • int: 整数値 (通常は 16 ビット) を表すために使用されます。
    • unsigned int: 符号なし整数値 (通常は 16 ビット) を表すために使用されます。
    • long: 長い整数値 (通常は 32 ビット) を表すために使用されます。
    • unsigned long: 符号なし長整数値 (通常は 32 ビット) を表すために使用されます。
    • char: 文字値を表すために使用されます (通常は 8 ビット)。
    • booltrue: OR が可能なブール値を表すために使用されますfalse
    • float: 単精度浮動小数点値 (通常は 32 ビット) を表すために使用されます。
    • double: 倍精度浮動小数点値 (通常は 64 ビット) を表すために使用されます。
  2. ポインタ型

    • int *p;: 整数へのポインタを定義します。
    • char *str;: 文字配列へのポインタを定義します。
  3. 配列型

    • int arr[10];: 10 個の整数の配列を定義します。
    • char str[] = "Hello";: 文字列「Hello」を含む文字配列を定義します。
  4. 構造タイプ

    • struct MyStruct { int id; char name[20]; };: 整数メンバー変数 ID と文字配列メンバー変数名を含む MyStruct という名前の構造体を定義します。
  5. ユニオンタイプ

    • union MyUnion { int id; char name[20]; };: 整数メンバー変数 ID と文字配列メンバー変数名を含む MyUnion という名前の共用体を定義します。
  6. 関数の種類

    • int myFunction(int arg1, char arg2);: myFunction という名前の関数を定義し、整数パラメータ arg1 と文字パラメータ arg2 を受け入れ、整数値を返します。
  7. カスタムタイプ

    • typedef int MyInt;: int 型と同等の新しい型エイリアス MyInt を定義します。
  8. 列挙型

    • enum MyEnum { RED, BLUE, GREEN };: RED、BLUE、GREEN の 3 つの値を使用して、MyEnum という名前の列挙型を定義します。
  9. 型変換

    • 自動型変換: ある型の値を別の型の変数に代入する場合、コンパイラは自動的に型変換を実行します。たとえば、整数値を浮動小数点変数に代入する場合、コンパイラは整数値を浮動小数点数に変換します。
    • キャスト: キャスト演算子を使用して、ある型の値を別の型に変換します。たとえば、(float) xx を float 型に変換します。
  10. 定数と定数式

    • 定数: const キーワードを使用して、プログラムの実行中に値を変更できない定数を定義します。たとえば、const int kConstantValue = 42;
    • 定数式: const およびリテラル初期化子を使用して定数式を定義します。定数式は、コンパイル時に結果を評価できる式である必要があり、変数や関数呼び出しを含めることはできません。たとえば、 const int kConstantExpression = 4 * 7; は定数式ですが、 const int kVariableExpression = k + 1; は、k の値がコンパイル時に決定できないため、定数式ではありません。

これらは、Arduino IDE で一般的に使用される C++ 変数タイプと関連概念です。これらの変数の型と概念を理解することは、Arduino プログラムを作成する上で非常に重要です。


ROS1

AI生成は実現可能か?? ?

#include <ros/ros.h>  
#include <std_msgs/String.h>  
  
int main(int argc, char **argv)  
{  
    ros::init(argc, argv, "my_node");  
    ros::NodeHandle nh;  
  
    int a=10,b=35; // 4 bytes  
    ros::console::cout << "Value of a : " << a << " Address of a : " << &a << ros::console::endl;  
    ros::console::cout << "Value of b : " << b << " Address of b : " << &b << ros::console::endl;  
  
    short s=20; //2 bytes  
    ros::console::cout << "Value of s : " << s << ros::console::endl;  
  
    float f1=20.03; //4 bytes  
    ros::console::cout << "Value of f1 : " << f1 << ros::console::endl;  
  
    double d1=50.55416416; //8 bytes  
    ros::console::cout << "Value of d1 : " << d1 << ros::console::endl;  
  
    int c1 = 65;  
    ros::console::cout << c1 << ros::console::endl;  
  
    std_msgs::String s1;  
    s1.data = "Hello Tridib";  
    ros::console::cout << s1.data << ros::console::endl;  
  
    std_msgs::String s2;  
    s2.data = "Welcome to CPP !";  
    ros::console::cout << s2.data << ros::console::endl;  
  
    // string concatenation not supported in ROS  
    // you can use roscpp'sRosOutSignal to achieve this easily.  
    // RosOutSignal().outStr(s1.data + ", " + s2.data);   
    // instead of the line above you can do:  
    std_msgs::String combineStrings;  
    combineStrings.data = s1.data + ", " + s2.data;  
    ros::console::cout << combineStrings.data << ros::console::endl;  
  
    bool b1=true; //Boolean is true or false. FALSE IS ALWAYS ZERO, EVERY OTHER NUMBER IS TRUE.  
    ros::console::cout << b1 << ros::console::endl;  
    b1=1515;  
    ros::console::cout << b1 << ros::console::endl;  
    b1=-445;  
    ros::console::cout << b1 << ros::console::endl;  
    b1=0;  
    ros::console::cout << b1 << ros::console::endl;  
  
    //Positive numbers or unsigned numbers. Increases the positive range.  
    unsigned short int u1=60445;  
    ros::console::cout << u1 << ros::console::endl;  
  
    // const string myname="Tridib"; is not supported in ROS, you should use a string_view instead. (not implemented in roscpp at the time of writing)  
}

ROS1 Noetic は、主要なプログラミング言語として C++ を使用する ROS1 のバージョンです。ROS1 Noetic では、一般的な C++ 変数の型には次のものがあります。

  1. 基本型: 標準 C++ と同じ (int、float、double、char など)。
  2. スマート ポインター タイプ: ROS1 Noetic は主に2 つのスマート ポインター タイプを使用して、リソースのライフ サイクルを自動的に管理しますstd::shared_ptrstd::unique_ptr
  3. コールバック関数タイプ: ROS1 Noetic は、イベント駆動型コールバック メカニズムを実装するために、boost::functionや などの ROS1 固有のコールバック関数タイプを提供します。boost::slot
  4. 名前空間ros: ROS1 Noetic は、 、などの複数の名前空間を使用してstd_msgssensor_msgsROS 関連のコードとメッセージ タイプを編成および管理します。
  5. メッセージ タイプ: ROS1 Noetic は、 ROS システム内のノード間の通信に、 などのstd_msgs::String特定のメッセージ タイプを使用します。sensor_msgs::Imageこれらのメッセージ タイプは通常、ROS1 メッセージ仕様で定義されています。
  6. サービス タイプ: ROS1 Noetic は、ROS システムでサービス コールを実装するために、ros::ServiceServerや などの特定のサービス タイプを使用します。ros::ServiceResponseこれらのサービス タイプは、ROS1 サービス仕様で定義されています。
  7. アクション タイプactionlib::SimpleActionClient: ROS1 Noetic は、ROS システムの複雑な動作制御に、やなどの特定のアクション タイプを使用しますactionlib::SimpleGoalこれらのアクション タイプは、ROS1 アクション仕様で定義されています。

上記の変数タイプに加えて、ROS1 Noetic はロボット制御、センサーデータ処理、視覚化、その他の機能のための他の多くのツールやライブラリも提供します。


おすすめ

転載: blog.csdn.net/ZhangRelay/article/details/132219208