C言語なら俺に聞け(入門篇) Part 18at TECH
C言語なら俺に聞け(入門篇) Part 18 - 暇つぶし2ch147:デフォルトの名無しさん
07/08/20 23:39:51
>>145
コードを大量に書いてる人ってだれ?

148:デフォルトの名無しさん
07/08/20 23:54:27
読みやすさを考えたらコードを大量に書くとか・・・

149:デフォルトの名無しさん
07/08/20 23:56:52
>>147
linux書いてる人とか、apache書いてる人とか、postgres書いてる人とか、その他いろいろ。

150:デフォルトの名無しさん
07/08/21 00:01:02
「一行でも{}をつけた方が良いか」とかの、
くだらない事を質問するような奴なら、つけた方が良いと思う。
俺はつけないが

151:デフォルトの名無しさん
07/08/21 00:42:31
>>149
その人たちは本当に読みやすさのために省略してるのか?

152:デフォルトの名無しさん
07/08/21 00:44:55
そもそも「コードを大量に書く人」のソースをlinuxやapache書いてる人として
その人たちの中じゃこっち派が多いよってのは無理があるだろう。
そこらへんのプログラマだって大量にコードは書いてる。

153:デフォルトの名無しさん
07/08/21 00:45:55
うぅ、日本語が変だ・・・orz

154:デフォルトの名無しさん
07/08/21 05:56:54
「if」って打ったらエディタが
if () {
}
って勝手に出してくる(ように設定している)ので、
消すのが面倒だし害はないし後々の面倒を予防できるのでそのまんまにしてまーす。

155:デフォルトの名無しさん
07/08/21 06:49:28
そういうのって()の中にカーソル移動すんの面倒じゃないの?

156:デフォルトの名無しさん
07/08/21 07:51:06
>>135 つけたほうがいいっぽいですね^^

質問内容は釣ネタに見えますがまだレスが流れている様ですので

プログラムは評価を受けるとかレビューとかされる場合があり
必ず中括弧'{}'で括るケースでも例えば1行しかないのに何でわざわざ中括弧で括るの?と質問された時
何と答えるかです

自分なりに定性的定量的な論旨展開で結論を出すか
ご存知かと思いますが世の中にあるコード標準とか規約とかを引用するかですね
例えば以下リンクが良く纏まっていますのでお勧めですが
URLリンク(www.literateprogramming.com)
次レスに続く

157:wolf ◆8VH3XAqjlU
07/08/21 07:51:49
>>135 つけたほうがいいっぽいですね^^
続き

中括弧で括るケースについての記述は
2.C++ Coding Standard
└─Usage Of The Implementation Language
└─Control Structures
└─Branching
└─if ... else statement

に有りますが中括弧だけでなくインデントや比較代入記号に関しても検討して下さい

if(ia==0){
printf("HelloWorld\n");
}

僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n");
}

158:デフォルトの名無しさん
07/08/21 07:54:31
定量的な論旨展開ってなんだ?

159:デフォルトの名無しさん
07/08/21 08:08:03
いきなり書き込まれてしまいまして訂正かねて

>>135 つけたほうがいいっぽいですね^^
続き

if(ia==0){
printf("HelloWorld\n");
}

僕ならこう書きます
if(0==ia)
{
  printf("HelloWorld\n"); <---- 訂正
}

>>158 定量的な論旨展開ってなんだ?
あまり即答はしないほうですがたまにはソフトウエア工学的な
意見展開もいいかもしれませんので
例えば
ひと纏まりしたコードは1画面内に収まったほうがreadabilityが良いですから


160:デフォルトの名無しさん
07/08/21 08:12:00
日本語おかしい

161:デフォルトの名無しさん
07/08/21 08:19:17
「たとえば」がなにとたとえてるのかさっぱりわかりませんが。

162:デフォルトの名無しさん
07/08/21 08:23:40
比較で定数を左にもってくるというテクニックも、警告が出ないよう
にコーディングするって当たり前のことをしてれば必要ないですね。
変に技巧にはしるようなことはやめて、素直に書きましょう。


163:デフォルトの名無しさん
07/08/21 08:24:48
定量的といいつつ、定量的なことは一切書いてない件。

164:デフォルトの名無しさん
07/08/21 08:26:06
そもそも論旨は展開するようなもんじゃない

165:デフォルトの名無しさん
07/08/21 08:27:25
本当に釣りネタに見えるなぁ・・・

166:デフォルトの名無しさん
07/08/21 08:58:16
インデント論争に発展するのだけはやめような

167:デフォルトの名無しさん
07/08/21 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ

168:デフォルトの名無しさん
07/08/21 10:25:24
>>151
そういう人たちは複雑になるんで、やはり規則性を持った記述をしているため
書いたり書かなかったりみたいな、ことはしてないはず。

169:デフォルトの名無しさん
07/08/21 10:41:52
>>168
書いたり書かなかったりしていますが何か。
// 書かないケース
if (foo) bar();
// 書くケース
if (foo) {
  bar();
}

170:デフォルトの名無しさん
07/08/21 10:47:34
scanfだと入力後エンター押す必要がありますが
画面に入力した瞬間から反映される関数ってありますか?

171:デフォルトの名無しさん
07/08/21 10:50:15
>>170
標準ではありません。環境依存になりますが、例えばcursesなどのライブラリを使えばできないわけではありません。

172:デフォルトの名無しさん
07/08/21 10:51:10
あるいは、{ } が不要な1文のみの場合、
if() の後ろにそのまま続けてifと同じ行に書いていたり。
だから読みづらいだの主観的な意見はナンセンス。
自分が思うとおりに動作するように記述できて、コンパイルが通れば良し。

173:デフォルトの名無しさん
07/08/21 11:04:53
読みづらさをないがしろにする意見はナンセンス

174:デフォルトの名無しさん
07/08/21 11:08:07
読みづらいなんてのは主観なんだから放っておけばいいさ。
読みにくいという指摘なら、話を聞かないでもないが。

175:デフォルトの名無しさん
07/08/21 11:12:10
読みにくさは主観じゃないの?

176:デフォルトの名無しさん
07/08/21 11:14:40
客観的立場に立とうとした表現だね。定量的ではないが。

177:デフォルトの名無しさん
07/08/21 11:14:52
誘導

コーディングトラブルの約70%はif文などでの{}省略
スレリンク(tech板)

178:デフォルトの名無しさん
07/08/21 11:16:12
>>173
だからその読みづらいって主観が個人的なものでナンセンスだって言っているんだが?
人それぞれで、括弧があれば読みづらい、なければ読みづらいとか言われても
んじゃどっちだよ?って争いになるから、括弧の必要性を理解した上で
自分が思う通りに処理するソースがコンパイラに通ればそれで良いだっつってんだよ、バカかてめぇはw

179:デフォルトの名無しさん
07/08/21 11:22:53
括弧がなくても通るからって理由でつけるつけないをわざわざ
一個人の読みやすさという客観的ではない曖昧な基準で話を進められても困るだろ。
とりあえず、オープンソースのように、他者と交互にやりとりしている人たちのソースを見て
参考にするのも良いだろ。自分だけが編集するソースならどっちをとろうが個人の自由。

180:デフォルトの名無しさん
07/08/21 11:24:39
どっちでもいいけどソース内で統一されてれば読みやすい

181:デフォルトの名無しさん
07/08/21 12:05:16
>>171さん
例を教えてください
お願いします

182:デフォルトの名無しさん
07/08/21 12:28:52
>>181
例としてcursesライブラリを挙げていますが。

183:デフォルトの名無しさん
07/08/21 12:58:43
ifの括弧についてもれがまとめるからもうこの話題はおわろうぜ。

[結論]
ifに括弧はつけなさい。
[理由]
つけてもつけなくてもいい文法が問題だけど
このスレだけでも大半の人間がどちらでもよい、又はつけたほうがいい
というんだからつけなさいYO!

可読性なんてものは人それぞれ違うんだから議論自体が無意味。

もし{}つけたら効率が落ちるんなら
あんたのプログラムif文使いすぎ。作り直しなさい

{}つけるのにそんな面倒か?
なんでそんなにつけるのに反発するんだ?

YOU!つけちゃいなYO

以上まとめでした

184:デフォルトの名無しさん
07/08/21 13:08:18
if(bFlag) i++;
これとか括弧付けるだけ無駄だろ

185:デフォルトの名無しさん
07/08/21 13:11:48
んじゃ、1行纏め。
・迷ったらつけとけ。つけないなら理論武装しておけ。

186:デフォルトの名無しさん
07/08/21 13:15:49
>>185
先生ノ >>184に「なんで無駄な{}つけてんだ!」ってからまれたら
どういう理論武装しておけばいいですか?

187:デフォルトの名無しさん
07/08/21 13:35:18
>>186
日本語読めますか? >185には「つけないなら」と書いてあるのですが。

188:デフォルトの名無しさん
07/08/21 13:37:10
>>187
じゃあ「つけないなら」どういう理論武装しておけばいいですか?

189:デフォルトの名無しさん
07/08/21 13:38:48
俺は括弧もゴムも付けない派

190:デフォルトの名無しさん
07/08/21 13:39:34
武装できるような理論があればそもそも論争は起きん

191:デフォルトの名無しさん
07/08/21 13:43:31
理論武装しないならつけとけw

192:デフォルトの名無しさん
07/08/21 13:44:57
なぜ?

193:デフォルトの名無しさん
07/08/21 14:16:00
>>184 誰がそういうのにも必ず付けろって言った?だからそういう議論は
相手を罵倒したり屁理屈が横行するからやめろつってんのに、うざっ
所詮夏厨か

194:デフォルトの名無しさん
07/08/21 14:35:00
>>182さん
ぐぐったら理解できました
ありがとうございました

195:デフォルトの名無しさん
07/08/21 14:42:11
なんで>181は自分の環境を書こうとしないのだろう……

196:デフォルトの名無しさん
07/08/21 16:20:33
>>195
国家機密なんです(><)

197:デフォルトの名無しさん
07/08/21 17:42:35
Windows XPのGUIのプログラムをc言語で作りたいのですがどうすればいいですか?


198:デフォルトの名無しさん
07/08/21 17:44:55
>>197
教えたいのはやまやまですが国家機密なんです。

199:デフォルトの名無しさん
07/08/21 17:45:06
>>197
どう、とは?
環境の話なのか、前提知識の話なのか、
それともそれらはクリアしてて、コーディングの話なのか。

200:デフォルトの名無しさん
07/08/21 18:15:47
>>197
まず、Windows NT系の入ったパソコンを用意します。

201:デフォルトの名無しさん
07/08/21 18:42:03
次に、VCを違法コピーします。

202:デフォルトの名無しさん
07/08/21 18:43:43
>>155
もちろんエディタが()の中にカーソルを勝手に移動させまーす。
あと、そこに加えて{}の中にマークをつけるので、
()と{}の中にキー一発で飛べるようにしてまーす。

203:197
07/08/21 18:52:30
>>198
え、そうなんですか?私は国家には忠誠を誓っているものですから安心しておしえてください。

>>199
あ、すいません、前提知識ですね。
APIとかをOSの仕組みなどを勉強すればいいのでしょうか?
APIの実装方法やアルゴリズムなどの実装がなんか漠然としてしまって理解できません、

>>200
パソコンは、Windows XPなのでNT系だと思うので多分大丈夫だと思います。

>>201
VC2003なんとかというコンパイラとボーランドの無料のコンパイラをインストールしてあります。

