タグ

C言語に関するcielo_eeのブックマーク (34)

  • [迷信] とりあえず memset で初期化 | 株式会社きじねこ

    よく見かけるコードですが、上のコードは、必ずしも期待した結果になるとは限りません。なぜなら、double 型やポインタ型は、これらを構成する全ビットが 0 になったとしても、オブジェクトの値が 0 になるかどうかは分からないからです。 確かに、ほとんどの処理系では上記のコードでも問題なく、そして期待通りに動作します。しかし、それはあくまでも"たまたま"動いているに過ぎません。そうした不安定な要素をなくすために行った初期化が、かえってコードを怪しくしてしまっているのです。 単に、集成体の全要素をゼロクリアしたいだけであれば、 とすれば十分です。こう書くと、おそらく次のような反論が返ってくることでしょう。「その方法では、構造体の詰め物がゼロクリアされない」と。しかし、構造体の詰め物にアクセスして、言語仕様上保証される結果を期待することには無理があります。 構造体の詰め物をゼロクリアしたい理由は

  • 久しぶりにLinux上でC言語を使ったら・・・【C言語】 - Programming Magic

    先日、久しぶりにLinux上でC言語を使ってプログラムを作ることになった。普段は、Windows上でVisual Studioを使って作るし、C言語よりもC++を使うことが多いので、くだらないところで30分ほど悩んでしまった。 問題となったのは、gccでコンパイルすると以下のような警告が出て、実行するとセグメントエラーが表示されてしまうというものだった。 warning: cast to pointer from integer of different size 警告が出ている箇所を見てみると、mallocでメモリを確保している部分だった。 buffer *b = (buffer*)malloc(sizeof(buffer)); ちなみに、bufferは構造体をtypedefしたもの。 typedef struct _buffer buffer; ここで「integerからpointer

  • wiringPiを使ってC言語でGPIOからLEDを点滅させる - 電子工作メモランダム

    LCDになんか表示させるために、まずはC言語でGPIOの制御をできるようにすることを目的として、LEDの点灯実験を行います。 wiringPiのインストール 参考URL先のをそのままコピペしてます。変える必要もないですしね。 cd /tmp wget http://project-downloads.drogon.net/files/wiringPi.tgz tar xfz wiringPi.tgz cd wiringPi/wiringPi make sudo make install cd ../gpio make sudo make install 参考URL Raspberry pi をArduinoみたいに使う - how to code something wiringPiのテスト wiringPiがちゃんとインストールされているかどうか確認するために、まずはshellからLED

    wiringPiを使ってC言語でGPIOからLEDを点滅させる - 電子工作メモランダム
  • C言語で理解する英語の冠詞(aとtheの使い分け)

    英語の冠詞は、実はプログラマーにはとてもわかりやすいんです。 変数宣言はa, 参照はthe int i; i = 100; 1行目のint iは宣言なので「a」です。"Declare an integer variable." 次の i = 100 はその変数を参照しているので「the」です。 "Assign 100 to the integer variable." 仮引数と戻り値はa int func(int v) { return v * 2; } 関数の仮引数と戻り値は「a」です。"This function takes an integer argument and returns an integer value." もちろん、その引数を関数内で使う場合は「the」になります。"Double the first argument and return the result."

  • C による Perl 拡張入門(

    現状、稿ははげしくかきかけです。フィードバックをおまちしております。 はじめに† Perl で C の拡張がスラスラと書けたら……。C の拡張がスラスラ書けたら、ネイティブのバインディングもスラスラ書けるし、ホットスポットを C で最適化するなんてこともお手の物。書けたらいいけど、XS ってなんかむずかしそう……。 ちがうんです! 今までの XS の教え方がまちがっていたんです!この教材をつかえば、誰でも簡単に今すぐに XS を書けるようになるんです。Perl の C 拡張を書いて同僚や上司を アッー! と言わせちゃおう! この教材では XS のややこしい機能をつかわずに、Perl の C 拡張を書く方法を伝授!初心者でもすぐに C 拡張が書けるようになるぞ! 前提知識† 稿では一般的な C の知識および Perl の知識を読者がもっていることを想定しています。XS の知識や Perl

    C による Perl 拡張入門(
  • http://blog.monoweb.info/blog/2012/07/14/c99-array/

  • C言語の定石

    C言語の定石 ヘボ将棋って言葉がある。筆者も将棋をするが、まさにヘボ将棋だ。ヘボ将棋というのは、最低限のルールだけで楽しむ将棋と思う。「歩は1つ前にしか進めない」とか「飛車は前後左右は自由に動かす事が出来る」などの知識だけで楽しむ将棋だ。もちろん、目的が友人との親睦を深める事なら大いに結構だと思う。 将棋と同様に、筆者はヘボプログラムというのがあると思う。コンパイラはエラー無しに通るが、それ以外、全部自己流というか目茶苦茶なプログラムの事である。そして、ここからが重要なのだが、この様なヘボプログラムは、同僚との親睦を深めるどころか同僚を精神的肉体的に過労に追い込み病にしたり、挙げ句の果ては自殺に追い込む事もありうる。ヘボプログラムを書く下手糞は、ともすれば、業務上過失傷害や業務上過失致死に問われるに値する迷惑をかけているのだ。 さて、ヘボ将棋から脱却する一つの方法は、定石を覚える事

  • const char* const p = "ABC"; と const char q[] = "ABC"; はどちらがよいか、みたいな与太 - memologue

    諸事情あって、ふと前に読んだドキュメントに書いてあった細かいことが気になった。いやいつも細かいけど。 const char* const p = "ABC";より const char q[] = "ABC";のほうがいいのか?的な話。後者の方が良いらしいので、確認するととともに、すぐになんでも書くのはどうなんだと思いつつも無駄に細かく解説。いろいろ間違ってたらゴメンナサイ。C言語入門? 先に結論 共有ライブラリやPIEな実行ファイルを作る場合は、後者の書き方(const char q[] = "xxx")のほうが良さそうですね。PIEじゃない単なる実行ファイルを作るときは、最適化かけるならあんまりかわらないかも。 比較1) コンパイル時の最適化の効きやすさ 最適化といってもいろいろありますが、↓に限って言えば、const char q[] のほうが効きやすいようですね。 gcc vers

    const char* const p = "ABC"; と const char q[] = "ABC"; はどちらがよいか、みたいな与太 - memologue
  • ホワット・ア・ワンダフル・ワールド C の構文の変態さ

    そもそも C に文字列型なんてありません.文字列みたいなアレは,文字の配列型です. ポインタと配列型は,全く違うものです.そもそも typeof (GCC 拡張) で取れる型が違う,sizeof で取れるオブジェクトサイズも違う. まぁ,文字列リテラルが存在していて,唯一複合型なのに静的 (static) 領域に初期化して置いとくことができたりして,いろいろややこしいのですが. あと,配列の要素アクセスは,常にポインタ演算経由で行われるのも,ややこしいところですね.配列とポインタを同一視してしまうというもっともありがちな混乱は,ここに由来するのだと思います.アセンブリ言語のレベルでは,配列なんていう高級な概念は存在しなくて,メモリと番地しかありません.ポインタは番地を入れる変数 (メモリやレジスタ) そんなこんなで,もともとアセンブリに由来する C は同じことを表現する方法が非常にたくさん

  • コンパイル時に文字列リテラルに指定のアルゴリズムによる計算を施し、整数に変換するには? - memologue

    頭の体操です。 int main(void) { return CompileTimeHash("abcdefghijklmnopqrstu"); }が、 mov $12345, %eax のような形にコンパイルされればOKとします(最適化をかけて即値になればOK)。テンプレートの再帰を使うことになると思いますが、再帰がunrollされただけの形は当然NG、マクロの使用もNGとします。 .....答えは! #include <cstddef> template <std::size_t N> inline int accum(const char (&str)[N]) { return str[N - 1] + accum(reinterpret_cast<const char (&)[N-1]>(str)); } template<> inline int accum<1>(const

    コンパイル時に文字列リテラルに指定のアルゴリズムによる計算を施し、整数に変換するには? - memologue
  • 配列を自由自在に作る

    <戻る  目次  進む> 第1項:配列の欠点 第2項:メモリの確保 第3項:動的配列の要素数を拡大する [1]配列の欠点 第13章では配列の使い方を説明しました。 この配列は、多量のデータの取り扱いに非常に有効な手段なのですが、 実はいくつかの欠点があり、いささか実用性が低いのです。 配列の最大の欠点は、要素数をプログラム中で変更出来ないことです。 配列を宣言する時に、要素数を定数で直接指定するしかありません。 実行中にユーザーに入力してもらい、その値を利用するようなことは出来ません。 [  変更できる環境  ] GCCというコンパイラでは独自の拡張により、 要素数をプログラム中で変更できるようになっています。 また、C99でも同様の機能が追加されています。 (C++ではできません) このことは、様々な目的で動作するプログラムを作るのに不便です。 例えば、会社の社員

  • ANSI-Cはなぜ可変長配列を許可しなかったのか? - 1989年に発行されたANSI-Cでは,自動配列宣言時の要素数は定数式でなく... - Yahoo!知恵袋

    ANSI-Cはなぜ可変長配列を許可しなかったのか? 1989年に発行されたANSI-Cでは,自動配列宣言時の要素数は定数式でなくてはなりません(固定長配列). しかしその後,1999年に発行されたC99では可変長配列が使えるようになっています. なぜ,1989年のANSI-Cでは可変長配列は許可されなかったのでしょうか? つたない質問文から意をくみ取っていただいてのご解答どうもありがとうございます. 可変配列をスタック中に置くこと自体はコンパイラが少し複雑になる以外に技術的な困難はないと思います(現にgcc-1.21(1988年)でもサポートされているようです)ただ,多次元の可変長配列はコンパイラがすごく複雑になる気がするし,1次元はOKだが多次元はダメというのは仕様として美しくないななんて個人的には思っています.

    ANSI-Cはなぜ可変長配列を許可しなかったのか? - 1989年に発行されたANSI-Cでは,自動配列宣言時の要素数は定数式でなく... - Yahoo!知恵袋
  • -std=c99と-std=gnu99は同じ? - bugfix

    四捨五入を計算するround()関数を使う機会があって, 次のようなコードをコンパイルしたところ, #include <stdio.h> #include <math.h> int main() { int i; double r = 0; for (i=0; i<11; i++, r+=0.1) { printf("\t%.1f\t%f\t%f\n", r, rint(r), round(r)); } return 0; } $ gcc -Wall -lm round.c round.c: In function 'main': round.c:30: warning: implicit declaration of function 'round' round.c:30: warning: incompatible implicit declaration of built-in fu

    -std=c99と-std=gnu99は同じ? - bugfix
  • constexpr を使うべき5の理由 - その1 - ボレロ村上 - ENiyGmaA Code

    constexpr を使うべき5の理由 「なぜあなたは constexpr を使うべきか?」 「そもそも constexpr とは何か」という基的な部分から始めて、 どうして C++er が constexpr を使わなければならないか、日にちを分けて5つのケースを書いてみます。 constexpr を既にバリバリ使っているというあなたにはまったく物足りないかもしれませんが、 改めてのおさらいということで読んでいただくのも一興かと存じます。 1.定数を明示的にコンパイル時定数にする 以下のコードは、定数 x のメンバを配列のサイズに指定している。 struct X { int n; }; int main() { const X x = {10}; int a[x.n] = {1}; } GCC 4.8 でこのコードは、以下のような警告とエラーになる。 warning: ISO C++

    constexpr を使うべき5の理由 - その1 - ボレロ村上 - ENiyGmaA Code
  • C99で追加されたC言語における可変長配列について 【▲→川俣晶の縁側→ソフトウェア→技術雑記】

    いや~、焦りました。 JIS X 3010を参照しながら仕事をしていたら、存在しないと思っていた可変長配列などという言葉が出てきて……。 というわけで、メモ。 Cの可変長配列について § Cで配列を宣言する際、配列のサイズは定数で指定する必要がありました。(か、あるいは無指定) しかし、C99では、ここに式の値を指定することが許されるようになりました。つまり、実行時に動的にサイズを決定する配列を作ることができるのです。 ちなみに、Visual Studio.NET 2003のCコンパイラや、Borland C++ 5.5.1のCコンパイラはこの機能をサポートしていませんでした。 しかし、間違えてはいけない…… § Visual Basicプログラマの場合、可変長配列と聞けばReDimステートメントを連想するかも知れません。しかし、ここでいう可変長配列とは、ReDim=作成済みの配列のサイズ

  • C言語なら俺に聞け(入門篇) Part 46 / プログラム(PC等)-2ちゃんねる過去ログ倉庫

    C言語の*入門者*向け解説スレッドです。 初心者、初級者の方は他の質問スレのほうが良いかもしれません。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。  C/C++の宿題片付けます 122代目  http://pc11.2ch.net/test/read.cgi/tech/1232029287 もしくは  C/C++の宿題片付けます 123代目 (現時点でまだ立っていません) ・C++言語はスレ違いですが、ある程度なら対応です。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。   # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること   # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレ

  • externとか配列とか(C入門中) - 虎塚

    (追記: Enterキー押したら投稿されてもうた。ちょっと修正。はてなェ・・・) 何やってるの? 観念して望洋の入門編を入手したので、読んだり書いたりしています。あぁ、ごく基的な文法事項の説明がちゃんと載っている・・・ 恥ずかしがらずに最初から入門編を読めばよかった・・・。 他の言語でプログラミングをしたことがあるなら、このは4章まで斜め読みして、5章(配列)、6章(関数)あたりから読めばよいと思います。 覚えたこと 文字列リテラルの連結 "hoge""moga"とする。Javaのように"hoge" + "moga"ではない。 配列宣言 配列宣言の要素数は、定数でなければならない。関数ローカルな変数は使えない。オブジェクト形式マクロは使える。 配列の初期化 配列の初期化子が足りない場合は0で初期化される。 「足りない場合」というのは、初期化子を1つ以上与えた場合に限られる。 初期化子

    externとか配列とか(C入門中) - 虎塚
  • ポインタ虎の巻~extern宣言の罠

    ポインタ虎の巻 extern宣言の罠--配列とポインタの違い このような配列とポインタの違いを十分頭の中に入れた上で、次のコードを見てみよう。 extern char *str; char *p; p = str; 何の変哲もないコードであるが、strというポインタは外部定義がされていることになっている。だから、このコードのファイルとは別なファイルで、str の定義がなされているのであり、リンク時に2つのファイルが結合されて1つの実行ファイルが作られる、という状況設定である。 このとき、別なファイルのstrの定義が char *str = "test";

  • 変数にexternをつけるってどういうこと? - bugfix

    次のようなコードを書いてコンパイルしたときのお話. /* src1.c */ #include <stdio.h> int a; int sub(int n) { printf(" sub::a: %d\n", a); printf(" sub::a: %p\n", &a); return n+1; } /* src2.c */ #include <stdio.h> int a; int main() { int x; x = sub(a); fprintf(stdout, "x: %d\n", x); printf("a: %p\n", &a); return 0; } まず,間違っていることに気づかず行っていたこと グローバル変数は0で初期化されます.つまり,定義が同時に行われます. extern記述子を使うことで,どこかで定義してあることを伝えられます. つまり,externは同じグ

    変数にexternをつけるってどういうこと? - bugfix
  • いまさらC言語のexternで悩む – ビットログ

    とある製品のソースコードを眺めていたときに疑問に思って調べたことをメモします。 C言語で通常、大域変数(グローバル変数)を複数のソースファイルで共有する場合、共通でincludeするヘッダファイルにextern int abc;みたいに書いて、ソースファイルのいずれか1つに実体をint abc;みたいに書くと(私は)思っていたのですが、その製品のソースではヘッダファイルの方にint abc;とあり、各ソースファイルにextern int abc;という風に書かれています。 一瞬、それぞれのモジュール(ソースファイル)に別々の実体が存在するのかな、と思ったのですが、実際のその製品の動きを見てみるとちゃんと変数を共有して使っているようです。 私のいままでの理解が間違っているかもしれないので調べようと思ったのですが、C言語の規約を調べるのも億劫だし、環境依存かもしれないので、とりあえずサンプルを