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

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

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

★前スレ
C言語なら俺に聞け(入門編)Part 81
http://hibari.2ch.net/test/read.cgi/tech/1301773320/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 147代目
http://hibari.2ch.net/test/read.cgi/tech/1301553333/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
★ぬるぽ。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
http://codepad.org/
0153デフォルトの名無しさん2011/04/20(水) 01:55:19.65
>>152
コンパイラによっては配列サイズを知ることもできるらしいが
そうだとしても渡されるものが配列の先頭である保証がないから
やっぱりサイズも渡すのが無難
0154デフォルトの名無しさん2011/04/20(水) 02:00:12.07
memset() を使いたいなら、こんな感じかなあ。。。

#include <string.h>
#define BUFSIZE 4096

int main() {
    char buf[BUFSIZE];
    func(buf);
}

void func(char buf[]) {
    memset(buf, 0, BUFSIZE);
}
0155デフォルトの名無しさん2011/04/20(水) 02:21:06.37
>>154

あ、
これが王道っぽい
0156デフォルトの名無しさん2011/04/20(水) 03:25:11.29
そもそもサブルーチンの中で初期化しなければならない状態ってのがどうなんだろう?
実は初期化しなくともどうにかならないかい
0157デフォルトの名無しさん2011/04/20(水) 03:29:36.91
typedef char HOGE[64];

HOGE hoge;//char hoge[64];

こういうtypedefの使い方ってすごく気持ち悪いんですけど一般的なんですか?
0158デフォルトの名無しさん2011/04/20(水) 07:07:50.66
>151

Cでは関数の引数として配列を渡すことはできない。
常にポインタとして渡すことになる。
(>148でsizeof(buf)が4になるのはそのため)
スマートも何も、引数として渡すしか方法はない。

0クリアしたいというのなら、どのみち関数内でも
配列のサイズが必要になると思われる。
0159デフォルトの名無しさん2011/04/20(水) 07:09:25.04
>>148
MSC の cgets() みたいにすれば。

main{
char buf[4096];
*(int*)buf = sizeof buf;
kansuu(buf);
}
kansuu(char buf[]){
memset(buf, '\0', *(int*)buf);
}
0160デフォルトの名無しさん2011/04/20(水) 07:10:21.09
>157
配列とか、ポインタが隠蔽されるのは個人的には嫌い。
しかし、型が入れ子になっている場合、宣言が読みやすくなるという人もいるだろう。

