[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 17:25 / Filesize : 118 KB / Number-of Response : 502
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 38



1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 117代目
  pc11.2ch.net/test/read.cgi/tech/1225320579/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 37
  pc11.2ch.net/test/read.cgi/tech/1224000127/
過去スレ
  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

83 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:29:01 ]
>>81
最初に書いてある国内ってのは、脳内では無かったことになってるのか。

84 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:32:52 ]
>>75
質問は返り値(戻り値)のことでの疑問でしょうか?
それなら簡単です。関数の戻り値は、通常の変数の値と同じ理解でいいんですよ。

 int func( int a, int b )
 {
  return ( a + b ); // int型の関数func は常に a + b の値を返します。
  // つまり関数func は a + b というint型の値を持つ変数と同じ性質です。
 }

 void main( void )
 {
  int n;
  int a = 1;
  int b = 2;

  n = func( a, b ); // n には関数funcが返す値 a + b が代入されます。n = a + b; と同じです。
 }

85 名前:デフォルトの名無しさん [2008/11/01(土) 19:46:51 ]
>>83
国際って書いてあるのを見落としたお前の失態

86 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:51:55 ]
>>85
『「国内・国際」って書いちゃったけど、やっぱ国内のほうは無しで、国際だけね」ってこと?


87 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:52:34 ]
揚げ足取りみたいなバカがいるようで、やはりここは
回答者のレベルが低い、知能も知識も、精神レベルもw
こんな腐った場所で質問する初心者は、場所を変えた方が良い。
まともな学校に通いなってことだ。所詮、ここは偽善有志者による
無責任で、一部の人間の自己満足で運営されていますからw

88 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:54:47 ]
あと 俺は英語なんて読めなくてJISの訳がどの程度の質か知らんし、 >>74 は適当に思いつきで煽っただけだから、
あわてて「国際」の話だとか言い訳する必要も無いよ。

89 名前:デフォルトの名無しさん [2008/11/01(土) 19:54:48 ]
>>86
ISO とも書いたがそれも読めてないようだな

>>87
学校というより収容所のせいだろう

90 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:57:50 ]
そもそも >>71 が激しくどうでもいい揚げ足とりだしな。

91 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 19:58:52 ]
>>89
それくらいは読めてますよ。



92 名前:デフォルトの名無しさん [2008/11/01(土) 20:55:12 ]
Borland C++ Compilerがダウンロードできないんですけど
どうすればいいですか?

93 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 20:55:55 ]
がんばってもっと探しましょう

94 名前:デフォルトの名無しさん [2008/11/01(土) 21:08:19 ]
他のコンパイラ探せってことですか?

95 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:13:15 ]
Borland C++ Compilerでググって最初に出てくるページは違うのか。

96 名前:デフォルトの名無しさん [2008/11/01(土) 21:19:56 ]
www.codegear.com/jp/downloads/free/cppbuilder

ここで C++Compiler / Turbo Debugger をダウンロードしたいんだけど
ユーザー登録してダウンロードのできるページに行こうとすると
表示するページがないって出る。ユーザー登録したメアドには
Zip解凍パス届いてるのに…。


97 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:22:40 ]
BCCは時代遅れだからVC++にしておけ。

98 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:25:50 ]
>>96
俺もダウンロードできないな。

> 上記のダウンロードサイトにアクセスできないときは、CodeCentral のダウンロードページをお試しください。
> CodeCentralのダウンロードページを利用するには、CDNへのログインが必要です。

ダウソのページに↑と書いてあるけど、CDNの登録とか面倒だから、これ以上はためさないけど。


99 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:26:55 ]
Cコンパイラとして使うなら、どっちでもそう変わりないと思う。

100 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:27:42 ]
でもダウンロードの敷居が違う。
だったらめんどくさい思いしてまでして使う理由が見当たらない。

101 名前:デフォルトの名無しさん [2008/11/01(土) 21:31:11 ]
>>97
win2kなんでVC++使えないです…。OS自体が時代遅れなんで。

>>96
みんなそうなんだ?なんとかならないかな…。




102 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 21:38:31 ]
cygwinやmingwなら登録いらずだよ。

103 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 22:07:57 ]
>>101
ttp://phys.cool.ne.jp/physjpn/bccwin.htm
なら一応bcc入りだよ?


104 名前:103 mailto:sage [2008/11/01(土) 22:14:09 ]
見つけた
ttp://clove.rye.tama.ac.jp/~softcat/soft/win/ABCD/BorlandC++5.5.1Jfree/freecommandlinetools2.exe

105 名前:デフォルトの名無しさん [2008/11/02(日) 04:48:43 ]
FILE型はどうしてオブジェクト型なの?

106 名前:デフォルトの名無しさん [2008/11/02(日) 05:00:12 ]
>>34
BCPL
Cの次はP言語

107 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:14:43 ]
>>105
オブジェクトで何か問題が?まさか関数型だとでも?


108 名前:デフォルトの名無しさん [2008/11/02(日) 05:30:37 ]
>>107
どうして構造体型じゃないの?

109 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:32:34 ]
FILEのメンバーを気にしたことある?

110 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:33:31 ]
うわぁ・・・

111 名前:デフォルトの名無しさん [2008/11/02(日) 05:42:23 ]
>>109-110
何故オブジェクト型にする必要があったの?



112 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 05:43:45 ]
Cでは整数もポインタも構造体もオブジェクトなわけだが…。

113 名前:デフォルトの名無しさん [2008/11/02(日) 05:46:16 ]
>>112
オブジェクト型は総称じゃないの?

114 名前:デフォルトの名無しさん [2008/11/02(日) 08:48:57 ]
電気代を算出するようなプログラムを作っているのですが
電気代の方が正常に表示されません(有り得ない桁数が表示される)。
他の部分も、まだまだ作りこまれておらず稚拙な内容ですが
とりあえず今は、電気代がきちんと出る事を目的としています。
使用しているコンパイラはVisual C++ 2008です。

どなたかご教授お願いします。

115 名前:114 [2008/11/02(日) 08:49:54 ]
すいません、ソースコードを張り忘れていました。
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7911.txt

宜しくお願いします。

116 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 08:57:22 ]
scanf・・・恐ろしい子・・・

117 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:07:04 ]
とにかくdoubleとの相性が最悪よね。どうしたのかしら。


118 名前:114 [2008/11/02(日) 09:13:07 ]
>>116-117
つまりプログラムでのミスというよりは、仕様での異常という事でしょうか?
そうなると、別の入力方法を考えないといけないわけですね・・・

ご解答有難うございました。

119 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:19:02 ]
>>118
アホかい。自分が使い方間違っているだけだって。
つーか、そのミスに警告も出てないとしたら、コンパイラの使い方も間違っているかもしれないぞ。

120 名前:114 [2008/11/02(日) 09:31:16 ]
>>119
そうだったのですか。
コンパイラはVisualC++2008の方に混同されているものですが
使い方などは考えたことありませんでした。

もう一度よく調べて見ます。
有難うございました。

121 名前:デフォルトの名無しさん [2008/11/02(日) 09:40:45 ]
誰か>>105について教えて下さい



122 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:42:15 ]
>>121
struct です

123 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 09:57:31 ]
1 は何故 int型なの?
'A' は何故 char 型なの?
0は何故偽値なの?
if文は何故式じゃないの?


124 名前:デフォルトの名無しさん [2008/11/02(日) 09:58:46 ]
>>122
何故オブジェクト型なのですか?
何故構造体型では無いのですか?

125 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:01:37 ]
構造体だって書いてあるじゃん。
バカなの?

126 名前:デフォルトの名無しさん [2008/11/02(日) 10:07:09 ]
>>125
JIS X3010:2003にはオブジェクト型であると説明されているのですが、
あなたは構造体型であると言いたいのですか?

127 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:08:12 ]
YES

128 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:12:13 ]
>>127
どうして構造体型なの?

129 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:17:02 ]
いや、間違った。別に構造体である必要は無いか。
規格でそこまでは決められてないな。
構造体以外で実装されている処理系は見たこと無いが。

Q.なぜ構造体ではなくオブジェクト型なのか?
A.構造体です。

Q.なぜオブジェクト型なのか。
A.規格でそう決められてるから。


130 名前:デフォルトの名無しさん [2008/11/02(日) 10:18:58 ]
>>129
、別に構造体型じゃなくても構わないッスw適当にやっちゃってよw、
って事?

131 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:21:37 ]
規格に書かれていないことは実装者の自由。
もっとも規格に沿ってない実装だってあるわけだから、
目指すものによって守るべきルールも決まってくる。
規格に無くても、世の中にはデファクトスタンダートと言うものもあるしな。



132 名前:デフォルトの名無しさん [2008/11/02(日) 10:21:57 ]

ポインティンガーから構造体にアクセスするときだけ -> で

いいのですか

133 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:25:09 ]
>>131
なるほど、ありがとうございます。

134 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:00:04 ]
っていうか、Cの規格のオブジェクトってのは、オブジェクト指向のオブジェクトとは別物だろ。


135 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:27:09 ]
perlの処理系をC言語で作る事はできますか?

136 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:28:18 ]
できますというかできてます

137 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:30:26 ]
Perlの処理系はLarryの優しさから出来ています
とりあえずこちらをご覧下さい
ttp://www.cpan.org/src/README.html

138 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:36:02 ]
他にもC言語でできてる、代表的なソフトを教えて下さい。

139 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:39:41 ]
Unix系OS

