C言語 一覧

Cygwinのライブラリに依存しないバイナリを生成する

WindowsでC言語のプログラムを作成する時によく用いられる環境の1つとして、Cygwinが挙げられます。CygwinはWindows上でUnixを擬似的に再現した環境のことで、完全な互換性は無いものの、多くの場合は問題なく利用することができます。

しかし、そんなCygwinでもデフォルトではいくつか問題があります。その1つとして、Cygwin上でコンパイルしたプログラムはCygwin1.dllというライブラリがないと動作しないという点です。これはつまり、Cygwinでコンパイルしたプログラムは、Cygwinが入っている環境でしか実行できないというわけです。これでは、Cygwinが入っていない環境で実行したい場合などは非常に困ってしまいます。

そのような対応するために、Cygwinのgccでは「-mno-cygwin」というオプションが提供されています。これを利用することで、Cygwin1.dllがない環境であってもバイナリを実行できるようになります。

このオプションを付加することによって起こりえる問題もあるのですが、それについてはここでは割愛します。下記のウェブページでは、より詳細に紹介されています。

[web] "-mno-cygwin"- Cygwin を使用した MinGW 実行形式のビルド - Studio Sixnine.
[web] Cygwin - Wikipedia

C言語で今更知った事実

  • 更新日:
  • C言語

C言語のプログラムを書き換えてきて、ちょっと調べ物をしていたら、今まで知らなかったことが出てきてびっくりしてました。C言語を習ってから6年くらい経ちますが、今更になってこんなことでびっくりするなんて…。

そのびっくりした内容とは、C言語で使われている「short」や「long」型修飾子は、実は「short int」「long int」の省略形だったってこと。確かに「int」=「integer」=「整数」ってことで、英語に直すとそっちの方が自然です。「short」とか「long」とか言われても、何が長いのか短いのか分からないしね。

また、「unsigned int」は「unsigned」に省略できたり、かなりの場面でint型修飾子は省略できるようです。豆知識というかあんまり自分では使わないですが、他人の書いたソースに出てきたりして困ったときには知っておくと良さそうです。

[web] 型修飾子 - WisdomSoft

移植イディオム:strchr

  • 更新日:
  • C言語, Java

ここ最近、C言語からJavaへの移植ばかりやってます。けっこう頻繁に出てくるわりに忘れたりするので、ここにメモしておきます。

今回紹介するのは、C言語の string.h にある strchr を Java に移植する場合です。関数 strchr は、第1引数の文字列の中に、第2引数の文字を検索して、そこへのポインタを返すというものです。詳しくは以下のページを参照してください。

[web] strchr - 初心者のためのポイント学習C言語

C言語版

char *string = "123-4567";
string = strchr( string, '-' );

これをJavaに変換すると、だいたいこんな感じになります。

String s = "123-4567";
s = s.substring(s.indexOf("-"));

strncpyのおかしな挙動

  • 更新日:
  • C言語

C言語のstring.hにはstrncpy関数が定義されていますが、この関数を用いるときは注意しなければならない点があります。それは、コピー先には終端記号「\0」が自動的につかないこと。第3引数で指定した範囲しかコピーしないので、自分自身で終端記号を付ける必要があります。

たとえば、こんなコードがあったとしましょう。

char* str = (char*)malloc(sizeof(char)*100);
strncpy(str,"abcde",3);

すると、変数strが指す記憶領域には次のように記録されます。

str → | a | b | c | x | …| \0 | …|

上で書かれているxはランダムな文字(値)です。そのため、運よくxに終端記号が入る場合もありますが、別の値が入る場合もあります。そうなった場合はその文字(値)自身も文字列の一部として認識されてしまいます。このような場合を防ぐには、自分自身で終端記号を代入するのが一番確実です。

*(str+3) = '\0';

上のコードではマジックナンバーで指定してありますが、実際は変数か定数で指定したほうがよいでしょう。

strtok

  • 更新日:
  • C言語

標準ライブラリ関数の中に、strtokという関数があります。これは、区切り文字を指定することで、文字列を分割して取得できるというもの。

宣言は次の通り。
#include <string.h>
char *strtok(char *s1, const char *s2);

第1引数には分割される文字列を指定します。そして、第2引数に区切り文字を指定します。これによって、返り値に分割された1つ目の文字列が返ってくるというわけです。2回目以降の呼び出しでは、第1引数にNULLを指定することで続きを取得することができます。これ以上取得できない状態になると、NULLを返すようになります。

詳細は、次のURLに載っています。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html

おかしな挙動?

  • 更新日:
  • C言語

今プロジェクトの課題でC言語でプログラムを組んでるんですが、ちょっとおかしな挙動を示していて困ってます。手元にデバッガがないのが痛いんですが、printfで出力してみると、

double value : 1.000000 int value : 0

実際こんなことってあるんでしょうか。普通にprintf("double value : %f\tint value %d\n",value,(int)value);ってやってるだけなんですが。このせいでプログラムの挙動がおかしいのは分かってるんですが、具体的な解決方法が思いつきません。さてどうしたらいいのやら。

続きを読む

このページの上部へ

About

tetsuの日記・雑記です。
日々経験したことを記録していきます。

広告

サイト内検索

最近のピクチャ

  • リアディレーラ

月別アーカイブ

最近のコメント