【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
∧
< | > 俺はグラットン持ちの通りすがりのナイトであって
|.|.| 2getしたがどうやってブロントって証拠だよ!!
|.|.|
|.|.|
< | > おいィ?お前それで良
>>1 のか?
...| | |. 仏の顔を
>>3 度までという名セリフを知らないのかよ
...| | |. 暗黒が持つと逆に頭がおかしくなって
>>4 ぬ
...| | |. グラットンす
>>5 いですね
.< .| .>
>>6 駄にaguるなネットポリスに捕まりたいのか?
/(.._..|..|..|.._..)ヽ それほどでも
>>7 い
>.─<>─.< このままでは俺の寿命がストレスでマッ
>>8 なんだが・・
ヾ ̄ヾ .√ ")'
>>9 枚で良い
.| .| 俺の怒りが有頂
>>10 になった
.| .|
.| .| おれパンチングマシンで
>>100 とか普通に出すし
) (
.▽
MONSOON禁止。
このスレはC99に完全準拠したコンパイラを持っている
>>1 が
全ての疑問に答えます。
仕様書を持っていればその実装は必ずしも必要ないと思いますが。 HTML 4.01+CSS 2.1を完全実装したブラウザは存在しませんが Web板のstrictスレはちゃんと回ってます。
モヒカンだー! モヒカンが出たぞー!
あべし
早速の質問ですが、
VC2005にも__restrictキーワードがやっと付けられたな。 SP1が待ち遠しいぜ。
restrictついたんか。 少しだけ嬉しいかな。
スレ違いかもしれませんが、質問させてください。 俺はC言語全くの初心者です。 勉強しようと思って本は買いました。 ついでに何かソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・ 何かお薦めのソフトはありますか? 教えて君で申し訳ないのですが。。。教えてください。
14 :
(^-^) ◆MONSOON/qo :2006/09/30(土) 23:55:09
>>13 BCC developer (ボーランドc++5.51)がおすすめ
16 :
13 :2006/10/01(日) 00:03:29
お前はもう来るな! 死ね。ぴかぁ〜
「ANSI-Cの雛形のプログラム」って何か知ってる人居ますか?
20 :
デフォルトの名無しさん :2006/10/02(月) 06:57:03
>>15 誘導してやったのは結構なことだが
一言多いとガキっぽく見えるぞ
最近思うのは、2chで暴言やそれに類する発言を吐きまくる人々は、 実年齢はどうあれ、精神年齢が低いことは間違いないという事だな。
>>21 そんなどうでもいいことを言わずにいられないあなたも、精神年齢が低いということですね。
実年齢が低そうな人達だなぁ…。
汚い穴だなぁ…。
↓しゃぶれよ
_______ __ ..|| __ || |WC| ..|| | | ||  ̄ ̄ __ _ ∧_∧ ||.  ̄ ̄ || ――― (゚Д゚ ) .||. ◎|| ⌒ヽ  ̄ ̄ ̄ / つ _つ||. ..|| 人, ’ ’, 人 Y ||. |三三| ...|| Y⌒ヽ)⌒ヽ、 )し'(_) ||______ ||  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
カチャカチャ
お前はもう俺から逃げられない
ハ_ハ ('(゚∀゚∩ ヽ 〈 ヽヽ_)
30 :
デフォルトの名無しさん :2006/10/06(金) 22:34:41
保守
31 :
至福 :2006/10/07(土) 10:05:45
はじめまして C言語で素数列挙プログラムをつくっているのですが 高速にするためには剰余計算を 足し算(もしくは引き算)で行うようにするといいと言われました いったいどのようなアルゴリズムで剰余計算を加算(or減算)で おこなえるのでしょうか?
32 :
デフォルトの名無しさん :2006/10/07(土) 10:20:12
被除数nから除数dが何回引けるかをカウントするループを作って、 そこから抜けてきた時点でのnが余りってことだろ
34 :
デフォルトの名無しさん :2006/10/07(土) 10:48:37
俺もそう思うけど
>>31 を読む限りそうとらざるをえないだろ
C で書いたアルゴリズムを動作合成とか言うならそれなりの話がありそうだが
もしCPUの譲与演算が使えないような整数型で、 その整数型には次の演算が行えるなら ・加減算 ・乗算 ・n倍できる高速な演算(シフト演算) ・等号、大なり、小なり a/bの余りは、 for(;;){ for(d=0.i=1;1;i++){ if(a<b.leftshift(i)){ d=i-1; break; } } //シフトして初めてaを超えるシフト数dを得る←ここが一番呼ばれる c=b.leftshift(d);for(;a>c;a-=c); //bをdだけシフトしたcをaから引いていく if(d==0) break; //もうシフトしてaを超えない最大のdを見つける必要はないので、抜ける } で、余りはきっとa これでもかなり遅いがなぁ…加減算でやったら死ぬと思うが
多分、それまでのすべての素数の倍数をプールしとけってことじゃない?
37 :
デフォルトの名無しさん :2006/10/07(土) 11:08:07
エンターを入力すると do 〜 while ( ); が、 また続けられるようにするのは、可能でしょうか? エンターの入力以外は、終了させたいです。
可能
>>39 ありがとうございます。 でも、言葉足らずでした。
できれば、その方法も教えて頂きたいのです。
>>40 そこまでは忠言できない、情報が少なすぎる
>>41 えーと、ごめんなさい。 どう言えばいいかもわかりません。
もうちょっと自分で調べてからまた来ます。
43 :
デフォルトの名無しさん :2006/10/07(土) 14:57:26
>>38 機種依存のやり方を取らざるを得ないから、機種依存OKスレへ。
while (1) {
do 〜 while ();
//キーボード入力
if (リターンキーだったら) break;
}
でできるけど、キーボード入力の部分が機種依存になる。
かならずリターンキーを押すのなら
char buf[4];
fgets(buf, sizeof buf, stdin);
if (buf[0] == '\n') break;
みたいなかんじでいけるけど。
45 :
デフォルトの名無しさん :2006/10/07(土) 15:40:29
リニアPCmのWAVファイルを ADPCMに変換したいので参考になるところオシエテ
46 :
デフォルトの名無しさん :2006/10/07(土) 18:53:28
,.-─ ─-、─-、 , イ)ィ -─ ──- 、ミヽ ノ /,.-‐'"´ `ヾj ii / Λ ,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{ ノ/,/ミ三ニヲ´ ゙、ノi! {V /ミ三二,イ , -─ Yソ レ'/三二彡イ .:ィこラ ;:こラ j{ V;;;::. ;ヲヾ!V ー '′ i ー ' ソ Vニミ( 入 、 r j ,′ ___________ ヾミ、`ゝ ` ー--‐'ゞニ<‐-イ / ヽ ヽ -''ニニ‐ / < つーか、スレ違いだろハゲ | `、 ⌒ ,/ \___________ | > ---- r‐'´ ヽ_ | ヽ _ _ 」 ググレカス [ gugurecus ] (西暦一世紀前半〜没年不明)
47 :
デフォルトの名無しさん :2006/10/07(土) 18:59:14
2
48 :
至福 :2006/10/07(土) 22:33:20
ありがとうございます 剰余計算はあまり速くならないみたいですね Rabin法を用いた素数の 高速判定アルゴリズムってのがあるそうなんですが C言語だとどうやって書けばいいでしょうか?
50 :
デフォルトの名無しさん :2006/10/07(土) 23:01:26
>>48 思うがままに書けばいい
書くことは do に過ぎない
see すなわち実測を怠るなかれ
51 :
デフォルトの名無しさん :2006/10/10(火) 12:16:39
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
そういえば、剰余の計算のテーブル引き版ってどうやるんだっけ? 昔インテルがp5-90でしくじったやり方
倍精度を丸めたあの日
56 :
デフォルトの名無しさん :2006/10/12(木) 13:06:12
returnで文字列を返すにはどうすればいいのでしょうか?
配列は返せない ポインタなら返せる
58 :
56 :2006/10/12(木) 13:43:17
分かったような気がしたんですが、上手くいかないのでご指導をお願いします。 char * f(void) { char buf[80]; fgets(buf, 80, stdin); return buf; } int main(void) { char * a; a = f(); printf("%s\n", a); }
ポインタは返せるけど そのポインタがローカル変数を指している場合 関数を抜けた時点で無効になる
(sprintf() のように) 戻り値で文字列を返さずに、 引数で渡されたバッファ(?)の内容を書き換える
61 :
56 :2006/10/12(木) 13:56:16
少し変更したんですが、どうでしょうか? char * f(void) { static char buf[80]; /* staticにしました */ fgets(buf, 80, stdin); return buf; } int main(void) { char * a; a = f(); printf("%s\n", a); return 0; }
まあまあだね。スレッド使わないならいいんじゃね。
>>60 のいうこと聞いて書き直せ!
63 :
56 :2006/10/12(木) 15:03:08
引数渡しに変更したんですが、これでどうですか void f(char *buf) { fgets(buf, 80, stdin); } int main() { char buf[80]; f(buf); printf("%s\n", buf); return 0; }
64 :
56 :2006/10/12(木) 15:08:03
間違えました。修正版です int main() { char buf[80]; printf("%s\n", fgets(buf, 80, stdin)); return 0;
てめえ 80 って直で書きやがっていい度胸だなっ それから stdin ていうのも引数で受けるのが普通だ。 それから戻り値も成功時は buf をそのまま(ry
ばけやろい いきなり ^Z とか ^D とかよ、落ちるようなうろぐらむは書くんじゃねえよ
>>65 結局 fsets そのままじゃん とお約束
1行レスでtypo してるし。 fsets って何やねんorz
69 :
デフォルトの名無しさん :2006/10/12(木) 18:35:12
複数の変数を定義することができるデータ構造って何ですか?
>複数の変数を定義することができる ( ゚Д゚)構造体か? >データ構造って何ですか? (;゚Д゚)…え?
つ 疲れ目だ、休め
日本語でおkのお手本だな
73 :
デフォルトの名無しさん :2006/10/12(木) 23:40:18
#include <stdio.h>
int main(void);
int main() {
printf("
>>67 fsets って何やねん\n");
main();
return 0;
}
74 :
デフォルトの名無しさん :2006/10/13(金) 04:37:38
【3:1001】C言語なら俺に聞け(入門篇) ぱぁと2〜
が1000を超えてしまったので、こちらで質問させて頂きます
皆さん、ありがとうございます。
>>997 では、最後に行がなくてもカウントしてもいいのですね
では
>>993 で述べた、
>>何故、自分の環境だとtotatに(つまり改行文字の数に)1足さなければならないのでしょうか?
で、何故自分の環境だと1を足さなければならないのかが
他の参考書などを調べましたが解決しません・・・・
理由は改行文字で終わってないなら 1を足さなければならないからですかね?
要するの最後の行はとにかくEOFでも数えると覚えればいいみたいですね。
EOF自体、DOS時代の遺物みたいなものだからな。最後のクラスタの 有効バイト数が分からないファイルシステムを使っている時、EOFで ファイルの終わりを判別するという、今考えるととんでもない事をしていた。
76 :
デフォルトの名無しさん :2006/10/13(金) 04:45:34
もうわけがわかりません・・・ 結果的には数えるのでしょうか?
好 き に し ろ よ
79 :
デフォルトの名無しさん :2006/10/13(金) 05:08:49
int ch; ch=fgetc(io); if (ch==EOF) abort(); char c; size_t sz=fread(&c, sizeof (char), 1, io); if (sz==0) abort(); freadは生バイトのまま読み込みで(raw byte)、 fgetcがバイトから文字に符号化(auto ascii char encoding)されるわけじゃないですよね。 1バイト読み込みの方法ですが、両者はどう違うのでしょうか?
"r"か"rb"のどちらでオープンしたか、それとOSとの組み合わせで 挙動が異なる事がある。
"rb"でオープンしたらfgetcでもfreadでも同じってことでしょうか?
ASCIIのEOFとCのEOFを混同している奴がいるな
DOS/Windowsでのテキストモードとバイナリモードの動作をわかってない奴もいる。
DOS/Windowsの話ならスレ違い。
>>82 どちらでオープンしようとも、1バイト読み込んだ内容についてはどちらも同じ。
仮にテキストモードで"\r\n"⇒'\n'の変換が行われるならば、fgetc()でもfread()でも行われる。
87 :
デフォルトの名無しさん :2006/10/13(金) 15:21:31
C言語からアセンブラ語に変換するにはどうすればいいですか?? 分かりやすくお願いします..
勉強すればいいと思います。
89 :
デフォルトの名無しさん :2006/10/13(金) 15:52:57
うるせーバカ氏ね
マルチは死ねばいいと思います。
91 :
デフォルトの名無しさん :2006/10/13(金) 17:08:13
マルチが死ぬにはどうすればいいですか??? 分かりやすくお願いします。。。。
86 デフォルトの名無しさん sage 2006/10/13(金) 12:12:26
>>88 コンパイラを使う。
そんなことをしてもほとんどの場合役に立たないけど。
手段を聞くのではなく、目的を示したほうがいいと思う。
94 :
デフォルトの名無しさん :2006/10/13(金) 21:32:01
うわ操作ミス。 一行目は無視して。
96 :
デフォルトの名無しさん :2006/10/15(日) 01:35:30
『宣言が正しく終了していない』 と言ったエラーが出て困りました。 ググッて調べてみましたが、いまいち解決策が みつかりません。 宜しくお願いします。
98 :
デフォルトの名無しさん :2006/10/15(日) 01:44:13
>>97 コンパイルが通らないので、宣言が正しく終了していない
と表示された時の一般的な対処方法ご存知ないですか?
・・・ということでしたorz。
同じ構造体同士でmemmove(memcpy)を使うと、こちらの想定どおりに 同じオブジェクトのコピー(クローン)になるのでしょうか。 上のような構造体のビット・コピーは、CとC++でも挙動は同 じ(互いの構造体メンバー間の同一性は保障される)になるのでしょうか? もしかしmemmoveは環境依存なの?
/* * なんか、低脳な質問が増えてきてるな */
>>101 memmove()はC99にある。しかし、同じオブジェクトのコピーならmemcpy()だろうとmemmove()だろうと使うのは馬鹿。
また、C++についてはスレ違いにつき割愛。
環境依存のようなので、違うスレで質問します。 もしかしてmemmove/memcpyの仕様は環境依存なの? の誤植でした。
構造体の代入はともかく、memmove使うのはどうして馬鹿なの?
代入しろってことじゃないか?
構造体を代入するのは馬鹿 達人はダフのデバイスを使う
スレ違いだから詳しいことは省略するが、 構造体のコピーをmemcpy()で行なう癖のついた阿呆が C++でも同じことをやってどつぼにはまった例は何度も見た。
109 :
デフォルトの名無しさん :2006/10/15(日) 13:35:57
LinuxでC言語のプログラムをコンパイルして実行したらちゃんと動作したのに Windowsでそのファイルを実行すると正しく動作しないんですけど なぜですか?
>>110 代入演算子を宣言しているクラスがあるだけでもマズイ。
ダフのデバイスを使うのは馬鹿 達人はインラインで rep movsb を使う
構造体のコピーならmemcpyでいいだろ
>>113 ダメだとは言わないが、癖になると C++ で嵌る。
string.h のインクルードが必要になるし、
構造体がレジスタに収まる場合などで
最適化の機会が減ってしまうかもしれない。
逆に、代入に比べて何のメリットがある?
メリットというよりも、出来る保障があるかないかだろ。 といっても、レジスタなどと環境依存を出してくる人には、 メリットをいくらいっても無駄だろう。
>>115 正しくコピー出来る保障があるかないかという観点でも、
代入のほうが有利じゃないか?
C++でもstructに仮想関数を定義してない 時(structをオブジェクトでなくて値として使っている)でも何か問題が起こるのか? ていうか、具体的にどうダメなのか分からないから適当に言ってるんだろうな。
先頭アドレスをコピーしてしまえば・・・
こいつは何と比べて代入の方が有利と主張してるんだ?
>>116 に聞きたいが、代入演算子'='を実装するとき、お前ならどうするつもりだ?
ビットコピーしたいだけならmemmoveで十分か? というのが問いだとしたら、答えはYes、ではダメなのかな。
代入演算子を使うべきだという話はおいておいて、 C++では、構造体・クラスはPODならmemcpyでコピーしても問題ないと規定されている。
あれだろ、strlen 使わないで自分で長さ数えるループ置いて回る奴とかたまにいるじゃん
すり替え乙
>>123 によれば、ダンスでもしているのか、アホな奴が回っているようなんだが…
PODの詳しい定義を見たいのだが検索出来なくて面倒くさいので 誰か規格に詳しい人、何ページに書いてあるのか教えてくれ
どうも白熱しているけど、memcpy/memmoveは C++だと面倒が多いのは分かった。というか普通はやらない。 構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。 何に使うかはまだ考えてないけど、 例えば構造体も配列もプリミティブも結局同じってことかな。
ここ一応Cスレなのでよろしこ
なんか知らんけど、C++でインスタンスをmemcpyしてはまった馬鹿がいるみたいねw
>>129 vtblとかオーバーライドとか、演算子オーバーロード規則とかどうなっちゃうんだよ。
俺は怖くてやらないけど。
はぁ
Cスレらしいほのぼのとした馬鹿でつね
>>126 X 3014:2003では9. クラスの4節。次を満たす集成体クラスと書いてある。
参照型である非静的データメンバ
利用者定義のコピー代入演算子
利用者定義のデストラクタ
集成体は、ようするに= {hoge, foo}の書式で初期化できるもの。
8.5.1で次のいずれも持たない配列又はクラスと規定されている。
利用者宣言のコンストラクタ
非公開又は限定公開の非静的データメンバ
基底クラス
仮想関数
>>120 クラスに応じて変わるに決まってるだろ。何が聞きたいんだ?
クラスの話なんて誰もしてないし
聞きたいのは煽り耐性
Cコンパイラの実装の話か。 数個の命令で済めばそれで、ダメなら memcpy() 相当の 汎用コードを呼び出す。実際に実装するわけじゃないが、 これぐらいの動作は期待してもいいだろう。
>>127 > 構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。
K&R第1版の時代はそもそも構造体の代入ができなかったんだから当然。
memcpyやmemmoveを使いたがるのはそのころの名残だろ。
いい加減にしろ
だから、ISO/ANSIでもCなら構造体のコピーはmemcpyやmemmoveを 使って問題ないってことだ。誰も勧めたり確証しないから曖昧になってるがな。
K&R1準拠のために構造体の代入を封印する奴は コードのその他の部分ももちろんK&R1準拠なんだろうな? つーか標準ライブラリ使えるの?
別に代入を封印するとかいう話じゃないだろ。 memcpyで正しく複製できるかどうかの話だ。
いい加減にしろ
おこらりた
>>141 UNIXのプログラムでgccが使えると仮定してないやつはプロトタイプ宣言すら使ってないな。
つーかmemcpyが使える保証すらないからbcopy使ってたり
いい加減にしろ 構造体の代入やmemcpyの話題はまだスレタイに沿ってるが K&R1の話はスレ違いだろ
配列とポインタの問題でちょっと分からないことがあります。 void func(unsigned char *data) { } このような関数があって main(){} から int main(){ unsigned char data[100]; func(data); } こう書くと正常に動作するのですが、 int main(){ unsigned char *data; data = (unsigned char*)malloc(sizeof(unsigned char)*100); func(data); } こう書くと func() の処理がおかしな動作になってしまいます。 このような場合どんなことが原因として挙げられるのでしょうか?
func()がdataの境界を越えて書き込んでる
>>141 K&R1準拠のために構造体の代入を封印する
準拠のためってどういうこと?
K&R1に「構造体の代入規定」が無いのに、無い規定を封印することはできないだろ。
ところで、お前のコードは読みにくそうだな。
最悪K&RをNGワード設定しようかとおもてる
151 :
デフォルトの名無しさん :2006/10/17(火) 09:47:22
>>149 規定が無い=仕様にない=使えない
ハイハイ、K&Rの話は終了
153 :
147 :2006/10/17(火) 15:13:51
>>148 レスありがとうございます。
境界を越えて書き込んでいる、ということは、
確保したメモリ領域を超えてアクセスしている、
ということでいいのでしょうか?
メモリを大量に確保して動かしてみましたが変化が無かったです。
VC++でコンパイルしているのですが、
Release だとある程度正常に動き、
Debug だと全く見当違いな動作をしたりと、
何だか怪しさ爆発です…
>>153 そのfunc()にバグがあるとして、
ローカル変数版はそのバグを偶然巧く回避できて、
ヒープ版もReleaseビルドならなんとか回避できているのだろう。
Debugビルドはそういうバグにぶち当たるようにごみデータを詰め込むようになっているので、
「正しく異常動作」しているのだろう。
未定義動作とはそういうもんだ。一見正しく動いているように見せかけても おかしくなっても一向に問題なし
157 :
デフォルトの名無しさん :2006/10/17(火) 22:18:58
>>153 ReleaseビルドとDebugビルドで動作が違う
ローカル変数を使ったときと、ヒープを使ったときで動作が違う
まず考えられるのは、初期化していない変数を参照している可能性
コンパイル時のチェックを一番シビアな設定にして、エラーはもちろんワーニング
をすべて取り除く
158 :
デフォルトの名無しさん :2006/10/17(火) 23:18:42
>>149 現物が手元にないので確認できないが
K&R1 にも構造体代入についての言及はあったように記憶している
確か、将来の C では可能になるやも知れんとか言っていたような・・・
159 :
147 :2006/10/18(水) 00:43:51
>>155-157 レスありがとうございます。
>>157 さんの指摘がまさにビンゴでした。
ローカル変数を全てチェックしたみたら初期化していない変数がありました。
複数人の手で書かれているコードで、尚且つかなりカオスしてたので大変助かりました。
みなさんどうもありがとうございます、スレ汚しすみません。
160 :
デフォルトの名無しさん :2006/10/18(水) 00:48:04
課題3 入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。 例) AB123cdを受け取ったら数字3、大文字2、小文字2 ↑の答えお願いしますm(_ _)m
>>160 うちの大学にはこういうのがうじゃうじゃいるよ、
教科書も読まないでプログラミング受けに来る奴。
フランス語知らない奴が、いきなりフランス語は喋らないだろ?
マックとかケンタッキーだとかあんな高カロリーなものばっか食ってるからだいたい,,,,,,ブツブツ
163 :
デフォルトの名無しさん :2006/10/18(水) 19:35:56
プロフェッショナルにとって理解することと感じることは車の両輪。 理解するだけでも感じるだけでもいけない。 どちらから入るかは性格による。 マの大半は感じることから入ったクチではないかな。 だから理解することに関して後ろめたさがあり、 それが教科書至上主義を助長していると思ってみたりしようじゃないかw
ベクトルを正規化する式は float x, y, z;//元のベクトル float vx, vy, vz;//正規化したベクトル float=s; s=sqrt(x*x+y*y+z*z); vx=x/s; vy=y/s; vz=z/s; で求まると思いますが、sqrtを使わずに正規化するにはどうすればいいのでしょうか? どうしても速度が気になります。
どなたか感じた方いませんか〜
あんっ!感じる!感じるわ!
なんだこの右上のプレッシャーは
>>164 自前で開平する効率のいいマクロ関数でも実装する
このスレは標準Cのみの限定スレです。
171 :
デフォルトの名無しさん :2006/10/18(水) 21:33:37
>>162 知らないことを学びに来た奴がそれを学べないプアな教育機関を選んでしまった気の毒な奴だよ
予習が全てなんて恥知らずな公言をする穀潰し教師が横行できてしまう少子化社会だからな
>>171 予習がすべて、なんて教師は論外だけど、
講義の時間中しか勉強しない、課題は自力でやらない、なんて学生も論外だろう。
そんな学生のペースに合わせて講義なんかされたら、知りたいことを学びに来た学生が気の毒だ。
173 :
デフォルトの名無しさん :2006/10/18(水) 22:00:57
>>172 その教育機関がどんな連中を相手にしているかによるな
昼間は仕事でびっちりな人たち相手に宿題は物理的に無理な場合もある
174 :
164 :2006/10/18(水) 22:03:59
>>170 ありがとうございます。
そっちで聞いてみます
175 :
デフォルトの名無しさん :2006/10/20(金) 02:43:31
C99 規格 6.5.3.3 では、単項マイナス演算子について以下のように記述されています。 "The result of the unary - operator is the negative of its (promoted) operand. The integer promotions are performed on the operand, and the result has the promoted type." そこで質問ですが、 -1u という式の型と値はそれぞれ何になるのでしょうか? 型は 1u が unsigned int で、整数拡張しても unsigned int のままなので やっぱり unsigned int だと思うのですが、値のほうは符号無し型に対して "negative" と言われても定義できないような気がします。もしや未定義動作でしょうか? 未定義動作ってことになると、 -sizeof(...) なんてコードでうっかり踏んでそう。
演算子がおかしいって言われるんじゃないの?
>>175 > 符号無しオペランドを含む計算は、決してオーバフローしない。すなわち、結果を
> 符号無し整数型で表現できないときは、その型で表現しうる最大値より1だけ大きい
> 数を法とする剰余を結果とする。
JIS X 3010:2003 本体6.2.5より
178 :
175 :2006/10/20(金) 10:23:30
>>176 エラーにはなりません。警告の出るコンパイラはあるようですが。
>>177 なるほど。それで決まりますね。
つまり -1u は unsigned int で UINT_MAX - 1 + 1 (== UINT_MAX) ということに。
unsigned int 以外の(より精度の高い)型に変換した場合に
ソースコードから期待される値は得られなさそうですので、
結局はやるべきではないですね。
ありがとうございました。
>>176 とりあえず、コードで試してから書けよw
180 :
デフォルトの名無しさん :2006/10/20(金) 10:29:47
errx() ってANSIか?
>>178 ということは
0 - sizeof なら可だけど -sizeofならダメかもってこと?
>>181 0 - sizeof と -sizeof は、両方とも
>>177 のルールによって結果が決まるので
等価になると言えます。
unsigned int 同士の加減算に使う限りは負の値として作用してくれるので、
それだけで「ダメ」とも言い切れないですが。
183 :
デフォルトの名無しさん :2006/10/20(金) 11:11:54
>unsigned int 同士の加減算に使う限りは負の値として作用してくれるので、 え??
>>183 assert(3u + (-2u) == 1u);
>>185 式の途中の値の型ってコンパイラが適当に処理してるってこと?
終端ならunsigned 型にするが、
途中なら単純に変換するのではなく
減算に使われているか調べて判断してくれてるってことでおk?
187 :
デフォルトの名無しさん :2006/10/20(金) 17:50:36
問題: orz == 3 を含む美しく実用的なコードを書け。
{ /* orz == 3 */ 実用的なコード }
printf(" ッブ\n); printf("orz ==3 嫌なあいつ\n");
>>191 なつかしい きょくが
ながれてるじゃないか。
あのころは、よかったな。
if ((OTL==3)
>>191 ) puts("鼻からぎゅ〜にゅ〜♪");
194 :
誰かおねがい :2006/10/20(金) 19:31:16
サイトに番号つけたいんですが、下のは何で変な結果が出るのかわからん。 #include<stdio.h> #define L 10 main(){ int i,j,y,x=0,site[L][L]; for(i=0;i<L;i++){ for(j=0;j<L;j++){ x++; site[i][j]=x; printf("%d\n",site[i][j]); //yoi }printf("%d\n",site[i][j]); //hen } //system("pause"); }
>>194 for文の仕様を100回音読しろ
それでもわからなければ諦めろ
ごめん、なんでもない
198 :
デフォルトの名無しさん :2006/10/20(金) 20:38:17
>>185 assert(3u + ((unsigned int)(-(int)2u)) == 1u);
199 :
さrg3 :2006/10/20(金) 22:33:02
C言語おしえて
200 :
デフォルトの名無しさん :2006/10/20(金) 23:14:53
gotoでの飛び先について質問なのですが、 ラベルが有効なのはgotoと同一の関数内のみなのでしょうか? それともソースファイル全体、またはプログラム全体で有効ですか?
201 :
デフォルトの名無しさん :2006/10/20(金) 23:29:32
202 :
201 :2006/10/20(金) 23:32:16
でもC言語のソースではあまりgoto文を見ないですけど エラー処理へ飛ばすぐらいかな
203 :
デフォルトの名無しさん :2006/10/21(土) 00:12:51
goto文は廃絶運動が起きてるからよ
まぁ、滅多なことじゃ無い限り使うことも無い構文だしな。
蛇蝎のごとく嫌うほどのもんでもないけどな。 たまに使う分には、それなりに便利だ。
207 :
デフォルトの名無しさん :2006/10/21(土) 00:57:43
なぜ goto を使わないの? ↑ これに歯切れ良く答えられない奴は異様なコードを書く
使いまくりの俺には、何故使わないのか歯切れの良い答えが打線。 模範解答きぼん。
209 :
デフォルトの名無しさん :2006/10/21(土) 01:14:31
goto文は構造化プログラミングの時代の嫌われ者になってしまった あっちゃこっちゃ飛ぶのはよろしくないということだ
次の標準規格にはgoto文の代わりに comefrom文を入れてもらおう
本来goto文が悪いんじゃなくて、goto文の濫用が嫌われるんだがな。 goto文を使うべき場面も、少ないながらあるわけで・・・
212 :
デフォルトの名無しさん :2006/10/21(土) 01:34:29
gotoを一切使わないなんて言っているやつを今まで何人か 見てきたが、(グローバル変数も一切使わないというヤツもいた) プログラムなんて動けばいいんだと、俺は思う。
まあ確かに動けば良いんだが、大抵は動かし続けなきゃならんからなー。 部屋が汚いくらいじゃ早々死にはしないが、限度を超えるのは考えもんだろうし。
214 :
デフォルトの名無しさん :2006/10/21(土) 02:00:30
一万行くらいのコードを書けば数個くらいのgoto文を使うだろ。 そこに100個もgoto文使うやつがいたら、俺はそのコードを 興味本位で見せて欲しいわ。
215 :
デフォルトの名無しさん :2006/10/21(土) 07:49:22
>>209 SPでもあっちゃこっちゃサブルーチンへ飛ぶね
ループや if, switch は分岐以外の何物でもないし
関数ポインタでの分岐に至っては飛び先が予測できないがSPで普通に使う
goto排他原理主義者が見えない罠 ・プログラミングと構造化について分けて考えられない
217 :
デフォルトの名無しさん :2006/10/21(土) 10:27:56
だな プログラミングでない構造化はそこいら中にあるから 要は何をすればいいのかが見えていれば 道具の1つに過ぎないものを見境いなく毛嫌いはしなくていいはず
「プログラミング」とか「構造化」とかあいまいな用語をならべて、 分けるとか分けないとか言ってるヤツの方が理解浅そう。
219 :
入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:25:08
#include <stdio.h> void main (void) { int b_data[5],a,i; int *b_pt; a=0; printf("2けたの番号を入力して下さい\n"); for(i=0;i<5;i++) scanf("%d",&b_data[i]); b_pt=b_data; printf("入力された番号は\n"); for(i=0;i<5;i++){ printf("%d\n",b_data); } printf("以上です。\n"); } オワタ
220 :
入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:26:02
配列を使用して、
printf("%d\n",b_data); ↓ printf("%d\n",b_data[i]); じゃないの佐賀?
222 :
デフォルトの名無しさん :2006/10/21(土) 11:28:19
>>218 浅かろうが深かろうが
おまえさんが食い込めないことだけは動かぬ事実
違うならそれを示してみな、お見事なら謝るから
224 :
デフォルトの名無しさん :2006/10/21(土) 11:38:45
「プログラミング」と「構造化」が曖昧…?
225 :
デフォルトの名無しさん :2006/10/21(土) 11:42:32
>>223 ただ煽るだけで話してても実りのなさそうな奴にえさはやらんぞ
これからちょっと出かけるから、夕方までにもうちっとマシなこと書いとくんだな
226 :
入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:46:46
>>221 解決しました。ありがとうございました。
>>223 が理解浅そうな人です
っつーかemacsが容量不足でインスコできねぇ
構造化ってもう時代遅れ? 確かに大事な概念だけど・・
229 :
デフォルトの名無しさん :2006/10/21(土) 11:53:03
歳のせいか、数ヶ月前に自分で書いたコードを見直しても思い出すまでに 1〜2日かかります。 忘れないようにコメントをいろいろ追加しているのですが、それでも何で こんな処理しているのか思い出せない場合があります。 どうすればよいでしょうか?皆さん、どうしていますか?
>>229 ソースコードがコメントになるくらいのコード書く
これしかない
>>225 いや、おれは最初からなんか出せとか言ってないし。
あんたこそ、相手をあおって「なんか出せだせ」みたいな乞食みたいなことは
やめたほうがいいよ。
>>231 理解してないのに口先だけで世の中渡ってこれたんだ?
それだけでも勲章モノだから、もう出しゃばらない方がいいと思うよ、うん
234 :
デフォルトの名無しさん :2006/10/21(土) 12:40:20
>230 それが、その、数ヶ月前のコードは、自分が書いたものに見えないんです。 まるっきり記憶が飛んでいて。まるで他人のコードを見ているように 感じます。それを1−2日かけて思い出すと、どうにか理解できる 場合があります。やはり歳かな。
236 :
佐賀 :2006/10/21(土) 12:48:35
はいはい佐賀佐賀
むしろ
>>216 みたいなコトを言ってるヤツのほうが、
「口先だけで世の中渡ってる」感が強い。
(´д`)
〜ただいま
>>218 が真っ赤な顔で必死になっております〜
>>229 コメントを書く際は、まず最初に
/* 【何でこんな処理しているのか】 */
/* ・・・ */
と書くルールを決める。
他に書きたい事があるだろうが、それらは後回し。
>>239 んだね
プログラミング以前に戻って情報を引っ張ってこれるなら、
全体が、何を問題にして何を目標にどんな解決法でコードを導いたのか、一筆書き加えると後々楽だね
コメントも構造化。 構造化というか、クラスのように階層化できるのがベストなんだが。
コードの動作じゃなくて意図を書かないと意味ないな i++; //カウンタをインクリメント とかアホかと
コメントの文法ならともかく作法はスレ違いだと思うの。 確か専用スレなかったっけ?
244 :
241 :2006/10/21(土) 14:30:06
>>243 あるのか。是非逝ってみたいが、できれば誘導ヨロ。
サンクス。ちょっくら行ってくら。
>>234 それは脳に血栓があるかもよ
場所によっては自己同一性にアクセスできなくなるから。
char arr[1]={'A'}; arr &arr &arr[0] &*arr 実質的に全部同じなんですが、違いを教えてもらえないでしょうか
251 :
デフォルトの名無しさん :2006/10/22(日) 21:37:04
>>249 注意せよ、「実質的に」にひどい罠がある
配列が式の中に現れると、原則として先頭要素へのポインタに変換される。 それを逆参照してまたアドレスを得ているだけなので、arrと&*arrは等価。 また添え字演算子は間接参照演算子などの糖衣構文であることから、&*arrと&arr[0]も等価。 故にarrと&arr[0]も等価。 &arrはというと、アドレス演算子が「式中で配列は先頭要素へのポインタに変換される」という規則の例外となっており、 配列そのものへのポインタが得られるということになっている。 まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。
>>250-252 ありがとうございます。
>>252 よくわかりました。
>&arrだけは結果の型がchar (*)[1]で、
>ほかは結果の型がchar *になる。
254 :
デフォルトの名無しさん :2006/10/22(日) 22:14:57
>まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。 これは嘘 printf("%u", sizeof arr);
スルーでおk?
257 :
デフォルトの名無しさん :2006/10/22(日) 22:57:43
痛い教えて君と同じことを言われたいかい?
言われたい!!
259 :
デフォルトの名無しさん :2006/10/22(日) 23:04:59
そんくらいやってみろ
スルーでおk
「sizeof arrの表示」と「arrや&arrの型」の間の関係が理解できる人はエスパー
262 :
デフォルトの名無しさん :2006/10/22(日) 23:25:08
「サイズの違い」と「型の違い」の間の関係が理解できない人は C 使いにあらず
また例の痛いヒトが現れたんだね。
>>254 は、他の人には見えないものが見えています。
265 :
デフォルトの名無しさん :2006/10/22(日) 23:29:59
もう終わりかよ、つまんね
エスパーって言葉どこのスレから拾ってきたの?
たぶん、 char arr[1]={'A'}; arr &arr &arr[0] &*arr この次にやりそうなのを先に書いたんじゃないかな とエスパー
それはありえるけど、{'A'} が怒っているように見えるのにエスパー
>254 マジレスするとsizeofも配列そのものの大きさを返すことから、アドレス演算子同様あの規則の例外。
270 :
デフォルトの名無しさん :2006/10/24(火) 15:06:26
入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムをポインタを使って作りなさい。 例) AB123cdを受け取ったら数字3、大文字2、小文字2 ↑この答えお願いしますm(_ _)m
#include<stdio.h> #include<stlib.h> #include<ctype.h> int main(void) { int numbers=0,upperCase=0,lowerCase=0; char *p="AB123cd"; for( ; *p ; p++) {numbers+=(isdigit(p)!=0)?1:0;upperCase+=(isupper(p)!=0)?1:0;lowerCase+=(islower(p)!=0)?1:0} printf("数字%n、大文字%n、小文字%n\n",numbers,upperCase,lowerCase) return EXIT_SUCCESS; }
>>270 自分の間抜けさが露呈するから止めたほうがいいよ
↑すまん操作ミス、気にせんでくれ
276 :
270 :2006/10/24(火) 16:37:39
すみません。 OSはWindows XP home SP1 グラフィックは GemeForce5200です。 ハードディスクは1が40ギガBで2が80ギガBです。
>>276 そのプログラムはGemeForce5200じゃ動かないよ
280 :
デフォルトの名無しさん :2006/10/24(火) 17:53:58
ファイル(ASCIIやバイナリ)を高速でコピーしたいのだけれど、 WindowsでもUnixでも使える関数があれば教えてケロ。
fopen, fread, fwrite, fclose 必要に応じてsetvbuf
282 :
デフォルトの名無しさん :2006/10/24(火) 18:20:25
>281 ありがとうございます。 できれば、サンプルをアップロードしてもらえるとうれしい。
283 :
270 :2006/10/24(火) 18:37:44
>>279 動きませんか・・・・ヒントは頂けたんで頑張ってみます。ありがとうございました。ペコリ
異様な力場を感じる。 何かがおかしくなっていると感じるのだが どこまでが正しかったのか分からない。 そんな経験ないだろうか。
286 :
デフォルトの名無しさん :2006/10/25(水) 00:21:28
関数ポインタにセットされている関数が、関数defかどうかを判断する処理を mainと言う関数内で行いたいのですが、エラーが出てぜんぜんダメなんです。。。 誰か助けてください(泣) わたしって馬鹿すぎですかね。。。 32bit処理系です(←関係ないですかね〜) void ( *func )( void ) ;// 関数ポインタを宣言 void def( void ){//何か処理をする関数 } void abc( void ){ func = &def ;// 関数defのアドレスをセット} } long check( void ){// 関数のアドレスを返す関数のツモリです return( ( long )func ) ; } void main( void ){ if( check() == &def ){ //funcのの関数はdef } else{ //defでは無い } }
287 :
デフォルトの名無しさん :2006/10/25(水) 00:31:56
すいませんが質問させてください。 キーボードから入力された文字列をHEXコードに変換するプログラムを書きたいんですけど やりかたがさっぱりわかりません。 たとえばAと入力したとき、実際は0x41ですけどこれを0x0Aに変換したいんですがどなたか アイデアをください。初心者なのでほんとお願いいたします。
>>286 単なるwarnigじゃないんですか?
だとするとcheckのlongをvoid *にして(long)を取り払えばいいと思いますが。
290 :
デフォルトの名無しさん :2006/10/25(水) 00:41:59
>>288 解答ありがとうございます。
明日会社で早速試してみます。
>>289 abc()は別の関数で呼んでいます、説明が悪かったと思います、申し訳ございません。
>>287 distance = 'A' - 0x0A
putchar (getchar() - distance) ;
スマソ printf ("%X", (getchar () - distance)) ;
293 :
デフォルトの名無しさん :2006/10/25(水) 01:13:18
>>292 ありがとうございます。俺の書き方が悪かったんですが、これだと0〜9まで
の入力がうまくいかないんですよ。16進数だから16通りのIf分岐
でできそうだけどもっとスマートにできないかなと・・・。
>16進数だから16通りのIf もちつけ。 頼むからもちついてくれ。 16進数で表現できるのは65536通りの数字なわけだが、1ビットごとに処理を分岐させるつもりかおまいさんわ。
>>293 c2n(x){return (x&79)%55;}
>>294 > 16進数で表現できるのは65536通りの数字なわけだが
オマエがおちつけ。
>>295 そんな方法があったのか・・・
いつも0-9、a-f、A-Fの場合で条件分岐してやってたよ・・・
>>294 落ち着かなくてイイ
ただこの世から消えてくれるだけでイイ
16通りのif文なんて 保守担当者がリアルorzとなるのが目に浮かんで オラなんだかとってもワクワクしちゃうぞ。
switch caseのことかー!!
16通りのifで驚くのは初級者 達人は16段のifを使う
16段のfor文を書く俺がきましたよ。
おれならテーブルを使うな それならキャラクタセットがASCII上位互換でなくてもOKだしなにより移植性が高い
char s[10]; char* p = s; @ p + 100; A p += 100; B p += 100; *p; どの時点で未定義ですか? それともすべて未定義?
3じゃね
別に
未定義の動作を引き起こすのは3だろうけど 1から値は不定になるよ。(例えばNULLと判定されても文句は言えない) 正常な比較等ができると保証されているのはs+10まで。 アクセスできるのは*(s+9)まで。 それと機種依存文字はやめた方がいいぞ。 他の板ならともかく、こういう板では互換性に気を配るべきだ。
うんこ、ぷりっ。
310 :
デフォルトの名無しさん :2006/10/25(水) 19:51:27
>>293 ありがとうございました。無事解決しました。
みなさんありがとうございました。
311 :
デフォルトの名無しさん :2006/10/25(水) 22:14:45
ファイルa.h struct A{ struct A *next; }; ファイルb.c struct A *aroot, *alist; func_a(){ aroot = (struct A *)calloc(1, sizeof(struct A)); alist = aroot; func_b(); alist = aroot; while(alist = alist->next != NULL){ alistの要素を表示 } } ファイルc.c extern A *alist; func_b(){ while(){ func_c(alist); } } func_c(struct A *list){ list = (alist->next = (struct A *)calloc(1, sizeof(struct A))); } 大体このような感じでalistの要素を表示のところでalistの中身を次々に出ることを期待したんですが、 1つしか出ません。 アドレスを調べてみるとfunc_cを読んですぐの時点でlistのアドレスが毎回arootのアドレスになってました(順々にアドレスが増えていっていて欲しい) func_cでcallocした後のアドレスは順々に増えていっています なぜ1回1回listのアドレスがarootのアドレスに戻ってしまっているのでしょうか? 上記の範囲で問題があるのでしょうか?それとも書いてない部分に問題があるっぽいでしょうか?
なんかやりたい事が良く判らんないけど、 func_c(struct A **list){ *list = (alist->next = (struct A *)calloc(1, sizeof(struct A))); } って事?
func_a(){ aroot = (struct A *)calloc(1, sizeof(struct A)); alist = aroot; の辺りも意味不明だな
314 :
311 :2006/10/26(木) 00:15:18
>>312 まさにそれっぽいです
試してみます
>>313 arootの領域を確保しておかないとnextに代入しようとしたときにエラーが出ると思ったので
確保してからalistがarootを指すようにしたんですが
どう書くのが正しかったのでしょうか?
315 :
デフォルトの名無しさん :2006/10/26(木) 01:03:02
>>288 >>289 今日、早速試してみたら問題なくできました!!
本当にありがとうございました。
今まで4年間アセンブラで書いていて、急に環境がC言語になってしまって・・・
C言語は難しいです。。。
Cのどこが難しいの?
アセンブラで普通にプログラム書けるやつがC難しいって・・・ とりあえずインラインアセンブラで書いとけばいいんじゃね?
>>316-317 ずっとアセンブラだけやってる人から見たら、そーゆーモノらしいよ。
とくにVBとかの高級言語になるともう完全にバイナリでの動作を
イメージ(する必要もないのに)できなくてギブアップしてしまうらしい。
まぁ、あれだ、彼らは言うなれば深海魚で浅い海にあがってくると破裂して死んでしまうんだよ。
バイナリーでの動作をイメージするってどういうこと?破裂しそう。
>>319 メモリ上にどのようにデータとコードが展開され、
レジスタがどのように使われるかわかんないと破裂しちゃうらしい。
まさしく実装依存だ。コード中にマジックナンバー云々の域を越えてる。 int(ポインタ)が20バイトとか考えてるのかな。 それじゃ、破裂しちゃう。
オレがたまに型無し言語(スクリプトとか)を使うときと同じ感じなのかな コンパイルエラーが無いと破裂する
ここはよく破裂するインターネッティングですね。
確かに型なし言語は俺も破裂するわ
型無し不安症候群とかこの際だからビョーキにしてしまおう
WinAPIが形無しになったら病気にされても文句は言わないよ
>>318 ポインタの型依存な加減算で嵌るらしい。
アセンブラにも似たのはあるけど(type ptr)、参照時の抜き出す大きさ解決だけだしな…
そういう奴らに非手続き型言語やらせると面白そうw
>>318 >イメージ(する必要もないのに)できなくて
不安になるんだろう。俺もVBやってると
「これNewしっぱなしで大丈夫なのか?」と不安になる事があった。
どうすれば安心なわけ?
>>329 不安になる必要はないぞ
ちゃんとリソースリークしてくれるから安心しろ
332 :
デフォルトの名無しさん :2006/10/26(木) 12:59:19
ANSIなんですけど、 void main(void) って書くと、intがありませんって警告が出るんですが、なぜ?
ANSIだと mian の戻りは必ず int を要求するから
mian → main
335 :
デフォルトの名無しさん :2006/10/26(木) 14:19:52
336 :
デフォルトの名無しさん :2006/10/26(木) 16:58:07
>>333 そうなんですか…
でも石田晴久著の入門ANSI-Cには堂々と
void main(void)
って書いてあるんですよね…
この本はずれ?
すみません。 有 効 桁 っ て 何 ?
>>336 規格ではintを返すか、intをtypedefした型を返すか、実装依存の型を返すかの
いずれかでなければならないとされている。
よって、君の環境でvoidがOKならばvoidでも構わないし、ダメならばダメ。ただし、
int(とそのtypedef)以外をreturnとして指定した場合動かない環境が出てきても
文句は言えない。コード自体は規格違反ではない。
ただ、ANSI-Cと銘打ってある以上、intを指定するのが望ましい。よって、規格
違反ではないが、「親切な」本とは言い難い。
>>338 なるほど〜
ありがとうございます。
自己参照型構造体を知りたくて買ったんだけど、はずれだったか〜
そういうわかりやすいミスをしている本はむしろ注意力を身につける練習にぴったりだろ 極端な話、規格書にだってエラッタはある 何も信じるな、全てを疑え
サヨるのは十代までだ。 大衆に迎合して体制に媚び諂い、お上が黒を白と言えば即ちそれは白なのだと信じることが 腐敗を極めた俗世を生き抜く真理。 疑ってはならん。 ルーク。ソースを信じるのだ。
引っ込めヒッピー! ここは日本だ!
>>337 数学の勉強しろ
精度がどの桁数まで有効かって事だ
一般的に使われる浮動小数は2進数で表現されて居るので精度は2進数の桁数で表現できるんだけど
通常使う10進数では有効桁数は違う
345 :
デフォルトの名無しさん :2006/10/27(金) 11:35:28
c言語初めて1ヶ月で壁に当たっています。 レベル低くて申し訳ないんですが教えてください。 ファイル操作に関する問題なのですが、fprintf()をつかって出力しています このとき[^z]の入力を判断したいのですが不可能ですか? 個人で勉強してるので聞くところがここしかありません><
>ファイル操作に関する問題なのですが、fprintf()をつかって出力しています (´-`).。oO(何を出力するのかなあ) >このとき[^z]の入力を判断したいのですが不可能ですか? (;゚Д゚)…え?
>>345 初心者スレへどうぞ。
つーか、出力関数で入力判断って何がしたいのやら。
#巧く説明できないようなら日本語を遣り直した方がいいかもね。
348 :
345 :2006/10/27(金) 12:08:29
間違えてました。ごめんなさい scanf("%s",str)で^zを判断する方法が知りたいです
初心者スレへ池といってるのに人の話を聞かない奴だな。 ^zが特別扱いされるかどうかすら環境依存だ。このスレで扱う内容ではない
350 :
345 :2006/10/27(金) 12:32:30
読み飛ばしてました 初心者スレいってきま
351 :
デフォルトの名無しさん :2006/10/28(土) 04:31:38
双方向リストをソートしたいのですが、適当なソート方法があれば教えてくださいませ 配列におけるソート方法はいろいろ学習したのですが・・・
マージソートだな
つーか、スレ違いだな。 今アルゴリズムスレが機能しているかどうかは知らんが。
すいませんスレ違いかもしれませんが、きかせてください C言語の勉強して基本情報をとったので、オブジェクト指向をやってみたいのですが C++とC#のどちらをやったらいいのですか。仕事とかではなく趣味なのですが
>>351 「C言語で書くアルゴリズム」って本に、リストのクイックソートが載ってるよ。
>>354 C++とC#とJavaを読めるようにしとけばいいんじゃないの?
>>354 普通にJavaがいいよ
Windowsで何か作りたいのがあるならC#
仕事でしょうがなくC++
Java,C++,C#あたりは、どれか一個やれば、 オブジェクト指向の解説本に載ってるようなコードは、 他の言語でも、だいたい読めるよ。
func A(struct A a){ .... a->any = malloc() } func B(){ struct A a; funcA(&a); } この関数Aの中のmallocで確保した領域は funcBに戻った時点で未定義ですよね?
うーんサンプル適当に書いてしまった とりあえず、関数のスコープを跨ぐ領域の確保を行う場合は どうすればいいの?4分木作りたいけど、なんか別関数でアクセス するとすぐセグメンテーションフォルトってやつが出る
きっとポインタの値渡ししてるんだろうなあ・・・
ううーん関数側でmallocする場合って void char(char ** buf)とかでいいの? でもさmallocでエラー出たときどうすればいいの?
>>361 まぁ、初心者スレにでも実際のソースを貼って味噌。
366 :
デフォルトの名無しさん :2006/10/29(日) 01:35:19
プログラムからファイルの読み込みや書き出しを 行うとはどういう意味なのでしょうか? コピーを作ると言う事なのでしょうか?
そのまんま。 ソースファイルにファイルを読んだり書いたりするコードを記述し、 それをコンパイルし実行する。するとソースに書いたとおりにファイルがメモリへ読まれたり書かれたりする。
>>366 質問する前に調べたか?
自分で作ってみたか?
369 :
デフォルトの名無しさん :2006/10/29(日) 01:44:29
>>367 ということは、実行ファイルに書き込まれると言う事なのでしょうか?
>>368 実行してみても、実感が湧きません。
コピーファイル(出力ファイル?「_」)ができるのですが・・・・
それが何に使うのか、何故できたのかがわかりません。
入門書を読んでいます。
授業風景を思い浮かべろ 黒板が読み込んだファイルで お前が記憶領域で ノートが出力ファイルだ
先生!出力ファイルに何も出力されてません!
何この漫才
C言語の勉強用の課題を集めたwikiがあったと思うのですが、 検索をしても見つかりません もうなくなってしまったのでしょうか? どこに書き込めばいいか分からず書き込ましていただきました。 スレ違いでいしたら、誘導お願いします。
375 :
デフォルトの名無しさん :2006/10/29(日) 03:30:58
>>370 ありがとうございました、イメージは掴めました
要するに「_」が付いてできたファイルが僕のノートと
考えてみます。
376 :
側近中の側近 ◆0351148456 :2006/10/29(日) 09:24:33
>>359 (っ´▽`)っ
関数Aの中のmallocで確保した領域が、
関数Bで定義されているポインタによって指されていれば
関数Bの中では確保されている状態です。
mallocがどこで行われようが、
問題はそれを指すポインタの有効範囲(スコープ)なんです。
(っ´▽`)っ
そもそもfreeをかけなければずっと確保し続けるというのが
C言語の仕様なのではなかろうか?
(っ´▽`)っ???
どうなんだろう?
ポインタのスコープを抜けると自動的にfreeをかけてくれる
ガーベジコレクションみたいな機能って
C言語のコンパイラにあるのかな?
>>369 > それが何に使うのか
ここでは、ファイルができるということを学ぶのであろうから、
正しく出力されてさえいれば、ファイルの中身そのものはどうでも良い。
> 何故できたのか
ソースコードにそう書いたから。
>>378 >ソースコードにそう書いたから
またミもフタもない言い方を。
一千年の時を経て今再び奇跡が起こったのだ、とか、
PCが君を勇者だと認めたのだ、とか、
初心者にはそういうソフトでかつドラマチックな演出が
必要とされているのではないのかね。
…コンパイラとか実行形式とかOSとかCPUとかノイマン型とかブール代数とか、
はたまたMOSFETの動作原理とか、
何から何まで説明しなければ、何故出来たのかの質問に答えていることにはならないだろう。
そこまで答えるだけの体力も知力も時の運も自分には既に無い。
このスレがチラシの裏ですよ^^
急速にスレの質が低下してまいりました ってのを最近見なくなった
383 :
デフォルトの名無しさん :2006/10/30(月) 08:10:21
急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました 急速にスレの質が低下してまいりました
384 :
デフォルトの名無しさん :2006/10/30(月) 22:43:31
int tmp,i,z,a[4],b[4]; b[0]=1;b[1]=1;b[2]=1;b[3]=1;b[4]=0; printf("配列に値を格納してください。\n"); for(i=0;i<=4;i++) { printf("a[%d] = ",i); scanf("%d",&a[i]); } for(i=0;i<=5;i++) { for(z=0;z<=4;z++) { if(a[i] > a[z]) { b[i]=b[i]+1; } } } printf("配列のデータと順位\n"); for(i=0;i<=4;i++) { printf("a[%d] = %d%d番目\n",i,a[i],b[i]); } 数値をキーボード入力して 入力した数値を降順に順位をつけて出力したかったのですが なぜか最期の数値がおかしくなります サンプルで入力した数値は12,10,32,14,8です
385 :
デフォルトの名無しさん :2006/10/30(月) 22:51:53
>>384 int a[4]];
と定義したら、有効な配列要素はa[0],a[1],a[2],a[3]の4つ
a[4]は参照すると誤動作をする(コンパイラはチェックをしない)
a[4]を使いたければint a[5];と定義すること。
386 :
384 :2006/10/30(月) 22:58:55
387 :
デフォルトの名無しさん :2006/10/31(火) 12:02:47
enum week { SUN, MON, TUE, WED, THU, FRI, SAT }; とした時、要素が7個あることをプログラムの中で知る方法は ありますか?
enum week { SUN=0, MON, TUE, WED, THU, FRI, SAT, NUM_WEEK }; として NUM_WEEK で我慢する
389 :
デフォルトの名無しさん :2006/10/31(火) 12:29:18
>388 ありがとうございます。 プリプロセッサか何かを駆使して、どうにかできないかなあと 考えてみましたが、無理みたいですね。
390 :
デフォルトの名無しさん :2006/10/31(火) 17:30:46
int main(void){ ・・・ return 0 ; } と void main(void){ ・・・ return ; } は何が違うの?
>>390 前者は規格(ISO/ANSI/JIS)で認められている形式。
後者はそうではなく、(コンパイルできるとしたらそれは)各コンパイラが独自拡張として受け付ける形式。
だれか馬鹿な俺に、ポインタを教えてくれ。 char str[][100]={"JAPAN","USA","CANADA"}; char (*p)[]; p[0]=str[0]; にすると、 (*p)には文字列の先頭アドレスが入る pにも文字列の先頭アドレスが入る この違いは何!?
すみませ〜ん #include <stdio.h> int main(int argc,char *argv[]){ printf("command name\t: %s\n",argv[0]); printf("contents of argument\t: %s\n",argv[1]); return 0; } これがエラーになるのは何でですか?
394 :
側近中の側近 ◆0351148456 :2006/10/31(火) 21:07:40
>>393 (っ´▽`)っ
実行時にパラメータを設定してるか?
指定しないとargv[1]はNULLとなり、
%sで異常終了するだろうね。
実行時のエラーですか? コンパイル時のエラーですか? エラーメッセージは何ですか? 意図する動作は何ですか? 引数には何を渡しましたか?
Cで数値計算というとLAPACKあたりできまり? 統計計算は、どれがお勧め?
>>392 >char (*p)[];
「p は、char の配列 (= 文字列) の先頭を指すポインタ」という宣言。
因みにこれが char *p だと
「p は、char (それが配列かどうかは別として) を指すポインタ」だが
実質、大差ない。
ただ、いずれにしろ宣言部分の書式なので
>(*p)には文字列の先頭アドレスが入る
わけではない。
398 :
側近中の側近 ◆0351148456 :2006/10/31(火) 21:33:16
>>392 (っ´▽`)っ ポインタを考える時にはメモリの状態を考えると良い☆
番地: 中身
1001: 'J' ←strが確保した領域(1001〜1300)
1002: 'A'
1003: 'P'
1004: 'A'
1005: 'N'
1006: '\0'
(略)
2101: 1001 ←pが確保した領域
str[0][0] = 'J'
&str[0][0] = str[0] = 1001
p[0] = 1001
&p[0] = p = 2101
*p = 1001
>>392 C++になっちまったが、このソースの結果を考えてみてくれ。
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
char str[][100]={"JAPAN","USA","CANADA"};
char (*p)[100];
p = &str[0];
printf("%p\n%p\n", p, *p);
printf("%s\n%s\n", typeid(p).name(), typeid(*p).name());
return 0;
}
要するに、「たとえアドレスが同じでも、型が違う」ということ。
>>392 「本州の最北端」と「青森県の最北端」は同じアドレス
402 :
393 :2006/11/01(水) 10:22:51
>>394 ,395
コンパイル時のエラーです。
/lib/なんちゃらなんちゃらが読み取りエラーみたいな
メッセージがでます。
>>402 「/lib/なんちゃら」 が出てくるならコンパイル時じゃなくてリンク時だと思うけど
それ多分ディスク壊れてるよ
404 :
393 :2006/11/01(水) 13:33:57
>>403 ガ━━(゚Д゚;)━━ン!
どうも…。
過去ログ置き場ってなんでパート123で止まってしまったんですか?
>>405 管理人が飽きたとか逃げたとか失踪したとか死んだとか
408 :
デフォルトの名無しさん :2006/11/02(木) 00:26:27
すいません、哲学的な質問です。 古いPowerMac上のMPWコンパイラでプログラミングしているのですが、素朴な疑問です。 MacにはToolBoxなるAPIみたいな関数があり、画面への 文字列の描画やリソースへのアクセス、デバイス操作、ファイル操作などは すべてToolBoxの関数を使って実現されます。 Windowsでも同様と思いますが(MFC/Windows API等)、Unix互換OS上では gccによりANSI規格準拠のファイル生成作業が行なわれますが、GCCが移植された DOSやWindows(2k/XP/98/NT)でも同様にfopenやfputs、fcloseで ファイルが生成されたりします。 当然fopen/fputs/fcloseでファイル生成はMacでも可能ですが、 Unixは別として、WindowsプログラミングやMacプログラミングから見た場合、 こういった生っぽい関数をいじるような低レベルなプログラミングはあまりして欲しくないんでしょうか。 ファイル操作ですが、MacではStandardGetFileというルーチンで OS標準のファイル選択ダイアログを出して、ファイルの操作を統括しています。 Windowsも同様にエクスプローラのサブセット?を表示してやりますよね。 どう思いますか?
409 :
408 :2006/11/02(木) 00:32:16
こういうコードです。完全ANSI準拠ですけど。 Mac/Windows(DJGPP; GCC)/DOS/NetBSDで動作確認済み #include <stdio.h> /* for file I/O */ #include <stdlib.h> /* for exit func */ int main(void) { char str[80] = "This is a test string to be written onto a new text file."; FILE *fp; if((fp = fopen("NewFile.txt", "w+")) == NULL){ fprintf(stderr, "File open failed.\n"); exit (1); } if((fputs(str, fp)) == EOF){ fprintf(stderr, "Write error!\n"); exit (1); } if(fclose(fp) == EOF){ fprintf(stderr, "File close failed!\n"); exit (1); } return (0); }
>>408 他の環境に移植する予定がないなら便利な方で
移植する予定があれば標準で
っていうよりも、依存部分をなるべくまとめて
対応する部分の差し替えで済むなら便利な方で
古いMacなら早晩買い替えそうだしね
でも、その時もそのコードを必要とするかというと・・・どうだかね?
411 :
408 :2006/11/02(木) 00:40:06
>>410 なるほど。ありがとうございます。
そうすると、たとえばベクターとかにWindows用のアプリケーション・ソフトが
たくさんありますが、これはもうWin32の環境に注力しているのであって、
MacやDOS、Unix互換OSへの移植はほぼ考えていない、と。
ちょっと考えただけでも、タイムスタンプ変更ツールなど。
もろにOS依存ですけど。
常識的に考えてそうですよね。けれども、fopen/fputs/fcloseみたいな
生っぽい関数ってCの中でも(とりわけANSI C)異色ですよね?
>>408 Windows用のソフト作者が皆、他環境への移植を考えていないというわけでもないだろう。
例えばテキストエディタでも、グラフィカルな部分はOSごとに全く異なる処理が必要かもしれないけど、
内部的なデータ管理などは環境に依存せずに流用できると思う。
(実際にどう作られているのかは知らないが。)
単に個人レベルでやっていると各種プラットフォームをカバーするほどのマンパワーがないとか、
機能を充実させることが楽しいのであって他環境への移植には技術者的な興味が沸かないとか、
そういう部分も大きいのかも。
fopen等が生っぽくて異色ということは無いだろう。
ファイルという概念はかなり多くのコンピュータで基本的な概念だし、
ANSI準拠の標準ライブラリなのだから、特殊な環境への移植を考えているのでなければ
使用を躊躇う理由はあまりないんじゃない?
むしろ、OS固有のシステムコール等を隠してくれるのだから、移植性を考えるなら
積極的に使っていいと思う。
ユーザにファイルを選択させるなら、そのOSで標準的なデザインのダイアログを開いたほうが便利だから、
その場合は各OS固有の便利なライブラリを使用すればよいし、
内部的な処理でファイルI/Oするならfopen系でも十分なはず。
要は適材適所ということで。
ところで、
>すいません、哲学的な質問です。
これはかなり感覚がずれてないかい? 哲学ってそんなもんじゃないだろう。
413 :
408 :2006/11/02(木) 01:38:18
>>412 大部分は同意なんだけど、fopen/fclose/fseekなどが
生っぽいという感触は間違ってないと思うけどな。
だいたい、それぞれの出自をたどればUnixのopen/close/writeとかの
システムコールに行き着くわけでしょ?そもそもUnixを書くために
Cが生まれたくらいだし。
Windows上のVCとかでコンソールアプリ作ってさ、printfやら
fputsやらも使えるけどさ、やっぱコンソールアプリいきなりでてきたら
フツーの人はビビるでしょ。Macでもコンソールアプリつくれるけど、
通常のWindows/Macのプログラミングのゴールはやっぱさ、
こうウインドウが出てさ、ダイアログが出てマウスでポチっとな、ってやつでしょ。
そういう、エクスプローラダイアログ出して、文字入力ボックス出すんじゃなくて、
fputs/fwriteしちゃうのが生っぽい、と思ったわけ。
これ、哲学でしょ、プログラミングの、依存・非依存のハナシとしては。
哲学でもなんでもなくって単なる主観の垂れ流しな気がするんだが。
そういう哲学考えて生産性なんかあんの?
つーか、スレ違い。
生っぽく見えるのは見た目がそうだからだろう。 それはOSのアーキテクチャの問題であって言語の問題じゃない。 思えば自分も工房の頃はなんちゃって哲学に目覚めたことがあったな…
すみません… C言語でWinXP上にJavaみたいなウインドウ出したいんですけど、 それって出来ます? LINUX上でもいいんですけど…
C言語で一文字の変数って非常識? forに限った使用だったんだが...
Javaで出来ることはC言語でも出来る。Javaのコア部分はC言語だから。
>>421 意味分からん。
VMやらコンパイラがCで書かれてるってことか?
423 :
デフォルトの名無しさん :2006/11/02(木) 21:43:50
>>420 整数にi, j, k, l, n, mを使うのは非常識ではない
FORTRANのなごりか
424 :
423 :2006/11/02(木) 21:55:51
あと、ポインタにp. qを使ったり for文の制御変数に一文字の変数はごく普通
無理してlfXとかつけると返って分かりにくくなることがある
Deleteキーのキーコードって幾つですか? また、CTRL+H でバックスペースみたいに、 CTRL+○ でどのキーを押せばDeleteになりますか?
そうですよね。使い方さえ間違わなければ一文字変数有りですょね。(´∀`) 非常識って言われてちょっとキョドってしまった。w 楽になりました。ありがd♪
C言語と関係ないけど。
>>426 >Deleteキーのキーコードって幾つですか?
ASCIIコード表を読め。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html キーコード調査プログラム。
#include <stdio.h>
#include <conio.h>
int main()
{
int c;
c = getch();
printf("%x\n", c);
return 0;
}
ただしconio.hはDOS依存。UNIXは知らん。
あとキーコードには2バイトのケースもあるので、
その場合はkbhit関数等を駆使して調べる。
>>427 私のコーディング規約では非推奨としている。
特にiは検索しにくいので個人的には好かん。
尚、可読性の点からlは却下。
forは何でまわしてるの?
dwLoopCounter
> dwLoopCounter 素人くさい。。。
433 :
429 :2006/11/03(金) 01:32:29
>>430 icとかix, iyとかitとか状況により色々。
最近はC++でstl使うことが多いからそもそもループ制御に整数変数を使うこと自体減ってるが。
短い変数が嫌いな人への皮肉を込めて書いてみますた もっと長大な名前にしたかったんだが
プログラム書く時間の2割ぐらいは変数とか関数の名前を考えるのに使われてる気がする
釣りにもならんわ。 しかし短い変数が嫌いってのもなんだかな。 言語屋や論理屋がCやC++みたいな実務優先の汚れ言語に付き合うのは 疲れるばかりだと思うんだが。
437 :
429 :2006/11/03(金) 02:11:52
漏れのことか? 漏れならばりばりの実務屋だが。 エディタで変数を追うのに、i一文字だと一々ifにぶちあたって面倒だとは思わないか? この板に貼られているコードの断片の制御変数にicを使っているのは漏れだけじゃないようだし、 一文字変数嫌いはそれなりにいそうだが。
えーと外部結合の識別子の長さ制限はC99で撤廃されたんだっけ? と無理やりタイトルに沿った話題に戻してみる
カーニハン&パイク両氏のプログラミング作法では、 一文字変数をループに普通に使ってるけどな。
まさに自転車置場の議論
>エディタで変数を追うのに、i一文字だと一々ifにぶちあたって面倒だとは思わないか? ぜんっぜん思わんわ。 どんな状況でも俺流を押し通せるのはマの資質の一つかもしらんが 慣習的なものとはいえ、これだけ広く普及してるモツにあえて牙剥くだけアホらしい。 まあ、好きにすれば。
443 :
429 :2006/11/03(金) 03:38:12
>>442 インクリメンタルサーチで事足りるときに、一々そこまでするかという問題。
#マウスがないとカーソル移動できなかったりカーソルキーを連打するような使い方に馴れてると面倒を感じないだろうなぁ。
>>441 いや、モツは鍋にしても苦手なんで牙むくことはないがw
冗談さておき、なにをむきになっている?
iは好かんと言うことがそんなに気に入らないのかねぇ……
444 :
デフォルトの名無しさん :2006/11/03(金) 04:21:55
Cを勉強しててソースコード読んでたら far ポインタ っていうのがあって・・・ char * far lp; とかあったんですよ。 手元ANSIの辞典には項目がなく 調べてみると、大雑把にはメモリが大きくなったから セグメントやらオフセットやらがどうのこうのと・・・ それはおいておいて、このfarっていうのが bcc32だと変数名と認識されるのかエラーなんです farとかnearとかって廃止された予約語なんですか? それとも非標準のC? 調べた印象だと普通にあるみたいなのですが、 そのへんの経緯を教えてください PS 32bit系ならfarをはずすだけでとりあえずそこはおk?
16ビット時代の遺物の予約語だな。 BCC5.0.2当たりならまだ現役で残ってるけど
#define far って書いときゃOK
((((;゚Д゚)))ガクガクガクブルブルブル 8086セグメントの悪夢を思い出した・・・・・
もう、あれだよな C99とかどうでもいいな それに厳密にしたがってるコンパイラは どれだけ普及してるんだってな
>>431 それfor内で何度も出てくると見にくくね?
ループカウンタ変数を検索するような必要性に迫られるシーンが思い浮かばない orz
想像力欠如
俺も452と同意見だが、仮にそのような機会があったとしても、 正規表現を持ち出すまではなくても、いわゆる単語検索でi1文字の検索はできるだろうと思う。
まぁ変数名ごときで悩むような奴はたいていハゲてる
吹いたw
iの検索でifが引っかかるって問題は、単語単位の検索を使えばいい。
>>452 何百行もあるような関数を書いて、そのなかでアチコチで使いまわしてるとか、
そんなんじゃないの?
そんな子供レベルの悩みに拘泥してる奴が実務屋名乗ってたら吹くな。 いくらなんでもそんなこたないだろう。
だからね、2行先の30カラム手前のループ制御変数に移動したかったらどうするか想像してご覧よ。
そんなことで一々マウスに手を出すほど暇じゃないんで、viなら/ic、emacsならC-sicで検索するわけだ。
これなら順に、nで移動したりC-sで移動したりできると言う寸法。
#WindowsのエディタならAlt+Fでicと入力しておいてF3で移動かな?
そんなときに、i一文字だとifに一々引っ掛かるでしょってことくらい判って欲しいなぁ。
#まぁ、本当に2行先の30カラム手前と判っているなら素直にviではjj30h、emacsでC-nC-nC-u30C-bするが。
だから、正規表現を持ち出すまでもないし同様に単語検索を持ち出すまでもないんだけど。
>>455 大丈夫、悩んでないから禿げてない。
つーか、誰か悩んでいるのか?
#あぁ、>458が随分とご執心のようで。
> 2行先の30カラム手前のループ制御変数に移動したかったら 幸いにもそういう状況に出くわしたことはないので想像できないよ 素朴な疑問だけど間にClickみたいなicを含む単語があったらどうするの?
461 :
429 :2006/11/03(金) 11:06:01
だからぁ、そんなときは(頭の中で「はいはいClickClick」と唱えでもしてから)nなりC-sなりをもう一回押すだけだって。 #少なくとも、i一文字で引っ掛かる確率に比べればicが引っ掛かる確率は低いぞ。 それよか素朴な疑問なんだが、移動のアンカーに変数名を使いたくならないのか? #そもそもただのコーダーなら(理論的には)修正の必要が生じることもないのかも知らんが。
> そんなことで一々マウスに手を出すほど暇じゃないんで、viなら/ic、 for (i = 0; i < ... みたいな行のiに飛びたいなら「/i 」でもいけるけどね。
結局俺ルールの話じゃないか。 多かれ少なかれその手のルールは皆持ってるもんだが、 それが普遍的なものであるか、真に有用なものであるかは 大抵の場合疑わしく、使ってる本人も大抵「手に馴染んでるから」以上の理由が無いことを 自覚して使ってるもんだ。 本人ペンディングしたがってるみたいだからこの辺でシメでいいとは思うが、 とりあえずこれだけ。 サンプル持ち出すまでも無く、それはそれなりのマイノリティ。 つーか大体にしてスレ違いもいいところだしな。
スタイルの話は刷れ痴害
465 :
452 :2006/11/03(金) 13:22:00
>>461 一般的な変数アンカーは使うよ。
ただ、ループカウンタをターゲットにすることは稀 ってことで
参照されない回るだけのためのカウンタ or 配列等の引数に渡されるカウンタ
スタイルフリーな言語での宗教論争はしかたないよなぁ…
466 :
デフォルトの名無しさん :2006/11/03(金) 15:58:46
ま、ソースコードを読む上では 別にicだからってそこまで見にくくなるわけじゃないし 他人の性癖にどうこう言う必要はないんだよね プロジェクトで強要されても痴漢(あれ?)で一発だし
置換じゃなくてリファクタリング機能を使おう。 短い変数名ならなおさら
質問です。 char *moji[] = { "aaa", "bbb", "ccc", NULL }; このような文字列を while ( *moji ) { printf("%s\n", *moji); *moji〜 } 上のようにwhileで表示し、文字列NULLが来るまでアドレスを進めて表示したいのですが *moji〜のアドレスを進める部分が分かりません。 どのようにすればいいのでしょうか?
++moji;
470 :
469 :2006/11/03(金) 23:28:41
あ、mojiは配列か char**p; for(p=moji;*p;++p){ printf("%\n",*p); }
氏ね
472 :
468 :2006/11/03(金) 23:39:43
>>470 ありがとうございますm(_ _)m
このようなやり方は思いつきませんでした。
別の変数用意しないとダメでしたね・・・。
>486 耳かっぽじってよく聞けよ >1だからな>1 ちゃんと>1を見ろよなっ!!
>>486 どうしてこんなところに迷い込んだんだ…
最近趣味でsin()とかlog()とかの基本的な関数を自分で書き直して遊んでいるのですが、 ANSI Cでこれらの関数がどう定義されているのか載っている本・サイトはないでしょうか? どのくらいまで誤差を許容しているのか知りたいのです RAND()やRND()は「C言語による最新アルゴリズム事典」に載っているのを見つけたのですが その他は見つけることが出来ませんでした
>>479 三角関数のアルゴリズムは、その本に載ってなかった?
(規格でどう規定されてるかは知らないけど)
>>479 「C言語の規格としての定義」なら、例えばJIS X 3010 では
7.12.4.6 sin 関数群
形式
#include <math.h>
double sin(double x);
float sinf(float x);
long double sinl(long double);
機能 sin関数群は、x(ラジアン値)の正弦を計算する。
返却値 sin関数群は、正弦値を返す。
と書いてあるだけ。
JIS検索
ttp://www.jisc.go.jp/
>>480 ググってみました
…高っ
>>481 三角関数はtan()を連分数展開で求めて、sin()cos()はタンジェントから求めるという方法が載っていたのですが
ANSI Cの規格についてはノータッチでした。
完成したらANSI Cの関数と性能比較をしたいのですが、誤差を大体同じくらいにしないと比較にならないので
困っています。
>>485 わざわざありがとうございます。
まだ斜め読みですが、483さんが書いてくださったようなことしか書いてなくて
実装についてはノータッチみたいですね。
結局細かい実装については各コンパイラにおまかせということ、なんですかねえ
ともあれお二方ともありがとうございました。
487 :
479 :2006/11/04(土) 15:40:00
数字コテつけておけばよかった
ざっと流して読んだところ
>>485 さんの教えてくださったpdfには実装例について書いている関数もあれば
定義だけ書いてある関数もあるようです。
RAND()は実装例についても載っていました。
>>484 483のサイトからただでPDFが得られる。
ところで数学関数の実装はテイラー展開などの近似式を使う場合もあるが、、
CPUがそういう計算の命令を持っている場合には(アセンブリ言語などで)それを使うこともある。
489 :
479 :2006/11/04(土) 17:25:53
>>488 一応マクローリン展開による方法と連分数展開による方法で実装して
速度比較するつもりです
CPUが持ってることもあるんですか、知りませんでした
もし持ってれば大分高速化できそうですね
x86のアセンブリの仕様も読んでおきます
コンパイル後に、lint というツールを使用するのは基本なんでしょうか。 lintで構文チェックするのは常識ですか。
C言語の規格とは関係ないな
>> 491 どのあたりの板になりますか?
>> 493 そちらに行きます。ありがとうございます。
fprintf(gp,"plot \"%s\" using 1:3 with lines \n",fourier); gnuplotをパイプで使うプログラム内のこの記述でエラーが出ます。 fourierはn行3列のデータです。 どなたかエラーの理由が分かる方教えて下さい。
どなたかエラーメッセージが分かる方教えて下さい。エスパーでもいいので
497 :
495 :2006/11/04(土) 21:49:10
すいません。自己解決しました。
498 :
479 :2006/11/04(土) 22:07:03
>>488 読んできました
x86の命令セットにもサイン・コサイン・タンジェント・アークタンジェント・平方根等の命令がありました
これで悩む必要がなくなって嬉しいような残念なような複雑な気分です
ありがとうございました
精度を犠牲にすればCPU組み込みの命令よりさらに早くできるけどな
まあソフトウェア実装のほうがいろいろ融通が利くのは当然だわな
501 :
479 :2006/11/04(土) 22:32:57
速度出したかったら表作っておいて補間がオーソドックスな方法でしょうか? FSINのクロック数調べたら60〜100くらいかかる上にペアリングできなくてちょっと驚きました
前半はアルゴリズムや計算量の話だし後半はCPU依存だし このスレで答えていいのか微妙
>>502 確かに ISO も ANSI も JIS も関係がないな。
ぶっちゃけ自分の欲しい答えが手軽に手に入ればみんなどこでもいいんだ。
やっぱゆとり教育世代の自己中な性格がこんなところにまで影響してきているということか。
まあとりあえず規格から探してみるって姿勢はいいんじゃねーの
で、君たち、年はいくつだ?
俺33。 嫁なし子供なし。
構造体の配列のソート処理について教えてください。 例えば、メンバ a, b, c を持つ構造体の配列を、少なくともひとつの列を選び その列についてソートします。 ただし、複数の列を選択した場合は、優先度を付けてソートしたいのです。 具体的には、メンバ a, c について、この順の優先度でソートする場合は 配列全体で見た場合、メンバ a でソートされていて、メンバ a の同値ごとに メンバ c でソートしたいのです。 簡単にやりたいことを言うと SQL の ORDER BY a, c を実装したいのです。 とりあえず、優先度の低いメンバから順々にソートをしていけば目的の結果を得ることができました。 ※ 上記の例だと、まずメンバ c でソートして、その後にメンバ a でソートしました。 ただ、ソート処理を何回も繰り返すのが、どうも気に入らないのですが 一度のソート処理で同じような結果を得られる方法ってあるのですか?
>>507 qsort() に適当な辞書順比較関数を渡せ。
//こんなんかなぁ #include <stdio.h> #include <stdlib.h> typedef struct hoge { int a,b,c; } hoge; int hogecomp(const hoge* lhs, const hoge* rhs) { int dst = lhs->a - rhs->a; if(dst) { return dst; } else { return lhs->c - rhs->c; } } int main(void) { int i; hoge array[] = {{5,1,3},{2,3,1},{3,3,3},{5,2,1},{13,11,4}}; qsort(array,5,sizeof(hoge),&hogecomp); for(i=0;i<5;i++) { printf("%d : a->%d,b->%d,c->%d\n",i,array[i].a,array[i].b,array[i].c); } return 0; }
510 :
507 :2006/11/05(日) 14:59:12
レスありがとうございます。
2つのメンバについて比較する関数を用意すればいいのはわかりました。
ということは
>>507 のように、3 個のメンバを持つ構造体の配列をソートする時
任意の数のメンバを選択して、かつ優先度も任意でつけられる場合は
・メンバ 1 個についてのソート
3個のメンバから1個を選ぶ・・・3通り
・メンバ 2 個についてのソート
3個のメンバから2個を選んで優先度で並べる・・・3P2 = 6通り
・メンバ 3 個についてのソート
3個のメンバから3個を選んで優先度で並べる・・・3! = 6通り
のように、15通りの比較関数を容易しておかないといけないのですか?
それとも、今回のような要件の場合は、ソートを複数回行う方がよいのですか?
規格に全然関係ない質問に嬉々として答えてる馬鹿はなんでここにいるの?
>509には問題があるので要注意。
>>510 15通りの比較関数の代わりに、一つの比較関数でやれば宜しい。
そのためには、比較関数で参照できるようなフラグを用意すればいい。
Ex.
struct {
enum {CompColNone, CompColA, CompColB, CompColC} Col1st, Col2nd, Col3rd;
} gComp;
int hogeComp(const void * a, const void * b)
{
const hoge * lhs = (const hoge *) a;
const hoge * rhs = (const hoge *) b;
switch (gComp.Col1st) {
case CompColA:
if (lhs->a > rhs->a) return 1;
if (lhs->a < rhs->a) return -1;
break;
case CompColB:
if (lhs->b > rhs->b) return 1;
if (lhs->b < rhs->b) return -1;
break;
case CompColC:
if (lhs->c > rhs->c) return 1;
if (lhs->c < rhs->c) return -1;
break;
}
// 以下同様に2nd、3rdも処理
return 0;
}
// こういう泥臭い実装が嫌ならC++に移行してしまえ
>>510 要件がほんとにあんたの言うとおりなら、比較関数の動作はそれだけの種類が必要だろう。
ソートを複数回するのは速度的に不利だが、比較関数は用意しなくていい。
それが「よい」かどうかはあんたが決めること。
複数回ソートでうまく動作させるためには安定ソートじゃないとだめだから、
qsort() が使えないのもデメリットだな。
>>511 そりゃあんた、ここは企画のみを云々するスレじゃないからね。
>>511 >>1 を読む限り、規格に関連した話題のみという縛りはないからだろう。
嫌ならさっさと誘導しろよ。そして次スレの
>>1 を提案するんだ。
どうみても宿題丸投げ行きです
517 :
507 :2006/11/05(日) 16:27:10
色々とありがとうございました。
>>512 さんのをベースにやってみようと思います。
それと、実装する言語がC言語であること、宿題ではなく個人的な疑問だったため
あえて宿題スレではなく、こちらで質問させてもらいました。
不愉快に思われた方、すみませんでした。
>>507 これでは不満かい?
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
char *atoffset(const void* s, size_t offset) {
return (char*)s + offset;
}
size_t comp2configure1, comp2configure2;
#define comp2configure(s,a,b) do{comp2configure1=offsetof(s,a);comp2configure2=offsetof(s,b);}while(0)
int comp2(const void* lhs, const void* rhs) {
int first = *(int*)atoffset(lhs, comp2configure1) - *(int*)atoffset(rhs, comp2configure1);
if (first)
return first;
else
return *(int*)atoffset(lhs, comp2configure2) - *(int*)atoffset(rhs, comp2configure2);
}
typedef struct hoge {
int a, b, c;
} hoge;
int main(void) {
int i;
hoge x[] = {{5,1,3},{2,3,1},{3,3,3},{5,2,1},{13,11,4}};
comp2configure(hoge, a, c);
qsort(x, sizeof(x) / sizeof(hoge), sizeof(hoge), &comp2);
for(i = 0; i < 5; i++)
printf("%d : a->%2d, b->%2d, c->%2d\n", i, x[i].a, x[i].b, x[i].c);
return 0;
}
だから整数値を比較のために引くのは(アンダーフローの可能性があるから)拙いってばさ。
差の最大値が INT_MAX 以下(未満?) でないと、引き算で代用できないっとことだな。
521 :
518 :2006/11/05(日) 17:05:32
んじゃ書き直しで。 #include <stdio.h> #include <stdlib.h> #include <stddef.h> char *atoffset(const void* s, size_t offset) { return (char*)s + offset; } size_t comp2configure1, comp2configure2; #define comp2configure(s,a,b) do{comp2configure1=offsetof(s,a);comp2configure2=offsetof(s,b);}while(0) int comp2(const void* lhs, const void* rhs) { return *(int*)atoffset(lhs, comp2configure1) > *(int*)atoffset(rhs, comp2configure1) || *(int*)atoffset(lhs, comp2configure1) == *(int*)atoffset(rhs, comp2configure1) && *(int*)atoffset(lhs, comp2configure2) > *(int*)atoffset(rhs, comp2configure2); } typedef struct hoge { int a, b, c; } hoge; int main(void) { int i; hoge x[] = {{5,1,3},{2,3,1},{3,3,3},{5,2,1},{13,11,4}}; comp2configure(hoge, a, c); qsort(x, sizeof(x) / sizeof(hoge), sizeof(hoge), &comp2); for(i = 0; i < 5; i++) printf("%d : a->%2d, b->%2d, c->%2d\n", i, x[i].a, x[i].b, x[i].c); return 0; }
>>522 ISO/IEC 9899:1999の7.20.5.2 The qsort functionを読んだけど、どのあたりを
意図しているのか分からなかった。教えて♥
>>524 比較関数の戻り値。
>>521 コードじゃ論理比較の結果だから 正(または負)か0しか返さない。
1 か 0 しか返らないよ。
C++ の sort() と勘違いしてるんだろう。
つか 0 と 1 しか返せない関数だと qsort で止まるか落ちるぞ?
>>529 え?なんで? 0 も 1 も戻り値としては有効だろ?
負の戻りも必要だー。
>>530 qsort() 内部の要素比較再帰/ループで矛盾が生じるから。
つか、みんなイロイロ考えつくな。俺は↓しか思いつかんかった。 int hogecompA(const hoge* lhs, const hoge* rhs){ return (rhs->a < lhs->a) - (lhs->a < rhs->a); } int hogecompB(const hoge* lhs, const hoge* rhs){ return (rhs->b < lhs->b) - (lhs->b < rhs->b); } int hogecompC(const hoge* lhs, const hoge* rhs){ return (rhs->c < lhs->c) - (lhs->c < rhs->c); } int (*hoge_comp1)(const hoge*, const hoge*)=0; int (*hoge_comp2)(const hoge*, const hoge*)=0; int (*hoge_comp3)(const hoge*, const hoge*)=0; int hogecomp(const void* lhs, const void* rhs){ int dst = hoge_comp1((const hoge*)lhs,(const hoge*)rhs); if(!dst && hoge_comp2) dst = hoge_comp2((const hoge*)lhs,(const hoge*)rhs); if(!dst && hoge_comp3) dst = hoge_comp3((const hoge*)lhs,(const hoge*)rhs); return dst; }
具体的な例を示すことができなくてすいません。 これまで、コンパイルできた古いソースが、コンパイラのバージョンを 上げたり、他のOS上でポーティングしようとした場合、エラーになること があるのは当り前と考えるべきでしょうか。 ポーティングで気をつけるべき点があれば、ご教示ください。
>> 535 どうも、ありがとうございます。 でもね、誰が作ったわからない巨大なプログラムをポーティングするのは つらいと思いませんか。コンパイラ以外でチェックする方法はないですかね。 ないでしょうね。
>>536 ありませんね。だからこそ世界中で多数の人間が苦労しているわけで。
>> 537 なるほど、そうですよね。理解しました。
>>と数字の間にスペース入れるなやカス
規格ではビットシフトはデリミタを入れてもいいはずだが・・・
アンカだろw
釣りだろw
コマンドからいくつか引数を取って 一つの文字列につきメモリをその都度動的に確保し 逆順に並べ替えて、さらに出力行の最後の一文字目だけ大文字にして 出力するプログラム (動的メモリ割り当て) 誰か教えて下さい お願いします
bsearchを用いてlist1を探索するプログラムを以下の様に書いたのですが、 list2を探索する時にはbsearchの引数やcomparをどの様に書き直せば良いのでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #define N_ELEMENTS 3 #define MAX_STRLEN 16 int compar(const char **str1, const char **str2) { return strcmp(*str1, *str2); } int main(void) { void **p; char *key = "orange", *list1[N_ELEMENTS], list2[N_ELEMENTS][MAX_STRLEN] = { "apple", "banana", "orange" }; list1[0] = "apple"; list1[1] = "banana"; list1[2] = "orange"; if((p = bsearch(&key, list1, N_ELEMENTS, sizeof(char *), (int (*)(const void *, const \void *))compar)) != NULL) { printf("%d\n", ((unsigned int)p - (unsigned int)list1) / sizeof(char *)); } return 0; }
548 :
546 :2006/11/06(月) 14:35:58
自己解決しました。
>>547 課題とかでは無かったんですが、アドバイスありがとうございます。
callback はキャストして渡さずに(bsearch 呼び出し部)、 要求されている通りの型で関数宣言して、その内部で自前の型にキャストして使ったほうが良いよ。 適合していない形式のものを無理矢理渡してしまう可能性があるからね。
設問 入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。 横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
ま た お ま え か
int main() { char buff[200]; printf("単語を入力しろ\n"); scanf("%s", buff); printf("単語の長さ分の*を入力しろ\n"); scanf("%s", buff); prinf("%s\nおわり\n", buff); return 0; }
うんこをしたいんですが、どうしたらいいですか?
靴下をはけ
パンツを脱ぐ
玄関に行き、
仰向けになる
大きな声で 「ぬるぽ」 と叫ぶ
その後、
デパートへ行って店員に要求を丸投げするのだ。 終わり。
563 :
デフォルトの名無しさん :2006/11/07(火) 19:53:39
規格によると、 排便はコメントか文字列の中でしないとエラーになったと思うが・・・
お前ら・・・w
規格厨氏ね
んじゃなんだ?コンパイラのバックエンドから独自拡張しろとでも?
>>554-566 ここまでをまとめると、
Q:うんこがしたい
A:トイレへ行き 〜 中略 〜 後ろの穴を拡張しろ。
そろそろC言語の話をしようじゃないか。
568 :
デフォルトの名無しさん :2006/11/08(水) 02:23:57
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
データをビット単位でずらしたい気分になったときに役立つ。
570 :
デフォルトの名無しさん :2006/11/08(水) 02:39:52
char kk[5]="baka"; として printf("%s",kk); でも出力されなく、 for(i=0; i>5; i++){printf("%c",kk); でも出力されません。 何がいけないんでしょう?
前者は不明ですが、後者は明らかにループが回っていません。
とりあえず、"%s\n"、"%c\n"に変えてみてくれ。 話はそれからだ。
>>572 それなんか意味あるの? このスレ的に。
for(i=0; i<5; i++)
576 :
デフォルトの名無しさん :2006/11/09(木) 05:44:11
>>570 むしろコンパイル通ったのがすごい・・・
typedef struct { int pc; struct PCS *next; } PCS; void push(PCS** top,int pc) { PCS* np; np = (PCS *) malloc(sizeof(*np)); np->next = *top; np->pc = pc; *top = np; } このコードで、np->next = *topが warning: assignment from incompatible pointer type となる理由教えてくだしゃい
typedefするとしてもめんどくさがらずにちゃんと構造体に名前つけたほうがいいと思うよ。
つけたけどwarning消えないッス
580 :
デフォルトの名無しさん :2006/11/09(木) 17:47:08
>>579 3行目 struct PCS *next;
って、それ以前を見てもなんなのかわかんな〜い><
>>578 ,580
こういうことか!ありがとうございました
typedef struct PCS PCS;
struct PCS {
int pc;
struct PCS *next;
};
ちなみにこうしてたから
>>579 書きました
struct PCS {
int pc;
struct PCS *next;
};
typedef struct PCS PCS;
何がしたかったんだ、、、。
ha?
だめだ・・・
584 :
デフォルトの名無しさん :2006/11/09(木) 20:16:34
typedef struct pcs { int pc; PCS *next; } PCS; のほうが良くない?
良くなくない?
プログラム(foobar)とsharedライブラリ(libhoge.so)があって、foobarのグローバル変数をlibhoge.soから参照したいのですが、どういう風に書けばいいでしょうか。 header.hにグローバル変数を書いて、両方でインクルードしてみたのですが、同名の別の変数になってしまいました。 何かいい方法はないでしょうか。 よろしくお願いします。
typedef struct PCS_t { int pc; struct PCS_t *next; } PCS; のが良いな俺的には
typedef struct _PCS { int pc; struct _PCS *next; } PCS;
タグ名と typedef 名を別にするメリット、あるいは同じにしたときのデメリットって何?
わざわざ別の名前つけて、しかもタグ名のほうは実装向けっぽい名前にするのは、
ヘッダの依存関係を減らすための前方宣言が使いにくくなるんでやめてほしい。
ひどいときには
>>588 みたいに平気で予約名使う奴までいるし。
opaque でない構造体を typedef するのはあまりお勧めできない
予約名?
予約名って予約語のこと?
予約された識別子のことだろう。 先頭アンダースコアで英大文字続く識別子はすべて予約されている。 ユーザープログラムで使用した場合の結果は未定義となる。
594 :
593 :2006/11/09(木) 21:15:30
使用した場合じゃなくて、宣言(マクロ定義含む)した場合だな。
>>590 opaque な構造体と区別する理由は何?
>>595 Typedefs are problematic
because they do not properly hide their underlying type; for example you
need to know if the typedef is the structure itself or a pointer to the
structure. In addition they must be declared exactly once, whereas an
incomplete structure type can be mentioned as many times as necessary.
Typedefs are difficult to use in stand-alone header files: the header
that defines the typedef must be included before the header that uses it,
or by the header that uses it (which causes namespace pollution), or
there must be a back-door mechanism for obtaining the typedef.
「opaque でない構造体」って、どんなの?
>>598 ヘッダ(公開インターフェース)で定義(宣言だけじゃなくて)されている構造体。
>>597 opaqueな状態だと詳細はパッケージの外からは見えないわけだから
許してやってもいいかなとおもっただけ.
パッケージ内ではtypedefされていない方でプログラムするって原則で...
>>600 詳細が見えなくても、 typedef は一度しか宣言できないのは変わらなくて、
typedef したヘッダを include しないと使えなくなるのも変わらない。
やっぱり全部やめたほうがいいと思うよ。
FILE*を見習えばいいんじゃね
>>602 いあ, まぁ, そなんだけどね…
っか, 前後の流れが…
おまえらなんで構造体をtypedefするんだよぉorz
構造体の typedef 普通にするけど何か文句あるの? これぐらい慣れとかないと C++ でのーみそ破裂するぞ。
C++ならenumもstructもtypedefなんかせんわい。
オバキューって何だよ
>>607 C++ は使う時に struct 省略できるし、class だってあるだろ。
処で、main()の再帰呼び出しって認められてたっけ?
>>610 C では許容されてる。
C++ では禁止されてるはずだけど何故か VC6 では動く。
612 :
610 :2006/11/10(金) 00:39:13
>>611 情報THX。
ふむ、禁止はされてないのか。じゃ、ほっとくか。
>>593 Win32 APIヘッダって規格の視点から見たら「ユーザープログラム」だよな。
何とかしてくれ
>>610 C++で禁止されてるのには理由もあるけどスレ違いな理由なのでここには書かない
CやC++のISO標準仕様を手に入れたいのですが、お金払わないと無理なんでしょうか。
615 :
デフォルトの名無しさん :2006/11/11(土) 00:54:25
すみません。あげさせせて頂きます。
>>614 基本的には、買うもの。英語のドラフトでいいならダウンロード可能。
C なら
>>485 。 C++ なら、 C++相談室のテンプレに同様のリンクが張ってあったはず。
617 :
610 :2006/11/11(土) 08:14:19
>>613 うん、C++の方は理由を含めて知ってた。Cの場合を確認したかったのよ。
さんくす616
制限時間を指定して、数字を入力。 制限時間がきたら入力中止。 というプログラムを作りたいのですが 並列処理が必要なので手に余っています。 どなたかアドバイスおねがいします
>>620 環境もGUIorCUIかも何も提示せずにそれだけで何か答えがもらえるか?
このスレでは標準関数のみ & CUIと決め付けて回答していいだろ。 どっちにしろ宿題スレ行きだとは思うが
Cの標準で並列処理は無理だからさようなら。
>>624 笑いどころは void が暴れてるところ?
ファイルを開いた後で、モードを変換することって出来ますか? 具体的には "r"で開いてscanfで読み込んだ後、"rb"にモードを変更して残りをfreadしたいのです
環境依存。
freopenは標準関数に含まれてるな。 なんでもかんでも環境依存で片付けるなよ
そもそも"rb"と"r"のモードが違うという発想そのものが環境依存だ。 POSIXでは全く同じ動作とされている。
誰も"rb"と"r"が違うと決めつけてはいない。 ただモードを変えたい、それだけだろ。動作は同じかどうかは それこそ環境依存だが。相変わらずピンボケレスだな。
>>630 アホか。逆だろ。「POSIXでは〜」ってのが環境依存って言うんだよ。
>>631 お前が正しい。変なやつにマジレスするな。
要は、ISOでは"rb"の動作を規定していないが、"r"と"rb"が違う環境ではそれを切り替える目的にfreopen()が使える、 と言う話だろ。 Linuxのマニュアルでも"rb"を使うことは否定されていないのだし、>630の勇み足だな。
"r" → "rb" が出来ない環境があるやもよ?あるやもよ?
>>635 それはそうだが、標準でモードを切り替える方法は freopen() しかない。
使うんなら戻り値見てエラー処理しとけってことでいいだろ。
モード切り替えなくても良いようにできればそれがベストではあるんだけど。
処で、freopen()ではシークしなおさなければならないわけで、それが果たして>626の遣りたいことなのだろうか。
>>638 > freopen()ではシークしなおさなければならない
そんな制限あったっけ?
手元の MSDN にはそんなコト一切書いてないよ。
ごめん一切書いてないよは嘘だった。 でも、それは read と write を切り替える時は、と書いてある。 > "r+"、"w+"、または "a+" のアクセス種別を指定すると、読み出しと書き込みの > 両方を行えます (ファイルは "更新" モードで開きます)。ただし、読み出しと > 書き込みを切り替えるには、fsetpos、fseek、rewind のいずれかの関数を実行 > しなければなりません。fsetpos 関数または fseek 関数には、現在位置を指定 > できます。
お前ら余程原理主義者だな 圧迫したぜ
>>636 >、"r"と"rb"が違う環境ではそれを切り替える目的にfreopen()が使える
なんて何処にも記述されていない。
記述されているのは、
>どのようなモード変更を許すか、及びどのような状況での変更を許すかは、処理系定義とする。
だと言ってるんだが。
どうでもいいが、「ISOでは」はその読点の前までに掛かっているのだろうよ。
>>641 とりあえずスレタイ見たら?
仕様どおりに実装していない処理系の話とかは各々のスレでよろしく
負の整数をunsignedにキャストした結果は不定ですか?それとも未定義ですか?
>>645 6.3.1.3 により、キャスト先の型の範囲に収まるまでその型の
最大値 +1 の数値が足される(または引かれる)。
型の最大値が処理系定義なんで、厳密には処理系定義なんだろうけど、
結果は十分予測できる。
647 :
デフォルトの名無しさん :2006/11/22(水) 13:15:56
すいません、ANSIってなんて読むんですか? アンシ?アンサイ?アンスィイ? それともエインスィイ?
654 :
650 :2006/11/25(土) 00:46:06
それ以上続けると嫉妬されるのでやめてくれ。
656 :
デフォルトの名無しさん :2006/11/28(火) 21:32:10
入力された文字列にa〜zとA〜Zと0〜9しか含まれていないかどうかを調べる関数を if ( (*c >= '0' && *c <= '9') || (*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z') ) という条件で実装しようと思ったんですが、例えば0〜9が連続していない文字コード体系ではこの条件は破綻するかなと思い 結局全ての文字について調べるように実装しました。 C言語においては文字コードはどうなってるのでしょうか? if ( (*c >= '0' && *c <= '9') || (*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z') ) この条件を使ってしまっていいのでしょうか。
>>656 #include<ctype.h>
isalnum(c)
あーまぁわざわざ車輪をもう一度作りたいなら一応アドバイスしておくと、
0-9の連続は規格で保障されている。
でもa-z,A-Zは保障されていないから厳密には駄目。
658 :
656 :2006/11/28(火) 22:18:27
>>657 isalnum(c)
ぬわあああああ
ありがとうございました。
659 :
416 :2006/11/30(木) 01:56:33
>658 こういう関数って、どういうふうに実装されているんでしょうか? if( c=='0'||c=='1'||c=='2'|| ・・・ ||c=='a'||c=='b'||c=='c'|| ・・・ みたいに、一個ずつ比較するんでしょうか?
>>659 普通はテーブル参照。
一度ctype.hを眺めてみそ。
>>660 マクロで実装されている場合副作用がある式を渡しても誤動作してはならないとか
規定されてなかったっけ? その場合
>>659 はありえないという程度のことは
言えそうだけど
C99って識別子に日本語使えるのな。
C89のときから、識別子に使える文字は処理系による拡張が認められていましたが。
665 :
デフォルトの名無しさん :2006/12/05(火) 23:56:50
C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
主に高速化・ビットフラグの操作辺り WindowsAPIではWORD型(2byte)を二つ合わせてDWORD型(4byte)を作るのとかに使われている あとCPUの内部でも幾つかの命令を実装するのに使われているとか 例えば掛け算・割り算にもビットシフトを使っているらしい まあ、始めたばかりなら当分使うことは無い というか、最初はあまり高速化を意識しない方が良いから使い方は知らないでいい ある程度自力で調べられるようになってサンプルコードとか見て回るようになると色々面白いコードが見つかったりする ビット演算のスレもあるから、そのうち興味が湧いたらそっちも参考に
コピペ!?
フラッシュ・ゴードン あーあ〜
俺のターン! メモリマップドIOを攻撃表示に!
mallocでの取得可能サイズってdefine定義ってされていますか? あるのでしたら教えてもらいたいのですが・・・
int piyo(hoge1, hoge2, hoge3) int hoge1=0; int hoge2=0; double hoge3=0.0; { // 関数の実装 } みたいな形って最近のC言語の教科書ではあんまり見ないんですけど、古い仕様? int piyo(int hoge1, int hoge2, int hoge3) { // 関数の実装 } みたいに書くのと本質的な違いはあるんでしょうか?
前者は古い仕様、K&Rスタイルとも。 後者が新しい仕様、ANSIスタイルとも。もっともANSI Cは後方互換で前者も認めている。 前者だとプロトタイプ宣言で仮引数の型を指定しないことになる。 そのため前者だとfloat型引数はdouble型で渡されるが、後者だとfloat型で渡されるなどの違いが出てくる。
JISから観覧できる規格、pdf内の単語の検索 が出来ないのですが、そうなっているのですか? Adobe Reader 8
>>678 画像形式になってる奴だろ。金払って買えってこと。
電子データがなくて 紙スキャンでお茶を濁してるんじゃないのか
JIS X 3010じゃないけど買ったらちゃんとテキストを含んだPDFがダウンロードできた。 でも表の中の文字はアウトライン化されてて検索できないという意味不明ぶり
所詮JIS
そりゃないよ・・・
あくまでも紙の規格票が正式ということになってるから 電子データ版のほうが「高機能」だと困るんだろ。
文字とコードを結びつける表は"字形"で書いてないと駄目なのでは。 それにしてもJIS規格とかには税金を投入して もっと自由に便利に使えるようにして欲しい。
C++ の方は、なぜかテキストが含まれているのに。いるのに。
プロセス間通信、共有メモリ について初学者でも 理解できるページがあればurlを教えて欲しいのです。 実際に動かせるソースファイル例等があればうれしいです。 お勧めの書籍等があればそれも是非お願いします。 forkとかwaitを理解する上で気をつけたほうがいいポイントとかがあったらそれも是非。。 私は、構造体とポインタをやっと理解した程度の初学者です、どうぞよろしくです。
>forkとかwaitを理解する上で気をつけたほうがいいポイントとかがあったらそれも是非。。 forkやwaitはOS固有のシステムコールであって、C言語標準のライブラリ関数ではないということ。 他のスレで聞けば親切に教えてくれる人がいると思うよ。
689さん、レスありがとうございますー^^ 聞くところを間違えたようですね、また改めて他所で聞いてみます。
691 :
デフォルトの名無しさん :2006/12/26(火) 12:53:19
こんなコードかいてますが復元された平文には謎の^@マークが大量に入って
しまいます。どうしていいのかわからないのでどなたか教えてくださいませ。
int main(){
Integer a,b,c,d,e,bb,key,k2,I;
f=fopen("an.cc","rb");
ff=fopen("an.cyp","wb");
fg=fopen("an.txt","wb");
while(feof(f)!=1){
b= fread(s,sizeof(unsigned char),15,f);
if(b<15 && b!=0){ for(i=atoi(Itoa(b));i<15;i++) s[i]=0;}
bb=0;
for(i=14;i>-1;i--) bb=(bb<<8)^s[i];
b= key*bb;
while(1){if((a=random())<key){ break; } }
while(1){ if(bit(d=random())<256){ break;}}
c=(b+a)^d;
I=c;
cout << "c=" << c <<"\n";
for(i=0;i<8;i++){ m[i]=atoi(Itoa((I&atoI("11111111111111111111111111111111",2)))); I=(I
>>32 ); }
fwrite(m,sizeof(unsigned int),16,ff);
e=((c^d)-((c^d)%key))/key;
I=e;
for(i=0;i<16;i++){ k[i]=atoi(Itoa((I&atoI("1111111111111111",2)))); I=(I
>>16 ); }
fwrite(k,sizeof(unsigned short),16,fg);
if(e!=bb) cout << "e=" << e << "\n";
}
fclose(f);
fclose(ff);
}
>>691 > Integer
> Integer
> Integer
> Integer
ほほぅ…
>>691 色々と論外だけど、せめてコンパイル通るようにしてから出直してください。
694 :
デフォルトの名無しさん :2006/12/26(火) 13:31:28
コンパイルは通ってます。長すぎるのでメインの変換部分だけです。 バイナリでデータを読んで、書き出す間に0x00が混じってしまうようです。 どこでそうなるのかがわかりません。数値的には読み込んだ状態と 同じことを確認してから書き込んでいます。読み出しのときにすでに エラーが発生しているのでしょうか?
馬鹿じゃないの?初心者未満は他所行ってくれ。
>for(i=0;i<8;i++){ m[i]=atoi(Itoa((I&atoI("11111111111111111111111111111111",2)))); I=(I
>>32 ); }
~~~~ ~~~~
>>694 そうかもね
そうじゃないかもしれないけど、型が分からないから正確なことは何一ついえないね
憶測だけどどこかアルゴリズム間違ってるか、ビット演算子を勘違いしていないかなと思うよ
気のせいかもしれないけど
(もしかしたら他に原因があるかもしれない)
みたいな感じ
ItoaとかatoIって自作関数?
coutに誰も突っ込みをいれないあたり優しいな
random,Itoa,atoI,bitは自作関数か Integerはtypedefとかされてんのかな ファイルポインタが宣言されてないがグローバル変数とかなのだろうか あとreturnがない
unicode吐いてるんじゃない? とESPしてみる。
701 :
デフォルトの名無しさん :2006/12/26(火) 14:04:29
>>random,Itoa,atoI,bitは自作関数か そうです >>Integerはtypedefとかされてんのかな 昔のC++に付いて来た多倍長整数型です。 読み込みデータに問題はありませんでした。しかし演算の途中で0x00が 混じっていることは確かなようです。
>>701 >そうです
…は?
>昔のC++に付いて来た多倍長整数型です。
…へ?
atoI() の第2引数は strtol() 同様、基数を与えているんだろう、くらいが
俺の超能力の限界。
703 :
デフォルトの名無しさん :2006/12/26(火) 14:21:09
奇跡で解決しました。 ありがとうございました。
昔のC++ではなく、お前使っているC++処理系についてきた、だろ。
705 :
デフォルトの名無しさん :2006/12/26(火) 14:26:44
gccの2.95.3のG++ですけど・・・
706 :
デフォルトの名無しさん :2006/12/26(火) 14:30:52
今は読み込むファイルのサイズに合わせてパディングが発生しない 様にしているんですが、もし発生した場合、復号のときの逆関数で 0の部分を除去しなければならないはずなんですがいい方法が思い つきません。何かいいアイデアがあったらよろしくお願いします。
ここは 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 ですよ
708 :
デフォルトの名無しさん :2006/12/26(火) 14:45:21
どこに質問すればいいですか?
>>708 俺の知っている限り少なくともココ以外で、使っている"Integer"やらatoI()などを知っている環境依存なスレ/掲示板
だろうな
710 :
デフォルトの名無しさん :2006/12/26(火) 15:40:45
パディング解決しました〜。
711 :
デフォルトの名無しさん :2006/12/28(木) 16:47:45
便利かどうかはともかく本家本元。
JIS X 3010 プログラム言語C、ISO/IEC 9899 : 1999(標準C99)の翻訳。
ttp://www.jisc.go.jp JIS検索→規格番号 X3010
713 :
デフォルトの名無しさん :2007/01/06(土) 23:39:16
スレがすたれてるので一つ。 C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
休み中にスレッドが伸びないことは決して悪いことではない。 廃れているではなく眠っている、だよ。 そして俺は質問に答えないね。すまん。
俺は今日も明日も仕事だよ… もう寝る。
>>713 2のn乗の数での乗除算の代用で使うと少しだけ高速だったりする。
それくらいなら今時、コンパイラが最適化するんじゃないか?
>>713 昔はアプリレベルでも、1バイトとか1ワードを、数ビットごとに区切って
情報をもたせるとかやってたんで、そういうのを取りだしたり、セットしたりで
使ってた。
DOSとか、ファンクションコールを直接コールしたりすると、
ビット操作必須だったような記憶が。
BIOSとかも。
今でも、ちょっと低レベルだと、ビット操作は必須だろうけど。
別に低レベルでなくとも複数のオプションをまとめて扱いたいときとかに ビットフラグは便利だべ O_BINARY | O_CREAT みたいな感じで、一引数で渡したり出来る品
>>720 そのビットフラグとやらにおいて、ビットシフトは何か意味があるのですか?
ビットフラグを作る時にビットシフトを使う。 #define BIT(n) (1u << (n)) として、 #define HOGE BIT(0) #define HAGE BIT(1) #define HIGE BIT(2) とか。
#define HOGE 1 #define HAGE 2 #define HIGE 4 でいいだろ。
>>722 の計算はコンパイル時にされて定数になるから、別にどっちでも
分かりやすい方を使えば良い。
>>723 よくない
というか2進リテラルがあればよかったんだけどな、8進でガマンするしかない
できれば
#define HOGE (1)
#define HAGE (HOGE*2)
#define HIGE (HOGE*2)
または
#define HOGE (1)
#define HAGE (HOGE<<1)
#define HIGE (HOGE<<2)
もしくは
#define HOGE (1)
#define HAGE (HOGE<<1)
#define HIGE (HAGE<<1)
漏れなら #define HOGE (1u << 0) #define HAGE (1u << 1) #define HIGE (1u << 2) // HOGE | HAGE にするかな。 或いはenum使って enum HGE_TYPE_BIT {HOGE = (1u << 0), HAGE = (1u << 1), HIGE = (1u << 2)}; // HOGE | HAGE とするかも知れんし、いっそ enum HGE_TYPE_BIT_NO {HOGE, HAGE, HIGE}; #define HGE_BIT(x) (1u << (x)) // HGE_BIT(HOGE) | HGE_BIT(HAGE) とするかも知らん。
8bit 単位のビットシフトの方がよく使うな MAKEWORD マクロとかも、(a << 8) + b だった気がする。
inlineを使うデメリットってなんですか?
>>729 C言語は標準ではinline関数をサポートしていません。以上。
6.7.4 関数指定子 ・・・ 意味規則 inline関数指定子で宣言された関数は,インライン関数(inline function)とする。 この関数指定子は複数回出現してもよいが,1回だけ出現したときと同じ動作とする。 関数をインライン関数にすることは,その関数の呼び出しを可能な限り速くすることを示唆する。 この示唆の効果を持つ程度は,処理系定義とする。 ・・・
外部結合をもつ関数のインライン定義が、静的記憶域期間をもつ変更可能なオブジェクトの定義を含んでいてはならず、内部結合をもつ識別子への参照も含んでいてはならない。
>>729 inline 関数をいじった時に、
その定義を参照している全ての .c ファイルを
コンパイルし直さないといけない。
>>713 のコピペで今でも釣れるってどうよ。
常に新しい人が来てる証拠じゃない、いいことだ 古参しかいないスレなんてすぐ消えるよ
737 :
デフォルトの名無しさん :2007/01/10(水) 20:34:32
ポリュビオアス暗号ってC言語プログラムにするとどんな感じ? 学校の課題にだされて・・・ 詳しいコメントつきで誰かお願い!!
今ググってきた俺が知ったかぶりすると 5x5の二次元配列にa-z(j除く)ぶっこんで あとはexcelの要領で
739 :
デフォルトの名無しさん :2007/01/10(水) 21:19:14
あり! できっかな・・・
エスケープシーケンス「\?」が存在する理由はなんでしょうか?
Trigraphでぐぐれ
理解できないバグで質問です。 for( int i = 0; i < 30; i ++ ){ FILE* fp; char fname[10]; sprintf( fname, "f%d%d", (i/10)%10, i%10 ); fp = fopen( fname, "w" ); fprintf( fp, "a\n" ); fclose( fp ); } のような感じでたくさんファイルを出力したいのですが、 3回目で fopen( fname, "w" ); が終了しないというわけのわからないバグが発生しています。 同じような症状(fopenなどのライブラリの関数が終了しない)に陥り、解決したことがある方 がいらっしゃいましたらどのような場合だったのか教えて頂けないでしょうか。 上の例は動くはずです。
>>743 >のような感じで
大事なところを隠すな。ボケ。
バグの原因を聞くのであれば、
変に省略せずにソースを丸々貼ること。
>>743 みたいな聞き方をしている奴のバグは、大抵
「省略しているところ」にバグがあるから。
>>743 問題が再現する最小のソースを作ってみな。
大方はその途中で原因に気づくだろうが、もしも
わからなければその最小ソースを貼ってみれ。
直接関係ないけど、"f%02d",i%100 くらいは覚えたほうがいい
プリプロセス時に行う##の演算子名称ってなんでしたっけ? [##]でgoogleかけても1件もでてこないです。
トークン連結演算子
749 :
デフォルトの名無しさん :2007/01/11(木) 13:30:26
重回帰分析のプログラムを作ろうとしてるけど なにをしていいのかわからんのです。 誰かプログラム持ってないですか?
>>749 そういうのは「作ろうとしてる」とは言わない。
そしてスレ違い。
丸投げする気満々なら宿題スレに消えろ
y = a0+a1*x1+a2*x2+・・・+an*xn の条件式を用いて誤差を最小にすればいいのだろうけど。。。 手順がわかりませんのです。。。 どこのスレなら教えてくれるだろうか・・・
>>749 とりあえず言語がどうとかプログラミングがどうとかいう以前に問題把握してないんだろう
教授に聞け
逆行列とか理解できればどこにでも転がっている
756 :
デフォルトの名無しさん :2007/01/15(月) 02:04:18
char str[1]みたいに要素数1の配列を使うテクニックがあったと思うんだがどこで見たのか何に使ってたのか思い出せない。教えて
そのテクニックは移植性がないのでスレ違い。 C99ではcase str[]で可変長メンバを表せる。
char str[]の書き間違い
構造体の尻っぺたにくっつけておいて、 mallocするときのサイズに細工して 可変長メンバのように使うんだったかな?
そっちにもちゃんと書いてあるな > ANSI Cではこれは反則。でも大抵の処理系では動く。 > C99では専用の書き方(char s[])があるけど。
762 :
デフォルトの名無しさん :2007/01/15(月) 16:22:30
CでCGIを作ってるのですが、ファイルの排他的制御を行う関数または、アルゴリズムってありますか?
環境依存。使っているコンパイラかなにかのスレで聞くといい。
lockf,、flock、openでO_EXLOCK 等々。
766 :
デフォルトの名無しさん :2007/01/15(月) 19:32:43
win api呼べるなら、mutex使うとか。
winapiならCreateFileの時点でファイルを排他的に開ける。
770 :
デフォルトの名無しさん :2007/01/15(月) 20:18:41
お前は何か勘違いしている
774 :
デフォルトの名無しさん :2007/01/15(月) 21:39:02
解りましたAPI使う方向ではないので試行錯誤します
APIがどういうものかわかってないのか・・・
APIに嫌な思い出でもあったのか。
777 :
デフォルトの名無しさん :2007/01/17(水) 11:12:55
#include <iostream> using namespace std; int main(void) { unsigned char x,y; cout << "2つの値を入力してください。\n"; cin >> x >> y; int a = x + y; int b = x * y; printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b); return 0; } どうすればunsigned charの文字をそのまま整数として吐き出せるんでしょうか?
きやすとするんだ
>>777 言ってもいいかな?言っちゃうよ?
それ C++ だヴォケ。
そもそもマルチだし
今までコンパイルが通ったものが、 ある必要なライブラリを追加したとたんリンクエラーになるという現象が起こったとき、 原因はそのライブラリファイルにあるということでいいんですか?
リンクエラーと一言で言われてもな。 メモリーが足りない場合は君の環境が原因なわけだし。 そして多分スレ違い
>>781 コンパイルが通ることと、リンクが通ることは別です。
そのライブラリが原因かどうかはわかりません。
コンパイルとリンクを区別して(できて)いるのかいないのか、微妙だなぁ。
>ある必要なライブラリを追加したとたんリンクエラーになる
まるでそのライブラリを追加する前はリンクエラーにならなかったかのようだが、んなワケないよなぁ。
>>781 > ある必要なライブラリを追加したとたん
要するに、
「今まではコンパイル(リンクまで?)通った」が
「そのライブラリが必要になった」
ということは
「コードを書き換えた」
んだろ?
んなら、書き換えたコードの問題である可能性が一番高い。
例えば UNIX 系で .a をリンクすると、ライブラリ内部の
オブジェクトファイル単位でリンクされるわけだが
自分の書いたコードと名前が被ってたらエラーになるな。
まあ
>>782 の最初と最後の行に同意。
786 :
デフォルトの名無しさん :2007/01/19(金) 17:42:37
// 省略 include <stdio.h>, <stdlib.h> #define offsetof(type, member) ((unsigned int) &(((type*)0)->member)) #define N 100 typedef struct unko { union { struct { int first; int second; }; int v[0]; }; } Unko; int main() { Unko *u; u = (Unko*) malloc(offsetof(Unko, v) + sizeof(int) * N); u->first = 334; u->second = 666; printf("first=%d, second=%d\n", u->v[0], u->v[1]); return 0; } このコードなんですが、規格上、 &(u->v[0]) == &(u->first)、&(u->v[1]) == &(u->second) になり、 正しく動作することは保障されるでしょうか?ご教示お願いします。
されない。 規格は、構造体や共用体の内部構造について何らの規定もしていない。 最初のメンバの先頭や、後に続く各メンバの隙間につめものがされていて、 きっと同じアドレスを持っているだろうと思っていたメンバが、実は違う場所にあるかもしれない (だいたい、宣言時の配列の大きさを越えたアクセスの結果は未定義である)。 多くの処理系では期待したように動くかもしれない。 しかしその裏づけを規格に求めようとするのは本末転倒だ。 そんな気色の悪いコードを考えている暇があったら、 本当に自分の実現したかった機構が何であり、 それをどうやったら明快なコードで表現できるかを考えるほうが、よほど有意義である。
enum{first,second}; int v[2]; v[first]=334; v[second]=666; printf("first=%d, second=%d\n", v[0], v[1]); すっきり
つーか、そのoffsetofマクロの実装はANSI準拠じゃないぞ。たしか。
Cで入れ子構造体名の省略ってできたっけ?
>>786 たぶんシンボリックにも配列的にも扱える変数のセットがほしいんだろうが、
Cでそれをやりたいなら
>>788 の言うとおり列挙体を使って添字をシンボル化するのが
おそらく最も自然な解になると思う(defineしてもいいが、数が多くなるとつらい)
>>786 とりあえず int v[0] は int v[2] と読み替えて・・・。
構造体の先頭にはパディングが入らないことは規格で定められている。
C99 では 6.7.2.1p13 、 C++2003 では 9.2p17 。というわけで
&(u->v[0]) == &(u->first) は保証されている。
しかし first と second の間にはパディングが入る可能性があるので
&(u->v[1]) == &(u->second) は保証されない。
offsetofを使ってる理由がわからん もしuとvの距離が0でないならそんなもの動くはずがない
まあintの間にパディングが入るってことは普通考えられないけどな。 とにかく。とりあえず動きそうなコードを書いてから 規格に適合するかを気にするんじゃなくて、 規格に適合するようにコードを書け。最初から。
enum{FIRST,SECOND,THIRD, (中略) ,LENGTH}; v[LENGTH]; 俺だったらこうするかも
int v[LENGTH]; だった 寝よう・・・orz
797 :
786 :2007/01/20(土) 08:53:13
皆様、ご丁寧な説明をどうもありがとうございました。
現在、言語処理系をコーディングしているところで、
演算子と関数を同じ構造体で表すとき、u->left、u->rightとアクセス出来ると
非常に直感的だった為、この様な記述をするに至りました。
(関数は引数が可変なので配列として、二項演算子はleft・rightとしてアクセスしたかった、という意味。)
>>788 氏の提案された方法が非常に良いと感じましたので、この方法を取らせていただきます。
本当にありがとうございました。
要するにインタプリタを作ってるってことか? なんで演算と関数を同じ構造体で扱わなきゃならんのかがわからんが
内部的には関数と演算子は区別しないほうが楽ですよ。 OOPLでもなければ。
定数を扱うとき、 #defineとconstのどちらを、みなさんは使っていますか? それぞれの使う、メリット・デメリットがあれば教えてください。 それとも、ただ単に好みの問題?
enum
C++と違い、Cのconst変数はあくまで「代入不可な変数」であって定数ではない よって定数式が必要なところには使えないので単純に#defineに劣る 意味のある数字が必要なときやビットパターンが必要なときは#defineを使え ケースを区別するためのシンボルが必要なとき、 または各シンボルが連続した数値と結びついているときはenumを使え
>797 + sizeof(int) * N なんてやってる理由がわからなかったが、そういうことか 規格準拠で作りたいなら最初からNの配列を作るか素直にポインタにmallocしろ
804 :
デフォルトの名無しさん :2007/01/23(火) 16:34:31
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。 うまくインクルードする方法はないでしょうか?
>>804 いくらなんでも、それはひどすぎじゃ? <20MBほどのインクルードファイル
コンパイラが処理しきれなかった ってことだから、
コンパイラのオプションでなんとかなるかもしれないがわからん
# バイナリイメージを埋め込もうとしたのかねぇ…
# VC6 include 以下全てのファイルで 約30MB だしなぁ…
このスレはマルチにも優しいスレでつね
>>804 Visual C++ならコンパイラオプション/Zm
809 :
デフォルトの名無しさん :2007/01/26(金) 16:42:14
2*(3+(4+5)*6)を計算するときexpression term factorをどういう順番で呼び出して計算されて 最終的な答えになるか説明してくれ
>809 本質的にそれはC言語そのものとは何の関係もない
>>809 マジレスすると、普通のコンパイラーは定数項にしちゃう
813 :
デフォルトの名無しさん :2007/01/26(金) 18:38:02
配列の要素の最初の要素をなくして 2番目の要素を先頭とするにはどうすればいいのでしょうか? 標準ライブラリの機能でそういうのないですか?
813 >MOV ソース、ディステネーション & セグメントレジスタに注意
815 :
デフォルトの名無しさん :2007/01/26(金) 18:45:38
つまりどうすればいいのでしょうか?
新たに配列を作る
ポインタで2番目の要素を指す
>813 memmove(array,array+1,sizeof(array)-sizeof(array[0]));
>>813 まず物事を厳密に表現できるようになれ
話はそれからだ
>>813 本当にそれがやりたいことなら、
>>818 のようにmemmove()を使えば良い。
が、それは高くつく処理だ。
配列の先頭、末尾を示すカーソルを持っておき、配列を環状バッファとして
使う手もあるぞ。その場合は先頭を示すカーソルをずらすだけだ。
こんな質問する奴にリングバッファを使わせようとするなんて、極悪人め!
822 :
デフォルトの名無しさん :2007/01/28(日) 22:18:51
以下は入力文字列を複写するプログラムです。 #include <stdio.h> #include <string.h> int main(void) { char str1[81],str2[81]; printf("文字列の入力\nstr = "); if(fgets(str1,80,stdin)==NULL){ printf("文字列入力のエラーです"); return 1; } if(strlen(str1)>80){ printf("文字数が81文字以上です"); return 1; } strcpy(str2,str1); printf("str1 = %s\n",str1); printf("str2 = %s\n",str2); return 0; } この中に出てくる return 1 ってどういう働きをしているんですか? これが無かったらどうなるのでしょうか? 教えてください。
mainから戻るとその戻り値でexit()したのと同じ効果 > これが無かったらどうなるのでしょうか? バッファオーバフローは未定義動作なのでこのスレ的には何が起きるのか 誰にもわからない
>822 mainのreturn値はプログラムを呼び出したOSに返される。 0は正常終了したことを示し、それ以外の値は別の意味を持つ。 どの値がどんな意味を持っているかはOSによって違う。 OSにプログラムの動作状況を厳密に伝えたいのでなければ、 常に0を返してもいい。 なお、fgets(char *s, size_t size, FILE *stream) は streamからsに最大でsize-1バイトまで読みこむ関数だから (詳しくはfgetsの定義をよく読んで頭に入れること) ヌル文字を入れてちょうど80バイトとなり、strのサイズは80でいい。 また、上で言ったとおりstr1には最大で79バイトしか入らないから、 strlenが81以上の値を返すことはありえない。 よって、この場合 return 1; の行が実行されることはない。 規定以上の文字が入力されたかどうかを調べるには、 str1に取り込まれなかったバイト列がstreamに残っていないかを見ること。
825 :
デフォルトの名無しさん :2007/01/29(月) 04:13:48
C言語では、文字定数はシングルクォーテーションで囲むとありますが、 ダブルクォーテーションが使えないのは何故ですか? 書籍やWebサイトでは、シングルクォーテーションを使うように書いてありますが、 何故そうするべきなのかという記述は見当たりませんでした。
ダブルクォーテーションで囲んだものは その文字列が格納された0終端配列へのポインタと解釈される。
ていうか「文法でそう決まっているから」以外にないだろ
828 :
826 :2007/01/29(月) 05:14:03
>>827 何故そうするべきなのかという質問の意図するところは結局、
それを決めた人間が何故そう決めたのか、その理由を知りたいということなのさ。
その程度がエスパーできずにどうする。
829 :
デフォルトの名無しさん :2007/01/29(月) 05:24:24
>>825 つまり{'A','B','C','D'}という4つの文字定数をダブルクォーテーションを使うと
"ABCD"と一つの文字列で簡単に表現できるわけだ。
更に詳しく言うと
>>826 が書いているが、文字列は最後に自動的に必ず'\0'が付いて
「文字はこれ以上ありませんよ」とコンピューターに教えてあげるようになっている。
だから厳密に言うと{"A","B","C","D","\0"}の5つの文字定数を
"ABCD"と表現しているわけだ。
それで
char a='A';と宣言できても
char a="A";とは宣言できない。
なぜなら後者は実際には{'A','\0'}の2文字あるのだから一文字ですよと
宣言する a とは記述できない。
""を使いたいのならば
char a[]="A";として「これは文字列なんですよ」と宣言しないといけない。
解った?
>>829 どーでもいいが
> {"A","B","C","D","\0"}
{'A','B','C','D','\0'}
だべ。
char *s = "abc";
は、実際には
static const char hidden[] = { 'a', 'b', 'c', '\0' };
char *s = hidden;
のようなものの便利な略記法だと思えばよいのだが、
で、さらに、コンパイラは文字列リテラルをTEXTセグメントに配置したり
同じ文字列をまとめたりするのだが、
……こんなこと言ってもさらに訳がわからなくなるだけだろうなw
831 :
829 :2007/01/29(月) 05:55:57
んなもん、 リテラルと整定数を 見た目で簡単に区別できるようにするためだろ? その程度も想像出来ないなんて、本物のバカ^H^Hゆとり世代としか思えない。
だって、大抵のスクリプト言語ではシングルコーテーションとダブルコーテーションを区別しないじゃないですか。 なんでCでは区別しないといけないんですか?
区別しないといけないから
区別しないのってJavaっぽいやつらだけじゃね?
文字とその集合としての文字列を等しく取り扱うか次第だろうね。 おおよそ、数値とその集合の配列/リストは等しく取り扱わないだけなんだろう。
>>835 ×Java
○Perl, Python
>>832 char a='A';
int i = 100;
の「'A'」や「100」もリテラルですよ。
Cの入門講座みたいなの見ると「Cでは""で括った文字列の事を 文字列リテラルと〜」みたいに、あたかも文字列の事を 「リテラル」っていう専門用語のように表現する事が多いからね。
841 :
デフォルトの名無しさん :2007/01/29(月) 18:42:32
#include <stdio.h> double pai(int n); int main(void) { int b, n; do{ printf("項数n="); scanf("%d", &n); printf("π=%f\n", pai(n)); b=getchar(); }while(b=='Y'); return 0; } 自作のpai関数へ、変数n(項数)の値を送ってπの値を取得し、 その後、1文字入力して、それが'Y'なら処理を繰り返すプログラムを組んでいるのですが、 上のソースのように、getchar()がscanf()より下にあるときは、 getchar()の処理が飛ばされてしまいます。 どこが間違ってるのでしょうか?アドバイス下さい。 環境はbcc5.5+BccDevです。
getchar() の前に rewind(stdin) を入れてやれ
どうでもいいけどpi
>>842 それはダメ。
>>841 scanf()の食い残しが残っているから、scanf()直後に空読みすればいい。
scanf(" %d", &n);
while(isspace(b = getchar())); if(b == 'Y') ...; これでOK?
isspace()って拾った文字がEOFとかでも未定義動作にならないこと 保証されてたっけ?
stdinの場合、人間はナニを入力するかわからんから、 scanfはあまりおすすめしないんだけどね (実際こーゆーややこしい問題が起きるし) ちょっとでも規定と違ったらバッサリエラーにするか、 fgetsでまるごと引き抜いて独自に解釈するのが良い
>841 とりあえず、おかしいと思ったら関連する変数の値をすべて調べてみること。 この場合はnとbに何が取り込まれたかを見ろ。 あとは関数の仕様をしっかりと読めば何が起きたかを類推できる。
isXXXは、EOFは普通に動くはず。 (配列を+1個分用意している実装が普通) が、8bit符号付charで不具合が出る可能性があるはず。 特に日本語化されてないコンパイラ付属のライブラリは怪しい。 規定は知らんが。
> 規定は知らんが。 このスレ的にはそれが一番知りたいんだが…
>>841 scanfは普通、その終了時に、標準入力の最後に付加されている「\n」をストリームに放置する。
これはscanfが、特別な指定のない限りは、変換されなかった入力を棄てずに残すからである。
次にscanfを呼んで、最初の変換指定子が数値用のものであればこの\nは棄てられるが、
%cや%sを指定したり、fgetsやgetc(getchar)を使うとそのまま(しかも即座に)取り込まれて
しまって問題が起きることになる。
一般に言って、標準入力を読むときにscanfを使う場合はscanfだけを使うべきである。
fgetsやgetcを混ぜて使うべきではない。また最初の変換指定子が%cや%sである場合は、
前の入力の\n(正確には「 」と「\t」をも含む空白文字)を読み飛ばすことを明示するために、
" %c" のように書かなければならない。
854 :
853 :2007/01/29(月) 23:40:54
↑訂正。%sの場合は問題ない。%cだけが問題。
855 :
デフォルトの名無しさん :2007/01/29(月) 23:47:27
>>854 >↑訂正。%sの場合は問題ない。%cだけが問題。
いいえ。%cだけではありません。
念のため補足すると scanfはそもそも連続したデータをいっぺんにざばーっと取り込んで 処理をするための関数で、人間と対話的に入出力を繰り返すのには向いてない 理由は>853にあるとおり、余分な入力でも捨てないでストリームに残しておくためだ たとえば>841の「項数n=」のときに「1 hogehoge」と入力したら、 値1がnに読み込まれたあとでも「 hogehoge」はストリームに残っている ここに一体なにが入っているのかを予想する方法はない(人間のやることだから) どうしてもscanfを使いたいなら、というか標準入力を使って対話的に人間と データをやりとりしたいなら、一回一回ストリームを確実に空にする方法を考えること それぐらいは自分でやれ、というか、それができないならどうせ問題が起きる
>>856 %[]もだったな。あと%nはないのと同じ。
> あと%nはないのと同じ 単に役に立たないだけならまだしもFormat bugでバリバリ活躍してくださるな。 でも実装しないと規格適合は名乗れないという
>>859 ないのと同じってのは先頭の指定子としてみなせないって意味だろ
どうしてCの入門書の入出力練習問題ってどいつもこいつもscanfを使うんだろうargcとargvを使うべきだだだだだ ごめん全てのOSで使える保証はなかったね
>>861 たぶんfgetsで読んでstrtokで切り分けて
atoiなりstrtodなりで解釈するのが正しいんだろうが
そのためにはまずポインタの何たるかを教え込まなきゃならんので
手順的にできないのだろう
でもscanfも本当はポインタ理解してないと使いこなせないのだが
規格合致ホスト処理系で使えないことってあるの?
>>862 fgets()からsscanf()なら、そんなにむずかしくないでしょ。
最終的に使いこなせればいいってことだろう でも使いこなすより先に見限る率のが高い気ガス そしてついでに見限られるfscanf/sscanf
つまりgetchar()/putchar()は至高
>863 使えることは使えるだろうけど、所謂コマンドラインOS同様に 実行時引数をスパっと打ちこめるかどうかはわからない (たとえばWindowsの.lnkのプロパティに細工するようなことを しなきゃいけないかもしれない) そうなるとちょっと入力手段としては問題がある
scanf()はつかえんだろう。。。 入力バッファのクリアが、気持ちいい解決方法がない。 ちょっと手間が増えるだけの、fgets()+sscanf()ですっきり解決するから、つかう価値が見出せん。
ワードを数えるプログラムはscanf()で簡単に書ける。 でも行をscanf()で数えるのは厳しいw #include <stdio.h> int main() { int n = 0; while (scanf("%*s") != EOF) ++n; printf("%d words\n", n); return 9; }
まあ>841の件については、 scanf("%s",s); }while(strcmp(s,"Y")==0); のようにするだけでもそれなりだと思うけどね scanfで%cなんか使うもんじゃないよ
C言語で組んだシステムに 形態素解析システム「ChaSen」の機能を組み込むにはどうすればいいでしょうか ユーザの打ち込んだ文章を形態素解析して品詞別に表示させたいのですが・・・ ぐぐってもなかなかよい判例が見つかりませんお願いします
chasenのサンプル、というか、インストールされる実行ファイル?の ソースみるのが一番はやいいと思うのだが。
>>874 どれがソースなのかすらさっぱり分からない状態です
普通にマニュアルに茶筌ライブラリの使用法が載ってる 黙って公式文書を全部読め
っていうかC言語と関係ないだろ
878 :
デフォルトの名無しさん :2007/01/30(火) 05:25:58
c言語をつかってプログラムを組む仕事をしている人は、結局入力にどの関数を好んで使っているの?
gets()に決まってるだろ
マジレスすると、getchar
マジレスすると、fgets()
>879 ダメ。ゼッタイ。 >880 ご苦労様です。 >881 セオリーですな。 >878 DialogBoxですが、何か?
GUI なら、エディットボックスの文字列の長さを予め取得して、 それから malloc して、そこに入れることになるね。
2006年1月1日は日曜日である。月と日を入力すると、この日をもとに曜日を出力するプログラムを作成せよ。月日の入力は「/」で区切ることにする。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 【出力例】 日付を入力してください(MM/DD):12/24 12月24日は日曜日です。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 この問題についてなんですが配列を使うとは思うんですがどのようにすれば配列で○月○日は○曜日と出せれるようなるのかがわかりません どなたかお願いします
C言語と関係ない 宿題スレ逝け
886 :
デフォルトの名無しさん :2007/01/30(火) 17:21:27
質問なのですが画面への表示にタブを \t を使ってではな、 キーボード入力で入れても画面上に表示されますが、 タブの表示に \t があるということは 表示されたとしても処理上はキーボード入力でのは よろしくないと言う事なのでしょうか?
日本語を話せ
>>886 何を心配してるのかよくわからないけど、
タブを処理しないソフトにタブを入力してもきっと無視されるだけでしょう。
()内エスパー補間 質問なのですが画面への表示にタブを \t を使ってではな(く)、 キーボード入力で入れても画面上に表示されますが、 タブの表示(用リテラル)に \t があるということは表示されたとしても 処理上はキーボード入力での(タブのリテラル指示)はよろしくないと言う事なのでしょうか? printf("<タブキー叩いて得られるTABリテラル>"); と printf("\t"); との差はどうよ? ソースを印刷したり、空間が開くことより1文字であることが重要な場合(n個のスペースで代用不可)は 明示的に \t としてるな。
890 :
886 :2007/01/30(火) 17:54:18
887-889
拙い質問の仕方ですみません、
>>889 で補間して下さりありがとうございます。
\tを使わずタブキー入力での場合に
処理上で問題があるかどうか知りたかったのですが申し訳ないです。
untabify...あ。
row*colの2次元配列のa[i][j]を 1次元配列に置き換えたらどうかけるんでしたっけ・・・
>892 例) int a[ROW*COL],i,j; for(i=0;i<ROW;i++){ for(j=0;j<COL;j++){ a[i*COL+j]=0; } }
一次元の配列要素を二次元的に扱う方法はプログラミング工学の問題であって 言語とは関係ないぞ
>>890 処理上問題はないはずだが、それに何かメリットがあるとは到底思えない
素直に\tを使え
忘れるとかそういう問題のレベルの話じゃないな。 要するに、何も理解してないということだ。
899 :
デフォルトの名無しさん :2007/01/30(火) 20:30:43
C言語やろうと思うんだけど、Cの練習ってC++のソフトでもできるか? 教えろ
嫌だ
>>899 マリオやろうと思うんだけど、マリオの練習ってドラクエのハードでもできるか?
教えろ
>>890 以下全部、俺の推測・妄想。
エスケープシーケンスはコンパイル時に処理系により(文字コードにより?)適応したリテラルに置き換えられる。
例えば俺の処理系で"\t"をコンパイルしたら0x09(ASCII・Unicode等のHorizontal Tabulation)に置き換えられた。
でも別の処理系なら別のコードがリテラルとして出るかもわからんし、なまけものの俺は調べるのもめんどい。
対してソース書いてる時に得られたTABコードのリテラルはその時の環境によって違うだろう。
ASCII・うにこーど・EUCのHTは全部0x09ってとこまでは知ってるけど、他の全部の文字コードも同じか
そうかって言われたら俺にはわからんし、調べるのもめんどくさい。つまり得られるリテラルは
ソース書いてる時の環境によって変わる可能性がある。これは再現性の観点から避けたい。
だから俺は普通に"\t"でタブコード出した方がいいんじゃないかと思うよ。
見直したら全然答えになってないし間違ってるかも知れないけど折角書いたから送信。
HTのコードが違うのを前提にするなら、 ほかのa-zA-Zなんかも違う可能性があるわけだが。
>>903 だからこそ'a'と書くのであって、0x61と書いちゃいけないわけだ。
当然、a >= 'a' && a <= 'z'なんてもってのほかだな。
'a'をASCIIでかいて、適切に変換してくれるなら、 '[タブ]'も変換してくれるんじゃないの。
'a' が symbolic な a になる場合があるとしても '\x9' が symbolic な tab になることはまずなさそうだな
ASCII非対応で標準C適合な環境など存在しません
文字を書くのか文字コードを書くのかは色々問題だな > ASCII非対応で標準C適合な環境など存在しません あるよ
ASCII規格はANSI規格の上にのっかってるもんじゃなかったっけ? ANSI準拠ならASCII準拠なのは決まってるんじゃないの?
>910 違う。 Cの概念において、文字は数値と等価である。 これはコンピュータというもの自体においてそうであり、 そしてCがコンピュータを非常に低いレベルで扱える言語だからである。 これはCの規格自身は文字の見かけというものに一切関心を持たないことを意味する。 入力された数値を文字として表示したり、エスケープシーケンスを (そのマシンでの)適切な文字コードに変換するのは、そのマシンのOSや、 ソースを編集するエディタや、そのマシン用のコンパイラであって、Cの規格ではない。 わかりやすい例を出すと、Windowsでの改行コードは 実際には改行と復帰という2バイトのコードからなるが、 fopen()でテキストモードを指定して「\n」を書き込めば それはコンパイラが適切なコードに変換してくれる。
訂正 ×コンパイラが適切なコードに変換してくれる ○コンパイラが適切なコードが書き込まれるようにしてくれる
>>902 >>905 どんな場合であれ、コンパイラは文字リテラルを数値データとして解釈するから、
タブと他の文字とで扱いが違うということはない。
開発環境と実行環境の文字セットが同じならそのまま使用されるし、違うなら適宜変換してくれる。
もしソースコードを別の文字セットの環境で再利用したいという場合でも、
ソースコードをその環境に持ち込む時点で文字コード変換が行われているはずで、
つまりタブもその環境での正しいダブのコードになっている。
>913捕捉 ただし、元のテキストファイル中のタブをスペースに変換して表示したり、 ファイルを保存する際にタブをスペースに変換する機能を持つエディタというものが 実際には存在するし、そういったエディタでついうっかりタブリテラルを含む ソースコードを編集してしまうということは十分考えられる。 この危険性を受容してまで「\t」を使わない積極的な理由は考え付かない。
でもソースに" "←(タブ相当のインデント)って書かれるより "\t"って書かれる方が見やすいよね(´・ω・`)
916 :
デフォルトの名無しさん :2007/02/01(木) 00:08:03
文字定数って、int型なんだね。知らなかった。 sizeof( 'a' ) は4となる(intが4バイトの場合) char型で扱っても何の不都合はないのに、 どうして文字定数はint型なんだろう?
>916 getcのようにchar相当の値を返す関数が、エラーを知らせるために charにない値(EOF)を返して、それを適切に比較できるようにするため
それはgetcの戻りがintであればよくて、何も文字定数全体が intである必要はないと思うのだが。C++ではcharだし。
C の規格で文字コードに対して課してる制限って、 数字の 0 から 9 までが連続してるってことだけだよな? 例えば A 〜 Z が連続である必要性は無いし、 事実 EBCDIC では連続してない。
そもそも汎整数拡張とかいう仕様があるから、 char にしてもあんま意味が無いよね。 C++ だとオーバーロードの呼び分けとかで必要になってくるけど、 C だとそういうのないし。
intで扱っても不都合はないと思う。 どうせリテラルはint境界に従って配置されるだろうし、 式を評価する時点で整数はみんな暗黙にintになるから。
必要とか意味とか不都合がどうであろうと 文字定数は int なのが C の仕様
EBCDICは方言がたくさんあるけど、オリジナルにはa-zが存在しないので 規格を満たせない。
malloc( element_of_char * sizeof(TCHAR) ); のときにメモリを多く喰うくらいの話か。
>>922 意味を考える事は重要だぜ?
それが分かってないようだと、
言語を本当に使いこなす事は出来ない。
文字定数がcharだと、それが式の中で出てくるたびに コンパイラはいちいちintに変換するコードを埋めなきゃならなくなるだろ
>926 文字定数の比較対象はたいていは(const) char* なんだから、話が逆だな。charなら、そのまま比較すればいい。
>>927 汎整数拡張があるからそれでは仕様を満たしていない
もちろんコンパイラが内部的に最適化してcharのまま比較してるかもしれないけど あたかも汎整数拡張されているかのように全く同じ動作を保証する必要はある
>>918 妄想半分になるんでテキトーに聞いてくれるとありがたいが、
たとえばASCIIでなく、「z」が0xffになってるような環境があったとする
この場合、getcが「z」を読んだときに返して来る値は0x000000ffだ
これをすぐcharの変数に落とすならffとなって何の問題もないが、
もしそのまま'z'と比較しようとすると、'z'がcharの0xffだった場合に
intの0xffffffffに変換されてしまって等しくないことになってしまう
これを防ぐにはgetcの戻り値をEOFと比較するためだけに
intの変数に落としてからまたすぐcharの変数に入れるか、
文字定数を含めて一切合切をunsigned charにしなくちゃならない
といった面倒があると思うのだが実際にそんな環境があるかどうかは知らない
ひどい妄想だ。 もしそんな環境があったら、'z'は0x000000ffだということになるが、 それをcharの0xffと比較しようとしたらどっちみち問題が起きる。 文字定数は負数にならないことは保証されてるんじゃなかったっけ?
×文字定数は ○文字定数となることのできる文字は
っていうか単にEOFを文字定数と同じ分類で扱うためじゃないの?
>930 int main(){ int i=getc(stdin); if( i == '\xff' ){ printf("FF:%d\n", i); } } vc6でコンパイル・実行して^Zくわせてみたが、 C/C++ともFF:-1と表示したわけだが。 /Jを付ければ表示はなかった。
>>931 z はともかくとして、文字列の中のある文字を is 系関数に突っ込んだ時に
0x80 以上の場合負数になって落ちる事はよくある話。
>934 '\xff'は(32ビットなら)0xffffffffですが何か? sprintf("%.8x\n",'\xff'); で吐かせてみろ
>929 charとcharの比較で整数拡張は無関係に最適化できるだろ。
>936 ちょ、おま。引数に入れた時点で符号拡張されちゃうだろが。 あと、charが符号付きかどうかは処理系依存だろ。
939 :
936 :2007/02/01(木) 01:43:09
ああごめん.8で見ても意味なかったな sprintf("%d\n",sizeof('\xff')); だ
いずれにせよsizeof('\xff')が4だろうが1だろうが、 getcが文字としてのffを返してきたのかEOFなのか 区別を付けるの面倒具合は変わらない、ということ。
>あと、charが符号付きかどうかは処理系依存だろ。 ソウナノ?(゚д゚)
X3010:2003 6.3.1.1 >…“単なる”char型を符号付きとして扱うか否かは、処理系定義とする。… あと、もしも'z'が0xFFという値を持つなら 6.2.5から >…実行基本文字集合の任意の要素をchar型のオブジェクトに格納した場合、 >その値は非負であることを保証する。… より、charは符号無しであることを強制される。
>>941 他のスレでも話題になってたけど、charがsignedかunsignedかは処理系依存。
しかも大抵の処理系ではコンパイルオプションなどで換えられるようになってたりする。
#逆に言えば、charが常にsignedであることがISOの要求であるなら、
#unsignedにするオプションは非ISO化オプションと言うことになってしまう。
要するに文字定数は負数にならないから符合拡張云々は妄想ということね アホなこと言ってスマンカッタ
で、なんで文字定数はintなんだ?
文字定数全般じゃなくて、ASCIIで表示可能な文字定数は、負にならない。
たぶん>926や>933 C++でcharな理由はたぶん>920
昔考え無しの誰かがintにして、 実害がないからそのまま放ってあるだけでは。
ところで文字列の終端が00であることは保証されてたよね?
>>948 考えなしってことはないだろう
コンピューターってのはワード単位にデータをアクセスするのが普通なんだから、
特段の事情がなかったからintにしたというほうがずっと自然だ
5.2.1 >すべてのビットが0であるバイトをナル文字という…文字列の終わりを >示すためにナル文字を用いる。
>950 じゃあなんで文字列はワード集合にならなかったの?
(アメリカでは)8bitあれば十分なのにメモリがもったいないから
>>926 最適化でどうとでもなることだろう・・・
最適化って言葉の意味わかってんのかなぁ
最適化というのはコンパイラの進化によって得られたものであって Cの規格が最適化しろと定めているわけじゃないぞ 逆に言えば、本当によくできたコンパイラなら、 文字定数がintだろうとcharだろうと charと比較したときの最適化の結果は同じにできるはず
よーするにCでは文字定数がcharでもintでもほとんど差がないから 「自然な整数はint」の法則に従ってintにしたってことだろ。 C++で事情が違うのは既出。
>>952 テキストデータというものが既にそういう仕様だったから。
あと、バイトの連続からなるデータを1バイトずつ処理するのは確かに手間がかかるけど、
文字列全体をまとめて扱うぶんにはワードで(2/4バイトいっぺんに)処理すれば済むから。
960 :
デフォルトの名無しさん :2007/02/01(木) 14:27:46
配列のサイズについて質問なのですが、 char data[100]; があったとして、そこにはサイトのURLなどが入ったりするとします。 たいていのURLは100文字未満なので、 dataにURLを入れた後、残りの長さの部分を切り詰めたい時には どうすればよいでしょうか。
>>960 自分の質問の意味を本当に理解しているか。
長さが100の配列に101個以上のデータを入れてから100個に切り詰めることはできない。
もし101個以上つめこんだらそれはバッファオーバーランであり、その結果何が起きるかは誰にも保証できない。
文字配列の長さギリギリまで文字を詰めるには、strncpyを使うこと。
CFAQ調だがいまいち
963 :
デフォルトの名無しさん :2007/02/01(木) 15:16:42
それはどーにもならないっしょ
訂正 ×strncpy ○strncat
>961の補足 strncpy()は末尾に\0をつけないことがあるので現在では好まれない strncat()で文字列を他の文字列(たとえばsrcとする)から所定の長さまでコピーするには、 data[0] = '\0'; strncat(data, src, 99); /* 100文字目は\0だから */ のようにする ファイルや標準入力から文字列を直接読む場合には、fgets()を使うこと ただし、たいてい末尾に\nがくっついていることを忘れないように なお、gets()は 絶 対 に 使ってはいけない
966 :
デフォルトの名無しさん :2007/02/01(木) 16:51:06
俺、独学で勉強してて書籍とかでgets()は非推奨的なのをすぐ知って、もう今では 使い方すら忘れてる(fgets()をよく使います)。 学校に行って勉強している(うらやましい)環境の人でも、講師からgets()を使ってどうのこうのって 教えられるの? 電気学科卒で学校で教えられたのはFORTRANだけだったけど、情報学科ってどんなんなんだろ。 情報系いっとけばよかったかな〜・・・ 以上、独り言。
967 :
デフォルトの名無しさん :2007/02/01(木) 16:55:12
>>965 通りすがりですが
data[100]の領域をとっていて30しか使わなかったら70余るから
どうにかしたいってことだからなんかちがうような
mallocoで確保して足りなくなったらreallocで再確保すればいいんじゃねぇの?
静的に確保したあとにreallocなんて使えるの?
969 :
デフォルトの名無しさん :2007/02/01(木) 17:05:35
動的確保すればいいじゃん
970 :
961 :2007/02/01(木) 17:24:59
静的に宣言した配列の長さを切り詰めたい、という発想はまったく思いもよりませんでした。
不明をお詫び致します。
>>960 どうしても配列を切り詰めなければならない理由が本当にあるのか。
もし高々数十バイトのメモリすら節約しなければならないとしたら、
そんな環境でそもそも100バイト近いURLを扱うことができるのか。
どんなものでも節約できるなら節約したほうがいいことは確かだが、
瑣末な「効率化」に目を奪われてもっと大事なことを忘れてはいけない。
どうしても必要なぶんだけのメモリを使いたいなら、静的な配列ではなくポインタを用意して、
そこにmallocで領域を割付け、必要ならreallocでサイズを変更し、使い終わったらfreeで解放すること。
971 :
916 :2007/02/01(木) 23:01:16
文字定数がintの件、こんなにレスついてどうもです。 で、なんで疑問に思ったかというと 「明解C言語入門編」で、文字を1文字として扱う部分では すべてint型で扱うようになっていて、いままでcharだと ばかり思ってたんで、ショックを受けたんです。 文字列として扱う場合はcharとかchar*が使われてるから 違和感無いんですが。 getchar()もcharを返すと勘違いしてたし・・・ C&Rからそうだったんでしょうか・・・
次スレ立ててく
はえーよ
どうせ文字定数をchar型にしようとしても、汎整数昇格がある限り、結局見た目にはint型であるように振舞うことになると思う。
いや、そのりくつはおかしい
計算を伴わないchar型同士の比較に関して、整数拡張の出る幕無いだろ?
>978 >957
>>978 規格は、オペランドの型拡張は「計算を正確に行えるもの」のうち「もっとも計算しやすい型」になると規定している。
charの値を正確に扱える型のうち、最も計算しやすい型はintである。よってchar同士の演算は、規格上は必ずintで行われる。
コンパイラが最適化を行わないなら、Cの規格に従って常にintへの変換が行われる。
コンパイラが最適化を行うなら、(コンパイラが賢ければ)文字定数がcharでもintでも同じコードが生成される。
結論として、charでなければならない積極的な理由は存在しない。
ならば値が整数である以上、整数を扱うのに最も自然なサイズであるintを使うのはごく妥当である。
規格書見たが、 >The integer promotions are applied only: as part of the usual arithmetic conversions, >to certain argument expressions, to the operands of the unary +, -, and ~ operators, >and to both operands of the shift operators, as specified by their respective subclauses. とあるから、やっぱりchar_var1==char_var2のときは適用されないんじゃないの?
あ、あほなこと言ってもた。
はい
はいじゃないが
>978 比較は実際には引き算です それと規格上intで表現できる整数は全部intになります あなたがコンパイラに何を期待しようと勝手ですが、 文字定数がcharであるべきだと主張するのは滑稽です
>>985 あなたがコンパイラに何を期待しようと勝手ですが、
比較は実際には引き算だと主張するのは滑稽です
987 :
デフォルトの名無しさん :2007/02/02(金) 08:12:58
>>986 あなたが俺に何を期待しようと勝手ですが、
セックスは実際には足し算だと主張するのは滑稽です
そーいやアセンブリ言語で比較は結果を格納しない減算命令を用いてやってたっけ。 で、Zフラグが立ったらとか立たなかったらで条件ジャンプ命令でジャンプと。 マシン語に憧れた子供時代でした、はい。
989 :
デフォルトの名無しさん :2007/02/02(金) 09:32:02
文字定数をintで扱う? ソース読みにくくするだけじゃん
function utf16to8(str) { var out, i, len, c; out = ""; len = str.length; for(i = 0; i < len; i++) { c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { out += str.charAt(i); } else if (c > 0x07FF) { out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)); out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)); out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); } else { out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)); out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)); } } return out; }
文字定数の主たる演算対象がcharだと考える事自体偏見
993 :
デフォルトの名無しさん :2007/02/02(金) 23:30:36
埋め
^
埋め
umeume
int main(void) {
//
>>997 上手いな…ム板住民の性質をよく見抜いた、
// 埋めカキコを促す良い方法だ。
printf("埋め\n");
/* 梅
1000 :
デフォルトの名無しさん :2007/02/03(土) 20:33:57
*/ return -0721; }
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。