140 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:51:23 ]
Cの処理系

141 名前:デフォルトの名無しさん [2008/11/02(日) 14:57:40 ]




YO YO エビバーデー










142 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 15:29:45 ]
フィンガー5じゃないが、リンリンしなくて良いからw

143 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:02:55 ]
>>115
scanf("%f",&y);
↓ ^^
scanf("%lf",&y);
^^

printf("その電化製品で掛かる月の電気代は%e¥で、基本料金は%d¥です\n",ene,x);
↓ ^^^
printf("その電化製品で掛かる月の電気代は%.3f¥で、基本料金は%d¥です\n",ene,x);
^^^

これでいかがでしょう?(printfのほうは自分の好みで変更しました)
ただ、xが使われていないような・・・

144 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 16:08:18 ]
>>143です
思いきりずれました
つまり、scanfのフォーマット指定を"%f"→"%lf"
pritnfのフォーマット指定を"%e"→"%.3f"(この3は小数点以下桁数なのでお好みで)
でいかがでしょう?


145 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:49:25 ]
いまひとつ有り得ない桁数というのが分からないのと
それであってるのか分からないのだが
eneは電気代じゃなくて一ヶ月分の消費電力しか計算して無くないか?

146 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:51:19 ]
普通、¥は接頭です。

147 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 17:55:35 ]
計算するときは、常に単位を意識するといい。
y * z * 30は、即ち y[W] * z[h/day] * 30[days/month]だからつまり、ene[Wh/month]となる。
つまり、月当たりの電力量と言うことだ。

148 名前:デフォルトの名無しさん [2008/11/02(日) 18:10:45 ]
unsigned charの変数は初期化をしなくても問題は無いのですか?
大学の課題のサンプルプログラムの中に初期化も代入もせずに
値を参照している部分を見つけたもので気になって質問しました
試したところ確かに初期値?として0が格納されているみたいなんですが
これをそのまま利用していいんでしょうか?
自分の知識や習慣だと変数を初期化等をしないまま参照するのは
おかしい気がするのですが何かこうすることで問題が発生したりはしますか?

149 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:14:53 ]
グローバルスコープやstaticな変数なら0で初期化される。
ローカル変数ならゴミが入ってる。

150 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:15:40 ]
型の問題ではなく、定義されている場所の問題。
関数内のローカル変数でstaticでないなら、初期化しないと不定値になる。

151 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:16:34 ]
グローバル変数なら0で初期化される



152 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:19:43 ]
>>149
あれ?関数内のstaticな変数は0初期化されないんじゃなかったっけ?

153 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:22:04 ]
されます。

154 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:26:30 ]
>>149->>151
おお、ありがとうございます!
なるほど、型ではなくスコープの問題だったんですね
確かにそのプログラムではグローバル変数でした
今までそんなこと全く知らずに使ってました^^;
勉強になりました

155 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:32:39 ]
スコープっていうか静的か動的かの話じゃないかな
コンパイル時なら0で初期化とかやっても遅くならないし

156 名前:152 mailto:sage [2008/11/02(日) 18:36:12 ]
>>153
確かにそうみたい。なんか勘違いしてた

157 名前:デフォルトの名無しさん [2008/11/02(日) 18:40:33 ]
テキストファイルから1行ずつ読み込んで、
それをスペースを間に入れて表示したいです。
例えばテキストファイルの中身が
a
b
だったら「a b」という感じに表示したいのですが、
以下のコーディングで正しいでしょうか?
環境はWindowsXP、VisualC++2008 ExpressEditionです。

  char buf[1024];
  FILE *fp = fopen("test.txt", "r");
  while(fgets(buf, sizeof(buf), fp) != NULL){
    buf[strlen(buf)-1] = '\0';
    printf("%s ", buf);
  }


158 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:49:43 ]
>>157
だいたいそれでいいんじゃないの?

一行が1024文字以上だったらどうするとか、細かいことは考えないで。

159 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 18:56:06 ]
>>158
大丈夫そうですか?
あ、でもこれだとテキストファイルの最後に空白行
入れないと駄目っぽいですね。

160 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:09:00 ]
聞く前に試せよ

161 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:24:35 ]
俺に聞けスレで試せで終わらすなんて。



162 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:33:25 ]
何故ダメなのか聞くためのスレだろ

163 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:35:35 ]
>>159
fgetc()とfputc()で、一文字単位でしょりして、\nだったら空白に置き換えるってほうが、
簡単なんじゃね?

164 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:36:01 ]
できることできるだけやってから質問するのは当たり前だろ

165 名前:デフォルトの名無しさん [2008/11/02(日) 19:38:22 ]



一番ダメな考え方

「動くからこれでいい」


動くからと言って、CPUの演算処理を独占するようなコードはクソである。
だから動くからいいと言うものではない

166 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:38:39 ]
>143です

>>145-146さん
皆さん指摘の通り、中途半端な回答になっていました。
>>115さん
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7916.txt
に修正版をうpしたので許してください

167 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:45:17 ]
>>163
その方が簡単ですね。効率性も考えるとfgetsですかね?

168 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 19:50:27 ]
>>167
たぶん、大差ないんじゃないの?

昔、setvbuf()ってので、バッファのサイズを増やしたら速度が向上してたけど、
Windowsの時代になってから、同じようなことをやってもあんまり変わらなかった。
OSレベルでのバッファリングされてるからだと思うけど。


169 名前:デフォルトの名無しさん [2008/11/02(日) 20:19:51 ]
仮に、CPUの処理速度が無限大あって
ビットシフトなんか使っても速くならないとしても
常に最適化を忘れてはいけない

コンパイラが最適化してくれるとしても
自分の手で最適なコードを書くことを忘れてはいけない


これが出来ない奴はルータも携帯電話も作れない

170 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:21:34 ]
携帯やルータってCで出来てるの?

171 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:29:30 ]
基本は読みやすさ。
要件をみたせないときに、最適化。



172 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:32:53 ]
Cではありません。スパゲッティーで出来てます。

。。。ごめん

173 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:35:12 ]
またド忘れしちゃった。。
左シフト演算って、常に論理シフトするんだっけ。
signed でも unsigned でも正値でも負値でも。

右シフト演算がちょっとめんどくさいことになってることは
覚えてるんだけど。

174 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:37:28 ]
なぜコードを最適化するのですか?

175 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:40:24 ]
めんどくさいものは使わない。

176 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:48:13 ]
組み込みは未だに、CとASMで出来ている

177 名前:デフォルトの名無しさん [2008/11/02(日) 20:59:00 ]
>>172
ざる蕎麦ではできていないのか

178 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:59:47 ]
>>173
#include <stdio.h>
#include <limits.h>
#define UPPER_BIT (1 << (sizeof(int) * CHAR_BIT - 1))
void print_bit_s(int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
void print_bit_u(unsigned int n){
  unsigned int mask = UPPER_BIT;
  for(;mask; mask >>=1) putchar(mask & n ? '1' : '0');
  putchar('\n');
}
int main(){
  int n1 = (-1);
  int n2 = n1 & ~UPPER_BIT;
  unsigned int m1 = n1;
  unsigned int m2 = n2;
  print_bit_s(n1 >> 1);
  print_bit_u(m1 >> 1);
  print_bit_s(n2 << 1);
  print_bit_u(m2 << 1);
  return 0;
}
// output
11111111111111111111111111111111
01111111111111111111111111111111
11111111111111111111111111111110
11111111111111111111111111111110


179 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:25:30 ]
>>174
そこにコードがあるから

180 名前:173 mailto:sage [2008/11/02(日) 21:44:14 ]
んー、たとえば右シフト演算について言えば、符号付き整数型の負値に対して演算を
適用した結果は処理系に依存しますよね。output の1行目でいうと、算術シフトするか
論理シフトするかは処理系に依存すると。。
上の2行は
01111111111111111111111111111111
01111111111111111111111111111111
こうなる可能性があるわけですよね。下の2行に関しては同様に処理系依存の問題は
大丈夫なのでしょうか。コードを解読し切れてないので結論が良く見えないのですが。

181 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:50:37 ]
>>173
っMSDN
と思ったけど、検索しても見つけにくかったので、ローカルから。
Shift Operators: >> and << (ごめん、英語なんだ)
とりあえず適当訳。

左シフトは0埋め。論理シフト。

右シフトはunsignedは0埋め。signedは符号ビットで埋める。
unsignedは論理シフト。signedは算術シフト。

・Microsoft Specific
signed の負の数の右シフトは、実装によります。
MicrosoftのC++の場合は、MSBで空いたビットを埋めます。
MSのC++以外の場合は知らん。

だそうです。




182 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 21:53:03 ]
なんでこういう細かいところ統一しないの?

183 名前:173 mailto:sage [2008/11/02(日) 22:12:18 ]
わざわざ和訳までしてもらってすいません。Cの規格的な部分ではどうなんでしょうね。。
Microsoft仕様ではCとC++とでまた違うんですか。こちらでももうちっとしらべてみます。
あふん。。

184 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:20:14 ]
>>182
なんでOSは統一しないの?なんで通貨も、言語も。
所詮、こんなものは、規格化した集団が幅広い用途を考慮して
決めるか、一部の団体の意見の押し付けでしかないってことだよ。
そして俺らはそれを使うだけ。開発、発案、研究するわけでもない・・・
まぁ、俺はとある有名大学で研究、実験はしたがな。

185 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:28:45 ]
>>182
効率を重視するから

