[C++/C] ポインタ

ポインタは変数のアドレスを持つ変数のこと
変数のアドレス場所を表すには、変数の頭に&をつける

ポインタ型とは、変数のアドレスを保存しておくための型
下記は同じ意味

char* test;
char *test;
#include <stdio.h>

int main(void) {

    char buf[50] = "bitcoin";
    char *test;

    test = buf;
    printf("%s", test);
    return 0;
}

文字列の後ろにつけるアスタリスクがあるのかと勘違いしてしまいますね。

[C++/C] uint256

uint256は256bitの符号付き整数型を宣言する
cpp uint256は、C++言語で使用される256ビットの符号なし整数型です。このデータ型は、非常に大きな整数値を扱うために使用されます。cpp uint256は、暗号通貨やブロックチェーンの開発において、特にハッシュ計算や暗号学的な操作に必要とされます。この型は、十進数や16進数などの異なる形式で整数を表現することもできます。cpp uint256は、その大きな範囲と精度のために、セキュリティや数値計算の要件を満たすために重要な役割を果たします。

The function uint256.ToString() is a method that convert a 256-bit unsigned integer into a string representation. This function is commonly used in cryptographic algorithms.

#include <iostream>
#include <string>

using namespace std;
using namespace boost::multiprecision;

int main() {
    
    uint256_t value = 1000000000000000000000000000000000000000000000000000000000000000;
    string str_value = value.ToString();
    cout << "Value as string: " << str_value << endl;
    return 0;
}


Boost.Multiprecisionから提供される多倍長整数

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>

namespace mp = boost::multiprecision;

int main() {
    
    mp::cpp_int x = 1;

    for (unsigned int i = 1; i <= 100; ++i) {
        x *= i;
    }

    std::cout << x << std::endl;
    return 0;
}

$ g++ -o sample sample.cpp && ./sample
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

[C++] iteratorとは?

イテレータとはコンテナ内での要素の位置を指すもので、ポインタのように扱うことができる。イテレータを使用することで、コンテナの種類に依存しないで処理を共通化できる。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    
    vector<int> x = {0, 1, 2, 3, 4};

    // begin()でコンテナ内の先頭要素を指す
    auto it = x.begin();

    cout << *it << endl;

    ++it;

    cout << *it << endl;

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
0
1

end()は要素の1つ先となる。

    vector<int> x = {0, 1, 2, 3, 4};
    for (auto it = x.begin(); it != x.end(); ++it) {
        cout << *it << endl;
    }

    return 0;

この性質によってコンテナの種類に依存せず algorithmで提供される機能を使用できる。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    
    vector<int> x = {0, 1, 2, 3, 4};
    auto n = std::count_if(x.begin(), x.end(), [](const int v){
        if (v <= 0) {
            return false;
        }
        if (v % 2 != 0){
            return false;
        }
        return true;
    });
    cout << n << endl;

    return 0;
}

[C++] endlとは

endl; とは出力の最後に改行を押し込むという意味

#include <iostream>
using namespace std;

