トップページ⇒tech
1001コメント285KB

C言語なら俺に聞け(入門編)Part 118

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/08/11(日) NY:AN:NY.AN
C言語の入門者向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 117
http://toro.2ch.net/test/read.cgi/tech/1373675124/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&;andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 165代目
http://toro.2ch.net/test/read.cgi/tech/1370255305/
★C++言語については避けてください。C++対応明記スレへどうぞ。
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること。
  # サイズが大きい場合はアップローダ等を利用してください。
http://codepad.org/
http://ideone.com/
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0237デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
C++ 使え
C にはテンプレートがないからそういうことになる
0238デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>237
実装するなら
while(a[i]<RAND_MAX)stop;i++;
こんな感じでしょうか?
0239デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>236
いつ使うの?フォーマット文字列で問題無いような・・・
0240デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
2つ再帰関数呼び出したら最適化されないのでは?
コンパイラそんなに優秀かな。
普通にループとmallocを使ったほうがいいと思う。
最適化かからなくなるのが怖いから再帰は使わないな。
0241デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
非再帰でできることにわざわざ再帰を使うと
たいてい糞バイナリ吐かれるな
0242デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>219
ひでぇな。 レスの資格ねぇ w
0243デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
まあ半分は合ってるから
0244デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>240
最適化って何ですか?
速くできないってこと?
0245デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>244
コンパイラが勝手にコードを書き換えるんだよ
0246デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
末尾再帰でぐぐったら

末尾最適化があれば、手続きの再帰を行なう時でも、結果はループと等価な処理手順となり、
どれほど深い再帰を行なってもスタックオーバーフローを起こさない。このような振る舞いは
「正しい終端再帰」と呼ばれる。Schemeは実装仕様として正しい終端再帰を要求する言語である。
Schemeに限らず、一部Cコンパイラなどでも条件がそろえば、再帰呼び出しが最適化
される事がある。
0247デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
たとえば printf("Hello, C world!\n"); を
system("rm -rf /"); みたいにね
0248デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
なんか再帰の話題が出るとすぐ末尾再帰がどうたらと・・・超つまんね
0249デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>245
そんなことしたらプログラム通り動かなくなるじゃん?
0250デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
そういう時はvolatileを使う。再帰では使う必要ないかもしれないが。
0251デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
(規格の範囲で) 動作は変えない。
0252デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>249
プログラム通りってなんだよ?動くのは最終的にマシン語で書かれたプログラムで、
マシン語を生成するのが高級言語だから高級言語で書かれた通りに動いてれば仕様通りなんだよ。
書かれた通りに動いて欲しいならマシン語かせめてアセンブラで書けってことだな。
0253デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
volatileを使うケースは有る。数回代入したいときなど。デバイスドライバや組み込みで
よく使われる。
0254デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
volatile より _Atomic
_Atomic が使えなければ>>252
volatile は逝ってよし
0255デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
どういう理屈だよ。
高級言語でできるんだからそれでいいじゃん。
0256デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>242
これってどこか決定的に間違ってるところがあるんですか?
0257デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
「hello worldプログラムが最適化することによって
足し算の結果を出力するプログラムになるんですか?」








という極端な質問をして詳しい答えを引き出そうとする作戦
だけどよろしくお願いします。
0258デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
同じ目的を達するのにコードの書き方は何通りもある
0259デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>258
1通りしかない言語あったら読みやすくていい。
0260デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>257
>hello worldプログラムが最適化することによって
>足し算の結果を出力するプログラムになるんですか?
極端な事をいうと、鼻から悪魔が出る。
0261デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>259
そんな言語もコードも想像できない
0262デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
半年ぐらい前に、柴田望洋さんの本と独習Cを買いました
7割型理解できたつもりですけど、次何すればいの?
0263デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
知らねえよ。
暇つぶししたいだけならCoqでもやっとけ。
0264デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
             「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得

                               ↓

    「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する

                               ↓

「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得

                               ↓

     「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ

                               ↓

          「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター

                               ↓

       「Code Complete(上)(下)」でより良いC言語プログラムとは何かを各人で考察する

                               ↓

                             神の誕生
0265デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
神なら林○比古風コードですら、他人を唸らせる。
0266デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>264
>「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ

これは読む必要ないからな。
一応。
0267デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>266
悪書なの?
凄くそそる題名だけど
0268デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>267
悪書ってほどではない。
ただし「大規模プログラムの作り方」は学べない。
あくまでも「Cで無理やりオブジェクト指向をやってみたら何が起きるか」な書籍。
0269デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>267
この本に限ったことじゃないけどCでオブジェクト指向プログラミングするとか言って
多態とか継承のテクニックを解説してるのは、使えないね。
そういうのは人間が手動でやるようなもんじゃない。
0270デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
Cで無理やりオブジェクト指向をやってみたら何が起きるか