186 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 22:32:34 ]
>>183
MSの場合Cでも>>181と同じ。
そこに書いてある「MSのC++以外」とは、MS以外のC++という意味。

規格上は、負の値の左シフトは未定義。
正の数なら符号付き・符号無しいずれの型でも0埋めで定義されている。

CはJIS X3010、C++はJIS X 3014が国際規格の翻訳として存在する。
www.jisc.go.jp/

187 名前:173 mailto:sage [2008/11/02(日) 22:57:15 ]
おお!そのものズバリのご回答ありがとうございます。
負値の左シフトは未定義でしたか。
正値ならば符号付き・無しに関わらず論理シフトすると、こういうことですね。
ややこしいなあ。。
ともかくこれでスッキリしました。
ありがとうございました。

188 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:05:13 ]
左シフト?

189 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:06:46 ]
「右も左も分かりません」

190 名前:デフォルトの名無しさん [2008/11/02(日) 23:14:23 ]
アホか

191 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:16:59 ]
↑うん、お前アホ。



192 名前:デフォルトの名無しさん [2008/11/02(日) 23:27:23 ]
肝心のシフト演算子について話せない奴はすっこんでろ

193 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:28:34 ]
>>187
算術左シフトという言葉があったとしても、負の値のそれはやっぱり0埋めだよ。
論理左シフトと全く同じだから、わざわざ算術と言わないだけ。

算術右シフトが負値で1埋めするのは符号を維持するための結果であって、
1埋めするから算術というわけではない。

194 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:29:41 ]
自分の論理を自分に適用できない奴はすっこんでろ

195 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:49:20 ]
そんなに符号のことが気になるなら、unsignedをしっかり指定しとけ、な?

196 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 23:53:00 ]
>>177
ざる蕎麦ではだめです。 もり蕎麦に、のりを盛るところから始めなくては。
きしめんでも可。 たぶん、時期的に、そうめんはだめだと思う。

(って何の話だっけ


197 名前:187 mailto:sage [2008/11/02(日) 23:55:37 ]
言葉の定義って難しいですね。。ややこしくて頭がパンクしそうです。
単純に 0埋め=論理シフト、1埋め=算術シフトと覚えてました。
算術(右シフト)だから符号を維持する必要がある→結果として1埋めになる
論理(右シフト)だから符号を維持する必要がない→結果として0埋めになる
こういうことなのかな。考えたことも無かった。

198 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:00:01 ]
そんなに心配なら shl, sal, shr, sar を直に使えよ

199 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:04:35 ]
算術シフトは
左にnビットシフトすると,元の数の2^n  倍
右にnビットシフトすると,元の数の1/2^n倍

これを保障するシフト演算。だから算術という。

200 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 00:10:33 ]
RCL、RCR、ROL、RORとか混ぜると、さらにパンク。


201 名前:187 mailto:sage [2008/11/03(月) 00:20:29 ]
なんで知らなかったんだろう今まで。。恥ずかしい。
算術って言うのは単に符号を維持するっていうことじゃなくて、そういうことなのね。。
それを保証するために符号の維持も当然必要で、その結果1埋めになる(右シフトの
場合)ということかな。



202 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:49:20 ]
>>184
多様性のもつ可能性を吟味しなければなりません。

203 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:53:42 ]
scanfで入力してもらった数字、例えば1234を合計した数字を変数に入れる方法を教えて下さい。(入門者にも理解できる範囲でお願いします)

204 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 13:59:03 ]
数字は1 2 3 4とバラバラに入力するのかそれとも連続で1234と入れるのか?

205 名前:203 mailto:sage [2008/11/03(月) 14:02:37 ]
連続で入力するほうでお願いします。

206 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:06:53 ]
文字列で受け取って、一文字づつバラして、数値に変換して、全部足す

207 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:16:20 ]
>205
まず、%d指定子を使って1234という数字をまるごとあるint変数(仮にt)に読み込む
次に、合計を得る変数(仮にs)をゼロに初期化する
そして、以後tが0より大きい間、tを10で割った余り(%演算子を使うこと)をsに加算してからtを10で割るということを繰り返す

※Cでは、正の整数の割り算は端数を切り捨てる

流れ:
 s:0 t:1234(読み込み)
 s:4 t:123(1234を10で割った余り4をsに足しtを123に)
 s:7 t:12(123を10で割った余り3をsに足しtを12に)
 s:9 t:1(12を10で割った余り2をsに足しtを1に)
 s:10 t:0(1を10で割った余り1をsに足しtを0に)
 (tが0になったので終了)



208 名前:デフォルトの名無しさん [2008/11/03(月) 14:21:45 ]
int a;
scanf("%d", &a);
printf("%dの合計を暗算して入力してください");
scanf("%d", &a);
printf("はい、ご名算!");

209 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 14:50:08 ]
宿題は宿題スレへ じゃないのか?

210 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:04:53 ]
そういうのって、getchar() ループの方が楽じゃね?
#include <stdio.h>

void main( void )
{
 int loop = TRUE;
 int sum = 0;
 char c;

 while ( loop ) {
  c = (char)getchar();  // 1文字入力
  switch ( c ) {
   case '0':   // 0〜9が入力された場合、sumに足しこむ
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':
    sum += (int)( c - '0' );
    break;

   case EOF:
    loop = FALSE;
    break;
  }
  printf( "合計値は %d \nです。", sum );
 }
}

211 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:08:52 ]
'0'-'9'は連続が保障されてるから、そんなことしなくても



212 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:22:36 ]
int c, sum = 0;
while (isdigit(c = getchar())) sum += c - '0';
printf("%d\n", sum);

これだけでいいじゃん

213 名前:>212 mailto:sage [2008/11/03(月) 15:25:30 ]
0〜9以外を無視していないから却下

214 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:27:06 ]
え?

215 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:29:13 ]
123x4 と入力したら 10 が返ってくる仕様が求められてるのか?

216 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:30:18 ]
>>209
丸投げでなければわからないことを聞くのは一向にかまわない

>>210-212
scanfでって言ってるのにgetcharはないだろ

217 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:41:17 ]
こういうので、質問者にscanf()が必須条件なのか、それ以外でもいいのかって質問してもめったに返事が返ってこないよな。


218 名前:210 mailto:sage [2008/11/03(月) 15:43:37 ]
>>216
こういうのはふつうキーイベントループ制御だべよー。
WindowsのようなGUIでもテキストボックスに「1234」なんて連続して入力させるかぁ?

219 名前:203 mailto:sage [2008/11/03(月) 15:49:26 ]
みなさん、お答えいただきありがとうございます。
アドバイスを受け、色々と試してはいるのですが、一向にうまくいきません。

ここで質問なんですが、1234を

char str[5];

scanf("%s",str);

で文字列として受け取って

atoi(str)で整数値に変換

その後に1234を一文字ずつにバラす方法がさっぱりわかりません

アドバイスお願いします。


220 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 15:52:30 ]
>>219
4 = 1234 % 10;
123 = 1234 / 10;

221 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:07:33 ]
文字列入力ってテーマを見ると、すぐにgetchar()で一文字ずつ判断するロジック書く奴っているよね。
そういう奴に限ってろくでもないバグを仕込むから笑えない。



222 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:09:19 ]
例えば、>212はまぁ無難な方で、>210なんてわざわざバグを埋め込むための無駄な努力の跡さえ見えてしまう事実。

223 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:23:58 ]
>>221
本番では2バイト文字に気を付ければいいだけだろ
>>222
レビューでデバッグしてくれ

224 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:35:49 ]
標準入力から0xffを入力すると、EOFと誤解釈して終了してしまうね。
この程度のサンプルならどうでもいいけど、ファイルをリダイレクトして使うようなツールだと恐怖だね。

225 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 16:42:38 ]
>219
ソースはれ

あと、ほかに制約がないのなら、%sからatoi()なんかしないで素直に%dで読みなさい

226 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:00:30 ]
>>224
それ、0xffイコールEOFだから誤解釈じゃないよ。それも正常系の解釈と処理。
まあサンプルプログラムだし、EOFは入力の終了条件のために設けた
だけだから、そこは削除して他の方法に置き換えても構わないし。

227 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:06:47 ]
違います
EOFは決して0xffではありません

228 名前:203 mailto:sage [2008/11/03(月) 17:07:34 ]
#include<stdio.h>

int main()
{
int w,x,y,z,goukei;
int w2,x2,y2,z2,goukei2;
int yosou[4];
int yosou2;
printf("前回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w,&x,&y,&z);
goukei = w + x + y + z;
printf("前々回の当選数字を入力:\n");
scanf("%d,%d,%d,%d",&w2,&x2,&y2,&z2);
goukei2 = w2 + x2 + y2 + z2;
printf("今回予想した数字を入力:\n");
scanf("%d,%d,%d,%d",&yosou[0],&yosou[1],&yosou[2],&yosou[3]);
yosou2 = yosou[0] + yosou[1] + yosou[2] + yosou[3];
if(goukei == yosou2 || goukei2 == yosou2){
printf("%d Is a NG\n",yosou2);
}else if(yosou2 > 9 || yosou2 < 27){
printf("%d NG",yosou2);
}else{
printf("%d OK\n",yosou2);
}
return 0;
}

ナンバー4の当たり数字過去2回の合計値と一致した場合、NGと出力するプログラムです。
また、予想した数字の合計値が9〜27に入ってなくてもNGと出力します。
ほんとくだらなくてすいません。

229 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:13:14 ]
>>226
いや、大誤解だと思いますね。>>224 ではなくて、>>>226 が。
>>210 は getchar() の戻り値を char でうけているのが、センスがないというか、そもそも本質を理解していない、というべきか。
もしかして、いつものあなたですか?これはつり?

