- 1 名前:静的領域の名無しさん mailto:sage [2008/08/12(火) 18:23:10 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 114代目 pc11.2ch.net/test/read.cgi/tech/1216746971/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 33 pc11.2ch.net/test/read.cgi/tech/1217073697/ 過去スレ 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
- 267 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 21:38:28 ]
- char はどの環境でも1byteが保障されてるんですか?
- 268 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:22:57 ]
- >>267
Cの世界だと、常にcharは1バイト。 ただ、1バイトが8bitとは限らない。
- 269 名前:デフォルトの名無しさん mailto:sage [2008/08/17(日) 22:29:25 ]
- 1バイトを16ビットにしてlongを128ビットにすればよかったのに・・・
- 270 名前:デフォルトの名無しさん [2008/08/17(日) 22:43:54 ]
- >>268
現在稼働中で 1byte≠8bitな環境ってどんぐらい残ってんだろ?
- 271 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:35:30 ]
- switch+caseを使って分岐させると、プログラム自体は遅くなってしまうのでしょうか?
言葉など間違ってたらすみません。
- 272 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:44:24 ]
- >>271
足し算や引き算だって遅くなるぞ
- 273 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 02:47:27 ]
- if else if else if else if ... で同じような分岐をするのと比べてならswitch caseが遅いということはないはず
- 274 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 03:05:08 ]
- >>271
最適化のこともあるので分かりません
- 275 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 06:56:05 ]
- 符号有/無の変数同士の四則演算についての質問です。
long hoge1=-101; ulong hoge2=100; printf("%d",(hoge1+hoge2)); とすると、「-1」が、 if( (hoge1 + hoge2)>0){printf("和が0以上\n")} とすると、「和が0以上」と表示されました。 結果として、printfは正常、if文は異常な動作をしています。 if( (hoge1 + (long)hoge2)>0)・・・のように if文中で使用している変数を型を揃えた場合、if文も正常に動作しました。 おそらく、if文中では変数の型を揃えないといけないものと勝手に理解しましたが、 これはC言語の仕様によるものでしょうか?
- 276 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 07:14:31 ]
- 符号付きと符号無しで演算すると有効範囲の絶対値が大きいほうが優先されるのか…知らんかった
- 277 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 07:17:42 ]
- >>275
%dはintに型変換されるから。
- 278 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 08:32:52 ]
- >>275
printfでは実際の数値はわからない フォーマット指定でいかようにも変わる printf("%d",(hoge1+hoge2)); printf("%u",(hoge1+hoge2)); printf("%hu",(hoge1+hoge2));
- 279 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 09:37:22 ]
- >>271
switch case はgccとかなら最適化で速くなるぜ。 使用しているコンパイラで色々試してみるのも一興
- 280 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 10:47:45 ]
- >>271
入門レベルで気にするほどは変わりません。最適化で同じになる可能性もあることは既に指摘の通り。
- 281 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:37:11 ]
- 添え字でアクセスできる多次元の配列の動的確保ってだいたい下みたいな感じでいいのか?
もっとクールでスパーハッカー的なやりかたってある? a = (int **) malloc(sizeof(int *)*A); for(i = 0; i < A; i++) a[i] = (int *) malloc(sizeof(int)*B);
- 282 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:40:44 ]
- >>281
pc11.2ch.net/test/read.cgi/tech/1217123234/133/
- 283 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:43:12 ]
- >>282
半分動的だけど、半分静的じゃん
- 284 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:44:53 ]
- >>283
AもBもコンパイル時には確定しない値(変数)にしたいなら、簡便法はない。
- 285 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:46:33 ]
- >>284
C99に足をつっこむという簡単な方法が!
- 286 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:51:29 ]
- >>281
要求する領域全体が、メモリ上に連続で確保できる程度の大きさなら、 一遍に割り付けたほうがmallocのコストが低い。 a = (int **) malloc(sizeof(int *)*A); a[0] = (int *) malloc(sizeof(int)*A*B); for(i = 1; i < A; i++) a[i] = a[i-1] + B; もちろんどっちがいいかは場合による。
- 287 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 15:53:16 ]
- >>286
志村、その論点ならmallocもう1個減らせるよ
- 288 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 16:14:26 ]
- 質問者じゃないが、なるほど。
- 289 名前:デフォルトの名無しさん [2008/08/18(月) 18:22:32 ]
- cygwin環境でgccを使っています。
<ncurses.h>のprintwを使って全角文字を表示しようと文字化けします。 同じ書式で標準出力でprintfを使った場合は、全角文字が表示されているので、 端末などの設定は正しいと思います。 リアルタイムでキー入力を受け付けるgetch()が使いたいので、ncursesは必要です。 解決方法ないでしょうか。
- 290 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 18:48:10 ]
- >>289
エディタぽいのつくってるのかな。 全角に半角上書き処理してるんじゃないかとエスパー。
- 291 名前:289 mailto:sage [2008/08/18(月) 18:56:28 ]
- >>290
#include <ncurses.h> #include <locale.h> int main(void){ setlocale(LC_ALL,""); initscr(); printw("ほげほげ"); refresh(); usleep(1000000); endwin(); } ここまで短くしても文字化けしてしまいます。
- 292 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:48:33 ]
- >>286,287
a = (int **) malloc(sizeof(int)*A*B); for(i = 1; i < 20; i++) a[i] = a[i-1] + B; つまりこういうこと? こっちのほうがfreeも一回でいいから便利そうだねd!
- 293 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 19:58:22 ]
- >>292
それは明らかにおかしい。
- 294 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:06:05 ]
- よく分からんが
malloc(sizeof(int)*A*B + sizeof(int*)*A); って事かな
- 295 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:12:23 ]
- 無難に
a = (int **)malloc(sizeof(int *)*A); for(int i = 0; i < A; i++) a[i] = (int *)malloc(sizeof(int)*A);
- 296 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 20:41:11 ]
- a = (int **)malloc(sizeof(int) * A * B + sizeof(int *) * A);
for(i = 0; i < A; i++) a[i] = (int *)a + A + i * B; 〜 free(a); なんどもサーセン これで正解じゃなかったらあきらめる
- 297 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:24:01 ]
- おかしいです^q^
- 298 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:36:32 ]
- スレ違いだと思うんですが、system関数でぶち当たった問題なんで質問させてください。
現在、system関数で一行に複数のコマンドを打つ必要に迫られているのですが…ウィンドウズのプロンプトでの命令の区切文字ってあるのでしょうか? unix系だと「;」だったんですが、ウィンドウズの場合は一行一命令という絶望的な解説しか見当たりません。 一応「;」「,」「:」等を試してみましたがダメでした。 知っている方がいらしたら、よろしくお願いします。
- 299 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:40:18 ]
- スレ違いです。
- 300 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:48:44 ]
- スレ違いだと思うなら質問しないでください。
- 301 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 21:51:11 ]
- この>>300はおかしい
- 302 名前:ym [2008/08/18(月) 22:02:21 ]
- チェック文字列で渡された文字列が全てアルファベットのA〜Zの文字で構成されているかをチェックして
正常終了値;0 異常終了値;−1で判定するプログラムを誰か教えてください。 お願いします。
- 303 名前:デフォルトの名無しさん [2008/08/18(月) 22:05:12 ]
- >>296
だから無難に a = (int **)malloc(sizeof(int *)*A); for(int i = 0; i < A; i++) a[i] = (int *)malloc(sizeof(int)*B); てして for(int i = 0; i < A; i++) free(a[i]); free(a); ってすればいいじゃん
- 304 名前:デフォルトの名無しさん [2008/08/18(月) 22:12:56 ]
- >>302
#include <ctype.h> int CheckFunc(char *str) { int i; int check; for(i = 0; str[i]; i++){ if((check = isalpha(str[i])) == 0) return -1; } return 0; }
- 305 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:13:29 ]
- >>298
NT系限定だけどこれはだめか? cmd.exe /c hoge & foo
- 306 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:21:05 ]
- >>302
static int checkstrA_Z(const char *str); int main(int argc, char *argv[]) { if ( argc < 1 ) { return -1; } return checkstrA_Z(argv[1]) } static int checkstrA_Z(const char *str) { for ( ; *str; str++ ) { if ( !(('A' <= *str) || (*str <= 'Z')) ) { return -1; } } return 0; } /* EOF */ 適当に作った、遅かったか。しかも試してないのでサーセン。
- 307 名前:304 [2008/08/18(月) 22:36:29 ]
- 修正
>>302 #include <ctype.h> int CheckFunc(char *str) { int i; int check; for(i = 0; str[i]; i++){ if((check = isupper(str[i])) == 0) return -1; } return 0; }
- 308 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:38:49 ]
- >>306
なんで素直に { while(*str++){ if (('A' > *str) || (*str > 'Z')) { return -1; } return 0; } としない? 無意味に複雑にするから案の定、バグってるじゃん。
- 309 名前:298 mailto:sage [2008/08/18(月) 22:40:55 ]
- >>305
できました!! すれ違いな質問なのに、答えていただきありがとうございました! 他の皆さんにもご迷惑をお掛けしてすみませんでしたm(_ _)m ほいでは。
- 310 名前:308 mailto:sage [2008/08/18(月) 22:41:56 ]
- あー全然だめだ308もバグってる。突っ込み歓迎。寝る。
- 311 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:44:55 ]
- ('A')
- 312 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:51:40 ]
- if文while文for文の条件の中に色々詰め込んでとにかくソース短くしようとする人って何なの?
- 313 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 22:55:52 ]
- while('A' <= *str && 'Z' >= *str) str++;
return *str == '\0' ? 0 : -1;
- 314 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:02:28 ]
- >>312
一般的に言って、短いほうが間違いがおきにくい。 複数の処理を一箇所にまとめて書くことはソースを縦に縮める効果がある。 一方で大抵の場合は同時に横に広がることでもあるので、 どちらを選ぶかはバランス感覚と好みの問題。 どっちがいいとか悪いとかいうことは、ない。
- 315 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:10:32 ]
- 画面は一般的に縦より横に長い、つまりはそう言うこと
と、どこかで見た記憶があるけど忘れた
- 316 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:12:41 ]
- 「短くしようとする時期がある」とかいう反応が返ってくると思ったのに
- 317 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:12:57 ]
- 長く書いてバグを紛れ込ますには馬鹿と相場が決まっている
- 318 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:14:24 ]
- 313 - 314 はその調子で何Step組んだことあるの?
- 319 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:17:16 ]
- そして>>317はたった1行の日本語ですら間違えてしまう。
- 320 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:19:35 ]
- 文法ミスはコンパイラがエラーを出してくれるから許されるのさ
- 321 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:19:55 ]
- Step数(大爆笑
- 322 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:20:19 ]
- 日立さん乙ですw
- 323 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:21:11 ]
- ステップ数ってあーた・・・・・
ロートルですか?
- 324 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:23:22 ]
- ごめん。たしかにロートルだ。
他にソースの長さを測る単位教えて若い人。
- 325 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:24:15 ]
- ソース長
- 326 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:24:50 ]
- 自分で考えろジジイ
- 327 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:25:54 ]
- 行数のことをステップ数いうのがアレなんだろ。
- 328 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:27:38 ]
- メインフレーム時代の名残だろうな
- 329 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:29:33 ]
- 昔は、行数でプログラムの値段を算出していたんだろ。
- 330 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:30:23 ]
- ソースの長さを測る意味がわからん
同じ仕事をやる100行のソースAと1000行のソースBで偉いのはどっち?
- 331 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:31:06 ]
- >>330
だから、>>329
- 332 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:34:17 ]
- >>331
ということは、長くだらだらと書く奴の方が簡潔に書く奴より高給を貰ってた訳か 狂ってるな
- 333 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:34:18 ]
- 可読性の話をしてると思ってたのだが。
- 334 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:35:49 ]
- >>332
正直者はいつも馬鹿を見るのがこの世です
- 335 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:36:21 ]
- >>332
まー実際は予算も決まってるし、新規で行数書けばその分テスト件数も増やさないといけないとか いろいろあるのよ>日立の場合。
- 336 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:44:00 ]
- >>302
n = strspn(s, "ABCDEF・・・XYZ"); if (s[n] == '\0') return 0; else return -1; とすれば、ループもなくなるなと一瞬思ったけど、やっぱ"ABCDEF・・・"と書くのがダサいな。 isupperでまわしたほうがいいか。 あと、正常が0で、異常終了で-1ってのも、出題者のセンスが・・・
- 337 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:45:35 ]
- >>332
つか、メインフレームの作業体制は極度に分業が進んでいて コーダーという人は詳細フローを言語のコードに一行ずつ落とすだけ。 そういう環境だから、ステップ単価というのは有効だったんだよ
- 338 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:49:20 ]
- >>336
正常0は理にかなってるよ 正常は一通りしかないが、異常にはいろんなケースがある だから正常は0を返し、エラー時はエラーコードを返すほうがいい
- 339 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:53:14 ]
- >>338
だからウゼーって 独り言はチラシの裏にでも書いてろ
- 340 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:54:30 ]
- >>338
この場合は、エラーは一通りしかないじゃん。 bool値のかわりで、0と0以外のほうがいい。 それに、そういう思想だったら、-1じゃなくて、0とマイナス値としておかないとダメ。
- 341 名前:デフォルトの名無しさん [2008/08/18(月) 23:56:05 ]
- 多分この問題の次ではアルファベットじゃなかった文字数を返すようにしましょうって続くんだよ
きっとそうだよ
- 342 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:58:21 ]
- >>339
完全に反論の余地がない時は黙ってた方がいいですよ
- 343 名前:デフォルトの名無しさん mailto:sage [2008/08/18(月) 23:59:58 ]
- どう見ても初学者用の問題なのにstrspnとかisupperつかってかえって混乱させようとしてるやつなんなの?
- 344 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:00:11 ]
- 入力がヌル文字列の場合はどっち?
- 345 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:04:42 ]
- >>343
ああ、そういえば再帰とかつかって、面白い回答にするの忘れてたな。
- 346 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:05:54 ]
- 今からでも遅くないからさっさとやれよ
- 347 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:12:35 ]
- >>343
標準ライブラリ関数を使うことの何が問題なんだかわからん string.hに定義されてるような車輪の再発明をやらせる方がよっぽど問題だ
- 348 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:13:05 ]
- >>342
反論の余地とかそういう問題じゃなくてお前がうざいの
- 349 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:14:15 ]
- >>348
しーっ!これ以上書くと頭が悪いことがばれますよ!
- 350 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:15:18 ]
- Cだと文字列の理解はC言語自体の理解にも多少は
繋がる気がするから再発明も完全に無駄だとは思わない俺
- 351 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:16:29 ]
- 文字列じゃなくて文字配列か
- 352 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:16:34 ]
- >>349
お前がな
- 353 名前:304 [2008/08/19(火) 00:22:21 ]
- >>302
じゃ初学者用に書くよ int CheckFunc(char *str) { int i; for(i = 0; str[i]; i++){ if ('A' > str[i] || str[i] > 'Z') return -1; } return 0; } >>344 0が返る
- 354 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:25:07 ]
- >>353
○strがNULLだと落ちる ○iは無くても書ける
- 355 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:26:59 ]
- 文字列に大文字以外が含まれているかどうか調べる関数って、どういう関数名が適切だと思う?
- 356 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:27:27 ]
- >>352
しーっ!これ以上書くと頭が悪いことがばれますよ!
- 357 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:28:01 ]
- >>354
引数にNULLを渡してはいけないという仕様です。
- 358 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:29:43 ]
- >>313でおk
- 359 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:29:59 ]
- >>357
君の世界ではそれでいいのかもしれないが、俺の世界では文字列のNULLチェックを怠ったばかりに 落ちてしまうソフトが後を絶たないんだなこれが
- 360 名前:デフォルトの名無しさん [2008/08/19(火) 00:32:54 ]
- ポインタを渡す関数はnullかどうかひかくしなくてはいけないのですか?それが一般的ナのですか?
- 361 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 00:43:45 ]
- >>359
あなたの世界では、たとえばstrcat()にNULLを渡したときに、落ちずに正常に動作してますか? strcat()がNULLを渡しても動作するとしたら、どう動作すればいいですか?
- 362 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 01:04:20 ]
- パルプンテ
- 363 名前:デフォルトの名無しさん [2008/08/19(火) 01:14:15 ]
- そうだな、システムコールとかは異常が-1、正常がそれ以外だったりするしね。
- 364 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 02:40:04 ]
- >>361
顔が真っ赤ですよ
- 365 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 03:04:33 ]
- >>364
しーっ!これ以上書くと頭が悪いことがばれますよ! ってもう遅いけど
- 366 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 04:02:45 ]
- ポインタを渡された側がNULLかどうかをチェックしてもあまり役に立つとは思わないけど。
無効なポインタは別にNULLだけじゃないから、無効なポインタは渡す側の責任でしか回避できない。 もちろん渡された側でのNULLチェックで回避できる問題もある。 でも渡される側でNULLチェックを怠ったばかりにおちてしまうような関数の使い方をしているようなプロジェクトなら、 他にも無効なポインタを渡してしまうような潜在的な危険があったりするおそれも。 >>357の人も引数に渡してはいけないのはNULLとせず、無効なポインタとすべきだったと思う。
- 367 名前:デフォルトの名無しさん mailto:sage [2008/08/19(火) 09:43:53 ]
- NULLは呼んだほうの責任だからな。
まあassert入れといてもバチはあたらんと思うが。
|

|