204:デフォルトの名無しさん
07/08/21 19:00:54
猫でもわかるでも読んどけ

205:デフォルトの名無しさん
07/08/21 19:06:18
>>203
VC2003なんとかというコンパイラを使います。

ひとりでGUIを勉強するときは、チュートリアルがないと無理。
サンプルのたくさん載った参考書が必要。

Windowsアプリの作成は理解するというより慣れるです。
理解しようとすると挫折します。サンプルを入力、コンパイルして慣れてください。

206:デフォルトの名無しさん
07/08/21 19:10:37
>>203
まさかノってくれるとは思わなんだ。

つかGUIプログラミングはせめてC++とMFCでする気は無いか?
もっと簡単にするならC#という言語を使う手もある。
C言語でやるのは面倒だが、何か理由があっての事か?

207:デフォルトの名無しさん
07/08/21 19:31:01
>>203
・Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う
URLリンク(www.microsoft.com)

・Win32 API入門
URLリンク(wisdom.sakura.ne.jp)

208:デフォルトの名無しさん
07/08/21 21:03:04
>>179
コーディングスタイルって、経験が足らないヤツが頭で考えたっていびつになるんだよな。
実際コードをたくさん書いて、世間で実際に評価されてる人のを参考にしたほうがいいよね。


209:デフォルトの名無しさん
07/08/21 22:55:29
括弧があってもなくても、可読性に影響がでないくらいシンプルな記述を希望します。
COBOLを連想させるような200行以上もある関数はヤメレ

210:デフォルトの名無しさん
07/08/21 23:13:44
じゃあ俺はFORTRANを連想させるようなgoto使いまくりの関数にするぜ。

211:デフォルトの名無しさん
07/08/21 23:15:33
>>209
同感です。if文だけに着目するよりも、前後の文を含めて、
そして全体を通してシンプルであることが望ましいですね。
適当に空行を入れるだけでも、それなりに変わりますからね。

212:デフォルトの名無しさん
07/08/21 23:24:05
正直、こんな書き方はやめて欲しい。
--
double sum = func(
          sx[ox]
          ,cx[ox]
          ,sy[oy]
          ,cy[oy]
          ,xDim
          ,yDim
          ,wr
          ,wi
     );

213:デフォルトの名無しさん
07/08/21 23:33:15
>>212
1行にしてみました。どうでしょう?
double sum = func(sx[ox], cx[ox], sy[oy], cy[oy], xDim, yDim, wr, wi);

それとも構造体にまとめて、ポインタ渡しが良いですか?
具体的に希望があればどうぞ。

214:212
07/08/21 23:38:29
>>213
いやまぁ、とっくに整形済みだけどね。

215:デフォルトの名無しさん
07/08/21 23:52:40
>>213
全部グローバル変数で渡して引数はなしの方向で

216:デフォルトの名無しさん
07/08/22 00:04:31
手動インライン展開で

217:デフォルトの名無しさん
07/08/22 12:45:29
>>212
コーディング規約でそのスタイルを規定しているところもある。
これだと、引数一つ一つにコメントがつけられるという利点がある。

コーディングスタイルはそれぞれ良いところもあれば、悪いところもあるのが普通で、
プロジェクトあるいは会社でコーディングスタイルが統一されていることが大事。

218:デフォルトの名無しさん
07/08/22 12:56:14
>>217
カンマを行頭に持っていくのは規約以前の問題。
英語圏の人が見たら発狂するぞ。


219:デフォルトの名無しさん
07/08/22 13:16:24
>>215
悪質にも程があるわ

220:デフォルトの名無しさん
07/08/22 13:58:01
カンマ行頭はSQLじゃよくやるけどな

221:デフォルトの名無しさん
07/08/22 14:19:32
gets関数やscanf関数は想定外の入力をされて変な挙動をする可能性があるので使わない方がいいと
聞いたのですが、ではどういう風にすればいいのでしょうか、実際のプログラムではどうしているか教えてください。

222:デフォルトの名無しさん
07/08/22 14:23:44
>>221

>>52参照。
getsは問題がないだろう。

223:221
07/08/22 14:29:44
>>222
gets関数はバッファオーバーランの危険性がありませんか?
例えば、char buffer[1024] と宣言した場合に1024バイトであるという情報を
gets関数に伝える手段がないと思うのですが、、、

224:デフォルトの名無しさん
07/08/22 14:40:39
test

225:デフォルトの名無しさん
07/08/22 14:41:42
>>223
fgets

226:デフォルトの名無しさん
07/08/22 14:51:24
>>222 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う

227:デフォルトの名無しさん
07/08/22 14:53:32
ずっと居る奴も痛いがな

228:デフォルトの名無しさん
07/08/22 15:11:44
gets なんて捨てプログラムでしか使えねえ

229:デフォルトの名無しさん
07/08/22 15:13:18
捨てプログラムでは使う

230:デフォルトの名無しさん
07/08/22 15:14:00
>>223
入力可能な最大文字数を超えるサイズののバッファを確保しておけばいいだけじゃん。

231:デフォルトの名無しさん
07/08/22 15:21:56
>>230 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う

232:デフォルトの名無しさん
07/08/22 15:27:17
>>231 getsに関する君の考えは?

233:デフォルトの名無しさん
07/08/22 15:30:33
>>232
getsに対する俺の考えなんてどーでも良い。存在そのものが問題視されているのは
とっくの昔に知れ渡っていること。それに関する文献を自分で調べな。この板に
一定の期間来て色々と議論を見てきた人なら、まず知っているよ。そう、そんなのは使わないのが鉄則。

234:デフォルトの名無しさん
07/08/22 15:31:31
>>233 だから、それをここで君の言葉でいいなさいよ。

235:デフォルト名無しさん
07/08/22 15:37:29
「DOS窓を開く」を説明してください。

236:デフォルトの名無しさん
07/08/22 15:38:14
>>233
知らないならレスしないでください!

237:デフォルトの名無しさん
07/08/22 15:40:18
セキュリティに関しても問題とされるバッファオーバーラン、固有の環境とか仕様で
対処すりゃみたいなことを言わず、プログラム側でしっかり対処すること。
とにかく、getsだけはありえん。

238:デフォルトの名無しさん
07/08/22 15:41:37
>>235
これくらいは理解してみて
URLリンク(ykr414.com)

239:デフォルトの名無しさん
07/08/22 15:42:40
234 名前:デフォルトの名無しさん 投稿日:2007/08/22(水) 15:31:31
>>233 だから、それをここで君の言葉でいいなさいよ。

236 名前:デフォルトの名無しさん 投稿日:2007/08/22(水) 15:38:14
>>233
知らないならレスしないでください!

↑なんだこいつ?うざすぎ。説明してもらえなきゃ相手が理解していないってことになるなら
そう思ってろ。すでに説明は済んでいるのにな。痛すぎ。お前みたいな奴が質問に答えるのも
問題があるだろ。とっとと失せな、夏厨。

240:デフォルトの名無しさん
07/08/22 15:44:14
>>239
知らないならレスしないでください!

241:デフォルトの名無しさん
07/08/22 15:44:55
入力は何もプログラムを起動してユーザがキーボードで文字を入力する以外にも
ファイルからリダイレクトってのもあるし、データを受ける側が用意した記憶領域を
超えて入力を受け付けてしまうことなんて考えたらキリがないが、そういうのも含めて
getsだけはありえん。使った時点でアホだと思われるぞ。

242:234
07/08/22 15:48:10
gets関数は>>223のいうとおりバッファオーバーランの危険性がある。
fgets関数と違ってgets関数の引数にはバッファのサイズの引数がないからだ。

でも、それは>>230のいうとおりで、想定最大入力文字数のバッファを用意しておけば
それですむはずだ。

プログラムを作るときは、入力データの種類やサイズの範囲、誤動作の許容レベル
というものがあるはずで、自分または身内が使う簡単なテストプログラム程度のもの
であればコンソール入力のバッファをchar buf[1000];ととってもなんら問題がないと思われる。

243:デフォルトの名無しさん
07/08/22 15:50:08
URLリンク(ja.wikipedia.org)
問題点のヒントを出しても調べようとしないのか。頼む、お前みたいな無知が
生半可な浅はかな知識でいい加減な回答をするのは迷惑なんで黙っていてくれ

244:デフォルトの名無しさん
07/08/22 15:54:19
>>243
知らないならレスしないでください!

245:デフォルトの名無しさん
07/08/22 15:56:45
gets を使うことでバッファオーバフローのサンプルコードを出せる
反面教師のようなところが利点

#include<stdio.h>

int main(void){
int a=3;
char buf[8];
int b=5;
int diffa, diffb, diff=-1;
int i;

diffa=(char*)&a-buf;
diffb=(char*)&b-buf;
if(diffa>0 && diffa<50) diff=diffa;
if(diff>diffb && diffb>0 && diffb<50) diff=diffb;
if(diff<0) return 0;

printf("a=%d b=%d\n", a, b);
printf("Input next string\n");
for(i=0;i<diff;i++) putchar('*');
printf("x\n");
gets(buf);

printf("a=%d b=%d\n", a, b);

return 0;
}

246:デフォルトの名無しさん
07/08/22 16:07:32
getsでOKかNGかは作成するアプリのバッファオーバーランの例外処理の要求レベルによるだろう。
業務で使用するものなら、getsは使わないほうが望ましい。fgetsを使う。

テストプログラムや身内で使うものならgetsも可。
ただし、その場合でもバッファは「十分なサイズ」のものを用意しておくこと。

ということかな?



247:デフォルトの名無しさん
07/08/22 16:08:42
うん

248:デフォルトの名無しさん
07/08/22 17:19:09
バッファオーバーフローを利用したコードインジェクションの例を書こうと思ったが、
>>245 みたいに広い範囲で使えるソースを書くのって難しいね

249:デフォルト名無しさん
07/08/22 17:43:25
>238 arigato mucho obrigado

250:デフォルトの名無しさん
07/08/22 18:10:52
相変わらずおまいら gets 好きだね。
飽きないね。

251:デフォルトの名無しさん
07/08/22 18:35:48
gcc@linuxなのですが、
a というプログラム(プロセス)から b を必要に応じて起動し
(aはbを起動した後引き続き起動し続ける)ようにしたいのですが、
どうやるのが正しいのでしょうか?

今は、
a側で

pid = fork();
if (pid==0) execv(b);

のようにしているのですが、このやり方であってます?

252:デフォルトの名無しさん
07/08/22 20:06:36
>>244
Linux Programmer's Manualには「gets()は絶対に使用してはならない。」と書かれている

253:デフォルトの名無しさん
07/08/22 20:07:03
教科書を終わったばかりでscanf()とか使いまくりなんだけど、
そういうやらないほうがいいマナーがまとまってる解説サイトはないですか


254:デフォルトの名無しさん
07/08/22 20:15:25
少し古い気もするけど、C FAQ。
URLリンク(www.kouno.jp)

255:デフォルトの名無しさん
07/08/22 20:18:37
>>246 みたいなのがいるところをみると、やはり日ごろ来ていない夏厨なんだなぁ~って思う


256:デフォルトの名無しさん
07/08/22 20:38:43
>>252
捨てプログラムくらいならいいだろー

257:デフォルトの名無しさん
07/08/22 20:38:50
お前きもいよ