230 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:17:14 ]
いつものあなたって・・
お前は誰と戦ってるんだ

231 名前:デフォルトの名無しさん [2008/11/03(月) 17:22:56 ]
非科学的=厨はマ板にまではびこっている



232 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:25:19 ]
糖質かこいつ

233 名前:デフォルトの名無しさん [2008/11/03(月) 17:33:18 ]
どいつ?

234 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:34:13 ]
229

235 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:34:35 ]
>>228
scanfを使うことは必須条件?
あと入力するのは「1234」なのか「1,2,3,4」なのか
前者だったら>>207でできないかな
後者だったらsscanfとかを調べてみるといいかも


236 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:51:07 ]
>>227
ですよね。というか、標準入力からの入力値が、つうつうで getchar() ≒ fgetc() の返り値になるわけではないのですが。
>>230-234
やっぱりIDをつけたほうがいいのでしょうかね。

237 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:04:03 ]
>>228
"%d,%d,%d,%d"と書いたら、それは1,2,3,4と入力させることを意味する
1234と入力するのなら>>207のようにすること

238 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:21:31 ]
fgetsじゃなくてgetsでいいよ
どうせ両関数の仕様すら理解していないんだろ

239 名前:203 mailto:sage [2008/11/03(月) 18:26:55 ]
スレ汚しすいませんでした。


>>207の方法で1から作り直します。

皆さんご回答本当にありがとうございます。

240 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 19:38:12 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7932.txt
画面内の球をクリックすると初速度v0で鉛直投げ上げするプログラムです
空中にある状態の球をクリックするとまたその位置から投げ上げされて
球をクリックするたびにどんどん球が上がるようにしたいんですが、
空中の球をクリックしても何も起こしません。
ボールが跳んでるときに、最初にボールがあった場所をクリックするとおかしなことに。

241 名前:デフォルトの名無しさん [2008/11/03(月) 19:43:31 ]
あっそう



242 名前:240 mailto:sage [2008/11/03(月) 20:22:33 ]
どこが間違ってますかね?

243 名前:受付番号001 mailto:sage [2008/11/03(月) 20:25:58 ]
>>242
いま診てやるから待ってろ

244 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:34:54 ]
たぶんここだな

if(bally+ball >= 500){
KillTimer(hWnd,ID_MYTIMER);
bTimer = FALSE;
mytime = 0;
}

245 名前:質問 [2008/11/03(月) 20:55:23 ]
ファイルの直ぐ下に任意のファイルの内容を
そのままコピー、連結できる関数ありますか?お願いしますm(__)m

246 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:58:55 ]
>>245
ないです。

247 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:00:06 ]
自分でアペンドモードで開いてコピーしる

248 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:00:38 ]
下はどっちだ?

249 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:02:24 ]
>>245
C/C++の宿題を片付けます 117代目
pc11.2ch.net/test/read.cgi/tech/1225320579/

250 名前:245 [2008/11/03(月) 21:02:52 ]
ということはファイルの内容を読み込んで
fopenのaで逐一書き込んでいくのが最良の方法ですね?

251 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:03:23 ]
system



252 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 21:06:56 ]
読み込みながらの方が良いだろう。
char buf[4096];
f = fopen(path, "r");
g = fopen(paht, "a");
while (c = fread(buf, 1, sizeof buf, f))
fwrite(buf, 1, c, g)


253 名前:245 mailto:sage [2008/11/03(月) 21:12:33 ]
ありがとうございましたm(__)m

254 名前:240 mailto:sage [2008/11/03(月) 21:18:46 ]
>>244
問題ないような気が・・?すみません分からないです

255 名前:受付番号001 mailto:sage [2008/11/03(月) 22:24:32 ]
>>254
診ましたよ〜。

えーと、これはですね、、、もう手遅れです。                   (←うそ)

問題点はボールのY座標の扱いですね。 WndProc内の変数ballyで保持しているY座標と
WM_TIMERメッセージ内で一時的に計算しているY座標とが一致していません。
ballyはウィンドウメッセージを受けるたびに480に初期化されていますので、上に飛んでいる
ボールをクリックしても反応しなく、地面をクリックすると反応してしまうのです。
ballyはWM_CREATメッセージ内だけで初期化しましょう。

また、WM_TIMERメッセージ内では常に地面からの座標計算でボールの高さを計算して
しまっているので、上手くボールにヒットしたらballyの位置から計算しなおす様に変更する
必要があります。

256 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 22:25:18 ]
>>245
COPYやcatで連結は駄目なの?

257 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 22:35:13 ]


ソースを読むって言うのはさ

自分とソースを一体化させる作業なんだ


「俺は今どうなっているのか」と考えながら読むんだ

無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか




258 名前:質問 [2008/11/03(月) 23:27:00 ]
下記の違いを教えていただけますでしょうか?
return
exit
あ、あと
EXIT_FAILUER
ってなんですか?

259 名前:デフォルトの名無しさん [2008/11/03(月) 23:28:00 ]
FAILUARE

260 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:28:50 ]
こういう人にはgoogleの使い方を教えたほうが親切なんでしょうか?

261 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:29:38 ]
return は予約語
exit はライブラリ関数
EXIT_FAILURE はマクロ定数
です。



262 名前:デフォルトの名無しさん [2008/11/03(月) 23:40:04 ]
return は関数から抜ける
exit はプロセスから抜ける
EXIT_FAILUER は書いた者に聞け(煽り口調で)

263 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:41:28 ]
EXIT_FAILURE はマクロ定数の意味が分りません

264 名前:240 mailto:sage [2008/11/03(月) 23:44:28 ]
>>255
うまくいきました!  
大変わかりやすい説明ありがとうございます!


265 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:51:02 ]
>>257
空気を読むって言うのはさ
自分と空気を一体化させる作業なんだ
「俺は今どうなっているのか」と考えながら読むんだ
無意識にみんなやってると思うぜ
他の何かがどうなってるかではない、自分がどうなってるか

しかし、鏡を見ると、場に合わない容姿・・・

266 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:02:17 ]
int main (void){
int i;
int vx[5];
for(i=0;i<5;i++){
printf("vx[%d]:",i);
scanf("%d", &vx[i]);
}
putchar('\n');
for(i=0;i<5;i++){
printf("vx[%d]=%d\n",i,vx[i]);
}
return (0);


上記の配列の要素を読み込んで表示のプログラムを実行したところ
1
2
3
4
5
vx[0]:vx[1]:vx[2]:vx[3]:vx[4]:
vx[0]=1
vx[1]=2
vx[2]=3
vx[3]=4
vx[4]=5
と変な形になってしまい、試行錯誤したところどうやら実行の際に
ファイル名 | more
としていたのが原因のようでした。 moreはその前に書いてたプログラムの際に利用していてそのままでした。

moreは単に一画面ずつ表示するようにするだけなのになぜこのようなことが起きたのでしょうか?


267 名前:受付番号001 mailto:sage [2008/11/04(火) 00:06:58 ]
>>264
乙! 面白いトレーニングプログラムだねw
わしもSetTimer、KillTimer、WM_TIMERメッセージは、テトリスを作ってみた時に使ったよ。
同じように素のWindows SDKとC言語だけでね。

>>265
大人になれば空気なんて読まなくなる。いや読む必要がなくなるのだ。
その代わり、盤面の様子や流れ、相手のニーズや考えを読むように変化する。

268 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:30:14 ]
自分がmainになるんだよ
mainになって、forなどで値の計算や操作をやっていると考えると
どこがおかしいのか分かりやすい

元々俺がアセンブラ屋だったから
自分に置き換えて「イメージ」する癖がついた

っていうか、みんなイメージしてると思うが!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

269 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:35:49 ]
>>266
printf() の後に fflush(stdout); をおいてみるとどうなりますか?fflush(NULL); ではどうなりますか?

270 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:36:28 ]
>>268
新しい芸ですか?

271 名前:デフォルトの名無しさん [2008/11/04(火) 00:36:54 ]
みなさん、Cのソースを組むとき、分かりやすく汎用的に組む為に、具体的にどういうことに気を付けてますか?
たとえば、、、
僕の場合なんですが、
・一行は80文字。
・strcpyよりmemcpy
・独自関数ライブラリのプロトタイプは必ず書く。
・関数の引数が多くなりすぎる時は構造対で渡す。
・関数名はキャメル式に統一。
・入れこは3つ以上にしない。
・繰り返し文は使い分ける。
・構造化プログラミング。mainは目次みたいな感じで、全体が把握でくるような作りに。
・C言語についてのコメントは書かない。
・インクルードヘッダはは使用するものだけ書く。(まとめたりしない)
まだあると思うけど、とりあえずこれくらいかな〜

みんなのも教えてください。



272 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:39:26 ]
>>271
> ・strcpyよりmemcpy
状況にもよりますが、これは賛同しかねます。

273 名前:デフォルトの名無しさん [2008/11/04(火) 00:45:27 ]
>>272
あ、すいません。
そうですね。\0つけたい時ありますもんね。
strcpy→strncpyに訂正します。


274 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:50:17 ]
>>271
入れ子2つだけじゃ厳しいなぁ

