カテゴリー「C/C++」の18件の記事

2018-06-05

コンピュータプログラミング言語調節可能おしゃれキャップ

ちょっと魅かれてしまった。

C++(シープラスプラス) コンピュータ プログラミング言語 男女兼用 メンズ レディース 調節可能 おしゃれ キャップ カジュアル ファッション 帽子 野球帽

| | コメント (0) | トラックバック (0)

2016-04-27

raspberry piでC++11を使えるようにする

gcc4.6ではC++11がうまくコンパイルできませんでしたので、gcc 4.8にバージョンアップしてみました。

sudo apt-get install gcc-4.8

で、こいつをg++コマンドと関連付ける

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20

これで、/etc/alternatives/g++が/usr/bin/g++-4.8にリンクされる。

で、コンパイラオプションに-std=c++11と、いつもつけるのが面倒くさいからエリアスを設定する。

echo "alias g++11='g++ -std=c++11'" > /home/pi/.bash_aliases

これで、g++11とするとC++11モードでコンパイルできる筈。

g++11 main.cpp -o test.exe

こんな感じでどうかな?




| | コメント (0) | トラックバック (0)

2016-03-21

StrinToIntのような文字列を整数に変換する関数を実装してみる

Abstract1176852_640

ちなみにatoiなど標準ライブラリーなどの関数を使うべきですが、純粋に文字列をint型にするのではなく、なにか似たような処理をする時のヒントになればと思います。

文字列の先頭から一文字取得して、数字に変換する。取得した文字を文字列から取り除く。文字列にまだ文字があれば、取得した数値を10倍する。

#include <iostream>
#include <string>

using namespace std;

int string_to_int(string s)
{
    int result = 0;
    while (s.length() != 0)
    {
        result += s[0] - '0';
        s = s.substr(1, s.length() - 1);
        if (s.length() != 0)
        {
            result *= 10;
        }
    }
    return result;
}

int main()
{
    string s = "123";
    cout << string_to_int(s) + 111 << endl;  // 234
    return 0;
}


アルゴリズムの基本




| | コメント (0) | トラックバック (0)

2016-03-03

インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい



オブジェクトを返すとか、例外を投入するだけでインライン化できない関数だが、既存関数の引数が固定のラッパー関数とかで、ループの中で頻繁に呼び出されたりするような関数を用意したいことがある。

だったら、マクロ化しまうのもひとつの手かと。


大量の引数を取る関数が何度も呼ばれるような場合で、呼び出しごとに変化する引数はひとつだけだというような場合には、他の引数は固定しておく事ができる。しかしラッパー関数を作ってしまうと、ラッパー関数の呼び出しと、ラッパー関数から呼ばれる本質の関数を呼び出すという、一度の関数呼び出しで二度ずつオーバーヘッドが発生する。子のオーバーヘッドが無視できれば、関数にしておいた方がソースの可読性は向上すると思うが、オーバーヘッドが無視できないようなケースではマクロ化してしまえば、オーバーヘッドを回避することができる。


C++ではマクロよりインライン関数を使うべきという説をよく見るので、インライン化できないと通常の関数化してしまいがちだが、普通にC言語のようにマクロ化してしまった方が有効な場合もある。




style="display:inline-block;width:300px;height:250px"
data-ad-client="ca-pub-1099589974703718"
data-ad-slot="4338286575">





| | コメント (0) | トラックバック (0)

2014-09-15

C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す

バーコードを利用したアプリケーションなどでユーザーがコンピュータの扱いに慣れていないと、何かの拍子にフォーカスがTEditなどから外れていても、構わずにバーコードを読んでしまって、よく確認をしていないために入力した筈のデータが抜け落ちてしまうというような事が起こります。

色々と考えてみたのですが、TForm::KeyPreviewをtrueにして、すべてのキー入力をTEditに投げるという事も考えたのですが、ちょっと違う方法を取ってみた。

フォームにTEditとTRadioButtonを置いてテストしてみます。これは、入荷と出荷などモードを切り替える時によく使うと思うので、TRadioButtonにしてみました。

// TRadioButtonのOnKeyPressイベント
void __fastcall TForm1::RadioButton1KeyPress(TObject *Sender, wchar_t &Key)
{
    ActiveControl = Edit1;
    Edit1->Text = Edit1->Text + Key;
    Edit1->SelStart = Edit1->Text.Length();
}

こんな風に別のコントロール(ここではTRadioButton)のOnKeyPressイベントでActiveControlをTEditに変更してTEdit::Textの末尾に入力された文字を結合します。

次に入力される文字を適切な場所に入力させるには、入力した文字列の末尾にキャレットがある必要があるので、TEdit::SelStartに文字列長を指定します。

これでTRadioButtonのTabStopをtrueにしておきTRadioButtonをクリックするなり、タブで移動するなりしてアクティブにしておき、そのままの状態でキーを入力するとTEditに入力されます。

TRadioButtonはいくつかの選択肢の択一なので、TRadioButtonを複数用意してみましたが、RadioButton1を選択して、矢印キーの上下で選択肢を移動しても選択の動作には影響はありません。OnKeyPressは文字以外はVK_ESCAPE、VK_RETURNや'\t'(TAB)くらいしか捕捉しないので、矢印やCtrl、Alt、Shiftなどではイベントが発生しないので、それなりにうまく動くようです。