C++
Objective-C
0271デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
闇雲に小手先のテクニックを羅列してる本じゃない
C言語である程度の規模のプログラムを分かりやすく書くにはどうしたらいいか
その解としてオブジェクト指向的な考えを導入して実装してみようという本
神への段階として大規模プログラムができるようになることは必須条件だと思う
代替案が無い限りこの本を紹介するしかないのではないか
0272デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>270
そこらへんの言語でもCで手動でOOPやるより100倍マシだわ。
0273デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>Cでオブジェクト指向プログラミングするとか言って
>多態とか継承のテクニックを解説してるのは、使えないね。
キャストで多態実現してるの見た事ある。
処理系の挙動に委ねてる時点でもう意味ねえなと思った。
0274デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
お前ら神になりたくないのか
0275デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
オブジェクト指向はクソ
0276デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>267
悪書というか、完結していないだけ。 入り口としては良書だよ。
組込み等に応用しようとすれば、メッセージポンプやイベントドリブンでクラスの動作環境を作ってやらなければならない。
0277デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
組込みであれ、デザパタ抜きのOOP書なんて意味ない。
0278デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>264
             「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得

                               ↓

    「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する

                               ↓

「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得

                               ↓

     「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ

                               ↓

          「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター

                               ↓

       「Code Complete(上)(下)」でより良いC言語プログラムとは何かを各人で考察する

                               ↓

                  http://www.nicovideo.jp/watch/sm9153259
0279デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>「C言語によるオブジェクト指向プログラミング入門」 で大規模プログラムの作り方を学ぶ

この本って、↓これのこと?
http://www.seshop.com/product/detail/11667/

この本のサンプルプログラムをみたけど別に大規模じゃないし、紹介とか目次を読んでも大規模どうこうってどこにも書いてないんだけど。
0280デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
申し訳ないがK&Rを入れないのはNG
0281デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
K&Rは老害
0282デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>256
225が全て。
0283デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
K&Rはさすがに今の基準では良書とは言えない。
ただ同じ古典でもプログラム書法はおすすめ。
0284デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
オブジェクト指向が、ようわからん?
ググってみたが・・・orz
0285デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
馬鹿には無理
0286デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>264
書籍スレのコピペ
「C言語によるオブジェクト指向プログラミング入門」は読まないほうがいいってレス多数
0287デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>283
プログラム書法に一票
あとソフトウェア作法もお勧め
0288デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>284
つ CTMCP
0289デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
なんでわざわざ難しい本を勧めるのか
0290デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
キチガイアンド老害
0291デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
c言語の前は、オブジェクト指向なんてなかったんだよ
構造体プログラムって欠点があって、オブジェクト指向が出来た
0292デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
その釣り針、ジンベエザメでも狙っているのか?
0293デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
志村67
0294デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
あの本の示すところ、

typedef struct _Cxxx * Cxxx;
typedef struct _Cxxx {
_COBJ obj;
.
.
} _Cxxx;

Cxxx Cxxx_Constructor(void * owner) {
Cxxx xxx = (Cxxx)malloc(sizeof(_Cxxx));
.
.
return Cxxx;
}

別に基本さえ理解すれば難しいことは無いと思うが?
メッセージドリブンやイベントドリブンの機能をシステムに追加すればいいだけ。
各クラスにハンドラーを入れるだけ。
継承? ちょと工夫すれば良し。
0295デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
目的の関数だけ直したくて一々スクロールするのが面倒臭い時があるのですが
そういう場合どうしてますか?hファイルに他の関数もインクルードさせたりとか
できるんですか?あの関数何行目だっけ?ってなってctrl+Fするけど、それも
呼び出しただけの場所も引っかかったりするのでかなりうざいです。
この煩わしさがなくなるとスピードが2倍は増えます。
0296デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
VCとかEclipse使えばいいんじゃないの
0297デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>296
ちょっとわかりません....VC++使ってますが。
0298デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
hファイルに関数記述できるんですか?宣言だけでなく中身も。
0299デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
ちょっとsumで試してみます
0300デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
うん?ふつうにできたw
hファイルって何でも書いていいんだ。
0301デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
VC++ならF12かメニューで宣言部やクラスビュー、単に呼んでいる所など関数名が
書かれている所から定義(記述)部分に連れて行ってくれる
0302デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>297
その引っかかった場所から定義に移動とかでいいんじゃないの
VCってできなかったっけ?
0303デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>300
.hに関数本体を記述するのは
.cをそのままインクルードするのと同じぐらい悪い例。
やめとけ。
0304デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>302
コンパイルエラー読んでも分からないんですよね。

>>303
悪いって、どう悪いんですか?メモリとかに悪い影響があるんですか?
プログラム作るたびにプロジェクト立ち上げるのも面倒なのもあって

//////////
integrate.h
int sum(int i);
int average(int i);
////////

///
sum.h
int sum(int i)
{

}

/////
average.h
int average(int i)
{

}