275 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:52:42 ]
memcpy()でコピーしてるのに、コピーの長さをstrlen()で取ってるコードをこのまえ見たな。
strcpy()でいいじゃんって思うけど。

276 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:53:10 ]
>>271
>一行は80文字。
まあほとんどないことですが、意味の上で 80文字を超えるようであれば、それはそれでこだわりません。

>プロトタイプは必ず書く
前方参照をほとんど行わないので、特に必要性を感じません。

>入れこは3つ以上にしない。
それはそうなんですが、まあ、ええ、ときどき、しばしばやってしまいます。

>キャメル式
初耳です。よろしければ意味を教えてください。

277 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:56:34 ]
>・一行は80文字。
これは無い

278 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:57:33 ]
>>276
ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9

279 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:59:40 ]
>>277
そういうスタイルの人もいるよ。
Cだと80くらいでも十分書けるし。

280 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:04:14 ]
いや居るのは知ってるよ

281 名前:デフォルトの名無しさん [2008/11/04(火) 01:06:24 ]
>>276
動的独自ライブラリから独自関数を使う場合、引数間違っててもコンパイルが通る。んで、実行時にコア吐いて初めて気付く事がある。プロトタイプ書いてると、コンパイルエラーでるから、書くようにしてる。好みかな。
キャメル式は、確か、ラクダみたいな意味だったかな。大文字と小文字だけでつけるやつ。こういうの。
FileCopy()
区切り方の違いかな。変数はアンダーバー使うし、マクロは大文字とか。





282 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:06:58 ]
ああそう。

283 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:54 ]
うん

284 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:08:55 ]
>>281
下位のサブルーチンから書いていって、main()を最後に書くってスタイルの人なんじゃないの?

285 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:09:11 ]
コーディング規約のスレがあったような

ここでもいいんですよ、はい

286 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:10:53 ]
>>281
ん、了解。たしかに分割コンパイルですすめるときは .h にプロトタイプをまとめる、というのは日常的にしますね。読みが浅かったです。

>>278 >>281
キャメル式+ハンガリアンでかいてみることもあります。気分しだいですが。

287 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:16:37 ]
>>284
昔はそういう人も居たし俺もそうだった。技巧賞ノミネート作品のように。
でもある時から改めた。

288 名前:デフォルトの名無しさん [2008/11/04(火) 01:18:18 ]
>>275>>273を読んでないのか

289 名前:デフォルトの名無しさん [2008/11/04(火) 01:20:25 ]
>>287
技巧賞とあるんだ
ぐぐるわ

290 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:01 ]
>>288
別に責めてるわけじゃないから、気にしなくていいよ。

291 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:25:48 ]
>>287
技巧賞っていうか、Pascalの影響も多分にあると思う。



292 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:28:07 ]
>>286 ハンガリアン記法はダメだろ

293 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:30:20 ]
>>287
さしつかえなければ、かえた理由を教えてください。
たしかに私も厳密な意味で下から上にかいているわけではなく、コンパイルOKれべるですので、技巧賞はむりですね。

294 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:32:58 ]
>>292
私のはいわゆる「アプリケーションハンガリアン」ってやつですね。MicroSoft 流 pszXXX とかいうのは私も嫌いで、これはやらないです。
そもそも全部の変数をハンガリアンにするわけではありません。
節操がないといえば、それまでですが。

295 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:36:38 ]
しかしアプリケーションハンガリアンって、あんまり使う機会がないっていうか。
システムハンガリアンはダメだって言われてるけど、Cのときは、ポインタはpをつけてる。

296 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:41:43 ]
>>269
どちらでも実行結果は変わりませんでした。

297 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:52:53 ]
>>296
more の内容をください。more にも fflush(NULL) をいれるとどうなりますか?

298 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:58:06 ]
fflush(stdout); を入れるのは一つ目のprintfですよね?

C:\081103>1 |more fflush(NULL)
ファイル C:\081103\fflush(NULL) にアクセスできません
1
2
3
4
5

となりました。

299 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:10:06 ]
>>298
いえいえ、more も自作しているのかな、と思って、 fflush() で more のバッファリングも殺してしまおうと思ったわけで、
コマンドラインで fflush を指定するつもりはありませんでした。

more が標準出力をバッファリングしており、自作のプログラムの出力をその都度画面に出力していないのでは?と思いますが、いかがでしょう。


300 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:14:20 ]
ごめんなさい、何言ってるか分かりません・・・
自分の不勉強のようなので出直してきます。

301 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 02:19:23 ]
>>300
いえいえ、そんなつもりはないです。
バッファリングについてかいておきますね。
printf() で出力した時点で、それが画面にそのままでるわけではなくて、いったん別のところにたくわえられており、
ある程度たまった時点で画面に出力される、という仕組みになっているのが普通です。

たとえば、これは画面ではなくてディスクなんですが、printf()などで一文字ずつ書き込む、なんてディスクがカリカリいって
(ハードウェアの操作には時間がかかることは直感的に感じていただけるものと思います。)なんだか非効率だと思いませんか?

なにかわからないことがあれば遠慮なくきいていただいていいと思いますよ。レスポンスがあるかどうかは運まかせかもしれませんが。



302 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:00:02 ]
strncpyは仕様が腐ってるので使うのやめとき。


303 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:08:05 ]
どう腐ってるの?

304 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:09:44 ]
終端文字列の扱いのこといってんだろう多分

305 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 09:28:37 ]
strncpy()を使うくらいなら、spritf()を使いこなすか、いっそ自前で管理した方がいい希ガス。

306 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 13:08:21 ]
つ strncat()

307 名前:デフォルトの名無しさん [2008/11/04(火) 16:12:50 ]
spritf

308 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 16:32:53 ]
>305s/spritf/sprintf/

309 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:24:34 ]
int i,j,k,count;
printf("何段?");
scanf("%d",&count);

for(i = 1;i <= count;i++){
for(j = 1;j <= count-i;j++){
putchar(' ');
}
for(k = 1;k <= i;k++);{
printf("*");
}
putchar('\n');
}


上記のプログラムで右下が直角の三角形が表示されるつもりなのですが

何段?5
----*
---*
--*
-*
*
となってしまいました(半角スペースを-としました)。kがうまくいってないような気がするのですが、ご指摘お願いします。



310 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:35:29 ]
>for(k = 1;k <= i;k++);{
この行に注目。


311 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:44:17 ]
>>310
printf("* %d",k);にしたところ

----*2
---* 3
--* 4
-* 5
* 6

となりました・・・なぜ毎回k=1にならないんだ。



312 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:45:47 ]
>>311
>310
他は見なくていい。

313 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:47:45 ]
>>312
注目したのですがとくにおかしくないような・・・
i回の繰り返し文のはずです。

314 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 18:53:12 ]
やっと気付きました。 for(k = 1;k <= i;k++);←ここですね{
くだらない質問で失礼致しました。ご指摘ありがとうございました。

315 名前:デフォルトの名無しさん [2008/11/05(水) 01:32:51 ]
int k,i,j,n;

printf("何段?");
scanf("%d",&n);

for(k=0;k<=n;k++){

for(i=0;i<(n-k);i++){
printf(" ");
}
for(j=0;j<k;j++){
printf("*");
}
printf("\n");
}

布団入ってから作ったから動くかどうかわからん。

316 名前:デフォルトの名無しさん [2008/11/05(水) 01:42:04 ]
do{

if(){
break;
}
if(){
break;
}

}while(0)

時々みるこれどうなのよ?テクッてて見易いとかいうやつは程がしれてるな

317 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:53:25 ]
>>316
while (1) {if()break; if() break;}
とか
for(;;) {if () break; if () break; }
はよくみます。lint にひっかからないように for(;;) {} を使う、ていう意見も。
ループの脱出条件が2つ以上ある、というのであれば、これらのやり方もありだと思います。

318 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:18:01 ]
>>317
論点がずれてる

319 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:22:47 ]
大文字と小文字を区別しないコンパイラはありませんか?

320 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:24:46 ]
そこまで大胆に規格を逸脱した実装は見たことないな。
せいぜいDOS/Windowsでヘッダ名が大文字でも行けるくらいしか知らない。

321 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:39:26 ]
>316
どうなのよってお前の感想どおりだ



322 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:13:09 ]
>>316
別にテクッてるとは思わないがいいんじゃないの

323 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:06:33 ]
>>316
その書き方は嫌いだが goto 禁止なら仕方ないな

324 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:25:39 ]
int main(){
(略)
 printf("test\n");
関数(Dname);
}

void 関数(char *fname){
printf("2\n");
}

というプログラムがあったときに、testが表示されて
2が表示されずにセグメンテーションエラーでるのはどこに原因があると考えられますか?


325 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:27:13 ]
略されたところに魔物が棲んでいると考えられます

326 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:58:22 ]
324ですけど解決しました
関数の中の定義した配列のサイズがおおきすぎたためでした。

327 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:33:44 ]
>>316
美しくないとは思ってたんだがそれに近い書き方だ
0じゃなくて条件1個だけど
どう書くべきなの?
条件をいっぱい書くとして抜けるタイミングが異なる場合はどうしたらいい?

328 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:37:59 ]
>>316
初心者なのでよくわからないのですが
これはif ・・・・・ else if  ・・・
じゃだめなんですか?

329 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:39:58 ]
>>328
それで組んでもさほど代わらないと思うよ。
むしろネストが増えるし

330 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:04:32 ]
qsortでIPアドレスをキーにソートしたいんですが、うまくいきません。