char (*p)[64];
より
HOGE *p;
が読みやすい、など
0161デフォルトの名無しさん2011/04/20(水) 07:11:24.62
>154のようにBUFSIZで縛るのは愚策だな
0162デフォルトの名無しさん2011/04/20(水) 07:12:59.34
>>159
環境に依っては実行時に転けるので要注意。
0163デフォルトの名無しさん2011/04/20(水) 07:15:01.74
>>160
読みやすいつーか
その二つは違うだろ
0164デフォルトの名無しさん2011/04/20(水) 07:23:34.78
>>162
どんな環境だよw
0165デフォルトの名無しさん2011/04/20(水) 07:35:30.32
>>164
char配列をint境界に割り当てないコンパイラと、境界を跨いだintアクセスのできないCPUの組み合わせ。
0166デフォルトの名無しさん2011/04/20(水) 07:37:12.46
ARMなんて捨てちまえよ。
0167デフォルトの名無しさん2011/04/20(水) 07:42:47.66
知ったかを主張したいんですね
0168デフォルトの名無しさん2011/04/20(水) 09:09:23.07
          / ̄\
          |    |
          \_/
          _ |__
        /      \
       /  ─    ─\
     /    ⌒  ⌒  \
      |      ,ノ(、_, )ヽ    |
      \      トェェェイ   /   おしっこジョボジョボミラジョボビッチ♪」
       /   _ ヽニソ,  く     おしっこジョボジョボミラジョボビッチ♪」
   三. i!   ゙ヽ、 Y"  r‐!、 ヽ.
    三 ヽ. 、 ''´⌒ゝ-‐'" _ィ》 Y!
       \_|!_二|一"f ,  !゙\  三
         〈, l|゙》-i|┴ーi´ / イ ´ i! 三
      ♪   ゙ー-ニ二__,/  / / 三       ♪
               /゙ У   / /  三
            //,/-‐、  /
            i! _{!   j!'〈   ♪
          / ,,.ノ \'' ヽ \
            〈 ーぐ     \   ヽ
          ゙ー″      〉ー- 〉
                   〈___ノ
0169デフォルトの名無しさん2011/04/20(水) 09:09:54.74
ほっほっ
0170デフォルトの名無しさん2011/04/20(水) 09:13:43.08
ほっほっ
0171デフォルトの名無しさん2011/04/20(水) 09:31:19.71
ふっほっ
0172デフォルトの名無しさん2011/04/20(水) 09:32:57.84
>>161
どうしてそう思ったのかな?
0173デフォルトの名無しさん2011/04/20(水) 09:40:39.08
>>161
BUFSIZなんて使ってないが
0174デフォルトの名無しさん2011/04/20(水) 10:04:06.53
>>173
Eが落ちた。

>>172
使い回しできない。使い回ししないなら、関数内でクリアするより呼び出し側でクリアする方が自然(≒依存度が下がる)。
0175デフォルトの名無しさん2011/04/20(水) 10:10:29.92
私はmemsetの話を関数の依存性の話にすり替えることで優位に立とうとします。
0176デフォルトの名無しさん2011/04/20(水) 10:11:22.63
優位もへったくれも、そんなもの気にするから小物なんだよ。
0177デフォルトの名無しさん2011/04/20(水) 10:16:09.72
WindowsでC99コンパイラーはありますでしょうか?
0178デフォルトの名無しさん2011/04/20(水) 10:18:26.03
MinGW は C99 使えるよ
0179デフォルトの名無しさん2011/04/20(水) 10:29:53.18
GNU gcc
Cygwin でも C99 使えるよ
0180デフォルトの名無しさん2011/04/20(水) 10:31:39.03
>>178-179
�d
0181デフォルトの名無しさん2011/04/20(水) 10:53:34.93
>>174
君が言ってるのは、お題が気に食わないってことかな?
ここでは関数内で初期化する事が要件なんだけど。

それと、数行のコードの再利用性で愚作とまで言い切るのは相当凄腕のエスパーだよね。
この程度のコード片なら、使い回し等考えずに一番簡潔な方法で書いた方が良いと思うわ。
0182デフォルトの名無しさん2011/04/20(水) 10:59:40.10
関数に配列の大きさを渡さないで、関数内部に固定の数値を持つことが気に食わないんだろ
0183デフォルトの名無しさん2011/04/20(水) 11:01:39.76
>>181
×愚作
○愚策
普段から策もなく行き当たりばったりに作っているから間違えるんだよ。

そもそも、memset()するだけの関数なんて存在意義がない。
何らかの処理をする関数の一部と考えれば使い捨てと断じるのは迂闊。
0184デフォルトの名無しさん2011/04/20(水) 11:05:33.15
でも論点ズレてるよね^^
ブフフwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0185デフォルトの名無しさん2011/04/20(水) 11:22:12.62
あれ?揚げ足取ってるだけじゃね?w
0186デフォルトの名無しさん2011/04/20(水) 11:47:10.76
そろそろマクロに頼る頭カチカチコーディングから卒業するべき
配列のサイズを知る方法は確立されてるんだからそれを使え
0187デフォルトの名無しさん2011/04/20(水) 12:13:32.99
>>186
コード書いてみてください
0188デフォルトの名無しさん2011/04/20(水) 13:29:18.23
memsetはインライン展開される場合もあるのに、関数化などお笑い
0189デフォルトの名無しさん2011/04/20(水) 13:45:34.00
今まで書いたコードを間違って上書きしてしまいました。
CTRL+Oでファイルを開くつもりが、人的操作ミスでファイルを保存するダイアログを開いてしまい、
現在の内容を選択したファイルに保存してしまいました。
このような事を二度と繰り返したくないのです(3回ミスをしました)
どのようにバックアップを取ればよいでしょうか?
0190522011/04/20(水) 13:49:14.07
自動で履歴をとっておけよ。そういうソフト入れろよ。
0191デフォルトの名無しさん2011/04/20(水) 13:51:15.96
Emeditorや秀丸とかのエディタは、過去の履歴を自動でバックアップする設定付いてるぞ。
別のエディタでも設定ある可能性。
自分は、少しでも変更あったらすべての連番を自動バックアップしてる。
0192デフォルトの名無しさん2011/04/20(水) 13:57:34.03
最近は、編集中のバックアップとるとか気にしたことないな。
0193デフォルトの名無しさん2011/04/20(水) 14:09:23.94
バージョン管理ツール
0194デフォルトの名無しさん2011/04/20(水) 14:12:24.19
見事に話題をそらした>>186であった
0195デフォルトの名無しさん2011/04/20(水) 14:15:07.53
>>189
そういうミスをする根本原因を解決しないと、どんなツールを使っても同じミスをするぞ。
マウスの操作が苦手ならキーボードショートカットを使うとか、
判っていながら間違ったダイアログを開いてしまうのなら……その場合はどうしたらいいか知らんが。

>>191
自動バックアップって、>189のような上書きにも対応しているのか?
少なくとも一世代は先祖還りしそうな気がするのだが。

その点では、>189のミスに対応するには保存した版をバックアップする機能が必要になるね。
リビジョン管理ツールと連動できるエディタならできるだろうけれど。
0196デフォルトの名無しさん2011/04/20(水) 14:15:33.16
>>189
エディタの開くダイアログや名前を付けて保存ダイアログを使わない
エクスプローラから直接開いて上書き保存だけする
0197デフォルトの名無しさん2011/04/20(水) 14:19:12.66
つうかsizeof以外に配列のサイズ求める方法ってあるの?
0198デフォルトの名無しさん2011/04/20(水) 14:22:00.70
>>195
対応するエディタを使っていれば、上書き保存される前に、未変換のテキストをバックアップフォルダへ連番でバックアップできる。
0199デフォルトの名無しさん2011/04/20(水) 14:30:16.70
秀丸エディタ使ってます
GITをWindowsに入れてみたいのですが使い方とか良く分かりません

0200デフォルトの名無しさん2011/04/20(水) 14:33:59.80
入れてみる前から分かるはずないだろ
0201デフォルトの名無しさん2011/04/20(水) 14:45:32.36
>>199
おまえ、不正なPASSで秀丸使ってるだろ。
ちゃんと金払えよな。
0202デフォルトの名無しさん2011/04/20(水) 14:49:10.76
>>189
ショート・カットキーは押し間違えやすい
ミスタイプってあるよな?あれと同じ事が起きる
俺もCtrl+CとCtrl+Vをたまに押し間違える

対策はボタンを使うか、面倒だけどもメニューから
開くを選択する事だ
0203デフォルトの名無しさん2011/04/20(水) 14:50:03.09
すいませんミスです入れてた後です
入れた後なんですがどうやってバックアップを取ればよいのか
Gitって難しいですね
SVNなら簡単なんでしょうか?
秀丸エディタはお金を払って利用はしておりませんが作者様から免除のライセンスを頂いてますので正式ユーザーです
一応フリーソフト開発者です
0204デフォルトの名無しさん2011/04/20(水) 14:54:22.05
>>203
で、Gitの使い方ならGitスレへ。
0205デフォルトの名無しさん2011/04/20(水) 14:54:54.58
バージョン管理ツールは使い方わからん。
これって関数の仕様が決まってからでないと使えないのか?
動作しファイル組み合わせは自動で記録できるのか。
0206 忍法帖【Lv=15,xxxPT】 2011/04/20(水) 14:55:39.44
>>203
秀丸のバックアップ単体で十分。
0207デフォルトの名無しさん2011/04/20(水) 14:59:39.65
>>204
Gitのスレも除いてみます。ありがとうごじあます

>>205
お互い頑張りましょう。

>>206
えええええええええ
0208デフォルトの名無しさん2011/04/20(水) 15:01:06.78
すいませんミスです

×Gitのスレも除いてみます。ありがとうごじあます
○Gitのスレも覗いてみます。ありがとうございます

興奮して早くレス打たないといけないと思って誤字になりました。
0209 忍法帖【Lv=15,xxxPT】 2011/04/20(水) 15:03:46.68
秀丸のファイルタイプ別の、保存とかいう所に世代バックアップあるぞ。
常に秀丸を使うんだったら、この機能ONにしとけば全部残る。
0210デフォルトの名無しさん2011/04/20(水) 15:22:06.70
秀丸のバックアップを試してみたんですが
保存した内容と同じでないのでツライです
2回保存しないと同じ内容でバックアップになんないのでキビシイです
0211 忍法帖【Lv=15,xxxPT】 2011/04/20(水) 15:25:06.94
>>210
世代にしろ。変更前、保存前のデータが残るんだ。
変更前と変更後を常に残していけば良いんだよ。
0212 忍法帖【Lv=15,xxxPT】 2011/04/20(水) 15:27:37.99
動作しては。Aを更新して上書き保存する場合。
Aをバックアップフォルダへ移動した後に、変更後の内容をAのあった場所へファイル作成して保存するの。
0213デフォルトの名無しさん2011/04/20(水) 15:32:31.84
作業過程(途中) と 区切れ目(どりあえず動作可能な一式がそろった とか) とを 区別してるな

前者はバックアップとってない or フォルダ(ディレクトリ)ごと 別にコピー(おおがかりに変更かけるときとか)
後者は バージョン管理ツールでコミット
0214デフォルトの名無しさん2011/04/20(水) 15:36:07.11
>フォルダ(ディレクトリ)ごと 別にコピー(おおがかりに変更かけるときとか)
これこそ(分散型)リビジョン管理ツールの出番だ。
0215デフォルトの名無しさん2011/04/20(水) 15:39:21.54
何、C言語やってんのにここの連中はバージョン管理も出来ないの?
0216デフォルトの名無しさん2011/04/20(水) 15:45:00.63
>>214
主目的が コピペ元 なんで、基本的には管理ツールでことたりてるね
基本 1本幹で 枝からの平行成長は使わない方向かな…

枝分け 複数並行リビジョン運用 根に修正はいって マージどおすべぇ問題に目を背けてる使い方
0217デフォルトの名無しさん2011/04/20(水) 15:46:33.79
自分専用と割り切るならどの段階でもコミットしていいんでないかな。
タグだけ打っとけばどうにかなるだろ
0218デフォルトの名無しさん2011/04/20(水) 15:47:16.83
>>216
どおすべぇって、マージすればよくね?
0219デフォルトの名無しさん2011/04/20(水) 15:50:24.80
>>215
入門書では教えないからね(このこと自体クソだが)
0220デフォルトの名無しさん2011/04/20(水) 15:50:51.63
マージは怖くないよ
0221デフォルトの名無しさん2011/04/20(水) 15:57:42.62
便利なマージツール、マージンガーZってのをみつけたよ。
まじでググってみるといいよ。
0222デフォルトの名無しさん2011/04/20(水) 15:58:00.05
書けるのに読めない人がバージョン管理なんて出来るわけ無いでしょ
0223デフォルトの名無しさん2011/04/20(水) 16:00:24.52
自分はwindowsエクスプローラーで手動でドラッグアンドドロップして、
コピー 〜 ○○というのを作る。
失敗したら手動で戻す。
SVNとかテキストでそのまま残らないず管理ツール本体が壊れたら嫌だ。
0224デフォルトの名無しさん2011/04/20(水) 16:19:14.20
>>223
SVNなら週一でスナップショットをローカルに保存しときゃいいだろ。
まあGIT使えばそんな心配もねえけどな。
0225デフォルトの名無しさん2011/04/20(水) 16:23:20.81
言語の入門とバージョン/リビジョン管理入門はセットになってると良いが…
なかなかそうはいかんよな
0226デフォルトの名無しさん2011/04/20(水) 16:32:20.44
バージョン管理は使わん。
自動でやってくれないし、無駄なファイルを生成するし。
自動でバックアップフォルダへ連番つきで保存してくれれば十分。
普通のテキストエディタでこの機能は付いている。
0227デフォルトの名無しさん2011/04/20(水) 16:33:44.16
そりゃそうよ。本を書いているのは現場経験のない人間なんだから。
だから、未だにprintf()とscanf()のフォーマット指定は互換だなんて書いてある本が出回るわけで。
0228デフォルトの名無しさん2011/04/20(水) 16:35:52.95
重複しない名前でバックアップしてくれるだけで、
あとは問題起こったとき更新日時から手動で復元できる。
バージョン管理ツール何が良いのか。
0229デフォルトの名無しさん2011/04/20(水) 16:36:23.18
>>211
それだと
保存したときに、変更前の内容がバックアップに残り、
最新の内容がバックアップに残りません
最新の内容を間違えて上書きしちゃったときのためにバックアップを取りたいのでキツイです
0230デフォルトの名無しさん2011/04/20(水) 16:36:32.65
>>226
連番だけでひたすら保存して、特定の状態に戻したくなったらどうするの?

私は連番管理や日付け管理ではその辺りがどうにもならないからリビジョン管理ツールを使っているのだけれど。
分岐の管理もできるしマージは強力だし、今では只のバックアップに留まらずいろいろ有効活用しているけどね。
0231デフォルトの名無しさん2011/04/20(水) 16:36:47.80
差分見て違いがわからないと...
0232デフォルトの名無しさん2011/04/20(水) 16:39:19.36
>>229
最新の内容を上書きする前に自動でバックアップするから、
間違って上書きしないわけだが。エディタを固定して使っていたら。
0233デフォルトの名無しさん2011/04/20(水) 16:42:35.38
>>232
うああああああああああああああバックアップされてました
ためしに無題ファイルで上書きしたらバックアップされてました
すいませんでした
0234デフォルトの名無しさん2011/04/20(水) 16:45:11.14
あ、やっぱだめです
ファイルを削除したときはバックアップされませんでした
0235デフォルトの名無しさん2011/04/20(水) 16:53:46.53
削除すんなよw
ゴミ箱に入ってんじゃない
0236デフォルトの名無しさん2011/04/20(水) 17:03:38.25
無理ですよ
シフト+DELETEで消しましたから
0237デフォルトの名無しさん2011/04/20(水) 17:05:52.35
今度は間抜け自慢か?
0238デフォルトの名無しさん2011/04/20(水) 17:11:01.04
シフト+DELETEなどはまれに起こる異常事態と考えてあきらめて、一つ前の履歴から復元しろ。
これからはシフト+DELETEを使わなければ良い。


0239デフォルトの名無しさん2011/04/20(水) 17:12:38.97
一分ごとに自動保存、自動バックアップしていれば
異常事態が起こっても
最大で一分間の作業が無駄になるだけじゃん。
一分くらい気にするな。
0240デフォルトの名無しさん2011/04/20(水) 17:15:08.42
つか一度書いたソースくらいさっさと書き直せよ。
さっきより良いコードが必ず書ける。
0241デフォルトの名無しさん2011/04/20(水) 18:38:56.64
書くしか能がないのに覚えてるわけが
0242デフォルトの名無しさん2011/04/20(水) 19:17:36.28
          / ̄\
          |    |
          \_/
          _ |__
        /      \
       /  ─    ─\
     /    ⌒  ⌒  \
      |      ,ノ(、_, )ヽ    |
      \      トェェェイ   /   おしっこジョボジョボミラジョボビッチ♪」
       /   _ ヽニソ,  く     おしっこジョボジョボミラジョボビッチ♪」
   三. i!   ゙ヽ、 Y"  r‐!、 ヽ.
    三 ヽ. 、 ''´⌒ゝ-‐'" _ィ》 Y!
       \_|!_二|一"f ,  !゙\  三
         〈, l|゙》-i|┴ーi´ / イ ´ i! 三
      ♪   ゙ー-ニ二__,/  / / 三       ♪
               /゙ У   / /  三
            //,/-‐、  /
            i! _{!   j!'〈   ♪
          / ,,.ノ \'' ヽ \
            〈 ーぐ     \   ヽ
          ゙ー″      〉ー- 〉
                   〈___ノ
0243デフォルトの名無しさん2011/04/20(水) 20:01:23.92
ほっほっ
0244デフォルトの名無しさん2011/04/20(水) 20:18:18.35
教えてください
キーボードのAを押している間はディスプレイに任意の文字を出力させて、離したらその文字を消す
というプログラムをつくりたいです
ご教授お願いします
0245デフォルトの名無しさん2011/04/20(水) 20:26:24.35
>>244
非標準関数だけどgetch()を使う
0246デフォルトの名無しさん2011/04/20(水) 21:31:52.82
>>183
>何らかの処理をする関数の一部と考えれば使い捨てと断じるのは迂闊。

使い回すと考えるのも早計だと思うけど。
あの質問からそこまでネチネチ考えるのはむしろナンセンスじゃない?

茶茶入れする為の茶茶入れをしても誰からも感謝されないと思うんだが・・・
0247デフォルトの名無しさん2011/04/20(水) 22:38:35.62
          / ̄\
          |    |
          \_/
          _ |__
        /      \
       /  ─    ─\
     /    ⌒  ⌒  \
      |      ,ノ(、_, )ヽ    |
      \      トェェェイ   /   おしっこジョボジョボミラジョボビッチ♪」
       /   _ ヽニソ,  く     おしっこジョボジョボミラジョボビッチ♪」
   三. i!   ゙ヽ、 Y"  r‐!、 ヽ.
    三 ヽ. 、 ''´⌒ゝ-‐'" _ィ》 Y!
       \_|!_二|一"f ,  !゙\  三
         〈, l|゙》-i|┴ーi´ / イ ´ i! 三
      ♪   ゙ー-ニ二__,/  / / 三       ♪
               /゙ У   / /  三
            //,/-‐、  /
            i! _{!   j!'〈   ♪
          / ,,.ノ \'' ヽ \
            〈 ーぐ     \   ヽ
          ゙ー″      〉ー- 〉
                   〈___ノ
0248デフォルトの名無しさん2011/04/20(水) 23:01:43.39
普通は変更した部分なんて全部覚えてるから手動で戻せるだろ。
おまえら記憶力に障害でもあるのか?
脳の検査してきたほうがいいんじゃね?
0249デフォルトの名無しさん2011/04/20(水) 23:03:34.47
>>248
バージョン管理ツール必要ないな
0250デフォルトの名無しさん2011/04/20(水) 23:09:23.01
>>245
なんとかできそうです
ありがとうございました( ´ ▽ ` )
0251デフォルトの名無しさん2011/04/20(水) 23:13:08.21
ほっほっ
0252デフォルトの名無しさん2011/04/20(水) 23:13:24.05
ひゅん
■ このスレッドは過去ログ倉庫に格納されています