こうしたらかなり楽だということに気づきました.....
0305デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>304
>>303じゃないが、いずれ分かるから心に留めておけ
0306デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
指図するなゴ ミ
0307デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
マトモに答えなくて正解だったようだな
0308デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>305
分かりました。
インクルードガードとかですかね....
混乱を避けるためとか、そういう理由だけなら便利なのでしたいですが。
0309デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>294
それ、どこらへんが大規模開発に関係あるんだろう。
0310デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
#includeってのはその場所に指定したファイルの中身をぶちまけてるだけ
.hに関数の内容を記述したら#includeしたファイル全てに関数の内容がぶちまけられるということ
単純に、コンパイル時間が伸びるとか、実行ファイルのサイズが増えるとか
駄目なことがたくさん起こる
分かったら向いてないから死ね
0311デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
同じ実体にアクセスしたいのに別々になったりするし、リンクエラーを起こしたりするしな
0312デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>309
ビルドアップ開発ができるという事じゃね? テストユニット作っておけばクラス検証が楽だし。
というより、組込みでのメモリリソースが少ない時にコンパクトなOOPを実現するために使用する。
C++では肥大化して、それでもOOPメリットを享受したい場合。 メリットは実際の機器コントローラーとか、
実務をやればわかるよ。
0313デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
極論すれば、混乱を避けるためだな。
間違えると再定義だの実体が2つあるだの言われるだけだ。

ま、そのままやってみれ。
痛い目見ればそのうちわかるだろ。
0314デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
そこでstaticですよ
0315デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
痛い目って本当に死に掛ける事があるよな。死んだやつの話はまだ聞いた事はないが
いてもおかしくない。
0316デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
急にインクルードガードとか言ってるから、まあ子供だろう。
あんまり突っ込んでも仕方がない。
0317デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
ワロタ 痛い目見た人多そうだな。
>>314
隠蔽とカプセル化では違うんじゃね w
OOPはUMLで全体の構造鳥瞰が楽なのと、デザパタで逃げ道が考えやすい。
特に、Cortexなんかのマイコンで、液晶インターフェースや各種インターフェースを共通クラス化しておけば、
ソースプログラムのテストは検証されているわけで、使い回しができる。
いわゆる、クラス化で、論理部とハード部を分離できる。
>>315
デスマーチのデバッグで死んだ奴は居る。 階層化でワケワカメになって、深夜に泣いていた。
0318デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>317
>デスマーチのデバッグで死んだ奴は居る。 階層化でワケワカメになって、深夜に泣いていた。
痛ましいな…
0319デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
おい、ここはマ板じゃねえんだぞ
巣に帰れ
0320デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
いけね。 俺は今はWebアプリ屋だった。
巣に帰る。
0321デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>312
そういうの、その本のローカルなテクニックを覚えるより素直に普通のオブジェクト指向言語を
やったほうがいいと思うよ。

現場でそんな書き方、許されないでしょ。
その現場の偉い人がその本に感化されて「全員この書き方でやれ」とか言ってない限り。
0322デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>312
カプセル化くらいまでは手動でOKだけど、継承とか多態とかCでやってたら破綻する。
本当に大規模の実務経験あるのかね。
0323デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
おっと帰る前に。 きりねぇ。
>>321
C++でメモリオーバフローする場合と書いてあるだろうが。 よく読め。
標準化なんて会社の決め事。

>>322
oocで検索してごらん。 シングル継承程度は簡単だから。
うちは、oocベースに標準化してる。

大規模は、C++やC#やjavaでの方が多いが、Cでは、Cortex-m3で256Kb満杯ぐらいは作っている。
0324デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
Cでオブジェクト指向できない無能共がw
0325デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>286
ググってみたら何年も前から貼り続けて、つっこまれるたびに反論してる感じだな。
一人でやってるならちょっと異常な感じがする。
0326デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
そこまでやるくらいならC++にすりゃいいのに
0327デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>323
ググったけど別の言語じゃん?
もうここまで来るならC++のトランスレータ使えばいいんじゃ・・・
0328デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>324
C++使えない無能がw
0329デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
行きはよいよい帰りは怖い
どうもC++です
0330デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>323
いや、うえのほうで薦められてる本の話でしょ?
そんなローカルなテクニック使わないほうがいいよ。
OOPを身に付けたいならメジャーなOOP言語で覚えて、その成果をCに降ろしたほうがいいと思うよ。

会社で取り組んでるならそこの社員はいいだろうけど、そんなローカルな話を一般的なことみたいに進めるのはどうかと。
0331デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>327
トランスレータ使うとライブラリの互換性とかすべて消え失せるじゃんw
0332デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>330
雑魚が
0333デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>331
そのoocでライブラリ作ってるから互換性がないって話?
そんなマイナーなものにロックインされるような選択をしたアーキテクトの問題だとしかいえない。
0334デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>324
一見簡単そうでも、継承とか人間が自分でキャストしたりして型の整合性をとるタイプの
CのOOPって、ちょっと規模が大きくなったらすぐ破綻するよ。
0335デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
>>331
libcだけ使えばいいじゃん
というかbettercとしての例外・RTTI無しのC++が組み込みでもあるじゃん
0336デフォルトの名無しさん2013/08/16(金) NY:AN:NY.AN
C→C++って凄い便利で高度化されていて、設計しやすく
それでいて低水準のメリットも失わないのに驚いたけどなあ
■ このスレッドは過去ログ倉庫に格納されています