IPアドレスとchar型の文字列を要素に持つ構造体のソートをしたいのですが
比較関数内にprintfを置いてみると、どうやら比較関数を数回参照しただけで
デバッガが立ち上がってしまいます。

IPアドレスはCSVから読み込んでいますが、5MB程度のCSVなら問題なく読み込み、ソートまでできます。
全く同じフォーマットの150MBのCSVからIPアドレスを全て読み込んでソートしようとするとデバッガが立ち上がります。

比較関数内の数箇所にprintfを置いてみたところ、比較関数の先頭と最後のprintfはセットで表示されるので、
比較関数内ではデバッガは出ていません。

どうやら割り当てされていないメモリ領域を参照しているみたいなんですけど、qsortをする際に変な領域を参照することとかあるのでしょうか。

331 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:08:08 ]


・複数プラットフォームで運用するものでない
・仮に複数プラットフォームがあるとしても、ウチは個別にソースを用意する
・社風なのか、ソースの流用は好まない



なのに、「typedefで調べろよ!んったく何やってんだよもー」

とかグチグチ言い出す不満の塊
お前ストレス解消するために会社来てんのか






332 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:55:18 ]
>>330
デバッガってのはデバッグするためのツールなんだけどね・・・
まぁたぶんスタックが足りないんだろう。どーんと増やしてみては?

333 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:05:48 ]
>>327
ループ条件が存在するならループで書いたって問題ないだろ

334 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:34:11 ]
while(条件式)

if(){

continue;
}
if(){

}

}
1個目のifでcontinueした場合2個目のifはとばされて、whileの頭にもどりますよね?

335 名前:デフォルトの名無しさん [2008/11/05(水) 14:46:20 ]
やってみれ

336 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:47:34 ]
なんでその程度の規模のプログラムで聞くかね・・・

さくっとサンプル作って、どういう動きするか
テストしてみればいいじゃん。

337 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:02:59 ]
それがゆとり

338 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:18:58 ]
何度も言うけど、Cは動作の詳細を網羅しない言語だから「やってみろ」はダメ
i=i++とか、やってみてその結果が正しいと思い込んだらどうすんの?

こういうのに素直に答える気がないなら「教科書読み直せ」でいいんだよ

>>334
そうだよ

339 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:22:50 ]
どうもしねーよゆとり

340 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:25:46 ]
>>338
ここで散々論争になってきたようなところは
はまったときに聞けばいいんだよ。
どうせはまるところはそういうところって大体結論でてるんだし。

341 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:21:34 ]
>>340
いつどこでそんな結論が出たの?
むしろ最初から正しい知識を与えないからそういうところではまるんじゃないの

問題にしているのは「やってみて確かめる」という姿勢はトラブルの種を抱えているということで
後になってトラブルが起きてから解決できるかどうかではない



342 名前:デフォルトの名無しさん [2008/11/05(水) 17:57:50 ]
>>341
それを言うなら、動作保証の有無を 2ch で聞く姿勢にこそ問題があるだろう
正しい知識だ? そもそもそんなのを与える義理がない者をつかまえて何を説くやら

343 名前:デフォルトの名無しさん [2008/11/05(水) 18:57:39 ]
質問です。
プログラムの練習で数のべき乗を計算するプログラムをCで作ってみたのですが、ちゃんと計算してくれません。
出来れば、どこが間違っているか教えていただけないでしょうか?
コードは下記のとおりです。
#include <stdio.h>
double multi(double x,int y);
int main(void){
double a,b,mul;
printf("数字aを入力してください\n");
scanf("%d",&a);
printf("aを何乗するか入力してください\n");
scanf("%d",&b);
mul = multi(a,b);
printf("%d",mul);
return 0;
}
double multi(double x,int y)
{
int i;
double mu;
for(i=1;i<=y;i=i+1)
{
mu*=x ;
}
return mu;
}

344 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:01:12 ]
>>343
scanf("%d",&a); → scanf("%lf",&a);
scanf("%d",&b); → scanf("%lf",&b);
printf("%d",mul); → printf("%f",mul);
double mu; → double mu=1;

345 名前:343 [2008/11/05(水) 19:10:21 ]
>>344
ありがとうございました。
桶下で、ちゃんと動作するようになりました。

346 名前:343 mailto:sage [2008/11/05(水) 19:11:26 ]
桶下→おかげ
です。
失礼しました・・・・・

347 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:41:50 ]
%fより%gを使おう。

348 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:45:36 ]
なんかちがうんでげすか?

349 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:55:55 ]
if ( (a=Func()) == 8 )

aにFuncの返り値を代入しつつ比較ってできる?




350 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:58:11 ]
できる

351 名前:デフォルトの名無しさん [2008/11/05(水) 20:00:22 ]
>>349
やってみてうまくいかないのか?



352 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:19:04 ]
入門以前に、環境について質問なのですが、Microsoft Visual C++.net ExpressとBCC5.5では、どちらが使い易いですか?


353 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:26:03 ]
どう考えても前者

354 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:21 ]
IDEとコンパイラ単体では比較にすらならん

355 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:29:30 ]
>>351
うまくいったが、その動作が保証されてるかどうかを気にしてるんじゃないの?

356 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:43:12 ]
>>342
なぜ問題が?
ネットの情報の信用性云々言い出すならそもそもこんなスレの存在意義自体がない
あと正しい知識を与えろと言ってるのではない
答えたくないなら「やってみろ」ではなく「教科書読め」と返せと言ってるだけ

357 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:47:50 ]
どう答えるかはその人の勝手で、お前がグダグダ言おうとかわらんけどな。
まあ、好きなだけ言っててくれw

358 名前:デフォルトの名無しさん [2008/11/05(水) 20:52:58 ]
>>355
推測なんざ聞きたかねえ
すっこんでろ

>>356
教科書じゃねえ、保証者(メーカなり規格なり)が発行する資料で確認することだろうが
だいたい回答者サマがそんなこともわかってないような 2ch で聞くことに問題がないとでも言うのか

359 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:00:47 ]
>>358
教科書を文字通りに取られたか
そこはそういったものに読み替えてくれればいいよ

で、2chで質問することを問題視する君はなんでこのスレにいるわけ?
帰れば?むしろ帰ってくれない?邪魔だから

360 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:02:18 ]
いつものageのバカじゃないか
相手しても無駄っていうかお前も邪魔だからやめろ

361 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:07:35 ]
要するにこのスレを潰したいから荒らしてるんだろ?



362 名前:デフォルトの名無しさん [2008/11/05(水) 21:12:26 ]
>>359
いーや、おまえは教科書と言った

それからあんたには邪魔かも知れないが
俺はスレタイどおり参加しているだけで荒らしているわけでもない(スレは荒れているかも知れないがな)
難癖つけられる筋合いはないので勝手にするぜ
おまえこそ正義があるなら運営にでも訴えてはどうだ、あ?

363 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:16:37 ]
printf("%d %d %d", ++i, ++i, ++i);

364 名前:355 mailto:sage [2008/11/05(水) 21:53:55 ]
>>358
すっこまねえよ。
要はお前が規格に沿った回答、または引用をすることができないから、
2chで質問することに意味がないと思いこんでるだけだろ?
お前が「やってみた?どうだった?」とかアホ面ひっさげたレスをしなければ
規格に沿った回答の密度があがるんだよ。
すっこんでろ。

365 名前:デフォルトの名無しさん [2008/11/05(水) 22:04:15 ]
>>364
>>351 をどう読めばそうなるのかは知らんし興味もないが
推測なんざ聞きたかねえ、と言ったはずだ
だからその部分に対しては答えない

すっこまねえのは確かにあんたの勝手だが
それはこちらにも言えることだ
同じ言葉を返しさえすれば痛烈だとでも思っていて自己矛盾に気づかないなら小学生なみだぜ

366 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:05:21 ]
>>365
だからすっけんどろっての

367 名前:デフォルトの名無しさん [2008/11/05(水) 22:08:21 ]
>>366
うっせえ ぼけ

368 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:18:24 ]
まだすっこんでないよな?

Cの教科書っていったらK&Rで異論ないと思うんだが、
それで何の問題があるんだ?

369 名前:デフォルトの名無しさん [2008/11/05(水) 22:23:38 ]
>>368
甘いんだよ、後出し設定なんか聞いてやらん

370 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:40:38 ]
>>369
お前教科書って聞いて何思い浮かべたの?

371 名前:368 mailto:sage [2008/11/05(水) 22:42:33 ]
後出しも何も俺>>356じゃねえよ?
寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ



372 名前:デフォルトの名無しさん [2008/11/05(水) 22:45:49 ]
で、別人のふりくらいしかすることなくなったわけか

373 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:48:16 ]
このスレには極端にレベルの低い小学生が二人いるのかな

374 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:49 ]
よそでやれ

375 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:58:36 ]
次の方どうぞ〜♪

376 名前:デフォルトの名無しさん [2008/11/05(水) 23:53:51 ]
>>316
それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。
そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。
最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。
好みだな

377 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:17 ]
確かに、構造体ん中に構造体ある時とか、長くなるね。


378 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:33 ]
複数ソースファイルがあるとき
ソースファイルその絡みがあるじゃないですか
例えばその値がどこから来たかを見つけたいとき
どうやればいいのですか。



1.c
から
10000000000000.c
くらいまであるとして

そのうちの23460001.cにある関数から
5986293.cに渡されたとしたら
わからないじゃ
ないですか

5986293.cのincludeには782365.cと23435.cしかない
というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。

