- 1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 35 pc11.2ch.net/test/read.cgi/tech/1219761846/ 過去スレ 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
- 39 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:11:49 ]
- >>38
そう作られているから。memcpy()と言う関数の振りをしているが、 その実体がCの関数かどうかは実装依存。 逆に言えば、コンパイラベンダが鎬を削るポイントでもある。
- 40 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:21:04 ]
- >>38
CPUは一発でデータをブロック転送できるから。 古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、 いまどきブロック転送の方が速い。
- 41 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:04:20 ]
- >>24
1) lpMetSect->lpSharedInfo->lAvailableCount--; 2) lpMetSect->lpSharedInfo->lAvailableCount -= 1; 3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1; (3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。
- 42 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:06:54 ]
- >>39
実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。
- 43 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:07:53 ]
- >>41
そんなもん間違うようなやつはそもそも1個でも間違うよ
- 44 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 20:16:24 ]
- >>43
読みやすさだよ。
- 45 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:49:55 ]
- 私が今作っている関数popは通常intを返すが、返すべき値が見つからない場合NULLを返します
しかし私の使っているコンパイラではNULL == 0は真になるので popの返り値がNULLであるか、0であるかを判別することができません エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか? まったくもって不愉快で、理解に苦しむ仕様です
- 46 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:56:54 ]
- 引数の一つを書き換える関数にして
戻り値のほうはリターンコードだけにすれば?
- 47 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:12:44 ]
- >>45
NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、 そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。 一般的には、>>46のいうように引数で返すか、 あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。 よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。
- 48 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:21:42 ]
- >>45 NULL == 0が偽になったら、それこそ大変
- 49 名前:デフォルトの名無しさん [2008/09/17(水) 00:24:43 ]
- 可変個引数の引数リストってメモリ上にならんではいってるの?
ポインタで移動できるみたいだから、そう思うんだけど。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:28:32 ]
- void push(int val);
int pop(void); のほうが体裁がいいんだろうな。 それだったら int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */ を作ってそれでチェックするというのもあり。 if (!isempty()) { val = pop(); }
- 51 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:33:36 ]
- >>49
そうでないといけないという決まりはないが、そうなっていることが多い。 というかそういうやつでは、可変個でないやつも同じように置かれていて、 その配置を応用しているという作りになっている。
- 52 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:37:32 ]
- あるいはintより大きな整数を返す関数にして、エラー値としてintに収まらない数を返す
- 53 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:12:51 ]
- >>52 ???
- 54 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:22:17 ]
- >>53
「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」 と同じ。
- 55 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:28:16 ]
- charはint幅でやりとりするけど、それと一緒にしてはいかんよ
- 56 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:30:43 ]
- >>46でいいだろ。
- 57 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 01:33:11 ]
- >>41
4) --lpMetSect->lpSharedInfo->lAvailableCount; これも追加しておいてくれお
- 58 名前:デフォルトの名無しさん [2008/09/17(水) 02:19:06 ]
- lpMetSect->lpSharedInfo->lAvailableCount += -1;
- 59 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 03:00:01 ]
- >>50
スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。 同時に複数のスタックが使えるようになるし。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 10:47:38 ]
- そこまでいくと、C++でやれって感じになるが。
- 61 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:46:15 ]
- すみません、どうしても解らなくて><
#include <stdio.h> int main(void) { int c; while(c = (getchar() != EOF)) { printf("%d", c); } printf("%d", c); } このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、 なんで繰り替えすのですかね? c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><
- 62 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:52:33 ]
- 改行文字だな
- 63 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:53:08 ]
- while(c = (getchar() != EOF)) {
printf("ループ内 %d", c); } printf("ループ外 %d", c); }
- 64 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:54:20 ]
- ごめん違うわ
cに名に入れたか考えてみろ
- 65 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 11:58:48 ]
- >>63
いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。 >>64 getcharでaを入力したとしたら、cには1が入りますよね? ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><
- 66 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:04:22 ]
- 自分で書いた汚いCコードを読み込んで綺麗に整形して出力してくれるアプリってないの?
- 67 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:06:26 ]
- >>65
改行も1文字分
- 68 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:12:08 ]
- インデント+α程度の整形ツールならあるけど
- 69 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 12:13:37 ]
- >>62
>>65 なるほど、やっと理解できました! でもgetcharは一文字入力なんですよね? なんというか根本が解ってない感じだw んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?
- 70 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:02:33 ]
- まぁ、そんなとこだね。
「次に改行文字でループに入り」というよりは、 「次に得るのが改行文字なのでループから脱出せずに」だけれど。
- 71 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:13:40 ]
- 入力が行単位でバッファリングされてるとわかりにくいかも
打った文字はEnterを打つまで入力されない Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる
- 72 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:25:23 ]
- 'a'と'\n'の値が両方1ってどんな処理系だよ
- 73 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:27:06 ]
- >>72
- 74 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:28:03 ]
- >>72
- 75 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:13 ]
- >>72
ちゃんと元のコード読め
- 76 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:29:21 ]
- 畜生見間違えた
そこに括弧ついてんのかよ!
- 77 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:13 ]
- ……カッコ悪い
- 78 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 13:34:39 ]
- >>76
ドンマイ!
- 79 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:15:59 ]
- >>8
微妙に意味がちがう。 a = 1; b = ++a; b = a++; では結果がちがう。 func ( a++, a+1, ++a) のとき、funcの引数がどんなになるか挙動不明。
- 80 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 01:23:59 ]
- >>79
単体で使った場合を聞いてたのにいまさらなにをw しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか
- 81 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:41:19 ]
- バイナリファイルを直接数字に変換する方法はどうすればいいのでしょうか?
rubyではunpack("s*")を使うのはしってるんですけど。
- 82 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:52:47 ]
- >>81
rubyのunpackは変換が目的だから、Cの場合はその必要が無い。 例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。 unsigned char foo[] = {1, 2, 0376, 0375}; unsigned short * bar = (unsigned short *) foo; printf("%u, %u\n", bar[0], bar[1]);
- 83 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:27:04 ]
- www.vipper.org/vip929921.txt
すみません、なんでこのプログラムはEOFを入力すれば終了するのでしょうか?><
- 84 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 14:35:22 ]
- >>83
!= EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?
- 85 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:36:33 ]
- Cでは0xffのように16進数を使用できますが、2進数は使えますか?
- 86 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:44:22 ]
- >>85
使えません
- 87 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:46:51 ]
- あたかも2進数記述しているようにみえるマクロならある
- 88 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:48:51 ]
- >>86-87
ありがとうございました
- 89 名前:デフォルトの名無しさん [2008/09/18(木) 19:09:38 ]
- インクルードについて教えてください。
あるサンプルソースコードを入手して、 ~~.slnを実行して、デバッグしたら動きました。 ファイル入出力をしようと思って、 メイン関数が書いてある.cファイルで#include <iostream>とすると、 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':' 1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。 が大量に出てきてしまいました。 インクルードしただけです。 何がいけなかったのでしょうか?
- 90 名前:デフォルトの名無しさん [2008/09/18(木) 19:11:44 ]
- すみません、上のものです。
C++なので、スレ違いでした。 去ります。すみません。
- 91 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:27:31 ]
- .cファイルで#include <iostream>
そりゃダメだろ
- 92 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 02:10:43 ]
- C++でコンパイルするオプション付けりゃいいんじゃん。
- 93 名前:デフォルトの名無しさん [2008/09/19(金) 16:34:15 ]
- C言語のコンパイラで質問があります。
WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。 プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、 一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。 どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?
- 94 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:36:57 ]
- bcc32 main.c foo.c bar.c
- 95 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:42:27 ]
- それを言うならメイクじゃなくてリンクでは
- 96 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:45:33 ]
- それはC言語の問題でもコンパイラの問題でもなくて、
BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?
- 97 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:49:56 ]
- 質問です。
… int a if(a) … この場合のifの条件aとはどういう意味ですか?
- 98 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 16:51:44 ]
- if(a!=0)
とまったく同じ意味
- 99 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:02:27 ]
- えー
- 100 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 17:06:59 ]
- えーといわれても
何が不満なんだ?
- 101 名前:97 mailto:sage [2008/09/19(金) 17:16:27 ]
- >>98
ありがとうございました。 >>99は僕じゃないですが、ダジャレですかね?w
- 102 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 20:22:19 ]
- スレが凍りついた
- 103 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:18:37 ]
- ローグってCで書かれてるの?
- 104 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:25:16 ]
- >>103
だよ。
- 105 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 23:32:50 ]
- そうか、じゃあ俺もCで書いてみようかな
- 106 名前:デフォルトの名無しさん [2008/09/20(土) 02:58:12 ]
- int i;
char buf="cjd"; for(i=0;i<buf[i];i++); 上記for文の境界条件はマイナーですか?
- 107 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:07:02 ]
- 何をしないのかわからない>>106
- 108 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:08:48 ]
- >>106
文字列の長さだけまわしてるつもりなら、それはおかしいだろ。
- 109 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:19:36 ]
- (・∀・)ニヤニヤ
- 110 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 03:40:45 ]
- 仮に
char *buf = "cjd"; だったしても、そんな書き方するヤツはプログラムやめたほうがいい。
- 111 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 04:37:52 ]
- Windowsの場合
#ifdef WIN32 #endif で処理を分岐するんですが MACは、何を指定すればいいでしょうか?
- 112 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 04:45:32 ]
- MACの場合に#defineされるシンボル
決まってなければ、自由に
- 113 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:01:24 ]
- 知らないなら黙っててください
邪魔です
- 114 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:02:35 ]
- >>113は>>111?
- 115 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:03:10 ]
- 禿同
- 116 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:05:27 ]
- >>112みたいな無知ほど書き込みたがる
知らないならすっこんでろっつーの
- 117 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:12:30 ]
- 知らないならすっこんでろつうか知っている人いないと思う
そんなもの決め事だから
- 118 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 05:13:41 ]
- cc -D MACOS 。。。。。
#ifdef MACOS #endif
- 119 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 09:49:46 ]
- >>110
K&R、つまりC言語を設計した人にC言語を辞めろと申すか?
- 120 名前:デフォルトの名無しさん [2008/09/20(土) 10:09:36 ]
- >>119
いいから見直せ
- 121 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 10:09:56 ]
- 俺には i<buf[i] の意味がわからん。
比較することにどんな意味があるんだ?
- 122 名前:デフォルトの名無しさん [2008/09/20(土) 10:19:19 ]
- bufに入っている文字の
(使用中の処理系での)コードとそれが何文字目かということに、 何らかの関係があるんだよ。
- 123 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 11:00:24 ]
- >>120
すまん早とちりしてた >>106のおかしなプログラムに対するレスだったのか
- 124 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 12:34:34 ]
- printf("foo")
は関数で末尾にセミコロンが付くと正確には文になるのですか? そういった場合printf文というのが適切なのですか?
- 125 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 12:39:44 ]
- >>124
その通り 正確には単文 Pascalはセミコロンが文と文の区切りに使われるが C言語はセミコロンは文の終了を表す
- 126 名前:デフォルトの名無しさん [2008/09/20(土) 15:46:13 ]
- ×単文
○式文 pascal 厨が下手に口を出すからボロが出る 文と複合文はあっても単文はない
- 127 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 15:47:28 ]
- >>126
馬鹿ですか? {}で囲まれたのが複文 そうでないのが単文
- 128 名前:デフォルトの名無しさん [2008/09/20(土) 16:00:49 ]
- つっこみをよく読めアフォ
- 129 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:03:28 ]
- 126==128
お前がアフォ
- 130 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:05:35 ]
- (・∀・)クスクス
- 131 名前:デフォルトの名無しさん [2008/09/20(土) 16:20:47 ]
- もう一度言う、「単」文という用語はCにはない
- 132 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:25:48 ]
- C言語 単文 複文 の検索結果 約 619 件中 1 - 30 件目 (0.26 秒)
C言語 式文 複合文 の検索結果 約 162 件中 1 - 30 件目 (0.32 秒)
- 133 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:27:27 ]
- お前らくだらん事でもめないでISO/IEC9899:1999もしくは
JIS X3010:2003の何ページのどこここにあります、ってやってくれ 無駄にスレを伸ばすな
- 134 名前:デフォルトの名無しさん [2008/09/20(土) 16:39:25 ]
- >>132
おまえの情報源はそんなものか お里が知れるな
- 135 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:41:20 ]
- (・∀・)クスクス
- 136 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:43:07 ]
- >>134
お前も煽ってばかりいないで>>133のアドバイスのように ちゃんと答えてやれ 答えられないと証拠も無いのに、と言われるだけだぞ
- 137 名前:デフォルトの名無しさん [2008/09/20(土) 16:52:58 ]
- >>136==125
俺だって、ちゃんと「式文」と教えただろうが無礼者め
- 138 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:55:05 ]
- >>137
それは証拠にならない 規格書のどこに書いてあるか言ってみろ
- 139 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 16:56:52 ]
- その答えがわかったら、バグが減るの?
|

|