【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/09/30(土) 19:56:29まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け! Part 129
http://pc8.2ch.net/test/read.cgi/tech/1156661024/
GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0002デフォルトの名無しさん
2006/09/30(土) 19:56:44< | > 俺はグラットン持ちの通りすがりのナイトであって
|.|.| 2getしたがどうやってブロントって証拠だよ!!
|.|.|
|.|.|
< | > おいィ?お前それで良>>1のか?
...| | |. 仏の顔を>>3度までという名セリフを知らないのかよ
...| | |. 暗黒が持つと逆に頭がおかしくなって>>4ぬ
...| | |. グラットンす>>5いですね
.< .| .> >>6駄にaguるなネットポリスに捕まりたいのか?
/(.._..|..|..|.._..)ヽ それほどでも>>7い
>.─<>─.< このままでは俺の寿命がストレスでマッ>>8なんだが・・
ヾ ̄ヾ .√ ")' >>9枚で良い
.| .| 俺の怒りが有頂>>10になった
.| .|
.| .| おれパンチングマシンで>>100とか普通に出すし
) (
.▽
0003デフォルトの名無しさん
2006/09/30(土) 20:04:250004デフォルトの名無しさん
2006/09/30(土) 21:40:46ISO/ANSI/JIS乙
0005デフォルトの名無しさん
2006/09/30(土) 21:42:110006デフォルトの名無しさん
2006/09/30(土) 21:42:42全ての疑問に答えます。
0007デフォルトの名無しさん
2006/09/30(土) 21:44:19HTML 4.01+CSS 2.1を完全実装したブラウザは存在しませんが
Web板のstrictスレはちゃんと回ってます。
0008デフォルトの名無しさん
2006/09/30(土) 22:01:43モヒカンが出たぞー!
0009デフォルトの名無しさん
2006/09/30(土) 22:23:020010デフォルトの名無しさん
2006/09/30(土) 23:20:110011デフォルトの名無しさん
2006/09/30(土) 23:37:26SP1が待ち遠しいぜ。
0012デフォルトの名無しさん
2006/09/30(土) 23:47:06少しだけ嬉しいかな。
0013デフォルトの名無しさん
2006/09/30(土) 23:52:14俺はC言語全くの初心者です。
勉強しようと思って本は買いました。
ついでに何かソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・
何かお薦めのソフトはありますか?
教えて君で申し訳ないのですが。。。教えてください。
0014(^-^) ◆MONSOON/qo
2006/09/30(土) 23:55:09BCC developer (ボーランドc++5.51)がおすすめ
0015デフォルトの名無しさん
2006/09/30(土) 23:56:08>>13
このスレは初心者や教えて君はお断りだ。もっと適切なスレがある。そっち行って。
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
http://pc8.2ch.net/test/read.cgi/tech/1153818463/
0017デフォルトの名無しさん
2006/10/01(日) 00:14:03死ね。ぴかぁ〜
0018デフォルトの名無しさん
2006/10/01(日) 18:56:070019デフォルトの名無しさん
2006/10/01(日) 19:10:410020デフォルトの名無しさん
2006/10/02(月) 06:57:03誘導してやったのは結構なことだが
一言多いとガキっぽく見えるぞ
0021デフォルトの名無しさん
2006/10/02(月) 08:09:16実年齢はどうあれ、精神年齢が低いことは間違いないという事だな。
0022デフォルトの名無しさん
2006/10/02(月) 09:11:18そんなどうでもいいことを言わずにいられないあなたも、精神年齢が低いということですね。
0023デフォルトの名無しさん
2006/10/02(月) 14:27:410024デフォルトの名無しさん
2006/10/02(月) 16:15:090025デフォルトの名無しさん
2006/10/02(月) 19:45:100026デフォルトの名無しさん
2006/10/02(月) 20:14:06..|| __ || |WC|
..|| | | ||  ̄ ̄
__ _ ∧_∧ ||.  ̄ ̄ ||
――― (゚Д゚ ) .||. ◎||
⌒ヽ  ̄ ̄ ̄ / つ _つ||. ..||
人, ’ ’, 人 Y ||. |三三| ...||
Y⌒ヽ)⌒ヽ、 )し'(_) ||______ ||
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
0027デフォルトの名無しさん
2006/10/02(月) 21:28:160028デフォルトの名無しさん
2006/10/03(火) 17:06:010029デフォルトの名無しさん
2006/10/03(火) 22:35:45ハ_ハ
('(゚∀゚∩
ヽ 〈
ヽヽ_)
0030デフォルトの名無しさん
2006/10/06(金) 22:34:410031至福
2006/10/07(土) 10:05:45C言語で素数列挙プログラムをつくっているのですが
高速にするためには剰余計算を
足し算(もしくは引き算)で行うようにするといいと言われました
いったいどのようなアルゴリズムで剰余計算を加算(or減算)で
おこなえるのでしょうか?
0032デフォルトの名無しさん
2006/10/07(土) 10:20:12そこから抜けてきた時点でのnが余りってことだろ
0033デフォルトの名無しさん
2006/10/07(土) 10:32:02そんな単純だと遅いよな
0034デフォルトの名無しさん
2006/10/07(土) 10:48:37C で書いたアルゴリズムを動作合成とか言うならそれなりの話がありそうだが
0035デフォルトの名無しさん
2006/10/07(土) 11:00:48その整数型には次の演算が行えるなら
・加減算
・乗算
・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
これでもかなり遅いがなぁ…加減算でやったら死ぬと思うが
0036デフォルトの名無しさん
2006/10/07(土) 11:07:440037デフォルトの名無しさん
2006/10/07(土) 11:08:07C でおk
0038デフォルトの名無しさん
2006/10/07(土) 14:11:10また続けられるようにするのは、可能でしょうか?
エンターの入力以外は、終了させたいです。
0039デフォルトの名無しさん
2006/10/07(土) 14:31:360040デフォルトの名無しさん
2006/10/07(土) 14:40:03ありがとうございます。 でも、言葉足らずでした。
できれば、その方法も教えて頂きたいのです。
0041デフォルトの名無しさん
2006/10/07(土) 14:42:34そこまでは忠言できない、情報が少なすぎる
0042デフォルトの名無しさん
2006/10/07(土) 14:51:27えーと、ごめんなさい。 どう言えばいいかもわかりません。
もうちょっと自分で調べてからまた来ます。
0043デフォルトの名無しさん
2006/10/07(土) 14:57:260044デフォルトの名無しさん
2006/10/07(土) 15:08:42機種依存のやり方を取らざるを得ないから、機種依存OKスレへ。
while (1) {
do 〜 while ();
//キーボード入力
if (リターンキーだったら) break;
}
でできるけど、キーボード入力の部分が機種依存になる。
かならずリターンキーを押すのなら
char buf[4];
fgets(buf, sizeof buf, stdin);
if (buf[0] == '\n') break;
みたいなかんじでいけるけど。
0045デフォルトの名無しさん
2006/10/07(土) 15:40:29ADPCMに変換したいので参考になるところオシエテ
0046デフォルトの名無しさん
2006/10/07(土) 18:53:28, イ)ィ -─ ──- 、ミヽ
ノ /,.-‐'"´ `ヾj ii / Λ
,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{
ノ/,/ミ三ニヲ´ ゙、ノi!
{V /ミ三二,イ , -─ Yソ
レ'/三二彡イ .:ィこラ ;:こラ j{
V;;;::. ;ヲヾ!V ー '′ i ー ' ソ
Vニミ( 入 、 r j ,′ ___________
ヾミ、`ゝ ` ー--‐'ゞニ<‐-イ /
ヽ ヽ -''ニニ‐ / < つーか、スレ違いだろハゲ
| `、 ⌒ ,/ \___________
| > ---- r‐'´
ヽ_ |
ヽ _ _ 」
ググレカス [ gugurecus ]
(西暦一世紀前半〜没年不明)
0047デフォルトの名無しさん
2006/10/07(土) 18:59:140048至福
2006/10/07(土) 22:33:20剰余計算はあまり速くならないみたいですね
Rabin法を用いた素数の
高速判定アルゴリズムってのがあるそうなんですが
C言語だとどうやって書けばいいでしょうか?
0049デフォルトの名無しさん
2006/10/07(土) 22:51:53素直に書けばいい
0050デフォルトの名無しさん
2006/10/07(土) 23:01:26思うがままに書けばいい
書くことは do に過ぎない
see すなわち実測を怠るなかれ
0051デフォルトの名無しさん
2006/10/10(火) 12:16:39ビットシフトはなんの役に立つのでしょうか?
0052デフォルトの名無しさん
2006/10/10(火) 12:18:29ビットフラグの操作。
0053デフォルトの名無しさん
2006/10/10(火) 12:52:28昔インテルがp5-90でしくじったやり方
0054デフォルトの名無しさん
2006/10/10(火) 15:20:33まだやってんのか阿呆。
0055デフォルトの名無しさん
2006/10/10(火) 17:22:300056デフォルトの名無しさん
2006/10/12(木) 13:06:120057デフォルトの名無しさん
2006/10/12(木) 13:10:59ポインタなら返せる
005856
2006/10/12(木) 13:43:17char * f(void) {
char buf[80];
fgets(buf, 80, stdin);
return buf;
}
int main(void) {
char * a;
a = f();
printf("%s\n", a);
}
0059デフォルトの名無しさん
2006/10/12(木) 13:50:53そのポインタがローカル変数を指している場合
関数を抜けた時点で無効になる
0060デフォルトの名無しさん
2006/10/12(木) 13:52:49引数で渡されたバッファ(?)の内容を書き換える
006156
2006/10/12(木) 13:56:16char * 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;
}
0062デフォルトの名無しさん
2006/10/12(木) 14:38:42>>60 のいうこと聞いて書き直せ!
006356
2006/10/12(木) 15:03:08void f(char *buf) {
fgets(buf, 80, stdin);
}
int main() {
char buf[80];
f(buf);
printf("%s\n", buf);
return 0;
}
006456
2006/10/12(木) 15:08:03int main() {
char buf[80];
printf("%s\n", fgets(buf, 80, stdin));
return 0;
0065デフォルトの名無しさん
2006/10/12(木) 15:10:37それから stdin ていうのも引数で受けるのが普通だ。
それから戻り値も成功時は buf をそのまま(ry
0066デフォルトの名無しさん
2006/10/12(木) 15:12:46いきなり ^Z とか ^D とかよ、落ちるようなうろぐらむは書くんじゃねえよ
0067デフォルトの名無しさん
2006/10/12(木) 15:13:11結局 fsets そのままじゃん とお約束
0068デフォルトの名無しさん
2006/10/12(木) 15:25:470069デフォルトの名無しさん
2006/10/12(木) 18:35:120070デフォルトの名無しさん
2006/10/12(木) 19:00:44( ゚Д゚)構造体か?
>データ構造って何ですか?
(;゚Д゚)…え?
0071デフォルトの名無しさん
2006/10/12(木) 20:22:280072デフォルトの名無しさん
2006/10/12(木) 21:54:360073デフォルトの名無しさん
2006/10/12(木) 23:40:18int main(void);
int main() {
printf(">>67 fsets って何やねん\n");
main();
return 0;
}
0074デフォルトの名無しさん
2006/10/13(金) 04:37:38が1000を超えてしまったので、こちらで質問させて頂きます
皆さん、ありがとうございます。
>>997
では、最後に行がなくてもカウントしてもいいのですね
では>>993で述べた、
>>何故、自分の環境だとtotatに(つまり改行文字の数に)1足さなければならないのでしょうか?
で、何故自分の環境だと1を足さなければならないのかが
他の参考書などを調べましたが解決しません・・・・
理由は改行文字で終わってないなら 1を足さなければならないからですかね?
要するの最後の行はとにかくEOFでも数えると覚えればいいみたいですね。
0075デフォルトの名無しさん
2006/10/13(金) 04:41:43有効バイト数が分からないファイルシステムを使っている時、EOFで
ファイルの終わりを判別するという、今考えるととんでもない事をしていた。
0076デフォルトの名無しさん
2006/10/13(金) 04:45:34結果的には数えるのでしょうか?
0077デフォルトの名無しさん
2006/10/13(金) 04:47:020078デフォルトの名無しさん
2006/10/13(金) 04:59:24筋が分岐しているみたいだから一応次スレを立てておいた。
話の続きはそっちでヨロ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
0079デフォルトの名無しさん
2006/10/13(金) 05:08:49すみません
0080デフォルトの名無しさん
2006/10/13(金) 05:28:35ch=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バイト読み込みの方法ですが、両者はどう違うのでしょうか?
0081デフォルトの名無しさん
2006/10/13(金) 05:33:03挙動が異なる事がある。
0082デフォルトの名無しさん
2006/10/13(金) 06:07:260083デフォルトの名無しさん
2006/10/13(金) 06:12:060084デフォルトの名無しさん
2006/10/13(金) 06:50:490085デフォルトの名無しさん
2006/10/13(金) 07:18:390086デフォルトの名無しさん
2006/10/13(金) 12:12:26どちらでオープンしようとも、1バイト読み込んだ内容についてはどちらも同じ。
仮にテキストモードで"\r\n"⇒'\n'の変換が行われるならば、fgetc()でもfread()でも行われる。
0087デフォルトの名無しさん
2006/10/13(金) 15:21:31分かりやすくお願いします..
0088デフォルトの名無しさん
2006/10/13(金) 15:29:150089デフォルトの名無しさん
2006/10/13(金) 15:52:570090デフォルトの名無しさん
2006/10/13(金) 15:59:420091デフォルトの名無しさん
2006/10/13(金) 17:08:13分かりやすくお願いします。。。。
0092デフォルトの名無しさん
2006/10/13(金) 17:10:19鼬害。
0093デフォルトの名無しさん
2006/10/13(金) 21:29:52>>88
コンパイラを使う。
そんなことをしてもほとんどの場合役に立たないけど。
手段を聞くのではなく、目的を示したほうがいいと思う。
0094デフォルトの名無しさん
2006/10/13(金) 21:32:01一行目は無視して。
0095デフォルトの名無しさん
2006/10/13(金) 23:06:11スレ違いは誘導しましょう。
例えばあんたはこっち。
http://pc8.2ch.net/test/read.cgi/tech/1158275665/
0096デフォルトの名無しさん
2006/10/15(日) 01:35:30と言ったエラーが出て困りました。
ググッて調べてみましたが、いまいち解決策が
みつかりません。
宜しくお願いします。
0097デフォルトの名無しさん
2006/10/15(日) 01:37:400098デフォルトの名無しさん
2006/10/15(日) 01:44:13と表示された時の一般的な対処方法ご存知ないですか?
・・・ということでしたorz。
0099デフォルトの名無しさん
2006/10/15(日) 01:47:51http://pc8.2ch.net/test/read.cgi/tech/1160682950/35-
0100デフォルトの名無しさん
2006/10/15(日) 01:50:15>>90
0101デフォルトの名無しさん
2006/10/15(日) 11:50:21同じオブジェクトのコピー(クローン)になるのでしょうか。
上のような構造体のビット・コピーは、CとC++でも挙動は同
じ(互いの構造体メンバー間の同一性は保障される)になるのでしょうか?
もしかしmemmoveは環境依存なの?
0102デフォルトの名無しさん
2006/10/15(日) 11:54:51* なんか、低脳な質問が増えてきてるな
*/
0103構造体の代入ができないと信じるOldTimerは多いよね
2006/10/15(日) 12:06:25memmove()はC99にある。しかし、同じオブジェクトのコピーならmemcpy()だろうとmemmove()だろうと使うのは馬鹿。
また、C++についてはスレ違いにつき割愛。
0104デフォルトの名無しさん
2006/10/15(日) 12:15:42もしかしてmemmove/memcpyの仕様は環境依存なの?
の誤植でした。
0105デフォルトの名無しさん
2006/10/15(日) 12:23:360106デフォルトの名無しさん
2006/10/15(日) 12:36:470107デフォルトの名無しさん
2006/10/15(日) 12:54:28達人はダフのデバイスを使う
0108デフォルトの名無しさん
2006/10/15(日) 13:14:22構造体のコピーをmemcpy()で行なう癖のついた阿呆が
C++でも同じことをやってどつぼにはまった例は何度も見た。
0109デフォルトの名無しさん
2006/10/15(日) 13:35:57Windowsでそのファイルを実行すると正しく動作しないんですけど
なぜですか?
0110デフォルトの名無しさん
2006/10/15(日) 13:39:430111デフォルトの名無しさん
2006/10/15(日) 13:45:03代入演算子を宣言しているクラスがあるだけでもマズイ。
0112デフォルトの名無しさん
2006/10/15(日) 13:59:04達人はインラインで rep movsb を使う
0113デフォルトの名無しさん
2006/10/15(日) 14:16:310114デフォルトの名無しさん
2006/10/15(日) 14:47:45ダメだとは言わないが、癖になると C++ で嵌る。
string.h のインクルードが必要になるし、
構造体がレジスタに収まる場合などで
最適化の機会が減ってしまうかもしれない。
逆に、代入に比べて何のメリットがある?
0115デフォルトの名無しさん
2006/10/15(日) 15:13:33といっても、レジスタなどと環境依存を出してくる人には、
メリットをいくらいっても無駄だろう。
0116デフォルトの名無しさん
2006/10/15(日) 15:18:53正しくコピー出来る保障があるかないかという観点でも、
代入のほうが有利じゃないか?
0117デフォルトの名無しさん
2006/10/15(日) 15:24:49時(structをオブジェクトでなくて値として使っている)でも何か問題が起こるのか?
ていうか、具体的にどうダメなのか分からないから適当に言ってるんだろうな。
0118デフォルトの名無しさん
2006/10/15(日) 15:30:140119デフォルトの名無しさん
2006/10/15(日) 15:37:410120デフォルトの名無しさん
2006/10/15(日) 15:40:220121デフォルトの名無しさん
2006/10/15(日) 15:55:22というのが問いだとしたら、答えはYes、ではダメなのかな。
0122デフォルトの名無しさん
2006/10/15(日) 16:00:10C++では、構造体・クラスはPODならmemcpyでコピーしても問題ないと規定されている。
0123デフォルトの名無しさん
2006/10/15(日) 16:20:500124デフォルトの名無しさん
2006/10/15(日) 16:35:000125デフォルトの名無しさん
2006/10/15(日) 16:50:090126デフォルトの名無しさん
2006/10/15(日) 16:57:22誰か規格に詳しい人、何ページに書いてあるのか教えてくれ
0127デフォルトの名無しさん
2006/10/15(日) 17:00:28C++だと面倒が多いのは分かった。というか普通はやらない。
構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。
何に使うかはまだ考えてないけど、
例えば構造体も配列もプリミティブも結局同じってことかな。
0128デフォルトの名無しさん
2006/10/15(日) 17:02:420129デフォルトの名無しさん
2006/10/15(日) 17:08:250130デフォルトの名無しさん
2006/10/15(日) 17:17:24vtblとかオーバーライドとか、演算子オーバーロード規則とかどうなっちゃうんだよ。
俺は怖くてやらないけど。
0131デフォルトの名無しさん
2006/10/15(日) 17:20:060132デフォルトの名無しさん
2006/10/15(日) 18:21:500133デフォルトの名無しさん
2006/10/15(日) 18:29:15X 3014:2003では9. クラスの4節。次を満たす集成体クラスと書いてある。
参照型である非静的データメンバ
利用者定義のコピー代入演算子
利用者定義のデストラクタ
集成体は、ようするに= {hoge, foo}の書式で初期化できるもの。
8.5.1で次のいずれも持たない配列又はクラスと規定されている。
利用者宣言のコンストラクタ
非公開又は限定公開の非静的データメンバ
基底クラス
仮想関数
0134デフォルトの名無しさん
2006/10/15(日) 18:32:520135デフォルトの名無しさん
2006/10/15(日) 18:52:000136デフォルトの名無しさん
2006/10/15(日) 18:55:200137デフォルトの名無しさん
2006/10/15(日) 18:59:33数個の命令で済めばそれで、ダメなら memcpy() 相当の
汎用コードを呼び出す。実際に実装するわけじゃないが、
これぐらいの動作は期待してもいいだろう。
0138デフォルトの名無しさん
2006/10/15(日) 22:24:55> 構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。
K&R第1版の時代はそもそも構造体の代入ができなかったんだから当然。
memcpyやmemmoveを使いたがるのはそのころの名残だろ。
0139デフォルトの名無しさん
2006/10/15(日) 22:41:080140デフォルトの名無しさん
2006/10/16(月) 14:16:07使って問題ないってことだ。誰も勧めたり確証しないから曖昧になってるがな。
0141デフォルトの名無しさん
2006/10/16(月) 20:56:01コードのその他の部分ももちろんK&R1準拠なんだろうな?
つーか標準ライブラリ使えるの?
0142デフォルトの名無しさん
2006/10/17(火) 00:52:54memcpyで正しく複製できるかどうかの話だ。
0143デフォルトの名無しさん
2006/10/17(火) 01:01:490144デフォルトの名無しさん
2006/10/17(火) 01:11:440145デフォルトの名無しさん
2006/10/17(火) 02:29:30UNIXのプログラムでgccが使えると仮定してないやつはプロトタイプ宣言すら使ってないな。
つーかmemcpyが使える保証すらないからbcopy使ってたり
0146デフォルトの名無しさん
2006/10/17(火) 02:31:24構造体の代入やmemcpyの話題はまだスレタイに沿ってるが
K&R1の話はスレ違いだろ
0147デフォルトの名無しさん
2006/10/17(火) 02:43:53void 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() の処理がおかしな動作になってしまいます。
このような場合どんなことが原因として挙げられるのでしょうか?
0148デフォルトの名無しさん
2006/10/17(火) 03:00:010149デフォルトの名無しさん
2006/10/17(火) 07:13:30K&R1準拠のために構造体の代入を封印する
準拠のためってどういうこと?
K&R1に「構造体の代入規定」が無いのに、無い規定を封印することはできないだろ。
ところで、お前のコードは読みにくそうだな。
0150デフォルトの名無しさん
2006/10/17(火) 08:45:500151デフォルトの名無しさん
2006/10/17(火) 09:47:22規定が無い=仕様にない=使えない
ハイハイ、K&Rの話は終了
0152デフォルトの名無しさん
2006/10/17(火) 11:48:35なんか可愛いぞお前。
0153147
2006/10/17(火) 15:13:51レスありがとうございます。
境界を越えて書き込んでいる、ということは、
確保したメモリ領域を超えてアクセスしている、
ということでいいのでしょうか?
メモリを大量に確保して動かしてみましたが変化が無かったです。
VC++でコンパイルしているのですが、
Release だとある程度正常に動き、
Debug だと全く見当違いな動作をしたりと、
何だか怪しさ爆発です…
0154デフォルトの名無しさん
2006/10/17(火) 15:17:45そのまま悩み続けてろww
0155デフォルトの名無しさん
2006/10/17(火) 16:42:29そのfunc()にバグがあるとして、
ローカル変数版はそのバグを偶然巧く回避できて、
ヒープ版もReleaseビルドならなんとか回避できているのだろう。
Debugビルドはそういうバグにぶち当たるようにごみデータを詰め込むようになっているので、
「正しく異常動作」しているのだろう。
0156デフォルトの名無しさん
2006/10/17(火) 20:03:27おかしくなっても一向に問題なし
0157デフォルトの名無しさん
2006/10/17(火) 22:18:58ReleaseビルドとDebugビルドで動作が違う
ローカル変数を使ったときと、ヒープを使ったときで動作が違う
まず考えられるのは、初期化していない変数を参照している可能性
コンパイル時のチェックを一番シビアな設定にして、エラーはもちろんワーニング
をすべて取り除く
0158デフォルトの名無しさん
2006/10/17(火) 23:18:42現物が手元にないので確認できないが
K&R1 にも構造体代入についての言及はあったように記憶している
確か、将来の C では可能になるやも知れんとか言っていたような・・・
0159147
2006/10/18(水) 00:43:51レスありがとうございます。
>>157さんの指摘がまさにビンゴでした。
ローカル変数を全てチェックしたみたら初期化していない変数がありました。
複数人の手で書かれているコードで、尚且つかなりカオスしてたので大変助かりました。
みなさんどうもありがとうございます、スレ汚しすみません。
0160デフォルトの名無しさん
2006/10/18(水) 00:48:04入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2
↑の答えお願いしますm(_ _)m
0161デフォルトの名無しさん
2006/10/18(水) 00:55:14C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/l50
0162デフォルトの名無しさん
2006/10/18(水) 18:58:53うちの大学にはこういうのがうじゃうじゃいるよ、
教科書も読まないでプログラミング受けに来る奴。
フランス語知らない奴が、いきなりフランス語は喋らないだろ?
マックとかケンタッキーだとかあんな高カロリーなものばっか食ってるからだいたい,,,,,,ブツブツ
0163デフォルトの名無しさん
2006/10/18(水) 19:35:56理解するだけでも感じるだけでもいけない。
どちらから入るかは性格による。
マの大半は感じることから入ったクチではないかな。
だから理解することに関して後ろめたさがあり、
それが教科書至上主義を助長していると思ってみたりしようじゃないかw
0164デフォルトの名無しさん
2006/10/18(水) 20:40:13float 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を使わずに正規化するにはどうすればいいのでしょうか?
どうしても速度が気になります。
0165デフォルトの名無しさん
2006/10/18(水) 20:42:250166デフォルトの名無しさん
2006/10/18(水) 20:58:310167デフォルトの名無しさん
2006/10/18(水) 20:59:450168デフォルトの名無しさん
2006/10/18(水) 21:20:57自前で開平する効率のいいマクロ関数でも実装する
0169デフォルトの名無しさん
2006/10/18(水) 21:22:120170デフォルトの名無しさん
2006/10/18(水) 21:25:15計算アルゴリズム【�U】
http://pc8.2ch.net/test/read.cgi/tech/1129376543/
0171デフォルトの名無しさん
2006/10/18(水) 21:33:37知らないことを学びに来た奴がそれを学べないプアな教育機関を選んでしまった気の毒な奴だよ
予習が全てなんて恥知らずな公言をする穀潰し教師が横行できてしまう少子化社会だからな
0172デフォルトの名無しさん
2006/10/18(水) 21:56:44予習がすべて、なんて教師は論外だけど、
講義の時間中しか勉強しない、課題は自力でやらない、なんて学生も論外だろう。
そんな学生のペースに合わせて講義なんかされたら、知りたいことを学びに来た学生が気の毒だ。
0173デフォルトの名無しさん
2006/10/18(水) 22:00:57その教育機関がどんな連中を相手にしているかによるな
昼間は仕事でびっちりな人たち相手に宿題は物理的に無理な場合もある
0175デフォルトの名無しさん
2006/10/20(金) 02:43:31"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(...) なんてコードでうっかり踏んでそう。
0176デフォルトの名無しさん
2006/10/20(金) 03:57:260177デフォルトの名無しさん
2006/10/20(金) 06:04:07> 符号無しオペランドを含む計算は、決してオーバフローしない。すなわち、結果を
> 符号無し整数型で表現できないときは、その型で表現しうる最大値より1だけ大きい
> 数を法とする剰余を結果とする。
JIS X 3010:2003 本体6.2.5より
0178175
2006/10/20(金) 10:23:30エラーにはなりません。警告の出るコンパイラはあるようですが。
>>177
なるほど。それで決まりますね。
つまり -1u は unsigned int で UINT_MAX - 1 + 1 (== UINT_MAX) ということに。
unsigned int 以外の(より精度の高い)型に変換した場合に
ソースコードから期待される値は得られなさそうですので、
結局はやるべきではないですね。
ありがとうございました。
0179デフォルトの名無しさん
2006/10/20(金) 10:28:17とりあえず、コードで試してから書けよw
0180デフォルトの名無しさん
2006/10/20(金) 10:29:470181デフォルトの名無しさん
2006/10/20(金) 10:30:31ということは
0 - sizeof なら可だけど -sizeofならダメかもってこと?
0182デフォルトの名無しさん
2006/10/20(金) 10:35:190 - sizeof と -sizeof は、両方とも >>177 のルールによって結果が決まるので
等価になると言えます。
unsigned int 同士の加減算に使う限りは負の値として作用してくれるので、
それだけで「ダメ」とも言い切れないですが。
0183デフォルトの名無しさん
2006/10/20(金) 11:11:54え??
0184デフォルトの名無しさん
2006/10/20(金) 11:23:34なるほど
0185デフォルトの名無しさん
2006/10/20(金) 11:41:31assert(3u + (-2u) == 1u);
0186デフォルトの名無しさん
2006/10/20(金) 13:37:46式の途中の値の型ってコンパイラが適当に処理してるってこと?
終端ならunsigned 型にするが、
途中なら単純に変換するのではなく
減算に使われているか調べて判断してくれてるってことでおk?
0187デフォルトの名無しさん
2006/10/20(金) 17:50:36orz == 3 を含む美しく実用的なコードを書け。
0188デフォルトの名無しさん
2006/10/20(金) 18:00:07/* orz == 3 */
実用的なコード
}
0189デフォルトの名無しさん
2006/10/20(金) 18:05:36printf("orz ==3 嫌なあいつ\n");
0190デフォルトの名無しさん
2006/10/20(金) 18:13:31http://pc8.2ch.net/test/read.cgi/tech/1158275665/
0191デフォルトの名無しさん
2006/10/20(金) 18:23:11無駄なコメントは可読性を下げると思う
0192デフォルトの名無しさん
2006/10/20(金) 18:32:59なつかしい きょくが
ながれてるじゃないか。
あのころは、よかったな。
0193デフォルトの名無しさん
2006/10/20(金) 19:24:370194誰かおねがい
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");
}
0195デフォルトの名無しさん
2006/10/20(金) 19:43:53for文の仕様を100回音読しろ
それでもわからなければ諦めろ
0196誰かおねがい
2006/10/20(金) 19:45:430197デフォルトの名無しさん
2006/10/20(金) 19:47:39いいえ。185も単に>>177の規則に従った結果。
0198デフォルトの名無しさん
2006/10/20(金) 20:38:17assert(3u + ((unsigned int)(-(int)2u)) == 1u);
0199さrg3
2006/10/20(金) 22:33:020200デフォルトの名無しさん
2006/10/20(金) 23:14:53ラベルが有効なのはgotoと同一の関数内のみなのでしょうか?
それともソースファイル全体、またはプログラム全体で有効ですか?
0201デフォルトの名無しさん
2006/10/20(金) 23:29:32同一の関数内のみ
0202201
2006/10/20(金) 23:32:16エラー処理へ飛ばすぐらいかな
0203デフォルトの名無しさん
2006/10/21(土) 00:12:51そんくらいやってみろ
0204デフォルトの名無しさん
2006/10/21(土) 00:20:050205デフォルトの名無しさん
2006/10/21(土) 00:45:050206デフォルトの名無しさん
2006/10/21(土) 00:55:35たまに使う分には、それなりに便利だ。
0207デフォルトの名無しさん
2006/10/21(土) 00:57:43↑
これに歯切れ良く答えられない奴は異様なコードを書く
0208デフォルトの名無しさん
2006/10/21(土) 01:10:07模範解答きぼん。
0209デフォルトの名無しさん
2006/10/21(土) 01:14:31あっちゃこっちゃ飛ぶのはよろしくないということだ
0210デフォルトの名無しさん
2006/10/21(土) 01:15:460211デフォルトの名無しさん
2006/10/21(土) 01:26:29goto文を使うべき場面も、少ないながらあるわけで・・・
0212デフォルトの名無しさん
2006/10/21(土) 01:34:29見てきたが、(グローバル変数も一切使わないというヤツもいた)
プログラムなんて動けばいいんだと、俺は思う。
0213デフォルトの名無しさん
2006/10/21(土) 01:51:29部屋が汚いくらいじゃ早々死にはしないが、限度を超えるのは考えもんだろうし。
0214デフォルトの名無しさん
2006/10/21(土) 02:00:30そこに100個もgoto文使うやつがいたら、俺はそのコードを
興味本位で見せて欲しいわ。
0215デフォルトの名無しさん
2006/10/21(土) 07:49:22SPでもあっちゃこっちゃサブルーチンへ飛ぶね
ループや if, switch は分岐以外の何物でもないし
関数ポインタでの分岐に至っては飛び先が予測できないがSPで普通に使う
0216デフォルトの名無しさん
2006/10/21(土) 09:32:14・プログラミングと構造化について分けて考えられない
0217デフォルトの名無しさん
2006/10/21(土) 10:27:56プログラミングでない構造化はそこいら中にあるから
要は何をすればいいのかが見えていれば
道具の1つに過ぎないものを見境いなく毛嫌いはしなくていいはず
分けるとか分けないとか言ってるヤツの方が理解浅そう。
0219入力した数字を表示したい ◆g/ZMVdytmo
2006/10/21(土) 11:25:08void 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");
}
オワタ
0220入力した数字を表示したい ◆g/ZMVdytmo
2006/10/21(土) 11:26:020221デフォルトの名無しさん
2006/10/21(土) 11:27:38↓
printf("%d\n",b_data[i]);
じゃないの佐賀?
0222デフォルトの名無しさん
2006/10/21(土) 11:28:19浅かろうが深かろうが
おまえさんが食い込めないことだけは動かぬ事実
違うならそれを示してみな、お見事なら謝るから
0224デフォルトの名無しさん
2006/10/21(土) 11:38:450225デフォルトの名無しさん
2006/10/21(土) 11:42:32ただ煽るだけで話してても実りのなさそうな奴にえさはやらんぞ
これからちょっと出かけるから、夕方までにもうちっとマシなこと書いとくんだな
0226入力した数字を表示したい ◆g/ZMVdytmo
2006/10/21(土) 11:46:460227デフォルトの名無しさん
2006/10/21(土) 11:51:21っつーかemacsが容量不足でインスコできねぇ
0228デフォルトの名無しさん
2006/10/21(土) 11:52:58確かに大事な概念だけど・・
0229デフォルトの名無しさん
2006/10/21(土) 11:53:031〜2日かかります。
忘れないようにコメントをいろいろ追加しているのですが、それでも何で
こんな処理しているのか思い出せない場合があります。
どうすればよいでしょうか?皆さん、どうしていますか?
0230デフォルトの名無しさん
2006/10/21(土) 11:54:24ソースコードがコメントになるくらいのコード書く
これしかない
いや、おれは最初からなんか出せとか言ってないし。
あんたこそ、相手をあおって「なんか出せだせ」みたいな乞食みたいなことは
やめたほうがいいよ。
0232デフォルトの名無しさん
2006/10/21(土) 12:26:35出せない奴乙
0233デフォルトの名無しさん
2006/10/21(土) 12:37:23理解してないのに口先だけで世の中渡ってこれたんだ?
それだけでも勲章モノだから、もう出しゃばらない方がいいと思うよ、うん
0234デフォルトの名無しさん
2006/10/21(土) 12:40:20それが、その、数ヶ月前のコードは、自分が書いたものに見えないんです。
まるっきり記憶が飛んでいて。まるで他人のコードを見ているように
感じます。それを1−2日かけて思い出すと、どうにか理解できる
場合があります。やはり歳かな。
0236佐賀
2006/10/21(土) 12:48:35「口先だけで世の中渡ってる」感が強い。
0238デフォルトの名無しさん
2006/10/21(土) 12:57:22〜ただいま>>218が真っ赤な顔で必死になっております〜
0239デフォルトの名無しさん
2006/10/21(土) 12:58:54コメントを書く際は、まず最初に
/* 【何でこんな処理しているのか】 */
/* ・・・ */
と書くルールを決める。
他に書きたい事があるだろうが、それらは後回し。
0240デフォルトの名無しさん
2006/10/21(土) 13:06:32んだね
プログラミング以前に戻って情報を引っ張ってこれるなら、
全体が、何を問題にして何を目標にどんな解決法でコードを導いたのか、一筆書き加えると後々楽だね
0241デフォルトの名無しさん
2006/10/21(土) 13:21:02構造化というか、クラスのように階層化できるのがベストなんだが。
0242デフォルトの名無しさん
2006/10/21(土) 13:21:36i++; //カウンタをインクリメント
とかアホかと
0243デフォルトの名無しさん
2006/10/21(土) 13:32:54確か専用スレなかったっけ?
0245デフォルトの名無しさん
2006/10/21(土) 14:33:17っ ttp://pc8.2ch.net/test/read.cgi/tech/1068752664/
0246デフォルトの名無しさん
2006/10/21(土) 14:36:210247デフォルトの名無しさん
2006/10/22(日) 13:38:31それは脳に血栓があるかもよ
場所によっては自己同一性にアクセスできなくなるから。
0248デフォルトの名無しさん
2006/10/22(日) 19:41:240249デフォルトの名無しさん
2006/10/22(日) 21:24:02arr
&arr
&arr[0]
&*arr
実質的に全部同じなんですが、違いを教えてもらえないでしょうか
0250デフォルトの名無しさん
2006/10/22(日) 21:31:37&arr だけ、型が違う。
0251デフォルトの名無しさん
2006/10/22(日) 21:37:04注意せよ、「実質的に」にひどい罠がある
0252デフォルトの名無しさん
2006/10/22(日) 21:42:04それを逆参照してまたアドレスを得ているだけなので、arrと&*arrは等価。
また添え字演算子は間接参照演算子などの糖衣構文であることから、&*arrと&arr[0]も等価。
故にarrと&arr[0]も等価。
&arrはというと、アドレス演算子が「式中で配列は先頭要素へのポインタに変換される」という規則の例外となっており、
配列そのものへのポインタが得られるということになっている。
まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。
0253デフォルトの名無しさん
2006/10/22(日) 22:08:36>>252 よくわかりました。
>&arrだけは結果の型がchar (*)[1]で、
>ほかは結果の型がchar *になる。
0254デフォルトの名無しさん
2006/10/22(日) 22:14:57これは嘘
printf("%u", sizeof arr);
0255デフォルトの名無しさん
2006/10/22(日) 22:24:22そのコードで何を証明したつもりなの?
0256デフォルトの名無しさん
2006/10/22(日) 22:40:360257デフォルトの名無しさん
2006/10/22(日) 22:57:430258デフォルトの名無しさん
2006/10/22(日) 23:02:460259デフォルトの名無しさん
2006/10/22(日) 23:04:590260デフォルトの名無しさん
2006/10/22(日) 23:21:080261デフォルトの名無しさん
2006/10/22(日) 23:23:070262デフォルトの名無しさん
2006/10/22(日) 23:25:080263デフォルトの名無しさん
2006/10/22(日) 23:26:520264デフォルトの名無しさん
2006/10/22(日) 23:27:420265デフォルトの名無しさん
2006/10/22(日) 23:29:590266デフォルトの名無しさん
2006/10/22(日) 23:32:350267デフォルトの名無しさん
2006/10/22(日) 23:32:55char arr[1]={'A'};
arr
&arr
&arr[0]
&*arr
この次にやりそうなのを先に書いたんじゃないかな
とエスパー
0268デフォルトの名無しさん
2006/10/22(日) 23:44:45が怒っているように見えるのにエスパー
0269デフォルトの名無しさん
2006/10/23(月) 00:35:29マジレスするとsizeofも配列そのものの大きさを返すことから、アドレス演算子同様あの規則の例外。
0270デフォルトの名無しさん
2006/10/24(火) 15:06:26例) AB123cdを受け取ったら数字3、大文字2、小文字2
↑この答えお願いしますm(_ _)m
0271デフォルトの名無しさん
2006/10/24(火) 15:43:24#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;
}
0272デフォルトの名無しさん
2006/10/24(火) 15:57:06宿題スレ逝け阿呆。
0273デフォルトの名無しさん
2006/10/24(火) 16:07:34自分の間抜けさが露呈するから止めたほうがいいよ
0274デフォルトの名無しさん
2006/10/24(火) 16:28:350275デフォルトの名無しさん
2006/10/24(火) 16:29:590276270
2006/10/24(火) 16:37:39OSはWindows XP home SP1
グラフィックは GemeForce5200です。
ハードディスクは1が40ギガBで2が80ギガBです。
0277デフォルトの名無しさん
2006/10/24(火) 16:43:03それは本気で言っているのか
0278デフォルトの名無しさん
2006/10/24(火) 16:46:57あっ、Bはバイトです
0279デフォルトの名無しさん
2006/10/24(火) 16:48:11そのプログラムはGemeForce5200じゃ動かないよ
0280デフォルトの名無しさん
2006/10/24(火) 17:53:58WindowsでもUnixでも使える関数があれば教えてケロ。
0281デフォルトの名無しさん
2006/10/24(火) 18:13:16必要に応じてsetvbuf
0282デフォルトの名無しさん
2006/10/24(火) 18:20:25ありがとうございます。
できれば、サンプルをアップロードしてもらえるとうれしい。
0284デフォルトの名無しさん
2006/10/24(火) 18:51:49何かがおかしくなっていると感じるのだが
どこまでが正しかったのか分からない。
そんな経験ないだろうか。
0285デフォルトの名無しさん
2006/10/24(火) 20:02:14このスレが今そんな感じ
0286デフォルトの名無しさん
2006/10/25(水) 00:21:28mainと言う関数内で行いたいのですが、エラーが出てぜんぜんダメなんです。。。
誰か助けてください(泣)
わたしって馬鹿すぎですかね。。。
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では無い
}
}
0287デフォルトの名無しさん
2006/10/25(水) 00:31:56キーボードから入力された文字列をHEXコードに変換するプログラムを書きたいんですけど
やりかたがさっぱりわかりません。
たとえばAと入力したとき、実際は0x41ですけどこれを0x0Aに変換したいんですがどなたか
アイデアをください。初心者なのでほんとお願いいたします。
0288デフォルトの名無しさん
2006/10/25(水) 00:35:06単なるwarnigじゃないんですか?
だとするとcheckのlongをvoid *にして(long)を取り払えばいいと思いますが。
0289デフォルトの名無しさん
2006/10/25(水) 00:36:180290デフォルトの名無しさん
2006/10/25(水) 00:41:59解答ありがとうございます。
明日会社で早速試してみます。
>>289
abc()は別の関数で呼んでいます、説明が悪かったと思います、申し訳ございません。
0291デフォルトの名無しさん
2006/10/25(水) 00:46:04distance = 'A' - 0x0A
putchar (getchar() - distance) ;
0292デフォルトの名無しさん
2006/10/25(水) 00:52:16printf ("%X", (getchar () - distance)) ;
0293デフォルトの名無しさん
2006/10/25(水) 01:13:18ありがとうございます。俺の書き方が悪かったんですが、これだと0〜9まで
の入力がうまくいかないんですよ。16進数だから16通りのIf分岐
でできそうだけどもっとスマートにできないかなと・・・。
0294デフォルトの名無しさん
2006/10/25(水) 01:34:02もちつけ。
頼むからもちついてくれ。
16進数で表現できるのは65536通りの数字なわけだが、1ビットごとに処理を分岐させるつもりかおまいさんわ。
0295デフォルトの名無しさん
2006/10/25(水) 01:36:26c2n(x){return (x&79)%55;}
0296デフォルトの名無しさん
2006/10/25(水) 01:47:35> 16進数で表現できるのは65536通りの数字なわけだが
オマエがおちつけ。
0297デフォルトの名無しさん
2006/10/25(水) 01:48:55そんな方法があったのか・・・
いつも0-9、a-f、A-Fの場合で条件分岐してやってたよ・・・
0298デフォルトの名無しさん
2006/10/25(水) 01:51:17落ち着かなくてイイ
ただこの世から消えてくれるだけでイイ
0299デフォルトの名無しさん
2006/10/25(水) 02:52:12保守担当者がリアルorzとなるのが目に浮かんで
オラなんだかとってもワクワクしちゃうぞ。
0300デフォルトの名無しさん
2006/10/25(水) 03:30:350301デフォルトの名無しさん
2006/10/25(水) 05:41:45達人は16段のifを使う
0302デフォルトの名無しさん
2006/10/25(水) 08:46:490303デフォルトの名無しさん
2006/10/25(水) 09:55:26>>302にgoto禁止を提示!
0304デフォルトの名無しさん
2006/10/25(水) 10:52:54それならキャラクタセットがASCII上位互換でなくてもOKだしなにより移植性が高い
0305デフォルトの名無しさん
2006/10/25(水) 13:01:48char* p = s;
�@
p + 100;
�A
p += 100;
�B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
0306デフォルトの名無しさん
2006/10/25(水) 14:09:370307デフォルトの名無しさん
2006/10/25(水) 14:23:070308デフォルトの名無しさん
2006/10/25(水) 14:29:241から値は不定になるよ。(例えばNULLと判定されても文句は言えない)
正常な比較等ができると保証されているのはs+10まで。
アクセスできるのは*(s+9)まで。
それと機種依存文字はやめた方がいいぞ。
他の板ならともかく、こういう板では互換性に気を配るべきだ。
0309デフォルトの名無しさん
2006/10/25(水) 16:57:590310デフォルトの名無しさん
2006/10/25(水) 19:51:27ありがとうございました。無事解決しました。
みなさんありがとうございました。
0311デフォルトの名無しさん
2006/10/25(水) 22:14:45struct 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のアドレスに戻ってしまっているのでしょうか?
上記の範囲で問題があるのでしょうか?それとも書いてない部分に問題があるっぽいでしょうか?
0312デフォルトの名無しさん
2006/10/25(水) 23:33:51func_c(struct A **list){
*list = (alist->next = (struct A *)calloc(1, sizeof(struct A)));
}
って事?
0313デフォルトの名無しさん
2006/10/25(水) 23:49:21aroot = (struct A *)calloc(1, sizeof(struct A));
alist = aroot;
の辺りも意味不明だな
0314311
2006/10/26(木) 00:15:18まさにそれっぽいです
試してみます
>>313
arootの領域を確保しておかないとnextに代入しようとしたときにエラーが出ると思ったので
確保してからalistがarootを指すようにしたんですが
どう書くのが正しかったのでしょうか?
0315デフォルトの名無しさん
2006/10/26(木) 01:03:02>>289
今日、早速試してみたら問題なくできました!!
本当にありがとうございました。
今まで4年間アセンブラで書いていて、急に環境がC言語になってしまって・・・
C言語は難しいです。。。
0316デフォルトの名無しさん
2006/10/26(木) 01:34:140317デフォルトの名無しさん
2006/10/26(木) 01:37:00とりあえずインラインアセンブラで書いとけばいいんじゃね?
0318デフォルトの名無しさん
2006/10/26(木) 01:42:57ずっとアセンブラだけやってる人から見たら、そーゆーモノらしいよ。
とくにVBとかの高級言語になるともう完全にバイナリでの動作を
イメージ(する必要もないのに)できなくてギブアップしてしまうらしい。
まぁ、あれだ、彼らは言うなれば深海魚で浅い海にあがってくると破裂して死んでしまうんだよ。
0319デフォルトの名無しさん
2006/10/26(木) 01:54:240320デフォルトの名無しさん
2006/10/26(木) 01:57:30メモリ上にどのようにデータとコードが展開され、
レジスタがどのように使われるかわかんないと破裂しちゃうらしい。
0321デフォルトの名無しさん
2006/10/26(木) 02:45:36int(ポインタ)が20バイトとか考えてるのかな。
それじゃ、破裂しちゃう。
0322デフォルトの名無しさん
2006/10/26(木) 04:28:01コンパイルエラーが無いと破裂する
0323デフォルトの名無しさん
2006/10/26(木) 05:34:590324デフォルトの名無しさん
2006/10/26(木) 08:21:520325デフォルトの名無しさん
2006/10/26(木) 08:41:240326デフォルトの名無しさん
2006/10/26(木) 08:44:370327デフォルトの名無しさん
2006/10/26(木) 10:51:00ポインタの型依存な加減算で嵌るらしい。
アセンブラにも似たのはあるけど(type ptr)、参照時の抜き出す大きさ解決だけだしな…
0328デフォルトの名無しさん
2006/10/26(木) 11:12:400329デフォルトの名無しさん
2006/10/26(木) 11:40:06>イメージ(する必要もないのに)できなくて
不安になるんだろう。俺もVBやってると
「これNewしっぱなしで大丈夫なのか?」と不安になる事があった。
0330デフォルトの名無しさん
2006/10/26(木) 12:27:000331デフォルトの名無しさん
2006/10/26(木) 12:30:46不安になる必要はないぞ
ちゃんとリソースリークしてくれるから安心しろ
0332デフォルトの名無しさん
2006/10/26(木) 12:59:19void main(void)
って書くと、intがありませんって警告が出るんですが、なぜ?
0333デフォルトの名無しさん
2006/10/26(木) 13:25:590334デフォルトの名無しさん
2006/10/26(木) 13:26:200335デフォルトの名無しさん
2006/10/26(木) 14:19:52miami
0336デフォルトの名無しさん
2006/10/26(木) 16:58:07そうなんですか…
でも石田晴久著の入門ANSI-Cには堂々と
void main(void)
って書いてあるんですよね…
この本はずれ?
0337デフォルトの名無しさん
2006/10/26(木) 17:07:04有 効 桁 っ て 何 ?
0338デフォルトの名無しさん
2006/10/26(木) 17:30:44規格ではintを返すか、intをtypedefした型を返すか、実装依存の型を返すかの
いずれかでなければならないとされている。
よって、君の環境でvoidがOKならばvoidでも構わないし、ダメならばダメ。ただし、
int(とそのtypedef)以外をreturnとして指定した場合動かない環境が出てきても
文句は言えない。コード自体は規格違反ではない。
ただ、ANSI-Cと銘打ってある以上、intを指定するのが望ましい。よって、規格
違反ではないが、「親切な」本とは言い難い。
0339デフォルトの名無しさん
2006/10/26(木) 18:43:56なるほど〜
ありがとうございます。
自己参照型構造体を知りたくて買ったんだけど、はずれだったか〜
0340デフォルトの名無しさん
2006/10/27(金) 06:26:05極端な話、規格書にだってエラッタはある
何も信じるな、全てを疑え
0341デフォルトの名無しさん
2006/10/27(金) 06:51:27ちょいカッコいいな、実際は疑わしいが
0342デフォルトの名無しさん
2006/10/27(金) 07:35:49大衆に迎合して体制に媚び諂い、お上が黒を白と言えば即ちそれは白なのだと信じることが
腐敗を極めた俗世を生き抜く真理。
疑ってはならん。
ルーク。ソースを信じるのだ。
0343デフォルトの名無しさん
2006/10/27(金) 07:41:04ここは日本だ!
0344デフォルトの名無しさん
2006/10/27(金) 11:17:45数学の勉強しろ
精度がどの桁数まで有効かって事だ
一般的に使われる浮動小数は2進数で表現されて居るので精度は2進数の桁数で表現できるんだけど
通常使う10進数では有効桁数は違う
0345デフォルトの名無しさん
2006/10/27(金) 11:35:28レベル低くて申し訳ないんですが教えてください。
ファイル操作に関する問題なのですが、fprintf()をつかって出力しています
このとき[^z]の入力を判断したいのですが不可能ですか?
個人で勉強してるので聞くところがここしかありません><
0346デフォルトの名無しさん
2006/10/27(金) 11:43:51(´-`).。oO(何を出力するのかなあ)
>このとき[^z]の入力を判断したいのですが不可能ですか?
(;゚Д゚)…え?
0347デフォルトの名無しさん
2006/10/27(金) 11:44:20初心者スレへどうぞ。
つーか、出力関数で入力判断って何がしたいのやら。
#巧く説明できないようなら日本語を遣り直した方がいいかもね。
0348345
2006/10/27(金) 12:08:29scanf("%s",str)で^zを判断する方法が知りたいです
0349デフォルトの名無しさん
2006/10/27(金) 12:15:07^zが特別扱いされるかどうかすら環境依存だ。このスレで扱う内容ではない
0350345
2006/10/27(金) 12:32:30初心者スレいってきま
0351デフォルトの名無しさん
2006/10/28(土) 04:31:38配列におけるソート方法はいろいろ学習したのですが・・・
0352デフォルトの名無しさん
2006/10/28(土) 07:36:410353デフォルトの名無しさん
2006/10/28(土) 08:49:00今アルゴリズムスレが機能しているかどうかは知らんが。
0354デフォルトの名無しさん
2006/10/28(土) 09:29:21C言語の勉強して基本情報をとったので、オブジェクト指向をやってみたいのですが
C++とC#のどちらをやったらいいのですか。仕事とかではなく趣味なのですが
「C言語で書くアルゴリズム」って本に、リストのクイックソートが載ってるよ。
C++とC#とJavaを読めるようにしとけばいいんじゃないの?
0357デフォルトの名無しさん
2006/10/28(土) 15:42:36普通にJavaがいいよ
Windowsで何か作りたいのがあるならC#
仕事でしょうがなくC++
オブジェクト指向の解説本に載ってるようなコードは、
他の言語でも、だいたい読めるよ。
0359デフォルトの名無しさん
2006/10/28(土) 23:43:06....
a->any = malloc()
}
func B(){
struct A a;
funcA(&a);
}
この関数Aの中のmallocで確保した領域は
funcBに戻った時点で未定義ですよね?
0360デフォルトの名無しさん
2006/10/28(土) 23:49:53そもそもコンパイルエローだよちんこ!
0361デフォルトの名無しさん
2006/10/28(土) 23:54:08とりあえず、関数のスコープを跨ぐ領域の確保を行う場合は
どうすればいいの?4分木作りたいけど、なんか別関数でアクセス
するとすぐセグメンテーションフォルトってやつが出る
0362デフォルトの名無しさん
2006/10/29(日) 00:02:250363デフォルトの名無しさん
2006/10/29(日) 01:00:11void char(char ** buf)とかでいいの?
でもさmallocでエラー出たときどうすればいいの?
0364デフォルトの名無しさん
2006/10/29(日) 01:01:090365デフォルトの名無しさん
2006/10/29(日) 01:04:01まぁ、初心者スレにでも実際のソースを貼って味噌。
0366デフォルトの名無しさん
2006/10/29(日) 01:35:19行うとはどういう意味なのでしょうか?
コピーを作ると言う事なのでしょうか?
0367デフォルトの名無しさん
2006/10/29(日) 01:38:49ソースファイルにファイルを読んだり書いたりするコードを記述し、
それをコンパイルし実行する。するとソースに書いたとおりにファイルがメモリへ読まれたり書かれたりする。
0368デフォルトの名無しさん
2006/10/29(日) 01:38:54質問する前に調べたか?
自分で作ってみたか?
0369デフォルトの名無しさん
2006/10/29(日) 01:44:29ということは、実行ファイルに書き込まれると言う事なのでしょうか?
>>368
実行してみても、実感が湧きません。
コピーファイル(出力ファイル?「_」)ができるのですが・・・・
それが何に使うのか、何故できたのかがわかりません。
入門書を読んでいます。
0370デフォルトの名無しさん
2006/10/29(日) 02:21:39黒板が読み込んだファイルで
お前が記憶領域で
ノートが出力ファイルだ
0371デフォルトの名無しさん
2006/10/29(日) 02:39:220372デフォルトの名無しさん
2006/10/29(日) 02:44:31それは中央演算処理装置が無いのが鯨飲(←なぜか誤変換される)
0373デフォルトの名無しさん
2006/10/29(日) 02:53:460374デフォルトの名無しさん
2006/10/29(日) 03:10:34検索をしても見つかりません
もうなくなってしまったのでしょうか?
どこに書き込めばいいか分からず書き込ましていただきました。
スレ違いでいしたら、誘導お願いします。
0375デフォルトの名無しさん
2006/10/29(日) 03:30:58ありがとうございました、イメージは掴めました
要するに「_」が付いてできたファイルが僕のノートと
考えてみます。
0376側近中の側近 ◆0351148456
2006/10/29(日) 09:24:33(っ´▽`)っ
関数Aの中のmallocで確保した領域が、
関数Bで定義されているポインタによって指されていれば
関数Bの中では確保されている状態です。
mallocがどこで行われようが、
問題はそれを指すポインタの有効範囲(スコープ)なんです。
(っ´▽`)っ
そもそもfreeをかけなければずっと確保し続けるというのが
C言語の仕様なのではなかろうか?
(っ´▽`)っ???
どうなんだろう?
ポインタのスコープを抜けると自動的にfreeをかけてくれる
ガーベジコレクションみたいな機能って
C言語のコンパイラにあるのかな?
0377デフォルトの名無しさん
2006/10/29(日) 09:42:02初心者スレへどうぞ。
0378デフォルトの名無しさん
2006/10/29(日) 09:50:25> それが何に使うのか
ここでは、ファイルができるということを学ぶのであろうから、
正しく出力されてさえいれば、ファイルの中身そのものはどうでも良い。
> 何故できたのか
ソースコードにそう書いたから。
0379デフォルトの名無しさん
2006/10/29(日) 10:32:35>ソースコードにそう書いたから
またミもフタもない言い方を。
一千年の時を経て今再び奇跡が起こったのだ、とか、
PCが君を勇者だと認めたのだ、とか、
初心者にはそういうソフトでかつドラマチックな演出が
必要とされているのではないのかね。
…コンパイラとか実行形式とかOSとかCPUとかノイマン型とかブール代数とか、
はたまたMOSFETの動作原理とか、
何から何まで説明しなければ、何故出来たのかの質問に答えていることにはならないだろう。
そこまで答えるだけの体力も知力も時の運も自分には既に無い。
0380デフォルトの名無しさん
2006/10/29(日) 10:38:45愚痴はチラシの裏にかいとけ
0381デフォルトの名無しさん
2006/10/29(日) 20:33:480382デフォルトの名無しさん
2006/10/30(月) 02:58:04ってのを最近見なくなった
0383デフォルトの名無しさん
2006/10/30(月) 08:10:21急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
0384デフォルトの名無しさん
2006/10/30(月) 22:43:31b[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です
0385デフォルトの名無しさん
2006/10/30(月) 22:51:53int a[4]];
と定義したら、有効な配列要素はa[0],a[1],a[2],a[3]の4つ
a[4]は参照すると誤動作をする(コンパイラはチェックをしない)
a[4]を使いたければint a[5];と定義すること。
0386384
2006/10/30(月) 22:58:55ありがとうございます
0387デフォルトの名無しさん
2006/10/31(火) 12:02:47とした時、要素が7個あることをプログラムの中で知る方法は
ありますか?
0388デフォルトの名無しさん
2006/10/31(火) 12:16:33として NUM_WEEK で我慢する
0389デフォルトの名無しさん
2006/10/31(火) 12:29:18ありがとうございます。
プリプロセッサか何かを駆使して、どうにかできないかなあと
考えてみましたが、無理みたいですね。
0390デフォルトの名無しさん
2006/10/31(火) 17:30:46・・・
return 0 ;
}
と
void main(void){
・・・
return ;
}
は何が違うの?
0391デフォルトの名無しさん
2006/10/31(火) 18:18:37前者は規格(ISO/ANSI/JIS)で認められている形式。
後者はそうではなく、(コンパイルできるとしたらそれは)各コンパイラが独自拡張として受け付ける形式。
0392デフォルトの名無しさん
2006/10/31(火) 18:47:38char str[][100]={"JAPAN","USA","CANADA"};
char (*p)[];
p[0]=str[0];
にすると、
(*p)には文字列の先頭アドレスが入る
pにも文字列の先頭アドレスが入る
この違いは何!?
0393デフォルトの名無しさん
2006/10/31(火) 19:00:25#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;
}
これがエラーになるのは何でですか?
0394側近中の側近 ◆0351148456
2006/10/31(火) 21:07:40(っ´▽`)っ
実行時にパラメータを設定してるか?
指定しないとargv[1]はNULLとなり、
%sで異常終了するだろうね。
0395デフォルトの名無しさん
2006/10/31(火) 21:07:49コンパイル時のエラーですか?
エラーメッセージは何ですか?
意図する動作は何ですか?
引数には何を渡しましたか?
0396デフォルトの名無しさん
2006/10/31(火) 21:12:29統計計算は、どれがお勧め?
0397デフォルトの名無しさん
2006/10/31(火) 21:16:24>char (*p)[];
「p は、char の配列 (= 文字列) の先頭を指すポインタ」という宣言。
因みにこれが char *p だと
「p は、char (それが配列かどうかは別として) を指すポインタ」だが
実質、大差ない。
ただ、いずれにしろ宣言部分の書式なので
>(*p)には文字列の先頭アドレスが入る
わけではない。
0398側近中の側近 ◆0351148456
2006/10/31(火) 21:33:16(っ´▽`)っ ポインタを考える時にはメモリの状態を考えると良い☆
番地: 中身
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
0399デフォルトの名無しさん
2006/10/31(火) 22:00:04C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
0400デフォルトの名無しさん
2006/10/31(火) 22:51:51#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;
}
要するに、「たとえアドレスが同じでも、型が違う」ということ。
0401デフォルトの名無しさん
2006/11/01(水) 00:11:31「本州の最北端」と「青森県の最北端」は同じアドレス
0403デフォルトの名無しさん
2006/11/01(水) 11:04:51「/lib/なんちゃら」 が出てくるならコンパイル時じゃなくてリンク時だと思うけど
それ多分ディスク壊れてるよ
0405デフォルトの名無しさん
2006/11/01(水) 17:22:180406デフォルトの名無しさん
2006/11/01(水) 19:32:32これでもどうぞ
http://makimo.to/cgi-bin/search/search.cgi?q=C%8C%BE%8C%EA%82%C8%82%E7&andor=AND&sf=0&H=&view=table&shw=100&D=tech
0407デフォルトの名無しさん
2006/11/01(水) 21:21:44管理人が飽きたとか逃げたとか失踪したとか死んだとか
0408デフォルトの名無しさん
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も同様にエクスプローラのサブセット?を表示してやりますよね。
どう思いますか?
0409408
2006/11/02(木) 00:32:16Mac/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);
}
0410デフォルトの名無しさん
2006/11/02(木) 00:34:18他の環境に移植する予定がないなら便利な方で
移植する予定があれば標準で
っていうよりも、依存部分をなるべくまとめて
対応する部分の差し替えで済むなら便利な方で
古いMacなら早晩買い替えそうだしね
でも、その時もそのコードを必要とするかというと・・・どうだかね?
0411408
2006/11/02(木) 00:40:06なるほど。ありがとうございます。
そうすると、たとえばベクターとかにWindows用のアプリケーション・ソフトが
たくさんありますが、これはもうWin32の環境に注力しているのであって、
MacやDOS、Unix互換OSへの移植はほぼ考えていない、と。
ちょっと考えただけでも、タイムスタンプ変更ツールなど。
もろにOS依存ですけど。
常識的に考えてそうですよね。けれども、fopen/fputs/fcloseみたいな
生っぽい関数ってCの中でも(とりわけANSI C)異色ですよね?
0412デフォルトの名無しさん
2006/11/02(木) 01:05:17Windows用のソフト作者が皆、他環境への移植を考えていないというわけでもないだろう。
例えばテキストエディタでも、グラフィカルな部分はOSごとに全く異なる処理が必要かもしれないけど、
内部的なデータ管理などは環境に依存せずに流用できると思う。
(実際にどう作られているのかは知らないが。)
単に個人レベルでやっていると各種プラットフォームをカバーするほどのマンパワーがないとか、
機能を充実させることが楽しいのであって他環境への移植には技術者的な興味が沸かないとか、
そういう部分も大きいのかも。
fopen等が生っぽくて異色ということは無いだろう。
ファイルという概念はかなり多くのコンピュータで基本的な概念だし、
ANSI準拠の標準ライブラリなのだから、特殊な環境への移植を考えているのでなければ
使用を躊躇う理由はあまりないんじゃない?
むしろ、OS固有のシステムコール等を隠してくれるのだから、移植性を考えるなら
積極的に使っていいと思う。
ユーザにファイルを選択させるなら、そのOSで標準的なデザインのダイアログを開いたほうが便利だから、
その場合は各OS固有の便利なライブラリを使用すればよいし、
内部的な処理でファイルI/Oするならfopen系でも十分なはず。
要は適材適所ということで。
ところで、
>すいません、哲学的な質問です。
これはかなり感覚がずれてないかい? 哲学ってそんなもんじゃないだろう。
0413408
2006/11/02(木) 01:38:18大部分は同意なんだけど、fopen/fclose/fseekなどが
生っぽいという感触は間違ってないと思うけどな。
だいたい、それぞれの出自をたどればUnixのopen/close/writeとかの
システムコールに行き着くわけでしょ?そもそもUnixを書くために
Cが生まれたくらいだし。
Windows上のVCとかでコンソールアプリ作ってさ、printfやら
fputsやらも使えるけどさ、やっぱコンソールアプリいきなりでてきたら
フツーの人はビビるでしょ。Macでもコンソールアプリつくれるけど、
通常のWindows/Macのプログラミングのゴールはやっぱさ、
こうウインドウが出てさ、ダイアログが出てマウスでポチっとな、ってやつでしょ。
そういう、エクスプローラダイアログ出して、文字入力ボックス出すんじゃなくて、
fputs/fwriteしちゃうのが生っぽい、と思ったわけ。
これ、哲学でしょ、プログラミングの、依存・非依存のハナシとしては。
0414デフォルトの名無しさん
2006/11/02(木) 02:44:590415デフォルトの名無しさん
2006/11/02(木) 04:15:410416デフォルトの名無しさん
2006/11/02(木) 05:25:220417デフォルトの名無しさん
2006/11/02(木) 13:17:43それはOSのアーキテクチャの問題であって言語の問題じゃない。
思えば自分も工房の頃はなんちゃって哲学に目覚めたことがあったな…
0418デフォルトの名無しさん
2006/11/02(木) 17:47:39C言語でWinXP上にJavaみたいなウインドウ出したいんですけど、
それって出来ます?
LINUX上でもいいんですけど…
0419デフォルトの名無しさん
2006/11/02(木) 19:09:17>>1 の「標準C」の意味が解らなかったのか
>>1 の日本語が読めなかったのか
そもそも >>1 なんか読んでないのか知らんが
>>416 を心に刻め。
0420デフォルトの名無しさん
2006/11/02(木) 20:59:28forに限った使用だったんだが...
0421デフォルトの名無しさん
2006/11/02(木) 21:00:55意味分からん。
VMやらコンパイラがCで書かれてるってことか?
0423デフォルトの名無しさん
2006/11/02(木) 21:43:50整数にi, j, k, l, n, mを使うのは非常識ではない
FORTRANのなごりか
0424423
2006/11/02(木) 21:55:51for文の制御変数に一文字の変数はごく普通
0425デフォルトの名無しさん
2006/11/02(木) 22:15:330426デフォルトの名無しさん
2006/11/02(木) 22:50:55また、CTRL+H でバックスペースみたいに、
CTRL+○ でどのキーを押せばDeleteになりますか?
0427デフォルトの名無しさん
2006/11/02(木) 23:02:03非常識って言われてちょっとキョドってしまった。w
楽になりました。ありが�d♪
0428デフォルトの名無しさん
2006/11/03(金) 00:32:12>>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関数等を駆使して調べる。
0429デフォルトの名無しさん
2006/11/03(金) 01:14:43私のコーディング規約では非推奨としている。
特にiは検索しにくいので個人的には好かん。
尚、可読性の点からlは却下。
0430デフォルトの名無しさん
2006/11/03(金) 01:17:450431デフォルトの名無しさん
2006/11/03(金) 01:19:54素人くさい。。。
0433429
2006/11/03(金) 01:32:29icとかix, iyとかitとか状況により色々。
最近はC++でstl使うことが多いからそもそもループ制御に整数変数を使うこと自体減ってるが。
0434デフォルトの名無しさん
2006/11/03(金) 01:57:12もっと長大な名前にしたかったんだが
0435デフォルトの名無しさん
2006/11/03(金) 02:01:170436デフォルトの名無しさん
2006/11/03(金) 02:01:37しかし短い変数が嫌いってのもなんだかな。
言語屋や論理屋がCやC++みたいな実務優先の汚れ言語に付き合うのは
疲れるばかりだと思うんだが。
0437429
2006/11/03(金) 02:11:52漏れならばりばりの実務屋だが。
エディタで変数を追うのに、i一文字だと一々ifにぶちあたって面倒だとは思わないか?
この板に貼られているコードの断片の制御変数にicを使っているのは漏れだけじゃないようだし、
一文字変数嫌いはそれなりにいそうだが。
0438デフォルトの名無しさん
2006/11/03(金) 02:18:22と無理やりタイトルに沿った話題に戻してみる
0439デフォルトの名無しさん
2006/11/03(金) 02:19:50一文字変数をループに普通に使ってるけどな。
0440デフォルトの名無しさん
2006/11/03(金) 02:50:570441デフォルトの名無しさん
2006/11/03(金) 02:52:32ぜんっぜん思わんわ。
どんな状況でも俺流を押し通せるのはマの資質の一つかもしらんが
慣習的なものとはいえ、これだけ広く普及してるモツにあえて牙剥くだけアホらしい。
まあ、好きにすれば。
0442デフォルトの名無しさん
2006/11/03(金) 02:54:55レギュラ検索すればいいんじゃね?
0443429
2006/11/03(金) 03:38:12インクリメンタルサーチで事足りるときに、一々そこまでするかという問題。
#マウスがないとカーソル移動できなかったりカーソルキーを連打するような使い方に馴れてると面倒を感じないだろうなぁ。
>>441
いや、モツは鍋にしても苦手なんで牙むくことはないがw
冗談さておき、なにをむきになっている?
iは好かんと言うことがそんなに気に入らないのかねぇ……
0444デフォルトの名無しさん
2006/11/03(金) 04:21:55far ポインタ っていうのがあって・・・
char * far lp;
とかあったんですよ。
手元ANSIの辞典には項目がなく
調べてみると、大雑把にはメモリが大きくなったから
セグメントやらオフセットやらがどうのこうのと・・・
それはおいておいて、このfarっていうのが
bcc32だと変数名と認識されるのかエラーなんです
farとかnearとかって廃止された予約語なんですか?
それとも非標準のC?
調べた印象だと普通にあるみたいなのですが、
そのへんの経緯を教えてください
PS 32bit系ならfarをはずすだけでとりあえずそこはおk?
0445デフォルトの名無しさん
2006/11/03(金) 04:44:21BCC5.0.2当たりならまだ現役で残ってるけど
0446デフォルトの名無しさん
2006/11/03(金) 04:56:56って書いときゃOK
0447デフォルトの名無しさん
2006/11/03(金) 05:07:308086セグメントの悪夢を思い出した・・・・・
0448デフォルトの名無しさん
2006/11/03(金) 06:08:48C99とかどうでもいいな
それに厳密にしたがってるコンパイラは
どれだけ普及してるんだってな
0449デフォルトの名無しさん
2006/11/03(金) 06:12:26>>446
ありがとうございました
型修飾子だった時代もあったんですね
0450デフォルトの名無しさん
2006/11/03(金) 07:57:45それfor内で何度も出てくると見にくくね?
0451デフォルトの名無しさん
2006/11/03(金) 08:05:07>>434
0452デフォルトの名無しさん
2006/11/03(金) 08:24:140453デフォルトの名無しさん
2006/11/03(金) 08:59:050454デフォルトの名無しさん
2006/11/03(金) 09:22:46正規表現を持ち出すまではなくても、いわゆる単語検索でi1文字の検索はできるだろうと思う。
0455デフォルトの名無しさん
2006/11/03(金) 09:24:590456デフォルトの名無しさん
2006/11/03(金) 09:29:09>>452
何百行もあるような関数を書いて、そのなかでアチコチで使いまわしてるとか、
そんなんじゃないの?
0458デフォルトの名無しさん
2006/11/03(金) 09:32:08いくらなんでもそんなこたないだろう。
0459429:ゴメン、そろそろ終わりにしよう
2006/11/03(金) 10:20:13そんなことで一々マウスに手を出すほど暇じゃないんで、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が随分とご執心のようで。
0460デフォルトの名無しさん
2006/11/03(金) 10:49:11幸いにもそういう状況に出くわしたことはないので想像できないよ
素朴な疑問だけど間にClickみたいなicを含む単語があったらどうするの?
0461429
2006/11/03(金) 11:06:01#少なくとも、i一文字で引っ掛かる確率に比べればicが引っ掛かる確率は低いぞ。
それよか素朴な疑問なんだが、移動のアンカーに変数名を使いたくならないのか?
#そもそもただのコーダーなら(理論的には)修正の必要が生じることもないのかも知らんが。
for (i = 0; i < ... みたいな行のiに飛びたいなら「/i 」でもいけるけどね。
0463デフォルトの名無しさん
2006/11/03(金) 11:17:11多かれ少なかれその手のルールは皆持ってるもんだが、
それが普遍的なものであるか、真に有用なものであるかは
大抵の場合疑わしく、使ってる本人も大抵「手に馴染んでるから」以上の理由が無いことを
自覚して使ってるもんだ。
本人ペンディングしたがってるみたいだからこの辺でシメでいいとは思うが、
とりあえずこれだけ。
サンプル持ち出すまでも無く、それはそれなりのマイノリティ。
つーか大体にしてスレ違いもいいところだしな。
0464デフォルトの名無しさん
2006/11/03(金) 11:23:590465452
2006/11/03(金) 13:22:00一般的な変数アンカーは使うよ。
ただ、ループカウンタをターゲットにすることは稀 ってことで
参照されない回るだけのためのカウンタ or 配列等の引数に渡されるカウンタ
スタイルフリーな言語での宗教論争はしかたないよなぁ…
0466デフォルトの名無しさん
2006/11/03(金) 15:58:46別にicだからってそこまで見にくくなるわけじゃないし
他人の性癖にどうこう言う必要はないんだよね
プロジェクトで強要されても痴漢(あれ?)で一発だし
0467デフォルトの名無しさん
2006/11/03(金) 16:07:35短い変数名ならなおさら
0468デフォルトの名無しさん
2006/11/03(金) 23:26:22char *moji[] = {
"aaa",
"bbb",
"ccc",
NULL
};
このような文字列を
while ( *moji ) {
printf("%s\n", *moji);
*moji〜
}
上のようにwhileで表示し、文字列NULLが来るまでアドレスを進めて表示したいのですが
*moji〜のアドレスを進める部分が分かりません。
どのようにすればいいのでしょうか?
0469デフォルトの名無しさん
2006/11/03(金) 23:27:300470469
2006/11/03(金) 23:28:41char**p;
for(p=moji;*p;++p){
printf("%\n",*p);
}
0471デフォルトの名無しさん
2006/11/03(金) 23:31:210473デフォルトの名無しさん
2006/11/03(金) 23:43:28>>1
0474デフォルトの名無しさん
2006/11/04(土) 04:06:36耳かっぽじってよく聞けよ
>1だからな>1
ちゃんと>1を見ろよなっ!!
0475デフォルトの名無しさん
2006/11/04(土) 10:16:27これが最後だぞ!
>>1だからな!>>!
0476デフォルトの名無しさん
2006/11/04(土) 10:26:17どうしてこんなところに迷い込んだんだ…
0478デフォルトの名無しさん
2006/11/04(土) 14:29:32もう来なくていいよ・・・
0479デフォルトの名無しさん
2006/11/04(土) 15:01:36ANSI Cでこれらの関数がどう定義されているのか載っている本・サイトはないでしょうか?
どのくらいまで誤差を許容しているのか知りたいのです
RAND()やRND()は「C言語による最新アルゴリズム事典」に載っているのを見つけたのですが
その他は見つけることが出来ませんでした
0480デフォルトの名無しさん
2006/11/04(土) 15:02:39規格書見れば?
三角関数のアルゴリズムは、その本に載ってなかった?
(規格でどう規定されてるかは知らないけど)
0482デフォルトの名無しさん
2006/11/04(土) 15:12:400483デフォルトの名無しさん
2006/11/04(土) 15:15:09「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/
0484デフォルトの名無しさん
2006/11/04(土) 15:17:16ググってみました
…高っ
>>481
三角関数はtan()を連分数展開で求めて、sin()cos()はタンジェントから求めるという方法が載っていたのですが
ANSI Cの規格についてはノータッチでした。
完成したらANSI Cの関数と性能比較をしたいのですが、誤差を大体同じくらいにしないと比較にならないので
困っています。
0485デフォルトの名無しさん
2006/11/04(土) 15:21:37http://www.open-std.org/jtc1/sc22/wg14/
0486デフォルトの名無しさん
2006/11/04(土) 15:32:06わざわざありがとうございます。
まだ斜め読みですが、483さんが書いてくださったようなことしか書いてなくて
実装についてはノータッチみたいですね。
結局細かい実装については各コンパイラにおまかせということ、なんですかねえ
ともあれお二方ともありがとうございました。
0487479
2006/11/04(土) 15:40:00ざっと流して読んだところ>>485さんの教えてくださったpdfには実装例について書いている関数もあれば
定義だけ書いてある関数もあるようです。
RAND()は実装例についても載っていました。
0488デフォルトの名無しさん
2006/11/04(土) 17:12:58483のサイトからただでPDFが得られる。
ところで数学関数の実装はテイラー展開などの近似式を使う場合もあるが、、
CPUがそういう計算の命令を持っている場合には(アセンブリ言語などで)それを使うこともある。
0489479
2006/11/04(土) 17:25:53一応マクローリン展開による方法と連分数展開による方法で実装して
速度比較するつもりです
CPUが持ってることもあるんですか、知りませんでした
もし持ってれば大分高速化できそうですね
x86のアセンブリの仕様も読んでおきます
0490デフォルトの名無しさん
2006/11/04(土) 18:52:20lintで構文チェックするのは常識ですか。
0491デフォルトの名無しさん
2006/11/04(土) 20:17:490492デフォルトの名無しさん
2006/11/04(土) 20:40:57どのあたりの板になりますか?
0493デフォルトの名無しさん
2006/11/04(土) 21:16:36かなあ。
0494デフォルトの名無しさん
2006/11/04(土) 21:31:31そちらに行きます。ありがとうございます。
0495デフォルトの名無しさん
2006/11/04(土) 21:37:56gnuplotをパイプで使うプログラム内のこの記述でエラーが出ます。
fourierはn行3列のデータです。
どなたかエラーの理由が分かる方教えて下さい。
0496デフォルトの名無しさん
2006/11/04(土) 21:46:140497495
2006/11/04(土) 21:49:100498479
2006/11/04(土) 22:07:03読んできました
x86の命令セットにもサイン・コサイン・タンジェント・アークタンジェント・平方根等の命令がありました
これで悩む必要がなくなって嬉しいような残念なような複雑な気分です
ありがとうございました
0499デフォルトの名無しさん
2006/11/04(土) 22:23:380500デフォルトの名無しさん
2006/11/04(土) 22:28:360501479
2006/11/04(土) 22:32:57FSINのクロック数調べたら60〜100くらいかかる上にペアリングできなくてちょっと驚きました
0502デフォルトの名無しさん
2006/11/04(土) 22:49:09このスレで答えていいのか微妙
0503デフォルトの名無しさん
2006/11/04(土) 22:57:52確かに ISO も ANSI も JIS も関係がないな。
ぶっちゃけ自分の欲しい答えが手軽に手に入ればみんなどこでもいいんだ。
やっぱゆとり教育世代の自己中な性格がこんなところにまで影響してきているということか。
0504デフォルトの名無しさん
2006/11/04(土) 23:10:260505デフォルトの名無しさん
2006/11/05(日) 03:05:490506デフォルトの名無しさん
2006/11/05(日) 10:47:07嫁なし子供なし。
0507デフォルトの名無しさん
2006/11/05(日) 13:39:15例えば、メンバ a, b, c を持つ構造体の配列を、少なくともひとつの列を選び
その列についてソートします。
ただし、複数の列を選択した場合は、優先度を付けてソートしたいのです。
具体的には、メンバ a, c について、この順の優先度でソートする場合は
配列全体で見た場合、メンバ a でソートされていて、メンバ a の同値ごとに
メンバ c でソートしたいのです。
簡単にやりたいことを言うと SQL の ORDER BY a, c を実装したいのです。
とりあえず、優先度の低いメンバから順々にソートをしていけば目的の結果を得ることができました。
※ 上記の例だと、まずメンバ c でソートして、その後にメンバ a でソートしました。
ただ、ソート処理を何回も繰り返すのが、どうも気に入らないのですが
一度のソート処理で同じような結果を得られる方法ってあるのですか?
0508デフォルトの名無しさん
2006/11/05(日) 14:21:12qsort() に適当な辞書順比較関数を渡せ。
0509デフォルトの名無しさん
2006/11/05(日) 14:31:53#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;
}
0510507
2006/11/05(日) 14:59:122つのメンバについて比較する関数を用意すればいいのはわかりました。
ということは>>507のように、3 個のメンバを持つ構造体の配列をソートする時
任意の数のメンバを選択して、かつ優先度も任意でつけられる場合は
・メンバ 1 個についてのソート
3個のメンバから1個を選ぶ・・・3通り
・メンバ 2 個についてのソート
3個のメンバから2個を選んで優先度で並べる・・・3P2 = 6通り
・メンバ 3 個についてのソート
3個のメンバから3個を選んで優先度で並べる・・・3! = 6通り
のように、15通りの比較関数を容易しておかないといけないのですか?
それとも、今回のような要件の場合は、ソートを複数回行う方がよいのですか?
0511デフォルトの名無しさん
2006/11/05(日) 15:08:310512デフォルトの名無しさん
2006/11/05(日) 15:09:54>>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++に移行してしまえ
0513デフォルトの名無しさん
2006/11/05(日) 15:09:57要件がほんとにあんたの言うとおりなら、比較関数の動作はそれだけの種類が必要だろう。
ソートを複数回するのは速度的に不利だが、比較関数は用意しなくていい。
それが「よい」かどうかはあんたが決めること。
複数回ソートでうまく動作させるためには安定ソートじゃないとだめだから、
qsort() が使えないのもデメリットだな。
0514デフォルトの名無しさん
2006/11/05(日) 15:10:30そりゃあんた、ここは企画のみを云々するスレじゃないからね。
0515デフォルトの名無しさん
2006/11/05(日) 15:12:13>>1 を読む限り、規格に関連した話題のみという縛りはないからだろう。
嫌ならさっさと誘導しろよ。そして次スレの >>1 を提案するんだ。
0516デフォルトの名無しさん
2006/11/05(日) 15:30:520517507
2006/11/05(日) 16:27:10>>512さんのをベースにやってみようと思います。
それと、実装する言語がC言語であること、宿題ではなく個人的な疑問だったため
あえて宿題スレではなく、こちらで質問させてもらいました。
不愉快に思われた方、すみませんでした。
0518デフォルトの名無しさん
2006/11/05(日) 16:29:58これでは不満かい?
#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;
}
0519例えば0x7fffffffと-1
2006/11/05(日) 16:55:370520デフォルトの名無しさん
2006/11/05(日) 17:02:100521518
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;
}
0522デフォルトの名無しさん
2006/11/05(日) 17:08:52qsort() の仕様を読み直せ。
0523デフォルトの名無しさん
2006/11/05(日) 17:11:55今ごろ>>511と>>516は顔真っ赤にしてるんだろうな
0524デフォルトの名無しさん
2006/11/05(日) 17:13:32ISO/IEC 9899:1999の7.20.5.2 The qsort functionを読んだけど、どのあたりを
意図しているのか分からなかった。教えて♥
0525デフォルトの名無しさん
2006/11/05(日) 17:15:44比較関数の戻り値。
>>521 コードじゃ論理比較の結果だから 正(または負)か0しか返さない。
0526デフォルトの名無しさん
2006/11/05(日) 17:16:470527デフォルトの名無しさん
2006/11/05(日) 17:17:250528デフォルトの名無しさん
2006/11/05(日) 17:20:31relational operatorsも読んでみた。確かに!
>>527
ご名答。面目ない。
0529デフォルトの名無しさん
2006/11/05(日) 17:21:060530デフォルトの名無しさん
2006/11/05(日) 17:23:52え?なんで? 0 も 1 も戻り値としては有効だろ?
0531デフォルトの名無しさん
2006/11/05(日) 17:25:180532デフォルトの名無しさん
2006/11/05(日) 17:25:19qsort() 内部の要素比較再帰/ループで矛盾が生じるから。
0533デフォルトの名無しさん
2006/11/05(日) 17:28:30int 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;
}
0534デフォルトの名無しさん
2006/11/05(日) 17:55:32これまで、コンパイルできた古いソースが、コンパイラのバージョンを
上げたり、他のOS上でポーティングしようとした場合、エラーになること
があるのは当り前と考えるべきでしょうか。
ポーティングで気をつけるべき点があれば、ご教示ください。
0535デフォルトの名無しさん
2006/11/05(日) 18:06:59↓含めて C FAQ に一通り目を通し、規格に沿ったコーディングを心がけろ。
http://www.kouno.jp/home/c_faq/c16.html
0536デフォルトの名無しさん
2006/11/05(日) 18:12:42どうも、ありがとうございます。
でもね、誰が作ったわからない巨大なプログラムをポーティングするのは
つらいと思いませんか。コンパイラ以外でチェックする方法はないですかね。
ないでしょうね。
0537デフォルトの名無しさん
2006/11/05(日) 18:38:51ありませんね。だからこそ世界中で多数の人間が苦労しているわけで。
0538デフォルトの名無しさん
2006/11/05(日) 18:43:24なるほど、そうですよね。理解しました。
0539デフォルトの名無しさん
2006/11/05(日) 18:48:450540デフォルトの名無しさん
2006/11/05(日) 18:51:540541デフォルトの名無しさん
2006/11/05(日) 23:22:450542デフォルトの名無しさん
2006/11/05(日) 23:40:040543デフォルトの名無しさん
2006/11/06(月) 01:29:080544デフォルトの名無しさん
2006/11/06(月) 06:50:44一つの文字列につきメモリをその都度動的に確保し
逆順に並べ替えて、さらに出力行の最後の一文字目だけ大文字にして
出力するプログラム
(動的メモリ割り当て)
誰か教えて下さい
お願いします
0545デフォルトの名無しさん
2006/11/06(月) 06:55:02スレ違い。宿題スレ逝け。
http://pc8.2ch.net/test/read.cgi/tech/1161257941/
0546デフォルトの名無しさん
2006/11/06(月) 13:09:33list2を探索する時には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;
}
0547デフォルトの名無しさん
2006/11/06(月) 14:05:32一つ前のレスに手がかりがあるよ!
0549デフォルトの名無しさん
2006/11/06(月) 14:41:39要求されている通りの型で関数宣言して、その内部で自前の型にキャストして使ったほうが良いよ。
適合していない形式のものを無理矢理渡してしまう可能性があるからね。
0550デフォルトの名無しさん
2006/11/06(月) 22:22:00入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
0551デフォルトの名無しさん
2006/11/06(月) 22:51:130552デフォルトの名無しさん
2006/11/06(月) 23:06:08char buff[200];
printf("単語を入力しろ\n");
scanf("%s", buff);
printf("単語の長さ分の*を入力しろ\n");
scanf("%s", buff);
prinf("%s\nおわり\n", buff);
return 0;
}
0553デフォルトの名無しさん
2006/11/06(月) 23:08:070554デフォルトの名無しさん
2006/11/07(火) 13:50:580555デフォルトの名無しさん
2006/11/07(火) 16:57:34まずトイレへ行き、
0556デフォルトの名無しさん
2006/11/07(火) 17:51:080557デフォルトの名無しさん
2006/11/07(火) 18:28:350558デフォルトの名無しさん
2006/11/07(火) 18:45:070559デフォルトの名無しさん
2006/11/07(火) 18:45:520560デフォルトの名無しさん
2006/11/07(火) 18:48:450561デフォルトの名無しさん
2006/11/07(火) 18:58:270562デフォルトの名無しさん
2006/11/07(火) 19:34:55終わり。
0563デフォルトの名無しさん
2006/11/07(火) 19:53:39排便はコメントか文字列の中でしないとエラーになったと思うが・・・
0564デフォルトの名無しさん
2006/11/07(火) 20:30:140565デフォルトの名無しさん
2006/11/07(火) 21:08:410566デフォルトの名無しさん
2006/11/07(火) 21:14:570567デフォルトの名無しさん
2006/11/08(水) 01:20:54ここまでをまとめると、
Q:うんこがしたい
A:トイレへ行き 〜 中略 〜 後ろの穴を拡張しろ。
そろそろC言語の話をしようじゃないか。
0568デフォルトの名無しさん
2006/11/08(水) 02:23:57ビットシフトはなんの役に立つのでしょうか?
0569デフォルトの名無しさん
2006/11/08(水) 02:26:390570デフォルトの名無しさん
2006/11/08(水) 02:39:52printf("%s",kk); でも出力されなく、
for(i=0; i>5; i++){printf("%c",kk); でも出力されません。
何がいけないんでしょう?
0571デフォルトの名無しさん
2006/11/08(水) 05:00:410572デフォルトの名無しさん
2006/11/08(水) 05:32:04話はそれからだ。
0573デフォルトの名無しさん
2006/11/08(水) 05:45:37それなんか意味あるの? このスレ的に。
0574デフォルトの名無しさん
2006/11/08(水) 13:58:15環境。
0575デフォルトの名無しさん
2006/11/08(水) 17:05:470576デフォルトの名無しさん
2006/11/09(木) 05:44:11むしろコンパイル通ったのがすごい・・・
0577デフォルトの名無しさん
2006/11/09(木) 17:25:15int 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
となる理由教えてくだしゃい
0578デフォルトの名無しさん
2006/11/09(木) 17:30:100579デフォルトの名無しさん
2006/11/09(木) 17:40:140580デフォルトの名無しさん
2006/11/09(木) 17:47:083行目 struct PCS *next;
って、それ以前を見てもなんなのかわかんな〜い><
0581デフォルトの名無しさん
2006/11/09(木) 17:50:11こういうことか!ありがとうございました
typedef struct PCS PCS;
struct PCS {
int pc;
struct PCS *next;
};
ちなみにこうしてたから>>579書きました
struct PCS {
int pc;
struct PCS *next;
};
typedef struct PCS PCS;
何がしたかったんだ、、、。
0582デフォルトの名無しさん
2006/11/09(木) 18:07:470583デフォルトの名無しさん
2006/11/09(木) 18:30:050584デフォルトの名無しさん
2006/11/09(木) 20:16:34int pc;
PCS *next;
} PCS;
のほうが良くない?
0585デフォルトの名無しさん
2006/11/09(木) 20:23:100586デフォルトの名無しさん
2006/11/09(木) 20:48:04header.hにグローバル変数を書いて、両方でインクルードしてみたのですが、同名の別の変数になってしまいました。
何かいい方法はないでしょうか。
よろしくお願いします。
0587デフォルトの名無しさん
2006/11/09(木) 20:48:24int pc;
struct PCS_t *next;
} PCS;
のが良いな俺的には
0588デフォルトの名無しさん
2006/11/09(木) 20:54:01int pc;
struct _PCS *next;
} PCS;
0589デフォルトの名無しさん
2006/11/09(木) 21:03:25わざわざ別の名前つけて、しかもタグ名のほうは実装向けっぽい名前にするのは、
ヘッダの依存関係を減らすための前方宣言が使いにくくなるんでやめてほしい。
ひどいときには >>588 みたいに平気で予約名使う奴までいるし。
0590デフォルトの名無しさん
2006/11/09(木) 21:06:280592デフォルトの名無しさん
2006/11/09(木) 21:11:130593デフォルトの名無しさん
2006/11/09(木) 21:14:06先頭アンダースコアで英大文字続く識別子はすべて予約されている。
ユーザープログラムで使用した場合の結果は未定義となる。
0594593
2006/11/09(木) 21:15:300595デフォルトの名無しさん
2006/11/09(木) 21:17:40opaque な構造体と区別する理由は何?
0596デフォルトの名無しさん
2006/11/09(木) 21:19:13Typedefs 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.
0597デフォルトの名無しさん
2006/11/09(木) 21:22:27その理由なら typedef 全部お勧めできないだろ。 goto >>595
0599デフォルトの名無しさん
2006/11/09(木) 21:27:38ヘッダ(公開インターフェース)で定義(宣言だけじゃなくて)されている構造体。
0600デフォルトの名無しさん
2006/11/09(木) 21:31:51opaqueな状態だと詳細はパッケージの外からは見えないわけだから
許してやってもいいかなとおもっただけ.
パッケージ内ではtypedefされていない方でプログラムするって原則で...
サンキュー。
0602デフォルトの名無しさん
2006/11/09(木) 21:37:47詳細が見えなくても、 typedef は一度しか宣言できないのは変わらなくて、
typedef したヘッダを include しないと使えなくなるのも変わらない。
やっぱり全部やめたほうがいいと思うよ。
0603デフォルトの名無しさん
2006/11/09(木) 21:58:140604デフォルトの名無しさん
2006/11/09(木) 23:36:58いあ, まぁ, そなんだけどね…
っか, 前後の流れが…
おまえらなんで構造体をtypedefするんだよぉorz
0605デフォルトの名無しさん
2006/11/10(金) 00:04:09これぐらい慣れとかないと C++ でのーみそ破裂するぞ。
0606デフォルトの名無しさん
2006/11/10(金) 00:06:260607デフォルトの名無しさん
2006/11/10(金) 00:16:250608デフォルトの名無しさん
2006/11/10(金) 00:22:360609デフォルトの名無しさん
2006/11/10(金) 00:29:44C++ は使う時に struct 省略できるし、class だってあるだろ。
0610デフォルトの名無しさん
2006/11/10(金) 00:30:120611デフォルトの名無しさん
2006/11/10(金) 00:36:00C では許容されてる。
C++ では禁止されてるはずだけど何故か VC6 では動く。
0613デフォルトの名無しさん
2006/11/11(土) 00:18:55Win32 APIヘッダって規格の視点から見たら「ユーザープログラム」だよな。
何とかしてくれ
>>610
C++で禁止されてるのには理由もあるけどスレ違いな理由なのでここには書かない
0614デフォルトの名無しさん
2006/11/11(土) 00:52:430615デフォルトの名無しさん
2006/11/11(土) 00:54:250616デフォルトの名無しさん
2006/11/11(土) 00:57:37基本的には、買うもの。英語のドラフトでいいならダウンロード可能。
C なら >>485 。 C++ なら、 C++相談室のテンプレに同様のリンクが張ってあったはず。
0618デフォルトの名無しさん
2006/11/11(土) 09:10:260619デフォルトの名無しさん
2006/11/11(土) 09:20:43http://www.jisc.or.jp/
JIS検索→規格番号X 3010
ただしC99相当
0620デフォルトの名無しさん
2006/11/12(日) 21:54:32制限時間がきたら入力中止。
というプログラムを作りたいのですが
並列処理が必要なので手に余っています。
どなたかアドバイスおねがいします
0621デフォルトの名無しさん
2006/11/12(日) 22:17:17環境もGUIorCUIかも何も提示せずにそれだけで何か答えがもらえるか?
0622デフォルトの名無しさん
2006/11/13(月) 01:02:10どっちにしろ宿題スレ行きだとは思うが
0623デフォルトの名無しさん
2006/11/13(月) 01:14:290624デフォルトの名無しさん
2006/11/19(日) 14:13:23晒し
0625デフォルトの名無しさん
2006/11/19(日) 21:27:47笑いどころは void が暴れてるところ?
0626デフォルトの名無しさん
2006/11/20(月) 22:27:24具体的には
"r"で開いてscanfで読み込んだ後、"rb"にモードを変更して残りをfreadしたいのです
0627デフォルトの名無しさん
2006/11/20(月) 22:52:190628デフォルトの名無しさん
2006/11/20(月) 22:53:44freopen()
0629デフォルトの名無しさん
2006/11/20(月) 23:32:10なんでもかんでも環境依存で片付けるなよ
0630デフォルトの名無しさん
2006/11/21(火) 01:24:12POSIXでは全く同じ動作とされている。
0631デフォルトの名無しさん
2006/11/21(火) 01:28:48ただモードを変えたい、それだけだろ。動作は同じかどうかは
それこそ環境依存だが。相変わらずピンボケレスだな。
0632デフォルトの名無しさん
2006/11/21(火) 01:29:13アホか。逆だろ。「POSIXでは〜」ってのが環境依存って言うんだよ。
0633デフォルトの名無しさん
2006/11/21(火) 02:32:20お前が正しい。変なやつにマジレスするな。
0634デフォルトの名無しさん
2006/11/21(火) 10:56:24と言う話だろ。
Linuxのマニュアルでも"rb"を使うことは否定されていないのだし、>630の勇み足だな。
0635デフォルトの名無しさん
2006/11/21(火) 12:20:490636デフォルトの名無しさん
2006/11/21(火) 12:24:30634ちゃんと理解した?
0637デフォルトの名無しさん
2006/11/21(火) 12:27:30それはそうだが、標準でモードを切り替える方法は freopen() しかない。
使うんなら戻り値見てエラー処理しとけってことでいいだろ。
モード切り替えなくても良いようにできればそれがベストではあるんだけど。
0638デフォルトの名無しさん
2006/11/21(火) 12:53:260639デフォルトの名無しさん
2006/11/21(火) 13:02:00> freopen()ではシークしなおさなければならない
そんな制限あったっけ?
手元の MSDN にはそんなコト一切書いてないよ。
0640デフォルトの名無しさん
2006/11/21(火) 13:06:37でも、それは read と write を切り替える時は、と書いてある。
> "r+"、"w+"、または "a+" のアクセス種別を指定すると、読み出しと書き込みの
> 両方を行えます (ファイルは "更新" モードで開きます)。ただし、読み出しと
> 書き込みを切り替えるには、fsetpos、fseek、rewind のいずれかの関数を実行
> しなければなりません。fsetpos 関数または fseek 関数には、現在位置を指定
> できます。
0641デフォルトの名無しさん
2006/11/21(火) 13:42:53圧迫したぜ
0642デフォルトの名無しさん
2006/11/21(火) 14:46:28>、"r"と"rb"が違う環境ではそれを切り替える目的にfreopen()が使える
なんて何処にも記述されていない。
記述されているのは、
>どのようなモード変更を許すか、及びどのような状況での変更を許すかは、処理系定義とする。
だと言ってるんだが。
0643デフォルトの名無しさん
2006/11/21(火) 15:01:210644デフォルトの名無しさん
2006/11/21(火) 19:57:33とりあえずスレタイ見たら?
仕様どおりに実装していない処理系の話とかは各々のスレでよろしく
0645デフォルトの名無しさん
2006/11/21(火) 23:22:410646デフォルトの名無しさん
2006/11/22(水) 00:27:496.3.1.3 により、キャスト先の型の範囲に収まるまでその型の
最大値 +1 の数値が足される(または引かれる)。
型の最大値が処理系定義なんで、厳密には処理系定義なんだろうけど、
結果は十分予測できる。
0647デフォルトの名無しさん
2006/11/22(水) 13:15:56アンシ?アンサイ?アンスィイ?
それともエインスィイ?
0648デフォルトの名無しさん
2006/11/22(水) 13:19:50アンジー
0649デフォルトの名無しさん
2006/11/22(水) 13:41:47えーえぬえすあい
0650デフォルトの名無しさん
2006/11/22(水) 23:44:17ぬるぽ
0651デフォルトの名無しさん
2006/11/22(水) 23:45:11ありガとうございます!!
0652デフォルトの名無しさん
2006/11/23(木) 20:14:49ガッンジー
0653デフォルトの名無しさん
2006/11/24(金) 01:22:01ガッツリ
0654650
2006/11/25(土) 00:46:060655デフォルトの名無しさん
2006/11/25(土) 00:58:400656デフォルトの名無しさん
2006/11/28(火) 21:32:10if ( (*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') )
この条件を使ってしまっていいのでしょうか。
0657デフォルトの名無しさん
2006/11/28(火) 21:43:16#include<ctype.h>
isalnum(c)
あーまぁわざわざ車輪をもう一度作りたいなら一応アドバイスしておくと、
0-9の連続は規格で保障されている。
でもa-z,A-Zは保障されていないから厳密には駄目。
0658656
2006/11/28(火) 22:18:27isalnum(c)
ぬわあああああ
ありがとうございました。
0659416
2006/11/30(木) 01:56:33こういう関数って、どういうふうに実装されているんでしょうか?
if( c=='0'||c=='1'||c=='2'|| ・・・
||c=='a'||c=='b'||c=='c'|| ・・・
みたいに、一個ずつ比較するんでしょうか?
0660デフォルトの名無しさん
2006/11/30(木) 01:58:41つーか、スレ違い。
0661デフォルトの名無しさん
2006/11/30(木) 04:34:21普通はテーブル参照。
一度ctype.hを眺めてみそ。
0662デフォルトの名無しさん
2006/11/30(木) 05:40:40マクロで実装されている場合副作用がある式を渡しても誤動作してはならないとか
規定されてなかったっけ? その場合>>659はありえないという程度のことは
言えそうだけど
0663デフォルトの名無しさん
2006/12/01(金) 23:05:570664デフォルトの名無しさん
2006/12/02(土) 00:04:190665デフォルトの名無しさん
2006/12/05(火) 23:56:50ビットシフトはなんの役に立つのでしょうか?
0666デフォルトの名無しさん
2006/12/06(水) 04:02:06WindowsAPIではWORD型(2byte)を二つ合わせてDWORD型(4byte)を作るのとかに使われている
あとCPUの内部でも幾つかの命令を実装するのに使われているとか
例えば掛け算・割り算にもビットシフトを使っているらしい
まあ、始めたばかりなら当分使うことは無い
というか、最初はあまり高速化を意識しない方が良いから使い方は知らないでいい
ある程度自力で調べられるようになってサンプルコードとか見て回るようになると色々面白いコードが見つかったりする
ビット演算のスレもあるから、そのうち興味が湧いたらそっちも参考に
0667デフォルトの名無しさん
2006/12/06(水) 11:23:570668デフォルトの名無しさん
2006/12/06(水) 15:39:280669デフォルトの名無しさん
2006/12/06(水) 15:51:18あーあ〜
0670デフォルトの名無しさん
2006/12/07(木) 04:50:45メモリマップドIOを攻撃表示に!
0671デフォルトの名無しさん
2006/12/08(金) 17:55:30あるのでしたら教えてもらいたいのですが・・・
0672デフォルトの名無しさん
2006/12/08(金) 18:07:40処理系が許す限り。
0673デフォルトの名無しさん
2006/12/08(金) 21:33:56int hoge1=0;
int hoge2=0;
double hoge3=0.0;
{
// 関数の実装
}
みたいな形って最近のC言語の教科書ではあんまり見ないんですけど、古い仕様?
int piyo(int hoge1, int hoge2, int hoge3)
{
// 関数の実装
}
みたいに書くのと本質的な違いはあるんでしょうか?
0674デフォルトの名無しさん
2006/12/08(金) 21:44:22後者が新しい仕様、ANSIスタイルとも。もっともANSI Cは後方互換で前者も認めている。
前者だとプロトタイプ宣言で仮引数の型を指定しないことになる。
そのため前者だとfloat型引数はdouble型で渡されるが、後者だとfloat型で渡されるなどの違いが出てくる。
0675デフォルトの名無しさん
2006/12/08(金) 21:45:51size_tで表せる大きさ
0676デフォルトの名無しさん
2006/12/09(土) 15:55:11malloc実行時の環境依存
0677デフォルトの名無しさん
2006/12/09(土) 17:07:05�dクス
0678デフォルトの名無しさん
2006/12/10(日) 21:30:27が出来ないのですが、そうなっているのですか?
Adobe Reader 8
0679デフォルトの名無しさん
2006/12/10(日) 21:33:36画像形式になってる奴だろ。金払って買えってこと。
0680デフォルトの名無しさん
2006/12/10(日) 22:01:37紙スキャンでお茶を濁してるんじゃないのか
0681デフォルトの名無しさん
2006/12/11(月) 06:38:28でも表の中の文字はアウトライン化されてて検索できないという意味不明ぶり
0682デフォルトの名無しさん
2006/12/12(火) 20:56:210683デフォルトの名無しさん
2006/12/12(火) 21:12:170684デフォルトの名無しさん
2006/12/13(水) 00:39:13電子データ版のほうが「高機能」だと困るんだろ。
0685デフォルトの名無しさん
2006/12/13(水) 01:20:09それにしてもJIS規格とかには税金を投入して
もっと自由に便利に使えるようにして欲しい。
0686デフォルトの名無しさん
2006/12/13(水) 11:22:240687デフォルトの名無しさん
2006/12/14(木) 22:33:17まあ確かにその買った規格票はJIS X 0213:2004だったから
例示字形がアウトラインでなければならないのは当然なんだが
なぜかそれ以外の部分まで無意味にアウトライン化されてる。
http://www.itscj.ipsj.or.jp/ISO-IR/233.pdf
に付いているものにはちゃんとテキストデータが入ってるので
わざと削ってることは明白で、もうJISCは死んでくれとしか
0688デフォルトの名無しさん
2006/12/17(日) 16:28:31理解できるページがあればurlを教えて欲しいのです。
実際に動かせるソースファイル例等があればうれしいです。
お勧めの書籍等があればそれも是非お願いします。
forkとかwaitを理解する上で気をつけたほうがいいポイントとかがあったらそれも是非。。
私は、構造体とポインタをやっと理解した程度の初学者です、どうぞよろしくです。
0689デフォルトの名無しさん
2006/12/17(日) 16:38:56forkやwaitはOS固有のシステムコールであって、C言語標準のライブラリ関数ではないということ。
他のスレで聞けば親切に教えてくれる人がいると思うよ。
0690デフォルトの名無しさん
2006/12/19(火) 20:05:18聞くところを間違えたようですね、また改めて他所で聞いてみます。
0691デフォルトの名無しさん
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);
}
0692デフォルトの名無しさん
2006/12/26(火) 12:55:06> Integer
> Integer
> Integer
> Integer
ほほぅ…
0693デフォルトの名無しさん
2006/12/26(火) 12:59:44色々と論外だけど、せめてコンパイル通るようにしてから出直してください。
0694デフォルトの名無しさん
2006/12/26(火) 13:31:28バイナリでデータを読んで、書き出す間に0x00が混じってしまうようです。
どこでそうなるのかがわかりません。数値的には読み込んだ状態と
同じことを確認してから書き込んでいます。読み出しのときにすでに
エラーが発生しているのでしょうか?
0695デフォルトの名無しさん
2006/12/26(火) 13:33:46>for(i=0;i<8;i++){ m[i]=atoi(Itoa((I&atoI("11111111111111111111111111111111",2)))); I=(I>>32); }
~~~~ ~~~~
0696デフォルトの名無しさん
2006/12/26(火) 13:35:47そうかもね
そうじゃないかもしれないけど、型が分からないから正確なことは何一ついえないね
憶測だけどどこかアルゴリズム間違ってるか、ビット演算子を勘違いしていないかなと思うよ
気のせいかもしれないけど
(もしかしたら他に原因があるかもしれない)
みたいな感じ
0697デフォルトの名無しさん
2006/12/26(火) 13:37:040698デフォルトの名無しさん
2006/12/26(火) 13:41:170699デフォルトの名無しさん
2006/12/26(火) 13:48:05Integerはtypedefとかされてんのかな
ファイルポインタが宣言されてないがグローバル変数とかなのだろうか
あとreturnがない
0700デフォルトの名無しさん
2006/12/26(火) 13:53:330701デフォルトの名無しさん
2006/12/26(火) 14:04:29そうです
>>Integerはtypedefとかされてんのかな
昔のC++に付いて来た多倍長整数型です。
読み込みデータに問題はありませんでした。しかし演算の途中で0x00が
混じっていることは確かなようです。
0702デフォルトの名無しさん
2006/12/26(火) 14:20:43>そうです
…は?
>昔のC++に付いて来た多倍長整数型です。
…へ?
atoI() の第2引数は strtol() 同様、基数を与えているんだろう、くらいが
俺の超能力の限界。
0703デフォルトの名無しさん
2006/12/26(火) 14:21:09ありがとうございました。
0704デフォルトの名無しさん
2006/12/26(火) 14:22:140705デフォルトの名無しさん
2006/12/26(火) 14:26:440706デフォルトの名無しさん
2006/12/26(火) 14:30:52様にしているんですが、もし発生した場合、復号のときの逆関数で
0の部分を除去しなければならないはずなんですがいい方法が思い
つきません。何かいいアイデアがあったらよろしくお願いします。
0707デフォルトの名無しさん
2006/12/26(火) 14:40:450708デフォルトの名無しさん
2006/12/26(火) 14:45:210709デフォルトの名無しさん
2006/12/26(火) 14:47:30俺の知っている限り少なくともココ以外で、使っている"Integer"やらatoI()などを知っている環境依存なスレ/掲示板
だろうな
0710デフォルトの名無しさん
2006/12/26(火) 15:40:450711デフォルトの名無しさん
2006/12/28(木) 16:47:45http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
の日本語版とか
0712デフォルトの名無しさん
2006/12/28(木) 19:29:25JIS X 3010 プログラム言語C、ISO/IEC 9899 : 1999(標準C99)の翻訳。
ttp://www.jisc.go.jp
JIS検索→規格番号 X3010
0713デフォルトの名無しさん
2007/01/06(土) 23:39:16C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0714デフォルトの名無しさん
2007/01/07(日) 00:05:17廃れているではなく眠っている、だよ。
そして俺は質問に答えないね。すまん。
0715デフォルトの名無しさん
2007/01/07(日) 00:07:24もう寝る。
0716デフォルトの名無しさん
2007/01/07(日) 00:23:592のn乗の数での乗除算の代用で使うと少しだけ高速だったりする。
0717デフォルトの名無しさん
2007/01/07(日) 00:40:27昔はアプリレベルでも、1バイトとか1ワードを、数ビットごとに区切って
情報をもたせるとかやってたんで、そういうのを取りだしたり、セットしたりで
使ってた。
DOSとか、ファンクションコールを直接コールしたりすると、
ビット操作必須だったような記憶が。
BIOSとかも。
0720デフォルトの名無しさん
2007/01/07(日) 06:35:44ビットフラグは便利だべ
O_BINARY | O_CREAT みたいな感じで、一引数で渡したり出来る品
0721デフォルトの名無しさん
2007/01/07(日) 09:41:05そのビットフラグとやらにおいて、ビットシフトは何か意味があるのですか?
0722デフォルトの名無しさん
2007/01/07(日) 09:45:03#define BIT(n) (1u << (n))
として、
#define HOGE BIT(0)
#define HAGE BIT(1)
#define HIGE BIT(2)
とか。
0723デフォルトの名無しさん
2007/01/07(日) 10:54:34#define HAGE 2
#define HIGE 4
でいいだろ。
0724デフォルトの名無しさん
2007/01/07(日) 11:11:33分かりやすい方を使えば良い。
0725デフォルトの名無しさん
2007/01/07(日) 11:19:39よくない
というか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)
0726デフォルトの名無しさん
2007/01/07(日) 12:16:50>>725 は一見良さそうには見えるんだけど、どうなんだろうな。
一長一短で、>>722 と >>725 のどっちでもいい気がする。
0727デフォルトの名無しさん
2007/01/07(日) 12:22:40#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)
とするかも知らん。
0728デフォルトの名無しさん
2007/01/07(日) 12:49:38MAKEWORD マクロとかも、(a << 8) + b だった気がする。
0729デフォルトの名無しさん
2007/01/07(日) 17:12:210730デフォルトの名無しさん
2007/01/07(日) 17:22:29C言語は標準ではinline関数をサポートしていません。以上。
0731デフォルトの名無しさん
2007/01/07(日) 17:31:23C99で標準に採用されたハズですが。
0732デフォルトの名無しさん
2007/01/07(日) 17:34:50・・・
意味規則 inline関数指定子で宣言された関数は,インライン関数(inline function)とする。
この関数指定子は複数回出現してもよいが,1回だけ出現したときと同じ動作とする。
関数をインライン関数にすることは,その関数の呼び出しを可能な限り速くすることを示唆する。
この示唆の効果を持つ程度は,処理系定義とする。
・・・
0733デフォルトの名無しさん
2007/01/07(日) 21:30:420734デフォルトの名無しさん
2007/01/08(月) 07:23:38inline 関数をいじった時に、
その定義を参照している全ての .c ファイルを
コンパイルし直さないといけない。
0735デフォルトの名無しさん
2007/01/09(火) 12:35:580736デフォルトの名無しさん
2007/01/09(火) 23:17:05古参しかいないスレなんてすぐ消えるよ
0737デフォルトの名無しさん
2007/01/10(水) 20:34:32学校の課題にだされて・・・
詳しいコメントつきで誰かお願い!!
0738デフォルトの名無しさん
2007/01/10(水) 20:49:115x5の二次元配列にa-z(j除く)ぶっこんで
あとはexcelの要領で
0739デフォルトの名無しさん
2007/01/10(水) 21:19:14できっかな・・・
0740デフォルトの名無しさん
2007/01/10(水) 21:57:480741デフォルトの名無しさん
2007/01/10(水) 22:18:080742デフォルトの名無しさん
2007/01/10(水) 22:34:46ありがとうございました、理解しました
0743デフォルトの名無しさん
2007/01/10(水) 23:38:11for( 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などのライブラリの関数が終了しない)に陥り、解決したことがある方
がいらっしゃいましたらどのような場合だったのか教えて頂けないでしょうか。
上の例は動くはずです。
0744デフォルトの名無しさん
2007/01/10(水) 23:46:39>のような感じで
大事なところを隠すな。ボケ。
バグの原因を聞くのであれば、
変に省略せずにソースを丸々貼ること。
>>743 みたいな聞き方をしている奴のバグは、大抵
「省略しているところ」にバグがあるから。
0745デフォルトの名無しさん
2007/01/10(水) 23:48:25問題が再現する最小のソースを作ってみな。
大方はその途中で原因に気づくだろうが、もしも
わからなければその最小ソースを貼ってみれ。
0746デフォルトの名無しさん
2007/01/11(木) 00:41:420747デフォルトの名無しさん
2007/01/11(木) 02:54:28[##]でgoogleかけても1件もでてこないです。
0748デフォルトの名無しさん
2007/01/11(木) 03:38:100749デフォルトの名無しさん
2007/01/11(木) 13:30:26なにをしていいのかわからんのです。
誰かプログラム持ってないですか?
0750デフォルトの名無しさん
2007/01/11(木) 13:32:50そういうのは「作ろうとしてる」とは言わない。
そしてスレ違い。
0751デフォルトの名無しさん
2007/01/11(木) 13:34:380752>>749
2007/01/11(木) 13:36:25の条件式を用いて誤差を最小にすればいいのだろうけど。。。
手順がわかりませんのです。。。
どこのスレなら教えてくれるだろうか・・・
0753デフォルトの名無しさん
2007/01/11(木) 13:47:39まずは自分で書かなきゃ、どこでも教えてくれないよ。
何を教えたらいいのかわからないもんね。
逆にとりあえずC言語で書いてみて、それでも
うまくいかないということでそのソースと具体的な
問題点を貼れば、このスレの範疇に入るだろう。
どっちかと言うと↓かもしれないけど。
http://pc10.2ch.net/test/read.cgi/tech/1164376287/
0754デフォルトの名無しさん
2007/01/11(木) 17:03:07とりあえず言語がどうとかプログラミングがどうとかいう以前に問題把握してないんだろう
教授に聞け
0755デフォルトの名無しさん
2007/01/11(木) 19:54:060756デフォルトの名無しさん
2007/01/15(月) 02:04:180757デフォルトの名無しさん
2007/01/15(月) 05:45:27C99ではcase str[]で可変長メンバを表せる。
0758デフォルトの名無しさん
2007/01/15(月) 05:46:000759デフォルトの名無しさん
2007/01/15(月) 06:12:57mallocするときのサイズに細工して
可変長メンバのように使うんだったかな?
0760デフォルトの名無しさん
2007/01/15(月) 06:45:54http://pc10.2ch.net/test/read.cgi/tech/1164376287/908
なんでわかったかって?
俺が書いたからだよ!
0761デフォルトの名無しさん
2007/01/15(月) 06:51:33> ANSI Cではこれは反則。でも大抵の処理系では動く。
> C99では専用の書き方(char s[])があるけど。
0762デフォルトの名無しさん
2007/01/15(月) 16:22:300763デフォルトの名無しさん
2007/01/15(月) 17:02:39環境依存。
0764デフォルトの名無しさん
2007/01/15(月) 17:02:550765デフォルトの名無しさん
2007/01/15(月) 17:21:530767デフォルトの名無しさん
2007/01/15(月) 19:55:510768デフォルトの名無しさん
2007/01/15(月) 19:56:530769デフォルトの名無しさん
2007/01/15(月) 19:57:57bccならこっちでどうぞ
http://pc10.2ch.net/test/read.cgi/tech/1135127048/l50
0770デフォルトの名無しさん
2007/01/15(月) 20:18:410771デフォルトの名無しさん
2007/01/15(月) 20:27:530772デフォルトの名無しさん
2007/01/15(月) 20:50:27素直にbccスレに行け。
0773デフォルトの名無しさん
2007/01/15(月) 21:29:25http://pc10.2ch.net/test/read.cgi/tech/1168708801/l50
な。もう一度だけ言うといずれにしてもここはスレ違いだから
0774デフォルトの名無しさん
2007/01/15(月) 21:39:020775デフォルトの名無しさん
2007/01/15(月) 21:40:570776デフォルトの名無しさん
2007/01/15(月) 23:45:240777デフォルトの名無しさん
2007/01/17(水) 11:12:55using 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の文字をそのまま整数として吐き出せるんでしょうか?
0778デフォルトの名無しさん
2007/01/17(水) 12:48:510779デフォルトの名無しさん
2007/01/17(水) 14:57:55言ってもいいかな?言っちゃうよ?
それ C++ だヴォケ。
0780デフォルトの名無しさん
2007/01/17(水) 15:17:020781デフォルトの名無しさん
2007/01/17(水) 18:32:08ある必要なライブラリを追加したとたんリンクエラーになるという現象が起こったとき、
原因はそのライブラリファイルにあるということでいいんですか?
0782デフォルトの名無しさん
2007/01/17(水) 18:56:00メモリーが足りない場合は君の環境が原因なわけだし。
そして多分スレ違い
0783デフォルトの名無しさん
2007/01/17(水) 19:08:30コンパイルが通ることと、リンクが通ることは別です。
そのライブラリが原因かどうかはわかりません。
コンパイルとリンクを区別して(できて)いるのかいないのか、微妙だなぁ。
>ある必要なライブラリを追加したとたんリンクエラーになる
まるでそのライブラリを追加する前はリンクエラーにならなかったかのようだが、んなワケないよなぁ。
0784デフォルトの名無しさん
2007/01/17(水) 19:20:17> ある必要なライブラリを追加したとたん
要するに、
「今まではコンパイル(リンクまで?)通った」が
「そのライブラリが必要になった」
ということは
「コードを書き換えた」
んだろ?
んなら、書き換えたコードの問題である可能性が一番高い。
0785デフォルトの名無しさん
2007/01/18(木) 15:49:38オブジェクトファイル単位でリンクされるわけだが
自分の書いたコードと名前が被ってたらエラーになるな。
まあ >>782 の最初と最後の行に同意。
0786デフォルトの名無しさん
2007/01/19(金) 17:42:37#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) になり、
正しく動作することは保障されるでしょうか?ご教示お願いします。
0787デフォルトの名無しさん
2007/01/19(金) 20:50:52規格は、構造体や共用体の内部構造について何らの規定もしていない。
最初のメンバの先頭や、後に続く各メンバの隙間につめものがされていて、
きっと同じアドレスを持っているだろうと思っていたメンバが、実は違う場所にあるかもしれない
(だいたい、宣言時の配列の大きさを越えたアクセスの結果は未定義である)。
多くの処理系では期待したように動くかもしれない。
しかしその裏づけを規格に求めようとするのは本末転倒だ。
そんな気色の悪いコードを考えている暇があったら、
本当に自分の実現したかった機構が何であり、
それをどうやったら明快なコードで表現できるかを考えるほうが、よほど有意義である。
0788デフォルトの名無しさん
2007/01/19(金) 21:06:26int v[2];
v[first]=334;
v[second]=666;
printf("first=%d, second=%d\n", v[0], v[1]);
すっきり
0789デフォルトの名無しさん
2007/01/19(金) 21:24:510790デフォルトの名無しさん
2007/01/19(金) 21:56:200791デフォルトの名無しさん
2007/01/19(金) 23:23:26たぶんシンボリックにも配列的にも扱える変数のセットがほしいんだろうが、
Cでそれをやりたいなら>>788の言うとおり列挙体を使って添字をシンボル化するのが
おそらく最も自然な解になると思う(defineしてもいいが、数が多くなるとつらい)
0792デフォルトの名無しさん
2007/01/19(金) 23:30:34とりあえず 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) は保証されない。
0793デフォルトの名無しさん
2007/01/19(金) 23:39:17もしuとvの距離が0でないならそんなもの動くはずがない
0794デフォルトの名無しさん
2007/01/19(金) 23:42:18とにかく。とりあえず動きそうなコードを書いてから
規格に適合するかを気にするんじゃなくて、
規格に適合するようにコードを書け。最初から。
0795デフォルトの名無しさん
2007/01/19(金) 23:50:01v[LENGTH];
俺だったらこうするかも
0796デフォルトの名無しさん
2007/01/19(金) 23:58:38寝よう・・・orz
0797786
2007/01/20(土) 08:53:13現在、言語処理系をコーディングしているところで、
演算子と関数を同じ構造体で表すとき、u->left、u->rightとアクセス出来ると
非常に直感的だった為、この様な記述をするに至りました。
(関数は引数が可変なので配列として、二項演算子はleft・rightとしてアクセスしたかった、という意味。)
>>788 氏の提案された方法が非常に良いと感じましたので、この方法を取らせていただきます。
本当にありがとうございました。
0798デフォルトの名無しさん
2007/01/21(日) 03:24:46なんで演算と関数を同じ構造体で扱わなきゃならんのかがわからんが
0799デフォルトの名無しさん
2007/01/21(日) 07:20:50OOPLでもなければ。
0800デフォルトの名無しさん
2007/01/21(日) 11:58:28#defineとconstのどちらを、みなさんは使っていますか?
それぞれの使う、メリット・デメリットがあれば教えてください。
それとも、ただ単に好みの問題?
0801デフォルトの名無しさん
2007/01/21(日) 12:52:380802デフォルトの名無しさん
2007/01/21(日) 14:06:28よって定数式が必要なところには使えないので単純に#defineに劣る
意味のある数字が必要なときやビットパターンが必要なときは#defineを使え
ケースを区別するためのシンボルが必要なとき、
または各シンボルが連続した数値と結びついているときはenumを使え
0803デフォルトの名無しさん
2007/01/21(日) 14:25:37+ sizeof(int) * N なんてやってる理由がわからなかったが、そういうことか
規格準拠で作りたいなら最初からNの配列を作るか素直にポインタにmallocしろ
0804デフォルトの名無しさん
2007/01/23(火) 16:34:31うまくインクルードする方法はないでしょうか?
0805デフォルトの名無しさん
2007/01/23(火) 16:50:39いくらなんでも、それはひどすぎじゃ? <20MBほどのインクルードファイル
コンパイラが処理しきれなかった ってことだから、
コンパイラのオプションでなんとかなるかもしれないがわからん
# バイナリイメージを埋め込もうとしたのかねぇ…
# VC6 include 以下全てのファイルで 約30MB だしなぁ…
0806デフォルトの名無しさん
2007/01/23(火) 16:54:140807デフォルトの名無しさん
2007/01/23(火) 18:00:38ありがとう。そうします。
0808デフォルトの名無しさん
2007/01/23(火) 21:13:43Visual C++ならコンパイラオプション/Zm
0809デフォルトの名無しさん
2007/01/26(金) 16:42:14最終的な答えになるか説明してくれ
0810デフォルトの名無しさん
2007/01/26(金) 17:34:02左カッコが足りないのでダメ
0811デフォルトの名無しさん
2007/01/26(金) 17:52:40本質的にそれはC言語そのものとは何の関係もない
0812デフォルトの名無しさん
2007/01/26(金) 18:22:41マジレスすると、普通のコンパイラーは定数項にしちゃう
0813デフォルトの名無しさん
2007/01/26(金) 18:38:022番目の要素を先頭とするにはどうすればいいのでしょうか?
標準ライブラリの機能でそういうのないですか?
0814デフォルトの名無しさん
2007/01/26(金) 18:40:18>MOV ソース、ディステネーション & セグメントレジスタに注意
0815デフォルトの名無しさん
2007/01/26(金) 18:45:380816デフォルトの名無しさん
2007/01/26(金) 19:35:270817デフォルトの名無しさん
2007/01/26(金) 19:45:160818デフォルトの名無しさん
2007/01/26(金) 19:50:48memmove(array,array+1,sizeof(array)-sizeof(array[0]));
0819デフォルトの名無しさん
2007/01/26(金) 19:55:34まず物事を厳密に表現できるようになれ
話はそれからだ
0820デフォルトの名無しさん
2007/01/26(金) 20:33:10本当にそれがやりたいことなら、>>818のようにmemmove()を使えば良い。
が、それは高くつく処理だ。
配列の先頭、末尾を示すカーソルを持っておき、配列を環状バッファとして
使う手もあるぞ。その場合は先頭を示すカーソルをずらすだけだ。
0821デフォルトの名無しさん
2007/01/27(土) 00:16:570822デフォルトの名無しさん
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 ってどういう働きをしているんですか?
これが無かったらどうなるのでしょうか?
教えてください。
0823デフォルトの名無しさん
2007/01/28(日) 23:49:32> これが無かったらどうなるのでしょうか?
バッファオーバフローは未定義動作なのでこのスレ的には何が起きるのか
誰にもわからない
0824デフォルトの名無しさん
2007/01/28(日) 23:58:18mainの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に残っていないかを見ること。
0825デフォルトの名無しさん
2007/01/29(月) 04:13:48ダブルクォーテーションが使えないのは何故ですか?
書籍やWebサイトでは、シングルクォーテーションを使うように書いてありますが、
何故そうするべきなのかという記述は見当たりませんでした。
0826デフォルトの名無しさん
2007/01/29(月) 04:24:03その文字列が格納された0終端配列へのポインタと解釈される。
0827デフォルトの名無しさん
2007/01/29(月) 04:48:540828826
2007/01/29(月) 05:14:03何故そうするべきなのかという質問の意図するところは結局、
それを決めた人間が何故そう決めたのか、その理由を知りたいということなのさ。
その程度がエスパーできずにどうする。
0829デフォルトの名無しさん
2007/01/29(月) 05:24:24つまり{'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";として「これは文字列なんですよ」と宣言しないといけない。
解った?
0830デフォルトの名無しさん
2007/01/29(月) 05:38:35どーでもいいが
> {"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
0831829
2007/01/29(月) 05:55:57ごめん。そこはミスった。
0832デフォルトの名無しさん
2007/01/29(月) 05:56:13リテラルと整定数を
見た目で簡単に区別できるようにするためだろ?
その程度も想像出来ないなんて、本物のバカ^H^Hゆとり世代としか思えない。
0833予測される反論
2007/01/29(月) 07:45:05なんでCでは区別しないといけないんですか?
0834デフォルトの名無しさん
2007/01/29(月) 10:16:440835デフォルトの名無しさん
2007/01/29(月) 10:56:510836デフォルトの名無しさん
2007/01/29(月) 11:02:16おおよそ、数値とその集合の配列/リストは等しく取り扱わないだけなんだろう。
0837デフォルトの名無しさん
2007/01/29(月) 11:55:09理由になって無い件について
0838デフォルトの名無しさん
2007/01/29(月) 13:02:15×Java
○Perl, Python
0839デフォルトの名無しさん
2007/01/29(月) 14:46:29char a='A';
int i = 100;
の「'A'」や「100」もリテラルですよ。
0840デフォルトの名無しさん
2007/01/29(月) 15:53:07文字列リテラルと〜」みたいに、あたかも文字列の事を
「リテラル」っていう専門用語のように表現する事が多いからね。
0841デフォルトの名無しさん
2007/01/29(月) 18:42:32double 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です。
0842デフォルトの名無しさん
2007/01/29(月) 18:55:510843デフォルトの名無しさん
2007/01/29(月) 19:49:500844デフォルトの名無しさん
2007/01/29(月) 20:58:40それはダメ。
>>841
scanf()の食い残しが残っているから、scanf()直後に空読みすればいい。
0845デフォルトの名無しさん
2007/01/29(月) 21:21:340846デフォルトの名無しさん
2007/01/29(月) 21:24:05問題の解決になってませんが。
0847デフォルトの名無しさん
2007/01/29(月) 21:31:29if(b == 'Y') ...;
これでOK?
0848デフォルトの名無しさん
2007/01/29(月) 22:23:34保証されてたっけ?
0849デフォルトの名無しさん
2007/01/29(月) 22:27:51scanfはあまりおすすめしないんだけどね
(実際こーゆーややこしい問題が起きるし)
ちょっとでも規定と違ったらバッサリエラーにするか、
fgetsでまるごと引き抜いて独自に解釈するのが良い
0850デフォルトの名無しさん
2007/01/29(月) 22:32:48とりあえず、おかしいと思ったら関連する変数の値をすべて調べてみること。
この場合はnとbに何が取り込まれたかを見ろ。
あとは関数の仕様をしっかりと読めば何が起きたかを類推できる。
0851デフォルトの名無しさん
2007/01/29(月) 23:12:40(配列を+1個分用意している実装が普通)
が、8bit符号付charで不具合が出る可能性があるはず。
特に日本語化されてないコンパイラ付属のライブラリは怪しい。
規定は知らんが。
0852デフォルトの名無しさん
2007/01/29(月) 23:29:40このスレ的にはそれが一番知りたいんだが…
0853デフォルトの名無しさん
2007/01/29(月) 23:32:49scanfは普通、その終了時に、標準入力の最後に付加されている「\n」をストリームに放置する。
これはscanfが、特別な指定のない限りは、変換されなかった入力を棄てずに残すからである。
次にscanfを呼んで、最初の変換指定子が数値用のものであればこの\nは棄てられるが、
%cや%sを指定したり、fgetsやgetc(getchar)を使うとそのまま(しかも即座に)取り込まれて
しまって問題が起きることになる。
一般に言って、標準入力を読むときにscanfを使う場合はscanfだけを使うべきである。
fgetsやgetcを混ぜて使うべきではない。また最初の変換指定子が%cや%sである場合は、
前の入力の\n(正確には「 」と「\t」をも含む空白文字)を読み飛ばすことを明示するために、
" %c" のように書かなければならない。
0854853
2007/01/29(月) 23:40:540855デフォルトの名無しさん
2007/01/29(月) 23:47:27すばらしい説明です。
0856デフォルトの名無しさん
2007/01/30(火) 00:03:50>↑訂正。%sの場合は問題ない。%cだけが問題。
いいえ。%cだけではありません。
0857デフォルトの名無しさん
2007/01/30(火) 00:12:39scanfはそもそも連続したデータをいっぺんにざばーっと取り込んで
処理をするための関数で、人間と対話的に入出力を繰り返すのには向いてない
理由は>853にあるとおり、余分な入力でも捨てないでストリームに残しておくためだ
たとえば>841の「項数n=」のときに「1 hogehoge」と入力したら、
値1がnに読み込まれたあとでも「 hogehoge」はストリームに残っている
ここに一体なにが入っているのかを予想する方法はない(人間のやることだから)
どうしてもscanfを使いたいなら、というか標準入力を使って対話的に人間と
データをやりとりしたいなら、一回一回ストリームを確実に空にする方法を考えること
それぐらいは自分でやれ、というか、それができないならどうせ問題が起きる
0858デフォルトの名無しさん
2007/01/30(火) 00:25:19%[]もだったな。あと%nはないのと同じ。
0859デフォルトの名無しさん
2007/01/30(火) 00:28:58単に役に立たないだけならまだしもFormat bugでバリバリ活躍してくださるな。
でも実装しないと規格適合は名乗れないという
0860デフォルトの名無しさん
2007/01/30(火) 00:37:20ないのと同じってのは先頭の指定子としてみなせないって意味だろ
0861デフォルトの名無しさん
2007/01/30(火) 00:49:40ごめん全てのOSで使える保証はなかったね
0862デフォルトの名無しさん
2007/01/30(火) 00:54:16たぶんfgetsで読んでstrtokで切り分けて
atoiなりstrtodなりで解釈するのが正しいんだろうが
そのためにはまずポインタの何たるかを教え込まなきゃならんので
手順的にできないのだろう
でもscanfも本当はポインタ理解してないと使いこなせないのだが
0863デフォルトの名無しさん
2007/01/30(火) 00:54:320864デフォルトの名無しさん
2007/01/30(火) 00:55:020865デフォルトの名無しさん
2007/01/30(火) 00:57:26fgets()からsscanf()なら、そんなにむずかしくないでしょ。
0866デフォルトの名無しさん
2007/01/30(火) 01:01:01でも使いこなすより先に見限る率のが高い気ガス
そしてついでに見限られるfscanf/sscanf
0867デフォルトの名無しさん
2007/01/30(火) 01:04:410868デフォルトの名無しさん
2007/01/30(火) 01:05:03使えることは使えるだろうけど、所謂コマンドラインOS同様に
実行時引数をスパっと打ちこめるかどうかはわからない
(たとえばWindowsの.lnkのプロパティに細工するようなことを
しなきゃいけないかもしれない)
そうなるとちょっと入力手段としては問題がある
0869デフォルトの名無しさん
2007/01/30(火) 01:09:13入力バッファのクリアが、気持ちいい解決方法がない。
ちょっと手間が増えるだけの、fgets()+sscanf()ですっきり解決するから、つかう価値が見出せん。
0870デフォルトの名無しさん
2007/01/30(火) 01:15:14でも行をscanf()で数えるのは厳しいw
#include <stdio.h>
int main()
{
int n = 0;
while (scanf("%*s") != EOF)
++n;
printf("%d words\n", n);
return 9;
}
0871デフォルトの名無しさん
2007/01/30(火) 01:26:39scanf("%s",s);
}while(strcmp(s,"Y")==0);
のようにするだけでもそれなりだと思うけどね
scanfで%cなんか使うもんじゃないよ
0872デフォルトの名無しさん
2007/01/30(火) 01:27:58なにその超力技志向
0873デフォルトの名無しさん
2007/01/30(火) 01:33:38形態素解析システム「ChaSen」の機能を組み込むにはどうすればいいでしょうか
ユーザの打ち込んだ文章を形態素解析して品詞別に表示させたいのですが・・・
ぐぐってもなかなかよい判例が見つかりませんお願いします
0874デフォルトの名無しさん
2007/01/30(火) 01:37:24ソースみるのが一番はやいいと思うのだが。
0875デフォルトの名無しさん
2007/01/30(火) 01:48:33どれがソースなのかすらさっぱり分からない状態です
0876デフォルトの名無しさん
2007/01/30(火) 02:03:03黙って公式文書を全部読め
0877デフォルトの名無しさん
2007/01/30(火) 02:03:570878デフォルトの名無しさん
2007/01/30(火) 05:25:580879デフォルトの名無しさん
2007/01/30(火) 05:32:410880デフォルトの名無しさん
2007/01/30(火) 05:40:440881デフォルトの名無しさん
2007/01/30(火) 06:24:300882デフォルトの名無しさん
2007/01/30(火) 11:43:57>880 ご苦労様です。
>881 セオリーですな。
>878 DialogBoxですが、何か?
0883デフォルトの名無しさん
2007/01/30(火) 16:11:56それから malloc して、そこに入れることになるね。
0884デフォルトの名無しさん
2007/01/30(火) 16:50:54〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
【出力例】
日付を入力してください(MM/DD):12/24
12月24日は日曜日です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
この問題についてなんですが配列を使うとは思うんですがどのようにすれば配列で○月○日は○曜日と出せれるようなるのかがわかりません
どなたかお願いします
0885デフォルトの名無しさん
2007/01/30(火) 17:14:34宿題スレ逝け
0886デフォルトの名無しさん
2007/01/30(火) 17:21:27キーボード入力で入れても画面上に表示されますが、
タブの表示に \t があるということは
表示されたとしても処理上はキーボード入力でのは
よろしくないと言う事なのでしょうか?
0887デフォルトの名無しさん
2007/01/30(火) 17:30:150888デフォルトの名無しさん
2007/01/30(火) 17:33:07何を心配してるのかよくわからないけど、
タブを処理しないソフトにタブを入力してもきっと無視されるだけでしょう。
0889デフォルトの名無しさん
2007/01/30(火) 17:40:43質問なのですが画面への表示にタブを \t を使ってではな(く)、
キーボード入力で入れても画面上に表示されますが、
タブの表示(用リテラル)に \t があるということは表示されたとしても
処理上はキーボード入力での(タブのリテラル指示)はよろしくないと言う事なのでしょうか?
printf("<タブキー叩いて得られるTABリテラル>"); と printf("\t"); との差はどうよ?
ソースを印刷したり、空間が開くことより1文字であることが重要な場合(n個のスペースで代用不可)は
明示的に \t としてるな。
0890886
2007/01/30(火) 17:54:18拙い質問の仕方ですみません、
>>889で補間して下さりありがとうございます。
\tを使わずタブキー入力での場合に
処理上で問題があるかどうか知りたかったのですが申し訳ないです。
0891デフォルトの名無しさん
2007/01/30(火) 18:07:410892デフォルトの名無しさん
2007/01/30(火) 18:38:051次元配列に置き換えたらどうかけるんでしたっけ・・・
0893デフォルトの名無しさん
2007/01/30(火) 19:38:39例)
int a[ROW*COL],i,j;
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
a[i*COL+j]=0;
}
}
0894デフォルトの名無しさん
2007/01/30(火) 19:45:36どうもありがとう
0895デフォルトの名無しさん
2007/01/30(火) 19:46:29言語とは関係ないぞ
0896デフォルトの名無しさん
2007/01/30(火) 19:59:13処理上問題はないはずだが、それに何かメリットがあるとは到底思えない
素直に\tを使え
0897デフォルトの名無しさん
2007/01/30(火) 20:25:06ど忘れしちゃったもんで
0898デフォルトの名無しさん
2007/01/30(火) 20:28:46要するに、何も理解してないということだ。
0899デフォルトの名無しさん
2007/01/30(火) 20:30:43教えろ
0900デフォルトの名無しさん
2007/01/30(火) 20:32:330901デフォルトの名無しさん
2007/01/30(火) 21:33:12マリオやろうと思うんだけど、マリオの練習ってドラクエのハードでもできるか?
教えろ
0902デフォルトの名無しさん
2007/01/31(水) 07:50:45以下全部、俺の推測・妄想。
エスケープシーケンスはコンパイル時に処理系により(文字コードにより?)適応したリテラルに置き換えられる。
例えば俺の処理系で"\t"をコンパイルしたら0x09(ASCII・Unicode等のHorizontal Tabulation)に置き換えられた。
でも別の処理系なら別のコードがリテラルとして出るかもわからんし、なまけものの俺は調べるのもめんどい。
対してソース書いてる時に得られたTABコードのリテラルはその時の環境によって違うだろう。
ASCII・うにこーど・EUCのHTは全部0x09ってとこまでは知ってるけど、他の全部の文字コードも同じか
そうかって言われたら俺にはわからんし、調べるのもめんどくさい。つまり得られるリテラルは
ソース書いてる時の環境によって変わる可能性がある。これは再現性の観点から避けたい。
だから俺は普通に"\t"でタブコード出した方がいいんじゃないかと思うよ。
見直したら全然答えになってないし間違ってるかも知れないけど折角書いたから送信。
0903デフォルトの名無しさん
2007/01/31(水) 07:56:46ほかのa-zA-Zなんかも違う可能性があるわけだが。
0904デフォルトの名無しさん
2007/01/31(水) 07:59:45だからこそ'a'と書くのであって、0x61と書いちゃいけないわけだ。
当然、a >= 'a' && a <= 'z'なんてもってのほかだな。
0905デフォルトの名無しさん
2007/01/31(水) 08:01:20'[タブ]'も変換してくれるんじゃないの。
0906デフォルトの名無しさん
2007/01/31(水) 08:53:15'\x9' が symbolic な tab になることはまずなさそうだな
0907デフォルトの名無しさん
2007/01/31(水) 10:31:08なんでだよ?
0908デフォルトの名無しさん
2007/01/31(水) 12:49:220909デフォルトの名無しさん
2007/01/31(水) 14:48:25> ASCII非対応で標準C適合な環境など存在しません
あるよ
0910デフォルトの名無しさん
2007/01/31(水) 15:33:23ANSI準拠ならASCII準拠なのは決まってるんじゃないの?
0911デフォルトの名無しさん
2007/01/31(水) 15:49:52違う。
Cの概念において、文字は数値と等価である。
これはコンピュータというもの自体においてそうであり、
そしてCがコンピュータを非常に低いレベルで扱える言語だからである。
これはCの規格自身は文字の見かけというものに一切関心を持たないことを意味する。
入力された数値を文字として表示したり、エスケープシーケンスを
(そのマシンでの)適切な文字コードに変換するのは、そのマシンのOSや、
ソースを編集するエディタや、そのマシン用のコンパイラであって、Cの規格ではない。
わかりやすい例を出すと、Windowsでの改行コードは
実際には改行と復帰という2バイトのコードからなるが、
fopen()でテキストモードを指定して「\n」を書き込めば
それはコンパイラが適切なコードに変換してくれる。
0912デフォルトの名無しさん
2007/01/31(水) 16:00:31×コンパイラが適切なコードに変換してくれる
○コンパイラが適切なコードが書き込まれるようにしてくれる
0913デフォルトの名無しさん
2007/01/31(水) 16:18:01>>905
どんな場合であれ、コンパイラは文字リテラルを数値データとして解釈するから、
タブと他の文字とで扱いが違うということはない。
開発環境と実行環境の文字セットが同じならそのまま使用されるし、違うなら適宜変換してくれる。
もしソースコードを別の文字セットの環境で再利用したいという場合でも、
ソースコードをその環境に持ち込む時点で文字コード変換が行われているはずで、
つまりタブもその環境での正しいダブのコードになっている。
0914デフォルトの名無しさん
2007/01/31(水) 16:44:18ただし、元のテキストファイル中のタブをスペースに変換して表示したり、
ファイルを保存する際にタブをスペースに変換する機能を持つエディタというものが
実際には存在するし、そういったエディタでついうっかりタブリテラルを含む
ソースコードを編集してしまうということは十分考えられる。
この危険性を受容してまで「\t」を使わない積極的な理由は考え付かない。
0915デフォルトの名無しさん
2007/01/31(水) 19:08:11"\t"って書かれる方が見やすいよね(´・ω・`)
0916デフォルトの名無しさん
2007/02/01(木) 00:08:03sizeof( 'a' ) は4となる(intが4バイトの場合)
char型で扱っても何の不都合はないのに、
どうして文字定数はint型なんだろう?
0917デフォルトの名無しさん
2007/02/01(木) 00:20:54getcのようにchar相当の値を返す関数が、エラーを知らせるために
charにない値(EOF)を返して、それを適切に比較できるようにするため
0918デフォルトの名無しさん
2007/02/01(木) 00:33:39intである必要はないと思うのだが。C++ではcharだし。
0919デフォルトの名無しさん
2007/02/01(木) 00:34:06数字の 0 から 9 までが連続してるってことだけだよな?
例えば A 〜 Z が連続である必要性は無いし、
事実 EBCDIC では連続してない。
0920デフォルトの名無しさん
2007/02/01(木) 00:35:39char にしてもあんま意味が無いよね。
C++ だとオーバーロードの呼び分けとかで必要になってくるけど、
C だとそういうのないし。
0921デフォルトの名無しさん
2007/02/01(木) 00:37:17どうせリテラルはint境界に従って配置されるだろうし、
式を評価する時点で整数はみんな暗黙にintになるから。
0922デフォルトの名無しさん
2007/02/01(木) 00:40:35文字定数は int なのが C の仕様
0923デフォルトの名無しさん
2007/02/01(木) 00:41:13規格を満たせない。
0924デフォルトの名無しさん
2007/02/01(木) 00:42:02のときにメモリを多く喰うくらいの話か。
0925デフォルトの名無しさん
2007/02/01(木) 00:42:44意味を考える事は重要だぜ?
それが分かってないようだと、
言語を本当に使いこなす事は出来ない。
0926デフォルトの名無しさん
2007/02/01(木) 00:51:04コンパイラはいちいちintに変換するコードを埋めなきゃならなくなるだろ
0927デフォルトの名無しさん
2007/02/01(木) 00:55:50文字定数の比較対象はたいていは(const) char*
なんだから、話が逆だな。charなら、そのまま比較すればいい。
0928デフォルトの名無しさん
2007/02/01(木) 01:17:27汎整数拡張があるからそれでは仕様を満たしていない
0929デフォルトの名無しさん
2007/02/01(木) 01:18:30あたかも汎整数拡張されているかのように全く同じ動作を保証する必要はある
0930デフォルトの名無しさん
2007/02/01(木) 01:19:08妄想半分になるんでテキトーに聞いてくれるとありがたいが、
たとえばASCIIでなく、「z」が0xffになってるような環境があったとする
この場合、getcが「z」を読んだときに返して来る値は0x000000ffだ
これをすぐcharの変数に落とすならffとなって何の問題もないが、
もしそのまま'z'と比較しようとすると、'z'がcharの0xffだった場合に
intの0xffffffffに変換されてしまって等しくないことになってしまう
これを防ぐにはgetcの戻り値をEOFと比較するためだけに
intの変数に落としてからまたすぐcharの変数に入れるか、
文字定数を含めて一切合切をunsigned charにしなくちゃならない
といった面倒があると思うのだが実際にそんな環境があるかどうかは知らない
0931デフォルトの名無しさん
2007/02/01(木) 01:25:11もしそんな環境があったら、'z'は0x000000ffだということになるが、
それをcharの0xffと比較しようとしたらどっちみち問題が起きる。
文字定数は負数にならないことは保証されてるんじゃなかったっけ?
0932デフォルトの名無しさん
2007/02/01(木) 01:26:11○文字定数となることのできる文字は
0933デフォルトの名無しさん
2007/02/01(木) 01:29:490934デフォルトの名無しさん
2007/02/01(木) 01:31:33int main(){
int i=getc(stdin);
if( i == '\xff' ){
printf("FF:%d\n", i);
}
}
vc6でコンパイル・実行して^Zくわせてみたが、
C/C++ともFF:-1と表示したわけだが。
/Jを付ければ表示はなかった。
0935デフォルトの名無しさん
2007/02/01(木) 01:37:38z はともかくとして、文字列の中のある文字を is 系関数に突っ込んだ時に
0x80 以上の場合負数になって落ちる事はよくある話。
0936デフォルトの名無しさん
2007/02/01(木) 01:38:20'\xff'は(32ビットなら)0xffffffffですが何か?
sprintf("%.8x\n",'\xff');
で吐かせてみろ
0937デフォルトの名無しさん
2007/02/01(木) 01:38:48charとcharの比較で整数拡張は無関係に最適化できるだろ。
0938デフォルトの名無しさん
2007/02/01(木) 01:40:13ちょ、おま。引数に入れた時点で符号拡張されちゃうだろが。
あと、charが符号付きかどうかは処理系依存だろ。
0939936
2007/02/01(木) 01:43:09sprintf("%d\n",sizeof('\xff'));
だ
0940デフォルトの名無しさん
2007/02/01(木) 01:44:08getcが文字としてのffを返してきたのかEOFなのか
区別を付けるの面倒具合は変わらない、ということ。
0941デフォルトの名無しさん
2007/02/01(木) 01:45:58ソウナノ?(゚д゚)
0942デフォルトの名無しさん
2007/02/01(木) 01:56:07>…“単なる”char型を符号付きとして扱うか否かは、処理系定義とする。…
あと、もしも'z'が0xFFという値を持つなら 6.2.5から
>…実行基本文字集合の任意の要素をchar型のオブジェクトに格納した場合、
>その値は非負であることを保証する。…
より、charは符号無しであることを強制される。
0943デフォルトの名無しさん
2007/02/01(木) 02:01:08他のスレでも話題になってたけど、charがsignedかunsignedかは処理系依存。
しかも大抵の処理系ではコンパイルオプションなどで換えられるようになってたりする。
#逆に言えば、charが常にsignedであることがISOの要求であるなら、
#unsignedにするオプションは非ISO化オプションと言うことになってしまう。
0944デフォルトの名無しさん
2007/02/01(木) 02:02:02アホなこと言ってスマンカッタ
0945デフォルトの名無しさん
2007/02/01(木) 02:02:490946デフォルトの名無しさん
2007/02/01(木) 02:03:480947デフォルトの名無しさん
2007/02/01(木) 02:04:45C++でcharな理由はたぶん>920
0948デフォルトの名無しさん
2007/02/01(木) 02:09:27実害がないからそのまま放ってあるだけでは。
0949デフォルトの名無しさん
2007/02/01(木) 02:09:420950デフォルトの名無しさん
2007/02/01(木) 02:11:15考えなしってことはないだろう
コンピューターってのはワード単位にデータをアクセスするのが普通なんだから、
特段の事情がなかったからintにしたというほうがずっと自然だ
0951デフォルトの名無しさん
2007/02/01(木) 02:13:18>すべてのビットが0であるバイトをナル文字という…文字列の終わりを
>示すためにナル文字を用いる。
0952デフォルトの名無しさん
2007/02/01(木) 02:14:02じゃあなんで文字列はワード集合にならなかったの?
0953デフォルトの名無しさん
2007/02/01(木) 04:09:47別に>>950とは無関係に決められたから。
0954デフォルトの名無しさん
2007/02/01(木) 07:05:290955デフォルトの名無しさん
2007/02/01(木) 09:08:53最適化でどうとでもなることだろう・・・
0956デフォルトの名無しさん
2007/02/01(木) 10:52:320957デフォルトの名無しさん
2007/02/01(木) 11:28:52Cの規格が最適化しろと定めているわけじゃないぞ
逆に言えば、本当によくできたコンパイラなら、
文字定数がintだろうとcharだろうと
charと比較したときの最適化の結果は同じにできるはず
0958デフォルトの名無しさん
2007/02/01(木) 11:41:01「自然な整数はint」の法則に従ってintにしたってことだろ。
C++で事情が違うのは既出。
0959デフォルトの名無しさん
2007/02/01(木) 11:46:04テキストデータというものが既にそういう仕様だったから。
あと、バイトの連続からなるデータを1バイトずつ処理するのは確かに手間がかかるけど、
文字列全体をまとめて扱うぶんにはワードで(2/4バイトいっぺんに)処理すれば済むから。
0960デフォルトの名無しさん
2007/02/01(木) 14:27:46char data[100];
があったとして、そこにはサイトのURLなどが入ったりするとします。
たいていのURLは100文字未満なので、
dataにURLを入れた後、残りの長さの部分を切り詰めたい時には
どうすればよいでしょうか。
0961デフォルトの名無しさん
2007/02/01(木) 15:15:12自分の質問の意味を本当に理解しているか。
長さが100の配列に101個以上のデータを入れてから100個に切り詰めることはできない。
もし101個以上つめこんだらそれはバッファオーバーランであり、その結果何が起きるかは誰にも保証できない。
文字配列の長さギリギリまで文字を詰めるには、strncpyを使うこと。
0962デフォルトの名無しさん
2007/02/01(木) 15:16:380963デフォルトの名無しさん
2007/02/01(木) 15:16:420964デフォルトの名無しさん
2007/02/01(木) 15:20:05×strncpy
○strncat
0965デフォルトの名無しさん
2007/02/01(木) 16:19:21strncpy()は末尾に\0をつけないことがあるので現在では好まれない
strncat()で文字列を他の文字列(たとえばsrcとする)から所定の長さまでコピーするには、
data[0] = '\0';
strncat(data, src, 99); /* 100文字目は\0だから */
のようにする
ファイルや標準入力から文字列を直接読む場合には、fgets()を使うこと
ただし、たいてい末尾に\nがくっついていることを忘れないように
なお、gets()は 絶 対 に 使ってはいけない
0966デフォルトの名無しさん
2007/02/01(木) 16:51:06使い方すら忘れてる(fgets()をよく使います)。
学校に行って勉強している(うらやましい)環境の人でも、講師からgets()を使ってどうのこうのって
教えられるの?
電気学科卒で学校で教えられたのはFORTRANだけだったけど、情報学科ってどんなんなんだろ。
情報系いっとけばよかったかな〜・・・
以上、独り言。
0967デフォルトの名無しさん
2007/02/01(木) 16:55:12通りすがりですが
data[100]の領域をとっていて30しか使わなかったら70余るから
どうにかしたいってことだからなんかちがうような
mallocoで確保して足りなくなったらreallocで再確保すればいいんじゃねぇの?
0968デフォルトの名無しさん
2007/02/01(木) 17:03:090969デフォルトの名無しさん
2007/02/01(木) 17:05:350970961
2007/02/01(木) 17:24:59不明をお詫び致します。
>>960
どうしても配列を切り詰めなければならない理由が本当にあるのか。
もし高々数十バイトのメモリすら節約しなければならないとしたら、
そんな環境でそもそも100バイト近いURLを扱うことができるのか。
どんなものでも節約できるなら節約したほうがいいことは確かだが、
瑣末な「効率化」に目を奪われてもっと大事なことを忘れてはいけない。
どうしても必要なぶんだけのメモリを使いたいなら、静的な配列ではなくポインタを用意して、
そこにmallocで領域を割付け、必要ならreallocでサイズを変更し、使い終わったらfreeで解放すること。
0971916
2007/02/01(木) 23:01:16で、なんで疑問に思ったかというと
「明解C言語入門編」で、文字を1文字として扱う部分では
すべてint型で扱うようになっていて、いままでcharだと
ばかり思ってたんで、ショックを受けたんです。
文字列として扱う場合はcharとかchar*が使われてるから
違和感無いんですが。
getchar()もcharを返すと勘違いしてたし・・・
C&Rからそうだったんでしょうか・・・
0972デフォルトの名無しさん
2007/02/01(木) 23:07:000973デフォルトの名無しさん
2007/02/01(木) 23:09:47http://pc10.2ch.net/test/read.cgi/tech/1170338926/
0974デフォルトの名無しさん
2007/02/01(木) 23:10:00http://pc10.2ch.net/test/read.cgi/tech/1170338926/
0975デフォルトの名無しさん
2007/02/01(木) 23:13:170976デフォルトの名無しさん
2007/02/01(木) 23:16:580977デフォルトの名無しさん
2007/02/01(木) 23:21:170978デフォルトの名無しさん
2007/02/01(木) 23:33:300979デフォルトの名無しさん
2007/02/01(木) 23:41:45>957
0980デフォルトの名無しさん
2007/02/01(木) 23:56:28規格は、オペランドの型拡張は「計算を正確に行えるもの」のうち「もっとも計算しやすい型」になると規定している。
charの値を正確に扱える型のうち、最も計算しやすい型はintである。よってchar同士の演算は、規格上は必ずintで行われる。
コンパイラが最適化を行わないなら、Cの規格に従って常にintへの変換が行われる。
コンパイラが最適化を行うなら、(コンパイラが賢ければ)文字定数がcharでもintでも同じコードが生成される。
結論として、charでなければならない積極的な理由は存在しない。
ならば値が整数である以上、整数を扱うのに最も自然なサイズであるintを使うのはごく妥当である。
0981デフォルトの名無しさん
2007/02/02(金) 00:01:59>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のときは適用されないんじゃないの?
0982デフォルトの名無しさん
2007/02/02(金) 00:12:550983デフォルトの名無しさん
2007/02/02(金) 00:22:420984デフォルトの名無しさん
2007/02/02(金) 00:38:170985デフォルトの名無しさん
2007/02/02(金) 02:41:32比較は実際には引き算です
それと規格上intで表現できる整数は全部intになります
あなたがコンパイラに何を期待しようと勝手ですが、
文字定数がcharであるべきだと主張するのは滑稽です
0986デフォルトの名無しさん
2007/02/02(金) 07:47:57あなたがコンパイラに何を期待しようと勝手ですが、
比較は実際には引き算だと主張するのは滑稽です
0987デフォルトの名無しさん
2007/02/02(金) 08:12:58あなたが俺に何を期待しようと勝手ですが、
セックスは実際には足し算だと主張するのは滑稽です
0988デフォルトの名無しさん
2007/02/02(金) 09:17:11で、Zフラグが立ったらとか立たなかったらで条件ジャンプ命令でジャンプと。
マシン語に憧れた子供時代でした、はい。
0989デフォルトの名無しさん
2007/02/02(金) 09:32:02ソース読みにくくするだけじゃん
0990デフォルトの名無しさん
2007/02/02(金) 10:57:010991naka_hiro
2007/02/02(金) 11:04:59var 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;
}
0992デフォルトの名無しさん
2007/02/02(金) 12:08:370993デフォルトの名無しさん
2007/02/02(金) 23:30:360994デフォルトの名無しさん
2007/02/03(土) 05:18:330995デフォルトの名無しさん
2007/02/03(土) 12:26:010996デフォルトの名無しさん
2007/02/03(土) 18:57:450997デフォルトの名無しさん
2007/02/03(土) 19:26:160998デフォルトの名無しさん
2007/02/03(土) 20:28:49// 埋めカキコを促す良い方法だ。
printf("埋め\n");
0999デフォルトの名無しさん
2007/02/03(土) 20:32:351000デフォルトの名無しさん
2007/02/03(土) 20:33:57return -0721;
}
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。