タグ

Cに関するundertheskyのブックマーク (17)

  • volatileで最適化を抑制する - 職業としてのプログラミング

    C言語やC++,Javaにはvolatileという修飾子があります。組み込み系ソフトウェアやマルチスレッドのアプリケーションを書いている方にとっては、なじみ深い存在ですが、そうでない方にはあまり縁がないのかもしれません。しかし、volatileの使い方や存在意義を知らないままコーディングを行うと、思わぬバグを引き起こす場合があります。今回は、そのvolatileキーワードについて簡単に説明したいと思います。 volatileは初期のCであるK&Rには含まれていませんでしたが、ANSI C(C89)以降のC標準規格にはconstと一緒に含まれるようになりました(constとvolatileをあわせてcv修飾子と呼ぶこともあります)。一般的なCなら必ず備えている修飾子です。 volatile修飾子の意味ですが、「プログラミング言語C ANSI規格準拠」によると、 volatileの目的は,黙っ

  • 本の虫: 多くのプログラマは言語を表面的な理解だけで使っている

    一般のプログラマの多くは、プログラミング言語というものを、ごく浅い表面的な理解だけで使っている。これは、いわゆる「入門書」によるところが大きい。入門書は、言語をできるだけパターンで教えようとする。かくかくしかじかの場合には、とらとらうまうまのように書いておけばいい、などといった具合だ。 たとえば、配列の全要素や、aggregateの全メンバーをゼロで初期化したいとする。多くのC++プログラマは、以下のように書く事であろう。 int a[100] = {0} ; このコードは、正しく動く。配列aの要素は、すべてゼロで初期化される。しかし、C++という言語を考えた場合、{0}と書く必要はない。空の{}で十分なのである。 int a[100] = {} ; では何故、多くのC++プログラマは{0}と書くのか。それは、多くの参考書が、そのように書いているからに過ぎない。大多数のC++プログラマは、

  • C言語におけるメモリプールの実現方法 - S.T.K Wiki

    メモリプール メモリプールとはあらかじめまとまったメモリ領域を一括で確保した後に確保したメモリ領域を使ってメモリにデータを割り当てる手法、 もしくは確保したメモリ領域をプログラムから効率的に使用/管理できるようなアルゴリズム/データ構造を指す。 CようにGC(ガベージコレクション)を持たない言語ではヒープ領域から確保したメモリの解放はプログラマの責任で行う必要がある。 しかし、実際にCやC++でプログラミングしたことがあるならわかるように確保したメモリを適切なタイミングで 解放するのはとても難しいとまでは言わないまでもあまり簡単なことではない。 単にfreeを呼び出すのを忘れたり、もしくはリストやツリーのような少しでも複雑なデータ構造を扱う際に割り当てられたメモリを適切に解放できずにリークしてしまうようなことは普通に起こりうる。 モダンなOSではプログラム終了後にそのプログラムに割り当てら

  • Cでrandom()の状態を保存する。initstate()とsetstate()の使い方。 - こせきの技術日記

    例えばsrandom(1)で初期化した後、random()を100万回呼んだときの状態を保存したい。pythonだと簡単にできるのだけど、Cだと難しい。 マニュアルにinitstate()とsetstate()という関数が載っているが、使い方がさっぱりわからなかった。検索すると「必要な回数ループしろ」なんていうダメ回答しか見つからない。仕方ないので頑張ってソースを読んだ。 アルゴリズムはわからないが、何をやってるかは理解できる。 initstate()で状態配列を初期化 setstate()で保存済の状態配列を設定 状態配列の先頭に、乱数生成器のタイプと状態配列の位置情報がまとめて保存されている。 この値は、ソース内で state[-1] と書かれている。stateは状態配列の2個目の要素を指すポインタ。 random()を呼ぶたびに状態配列のポインタが動くが、state[-1]が更新され

    Cでrandom()の状態を保存する。initstate()とsetstate()の使い方。 - こせきの技術日記
  • プログラミング言語 C の新機能

    プログラミング言語 C は ISO (International Organization for Standardization) でも規格化 (ISO/IEC 9899:1990) されている言語であり、日でも JIS (日工業規格: Japanese Industrial Standards) として制定されています。規格の内容自体は、JIS ハンドブック (1.3万円位) という一連のの、情報系の部分に他の言語 (Fortan, Basicなど) と共に掲載されていたので、比較的気軽に知ることができました。 さて、そんな C 言語ですが、実は少し仕様が追加されています。それは、日人が提案した仕様が大部分を占めているはずなのに、ほとんど知られていない追補1 (ISO/IEC 9899/AMD1:1995 Amendment 1) です。詳細はここでは述べませんが、日側からは

  • C言語〜ゲームプログラミングの館〜

    ※ 更新履歴 ※ 2017/11/03 ・sp.8章追加 2017/10/11 ・配布しているプロジェクトをVisualStudio2017に更新(それにまつわる説明も更新) 2015/09/12 ・s.3章 Androidのようなボタンの作り方(C++) 追加 2013/09/02 ・VisualC++2012のプロジェクトを追加 2013/02/23 ・d3.5章追加 2013/02/20 ・d3.1章追加 ・d3.2章追加 ・d3.3章追加 ・d3.4章追加 2013/01/19 ・sp3章追加 ・sp4章追加 ・sp5章追加 ・sp6章追加 ・sp7章追加 2012/06/23 ・3.14章追加 2012/06/16 ・sp1節追加 ・sp2節追加 2012/02/11 ・d6節追加 2011/11/10 ・h11章追加 2011/10/31 ・s1章追加 ・s2章追加 2011/

  • C-C によるWin32API - APIサンプル集

    C/C++によるWin32API /* 2007/3/25 プログラムは4年ぐらい引退していましたが、復帰することになりましたので、リハビリとしてこのサンプル集を見直して再度、公開しました。見直す際にはWindowsXP+(Borland C++ Compiler 5.5とVisualC++5.0)で確認しました。このサンプル群は6年前に私がC/C++の勉強のために作成したものですが、なんせ「C/C++を勉強しはじめた4ヶ月程度のコーディング」のままなので仕事などで利用する際にはエラー処理やメモリ解放などきっちりとしたほうがよいところが多々あると思います。ですが、情報としてはそれなりに有益かとおもいますので、改変しながらつかってやってください。皆様のお役に立てれば幸いです。 一括ダウンロード:papy's softwarelibraryからダウンロード  */

  • C 標準関数逆引き辞典

  • #と##演算子

    文字列化演算子 マクロ関数だけで使用できる、便利な演算子が用意されています そのひとつが文字列化演算子です マクロ関数で受け取った値に対して#記号をつけることで それを文字列、すなわちダブルクォーテーションをつけた状態に置換えます (プリプロセッサディレクティブであることを忘れないでください。あくまでソース上で置き換わるだけです) #define STRING(str) #str このマクロ関数は、仮引数の値をダブルクォーテーションをつけた状態に置き換えます 次のプログラムを実行してください #include <stdio.h> #define PRINT(str) printf(#str "\n") #define STRING(str) #str int main() { PRINT(Kitty on your lap); printf("%sバイトは1キロバイト" , STRING(

  • 2006-08-16

    諸般の事情で社員寮に引っ越すことになりました。 この前更新費を払ったばっかりなのに・・・痛いな。 なによりも、当分の間週末は引越し準備になってしまいそうなのが、いやん。 id:toge:20060727#1154020692 7/27に嵌ってたことの原因が判明。まあ、あれだ、変なことするなら"-Wall"はつけろってことだ。 warning: dereferencing type-punned pointer will break strict-aliasing rules というwarningが出てたのね。さて"strict-aliasing"は"-O2"で有効になる"-fstrict-aliasing"のこと。 ということで、このwarningが出ているオブジェクトだけ"-fno-strict-aliasing"を指定すると・・・、gcc 4.x系でも問題なくなりました。 以下の参考資

    2006-08-16
  • ISO Cの型違いポインタアクセス禁止規則 - sumiiのブログ

    http://www.atdot.net/~ko1/diary/200711.html#d15 手近に64ビット環境がない&ちゃんと見ていないので外しているかもしれませんが、 http://gcc.gnu.org/bugs.html#nonbugs_c ("Casting does not work as expected when optimization is turned on.") http://mail-index.netbsd.org/tech-kern/2003/08/11/0001.html あたりにある"dereferencing type-punned pointer will break strict-aliasing rules"問題だったりしないでしょうか。 ISO C規格の和訳(JIS規格)より引用: オブジェクトに格納された値に対するアクセスは,次のうちのいず

    ISO Cの型違いポインタアクセス禁止規則 - sumiiのブログ
  • 分割の定石

    第1項:変数の共有 第2項:extern宣言 第3項:ヘッダーファイルの重複防ぎ [1]変数の共有 前節では、最低限の構成でプログラムを複数ファイルに分割しました。 しかし、共有できたのは関数だけであり、変数の共有は行いませんでした。 複数のソースファイルに分けて開発を行う場合は、 関数だけでなく、変数や定数なども共有する必要が生じてきますが、 前章の方法では、変数を共有することは出来ません。 例えば、次のようにヘッダーファイル内で変数を宣言すると、 宣言が重複している、という意味のエラーが表示され、コンパイル出来ません。 /* sum.h */ int sum(int min,int max); int Public; このエラーをより正確に理解するには、宣言の意味を理解する必要があります。 これまで、関数にしろ変数にしろ、宣言する、と表現してきましたが、 実は、宣言に

  • 猫でもわかるプログラミング

    超初心者対象の、C/C++/C#プログラム教室です。 「Windows95/98/2000/XP使うだけには飽きた」「以前Cをやったことがあるが、ポインターでつまずいた」 「プログラムは、全く経験がない」「DOSのプログラムは、作れるがWindowsのプログラムは ちょっと・・・」という方のためのホーム・ページです。中級者以上の方、セミプロの方、 プロの方ご遠慮ください。Macユーザーの方も私の力不足のためお役に立てません。 Webmaster Yasutaka Kumei [How To Walk][画像が表示されない時は] [VC++6.0でうまくビルドできない時は] [リソースがうまく表示されない時は(VC++6.0)] [リソースがうまく表示されない時は(VC++.net)] [メッセージ・ループ] [WinXP+VC++.netでコンパイルできない時は] [.netでパラメータ・

  • 構造体

    値型のクラス C# 言語(より正確には .NET の共通言語仕様)は、「構造体」という概念を持ちます C/C++ 言語を習得している方は、すでに構造体は馴染み深いものでしょう C++ 言語の構造体はデフォルトのアクセスレベルが異なるという点以外で「クラス」と同義でした しかし、C# 言語において構造体はクラスと大きく異なる部分があります .NET アプリケーションのクラスのインスタンスは必ずヒープに割り当てられました 構造体は、これに対してスタックに配置される、すなわち値型という形をとります 構造体を用いれば、クラスとは異なりオブジェクトを配置するオーバーヘッドはなくなります 値型であるということ以外は、基的にクラスと同じ扱いをすることが可能です 構造体の宣言には struct キーワードと次の構文を用います [attributes] [modifiers] struct identif

  • Cプログラミング診断室

    はじめに 開院準備 昔むかし/ レベル差/ 教育/ ネットワーク/ 情報集め/ 隠すことについて/ プログラムコンテスト/ ドキュメント/ 楽するように/ 手抜きと下手の違い/ 開院 第1部 外来 第1章 普通の初心者 最初から充実した(!?)プログラムが登場 関数を短くし、コメントを改善する 上手になる秘訣/ プログラムの紹介/ 何だ、このプログラムは!!/ 短くするには/ コメントについて/ 無駄な努力をやめよう/ 名前/ 気になる個所/ 修正プログラム/ 課題/ まとめ 第2章 これでもプロ 売りものであるにもかかわらず、超きたない! 構造的な欠陥の指摘〜引数、ポインタの活用 プログラムの紹介/ 「超」基的問題点/ 関数分解/ 構造的欠陥/ 引数を使おう/ ポインタ/ その他/ まとめ(修正プログラム) 第3章 上司が問題 まさに驚異的なプログラムの見というべき 内容の修正から、

  • C/C++プログラミング初心者講座

    この講座はC言語及びC++言語を使ったプログラミング初心者講座です。プログラミングとはどういうことをするのか、ということを中心にやっていきます。他の言語でプログラムを組んだことのある人や、c言語をかじったことのある人には退屈かもしれません。 この講座は、習うより慣れろ、細かいことは気にするなという方針でやって行こうと思っています。残念ながら、真っ黒で地味な画面を使ったプログラムしか作りませんが、後でいろんな事に応用可能な基を押さえる予定ですので、気楽に行きましょう。 このページはもともと物研の新歓用に書かれましたが、内容は一般的に書かれています。それからここでは"Visual C++"を使うことを仮定していますが、わかる人は他のソフトを使われてもかまいません。 このページはリンクフリーです。製作に携わった人のリストは節[製作にかかわった人々]をご覧ください。現在更新作業中であり、内容、場

  • 初心者のためのポイント学習C言語

    since:2002.06.02 更新に手が回らずすみません。 ANSI規格でもいいよという方は 御覧ください。m(_ _)m

  • 1