258:デフォルトの名無しさん
07/08/22 21:09:06
>>256
そういう話をしたらキリがないだろ。だったら話に入ってくるなよ。
なんでお前の個人的な都合を受け付ける話題になってんだ?
頼むからお前みたいな自分勝手なことしかいえない奴は大勢とやりとりする
場での議論には入ってこないでくれ。それからお前は二度とここで質問に回答するな。

259:デフォルトの名無しさん
07/08/22 21:10:12
>>256 こいつダメだ。「何が問題」とされているのか分かってないのか?
そう思うなら自分だけが扱うソースでは使えば良いだろ。正式なものに書き換えるときに
わざわざgetsの部分を探して仕様を変更して書き直してたらそれこそ手間が掛かるだろ。

260:デフォルトの名無しさん
07/08/22 21:12:11
>>256
確かにお前みたいな奴が作るプログラムなんて、他の人に使わせないだろうから良いけどさ。
getsを使った入力を受け付けるプログラムが、予期せぬ状況下でバッファオーバーランをして
OSの動作にまで何かトラブルを起こすようなら話にならんのだよ。そういうことも考えて
より精巧なプログラムを作れないようなら、お前はプログラミングには向いてない。
今すぐ将来の進路を変更した方が良いよ。

261:デフォルトの名無しさん
07/08/22 21:13:01
>>256
いいですよ^^

262:デフォルトの名無しさん
07/08/22 21:15:45
お前らきもいよ

263:デフォルトの名無しさん
07/08/22 21:29:42
>>258-260
同じ人ですか?

264:デフォルトの名無しさん
07/08/22 21:32:43
>>256 は今、布団の中で泣きながらダンディ坂野が24時間テレビでやっていた
ゲッツ1万回チャレンジを思い出しているに違いない。

265:デフォルトの名無しさん
07/08/22 21:45:13
捨てプログラムのはずなだったのに、
なぜか他人が使っているという不思議な事態も想定すべき。

266:デフォルトの名無しさん
07/08/22 21:46:38
盲目的に使っちゃいけない、と思い込む方が楽だからな
自分で判断しないから

信号も赤なら渡らない、と決め込んで
青なら安全確認もろくにしないで事故に会うタイプだな

267:デフォルトの名無しさん
07/08/22 21:56:23
>>264
余計泣けるじゃないか
虚しさに

268:デフォルトの名無しさん
07/08/22 22:01:58
>>265
> なぜか他人が使っている
ないない、お前日本語が理解できないアホだろ。だから議論に入ってくるなっつってんだが?
言葉以前に現状すら理解できんだろ。よく読め、アホ。

>>260
> 他の人に使わせないだろうから良いけどさ。
だから捨てなんだろ?getsを使ったプログラムを他人に使わせるなんて当然迷惑だ。

269:デフォルトの名無しさん
07/08/22 22:15:12
>>268
何をそんなに興奮してるんですか?


270:デフォルトの名無しさん
07/08/22 22:16:24
自分も意見が言える話題になって嬉しいんだよ

271:デフォルトの名無しさん
07/08/22 22:26:26
こんなの拾った

167 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/21(火) 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ

272:デフォルトの名無しさん
07/08/22 22:29:37
拾うな
捨てとけ

273:デフォルトの名無しさん
07/08/22 22:33:11
#define mygets(s) fgets((s), sizeof (s), stdin)
sが配列型でなかったら死亡。
C++ならもっと頑張れるが、std::string使えという罠。

274:デフォルトの名無しさん
07/08/22 22:38:26
>>167
> むしろ必要性について知らない方がダメ 

もっともらしい理屈がいくつが挙がってるけど、そのスタイルを採用してないプロダクツでも
世間で評価されてるような実績をあげてるってことは、それらは机上の空論ってことだろ。
センスも見識もない人間が頭の中だけで考えたスタイルなんて、そういうことになりがち。

と遅レスしてみる。



275:デフォルトの名無しさん
07/08/22 22:50:02
個人的な主観や特定の条件を述べられても結論が出ないんで、話を根本に戻すと

>>221 の質問は
> ではどういう風にすればいいのでしょうか

これに対して十分な領域を確保しとけってのは不適切。
なぜなら、確保した領域を 超えて受け付けることが出来る仕様 になっている以上
getsを使ってたら対処にならないんだよ。
その問題点の解決の対処をすることが >>221 に対して適切な回答になる。
getsに問題があるけど、問題が起こらないように使いましょうって
だからgetsを使うからセキュリティーホールなるものが出来てんだろって報告も無視するし。

276:デフォルトの名無しさん
07/08/22 22:52:05
堂々巡りいいよ堂々巡り

277:デフォルトの名無しさん
07/08/22 22:52:07
>>274
お前のバカじゃね?理解してなさすぎ。個人的な主観による 読みやすさ っていう基準が
無意味だって話だろ。自分が思う通りに処理が出来るソースがコンパイルに通れば
どういうスタンスやスタイルをとろうが自由だろ。あんたの言う世間で評価って言うのは
括弧を付ける付けないが評価の対象じゃないだろ?アホ杉・・・

278:デフォルトの名無しさん
07/08/22 22:53:43
そんな危険な関数が何で備わっているんですか?

279:デフォルトの名無しさん
07/08/22 22:54:22
>>274
んじゃ世間で評価されるプログラムのソースに1文のみで括弧が必要ない部分にも
括弧があったらどーすんだよ?くだらねぇ

280:デフォルトの名無しさん
07/08/22 22:54:22
それはもちろん使って欲しいから

281:デフォルトの名無しさん
07/08/22 22:56:14
>>277
だから「必要性」ってなんの話だよ。

それに理解できてないのはおまえのほうだろ。
括弧つけてるつけてないが評価されてるなんてどこにかいてる?

282:デフォルトの名無しさん
07/08/22 22:59:28
>>279
だから、上のほうで挙がってる括弧のをつける理由ってのは机上の空論ってことだよ。

283:デフォルトの名無しさん
07/08/22 23:14:49
×煽り合いスレ

284:デフォルトの名無しさん
07/08/23 07:56:31
読んでてふと疑問に思ったんだけど、
今時捨てプログラム以外でCUIで書くことってあるの?
getsなんぞそもそも使う場面が思いつかない

285:デフォルトの名無しさん
07/08/23 08:02:28
>>284
君はサーバプログラムを知らないようだ。
他にもシェル上から使えるちょっとしたフィルタプログラムは便利だ。

まあ君には必要のないことなのかもしれないがな。

286:デフォルトの名無しさん
07/08/23 09:39:29
>シェル上から使えるちょっとしたフィルタプログラム

はスクリプトで書くからなー

287:286
07/08/23 09:40:16
あ、でもオレもCUIでCのプログラムは結構書くよ

288:デフォルトの名無しさん
07/08/23 09:50:46
CUIエディタ使ってる奴なんかいないと思ってた…

289:デフォルトの名無しさん
07/08/23 09:53:35
最近はGUIの定義が変わってきているから
vi みたいなスクリーンエディタもCUIエディタと呼ぶのかも

290:デフォルトの名無しさん
07/08/23 09:53:51
vi 使うべ。

291:デフォルトの名無しさん
07/08/23 09:55:06
まあ揚げ足はともかく、ApacheやRubyのモジュールをCで書いたりするしな。

292:デフォルト名無しさん
07/08/23 11:15:37
CMAGAZINEのガイドに従ってBorland C++ Compiler 5.5.1の「コンパイルの
実行手順」まで来ました。Hello, World!というソースプログラムを用例通り
に作ってc:\に「cppprog」フォルダを作成しました。

コマンドプロンプトの\system32\cmd.exeの画面で
C:\Documents and Settings>の後にcd \cppprogを入力しenterキーを押すと
「指定されたパスが見つかりません。」と表示されます。なぜか教えてください。

 保存の状態は、C:→Documents and Settings → 大野→ My Documents →
 cppprogフォルダです。 よろしくお願いします。


293:デフォルトの名無しさん
07/08/23 11:31:47
cd "C:\Documents and Settings\大野\My Documents\cppprog"

294:デフォルトの名無しさん
07/08/23 11:32:42
ユーザーアカウント名?Oh no!

295:デフォルトの名無しさん
07/08/23 11:51:34
cd \cppprog
だと、
C:\cppprog
になる
cd cppprog
なら、現在の場所からの相対位置になる

296:デフォルトの名無しさん
07/08/23 12:02:09
C言語についてじゃないな、却下。

297:デフォルトの名無しさん
07/08/23 12:10:49
最近この手のプログラミング以前の質問多いよな

298:デフォルト名無しさん
07/08/23 12:14:18
>293, 204, 295ありがとう。
 漢字を打ち込む方法を教えてください。

299:デフォルトの名無しさん
07/08/23 12:18:02
>>298
ショートカットの作業フォルダに指定するべし

300:デフォルトの名無しさん
07/08/23 12:19:07
>>298
Alt+半角/全角

301:デフォルトの名無しさん
07/08/23 12:33:59
まあ漢字めんどうならTABキー連打で

302:デフォルト名無しさん
07/08/23 13:06:34
>301 TABキーで
C:\Documents and Settings\All Users>まで進みました。
この後ろへcd \My Documentsを入力しエンターキーを押すと、
「指定されたパスが見つかりません。」が出ました。
 対策を教えてください。

303:デフォルトの名無しさん
07/08/23 13:24:33
>>302
>>295

304:デフォルトの名無しさん
07/08/23 13:25:06
サーバやモジュールはgetsを使える場面があるのか…
標準入力もまだまだ捨てたものじゃないってことだな
やったことないから勉強になった

305:デフォルト名無しさん
07/08/23 13:34:04
>303
Documents and Settings\All Users>cd cppprogでエンターキーでも
「指定されたパスは見つかりません。」が出ます。

306:デフォルトの名無しさん
07/08/23 13:39:53
All Usersじゃなくて、自分のログインネームで
一個上に行くのは、 cd .. な

307:デフォルトの名無しさん
07/08/23 13:48:19
コマンドライン初めてなら、それなりのとこ見ながらやったほうがいいよ
そこからコンパイルまでいくのは大変だし、ここはスレ違いになるから
みんな相手してられなくなるぞ

308:デフォルトの名無しさん
07/08/23 13:51:00
ルート直下でやればいいじゃん

309:デフォルト名無しさん
07/08/23 14:04:48
>306 当たり前ですが、Borlandに対するログインネームでしょうね。
 「一個上に行く」というのは,>cd ○○○○(ログインネーム)と
 置くことを指しているのでしょうね。

310:デフォルトの名無しさん
07/08/23 14:10:13
>>309
これ見て勉強して
URLリンク(ykr414.com)

311:デフォルトの名無しさん
07/08/23 14:29:10
OS :Borland

312:311
07/08/23 14:31:45
ちょっと質問なんですけど、たとえば
key=value という文字列をsscanfをつかって'='で分解したいんですが

char text[256] = "key=value";
char *key,*value;
sscanf(text,"%s=%s",key,value);

という感じで打ってもできませんでした。だれかご教授おねがいします

313:デフォルトの名無しさん
07/08/23 14:34:45
BorlandっていうOSは知らないなぁ

314:デフォルトの名無しさん
07/08/23 14:46:44
だーかーらー
カレントディレクトリが C:\Documents and Settings\All Users なんだったら、
その状態で cd cppprog ってやったら
C:\Documents and Settings\All Users\cppprog
へ移動することになるし、cd 大野 ってやったら
C:\Documents and Settings\All Users\大野
へ移動することになる。もちろんそんなディレクトリは存在しないから、エラーが出るわな。