379 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:30 ]
>>378
それは設計が悪くないか?

380 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:38 ]
__FILE__

381 名前:デフォルトの名無しさん [2008/11/06(木) 00:01:42 ]

ゲームに限らず、携帯電話やATMなど
「仕事」のソースは例外なく大量のファイルに分かれているのに


「この値はどこから来たのか」
「それをはじき出すものはどこにあるのか」

っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!




382 名前:デフォルトの名無しさん [2008/11/06(木) 00:04:02 ]
>>378
Java見たら泣くよ

383 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:04:39 ]
今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。
それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。

384 名前:デフォルトの名無しさん [2008/11/06(木) 00:06:47 ]
研修期間中に読んだものの中で最長の渡りが

30ファイル先

まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c .................................................


30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、
includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。
しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで
それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!!


今仕事でバリバリやってる人らはどうやって調べているの


385 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:07:21 ]
>>378
1.関数呼び出しの構造図を書く

func_a
func_b
func_c
func_d

2.データフローを書く
func_a - x ->func_b


386 名前:デフォルトの名無しさん [2008/11/06(木) 00:08:38 ]
関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・
きつい時あるね


387 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:09:43 ]
>>386
でも昔のDOSのころのようなミニマムな開発じゃなければ
そういうのはざらでしょ。

388 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:10:14 ]
保守って点から見りゃ、およそ最悪だろ。

389 名前:デフォルトの名無しさん [2008/11/06(木) 00:14:51 ]
>>386
みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑)
昔の人は英語好きだよね〜JISに対応してなかったのかね〜

390 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:18:22 ]
>>389
時代的にはこんな感じだよ。
マシンによるんじゃないかな?

www.eonet.ne.jp/~building-pc/pc/pc1985.htm


391 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:22:45 ]
とりあえずincludeで追いかけるってのはありえない
ライブラリならドキュメントがあるはずだし
ソースがあるならgrepかければ済む



392 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:05 ]
for(;;)
{
int d = 0;
(dを用いた適当な処理)
}

int d;
for(;;)
{
d = 0;
(dを用いた適当な処理)
}
を比べると上のほうがオーバヘッドが大きいでしょうか?
dはfor文内でしか利用しませんのでスコープを限定したいのですが.

393 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:14 ]
以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。
すると技術の若造が「そういう事は止めてくれ。」と言われた。
「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。

C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。

394 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:34:30 ]
>>393
ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww

395 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:35:35 ]
>>393
日本語でおk

396 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:38:36 ]
>>392
{
int d;
for(;;)
{
d = 0;
(dを用いた適当な処理)
}
}

とかは?
これってgccしかできなかったっけ?

>>393-394
意味がわからねえw

397 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:40:28 ]
メーカー製の場合、見えてはいけないものが多い。

特に地上デジタル放送関連は、結局はドライバで制御している以上、

「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。

398 名前:デフォルトの名無しさん [2008/11/06(木) 00:50:07 ]
コメントなしね〜HTMLならしかたないとこあるけどね〜


399 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:52:21 ]
>>397
外に見せる?資料と内部では違うだろ・・
内部のものまで「書かない」が徹底されてるのか?

400 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:56:22 ]
>396
VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです.

それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.

401 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:57:17 ]
>>393 ソフトさんですか。



402 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:12 ]
オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。

403 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:44 ]
for(ここにおけば?;;)

vc6だとグローバルスコープだったような気がするけど
でもそれはc++だったような期もするけど

404 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:03:51 ]
>>400
宣言文は実行ステートメントではないから、
実行時のオーバヘッドにはならないだろ。

405 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:06:48 ]
           ____
  .ni 7      /ノ   ヽ\  内部にも見せないよ
