それC++なら#defineじゃなくてもできるよ

この記事は 初心者 C++er Advent Calendar 2015 18日目の記事です.
17日目の記事は@yumetodoさんで C99からC++14を駆け抜けるC++講座でした.

はじめましての人ははじめまして, とさいぬです.
自称情報系の電気科学生をやっています.

C++歴は2年くらいで, Twitterで知り合ったC#erやRubyistのマネをしようとTwitterライブラリを書いたり, 最近は某所でプログラムを書きながら新しく入ったメンバーにC++を教えたりもしています.

もう汚いマクロは見たくないんだ

今年は何かと マクロ に苦しめられた年でした.

C言語の入門書や学校のC言語の授業では, #define定数を定義するための構文 として細かな説明もなく使われだしたりします.
故に, 今年から参加することになった某所のソフトでは, こんなコードや

void yabai_func1() {
#define N 10
  for (int i = 0; i < N; i++) {
    /* */
  }
}

void yabai_func2() {
#define N 15
  for (int i = 0; i < N; i++) {
    /* */
  }
}

こんなコードまで発掘されました.

class yabaclass {
private:
#define ARRAY_SIZE 10
  // ...
};

また, 昨年秋から今年の初めまで触っていたとあるフレームワークでは, 特殊な構文を実現するために定義された大量のマクロに起因する不可解なコンパイルエラー に悩まされ, C++やめてやろうかとまで思ったりもしました.

もうこんなマクロ定義するの, やめませんか?

そうした思いを込めて, この記事では Cプリプロセッサとは何か, そして C++だからできる#defineを使わない書き方 について紹介できたらなと思います.

Read More »

クラスメンバへのポインタ

某所で書いているプログラムで, std::thread() にクラスのメンバ関数を渡したいなーってことがあった.
std::thread::thread - cppreference.comにもそれっぽい記述がないのでググっていると, どうやらこんな感じにするらしい.

c++ - Start thread with member function - Stack Overflow

#include <iostream>
#include <memory>
#include <thread>

class nyan {
  std::unique_ptr<std::thread> th_;

public:
  void run() {
    th_ = std::make_unique<std::thread>(&nyan::worker, this);
  }

  ~nyan() {
    th_->join();
  }

private:
  void worker() {
    std::cout << "Nyan!!" << std::endl;
  }
};

auto main() -> int {
  nyan n;
  n.run();
}

この&nyan::workerみたいな記述がサッパリわからなかったので, C++のクラスのメンバ関数のポインタを調べたときのメモ.

Read More »

Gnuplotおぼえがき

僕はそういう学校に通っていることもあって, 毎週指導書に従った実験を行ってはレポートに追われるという日々を過ごしています.
そのレポートには結果をグラフにせよという場合があるわけですが, 今年の実験は測定値の増加や複雑な指示があるなどの理由から, 今までのように手書きでグラフを描くのが流石に辛くなってきました.

例えば...

オシロスコープから直接出力したCSV形式のファイル(データ数500件超)をグラフにせよ

だとか,

(上のオシロから出力したデータより) CH1 - CH2をグラフにせよ

みたいなもの. また,

測定値Aの関係をグラフにせよ
また, 測定値Bの関係を片対数グラフにせよ

といった, いくつ用紙の種類用意すればいいんだよ!などなど... (まぁ甘えといえば甘えですが)

グラフ作成といったらM$ Excelのイメージが強いんですが, イケイケのクールな学生を目指して(???)Gnuplotを使ってみたところ最高だったので忘れないようにメモしておきます.

Read More »

関数の戻り値が最も小さくなる配列の要素は何番目か

関数foo()と何らかの値の入った配列nyanがあって,

double foo(double arg) {
  return std::acos(arg);
}

double nyan[] = {.0, -.1, .3, -.5, .7};

foo(nyan[n])が最小になるn取得するって感じのコードを某所で見つけた.
こんな感じ.

int result;
double prev = INFINITY;

for (int i = 0; i < 5; i++) {
  if (foo(nyan[i]) < prev) {
    prev = foo(nyan[i]);
    result = i;
  }
}

std::cout << result << std::endl; // = 4

別に問題ないんだけれども, とにかくCoolじゃなくて個人的にもにょる...

ってことでこんな感じなのを思いついた. もっとよさ気な書き方があったら教えてくださいー.
動作確認はclang++ -Wall -Wextra -std=c++14 prog.ccでしました.

Read More »

Btrfsが死んだ

> 突然の死 <

それは昨日の朝のことだった.

ちーん

Read More »