君が移動したいのは C:\Documents and Settings\大野\My Documents\cppprog だろ?
だったら1つ上のディレクトリ(つまり C:\Documents and Settings)に戻ってから、
大野 → My Documents → cppprog へと移動すればいい。
具体的には
cd ..
cd 大野
cd "My Documents"
cd cppprog
と順に移動していけばいい。

だいたいなんでCマガの書いてあるようにやらないんだよ。

315:デフォルトの名無しさん
07/08/23 14:46:59
>>312
strtokでも使え

316:デフォルトの名無しさん
07/08/23 14:49:51
>>312
OSはおいといて、key と value の領域確保の問題が一つ。
もう一つは、keyが"="まで読み込んでしまうこと。
"%[^=]=%s"とかでどうか

317:デフォルト名無しさん
07/08/23 15:40:26
>314 問題は、漢字のフォルダ名をコマンドプロンプトへ
  打ち込めないことです。フォルダ名をローマ字に変えようと
してもできません。よろしく。

318:デフォルトの名無しさん
07/08/23 15:46:12
>>317
コンパイラ起動できるようになるまで、Win板で聞いたら?
とりあえず>>300-301

ちなみに、
C:\Documents and Settings\大野\My Documents
は、エクスプローラーの「マイ ドキュメント」のことだって知ってたか?

319:デフォルトの名無しさん
07/08/23 15:57:57
せっかく答えてもらったのに礼は言わない、
それどころかレスをまともに読んですらいない、
救いようがないなこりゃ

320:デフォルトの名無しさん
07/08/23 15:59:00
さすがに釣りだろwww

321:デフォルトの名無しさん
07/08/23 16:05:44
おじゃまします。質問です。

typedef struct{
char a[2];
char b[3];
char c[4];
}AA;

typedef struct{
char e[16];
}BB;

AA aa;
BB bb;

…こんなんで、aaに代入された値をbbに一発で書き込んで、
しかもスペースで埋めてくれる関数とかありませんか?

VBからCに書き直してたら、LSetで一発だったので。。


322:デフォルトの名無しさん
07/08/23 16:13:02
関数使わんでもできるけど、一発(スペース埋めるなら2発か)でやるなら
memcpy() と memset() でどうか

323:デフォルト名無しさん
07/08/23 16:18:12
>319 ありがとうございました。cd 大野といわれても漢字をコマンド
プロンプトに打ち込めないみじめさ。嬉しさも中ぐらいなり、秋の風。

324:デフォルトの名無しさん
07/08/23 16:21:37
どうしても無理ならマウス使ってコピペ
右クリックかシステムメニューでできる

325:デフォルトの名無しさん
07/08/23 16:31:15
Alt+半角/全角 で入力できるぜ

326:321
07/08/23 16:35:43
>322
できました。ありがとうございます!

327:デフォルトの名無しさん
07/08/23 16:49:57
>>322,326
構造体のパディングは大丈夫なのか?
文字列の連結ではないのか?
いやできたならいいんだけど。

328:デフォルトの名無しさん
07/08/23 17:09:58
同じ型が続いてるなら多分パディングはないんじゃないかなあ。

329:デフォルトの名無しさん
07/08/23 17:13:26
パディングはcharが並んでるだけだったからあえて書かなかったが
LSetの仕様を考慮しないとね。どっちにしても一発は厳しい

330:デフォルトの名無しさん
07/08/23 19:09:03
char *func_b( char *str, char ch )
{
char *p;
for( p = str; *p != '\0'; p++ )
if( *p == ch ) return p;
return 0;
}

これと同等の処理を行う標準ライブラリ関数を教えてください お願いします

331:デフォルトの名無しさん
07/08/23 19:18:28
strchr?

332:デフォルトの名無しさん
07/08/23 19:18:52
strchrかな

333:デフォルト名無しさん
07/08/23 20:06:37
Borland

334:デフォルトの名無しさん
07/08/23 20:23:42
>>331-333
ありがとうございます
strcharだと
char *func_b( char *str, char ch )
じゃなくて
char *func_b( char *str, int c)
になるんじゃないかと迷ってました

335:デフォルト名無しさん
07/08/23 20:26:41
プログラム実行できました。今日中にできるとは思いませんでした。
Borland C++ Compiler のつぎはTurbo Debuggerです。
ありがとう!ありがとう! >293,294,295,314,318,
325さんAlt + 半角/全角や漢字のコピペが可能だとは驚きでした。

まだいろいろ教えていただくこともあろうと思います。




336:デフォルトの名無しさん
07/08/23 20:26:46
>>321

memset(&bb, ' ', sizeof(bb));
bb = aa;

これでいいような気がするんだが、
構造体の要素って順番に並んでるとは規定されてないけどね。

337:デフォルトの名無しさん
07/08/23 20:29:48
>>334
char *strchr (const char *s, int c) だよ

338:312
07/08/23 20:38:42
レス遅くなってすいません。

>>316の[^=]を使う方法を試したのですがうまくできなかったです。。。
strtokを使うしかないって事ですかね

339:デフォルトの名無しさん
07/08/23 20:39:29
URLリンク(www.bohyoh.com)

340:デフォルトの名無しさん
07/08/23 20:40:21
>>336
>構造体の要素って順番に並んでるとは規定されてないけどね。
またいい加減なことを…ここは入門者が答えるスレ?

341:デフォルトの名無しさん
07/08/23 20:41:54
>>336
だからgets肯定派のダンディ坂野は回答しなくて良いよって言っただろ?
ったく、これだから夏厨は・・・

342:デフォルトの名無しさん
07/08/23 21:18:41
>bb = aa;

343:デフォルトの名無しさん
07/08/23 21:30:38
>>336
規定されてるよ

344:336
07/08/23 22:11:17
>>340
>>336
お、ずっと勘違いしてた。やべ
ははははh

345:デフォルトの名無しさん
07/08/23 22:29:21
パディングが挟まってる可能性はあるが、順番はそのまま。

346:デフォルトの名無しさん
07/08/23 23:08:32
全くの初心者です。質問ですが、

#include <stdio.h>
main()
{
printf("Hello World\n");
}

を、Cygwinでコンパイルしたいのですが、うまくいきません。
何故でしょうか。

347:デフォルトの名無しさん
07/08/23 23:10:40
エラーメッセージを読め

348:デフォルトの名無しさん
07/08/23 23:30:46
gcc インストールし忘れているに 100 ガバス

349:デフォルトの名無しさん
07/08/24 10:08:44
>>338
どううまくできなかったのか。
ちゃんと
*key は key[128]
*value は value[128]
とかにしたか?

350:デフォルトの名無しさん
07/08/24 17:50:23
ヘッダーファイルについて質問なのですが、自作ヘッダーにsleepという関数を
作るとします。実際この関数を使おうと#includeしようとしたら同じく#includeした
time.hライブラリーにも同じ関数がある事に気づきました。
同じ名前の関数がある場合、関数の使用優先度って何で決まるんですか?

351:デフォルトの名無しさん
07/08/24 17:52:15
>>350
多分リンクした順だけど、普通はリンク時にエラーがでると思うよ

352:デフォルトの名無しさん
07/08/24 17:56:37
先にldが見つけたほうではないかな?

ふつうは自作の関数の名前を変えると思うんだが

353:デフォルトの名無しさん
07/08/24 17:57:20
そうなんですか。eclipse,CDTで開発してるんですが、予想通りでした。
ありがとうございました。

354:デフォルトの名無しさん
07/08/25 00:37:04
>>351
エラーは出ないんじゃないかな。
関数の戻り値なり引数なりの型が違うなら、
コンパイル時にエラーになると思う。
警告かも知れない。

355:デフォルトの名無しさん
07/08/25 01:27:57
Japan 1 0 2
Spain 2 0 1
Egypt 1 2 0
のように入力して、数字を左から 3点 0点 1点分と数えて点数の高い順に並べ
Spain, 7
Japan, 5
Egypt, 3
のように出力したい場合二次元配列使うと思うんだけど、データの型はどうすればいい?
全部intで出力のときだけ %s,%d で合ってますか?


356:デフォルトの名無しさん
07/08/25 01:44:14
>>355
おれだったら、構造体の一次元配列で処理する。

357:デフォルトの名無しさん
07/08/25 11:58:03
struct hoge
{
char name[1024];
int mark;
}

358:デフォルトの名無しさん
07/08/25 12:24:47
生のデータを持つために、
struct {
char name[1024];
int mark[3];
}

359:デフォルトの名無しさん
07/08/25 17:58:54
a = (struct A *)buf;
b = (struct B *)buf+20;

Bの構造体にbufの20バイト後から取り出したいんだけど
この記述はできない?

360:デフォルトの名無しさん
07/08/25 18:07:15
>>359 の記述のままでもおk
でも、>>359 は何か根本的なことが分かっていない気がする

361:デフォルトの名無しさん
07/08/25 18:07:53
>>359
bufがchar *などであるなら、
struct B b=*(struct B*)(buf+20)

362:デフォルトの名無しさん
07/08/25 18:09:37
>>360
すっとこどっこい。

363:デフォルトの名無しさん
07/08/25 18:17:56
offsetとか使いたいのではないのかなあ

364:359
07/08/25 22:23:25
一応できた.
でもあんまり理解してないorz

365:デフォルトの名無しさん
07/08/26 00:57:24
システムコールってC言語ですか?

366:デフォルトの名無しさん
07/08/26 07:15:28
共用体(union)の中で構造体使うと
うまく領域を確保できなくてデータが変になる現象が起きてます。

今は使わない文字配列を共用体の中に書いて
無理やり余裕を持たせて領域確保してるんですが
共用体で使うメモリ領域をうまく確保する方法はありますか?

ちなみに環境はVineLinux4.1でgcc3.3.6コンパイラ使ってます。

367:デフォルトの名無しさん
07/08/26 07:24:22
うまくいかないソースと現象の詳細を示せ

368:366
07/08/26 08:00:38
説明しにくいんですけど
2Dのrobocup用ライブラリlibsclientをいじってて
http://www.koders.com/c/fidD6E7EBDD071F6F9579D1CAF12EF2FC434F5F7074.aspx
292~295行目
typedef struct _Ppos {
        WhichTeam team ;  // enum(WhichTeam=int)
        int unum ;
} PlayerInfo ;
に「int type;」というのを追加してライブラリとプレイヤーを再コンパイルして
実際にサーバーに接続してみたら動作が明らかに変になるんです。
312~317行目
        union {
        PlayerInfo player ;// 292~295行目の構造体
                Side side ;          // enum(Side=int)
                FlagPos fpos ;     // enum(FlagPos=int)
                LinePos lpos ;     // enum(LinePos=int)
        } id ;
ここに「char hoge[30];」を追加すると問題なく動作するようになるんで
共用体で構造体の大きさの領域が確保できてないという結論に至ったわけです。

369:デフォルトの名無しさん
07/08/26 11:14:49
結論に至る前に sizeof で大きさを調べてみろ

370:デフォルトの名無しさん
07/08/26 13:08:10
make cleanしてないんじゃねーの?

371:デフォルトの名無しさん
07/08/26 13:27:06
>>365
システムコールはC言語でもサポートされていますが
システムコールはC言語ではありません

372:366
07/08/26 13:49:54
>>370
それでしたorz
ライブラリとプレイヤ自体はmake cleanしてたんですが
ライブラリを読み込んでるプレイヤ共通の関数をまとめたやつをし忘れてました。