l^l | | l ,/)   / /゚ヽ  /゚ヾ\      .n  以前、それで営業がポカやらかしたし
', U ! レ' / /   ⌒   ⌒  \   l^l.| | /) 絶対に流出させられないから
/    〈 |  (____人__)  |   | U レ'//)
     ヽ\    |lr┬-l|   /  ノ    /
 /´ ̄ ̄ノ    ゙=ニ二"   \rニ     |
                      `ヽ   l


406 名前:デフォルトの名無しさん [2008/11/06(木) 01:41:40 ]
B-CAS廃止されたんじゃなかったか?

407 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:48:54 ]
まだよ

408 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:51:04 ]
>>401
妙に納得した。

>>392
そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。
スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。
# それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。

409 名前:393 mailto:sage [2008/11/06(木) 02:10:15 ]
>>397
そういうカッコいい理由ならまだいいんだがw
NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。
カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。
例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで
デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する
他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww)

>>401
昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に
似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで
ほぼ暗記してました。

410 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:19 ]
>>352
遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。
使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。

411 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:56 ]
悪いがマ板でやってくれ



412 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:14:28 ]
>>378
やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。
gdbにもあったはずなんで、大抵の環境で可能だと思う。

413 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:19:50 ]
fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
とかはいってたとして、次のファイル操作
printf("%s",fname);

if((fp = fopen(fname, "rb")) == NULL ) {
fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n");
exit(EXIT_FAILURE);
}

これをかいて実行すると開けないってエラーがでるんですけども。なぜだと
考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。
ただそれでエラーがくるのかと。3.dataはバイナリのデータです。

414 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:26:44 ]
改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ

415 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:13:23 ]
>ただそれでエラーがくるのかと
ファイルを指す文字列をどう解決するかは当然OSに依存する
あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった
それだけのことであって、そもそもCの話ではない

416 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:14:42 ]
C言語を志すならばやはりK&Rは買わないとダメでしょうか?



417 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:17:30 ]
別になくても困りはしないよ

418 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:19:39 ]
もちろんあったほうがいいけど必須ではないよ
CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う

419 名前:デフォルトの名無しさん [2008/11/06(木) 18:20:37 ]
>>416
K&R自体は買わなくても他に手はいくらでもあるが
たかが3千円弱の自己投資をためらうようならお先真っ暗だ

420 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:22:34 ]
買ったけど内容は入門書と変わらない
正直要らないよ

421 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:24:44 ]
K&Rってのは、C言語をマスターしている人間が買う入門書。

マスターしてるなら買うわけないじゃん、と思うだろうが
まさにその通り。

あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。


辞書で言うならこんな感じだな

レバレッジ
 株用語のひとつ。

リスクヘッジ
 リスクをヘッジすること。


ってな



422 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:56:30 ]
>>416
優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第
他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番
図書館で借りたって良いんだしさ
百聞は一見に如かずだよ

423 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:09 ]
>>416
そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。

424 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:41:57 ]
>>421
そんなことはない。
Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は
知らないって人向け

Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う




425 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:44:04 ]
でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない

426 名前:デフォルトの名無しさん [2008/11/06(木) 22:04:00 ]
「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?

427 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:00:10 ]
趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね?
おすすめの入門書、サイトがありましたら教えて下さい。

428 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:04:30 ]
>>427
いきなりCだなんて。えっち。
それはともかく、おすすめしない。

429 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:12:41 ]

time_t tp;
time(&tp);
sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp));

↑こんな感じのを

sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp));

↑こんな感じで一行で書きたいんだけど。

もちろん、この書き方が駄目なのは分かるんだけど。

関数の戻り値のアドレスを渡したいんだよねー



430 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:13:07 ]
はじめてのC

431 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:14:31 ]
>>429 上のもダメですが



432 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:16:55 ]
>>429
なんでこだわるの?



433 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:18:29 ]
つーか、それstrftime()の間違いだろ。

434 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:51:25 ]
>>427
 C言語に興味があるのならC言語にすればよい。
入門書は、本屋に置いてあるのでいいと思うよ。
例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。
ああ、でも『はじめての~』は買わない方がいいと思う。
厨房のとき読んでコードギアスの2ndOPになった。
あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。
 ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。
手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。

 本気でC言語を使って思い通りにプログラミングできるようになりたければ、
他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。
そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。
1冊読んでいい気になるなよ、そこの自称中級者。

 うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。

435 名前:デフォルトの名無しさん [2008/11/07(金) 00:15:14 ]
猫Cのこのページ
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm

のPGMをコーディングして実行したんだけど
結果が
「time1=1225984391 time2=0」となってしまう。

printf ("time2=%ld\n",t2)
と単独で出力すればちゃんと「time2=1225984392」になる。

何が間違ってるんでしょうか

436 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:16:03 ]
実行環境はMicrosoft Visual C++ 2008 Express Editionの
Win32 コンソールアプリケーションです

437 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:35:33 ]
TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません
どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?

438 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:38:07 ]
ほれ
x68000.q-e-d.net/~68user/net/


439 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:21:40 ]
>>435
%ld に対応するのは long 型であって、time_t 型ではありません。
long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、
あらゆる環境で常にそれが成立するわけではありません。

440 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:57:52 ]
ネコなんかで勉強しようなんてするから嵌まるんだ。
long(t1)とでもすれば"%ld"で出力されるだろ。

441 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:14:22 ]
>>440
やってみたけどダメです。。。

じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。
ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。

なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう



442 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:41:07 ]
>>441
64bit環境?
%ld のかわりに、%I64d でやるとどうなる?

443 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:54:50 ]
って環境は>>436
time_tは
typedef __int64 __time64_t; /* 64-bit time value */
typedef __time64_t time_t; /* time value */
だから64bit整数だな。%I64dか%lldで。

444 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:57:58 ]
つーか、longが64bitじゃないんだから、>>440でいいはずだな。
>>441はなにをやってみたんだ?
printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?

445 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:07:02 ]
>>444
その通りやってみたんですがダメですね・・・

printf ("time2=%ld\n",t2)

だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。

なんで0が出力されるのか、全く見当が付きません・・・

446 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:12:17 ]
本についてるプログラム(C言語を習得する類の本ではありません)で
ただのint型変数にファイルから100000という値を読み込んでる
ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?

447 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:13:42 ]
>>446
どのあたりが疑問なんだ?

448 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:21:58 ]
>>447
int型で表せる値の範囲についてです。
環境によるかもしれませんが
参考書には-32767〜32767と載っていたもので

449 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:23:22 ]
>>445
えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。
これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。
なんで2番目が0になるかわかったろ?

450 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:17 ]
>>445
>printf ("time2=%ld\n",t2)
この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから
たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。

451 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:44 ]
>>448
それは少し古い時代のint型だな
今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い




452 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:45 ]
intが16ビットなんて8ビットパソコンの時代じゃないか(80年代)
参考書が古すぎ

453 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:35:38 ]
>>451
そうですか、分かりました。
どうもありがとうございます。


454 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:52:02 ]
>>449-450

ありがとうございます。上手くいきました。

t1-long(t2) ってやってました。>>445を読むまで理屈が判りませんでした。

VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね

455 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:56:54 ]
× >>445を読むまで理屈が判りませんでした。
○ >>449を読むまで理屈が判りませんでした。

安価間違えたorz

456 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:00:00 ]
>>454
long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。
t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、
time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。
引き算する場合はlong(t1 - t2)としなくては意味がない。

そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、
32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。

尚、time_t型同士の引き算は本来なら、difftime()を使うべき。

457 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:09:00 ]
>>456
結局のところ、printf("%g\n", difftime(t1, t2))ってことね。
# だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。

458 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:34:56 ]
対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?

459 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:48:52 ]
同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・

460 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:07:30 ]
>>427
自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う

お互い頑張りましょう。

461 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:13:02 ]
>>446
コードそのものは正しい
16bit環境には対応していないというだけ



462 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:23:20 ]
>>460
俺も昔、苦しんで覚えたなw
血便、下血、終電、睡眠デバッグ・・・

463 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:32:19 ]
>>460
「苦しんで覚えるC言語」リンク先のsetjump/longjump
>プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。
ワラタ
後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、
誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。

464 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:39:18 ]
longjumpが悪だとは決して思わないけれど
忌み嫌われる程度には危険で使いにくいと思う

465 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:41:11 ]
海の怖さを知って初めて一人前の猟師
そういうことさ

466 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:44:09 ]
コードの海は俺の海

467 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:51:00 ]
そして怖い膿を知った

468 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:57:00 ]
まあデストラクタが呼ばれないから実際使えなかったわな。

469 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:26:41 ]



「今は大抵○バイト」



一番ダメな考え方

こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる


「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」




470 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:30:46 ]
分かったからお前が解説してやってくれ

471 名前:デフォルトの名無しさん [2008/11/07(金) 18:47:01 ]
>>468
おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?



472 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:17:37 ]
関数にn次の2次元配列を渡す場合はどう書けばいいですか?

double data[n][n]とかいう配列です


473 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:08 ]
void func(double **data)

474 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:32:14 ]
>>472
void hoge(double *pData)
とか
void hoge(double Data[n][n])
じゃだめ?

475 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:35:34 ]
>>473
渡すときは func(data)ですか?

476 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:38:37 ]
ああ間違えた。>>473が正しい。
ポインタじゃなくて実体そのものをコピーしていいなら俺のでもいい・・・はず・・・

pc11.2ch.net/test/read.cgi/tech/1225320579/
の379の質問か。


477 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:15 ]
>>475
そう

>>476
間違っています
勉強しなおしましょう

478 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:44 ]
>>476
>>475+>>473だとコンパイルがとおらないんです

479 名前:デフォルトの名無しさん [2008/11/07(金) 19:43:19 ]
>>473 であるべき、と強硬に言い張る奴が昔いた
一生懸命 malloc してたw

480 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:44:01 ]
>>473は大嘘
普通は func(double data[][n])

481 名前:476 mailto:sage [2008/11/07(金) 19:45:25 ]
>>477
あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか?
以下のソースで動きました。

void test(int data[2][2])
{
printf("%d\n", data[0][0]);
printf("%d\n", data[0][1]);
printf("%d\n", data[1][0]);
printf("%d\n", data[1][1]);
}
int main(int argc, char *argv[])
{
int data[2][2] = {0,1,2,3};
test(data);

return(0);
}



482 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:48:29 ]
void test(int data[][2])
{
printf("%d\n", data[0][0]);
printf("%d\n", data[0][1]);
printf("%d\n", data[1][0]);
printf("%d\n", data[1][1]);
}
int main(int argc, char *argv[])
{
int data[2][2] = {0,1,2,3};
test(data);

return(0);
}

これでいい

483 名前:476 [2008/11/07(金) 19:50:57 ]
>>482
関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか?
それとも別の理由?

484 名前:デフォルトの名無しさん [2008/11/07(金) 19:50:58 ]
K&R で書くなら ANSI 混ぜるなよ

485 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:56:33 ]
>>472
関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。
double data[X][Y] という配列があるとき、data は double の配列の配列であり、
これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。
実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。
だから関数の仮引数の宣言は以下のようになる。

int func(double (*data)[Y]) …@

ただし、これは次のように書いてもいい。

int func(double data[X][Y]) …A
int func(double data[][Y])  …B

Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。
そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、
その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。
ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。

486 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:59:26 ]
>>483
最初の添字が無意味だから
したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる

487 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:02:33 ]
配列を値渡ししようとしてもポインタの値渡しになるから

値そのものは渡せない

488 名前:476 [2008/11/07(金) 20:09:51 ]
>>485-487
丁寧な説明ありがとうございます。
おかげでポインタの理解が深まりました。
人の質問に答えて見るもんですね。
同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。
試してみたらアドレス一緒でビックリ!
でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか?

typedef struct{
int data1;
int data2;
}TEST_TABLE;

void test(TEST_TABLE data[2])
{
printf("%d\n", data[0].data1);
printf("%d\n", data[0].data2);
printf("%d\n", data[1].data1);
printf("%d\n", data[1].data2);
}

int main(int argc, char *argv[])
{
TEST_TABLE data[2] = {0,1,2,3};

test(data);
return(0);
}

489 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:23:24 ]
まったく理解できてねぇwwwwwww

490 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:40:40 ]
>>429
これでいいじゃない。
struct tm *v_localtime(time_t t)
{
return localtime(&t);
}

strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));


491 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:41:33 ]
>>488
dataがポインタだから
data[0]は構造体自体



492 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:42:27 ]
>>488
[]演算子に*の意味が入っているから。

493 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:03:43 ]
1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。
2 data[0] 先頭要素。
3 &data[0] 先頭要素のポインタ。
4 data だけ書いたら↑3と同じ。
5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。
6 TEST_TABLE *p = data; ↑5 と同じ。
7 p->data1 ポインタを使って要素へアクセス。
8 data->data1 ↑6,7 から、これは 7 と等価。
9 data と p は等価だから、data[0] は p[0] と等価。
10 つまり *p は p[0]。
11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。
12 (*data).data1 上と同じ。
13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。
14 data[1] 二番目の要素。
15 &data[1] 二番目の要素のポインタ
16 以下 data[0] と同じ。
17 data[2] 三番目の要素。
18 以下↑と同じ。
19 p = dataのとき、 data[1] は *(p + 1) と同じ。
20 つまり、&data[1] は p + 1
21 data[1] は data[0] の後ろにくっついてるわけだから
22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。
23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。
24 等価等価言ってきたけど、 p++ はできて、data++ はできない。

25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。

494 名前:476 mailto:sage [2008/11/07(金) 21:11:52 ]
>>491-493
またまた詳しい説明、ありがとうございました。
ポインタに関して理解していないところの多さを感じました。
まだまだ勉強不足ですね。
さて、名無しに戻って元々したかった質問をします。

495 名前:デフォルトの名無しさん [2008/11/07(金) 21:16:40 ]
VC++でファイルからデータを読み込み分解するプログラムを作りたいです。
ファイルには
hoge:aaa\r\n
hage:bbb\r\n
のように記述されていて、
hoge:に対する記述は
hoge:aaa\r\n
hoge:bbbb;012\r\n
と";"の後にもデータが続いている場合があります。
aaaやbbbbの文字数は一定ではないです。
これを読み出すときに、
sscanf(bBuf,"hoge: %s",&data[HOGE][0]);
としているのですが、";"以降がdataに入りません。
どうしたらいいでしょうか?

496 名前:デフォルトの名無しさん [2008/11/07(金) 21:33:13 ]
>>493
> 3 &data[0] 先頭要素のポインタ。
> 4 data だけ書いたら↑3と同じ。

ダウト
sizeof &data[0] != sizeof data

497 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:46:16 ]
>>496
それは例外事項

data だけなら先頭要素のアドレスで正しい

498 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:49:47 ]
ん?

499 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:52:25 ]
不毛だ

500 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:58:46 ]
うるせーな
気にしてんだよ

501 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:18:19 ]
data と p が等価で、 sizeof data が例外なのか。
p = data ができるのが例外なのか。








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<118KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef