[C++] 作業ディレクトリの確認・変更

#define DATA_DIR "/dir" // 変更後の作業ディレクトリ
#define PATH_SIZE 512

#include <iostream>
#include <unistd.h>

using std::cout; using std::endl;

// 変更前の作業ディレクトリ確認
char tmp[256];
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;

// 作業ディレクトリ変更
chdir(DATA_DIR);

// 変更後の作業ディレクトリ確認
getcwd(tmp, 256);
cout << "Current working directory: " << tmp << endl;

[C++] const char* とconst wchar_t*の相互変換

Python/C APIでよく使うため関数をリサーチしました。2011年のStackOverflow英語版等にいい関数がありましたので拝借します。なおサロゲートペアには対応していません。

サロゲートペア:1つの文字に対して2つの文字コードを使って表される文字。𠀋 𡈽 𡌛 𡑮 𡢽 𠮟 𡚴 𡸴 𣇄 𣗄など。

const wchar_t* GetWC(const char* c) {
    const size_t cSize = strlen(c)+1;
    wchar_t* wc = new wchar_t[cSize];
    mbstowcs (wc, c, cSize);

    return wc;
    delete [] wc;
}

--------------------------------------------------
// stringへの変換(charは"string.c_str()")

std::string GetStr(const wchar_t* c) {

  std::string tmps;

  if (c == nullptr)
    return tmps;

  size_t sz = wcslen(c);

  tmps.reserve(sz*2);

  const size_t CNT_MAX = 50;
  char tmpc[CNT_MAX];
  wchar_t tmpw[CNT_MAX];

  const wchar_t* p = c;
  while (*p) {
    wcsncpy(tmpw, p, 1);
    tmpw[1] = L'\0';
    p += 1;
    
    wcstombs(tmpc, tmpw, CNT_MAX);
    tmps += tmpc;
  }
  
  return tmps;
}

setlocale(LC_ALL, ""); // GetC関数使用の際に必要

マルチバイト文字対策とは言えワイド文字wchar_tの存在は何ともやっかいです。

参考サイト
参考サイト2

[macOS] Pythonの開発環境構築 非pyenv

[Mac mini M1, macOS Big Sur 11.6.5]

Big SurにてPythonの開発環境を一から再構築してみました。pyenvは使わず、公式サイトからダウンロードしたPython3.10.4固定です。

ディレクトリ読み込みの優先順位は.bash_profileで設定しています。最初はpipがどこにも見当たらず少し焦りました。結局pip3をファイル名変更したシンボリックリンクとして使っています。

export PATH="/Library/Frameworks/Python.framework/Versions/3.10/bin"
export PATH=$PATH:"/usr/local/bin"
export PATH=$PATH:"/usr/bin"
export PATH=$PATH:"/bin"
# python
# /usr/local/binに3.10.4のシンボリックリンクを作成

ln -s /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /usr/local/bin/python

# pip
# /usr/local/binにpip3のシンボリックリンクを作成

ln -s /Library/Frameworks/Python.framework/Versions/3.10/bin/pip3 /usr/local/bin/pip

ファイル名を変えない場合は.bash_profileに以下の記述を追加します。

alias python="python3"
alias pip="pip3"

SIP(System Integrity Protection)を解除しても/usr/binのファイルを入れ替えることができないので、/usr/local/binに配置しました。

設定前後のpythonおよびpipファイルは以下のようになります。実効ファイルの配置ディレクトリ(色付きセル)はwhichコマンドで確認しました。

[C++] 25 string, char*, int間の変換

メインブログのTIPS記事はこちらに移動させます。

<string型からchar*型>
using std::string;

string str;
char* str_to_char = str.c_str();

<string型からchar[]型>
string str;

char ch[2048] = {};
str.copy(ch, 2047); // 最後にヌル文字が残るようにする

<int型からstring型>
using std::string; using std::to_string;

int num ;
string int_to_string = to_string(num);

<string型からint型>
using std::string; using std::stoi;

string str;
int str_to_int = stoi(str);

<char*型からint型> atoi関数はエラー時に0を返すので取り扱い注意!!
#include <stdlib.h>

char* ch;
int char_to_int = atoi(ch);

<int型からchar*型>
int型からstring型、string型からchar*型へ順に変換

using std::string; using std::to_string;

int num ;
string int_to_string = to_string(num);
char* str_to_char = (to_string(num)).c_str();

<const char*からstring型>
using std::string;

const char* cstr;
string cstr_to_string = string(cstr);

<char型単体からstring型>
char ch = 'a';
string str{ch}; strがstring型変数

<char[]型からstring型>
char chars[] = {'a', 'b', 'c'};
std::string str(chars, 3); // 3はcharの個数、strがstring型変数

[C++] size_t型

未だになじまないのでメモ。

長さ、大きさ、サイズを表現する型。sizeof演算子、strlen関数など、byte数や長さの表現に使用する。

unsigned longと同義。

[C++] コンパイルエラー std::vector

std::vectorはC03++以前の古いコンパイラでは対応していないため、コンパイル時にオプションとして-std=c++11などを追加します。

error: non-aggregate type 'std::vector<string>' \
(aka 'vector<basic_string<char, char_traits<char>, allocator<char> > >') \
cannot be initialized with an initializer list
std::vector<string> dakuon = {"が","ぎ"};

[VSCode] プロジェクト作成時のGit設定 非Xcode環境での開発

1.プロジェクトディレクトリを作成する。
2.カレントディレクトリをプロジェクトディレクトリに移動させる。
3. git initコマンドを実行し、ローカルリポジトリを初期化する。
4.VSCodeでプロジェクトディレクトリを開き、コーディングを開始。
5.適当なところで左のソース管理ボタンを押し、コミットする。

推奨拡張機能
Git Graph : バージョン管理状況を図で表示する。