>>367,>>369,>>370こんな僕にレスしてくれてありがと

373:デフォルトの名無しさん
07/08/26 21:34:06
相談なんですが,ファイルに以下のように保存されていて,
a[1]=AAA
a[2]=BBB
a[4]=DDD
これを以下のように新規で追加,削除,変更などしたい場合,
a[1]=AAA
a[2]=ABC
a[3]=DEF
一回全部読み込んでbufなどに保存し,それから一気に全部ファイルへ書き込む方法が
あると思いますが,それ以外に方法ありますか?


374:デフォルトの名無しさん
07/08/26 21:43:43
>>373
固定長レコードもファイルならfseekで該当レコードのところにファイルポインタを
位置決めしてfwriteでレコードを上書き。

375:デフォルトの名無しさん
07/08/26 21:53:28
>>373
データをファイルの最後尾に書き込みして
読み込み時、重複する場合は「もっとも後ろにあるデータ」を有効とするとか

たとえば

a[1]=AAA
a[2]=BBB
a[4]=DDD
  ↓
a[1]=AAA
a[2]=BBB
a[4]=DDD
a[3]=DEF
a[2]=ABC
a[4]=

読み込み時にデータ(a[2]=BBB)をデータ(a[2]=ABC)で上書きする感じ
a[3] は新規追加、a[2]は変更、a[4]は値なしなので削除

376:デフォルトの名無しさん
07/08/26 22:01:50
>>374
その標準関数を使ったことないんで調べてみます

>>375
その方法も考えたんですが,何回も書き込みを行うとデータが多くなり
読み込むのに時間がかかりそうなんで,有効データだけ残す方法をとりたいですね

お二人様サンクスです!検討してみます

377:デフォルトの名無しさん
07/08/27 17:11:43
超初心者ですみません。
2の0乗+2の1乗+2の2乗+2の3乗+2の4乗+・・・
というプログラムはどのようにしたらよいのでしょうか?
いろいろ調べてかいてみたのですができませんでした><
どなたかアドバイスお願いしますm(__)m

378:デフォルトの名無しさん
07/08/27 17:19:53
1 + 2 + 2 * 2 + 2 * 2 * 2 + 2 * 2 * 2 * 2 + ...

379:デフォルトの名無しさん
07/08/27 17:40:04
for(n=1, sum=0;;n*=2) sum+=n;

380:デフォルトの名無しさん
07/08/27 17:47:15
>>377
しょぼくて申し訳ないが、
int hoge(int count){
 int result = 1; 
 if(count <= 0)
  return 1;
 for(int i=1;i<count;i++){
  result += 2*i;
 }
 return result + hoge(count-1);
}

381:デフォルトの名無しさん
07/08/27 18:12:29
二進法で結果を出力するプログラムならこれでいいよ。

#include <stdio.h>

int main(void)
{
  for (;;)
    putchar('1');
}

382:デフォルトの名無しさん
07/08/27 18:14:02
// ウンコード
int func(size_t n) {
int ret = 1;
size_t i;
for (i = 1; i < n+1; ++i)
ret += 1<<i;
return ret;
}

383:デフォルトの名無しさん
07/08/27 18:15:40
ウンコードなんて、クソースのパクリみたいだな、¢50徴収するぞ?

384:デフォルトの名無しさん
07/08/27 19:00:13
>>377
pow(2, n+1) - 1

385:デフォルトの名無しさん
07/08/27 19:40:33
>>377
~(~0<<n)

386:デフォルトの名無しさん
07/08/27 20:01:40
ビット演算凄いです^o^

387:デフォルトの名無しさん
07/08/27 21:15:03
Javaで言うところの「equals」ってC言語だと何ですか?

388:デフォルトの名無しさん
07/08/27 21:17:00
Javaの何のクラスのequals?

389:デフォルトの名無しさん
07/08/27 21:17:59
>>387
==

390:デフォルトの名無しさん
07/08/27 21:18:36
>>387
C言語には対応するものはないかな?
C++なら、状況応じて==をequals風に定義しなおすことになる。文字列とか。
Javaのように==とequalsを明確に区別することはできない。

391:デフォルトの名無しさん
07/08/27 21:25:34
Stringクラスのequalsならstrcmp関数だろ
あくまで、文字列比較という意味でね

もっとも、equalsメソッドはオブジェクトのデータの比較だから
そういう意味なら、オブジェクト指向でないCにはそれに該当するものはない