int main() {
    
    cout << "I'm hpscript!" << endl;

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
I’m hpscript!

[C++] Ubuntu22.04にBoost install

Boost is a set of libraries for the C++ programming language that provides support for tasks and structures such as linear algebra, pseudorandom number generation, multithreading, image processing, regular expressions, and unit testing.

$ sudo apt-get install libboost-all-dev

#include <iostream>
#include <boost/version.hpp>

int main() {
    
    std::cout << "Ver." << BOOST_VERSION << '\n' <<
        "Lib Ver." << BOOST_LIB_VERSION << std::endl;

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
Ver.107400
Lib Ver.1_74

[C++/C] mapとは

mapはvector同様、配列の一種。
vectorが要素へのアクセスを0, 1, 2…といったインデックスで行っている一方、mapはキーが要素隣、連想配列とも言われる。

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main() {
    map <string, int> score;
    string names[] = {"Tom", "Bob", "Mike"};
    score[names[0]] = 100;
    score[names[1]] = 80;
    score[names[2]] = 120;
    int i;
    for(i = 0; i < 3; i++){
        cout << names[i] << ":" << score[names[i]] << endl;
    }
    return 0;
}

$ g++ -o sample sample.cpp && ./sample
Tom:100
Bob:80
Mike:120

[C++/C] external宣言

C言語において、extern宣言はグローバル変数を共有する仕組み

グローバル変数とローカル変数

#include <stdio.h>

int gNumber = 100;

void func(void) {
    gNumber += 100;
}

int main(void) {
    int tmp = 100;

    func();

    printf("tmp : %d\n", tmp);
    printf("gNumber : %d\n", gNumber);
}

$ gcc test.c -o test && ./test
tmp : 100
gNumber : 200

複数ファイルにする
main.c

#include <stdio.h>

void func();

int main(void) {

    func();
    printf("gNumber : %d\n", gNumber);
}

sub.c

int gNumber = 100;

void func(void) {
    gNumber += 100;
}

この場合、sub.cのコンパイルは通るがmain.cのコンパイル時にgNumberが定義されていない識別子としてエラーになる。
$ gcc -c sub.c
$ gcc -c main.c
main.c: In function ‘main’:
main.c:8:30: error: ‘gNumber’ undeclared (first use in this function)
8 | printf(“gNumber : %d\n”, gNumber);
| ^~~~~~~
main.c:8:30: note: each undeclared identifier is reported only once for each function it appears in

そこでmain.cでexternで宣言する

#include <stdio.h>

extern int gNumber;
void func();

int main(void) {

    func();
    printf("gNumber : %d\n", gNumber);
}

$ gcc -c main.c
$ gcc main.o sub.o -o main
$ ./main
gNumber : 200

[C++ basic] 出力, 文字数字

#include <iostream>
using namespace std;

int main() {
    cout << "ようこそC++!\n";
    cout << "lets start c++!\n";

    return 0;
}

coutはstandard outputと結び付けられ、 は表示を意味する
iostreamは画面出力の機能などを表す
coutは本来、using namespace stdでstc.coutと書くが、省略もできる。

int main() {
    cout << 1 << 2 << 3 << '\n' << 4 << 5 << '\n';

    return 0;
}

c++では文字、数字の表記をリテラルと呼ぶ。リテラルの他に、キーワード、識別子、演算子、区切り子などがある。
リテラルは”で囲む

#include <iostream>
using namespace std;

int main() {
    cout << 'A' << '\n';
    cout << "welcome to C++!\n";
    cout << 123 << '\n';

    return 0;
}

エスケープシーケンス

int main() {

    cout << "円記号を表示する:" << '\\' << '\n';
    cout << "アポストロフィを表示する:" << '\'' << '\n';

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
円記号を表示する:\
アポストロフィを表示する:’

文字コード

int main() {

    cout << "8進数101の文字コードを持つ文字は" << '\101' << "です\n";
    cout << "16進数61の文字コードを持つ文字は" << '\x61' << "です\n";

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
8進数101の文字コードを持つ文字はAです
16進数61の文字コードを持つ文字はaです

文字リテラルは”でくくる。
数値には整数と浮動小数点があり、それぞれinteger literal, floating literalと呼ぶ

int main() {

    cout << "10進数の10は" << 10 << "です\n";
    cout << "8進数の10は" << 010 << "です\n";
    cout << "16進数の10は" << 0x10 << "です\n";
    cout << "16進数のFは" << 0xF << "です\n";

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
10進数の10は10です
8進数の10は8です
16進数の10は16です
16進数のFは15です

int main() {

    cout <<  123 << '\n';
    cout << "\\" << "100もらった\n";
    cout << "また明日\n";

    return 0;
}

8進数と16進数

#include <iostream>
using namespace std;

int main() {

    // 8進数
    cout <<  06 << '\n';
    cout <<  024 << '\n';
    cout <<  015 << '\n';

    // 16進数
    cout <<  0x6 << '\n';
    cout <<  0x14 << '\n';
    cout <<  0xd << '\n';
}

16進数はビットコインで基本となってますね。

Ubuntu22.04でc++の実行環境を作る

$ sudo apt install build-essential
$ gcc –version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ –version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

#include <iostream>
using namespace std;

int main() {
    cout << "ようこそC++!\n";

    return 0;
}

$ g++ -o sample sample.cpp && ./sample
ようこそC++!