逆に言うと、文字やVK_RETURNを受け取る必要があるようなコントロールに対しては工夫が必要かもしれません。

ちょっとテストした感じでは上手く動作しているようです。必要なら文字単位でフィルターを掛けるなどして、数字だけをTEditに転送するなどの処理をするといいかも知れません。



続きを読む "C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す"

| | コメント (2) | トラックバック (0)

2014-04-05

TUpDownではまった

TUpDownのAssociateにTEditを割りててたんですが、位置合わせのために再度AssociateにTEditを割り当ててやると、TEditのTextがTUpDownのPositionになるという事を知らずに、Edit1->Text = 10; とかしてた物がAssociateのタイミング?で、Edit1のTextが30とかになってしまう。

これだけじゃないけど、これをメインに色々とハマって1日無駄にしてしまった。

| | コメント (0)

2013-10-26

VCLでCGIにチャレンジしてみた

Delphi、C++BuilderではiPhone, Androidアプリ作成の話題で持ちきりですが、C++ Builder 2010でWebBrokerのWebサーバーアプリケーションプロジェクトでCGIを作らなければならなくなったので、やってみたのですが、わからない事だらけだしヘルプには記載がない物ばかりだし。

まず、デフォルトの文字コードがShift_JISなのかな?UTF-8にしたかったのですが、Response->ContentにUTF8String型の文字列を渡してやってもダメなんですね。
Response->ContentType=”text/html; charset=utf-8”;
ってしてやる必要があります。で、
Response->Content = UTF8String(PageProducer1->Content());
でUTF-8で出力する事ができるようになったのですが、HTMLのFORMから投げられる文字列の文字コードがUTF-8だと、取得がうまくいかない文字があるようです。組み合わせによってみたいです。
動的ページをブックマークしたり、リンクを作ったりしたいので、データはGETで渡します。
内部でAnsiStringで処理してるみたいですが…。

とにかく、
String title = Request->QueryFields->Value[“title”];
では文字化けしたりして取得できず、色々と試したのですが、どうもうまく取得できませんでした。
わからないので、自分で書く事にしました。

何をどう処理しているのかわからないので、色々と試行錯誤しました。

どうやらRequest->QueryとHTTPAppのHTTPDecodeが使えそうでした。
boost::shared_ptr queries(new TStringList());
queries->Delimiter = ‘&’;
queries->StrictDelimiter = true;
queries->DelimitedText = Request->Query;
としてみたんですが、うまく切り分けてくれませんでした。

どうもRequest->QueryがAnsiStringなのでうまくいっていないようでした。
UnicodeString unicode_query = Request->Query;
queries->DelimitedText = unicode_query;
として、Request->QueryをUnicodeStringに変換してからqueries->DelimitedTextに渡してみたら、ちゃんと切り分けてくれました。

UnicodeStringにしないとうまく切り分けられなかったので、切り分けのためにUnicodeStringにしてありますので、これをデコードするために再度AnsiStringに変換します。
AnsiString avalue = queries->Values[queries->Names[i]];
avalue = HTTPDecode(avalue);
UTF8String utf8_value;
utf8_value.SetLength(avalue.Length());
memcpy(utf8_value.c_str(), avalue.c_str(), avalue.Length());
でクエリを&で切り分けてデコードして、UTF8文字列に変換できたと思います。

あとは、適当にTPageProducerで透過タグの置換をしたりします。

それにしても、簡単にちょっとサンプルCGIを作って見る程度なら簡単にあっという間にできちゃうけど、サンプル以上の物を作ろうと思うと、結構自分で書かないとならない。

本当にこんな事が必要なのかな?大丈夫かな?なんか心配だな。

| | コメント (0) | トラックバック (0)

2013-07-09

データベースで検索に失敗する

IDが001000番があったとする。

where id like '%1%'

で結果レコードが0件になった。

where id like '%0%'

where id like '%10%'

なら、正常に結果を得られた。

ちなみに、dBASEテーブル。

文字コードって事も無さそうだしなんだろか?
と思いテーブルを再構築してみたら検索できるようになった。

散々、悩んだ。


| | コメント (0) | トラックバック (0)

2013-06-12

C++ Builder XE4 update1

昨日、時間を掛けて頑張って二台にC++ Builder XE4をインストールしたのに、アップデートがあった。

アップデートのインストールを始めたら、bds.exeが動いてると叱られて、2010を使いながらXE4のアップデートをインストールすることはできないらしい。

また、ただ待つしかないみたいだ。


| | コメント (0) | トラックバック (0)

2013-06-11

C++Builder XE4にバージョンアップしてみました

iOS開発ができるとか色々あったようですが、2010で頑張っていたんですが、今回バージョンアップしないと、次回はバージョンアップ価格で買えなくなりそうだったので、キャンペーン期間中になんとか会社の許可を取ってバージョンアップしました。

といっても、インストールしただけで、2010のプロジェクトが終わるまでは、暇な時間に少しずつしか弄れないから、本格的に使えるのは少し先になりそうだ。

急ぎの仕事が入っちゃってるから、どうしても慣れたツールになっちゃいます。 

| | コメント (0) | トラックバック (0)