392:デフォルトの名無しさん
07/08/27 21:31:41
memcmp (^^;

393:デフォルトの名無しさん
07/08/27 22:11:53
Cの場合、
構造体だと、専用の比較関数作らなきゃならんね。

394:デフォルトの名無しさん
07/08/27 22:18:11
Object.equalsだったら、ポインタに対する==演算子が最も当てはまる存在だな。

395:デフォルトの名無しさん
07/08/27 22:27:05
387です
失礼しました、説明が足りなかったようで・・・
Javaでは、([変数].equals("○○○")) と書くところを
C言語だとどのように書くのかという意味です

396:デフォルトの名無しさん
07/08/27 22:31:16
>>395
何も読んでないのか?
クラスによってequalsの挙動は違うだろうが。

397:デフォルトの名無しさん
07/08/27 22:31:47
>>395
[変数]の型は何?
派生クラスでオーバーライドできるから、
クラスによって挙動が違い、Cで対応するものも異なる。

なお、Stringなら>>391

398:デフォルトの名無しさん
07/08/27 22:48:56
ファイルのプロパティの概要で表示されるタイトルに
そのファイルの拡張子を除いたファイル名を設定するプログラムを作成したいのですが
どのようにすればタイトルに書き込めるのでしょうか?

399:デフォルトの名無しさん
07/08/27 22:53:24
>>395
if (strcmp(変数, "○○○”) == 0) ・・・

400:デフォルトの名無しさん
07/08/27 22:55:30
>>398
プロパティ窓を取得、拡張子まで削ってSetWindowText

401:398
07/08/27 23:11:00
>>400
プロパティ窓はどのようにして取得するのでしょうか?

402:デフォルトの名無しさん
07/08/27 23:17:33
>>398
IPropertyStorageでググればいろいろ見付かる。
ただし、Cでやるのは面倒。少なくともC++は欲しい。

なお、この情報は、NTFSの副次ストリームに保管される。
あるいは、OLE構造化ストレージ(2003までWord/Excelファイルなど)なら
ファイル自身に保管される(このため構造化ストレージならNTFSでなくても可能)。


403:398
07/08/27 23:20:09
>>402
Cでは厳しいですか・・
調べてみます
ありがとうございました

404:デフォルトの名無しさん
07/08/28 22:01:37
t

405:デフォルトの名無しさん
07/08/29 03:30:57
>>404
ありがとうございました

406:デフォルトの名無しさん
07/08/29 11:41:07
377です。
みなさんありがとうございます><

407:デフォルトの名無しさん
07/08/29 20:34:19
* 引数 :char *data : 追加したい文字列
* : int index : 追加したい位置
* : element *new_data : 新しく追加するリスト
* 戻り値:成功1,失敗-1
*/
int add_data(char *data, int index, ELEMENT *new_data){
ELEMENT *tmp;
int cnt = 0;

if(data == NULL || index < 0 || index > element_cnt || new_data == NULL){
return -1;
}
new_data->data = data;
/* インデックスの位置の直前に移動 */

for(tmp = head;cnt != index;cnt++,tmp = tmp->next);
new_data->next = tmp->next;
tmp->next = new_data;
printf("help\n");
return 1;
}
こんな感じでリスト構造にデータを入れる関数を作ったんですが、
Borlandでは正しく動くのにVisual Studioでは呼び出しもとに返らず終了してしまいます
helpというプリント文は表示されます。どなたか、解決策を教えてもらえませんか?
↓がリストの構造体です
typedef struct element {
char *data;
struct element *next;
} ELEMENT;


408:デフォルトの名無しさん
07/08/29 21:11:45
>>407
そのソースだけだとわかんないなぁ
引数の「char *data」はその都度領域確保されているの?
それから「element_cnt」って要素数だよね?いつインクリメントしてる?

409:デフォルトの名無しさん
07/08/29 21:14:25
>>407
デバッガでも使って確かめろ位しか

410:デフォルトの名無しさん
07/08/29 21:20:40
>>408
そうですよね。>>409さんのデバッガを調べてみます
「char *data」はただダブルコーテーションで文字列を渡すだけしてます
「element_cnt」については処理を書き込み忘れました

411:408
07/08/29 21:31:46
>>407
それから追加するインデックスを0にした場合は
実際に追加されるのはインデックス1の場所にならない?
0の場合headを書き換えないとおかしくなるんじゃない?

まぁあと/* インデックスの位置の直前に移動 */ といっているけど
cnt!=index ってことはindex の位置で止まる

>new_data->next = tmp->next;
index+1の要素を新要素の次の要素にする
>tmp->next = new_data;
indexの次の要素を新要素にする

結局追加される場所はindex+1の場所にならない?

412:407
07/08/29 21:50:13
>>411
すいません!書き忘れてましたけど、headはstatic変数で今回ダミーとして扱います
ちなみにheadはhead->next = NULLで初期化してあります。

for文の初期化でtmp = head;とあるので、head->nextでダミーではない値をもつリストに入るときにはcntは1になっています
なのでcnt == indexはひとつ前になるんじゃないかな~と考えてます。間違えてたらすいません




413:408
07/08/29 21:54:23
>>412
つまり head->next が最初の要素ってことですね
なら納得です

だとすると、やはりこのソースからだと分かりませんね
私はここまでです

414:407
07/08/29 22:11:13
>>413
そうですか、ありがとうございました。
原因はこれだけのソースではわからないと思うので、ななし.orgに全部のソースをアップしました
見てくれるなら見てほしいです。んでVisualStudioで実行してほしいです

まだ途中なんでできたらツッコミとかよろしくおねがいします



415:408
07/08/29 22:33:26
>>414
そういうときはURLも貼ってくれないと
ななし.orgってどこですか?

416:407
07/08/29 22:43:24
すいません。。ここです
URLリンク(77c.org)

417:408
07/08/29 23:02:01
>>416
まずここかな

void init_list(void){
ELEMENT top;
head = ⊤

element_cnt = 0;
head->next = NULL;printf("\(^o^)/");
}

ELEMENT top; は関数のローカル変数
head = ⊤
top の実体は関数抜けたら無効になる
にも関わらず 関数外でhead(top) にアクセスしてる

418:407
07/08/29 23:12:46
>>417
ああ~!そうですねw普通におかしいですね

419:408
07/08/29 23:16:02
>>418
一応こちらの環境(BCC5.5)では>>417を改善することで動作はします
(もう少し動作チェックしてみますが)

それから余談ですが、ポインタ配列使うなら ELEMENT next いらないんじゃないですか?
せっかくポインタ繋ぎしてるんですから add_data() 内で new_data=(ELEMENT *)malloc(sizeof(ELEMENT)) してみては?
いまは動作チェックが目的でこうしているというならゴメンナサイね

それから最後にfree()も忘れずに

420:407
07/08/29 23:24:18
改善しました!>>408さん、ありがとうございました!

関数内でmallocはしなくて良い、と言う問題だったので、main側で確保したんです。
自分も関数内で確保した方がいいと思うのですが・・・

421:408
07/08/29 23:52:07
>>420
そういうことですか
分かりました
それらが題意であるならしょうがないですね

余計なことかもしれませんが、
remove_element() は要素を削除するんですよね?
この方法(配列上で行う連結リスト)だと要素を削除した後、その後追加する際に、
空いている要素と空いていない(使われている)要素の区別がつかないので
その点も考慮していく方がよろしいかと思います

422:421
07/08/29 23:53:29
#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);


}

これにあと配列中の奇数と偶数の数を出力するのを追加したいんですが
どうすればいいんでしょうか?

423:407
07/08/30 00:02:53
>>421
確かにそうですね。mainの考慮をしてみます!

424:408
07/08/30 00:05:50
>>422
こんなんでどうですか?
配列中の値を2で割ってあまりが出るかでないかで奇数、偶数を判断

#include <stdio.h>
main()
{
static int a[5]={15,8,48,50,27}
int sum,heikin,i;
int kisu=0,gusu=0;
sum=0;
for(i=0;i<5;i++){
sum=sum+a[i];
if(a[i]%2) kisu++;
else gusu+++
}
heikin=sum/5;
printf("goukei=%d\n",sum);
printf("heikin=%d\n",heikin);
printf("奇数 %d個 / 偶数 %d個",kisu,gusu);

}

425:408
07/08/30 00:08:32
>>422
ところでなんで 421 なんですかね?

>printf("奇数 %d個 / 偶数 %d個",kisu,gusu);
改行忘れたので入れといてください

printf("奇数 %d個 / 偶数 %d個\n",kisu,gusu);

426:デフォルトの名無しさん
07/08/30 00:09:46
おまえも、関係ないなら名前の所の番号外せ

427:422
07/08/30 00:15:18
>>425
ありがとうございます。

名前はミスして書いてしまったようです。すいません^^;

428:デフォルトの名無しさん
07/08/30 00:26:43
怒られちった

429:デフォルトの名無しさん
07/08/30 21:19:36
質問です。
例えば、データの処理(検索など)を行いながら、
同時に秒単位で経過時間を標準出力するといったようなことってできますか?
できるのであれば教えていただきたいのですが。

430:デフォルトの名無しさん
07/08/30 21:44:54
>>429
検索のループ中に時間表示機能入れるなり、スレッド作るなり、signal使うなり
まぁ状況次第でなんなりとどーぞ。

431:デフォルトの名無しさん
07/08/30 23:14:55
奇数偶数なら

if(a[i] & 1)
//奇数
else
//偶数

では?

432:デフォルトの名無しさん
07/08/30 23:18:54
>>431
% 2 でなにか不都合なことがあるの?

433:デフォルトの名無しさん
07/08/30 23:22:31
>>431
負数が2の補数表現で無い環境の場合はうまくいかないんじゃない?
(そんな環境があるかどうかは知らないが…)

434:デフォルトの名無しさん
07/08/30 23:38:35
問題の中に負数がないからどっちでもいいよ

435:デフォルトの名無しさん
07/08/30 23:58:46
>>432
もちろん論理的な不都合はないです。
ただ除算は一般に非効率なので、高速化を狙った提案。ですが、、
>>433
たしかに、そうですね。
使用可能かどうかの確認は必要だと思います。

436:デフォルトの名無しさん
07/08/31 01:46:43
>>435
大丈夫、まともなコンパイラなら%2を割り算では実装しないから。

437:435
07/08/31 02:43:21
>>436
gcc -S で試したら、確かに論理命令が生成されてました。
しかもunsigned だと n % 1 と n & 1 は完全に同じコードに。
勉強になりました。流れ止めて失礼しました。

438:デフォルトの名無しさん
07/08/31 09:54:01
> n % 1 と n & 1 は完全に同じコードに
バグじゃね?

439:デフォルトの名無しさん
07/08/31 09:57:08
バグだな

440:デフォルトの名無しさん
07/08/31 10:08:56
n%2の間違いだろ、突っ込んでやるなよw

441:デフォルトの名無しさん
07/08/31 15:31:29
実数で計算した結果の小数点以下を切り捨ててて
整数のところだけを別の計算に使いたいのです。

どのようにすればできるのかでしょうか。

442:デフォルトの名無しさん
07/08/31 15:37:22
>>441
一度 int にキャストする (正数のときのみ)、あるいは floor()。
入門以前のレベル。本くらい買え。

443:デフォルトの名無しさん
07/08/31 15:40:06
472 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473 名前:デフォルトの名無しさん[sage] 投稿日:2007/08/31(金) 15:13:39
f - floor(f)

444:デフォルトの名無しさん
07/08/31 18:40:31
文字列とfor文についての質問です。
--出力結果--
sample01.txt
sample02.txt
sample03.txt
sample04.txt
sample05.txt
------------
上のように出力し、かつそれぞれを格納したいのですが、
数字の部分に繰り返し文を使ってうまくやる方法がわかりません。

おしえてくらはい><

445:デフォルトの名無しさん
07/08/31 18:52:51
sprintf(fname, "sample%02d.txt", i);

446:デフォルトの名無しさん
07/08/31 19:08:26
あまりの入門レベルにワロタwww

447:デフォルトの名無しさん
07/08/31 19:17:16
入門篇だからいいんじゃね?

448:デフォルトの名無しさん
07/08/31 22:00:31
でも入門書くらい読めよ、てのが少なくない。

449:デフォルトの名無しさん
07/08/31 22:41:01
>>445
うまくいきそうです!ありがとうございました!!

450:デフォルトの名無しさん
07/09/01 00:38:58
>>429
できなくはないが、C言語入門の範疇じゃないな。
OS関連のプログラミングを勉強しないと無理。

451:デフォルトの名無しさん
07/09/01 01:05:03
>>444
char filename[5][100];

for (i = 0; i < 5; i++) {
  sprintf(filename[i], "sample%02d.txt", i + 1);
  printf("%s\n", filename[i]);
}

452:デフォルトの名無しさん
07/09/01 23:22:05
uintptr_t とかsize_t型ってなんなんですか
これもwindowsプログラミング特有の、#defineした型なんでしょうか?

453:デフォルトの名無しさん
07/09/01 23:23:29
#defineはしてないと思うよ^^

454:デフォルトの名無しさん
07/09/01 23:35:05
>>452
size_tは標準の型。
unsigned intとかunsigned longあたりのtypedef。
strlen()のリターン値とかで使われてる。

uintptr_tは知らんけど、
URLリンク(docs.sun.com)
これを見ると、導入が予定されてるのかな?

455:デフォルトの名無しさん
07/09/02 00:12:21
size_tは標準Cに入っている記憶域の大きさを表す型、
sizeof演算子の結果の型と定められている。

uintptr_tはC99から導入された<stdint.h>で宣言されている型の1つで、
ポインタをキャストしても表現を失わないと規定されている符号無し整数型。
VC++でも最近はuintptr_t/intptr_tだけ<stdlib.h>で宣言されている。
<stdint.h>ごと入れればいいものを。

Windowsプログラムなら、uintptr_tよりUINT_PTRのほうが良く見かけるな。
こっちはWindows APIの型とされているし、
VC++にuintptr_tが入るよりも前から存在していたから。

456:デフォルトの名無しさん
07/09/02 00:43:43
一週間ほど前にプログラミングをCから始めまして現在、
URLリンク(homepage3.nifty.com)
まで勉強しました。そこで、もっといいサイトがあるよ~
っていうのがあれば教えてくださいm(_ _)m
できれば書籍等も・・・・

教えて君で失礼しますた(´・ω・`)

457:452
07/09/02 00:48:08
>>453-455
ありがとうございます。
なるほど、typedefでしたか・・・・。



458:デフォルトの名無しさん
07/09/02 00:49:16
>>456
とりあえずこのサイト全部終わらせればいいんでない

459:デフォルトの名無しさん
07/09/02 01:12:37
Cで正規表現を自前で実装しようと思っていますが速度面で微妙

アセンブラのほうがいいですかね?



460:デフォルトの名無しさん
07/09/02 01:14:35
Cで速度でないなら、アセンブラでやっても大差ないと思う

461:デフォルトの名無しさん
07/09/02 01:14:41
>>459
アルゴリズムの問題だと思われ。

462:デフォルトの名無しさん
07/09/02 01:15:54
>>459
grepか何かのソース読んでみるのはどーか

463:デフォルトの名無しさん
07/09/02 01:23:43
なにの正規表現と比べて遅いと思ったのか分からないけど、
その比較した正規表現の処理系も、おそらくCで書かれてると思われ。

464:デフォルトの名無しさん
07/09/02 01:28:48
Cってメモリと文字列処理がだるいよな

465:デフォルトの名無しさん
07/09/02 01:35:56
何をいまさら

って初心者ですか
そうですね

466:デフォルトの名無しさん
07/09/02 05:17:20
>>456
俺としては、今はもう読むこと無いけど
「C言語入門本物志向が身に付く本」;入門
「ポインタ完全制覇」:ポインタ関連
「文字列操作+ファイル入出力完全制覇」:文字通りの内容
全部「科学技術評論社」
あとは、一応K&R。入門本じゃないけど。
まぁサイトでいえばwisdomsoftかな。
他にも色々あるけど。まぁ、がんばってね

それにつけても、俺が今のレベルまでどうやって勉強してきたのか
さっぱりわからん。学びはじめの頃は
[putchar()//一文字出力する関数]なんてコメントを書きながら
ソース書いてたな。

467:デフォルトの名無しさん
07/09/02 06:45:53
今更Cなんてやっても・・・

CでOSや組み込み系のドライバをサクサク書けるようになるには10年はかかる

やっと使えるなって感じた頃は全く需要がない恐れがある

468:デフォルトの名無しさん
07/09/02 07:10:17
>>467
10年もかからないよ
それに、C言語とOS、ドライバーは関係がない

469:デフォルトの名無しさん
07/09/02 07:12:09
ドライバをCで書くなんてえらい時代になったもんだな
ってアセンブラ厨の老人が沸いてくるよ

470:デフォルトの名無しさん
07/09/02 08:05:57
tuhsなんか読んでるとUnixはversion 6の時代(1974)にすでにデヴァイス
ドライヴァはCで書かれている。
むしろmkdirだのpasswdとかのユーザープログラムがアセンブラで書かれて
たりして笑える。

471:デフォルトの名無しさん
07/09/02 08:06:54
version 6じゃなくてversion 5だった

472:456
07/09/02 08:46:32
>>458,466
レス((ヾ(。・ω・)ノ☆゚+.ァリガトゥ
とりあえず今のサイト最後までがんばってみて、
終わったら466さんの紹介してくださった書籍
よんでみます^^

473:デフォルトの名無しさん
07/09/02 11:27:38
>>464
個人的には文字列操作はダルいけど、メモリ操作は楽。

474:デフォルトの名無しさん
07/09/02 13:44:29
>>469
C て高級アセンブラだよね
こんな言語で業務アプリ書くアホいないよな
って感じてた老人ならここにいますが...


475:デフォルトの名無しさん
07/09/02 14:22:06
>>468
あんたアフォですか?
OSを作成するためにCが作成されたのに・・・

476:デフォルトの名無しさん
07/09/02 14:26:53
もはや関係がないってことだろう

477:デフォルトの名無しさん
07/09/02 15:22:49
1000から9999までの4桁の数字で、各桁を足した数で自分を割りきれる数がいくつあるか調べるプログラムを作りました。
今回は1325という正しい答えを知っていたのでエラーに気づきましたが、答えがわからない場合はどんな風にデバッグしていますか?

478:デフォルトの名無しさん
07/09/02 15:26:44
全部出力して、検算する。

479:デフォルトの名無しさん
07/09/02 15:30:12
各桁の合計を求める部分、割り切れるかどうかを判定する部分、個数を数える部分を
それぞれ個別にテストしてみる。

480:デフォルトの名無しさん
07/09/02 15:34:28
別のアルゴリズムで解いてみる。

481:デフォルトの名無しさん
07/09/02 15:36:56
>>477
そのようなプログラムをCで書かなきゃいけないか?w

excelで十分だろ

482:デフォルトの名無しさん
07/09/02 15:40:25
答えを知ってるってことは課題かなんかだろう
それで>>477みたいな疑問を持ったんだからやる価値があったってことだろう

483:デフォルトの名無しさん
07/09/02 16:52:58
cat.cより抜粋

/* Buffer for line numbers.
An 11 digit counter may overflow within an hour on a P2/466,
an 18 digit counter needs about 1000y */
#define LINE_COUNTER_BUF_LEN 20
static char line_buf[LINE_COUNTER_BUF_LEN] =
{
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0',
'\t', '\0'
};

/* Position in `line_buf' where printing starts. This will not change
unless the number of lines is larger than 999999. */
static char *line_num_print = line_buf + LINE_COUNTER_BUF_LEN - 8;

/* Position of the first digit in `line_buf'. */
static char *line_num_start = line_buf + LINE_COUNTER_BUF_LEN - 3;

/* Position of the last digit in `line_buf'. */
static char *line_num_end = line_buf + LINE_COUNTER_BUF_LEN - 3;

484:デフォルトの名無しさん
07/09/02 16:55:36
>>483の続き

/* Compute the next line number. */

static void
next_line_num (void)
{
char *endp = line_num_end;
do
{
if ((*endp)++ < '9')
return;
*endp-- = '0';
}
while (endp >= line_num_start);
if (line_num_start > line_buf)
*--line_num_start = '1';
else
*line_buf = '>';
if (line_num_start < line_num_print)
line_num_print--;
}

Cの基本的なことを勉強して、cat.cのソースを読んでいますが
この行を計算する関数の処理が何が言いたいのかわかりません。
line_bufを参照しながらカウントしているように見えますが、いまひとつわかりません。
どなたかご教授お願いします。

485:デフォルトの名無しさん
07/09/02 17:16:14
URLリンク(www.google.co.jp)
>何が言いたいのかわかりません
何を聞きたいのかわかりません

486:デフォルトの名無しさん
07/09/02 17:37:21
行番号を表す文字列をポインタ使って変更してるんじゃない?
"399" → "400"みたいに。

487:468
07/09/02 18:25:16
>>475
OSを作成するためにCを勉強しているわけではないだろ
そう意味で関係ない

488:デフォルトの名無しさん
07/09/02 18:37:35
じゃぁ、なん為にやってるの?

文字列を逆順に表示したりするプログラムを書くためですか?hw


489:デフォルトの名無しさん
07/09/02 18:41:38
普通はアプリケーションを作成するためにC言語を勉強するんじゃない?

490:デフォルトの名無しさん
07/09/02 18:42:26
この先必要となる基礎としての勉強じゃないんですか?>>488

491:デフォルトの名無しさん
07/09/02 18:43:35
英語を習うときに、目的を持つかどうかの違い棚。

492:デフォルトの名無しさん
07/09/02 19:06:28
失礼します。
変数Aに一秒ごとに1を追加していくようにしたいのですが、どうしたらいいのでしょうか。

493:デフォルトの名無しさん
07/09/02 19:07:30
どうしてそんなことをする必要があるのかってところから考えたほうがいいよ。

494:デフォルトの名無しさん
07/09/02 19:09:41
>>493
いや、タイマーに使いたいのですが。

495:デフォルトの名無しさん
07/09/02 19:14:44
>>492

main()
{
  int A = 0;
  while (1) {
    sleep(1);
    A++;
  }
}

496:デフォルトの名無しさん
07/09/02 19:16:24
>>492
つ time.h
使った事無いけど…orz

497:デフォルトの名無しさん
07/09/02 19:21:45
CでMMOのBOT作れるんでしょうか?

498:デフォルトの名無しさん
07/09/02 19:22:16
いいえ

499:デフォルトの名無しさん
07/09/02 19:29:53
タイマーの値が必要なときに、現在時刻を取得すればいいんじゃない?
時刻の取得の仕方は環境依存

500:デフォルトの名無しさん
07/09/02 19:35:31
>>495-496
ありがとうございます
試してきます

501:487
07/09/02 20:03:34
>>488
> 文字列を逆順に表示したりするプログラムを書くためですか?hw
なかなかよいポイントをついているね

プログラミングの本質はデータの加工と入出力
世の中のすべてのプログラムは「文字列を逆順に表示したりするプログラム」

データーベースのアプリだって通信モジュールだって高度な科学技術計算のプログラムだって
みーんな本質的には「文字列を逆順に表示したりするプログラム」だ
OSもね


502:デフォルトの名無しさん
07/09/03 05:33:18
もっと軽い言語がたくさんありますよ今は

503:デフォルトの名無しさん
07/09/03 20:21:34
例えば何?

504:デフォルトの名無しさん
07/09/03 23:10:59
おい、五輪実況(男)で看板とか名無しとかLRとか決めるからおちょくりに来いよ
ヒント:なんかVIPの同盟国とかほざいてるから

スレリンク(ootoko板)


505:デフォルトの名無しさん
07/09/04 16:12:59
>>503
スクリプト系の言語のことをいってんじゃないの?

506:デフォルトの名無しさん
07/09/04 16:17:54
スクリプト系はゲロ重だろ

507:デフォルトの名無しさん
07/09/04 18:12:15
int main(void)
{
do {
switch (getnum("番号を入力してください\n")) {
case 1:
question(1);
break;
}
} while (0);
return 0;
}

int getnum(const char *msg)
{
int n;

for (printf(msg); scanf("%d", &n) != 1;) {
while (getchar() != '\n');
}

return n;
}
ここで使われているgetnumがいまいち理解できません。
何をしてるいるのか教えてください。

508:デフォルトの名無しさん
07/09/04 18:18:44
printf(msg) は msg を表示
scanf("%d", &n) は数字を入力
!= 1 は scanf で数字が正しく入力されたか確認
while (getchar() != '\n'); は改行が来るまで入力を読み飛ばす
return n; は入力された数字を返す

これでおk?

509:507
07/09/04 18:40:35
>>508さん
よくわかりました。
ありがとうございます。

510:デフォルトの名無しさん
07/09/05 16:50:33
URLリンク(kansai2channeler.hp.infoseek.co.jp)
質問させてください。
+と-と|を使って升目を出力するプログラムです。
第一に40行目のところのコメントをはずすと最初のループはなぜ止まるのですか?
第二に40行目の部分のコメントをはずしたときに
47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
いろいろ試すうちに2つ目の問題もでてきて分からなくなりました。
よろしくおねがいします。

511:デフォルトの名無しさん
07/09/05 16:54:42
意味がわからない変数名はやめろ

512:デフォルトの名無しさん
07/09/05 17:09:32
continueやめてbreakにすれば?

513:デフォルトの名無しさん
07/09/05 17:45:26
>>510
> 第二に40行目の部分のコメントをはずしたときに
> 47行目を切り取り、49行目の後に記述すると結果が変わるのはなぜですか?
コンパイラのバグだと思われる。

514:デフォルトの名無しさん
07/09/05 18:09:57
>>510
>>512も言っているけどswitch内のcontinueやめてbreakにするとこうなる

+---+
|   |
+---+
|   |
+---+


515:デフォルトの名無しさん
07/09/05 18:14:27
>>510
確認してないけどたぶんあれね

continueにしちゃっているから44行目からwhile()の式評価にとんじゃっているんだと思う
実際には47~49行目は実行されていない
本来は47行目に行かなきゃ行けないのでbreakにする

516:デフォルトの名無しさん
07/09/05 18:20:35
32行目を下のように変更するだけで動作が変わるから、バグでしょ
while (d < e){

while (d < e){printf("");

517:デフォルトの名無しさん
07/09/05 18:26:23
gcc は期待したとおりの動作になったが
bcc だと >>516 の変更前後で出力内容が変化した

変更前
+---+

変更後
+---+
|   |
+---+
|   |
+---+

518:デフォルトの名無しさん
07/09/05 18:28:46
あっwhile (d < e)があったの気づかんかった
とりあえず>>515は忘れて

>>514は目的の動作が分からんので保留かな

519:510
07/09/05 18:42:26
皆さん見ていただきありがとうございました。
continueで戻ることばかり考えていてbreakを忘れていました、
while文の中にあるのでcontinueを使わずとも繰り返しになるのですね、
whileとbreakとcontinueの使い方を再確認します。
変数名も以後気をつけます。

コンパイラのバグということで
他のコンパイラを試してみようと思っていたのですが
>>517さん試していただきありがとうございました。

520:デフォルトの名無しさん
07/09/05 21:23:40
>>519
switch があるから、breakはそっちを抜けるだけで
whileにまで影響しないんだよ
switchとwhileが同じbreakなのは
たまに不便だがな

521:デフォルトの名無しさん
07/09/05 22:16:45
まぁそういう時は多少見辛くてもif-else使うかな。俺は。
ループフラグとかgotoとかキラーイ

522:デフォルトの名無しさん
07/09/06 02:48:24
struct node *hoge(struct node* a)
{
struct node *b;
    b = a;
    a = NULL;
 free( b );
 return a;
}

free関数の形式を調べてみるとvoid free(void *ptr);と書いてありました
URLリンク(www.bohyoh.com)

つまり、上記の関数を実行すると、引き数で渡されたポインタaがNULLを代入される前に指していた領域を開できるということでしょうか?

自分で調べてみて「たぶんあっているな。」とは思ってもどうしても確信できなくて不安になってしまいます。みなさんはそんなことありませんでしたか?(このレス二つ目の疑問です)

523:デフォルトの名無しさん
07/09/06 04:23:10
適当な結果を標準出力に出力しつつ時々
y/n を聞いてくるコマンド ques が
あったとします。y/n を検知して
代わりに y を入力してくれる
プログラムを書きたいのですが、
何をキーワードに検索してよいのか
すらわかりません。パイプで検索したのですが
何か違う感じでした。
よろしくお願いします。


524:デフォルトの名無しさん
07/09/06 07:33:36
>>522
・できる。
・根本的にポインタを理解できていればそんなことはないと思う。

>>523
他に標準入力する項目がなく、quesが確実に標準入力を利用しているというのなら、
yes | ques
でOK。

525:デフォルトの名無しさん
07/09/06 10:22:16
>>524
すいません。C言語でやりたいのです。
それと質問に応じて no と答える場面もあります。
よろしくお願いします。


526:デフォルトの名無しさん
07/09/06 11:01:35
>>525
それなら、パイプで間違ってないと思う。
コマンドの標準出力/標準エラー出力を監視しながら特定のパターンを認識したら、
コマンドの標準入力に対して、yまたはnを投げる。

>何か違う感じでした。
何を期待しているか知らないが、コンソールアプリでは
WindowsのGUIアプリのように、入力待ちになったとかのイベントが
飛んできて、そこに処理を記述するわけではない。
実装はどうしても泥臭くなると思うが。

527:デフォルトの名無しさん
07/09/06 11:03:40
ファイル操作について質問なのですが、
もし現在の日付をfprintf("%d %d %d %d %d %d\n",local->tm_year・・・以下略
こういう風にファイルに保存したとしますよね。
このファイルを読み込むとき、
fscanf("%d%d%d%d%d%d",&year,・・・以下略という風に読み込んだとき、
何故yearという変数にはしっかりとyearで保存した数字が格納されるのですか?
説明下手ですみません。

528:デフォルトの名無しさん
07/09/06 11:07:05
fprintf("%d %d %d %d %d %d\n",local->tm_year・・・
で書き込むと当然、
2007 09 06 ・・・
となるから、fscanf("%d%d%d%d%d%d",&year,・・・で読み込むときは
空白か改行まで読まれるので
2007
09
06
・・・
と順に読み込まれる

529:デフォルトの名無しさん
07/09/06 11:08:05
なぜって言われても、それが fscanf という関数の機能なんだし。
どういう結果になると思ってた?

530:デフォルトの名無しさん
07/09/06 11:10:00
なるほど・・・左上から順に変数に格納されるんですね。それなら呼び出す
順番に気をつけないとメチャクチャになりますね。分かって良かった。
ありがとうございました。

531:
07/09/06 16:45:10
すいません。gccの拡張命令について知りたいのですが
どこかに命令一覧が載ってるサイトってありますか?

532:デフォルトの名無しさん
07/09/06 16:52:09
配列を引数として関数にいれて、関数でその配列の中身を表示しておいて
mainでその関数を100回くらいまわしたら
値がかわってくるんだけど何が原因だと思われますか?

配列は20要素で
引数は4つ使ってます。

533:デフォルトの名無しさん
07/09/06 16:56:09
>>532
そりゃプログラムのバグでしょ
具体的にコード見せてくれないとそれ以上はわからん

534:デフォルトの名無しさん
07/09/06 17:09:10
void makemake(---){ (これをmainと思ってください)
double ma[120][20];
double h1[20],h2[20],n[120];
int num;

fileinput(h1,h2,num);
for(i=0;i<120;i++){
n[i]=fmake(ma[i],h1,h2,num);
}
}

そしてfmake関数に渡します
double fmake(double a[20],double b1[20],double b2[20],int n){
int i;

for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}

}

まー一部なんでわかりにくいかもしれませんが。
fmake関数のprintfで20ループくらいまでは
きちんと表示されるんですけど途中でnanとかおかしな数字が表示されるんです。



535:デフォルトの名無しさん
07/09/06 17:10:21
not a number

536:532
07/09/06 17:13:30
534ですけどお願いします。

537:デフォルトの名無しさん
07/09/06 17:25:07
そのファイルがおかしいんじゃないの

538:デフォルトの名無しさん
07/09/06 17:26:57
>>536
思わず笑ってしまった。
>>535の not a number は>>534の nan を指してる。

NaN (Not a number)、日本語だと非数。

浮動小数点演算で、0除算など計算結果が正しく求められない計算を
したときに、値が正常でないことを示す特別な値が格納される。その値のこと。

繰り返しはまったく同じものを表示しているわけではないみたいだけど、
fileinputで読んできた値がすでにおかしいんじゃないの?

539:デフォルトの名無しさん
07/09/06 17:45:24
>>534
fileinput をでっちあげて動かしてみたが、まったく問題ない。
省略した部分がおかしいと思われ。

540:532
07/09/06 17:46:27
ファイル入力が間違ってるんじゃないかって指摘するってことは
プログラムはあってるってことですか
ありがとうございます。

どうしようもなくなったら直接fmakeにb1,b2のファイルいれますわ。

541:デフォルトの名無しさん
07/09/06 17:49:45
>>540
プログラムもなにも、挙げられた断片だけでは何もしないコードに見え
る。fmake()は何も返してないし。


542:532
07/09/06 17:53:22
正規分布のプログラムなんすよ。
double a[20],  データ120X20
double b1[20],  20次元の平均
double b2[20],  20次元の分散
int n      平均・分散の組。
式は書くの大変だから省いてるだけです。

543:デフォルトの名無しさん
07/09/06 18:02:25
予想ではたぶんその式が悪い

544:532
07/09/06 18:04:15
double fmake(double a[20],double b1[20],double b2[20],int n){
int i;

for(i=0;i<20;i++){
printf("b1:%lf b2:%lf",b1[i],b2[i]);
}

以上

545:デフォルトの名無しさん
07/09/06 18:06:14
わからなければ計算したり配列弄るごとに中身出力してみ

546:デフォルトの名無しさん
07/09/06 18:30:27
どこが悪いかわかんないのに、なんでそこが悪いと思うのか理解できない。

547:デフォルトの名無しさん
07/09/06 19:15:12
このソースがコンパイルできないんですけど
どこに問題があるんですかね?
コンパイラはgcc3.3.6です。
URLリンク(www8.uploader.jp)

548:532
07/09/06 19:33:26
>>532て書いてるんですけど。
式はあってるんだよ確認ずみだから。
入力のプログラムがあやふやだからここで聞いただけ。

549:デフォルトの名無しさん
07/09/06 19:35:12
はいはい。コンパイラのバグかなんかじゃねえの。

550:デフォルトの名無しさん
07/09/06 19:39:09
そろそろ荒らし化しそうな予感

551:デフォルトの名無しさん
07/09/06 19:48:25
こんなアホ相手にするお前ら優しいな

552:デフォルトの名無しさん
07/09/06 19:48:45
よく言われる

553:デフォルトの名無しさん
07/09/06 19:51:32
>>547
配列の宣言の仕方とsizeの扱い直せばいけると思う

554:デフォルトの名無しさん
07/09/06 19:53:07
>>553追加でコンパイルするだけならsizeはそのままでもいいかも
連投スマン

555:デフォルトの名無しさん
07/09/06 20:18:46
どんどん本性が出てきたな

556:デフォルトの名無しさん
07/09/06 21:39:02
>>510 が、もう見てないだろうから、書いてみる
#include<stdio.h>

int main(void){
int x, y, width=3, height=4;

for(y=0;;y++){
for(x=0;x<width;x++) printf("+---");
printf("+\n");
if(y>=height) break;
for(x=0;x<width;x++) printf("| "" "" "); // コピペ用
printf("|\n");
}
return 0;
}

557:デフォルトの名無しさん
07/09/06 22:38:24
殆どのネットゲームのBOTは C言語で開発されてるんでしょうか?
サイトありましたらおしえてください m)_ _m)

558:デフォルトの名無しさん
07/09/06 22:43:18
無い

559:デフォルトの名無しさん
07/09/06 23:16:50
URLリンク(www.google.co.jp)

560:デフォルトの名無しさん
07/09/07 10:46:15
>>559
ありがとうございました

561:デフォルトの名無しさん
07/09/07 12:55:50
ネトゲのBots全てがCで作成されているかは知らんが
Cで作成できないことはない。
まぁ開発にあたっては、Cの知識だけでなく、それ以上の多くの知識が求められます。

562:デフォルトの名無しさん
07/09/07 14:31:57
UWSCあたりならすぐに書けそうだな。

563:デフォルトの名無しさん
07/09/07 16:02:02
関数は自分で積極的に作ったほうがいいですか?
それとも既存のものの効率的な組み合わせにこだわったほうがいいですか?

564:デフォルトの名無しさん
07/09/07 16:59:44
既存のものの効率的な組み合わせをする関数を自分で積極的に作ったほうがいい

565:デフォルトの名無しさん
07/09/07 19:00:20
>>564
ありがとうございます。なるほど!積極的に作ります

566:デフォルトの名無しさん
07/09/07 19:21:22
グローバル変数として宣言する場合と、staticを付けて関数内で宣言する場合は
どういう違いがあるんでしょう?いくつかの説明文見たところ自分では同じように
思えるんですが、グローバル変数にstaticを付けるプログラムの例を見かけたので気になりました。

567:デフォルトの名無しさん
07/09/07 19:27:15
static を付けないグローバル変数 → 他のファイルからでも参照できる
static を付けたグローバル変数 → 他のファイルからは参照できないが、同じソースファイル内ならどの関数からでも参照できる
static を付けた関数内の変数 → 他の関数からは参照できない

間違って書き換えたりしないように、見える範囲をなるべく最小限にする方が良い。

568:デフォルトの名無しさん
07/09/07 19:40:10
>>567
ありがとうございます、アクセスできる範囲に違いがあるんですね。
つい値を保持できる期間ばかりに目が言ってたみたいです

569:デフォルトの名無しさん
07/09/07 23:03:28
入力された文字列が正しい文字列かを判断するプログラムなんですけど

#include <stdio.h>
#include <string.h>

int getflg(char wd);
main()
{
int n;
char word;
printf("文字入力:");
scanf("%s",&word);
n=getflg(word);
printf("flg=%d",n);
}
int getflg(char wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}

return flg;
}

これだとエラーがでるのですがどうすればよいのでしょうか;;

570:デフォルトの名無しさん
07/09/07 23:06:22
>char word;
>printf("文字入力:");
>scanf("%s",&word);

え?w

571:デフォルトの名無しさん
07/09/07 23:08:53
>>569
「文字」ではなく「文字列」だから

#include <stdio.h>
#include <string.h>

int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}

int getflg(char *wd)
{
int flg=0;
if ( strcmp(wd,"あいうえお")==0 ){
flg=1;
}
return flg;
}

だね

572:569
07/09/07 23:13:04
>>570
すいません

>>571
文字だと&が必要で
文字列だと&は必要ないということですかね?

あと*wdにするのはなんでですかね?汗

573:デフォルトの名無しさん
07/09/07 23:18:20
>>572
>文字列だと&は必要ないということですかね?
必要ない

>scanf("%s",word);
>if ( strcmp(wd,"あいうえお")==0 )
文字列同士の比較をしたいわけでしょ

char wd だと1文字だけしか渡せない、文字列として渡したいならポインタとして渡すしかない
char *wd は文字列のポインタを渡している

574:デフォルトの名無しさん
07/09/07 23:30:21
#include <stdio.h>
#include <string.h>

int getflg(char *wd);
main()
{
int n;
char word[20];
printf("文字入力:");
scanf("%s",word);
n=getflg(word);
printf("flg=%d",n);
}

int getflg(char *wd)
{
return !strcmp(wd,"あいうえお") ? 1 : 0;
}

575:デフォルトの名無しさん
07/09/07 23:34:11
>>534
> double ma[120][20];
これでスタックフレームを何byte消費しているか理解しているか?

static double ma[120][20];
static double h1[20]
static double h2[20]
static double n[120];
にしてみろ

これで結果がお前の予想通りになったなら
コンパイラはお前の予想通りには動かないということを知っておけ


576:569
07/09/07 23:35:04
>>573
char wdだと1文字だけなんですか?

577:デフォルトの名無しさん
07/09/07 23:41:55
>>575
> これでスタックフレームを何byte消費しているか理解しているか? 

たった、18,9Kじゃん。


578:569
07/09/07 23:47:17
>>576をちと言い換えたいんですが、

int getflg(char wd[])
と違いは何かありますか??

579:デフォルトの名無しさん
07/09/07 23:52:06
>>578
int getflg(char wd[]);

int getflg(char wd);
の違いが理解できない奴はCをする資格が無い

VBかJavaScriptあたりで妥協しておくことをお勧めする



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch