【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味して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/
2デフォルトの名無しさん:2006/09/30(土) 19:56:44
    ∧
    < | >     俺はグラットン持ちの通りすがりのナイトであって
    |.|.|              2getしたがどうやってブロントって証拠だよ!!
    |.|.|
    |.|.|
    < | >      おいィ?お前それで良>>1のか? 
   ...| | |.      仏の顔を>>3度までという名セリフを知らないのかよ
   ...| | |.      暗黒が持つと逆に頭がおかしくなって>>4
   ...| | |.      グラットンす>>5いですね
    .< .| .>     >>6駄にaguるなネットポリスに捕まりたいのか?
 /(.._..|..|..|.._..)ヽ   それほどでも>>7
 >.─<>─.<   このままでは俺の寿命がストレスでマッ>>8なんだが・・
 ヾ ̄ヾ .√ ")'   >>9枚で良い
    .| .|      俺の怒りが有頂>>10になった
    .| .|
    .| .|      おれパンチングマシンで>>100とか普通に出すし
      ) (
    .▽

3デフォルトの名無しさん:2006/09/30(土) 20:04:25
>>1
4デフォルトの名無しさん:2006/09/30(土) 21:40:46
>>1
ISO/ANSI/JIS乙
5デフォルトの名無しさん:2006/09/30(土) 21:42:11
MONSOON禁止。
6デフォルトの名無しさん:2006/09/30(土) 21:42:42
このスレはC99に完全準拠したコンパイラを持っている>>1
全ての疑問に答えます。
7デフォルトの名無しさん:2006/09/30(土) 21:44:19
仕様書を持っていればその実装は必ずしも必要ないと思いますが。
HTML 4.01+CSS 2.1を完全実装したブラウザは存在しませんが
Web板のstrictスレはちゃんと回ってます。
8デフォルトの名無しさん:2006/09/30(土) 22:01:43
モヒカンだー!
モヒカンが出たぞー!
9デフォルトの名無しさん:2006/09/30(土) 22:23:02
あべし
10デフォルトの名無しさん:2006/09/30(土) 23:20:11
早速の質問ですが、
11デフォルトの名無しさん:2006/09/30(土) 23:37:26
VC2005にも__restrictキーワードがやっと付けられたな。
SP1が待ち遠しいぜ。
12デフォルトの名無しさん:2006/09/30(土) 23:47:06
restrictついたんか。
少しだけ嬉しいかな。
13デフォルトの名無しさん:2006/09/30(土) 23:52:14
スレ違いかもしれませんが、質問させてください。
俺はC言語全くの初心者です。
勉強しようと思って本は買いました。
ついでに何かソフトも買ってキーボードを叩きながら覚えようと思うのですが・・・
何かお薦めのソフトはありますか?
教えて君で申し訳ないのですが。。。教えてください。
14(^-^) ◆MONSOON/qo :2006/09/30(土) 23:55:09
>>13
BCC developer (ボーランドc++5.51)がおすすめ
15デフォルトの名無しさん: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/
1613:2006/10/01(日) 00:03:29
>>15
ごめんなさい。
撤収します。
17デフォルトの名無しさん:2006/10/01(日) 00:14:03
お前はもう来るな!
死ね。ぴかぁ〜
18デフォルトの名無しさん:2006/10/01(日) 18:56:07
「ANSI-Cの雛形のプログラム」って何か知ってる人居ますか?
19デフォルトの名無しさん:2006/10/01(日) 19:10:41
>>18 居ないから出て行け。
20デフォルトの名無しさん:2006/10/02(月) 06:57:03
>>15
誘導してやったのは結構なことだが
一言多いとガキっぽく見えるぞ
21デフォルトの名無しさん:2006/10/02(月) 08:09:16
最近思うのは、2chで暴言やそれに類する発言を吐きまくる人々は、
実年齢はどうあれ、精神年齢が低いことは間違いないという事だな。
22デフォルトの名無しさん:2006/10/02(月) 09:11:18
>>21
そんなどうでもいいことを言わずにいられないあなたも、精神年齢が低いということですね。
23デフォルトの名無しさん:2006/10/02(月) 14:27:41
実年齢が低そうな人達だなぁ…。
24デフォルトの名無しさん:2006/10/02(月) 16:15:09
汚い穴だなぁ…。
25デフォルトの名無しさん:2006/10/02(月) 19:45:10
↓しゃぶれよ
26デフォルトの名無しさん:2006/10/02(月) 20:14:06
                  _______   __ 
                ..||   __   ||  |WC| 
                ..||  | |  ||    ̄ ̄ 
    __ _   ∧_∧  ||.   ̄ ̄   || 
     ――― (゚Д゚ )  .||.       ◎|| 
⌒ヽ   ̄ ̄ ̄  / つ  _つ||.        ..|| 
  人, ’ ’,  人  Y   ||.  |三三| ...|| 
Y⌒ヽ)⌒ヽ、 )し'(_)   ||______ || 
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 
27デフォルトの名無しさん:2006/10/02(月) 21:28:16
カチャカチャ
28デフォルトの名無しさん:2006/10/03(火) 17:06:01
お前はもう俺から逃げられない
29デフォルトの名無しさん:2006/10/03(火) 22:35:45
             
           ハ_ハ  
         ('(゚∀゚∩ 
         ヽ  〈 
          ヽヽ_)           

30デフォルトの名無しさん:2006/10/06(金) 22:34:41
保守
31至福:2006/10/07(土) 10:05:45
はじめまして

C言語で素数列挙プログラムをつくっているのですが
高速にするためには剰余計算を
足し算(もしくは引き算)で行うようにするといいと言われました

いったいどのようなアルゴリズムで剰余計算を加算(or減算)で
おこなえるのでしょうか?
32デフォルトの名無しさん:2006/10/07(土) 10:20:12
被除数nから除数dが何回引けるかをカウントするループを作って、
そこから抜けてきた時点でのnが余りってことだろ
33デフォルトの名無しさん:2006/10/07(土) 10:32:02
>>32
そんな単純だと遅いよな
34デフォルトの名無しさん:2006/10/07(土) 10:48:37
俺もそう思うけど >>31 を読む限りそうとらざるをえないだろ
C で書いたアルゴリズムを動作合成とか言うならそれなりの話がありそうだが
35デフォルトの名無しさん:2006/10/07(土) 11:00:48
もしCPUの譲与演算が使えないような整数型で、
その整数型には次の演算が行えるなら
・加減算
・乗算
・n倍できる高速な演算(シフト演算)
・等号、大なり、小なり

a/bの余りは、
for(;;){
for(d=0.i=1;1;i++){ if(a<b.leftshift(i)){ d=i-1; break; } } //シフトして初めてaを超えるシフト数dを得る←ここが一番呼ばれる
c=b.leftshift(d);for(;a>c;a-=c); //bをdだけシフトしたcをaから引いていく
if(d==0) break; //もうシフトしてaを超えない最大のdを見つける必要はないので、抜ける
}

で、余りはきっとa
これでもかなり遅いがなぁ…加減算でやったら死ぬと思うが
36デフォルトの名無しさん:2006/10/07(土) 11:07:44
多分、それまでのすべての素数の倍数をプールしとけってことじゃない?
37デフォルトの名無しさん:2006/10/07(土) 11:08:07
>>35
C でおk
38デフォルトの名無しさん:2006/10/07(土) 14:11:10
エンターを入力すると do 〜 while ( ); が、
また続けられるようにするのは、可能でしょうか?
エンターの入力以外は、終了させたいです。
39デフォルトの名無しさん:2006/10/07(土) 14:31:36
可能
40デフォルトの名無しさん:2006/10/07(土) 14:40:03
>>39
ありがとうございます。 でも、言葉足らずでした。
できれば、その方法も教えて頂きたいのです。
41デフォルトの名無しさん:2006/10/07(土) 14:42:34
>>40
そこまでは忠言できない、情報が少なすぎる
42デフォルトの名無しさん:2006/10/07(土) 14:51:27
>>41
えーと、ごめんなさい。 どう言えばいいかもわかりません。
もうちょっと自分で調べてからまた来ます。
43デフォルトの名無しさん:2006/10/07(土) 14:57:26
44デフォルトの名無しさん:2006/10/07(土) 15:08:42
>>38
機種依存のやり方を取らざるを得ないから、機種依存OKスレへ。
while (1) {
do 〜 while ();
//キーボード入力
if (リターンキーだったら) break;
}
でできるけど、キーボード入力の部分が機種依存になる。
かならずリターンキーを押すのなら
char buf[4];
fgets(buf, sizeof buf, stdin);
if (buf[0] == '\n') break;
みたいなかんじでいけるけど。
45デフォルトの名無しさん:2006/10/07(土) 15:40:29
リニアPCmのWAVファイルを
ADPCMに変換したいので参考になるところオシエテ
46デフォルトの名無しさん:2006/10/07(土) 18:53:28
        ,.-─ ─-、─-、
      , イ)ィ -─ ──- 、ミヽ
      ノ /,.-‐'"´ `ヾj ii /  Λ
    ,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{
   ノ/,/ミ三ニヲ´        ゙、ノi!
  {V /ミ三二,イ , -─        Yソ
  レ'/三二彡イ  .:ィこラ   ;:こラ  j{
  V;;;::. ;ヲヾ!V    ー '′ i ー ' ソ
   Vニミ( 入 、      r  j  ,′  ___________
   ヾミ、`ゝ  ` ー--‐'ゞニ<‐-イ  /
     ヽ ヽ     -''ニニ‐  / < つーか、スレ違いだろハゲ
        |  `、     ⌒  ,/   \___________
       |    > ---- r‐'´
      ヽ_         |
         ヽ _ _ 」

     ググレカス [ gugurecus ]
   (西暦一世紀前半〜没年不明)
47デフォルトの名無しさん:2006/10/07(土) 18:59:14
48至福:2006/10/07(土) 22:33:20
ありがとうございます
剰余計算はあまり速くならないみたいですね

Rabin法を用いた素数の
高速判定アルゴリズムってのがあるそうなんですが
C言語だとどうやって書けばいいでしょうか?
49デフォルトの名無しさん:2006/10/07(土) 22:51:53
>>48
素直に書けばいい
50デフォルトの名無しさん:2006/10/07(土) 23:01:26
>>48
思うがままに書けばいい
書くことは do に過ぎない
see すなわち実測を怠るなかれ
51デフォルトの名無しさん:2006/10/10(火) 12:16:39
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
52デフォルトの名無しさん:2006/10/10(火) 12:18:29
>>51
ビットフラグの操作。
53デフォルトの名無しさん:2006/10/10(火) 12:52:28
そういえば、剰余の計算のテーブル引き版ってどうやるんだっけ?
昔インテルがp5-90でしくじったやり方
54デフォルトの名無しさん:2006/10/10(火) 15:20:33
>>51
まだやってんのか阿呆。
55デフォルトの名無しさん:2006/10/10(火) 17:22:30
倍精度を丸めたあの日
56デフォルトの名無しさん:2006/10/12(木) 13:06:12
returnで文字列を返すにはどうすればいいのでしょうか?
57デフォルトの名無しさん:2006/10/12(木) 13:10:59
配列は返せない
ポインタなら返せる
5856:2006/10/12(木) 13:43:17
分かったような気がしたんですが、上手くいかないのでご指導をお願いします。

char * f(void) {
char buf[80];
fgets(buf, 80, stdin);
return buf;
}
int main(void) {
char * a;
a = f();
printf("%s\n", a);
}
59デフォルトの名無しさん:2006/10/12(木) 13:50:53
ポインタは返せるけど
そのポインタがローカル変数を指している場合
関数を抜けた時点で無効になる
60デフォルトの名無しさん:2006/10/12(木) 13:52:49
(sprintf() のように) 戻り値で文字列を返さずに、
引数で渡されたバッファ(?)の内容を書き換える
6156:2006/10/12(木) 13:56:16
少し変更したんですが、どうでしょうか?

char * f(void) {
static char buf[80];  /* staticにしました */
fgets(buf, 80, stdin);
return buf;
}
int main(void) {
char * a;
a = f();
printf("%s\n", a);

return 0;
}
62デフォルトの名無しさん:2006/10/12(木) 14:38:42
まあまあだね。スレッド使わないならいいんじゃね。
>>60 のいうこと聞いて書き直せ!
6356:2006/10/12(木) 15:03:08
引数渡しに変更したんですが、これでどうですか

void f(char *buf) {
fgets(buf, 80, stdin);
}
int main() {
char buf[80];

f(buf);
printf("%s\n", buf);

return 0;
}
6456:2006/10/12(木) 15:08:03
間違えました。修正版です

int main() {
char buf[80];
printf("%s\n", fgets(buf, 80, stdin));
return 0;
65デフォルトの名無しさん:2006/10/12(木) 15:10:37
てめえ 80 って直で書きやがっていい度胸だなっ
それから stdin ていうのも引数で受けるのが普通だ。
それから戻り値も成功時は buf をそのまま(ry
66デフォルトの名無しさん:2006/10/12(木) 15:12:46
ばけやろい
いきなり ^Z とか ^D とかよ、落ちるようなうろぐらむは書くんじゃねえよ
67デフォルトの名無しさん:2006/10/12(木) 15:13:11
>>65
結局 fsets そのままじゃん とお約束
68デフォルトの名無しさん:2006/10/12(木) 15:25:47
1行レスでtypo してるし。 fsets って何やねんorz
69デフォルトの名無しさん:2006/10/12(木) 18:35:12
複数の変数を定義することができるデータ構造って何ですか?
70デフォルトの名無しさん:2006/10/12(木) 19:00:44
>複数の変数を定義することができる
            ( ゚Д゚)構造体か?
>データ構造って何ですか?
            (;゚Д゚)…え?
71デフォルトの名無しさん:2006/10/12(木) 20:22:28
つ 疲れ目だ、休め
72デフォルトの名無しさん:2006/10/12(木) 21:54:36
日本語でおkのお手本だな
73デフォルトの名無しさん:2006/10/12(木) 23:40:18
#include <stdio.h>

int main(void);
int main() {
printf(">>67 fsets って何やねん\n");

main();
return 0;
}
74デフォルトの名無しさん:2006/10/13(金) 04:37:38
【3:1001】C言語なら俺に聞け(入門篇) ぱぁと2〜

が1000を超えてしまったので、こちらで質問させて頂きます

皆さん、ありがとうございます。
>>997
では、最後に行がなくてもカウントしてもいいのですね

では>>993で述べた、
>>何故、自分の環境だとtotatに(つまり改行文字の数に)1足さなければならないのでしょうか?

で、何故自分の環境だと1を足さなければならないのかが
他の参考書などを調べましたが解決しません・・・・
理由は改行文字で終わってないなら 1を足さなければならないからですかね?

要するの最後の行はとにかくEOFでも数えると覚えればいいみたいですね。

75デフォルトの名無しさん:2006/10/13(金) 04:41:43
EOF自体、DOS時代の遺物みたいなものだからな。最後のクラスタの
有効バイト数が分からないファイルシステムを使っている時、EOFで
ファイルの終わりを判別するという、今考えるととんでもない事をしていた。
76デフォルトの名無しさん:2006/10/13(金) 04:45:34
もうわけがわかりません・・・
結果的には数えるのでしょうか?
77デフォルトの名無しさん:2006/10/13(金) 04:47:02
好 き に し ろ よ
78デフォルトの名無しさん:2006/10/13(金) 04:59:24
>>74-
筋が分岐しているみたいだから一応次スレを立てておいた。
話の続きはそっちでヨロ

C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
79デフォルトの名無しさん:2006/10/13(金) 05:08:49
>>78
すみません
80デフォルトの名無しさん:2006/10/13(金) 05:28:35
int ch;
ch=fgetc(io); if (ch==EOF) abort();
char c;
size_t sz=fread(&c, sizeof (char), 1, io); if (sz==0) abort();

freadは生バイトのまま読み込みで(raw byte)、
fgetcがバイトから文字に符号化(auto ascii char encoding)されるわけじゃないですよね。
1バイト読み込みの方法ですが、両者はどう違うのでしょうか?
81デフォルトの名無しさん:2006/10/13(金) 05:33:03
"r"か"rb"のどちらでオープンしたか、それとOSとの組み合わせで
挙動が異なる事がある。
82デフォルトの名無しさん:2006/10/13(金) 06:07:26
"rb"でオープンしたらfgetcでもfreadでも同じってことでしょうか?
83デフォルトの名無しさん:2006/10/13(金) 06:12:06
ASCIIのEOFとCのEOFを混同している奴がいるな
84デフォルトの名無しさん:2006/10/13(金) 06:50:49
DOS/Windowsでのテキストモードとバイナリモードの動作をわかってない奴もいる。
85デフォルトの名無しさん:2006/10/13(金) 07:18:39
DOS/Windowsの話ならスレ違い。
86デフォルトの名無しさん:2006/10/13(金) 12:12:26
>>82
どちらでオープンしようとも、1バイト読み込んだ内容についてはどちらも同じ。
仮にテキストモードで"\r\n"⇒'\n'の変換が行われるならば、fgetc()でもfread()でも行われる。
87デフォルトの名無しさん:2006/10/13(金) 15:21:31
C言語からアセンブラ語に変換するにはどうすればいいですか??
分かりやすくお願いします..
88デフォルトの名無しさん:2006/10/13(金) 15:29:15
勉強すればいいと思います。
89デフォルトの名無しさん:2006/10/13(金) 15:52:57
うるせーバカ氏ね
90デフォルトの名無しさん:2006/10/13(金) 15:59:42
マルチは死ねばいいと思います。
91デフォルトの名無しさん:2006/10/13(金) 17:08:13
マルチが死ぬにはどうすればいいですか???
分かりやすくお願いします。。。。
92デフォルトの名無しさん:2006/10/13(金) 17:10:19
>>91
鼬害。
93デフォルトの名無しさん:2006/10/13(金) 21:29:52
86 デフォルトの名無しさん sage 2006/10/13(金) 12:12:26
>>88
コンパイラを使う。
そんなことをしてもほとんどの場合役に立たないけど。

手段を聞くのではなく、目的を示したほうがいいと思う。
94デフォルトの名無しさん:2006/10/13(金) 21:32:01
うわ操作ミス。
一行目は無視して。
95デフォルトの名無しさん:2006/10/13(金) 23:06:11
>>94
スレ違いは誘導しましょう。
例えばあんたはこっち。
http://pc8.2ch.net/test/read.cgi/tech/1158275665/
96デフォルトの名無しさん:2006/10/15(日) 01:35:30
『宣言が正しく終了していない』
と言ったエラーが出て困りました。
ググッて調べてみましたが、いまいち解決策が
みつかりません。
宜しくお願いします。
97デフォルトの名無しさん:2006/10/15(日) 01:37:40
>>96 いったい何をお願いしてるんだろう?
98デフォルトの名無しさん:2006/10/15(日) 01:44:13
>>97 コンパイルが通らないので、宣言が正しく終了していない
と表示された時の一般的な対処方法ご存知ないですか?
・・・ということでしたorz。
99デフォルトの名無しさん:2006/10/15(日) 01:47:51
100デフォルトの名無しさん:2006/10/15(日) 01:50:15
101デフォルトの名無しさん:2006/10/15(日) 11:50:21
同じ構造体同士でmemmove(memcpy)を使うと、こちらの想定どおりに
同じオブジェクトのコピー(クローン)になるのでしょうか。

上のような構造体のビット・コピーは、CとC++でも挙動は同
じ(互いの構造体メンバー間の同一性は保障される)になるのでしょうか?

もしかしmemmoveは環境依存なの?
102デフォルトの名無しさん:2006/10/15(日) 11:54:51
/*
* なんか、低脳な質問が増えてきてるな
*/
>>101
memmove()はC99にある。しかし、同じオブジェクトのコピーならmemcpy()だろうとmemmove()だろうと使うのは馬鹿。
また、C++についてはスレ違いにつき割愛。
104デフォルトの名無しさん:2006/10/15(日) 12:15:42
環境依存のようなので、違うスレで質問します。

もしかしてmemmove/memcpyの仕様は環境依存なの?
の誤植でした。
105デフォルトの名無しさん:2006/10/15(日) 12:23:36
構造体の代入はともかく、memmove使うのはどうして馬鹿なの?
106デフォルトの名無しさん:2006/10/15(日) 12:36:47
代入しろってことじゃないか?
107デフォルトの名無しさん:2006/10/15(日) 12:54:28
構造体を代入するのは馬鹿
達人はダフのデバイスを使う
108デフォルトの名無しさん:2006/10/15(日) 13:14:22
スレ違いだから詳しいことは省略するが、
構造体のコピーをmemcpy()で行なう癖のついた阿呆が
C++でも同じことをやってどつぼにはまった例は何度も見た。
109デフォルトの名無しさん:2006/10/15(日) 13:35:57
LinuxでC言語のプログラムをコンパイルして実行したらちゃんと動作したのに
Windowsでそのファイルを実行すると正しく動作しないんですけど
なぜですか?
110デフォルトの名無しさん:2006/10/15(日) 13:39:43
>>108 仮想関数テーブルってオチなの?
111デフォルトの名無しさん:2006/10/15(日) 13:45:03
>>110
代入演算子を宣言しているクラスがあるだけでもマズイ。
112デフォルトの名無しさん:2006/10/15(日) 13:59:04
ダフのデバイスを使うのは馬鹿
達人はインラインで rep movsb を使う
113デフォルトの名無しさん:2006/10/15(日) 14:16:31
構造体のコピーならmemcpyでいいだろ
114デフォルトの名無しさん:2006/10/15(日) 14:47:45
>>113
ダメだとは言わないが、癖になると C++ で嵌る。
string.h のインクルードが必要になるし、
構造体がレジスタに収まる場合などで
最適化の機会が減ってしまうかもしれない。

逆に、代入に比べて何のメリットがある?
115デフォルトの名無しさん:2006/10/15(日) 15:13:33
メリットというよりも、出来る保障があるかないかだろ。
といっても、レジスタなどと環境依存を出してくる人には、
メリットをいくらいっても無駄だろう。
116デフォルトの名無しさん:2006/10/15(日) 15:18:53
>>115
正しくコピー出来る保障があるかないかという観点でも、
代入のほうが有利じゃないか?
117デフォルトの名無しさん:2006/10/15(日) 15:24:49
C++でもstructに仮想関数を定義してない
時(structをオブジェクトでなくて値として使っている)でも何か問題が起こるのか?
ていうか、具体的にどうダメなのか分からないから適当に言ってるんだろうな。
118デフォルトの名無しさん:2006/10/15(日) 15:30:14
先頭アドレスをコピーしてしまえば・・・
119デフォルトの名無しさん:2006/10/15(日) 15:37:41
こいつは何と比べて代入の方が有利と主張してるんだ?
120デフォルトの名無しさん:2006/10/15(日) 15:40:22
>>116に聞きたいが、代入演算子'='を実装するとき、お前ならどうするつもりだ?
121デフォルトの名無しさん:2006/10/15(日) 15:55:22
ビットコピーしたいだけならmemmoveで十分か?
というのが問いだとしたら、答えはYes、ではダメなのかな。
122デフォルトの名無しさん:2006/10/15(日) 16:00:10
代入演算子を使うべきだという話はおいておいて、
C++では、構造体・クラスはPODならmemcpyでコピーしても問題ないと規定されている。
123デフォルトの名無しさん:2006/10/15(日) 16:20:50
あれだろ、strlen 使わないで自分で長さ数えるループ置いて回る奴とかたまにいるじゃん
124デフォルトの名無しさん:2006/10/15(日) 16:35:00
すり替え乙
125デフォルトの名無しさん:2006/10/15(日) 16:50:09
>>123によれば、ダンスでもしているのか、アホな奴が回っているようなんだが…
126デフォルトの名無しさん:2006/10/15(日) 16:57:22
PODの詳しい定義を見たいのだが検索出来なくて面倒くさいので
誰か規格に詳しい人、何ページに書いてあるのか教えてくれ
127デフォルトの名無しさん:2006/10/15(日) 17:00:28
どうも白熱しているけど、memcpy/memmoveは
C++だと面倒が多いのは分かった。というか普通はやらない。
構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。

何に使うかはまだ考えてないけど、
例えば構造体も配列もプリミティブも結局同じってことかな。
128デフォルトの名無しさん:2006/10/15(日) 17:02:42
ここ一応Cスレなのでよろしこ
129デフォルトの名無しさん:2006/10/15(日) 17:08:25
なんか知らんけど、C++でインスタンスをmemcpyしてはまった馬鹿がいるみたいねw
130デフォルトの名無しさん:2006/10/15(日) 17:17:24
>>129
vtblとかオーバーライドとか、演算子オーバーロード規則とかどうなっちゃうんだよ。
俺は怖くてやらないけど。
131デフォルトの名無しさん:2006/10/15(日) 17:20:06
はぁ
132デフォルトの名無しさん:2006/10/15(日) 18:21:50
Cスレらしいほのぼのとした馬鹿でつね
133デフォルトの名無しさん:2006/10/15(日) 18:29:15
>>126
X 3014:2003では9. クラスの4節。次を満たす集成体クラスと書いてある。
参照型である非静的データメンバ
利用者定義のコピー代入演算子
利用者定義のデストラクタ

集成体は、ようするに= {hoge, foo}の書式で初期化できるもの。
8.5.1で次のいずれも持たない配列又はクラスと規定されている。
利用者宣言のコンストラクタ
非公開又は限定公開の非静的データメンバ
基底クラス
仮想関数
134デフォルトの名無しさん:2006/10/15(日) 18:32:52
>>120 クラスに応じて変わるに決まってるだろ。何が聞きたいんだ?
135デフォルトの名無しさん:2006/10/15(日) 18:52:00
クラスの話なんて誰もしてないし
136デフォルトの名無しさん:2006/10/15(日) 18:55:20
聞きたいのは煽り耐性
137デフォルトの名無しさん:2006/10/15(日) 18:59:33
Cコンパイラの実装の話か。
数個の命令で済めばそれで、ダメなら memcpy() 相当の
汎用コードを呼び出す。実際に実装するわけじゃないが、
これぐらいの動作は期待してもいいだろう。
138デフォルトの名無しさん:2006/10/15(日) 22:24:55
>>127
> 構造体のクローンはCではK&R第1版では(ISO/ANSIでも?)OKってことね。
K&R第1版の時代はそもそも構造体の代入ができなかったんだから当然。
memcpyやmemmoveを使いたがるのはそのころの名残だろ。
139デフォルトの名無しさん:2006/10/15(日) 22:41:08
いい加減にしろ
140デフォルトの名無しさん:2006/10/16(月) 14:16:07
だから、ISO/ANSIでもCなら構造体のコピーはmemcpyやmemmoveを
使って問題ないってことだ。誰も勧めたり確証しないから曖昧になってるがな。
141デフォルトの名無しさん:2006/10/16(月) 20:56:01
K&R1準拠のために構造体の代入を封印する奴は
コードのその他の部分ももちろんK&R1準拠なんだろうな?
つーか標準ライブラリ使えるの?
142デフォルトの名無しさん:2006/10/17(火) 00:52:54
別に代入を封印するとかいう話じゃないだろ。
memcpyで正しく複製できるかどうかの話だ。
143デフォルトの名無しさん:2006/10/17(火) 01:01:49
いい加減にしろ
144デフォルトの名無しさん:2006/10/17(火) 01:11:44
おこらりた
145デフォルトの名無しさん:2006/10/17(火) 02:29:30
>>141
UNIXのプログラムでgccが使えると仮定してないやつはプロトタイプ宣言すら使ってないな。
つーかmemcpyが使える保証すらないからbcopy使ってたり
146デフォルトの名無しさん:2006/10/17(火) 02:31:24
いい加減にしろ
構造体の代入やmemcpyの話題はまだスレタイに沿ってるが
K&R1の話はスレ違いだろ
147デフォルトの名無しさん:2006/10/17(火) 02:43:53
配列とポインタの問題でちょっと分からないことがあります。

void func(unsigned char *data) { }

このような関数があって main(){} から

int main(){
unsigned char data[100];

func(data);
}

こう書くと正常に動作するのですが、

int main(){
unsigned char *data;

data = (unsigned char*)malloc(sizeof(unsigned char)*100);

func(data);
}

こう書くと func() の処理がおかしな動作になってしまいます。
このような場合どんなことが原因として挙げられるのでしょうか?
148デフォルトの名無しさん:2006/10/17(火) 03:00:01
func()がdataの境界を越えて書き込んでる
149デフォルトの名無しさん:2006/10/17(火) 07:13:30
>>141
K&R1準拠のために構造体の代入を封印する
準拠のためってどういうこと?
K&R1に「構造体の代入規定」が無いのに、無い規定を封印することはできないだろ。
ところで、お前のコードは読みにくそうだな。
150デフォルトの名無しさん:2006/10/17(火) 08:45:50
最悪K&RをNGワード設定しようかとおもてる
151デフォルトの名無しさん:2006/10/17(火) 09:47:22
>>149
規定が無い=仕様にない=使えない

ハイハイ、K&Rの話は終了
152デフォルトの名無しさん:2006/10/17(火) 11:48:35
>>144
なんか可愛いぞお前。
153147:2006/10/17(火) 15:13:51
>>148
レスありがとうございます。
境界を越えて書き込んでいる、ということは、
確保したメモリ領域を超えてアクセスしている、
ということでいいのでしょうか?
メモリを大量に確保して動かしてみましたが変化が無かったです。

VC++でコンパイルしているのですが、
Release だとある程度正常に動き、
Debug だと全く見当違いな動作をしたりと、
何だか怪しさ爆発です…
154デフォルトの名無しさん:2006/10/17(火) 15:17:45
>>153
そのまま悩み続けてろww
155デフォルトの名無しさん:2006/10/17(火) 16:42:29
>>153
そのfunc()にバグがあるとして、
ローカル変数版はそのバグを偶然巧く回避できて、
ヒープ版もReleaseビルドならなんとか回避できているのだろう。
Debugビルドはそういうバグにぶち当たるようにごみデータを詰め込むようになっているので、
「正しく異常動作」しているのだろう。
156デフォルトの名無しさん:2006/10/17(火) 20:03:27
未定義動作とはそういうもんだ。一見正しく動いているように見せかけても
おかしくなっても一向に問題なし
157デフォルトの名無しさん:2006/10/17(火) 22:18:58
>>153
ReleaseビルドとDebugビルドで動作が違う
ローカル変数を使ったときと、ヒープを使ったときで動作が違う

まず考えられるのは、初期化していない変数を参照している可能性
コンパイル時のチェックを一番シビアな設定にして、エラーはもちろんワーニング
をすべて取り除く
158デフォルトの名無しさん:2006/10/17(火) 23:18:42
>>149
現物が手元にないので確認できないが
K&R1 にも構造体代入についての言及はあったように記憶している
確か、将来の C では可能になるやも知れんとか言っていたような・・・
159147:2006/10/18(水) 00:43:51
>>155-157
レスありがとうございます。
>>157さんの指摘がまさにビンゴでした。
ローカル変数を全てチェックしたみたら初期化していない変数がありました。
複数人の手で書かれているコードで、尚且つかなりカオスしてたので大変助かりました。
みなさんどうもありがとうございます、スレ汚しすみません。
160デフォルトの名無しさん:2006/10/18(水) 00:48:04
課題3
入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムを作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2

↑の答えお願いしますm(_ _)m

161デフォルトの名無しさん:2006/10/18(水) 00:55:14
>160
C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/l50
162デフォルトの名無しさん:2006/10/18(水) 18:58:53
>>160
うちの大学にはこういうのがうじゃうじゃいるよ、
教科書も読まないでプログラミング受けに来る奴。
フランス語知らない奴が、いきなりフランス語は喋らないだろ?
マックとかケンタッキーだとかあんな高カロリーなものばっか食ってるからだいたい,,,,,,ブツブツ
163デフォルトの名無しさん:2006/10/18(水) 19:35:56
プロフェッショナルにとって理解することと感じることは車の両輪。
理解するだけでも感じるだけでもいけない。
どちらから入るかは性格による。
マの大半は感じることから入ったクチではないかな。
だから理解することに関して後ろめたさがあり、
それが教科書至上主義を助長していると思ってみたりしようじゃないかw
164デフォルトの名無しさん:2006/10/18(水) 20:40:13
ベクトルを正規化する式は
float x, y, z;//元のベクトル
float vx, vy, vz;//正規化したベクトル
float=s;
s=sqrt(x*x+y*y+z*z);
vx=x/s;
vy=y/s;
vz=z/s;

で求まると思いますが、sqrtを使わずに正規化するにはどうすればいいのでしょうか?
どうしても速度が気になります。
165デフォルトの名無しさん:2006/10/18(水) 20:42:25
どなたか感じた方いませんか〜
166デフォルトの名無しさん:2006/10/18(水) 20:58:31
あんっ!感じる!感じるわ!
167デフォルトの名無しさん:2006/10/18(水) 20:59:45
なんだこの右上のプレッシャーは
168デフォルトの名無しさん:2006/10/18(水) 21:20:57
>>164
自前で開平する効率のいいマクロ関数でも実装する
169デフォルトの名無しさん:2006/10/18(水) 21:22:12
このスレは標準Cのみの限定スレです。
170デフォルトの名無しさん:2006/10/18(水) 21:25:15
171デフォルトの名無しさん:2006/10/18(水) 21:33:37
>>162
知らないことを学びに来た奴がそれを学べないプアな教育機関を選んでしまった気の毒な奴だよ
予習が全てなんて恥知らずな公言をする穀潰し教師が横行できてしまう少子化社会だからな
172デフォルトの名無しさん:2006/10/18(水) 21:56:44
>>171
予習がすべて、なんて教師は論外だけど、
講義の時間中しか勉強しない、課題は自力でやらない、なんて学生も論外だろう。
そんな学生のペースに合わせて講義なんかされたら、知りたいことを学びに来た学生が気の毒だ。
173デフォルトの名無しさん:2006/10/18(水) 22:00:57
>>172
その教育機関がどんな連中を相手にしているかによるな
昼間は仕事でびっちりな人たち相手に宿題は物理的に無理な場合もある
174164:2006/10/18(水) 22:03:59
>>170
ありがとうございます。
そっちで聞いてみます
175デフォルトの名無しさん:2006/10/20(金) 02:43:31
C99 規格 6.5.3.3 では、単項マイナス演算子について以下のように記述されています。
"The result of the unary - operator is the negative of its (promoted) operand. The integer
promotions are performed on the operand, and the result has the promoted type."

そこで質問ですが、 -1u という式の型と値はそれぞれ何になるのでしょうか?

型は 1u が unsigned int で、整数拡張しても unsigned int のままなので
やっぱり unsigned int だと思うのですが、値のほうは符号無し型に対して
"negative" と言われても定義できないような気がします。もしや未定義動作でしょうか?

未定義動作ってことになると、 -sizeof(...) なんてコードでうっかり踏んでそう。
176デフォルトの名無しさん:2006/10/20(金) 03:57:26
演算子がおかしいって言われるんじゃないの?
177デフォルトの名無しさん:2006/10/20(金) 06:04:07
>>175
> 符号無しオペランドを含む計算は、決してオーバフローしない。すなわち、結果を
> 符号無し整数型で表現できないときは、その型で表現しうる最大値より1だけ大きい
> 数を法とする剰余を結果とする。
JIS X 3010:2003 本体6.2.5より
178175:2006/10/20(金) 10:23:30
>>176
エラーにはなりません。警告の出るコンパイラはあるようですが。

>>177
なるほど。それで決まりますね。
つまり -1u は unsigned int で UINT_MAX - 1 + 1 (== UINT_MAX) ということに。

unsigned int 以外の(より精度の高い)型に変換した場合に
ソースコードから期待される値は得られなさそうですので、
結局はやるべきではないですね。

ありがとうございました。
179デフォルトの名無しさん:2006/10/20(金) 10:28:17
>>176
とりあえず、コードで試してから書けよw
180デフォルトの名無しさん:2006/10/20(金) 10:29:47
errx() ってANSIか?
181デフォルトの名無しさん:2006/10/20(金) 10:30:31
>>178
ということは
0 - sizeof なら可だけど -sizeofならダメかもってこと?
182デフォルトの名無しさん:2006/10/20(金) 10:35:19
>>181
0 - sizeof と -sizeof は、両方とも >>177 のルールによって結果が決まるので
等価になると言えます。

unsigned int 同士の加減算に使う限りは負の値として作用してくれるので、
それだけで「ダメ」とも言い切れないですが。
183デフォルトの名無しさん:2006/10/20(金) 11:11:54
>unsigned int 同士の加減算に使う限りは負の値として作用してくれるので、

え??
184デフォルトの名無しさん:2006/10/20(金) 11:23:34
>>182
なるほど
185デフォルトの名無しさん:2006/10/20(金) 11:41:31
>>183
assert(3u + (-2u) == 1u);
186デフォルトの名無しさん:2006/10/20(金) 13:37:46
>>185
式の途中の値の型ってコンパイラが適当に処理してるってこと?
終端ならunsigned 型にするが、
途中なら単純に変換するのではなく
減算に使われているか調べて判断してくれてるってことでおk?
187デフォルトの名無しさん:2006/10/20(金) 17:50:36
問題:
orz == 3 を含む美しく実用的なコードを書け。
188デフォルトの名無しさん:2006/10/20(金) 18:00:07
{
    /* orz == 3 */
    実用的なコード
}
189デフォルトの名無しさん:2006/10/20(金) 18:05:36
printf(" ッブ\n);
printf("orz ==3 嫌なあいつ\n");
190デフォルトの名無しさん:2006/10/20(金) 18:13:31
最高にド低脳な発言してください in ム板(XIIII)
http://pc8.2ch.net/test/read.cgi/tech/1158275665/
191デフォルトの名無しさん:2006/10/20(金) 18:23:11
>>188
無駄なコメントは可読性を下げると思う
192デフォルトの名無しさん:2006/10/20(金) 18:32:59
>>191
なつかしい きょくが
ながれてるじゃないか。
あのころは、よかったな。
193デフォルトの名無しさん:2006/10/20(金) 19:24:37
if ((OTL==3)>>191) puts("鼻からぎゅ〜にゅ〜♪");
194誰かおねがい:2006/10/20(金) 19:31:16
サイトに番号つけたいんですが、下のは何で変な結果が出るのかわからん。
#include<stdio.h>
#define L 10
main(){
int i,j,y,x=0,site[L][L];
for(i=0;i<L;i++){
for(j=0;j<L;j++){
x++;
site[i][j]=x;
printf("%d\n",site[i][j]); //yoi
}printf("%d\n",site[i][j]); //hen
}
//system("pause");
}
195デフォルトの名無しさん:2006/10/20(金) 19:43:53
>>194
for文の仕様を100回音読しろ
それでもわからなければ諦めろ
196誰かおねがい:2006/10/20(金) 19:45:43
ごめん、なんでもない
197デフォルトの名無しさん:2006/10/20(金) 19:47:39
>>186
いいえ。185も単に>>177の規則に従った結果。
198デフォルトの名無しさん:2006/10/20(金) 20:38:17
>>185
assert(3u + ((unsigned int)(-(int)2u)) == 1u);
199さrg3:2006/10/20(金) 22:33:02
C言語おしえて
200デフォルトの名無しさん:2006/10/20(金) 23:14:53
gotoでの飛び先について質問なのですが、
ラベルが有効なのはgotoと同一の関数内のみなのでしょうか?
それともソースファイル全体、またはプログラム全体で有効ですか?
201デフォルトの名無しさん:2006/10/20(金) 23:29:32
>>200
同一の関数内のみ
202201:2006/10/20(金) 23:32:16
でもC言語のソースではあまりgoto文を見ないですけど
エラー処理へ飛ばすぐらいかな
203デフォルトの名無しさん:2006/10/21(土) 00:12:51
>>200
そんくらいやってみろ
204デフォルトの名無しさん:2006/10/21(土) 00:20:05
goto文は廃絶運動が起きてるからよ
205デフォルトの名無しさん:2006/10/21(土) 00:45:05
まぁ、滅多なことじゃ無い限り使うことも無い構文だしな。
206デフォルトの名無しさん:2006/10/21(土) 00:55:35
蛇蝎のごとく嫌うほどのもんでもないけどな。
たまに使う分には、それなりに便利だ。
207デフォルトの名無しさん:2006/10/21(土) 00:57:43
なぜ goto を使わないの?

これに歯切れ良く答えられない奴は異様なコードを書く
208デフォルトの名無しさん:2006/10/21(土) 01:10:07
使いまくりの俺には、何故使わないのか歯切れの良い答えが打線。
模範解答きぼん。
209デフォルトの名無しさん:2006/10/21(土) 01:14:31
goto文は構造化プログラミングの時代の嫌われ者になってしまった
あっちゃこっちゃ飛ぶのはよろしくないということだ
210デフォルトの名無しさん:2006/10/21(土) 01:15:46
次の標準規格にはgoto文の代わりに comefrom文を入れてもらおう
211デフォルトの名無しさん:2006/10/21(土) 01:26:29
本来goto文が悪いんじゃなくて、goto文の濫用が嫌われるんだがな。

goto文を使うべき場面も、少ないながらあるわけで・・・
212デフォルトの名無しさん:2006/10/21(土) 01:34:29
gotoを一切使わないなんて言っているやつを今まで何人か
見てきたが、(グローバル変数も一切使わないというヤツもいた)
プログラムなんて動けばいいんだと、俺は思う。
213デフォルトの名無しさん:2006/10/21(土) 01:51:29
まあ確かに動けば良いんだが、大抵は動かし続けなきゃならんからなー。
部屋が汚いくらいじゃ早々死にはしないが、限度を超えるのは考えもんだろうし。
214デフォルトの名無しさん:2006/10/21(土) 02:00:30
一万行くらいのコードを書けば数個くらいのgoto文を使うだろ。
そこに100個もgoto文使うやつがいたら、俺はそのコードを
興味本位で見せて欲しいわ。
215デフォルトの名無しさん:2006/10/21(土) 07:49:22
>>209
SPでもあっちゃこっちゃサブルーチンへ飛ぶね
ループや if, switch は分岐以外の何物でもないし
関数ポインタでの分岐に至っては飛び先が予測できないがSPで普通に使う
216デフォルトの名無しさん:2006/10/21(土) 09:32:14
goto排他原理主義者が見えない罠
・プログラミングと構造化について分けて考えられない
217デフォルトの名無しさん:2006/10/21(土) 10:27:56
だな
プログラミングでない構造化はそこいら中にあるから
要は何をすればいいのかが見えていれば
道具の1つに過ぎないものを見境いなく毛嫌いはしなくていいはず
218デフォルトの名無しさん:2006/10/21(土) 11:23:16 BE:159753784-2BP(204)
「プログラミング」とか「構造化」とかあいまいな用語をならべて、
分けるとか分けないとか言ってるヤツの方が理解浅そう。
219入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:25:08
#include <stdio.h>
void main (void)

{
int b_data[5],a,i;
int *b_pt;


a=0;

printf("2けたの番号を入力して下さい\n");

for(i=0;i<5;i++)

scanf("%d",&b_data[i]);

b_pt=b_data;

printf("入力された番号は\n");

for(i=0;i<5;i++){

printf("%d\n",b_data);

}
printf("以上です。\n");
}

オワタ
220入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:26:02
配列を使用して、
221デフォルトの名無しさん:2006/10/21(土) 11:27:38
printf("%d\n",b_data);

printf("%d\n",b_data[i]);
じゃないの佐賀?
222デフォルトの名無しさん:2006/10/21(土) 11:28:19
>>218
浅かろうが深かろうが
おまえさんが食い込めないことだけは動かぬ事実
違うならそれを示してみな、お見事なら謝るから
223デフォルトの名無しさん:2006/10/21(土) 11:37:09 BE:269584496-2BP(204)
>>222
まるで>>216がたいそうなことでも言ってるような口ぶりだな。
224デフォルトの名無しさん:2006/10/21(土) 11:38:45
「プログラミング」と「構造化」が曖昧…?
225デフォルトの名無しさん:2006/10/21(土) 11:42:32
>>223
ただ煽るだけで話してても実りのなさそうな奴にえさはやらんぞ
これからちょっと出かけるから、夕方までにもうちっとマシなこと書いとくんだな
226入力した数字を表示したい ◆g/ZMVdytmo :2006/10/21(土) 11:46:46
>>221 解決しました。ありがとうございました。
227デフォルトの名無しさん:2006/10/21(土) 11:51:21
>>223が理解浅そうな人です


っつーかemacsが容量不足でインスコできねぇ
228デフォルトの名無しさん:2006/10/21(土) 11:52:58
構造化ってもう時代遅れ?
確かに大事な概念だけど・・
229デフォルトの名無しさん:2006/10/21(土) 11:53:03
歳のせいか、数ヶ月前に自分で書いたコードを見直しても思い出すまでに
1〜2日かかります。
忘れないようにコメントをいろいろ追加しているのですが、それでも何で
こんな処理しているのか思い出せない場合があります。
どうすればよいでしょうか?皆さん、どうしていますか?
230デフォルトの名無しさん:2006/10/21(土) 11:54:24
>>229
ソースコードがコメントになるくらいのコード書く
これしかない
231デフォルトの名無しさん:2006/10/21(土) 12:22:54 BE:359446289-2BP(204)
>>225
いや、おれは最初からなんか出せとか言ってないし。
あんたこそ、相手をあおって「なんか出せだせ」みたいな乞食みたいなことは
やめたほうがいいよ。
232デフォルトの名無しさん:2006/10/21(土) 12:26:35
>>231
出せない奴乙
233デフォルトの名無しさん:2006/10/21(土) 12:37:23
>>231
理解してないのに口先だけで世の中渡ってこれたんだ?
それだけでも勲章モノだから、もう出しゃばらない方がいいと思うよ、うん
234デフォルトの名無しさん:2006/10/21(土) 12:40:20
>230
それが、その、数ヶ月前のコードは、自分が書いたものに見えないんです。
まるっきり記憶が飛んでいて。まるで他人のコードを見ているように
感じます。それを1−2日かけて思い出すと、どうにか理解できる
場合があります。やはり歳かな。
235デフォルトの名無しさん:2006/10/21(土) 12:42:58 BE:239631168-2BP(204)
>>233
まるで>>216がなにか理解しているかのような口ぶりだな。
236佐賀:2006/10/21(土) 12:48:35
はいはい佐賀佐賀
237デフォルトの名無しさん:2006/10/21(土) 12:55:16 BE:89862236-2BP(204)
むしろ>>216みたいなコトを言ってるヤツのほうが、
「口先だけで世の中渡ってる」感が強い。
238デフォルトの名無しさん:2006/10/21(土) 12:57:22
(´д`)
 〜ただいま>>218が真っ赤な顔で必死になっております〜
239デフォルトの名無しさん:2006/10/21(土) 12:58:54
>>229
コメントを書く際は、まず最初に

/* 【何でこんな処理しているのか】 */
/* ・・・ */

と書くルールを決める。
他に書きたい事があるだろうが、それらは後回し。
240デフォルトの名無しさん:2006/10/21(土) 13:06:32
>>239
んだね
プログラミング以前に戻って情報を引っ張ってこれるなら、
全体が、何を問題にして何を目標にどんな解決法でコードを導いたのか、一筆書き加えると後々楽だね
241デフォルトの名無しさん:2006/10/21(土) 13:21:02
コメントも構造化。
構造化というか、クラスのように階層化できるのがベストなんだが。
242デフォルトの名無しさん:2006/10/21(土) 13:21:36
コードの動作じゃなくて意図を書かないと意味ないな

i++; //カウンタをインクリメント

とかアホかと
243デフォルトの名無しさん:2006/10/21(土) 13:32:54
コメントの文法ならともかく作法はスレ違いだと思うの。
確か専用スレなかったっけ?
244241:2006/10/21(土) 14:30:06
>>243
あるのか。是非逝ってみたいが、できれば誘導ヨロ。
245デフォルトの名無しさん:2006/10/21(土) 14:33:17
        コーディング規約 第2条
っ   ttp://pc8.2ch.net/test/read.cgi/tech/1068752664/
246デフォルトの名無しさん:2006/10/21(土) 14:36:21
サンクス。ちょっくら行ってくら。
247デフォルトの名無しさん:2006/10/22(日) 13:38:31
>>234
それは脳に血栓があるかもよ
場所によっては自己同一性にアクセスできなくなるから。
248デフォルトの名無しさん:2006/10/22(日) 19:41:24
絶えず自己進化を続けることに気付かない>>234
249デフォルトの名無しさん:2006/10/22(日) 21:24:02
char arr[1]={'A'};
arr
&arr
&arr[0]
&*arr
実質的に全部同じなんですが、違いを教えてもらえないでしょうか
250デフォルトの名無しさん:2006/10/22(日) 21:31:37
>>249
&arr だけ、型が違う。
251デフォルトの名無しさん:2006/10/22(日) 21:37:04
>>249
注意せよ、「実質的に」にひどい罠がある
252デフォルトの名無しさん:2006/10/22(日) 21:42:04
配列が式の中に現れると、原則として先頭要素へのポインタに変換される。
それを逆参照してまたアドレスを得ているだけなので、arrと&*arrは等価。

また添え字演算子は間接参照演算子などの糖衣構文であることから、&*arrと&arr[0]も等価。
故にarrと&arr[0]も等価。

&arrはというと、アドレス演算子が「式中で配列は先頭要素へのポインタに変換される」という規則の例外となっており、
配列そのものへのポインタが得られるということになっている。

まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。
253デフォルトの名無しさん:2006/10/22(日) 22:08:36
>>250-252 ありがとうございます。
>>252 よくわかりました。
>&arrだけは結果の型がchar (*)[1]で、
>ほかは結果の型がchar *になる。
254デフォルトの名無しさん:2006/10/22(日) 22:14:57
>まあ、ようするに&arrだけは結果の型がchar (*)[1]で、ほかは結果の型がchar *になる。

これは嘘
printf("%u", sizeof arr);
255デフォルトの名無しさん:2006/10/22(日) 22:24:22
>>254
そのコードで何を証明したつもりなの?
256デフォルトの名無しさん:2006/10/22(日) 22:40:36
スルーでおk?
257デフォルトの名無しさん:2006/10/22(日) 22:57:43
痛い教えて君と同じことを言われたいかい?
258デフォルトの名無しさん:2006/10/22(日) 23:02:46
言われたい!!
259デフォルトの名無しさん:2006/10/22(日) 23:04:59
そんくらいやってみろ
260デフォルトの名無しさん:2006/10/22(日) 23:21:08
スルーでおk
261デフォルトの名無しさん:2006/10/22(日) 23:23:07
「sizeof arrの表示」と「arrや&arrの型」の間の関係が理解できる人はエスパー
262デフォルトの名無しさん:2006/10/22(日) 23:25:08
「サイズの違い」と「型の違い」の間の関係が理解できない人は C 使いにあらず
263デフォルトの名無しさん:2006/10/22(日) 23:26:52
また例の痛いヒトが現れたんだね。
264デフォルトの名無しさん:2006/10/22(日) 23:27:42
>>254は、他の人には見えないものが見えています。
265デフォルトの名無しさん:2006/10/22(日) 23:29:59
もう終わりかよ、つまんね
266デフォルトの名無しさん:2006/10/22(日) 23:32:35
エスパーって言葉どこのスレから拾ってきたの?
267デフォルトの名無しさん:2006/10/22(日) 23:32:55
たぶん、
char arr[1]={'A'};
arr
&arr
&arr[0]
&*arr
この次にやりそうなのを先に書いたんじゃないかな
とエスパー
268デフォルトの名無しさん:2006/10/22(日) 23:44:45
それはありえるけど、{'A'}
が怒っているように見えるのにエスパー
269デフォルトの名無しさん:2006/10/23(月) 00:35:29
>254
マジレスするとsizeofも配列そのものの大きさを返すことから、アドレス演算子同様あの規則の例外。
270デフォルトの名無しさん:2006/10/24(火) 15:06:26
入力した文字列の中に数字文字、アルファベット大文字、小文字がそれぞれ何個あるか表示するプログラムをポインタを使って作りなさい。
例) AB123cdを受け取ったら数字3、大文字2、小文字2

↑この答えお願いしますm(_ _)m
271デフォルトの名無しさん:2006/10/24(火) 15:43:24
#include<stdio.h>
#include<stlib.h>
#include<ctype.h>
int main(void) {
int numbers=0,upperCase=0,lowerCase=0;
char *p="AB123cd";
for( ; *p ; p++) {numbers+=(isdigit(p)!=0)?1:0;upperCase+=(isupper(p)!=0)?1:0;lowerCase+=(islower(p)!=0)?1:0}
printf("数字%n、大文字%n、小文字%n\n",numbers,upperCase,lowerCase)
return EXIT_SUCCESS;
}
272デフォルトの名無しさん:2006/10/24(火) 15:57:06
>>270-271
宿題スレ逝け阿呆。
273デフォルトの名無しさん:2006/10/24(火) 16:07:34
>>270
自分の間抜けさが露呈するから止めたほうがいいよ
274デフォルトの名無しさん:2006/10/24(火) 16:28:35
275デフォルトの名無しさん:2006/10/24(火) 16:29:59
↑すまん操作ミス、気にせんでくれ
276270:2006/10/24(火) 16:37:39
すみません。

OSはWindows XP home SP1
グラフィックは GemeForce5200です。
ハードディスクは1が40ギガBで2が80ギガBです。
277デフォルトの名無しさん:2006/10/24(火) 16:43:03
>>276
それは本気で言っているのか
278デフォルトの名無しさん:2006/10/24(火) 16:46:57
>>277
あっ、Bはバイトです
279デフォルトの名無しさん:2006/10/24(火) 16:48:11
>>276
そのプログラムはGemeForce5200じゃ動かないよ
280デフォルトの名無しさん:2006/10/24(火) 17:53:58
ファイル(ASCIIやバイナリ)を高速でコピーしたいのだけれど、
WindowsでもUnixでも使える関数があれば教えてケロ。
281デフォルトの名無しさん:2006/10/24(火) 18:13:16
fopen, fread, fwrite, fclose
必要に応じてsetvbuf
282デフォルトの名無しさん:2006/10/24(火) 18:20:25
>281
ありがとうございます。
できれば、サンプルをアップロードしてもらえるとうれしい。
283270:2006/10/24(火) 18:37:44
>>279
動きませんか・・・・ヒントは頂けたんで頑張ってみます。ありがとうございました。ペコリ
284デフォルトの名無しさん:2006/10/24(火) 18:51:49
異様な力場を感じる。
何かがおかしくなっていると感じるのだが
どこまでが正しかったのか分からない。
そんな経験ないだろうか。
285デフォルトの名無しさん:2006/10/24(火) 20:02:14
>>284
このスレが今そんな感じ
286デフォルトの名無しさん:2006/10/25(水) 00:21:28
関数ポインタにセットされている関数が、関数defかどうかを判断する処理を
mainと言う関数内で行いたいのですが、エラーが出てぜんぜんダメなんです。。。
誰か助けてください(泣)
わたしって馬鹿すぎですかね。。。
32bit処理系です(←関係ないですかね〜)


void ( *func )( void ) ;// 関数ポインタを宣言

void def( void ){//何か処理をする関数
}

void abc( void ){
func = &def ;// 関数defのアドレスをセット}
}

long check( void ){// 関数のアドレスを返す関数のツモリです
return( ( long )func ) ;
}

void main( void ){
if( check() == &def ){
//funcのの関数はdef
}
else{
//defでは無い
}
}
287デフォルトの名無しさん:2006/10/25(水) 00:31:56
すいませんが質問させてください。
キーボードから入力された文字列をHEXコードに変換するプログラムを書きたいんですけど
やりかたがさっぱりわかりません。
たとえばAと入力したとき、実際は0x41ですけどこれを0x0Aに変換したいんですがどなたか
アイデアをください。初心者なのでほんとお願いいたします。
288デフォルトの名無しさん:2006/10/25(水) 00:35:06
>>286
単なるwarnigじゃないんですか?
だとするとcheckのlongをvoid *にして(long)を取り払えばいいと思いますが。
289デフォルトの名無しさん:2006/10/25(水) 00:36:18
>>286 単純にabc()を呼んでないだけでは
290デフォルトの名無しさん:2006/10/25(水) 00:41:59
>>288
解答ありがとうございます。
明日会社で早速試してみます。

>>289
abc()は別の関数で呼んでいます、説明が悪かったと思います、申し訳ございません。
291デフォルトの名無しさん:2006/10/25(水) 00:46:04
>>287
distance = 'A' - 0x0A
putchar (getchar() - distance) ;
292デフォルトの名無しさん:2006/10/25(水) 00:52:16
スマソ
printf ("%X", (getchar () - distance)) ;
293デフォルトの名無しさん:2006/10/25(水) 01:13:18
>>292
ありがとうございます。俺の書き方が悪かったんですが、これだと0〜9まで
の入力がうまくいかないんですよ。16進数だから16通りのIf分岐
でできそうだけどもっとスマートにできないかなと・・・。
294デフォルトの名無しさん:2006/10/25(水) 01:34:02
>16進数だから16通りのIf

もちつけ。
頼むからもちついてくれ。
16進数で表現できるのは65536通りの数字なわけだが、1ビットごとに処理を分岐させるつもりかおまいさんわ。
295デフォルトの名無しさん:2006/10/25(水) 01:36:26
>>293
c2n(x){return (x&79)%55;}
296デフォルトの名無しさん:2006/10/25(水) 01:47:35
>>294
> 16進数で表現できるのは65536通りの数字なわけだが
オマエがおちつけ。
297デフォルトの名無しさん:2006/10/25(水) 01:48:55
>>295
そんな方法があったのか・・・
いつも0-9、a-f、A-Fの場合で条件分岐してやってたよ・・・
298デフォルトの名無しさん:2006/10/25(水) 01:51:17
>>294
落ち着かなくてイイ
ただこの世から消えてくれるだけでイイ
299デフォルトの名無しさん:2006/10/25(水) 02:52:12
16通りのif文なんて
保守担当者がリアルorzとなるのが目に浮かんで
オラなんだかとってもワクワクしちゃうぞ。
300デフォルトの名無しさん:2006/10/25(水) 03:30:35
switch caseのことかー!!
301デフォルトの名無しさん:2006/10/25(水) 05:41:45
16通りのifで驚くのは初級者
達人は16段のifを使う
302デフォルトの名無しさん:2006/10/25(水) 08:46:49
16段のfor文を書く俺がきましたよ。
303デフォルトの名無しさん:2006/10/25(水) 09:55:26
俺のターン!
>>302にgoto禁止を提示!
304デフォルトの名無しさん:2006/10/25(水) 10:52:54
おれならテーブルを使うな
それならキャラクタセットがASCII上位互換でなくてもOKだしなにより移植性が高い
305デフォルトの名無しさん:2006/10/25(水) 13:01:48
char s[10];
char* p = s;
@
p + 100;
A
p += 100;
B
p += 100;
*p;
どの時点で未定義ですか?
それともすべて未定義?
306デフォルトの名無しさん:2006/10/25(水) 14:09:37
3じゃね
307デフォルトの名無しさん:2006/10/25(水) 14:23:07
別に
308デフォルトの名無しさん:2006/10/25(水) 14:29:24
未定義の動作を引き起こすのは3だろうけど
1から値は不定になるよ。(例えばNULLと判定されても文句は言えない)
正常な比較等ができると保証されているのはs+10まで。
アクセスできるのは*(s+9)まで。

それと機種依存文字はやめた方がいいぞ。
他の板ならともかく、こういう板では互換性に気を配るべきだ。
309デフォルトの名無しさん:2006/10/25(水) 16:57:59
うんこ、ぷりっ。
310デフォルトの名無しさん:2006/10/25(水) 19:51:27
>>293
ありがとうございました。無事解決しました。

みなさんありがとうございました。
311デフォルトの名無しさん:2006/10/25(水) 22:14:45
ファイルa.h
struct A{
 struct A *next;
};
ファイルb.c
struct A *aroot, *alist;
func_a(){
 aroot = (struct A *)calloc(1, sizeof(struct A));
 alist = aroot;
 func_b();
 alist = aroot;
 while(alist = alist->next != NULL){
  alistの要素を表示
 }
}
ファイルc.c
extern A *alist;
func_b(){
 while(){
  func_c(alist);
 }
}
func_c(struct A *list){
 list = (alist->next = (struct A *)calloc(1, sizeof(struct A)));
}

大体このような感じでalistの要素を表示のところでalistの中身を次々に出ることを期待したんですが、
1つしか出ません。
アドレスを調べてみるとfunc_cを読んですぐの時点でlistのアドレスが毎回arootのアドレスになってました(順々にアドレスが増えていっていて欲しい)
func_cでcallocした後のアドレスは順々に増えていっています
なぜ1回1回listのアドレスがarootのアドレスに戻ってしまっているのでしょうか?
上記の範囲で問題があるのでしょうか?それとも書いてない部分に問題があるっぽいでしょうか?
312デフォルトの名無しさん:2006/10/25(水) 23:33:51
なんかやりたい事が良く判らんないけど、
func_c(struct A **list){ 
  *list = (alist->next = (struct A *)calloc(1, sizeof(struct A))); 
}
って事?
313デフォルトの名無しさん:2006/10/25(水) 23:49:21
func_a(){
 aroot = (struct A *)calloc(1, sizeof(struct A));
 alist = aroot;
の辺りも意味不明だな
314311:2006/10/26(木) 00:15:18
>>312
まさにそれっぽいです
試してみます

>>313
arootの領域を確保しておかないとnextに代入しようとしたときにエラーが出ると思ったので
確保してからalistがarootを指すようにしたんですが
どう書くのが正しかったのでしょうか?
315デフォルトの名無しさん:2006/10/26(木) 01:03:02
>>288
>>289

今日、早速試してみたら問題なくできました!!
本当にありがとうございました。

今まで4年間アセンブラで書いていて、急に環境がC言語になってしまって・・・
C言語は難しいです。。。
316デフォルトの名無しさん:2006/10/26(木) 01:34:14
Cのどこが難しいの?
317デフォルトの名無しさん:2006/10/26(木) 01:37:00
アセンブラで普通にプログラム書けるやつがC難しいって・・・
とりあえずインラインアセンブラで書いとけばいいんじゃね?
318デフォルトの名無しさん:2006/10/26(木) 01:42:57
>>316-317
ずっとアセンブラだけやってる人から見たら、そーゆーモノらしいよ。
とくにVBとかの高級言語になるともう完全にバイナリでの動作を
イメージ(する必要もないのに)できなくてギブアップしてしまうらしい。

まぁ、あれだ、彼らは言うなれば深海魚で浅い海にあがってくると破裂して死んでしまうんだよ。
319デフォルトの名無しさん:2006/10/26(木) 01:54:24
バイナリーでの動作をイメージするってどういうこと?破裂しそう。
320デフォルトの名無しさん:2006/10/26(木) 01:57:30
>>319
メモリ上にどのようにデータとコードが展開され、
レジスタがどのように使われるかわかんないと破裂しちゃうらしい。
321デフォルトの名無しさん:2006/10/26(木) 02:45:36
まさしく実装依存だ。コード中にマジックナンバー云々の域を越えてる。
int(ポインタ)が20バイトとか考えてるのかな。
それじゃ、破裂しちゃう。
322デフォルトの名無しさん:2006/10/26(木) 04:28:01
オレがたまに型無し言語(スクリプトとか)を使うときと同じ感じなのかな
コンパイルエラーが無いと破裂する
323デフォルトの名無しさん:2006/10/26(木) 05:34:59
ここはよく破裂するインターネッティングですね。
324デフォルトの名無しさん:2006/10/26(木) 08:21:52
確かに型なし言語は俺も破裂するわ
325デフォルトの名無しさん:2006/10/26(木) 08:41:24
型無し不安症候群とかこの際だからビョーキにしてしまおう
326デフォルトの名無しさん:2006/10/26(木) 08:44:37
WinAPIが形無しになったら病気にされても文句は言わないよ
327デフォルトの名無しさん:2006/10/26(木) 10:51:00
>>318
ポインタの型依存な加減算で嵌るらしい。
アセンブラにも似たのはあるけど(type ptr)、参照時の抜き出す大きさ解決だけだしな…
328デフォルトの名無しさん:2006/10/26(木) 11:12:40
そういう奴らに非手続き型言語やらせると面白そうw
329デフォルトの名無しさん:2006/10/26(木) 11:40:06
>>318
>イメージ(する必要もないのに)できなくて
不安になるんだろう。俺もVBやってると
「これNewしっぱなしで大丈夫なのか?」と不安になる事があった。
330デフォルトの名無しさん:2006/10/26(木) 12:27:00
どうすれば安心なわけ?
331デフォルトの名無しさん:2006/10/26(木) 12:30:46
>>329
不安になる必要はないぞ
ちゃんとリソースリークしてくれるから安心しろ
332デフォルトの名無しさん:2006/10/26(木) 12:59:19
ANSIなんですけど、

void main(void)

って書くと、intがありませんって警告が出るんですが、なぜ?
333デフォルトの名無しさん:2006/10/26(木) 13:25:59
ANSIだと mian の戻りは必ず int を要求するから
334デフォルトの名無しさん:2006/10/26(木) 13:26:20
mian → main
335デフォルトの名無しさん:2006/10/26(木) 14:19:52
>>334
miami
336デフォルトの名無しさん:2006/10/26(木) 16:58:07
>>333
そうなんですか…
でも石田晴久著の入門ANSI-Cには堂々と
void main(void)
って書いてあるんですよね…
この本はずれ?
337デフォルトの名無しさん:2006/10/26(木) 17:07:04
すみません。

有 効 桁 っ て 何 ?
338デフォルトの名無しさん:2006/10/26(木) 17:30:44
>>336
規格ではintを返すか、intをtypedefした型を返すか、実装依存の型を返すかの
いずれかでなければならないとされている。
よって、君の環境でvoidがOKならばvoidでも構わないし、ダメならばダメ。ただし、
int(とそのtypedef)以外をreturnとして指定した場合動かない環境が出てきても
文句は言えない。コード自体は規格違反ではない。
ただ、ANSI-Cと銘打ってある以上、intを指定するのが望ましい。よって、規格
違反ではないが、「親切な」本とは言い難い。
339デフォルトの名無しさん:2006/10/26(木) 18:43:56
>>338
なるほど〜
ありがとうございます。
自己参照型構造体を知りたくて買ったんだけど、はずれだったか〜
340デフォルトの名無しさん:2006/10/27(金) 06:26:05
そういうわかりやすいミスをしている本はむしろ注意力を身につける練習にぴったりだろ
極端な話、規格書にだってエラッタはある
何も信じるな、全てを疑え
341デフォルトの名無しさん:2006/10/27(金) 06:51:27
>>340
ちょいカッコいいな、実際は疑わしいが
342デフォルトの名無しさん:2006/10/27(金) 07:35:49
サヨるのは十代までだ。
大衆に迎合して体制に媚び諂い、お上が黒を白と言えば即ちそれは白なのだと信じることが
腐敗を極めた俗世を生き抜く真理。
疑ってはならん。
ルーク。ソースを信じるのだ。
343デフォルトの名無しさん:2006/10/27(金) 07:41:04
引っ込めヒッピー!
ここは日本だ!
344デフォルトの名無しさん:2006/10/27(金) 11:17:45
>>337
数学の勉強しろ
精度がどの桁数まで有効かって事だ

一般的に使われる浮動小数は2進数で表現されて居るので精度は2進数の桁数で表現できるんだけど
通常使う10進数では有効桁数は違う
345デフォルトの名無しさん:2006/10/27(金) 11:35:28
c言語初めて1ヶ月で壁に当たっています。
レベル低くて申し訳ないんですが教えてください。

ファイル操作に関する問題なのですが、fprintf()をつかって出力しています
このとき[^z]の入力を判断したいのですが不可能ですか?
個人で勉強してるので聞くところがここしかありません><
346デフォルトの名無しさん:2006/10/27(金) 11:43:51
>ファイル操作に関する問題なのですが、fprintf()をつかって出力しています
             (´-`).。oO(何を出力するのかなあ)
>このとき[^z]の入力を判断したいのですが不可能ですか?
            (;゚Д゚)…え?
347デフォルトの名無しさん:2006/10/27(金) 11:44:20
>>345
初心者スレへどうぞ。
つーか、出力関数で入力判断って何がしたいのやら。
#巧く説明できないようなら日本語を遣り直した方がいいかもね。
348345:2006/10/27(金) 12:08:29
間違えてました。ごめんなさい
scanf("%s",str)で^zを判断する方法が知りたいです
349デフォルトの名無しさん:2006/10/27(金) 12:15:07
初心者スレへ池といってるのに人の話を聞かない奴だな。
^zが特別扱いされるかどうかすら環境依存だ。このスレで扱う内容ではない
350345:2006/10/27(金) 12:32:30
読み飛ばしてました
初心者スレいってきま
351デフォルトの名無しさん:2006/10/28(土) 04:31:38
双方向リストをソートしたいのですが、適当なソート方法があれば教えてくださいませ
配列におけるソート方法はいろいろ学習したのですが・・・
352デフォルトの名無しさん:2006/10/28(土) 07:36:41
マージソートだな
353デフォルトの名無しさん:2006/10/28(土) 08:49:00
つーか、スレ違いだな。
今アルゴリズムスレが機能しているかどうかは知らんが。
354デフォルトの名無しさん:2006/10/28(土) 09:29:21
すいませんスレ違いかもしれませんが、きかせてください
C言語の勉強して基本情報をとったので、オブジェクト指向をやってみたいのですが
C++とC#のどちらをやったらいいのですか。仕事とかではなく趣味なのですが
355デフォルトの名無しさん:2006/10/28(土) 09:46:40 BE:74885235-2BP(204)
>>351
「C言語で書くアルゴリズム」って本に、リストのクイックソートが載ってるよ。
356デフォルトの名無しさん:2006/10/28(土) 09:48:36 BE:174731257-2BP(204)
>>354
C++とC#とJavaを読めるようにしとけばいいんじゃないの?
357デフォルトの名無しさん:2006/10/28(土) 15:42:36
>>354
普通にJavaがいいよ
Windowsで何か作りたいのがあるならC#
仕事でしょうがなくC++
358デフォルトの名無しさん:2006/10/28(土) 17:47:29 BE:29954232-2BP(204)
Java,C++,C#あたりは、どれか一個やれば、
オブジェクト指向の解説本に載ってるようなコードは、
他の言語でも、だいたい読めるよ。
359デフォルトの名無しさん:2006/10/28(土) 23:43:06
func A(struct A a){
....
a->any = malloc()
}

func B(){
struct A a;
funcA(&a);
}

この関数Aの中のmallocで確保した領域は
funcBに戻った時点で未定義ですよね?
360デフォルトの名無しさん:2006/10/28(土) 23:49:53
>>359
そもそもコンパイルエローだよちんこ!
361デフォルトの名無しさん:2006/10/28(土) 23:54:08
うーんサンプル適当に書いてしまった
とりあえず、関数のスコープを跨ぐ領域の確保を行う場合は
どうすればいいの?4分木作りたいけど、なんか別関数でアクセス
するとすぐセグメンテーションフォルトってやつが出る
362デフォルトの名無しさん:2006/10/29(日) 00:02:25
きっとポインタの値渡ししてるんだろうなあ・・・
363デフォルトの名無しさん:2006/10/29(日) 01:00:11
ううーん関数側でmallocする場合って

void char(char ** buf)とかでいいの?
でもさmallocでエラー出たときどうすればいいの?
364デフォルトの名無しさん:2006/10/29(日) 01:01:09
>>363 ヌル詰めれば?
365デフォルトの名無しさん:2006/10/29(日) 01:04:01
>>361
まぁ、初心者スレにでも実際のソースを貼って味噌。
366デフォルトの名無しさん:2006/10/29(日) 01:35:19
プログラムからファイルの読み込みや書き出しを
行うとはどういう意味なのでしょうか?
コピーを作ると言う事なのでしょうか?
367デフォルトの名無しさん:2006/10/29(日) 01:38:49
そのまんま。
ソースファイルにファイルを読んだり書いたりするコードを記述し、
それをコンパイルし実行する。するとソースに書いたとおりにファイルがメモリへ読まれたり書かれたりする。
368デフォルトの名無しさん:2006/10/29(日) 01:38:54
>>366
質問する前に調べたか?
自分で作ってみたか?
369デフォルトの名無しさん:2006/10/29(日) 01:44:29
>>367
ということは、実行ファイルに書き込まれると言う事なのでしょうか?

>>368
実行してみても、実感が湧きません。
コピーファイル(出力ファイル?「_」)ができるのですが・・・・
それが何に使うのか、何故できたのかがわかりません。
入門書を読んでいます。
370デフォルトの名無しさん:2006/10/29(日) 02:21:39
授業風景を思い浮かべろ
黒板が読み込んだファイルで
お前が記憶領域で
ノートが出力ファイルだ
371デフォルトの名無しさん:2006/10/29(日) 02:39:22
先生!出力ファイルに何も出力されてません!
372デフォルトの名無しさん:2006/10/29(日) 02:44:31
>>370-371
それは中央演算処理装置が無いのが鯨飲(←なぜか誤変換される)
373デフォルトの名無しさん:2006/10/29(日) 02:53:46
何この漫才
374デフォルトの名無しさん:2006/10/29(日) 03:10:34
C言語の勉強用の課題を集めたwikiがあったと思うのですが、
検索をしても見つかりません
もうなくなってしまったのでしょうか?


どこに書き込めばいいか分からず書き込ましていただきました。
スレ違いでいしたら、誘導お願いします。
375デフォルトの名無しさん:2006/10/29(日) 03:30:58
>>370
ありがとうございました、イメージは掴めました
要するに「_」が付いてできたファイルが僕のノートと
考えてみます。
376側近中の側近 ◆0351148456 :2006/10/29(日) 09:24:33
>>359
(っ´▽`)っ
関数Aの中のmallocで確保した領域が、
関数Bで定義されているポインタによって指されていれば
関数Bの中では確保されている状態です。
mallocがどこで行われようが、
問題はそれを指すポインタの有効範囲(スコープ)なんです。

(っ´▽`)っ
そもそもfreeをかけなければずっと確保し続けるというのが
C言語の仕様なのではなかろうか?

(っ´▽`)っ???
どうなんだろう?
ポインタのスコープを抜けると自動的にfreeをかけてくれる
ガーベジコレクションみたいな機能って
C言語のコンパイラにあるのかな?
377デフォルトの名無しさん:2006/10/29(日) 09:42:02
>>376
初心者スレへどうぞ。
378デフォルトの名無しさん:2006/10/29(日) 09:50:25
>>369
> それが何に使うのか
ここでは、ファイルができるということを学ぶのであろうから、
正しく出力されてさえいれば、ファイルの中身そのものはどうでも良い。

> 何故できたのか
ソースコードにそう書いたから。
379デフォルトの名無しさん:2006/10/29(日) 10:32:35
>>378
>ソースコードにそう書いたから
またミもフタもない言い方を。
一千年の時を経て今再び奇跡が起こったのだ、とか、
PCが君を勇者だと認めたのだ、とか、
初心者にはそういうソフトでかつドラマチックな演出が
必要とされているのではないのかね。

…コンパイラとか実行形式とかOSとかCPUとかノイマン型とかブール代数とか、
はたまたMOSFETの動作原理とか、
何から何まで説明しなければ、何故出来たのかの質問に答えていることにはならないだろう。
そこまで答えるだけの体力も知力も時の運も自分には既に無い。
380デフォルトの名無しさん:2006/10/29(日) 10:38:45
>>379
愚痴はチラシの裏にかいとけ
381デフォルトの名無しさん:2006/10/29(日) 20:33:48
このスレがチラシの裏ですよ^^
382デフォルトの名無しさん:2006/10/30(月) 02:58:04
急速にスレの質が低下してまいりました


ってのを最近見なくなった
383デフォルトの名無しさん:2006/10/30(月) 08:10:21
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました
急速にスレの質が低下してまいりました

384デフォルトの名無しさん:2006/10/30(月) 22:43:31
int tmp,i,z,a[4],b[4];
b[0]=1;b[1]=1;b[2]=1;b[3]=1;b[4]=0;

printf("配列に値を格納してください。\n");
for(i=0;i<=4;i++)
{
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}

for(i=0;i<=5;i++)
{
for(z=0;z<=4;z++)
{
if(a[i] > a[z])
{
b[i]=b[i]+1;
}
}
}

printf("配列のデータと順位\n");
for(i=0;i<=4;i++)
{
printf("a[%d] = %d%d番目\n",i,a[i],b[i]);
}
数値をキーボード入力して
入力した数値を降順に順位をつけて出力したかったのですが
なぜか最期の数値がおかしくなります
サンプルで入力した数値は12,10,32,14,8です
385デフォルトの名無しさん:2006/10/30(月) 22:51:53
>>384
int a[4]];
と定義したら、有効な配列要素はa[0],a[1],a[2],a[3]の4つ
a[4]は参照すると誤動作をする(コンパイラはチェックをしない)

a[4]を使いたければint a[5];と定義すること。
386384:2006/10/30(月) 22:58:55
>>385
ありがとうございます
387デフォルトの名無しさん:2006/10/31(火) 12:02:47
enum week { SUN, MON, TUE, WED, THU, FRI, SAT };
とした時、要素が7個あることをプログラムの中で知る方法は
ありますか?
388デフォルトの名無しさん:2006/10/31(火) 12:16:33
enum week { SUN=0, MON, TUE, WED, THU, FRI, SAT, NUM_WEEK };
として NUM_WEEK で我慢する
389デフォルトの名無しさん:2006/10/31(火) 12:29:18
>388
ありがとうございます。
プリプロセッサか何かを駆使して、どうにかできないかなあと
考えてみましたが、無理みたいですね。
390デフォルトの名無しさん:2006/10/31(火) 17:30:46
int main(void){
・・・
return 0 ;
}

void main(void){
・・・
return ;
}
は何が違うの?
391デフォルトの名無しさん:2006/10/31(火) 18:18:37
>>390
前者は規格(ISO/ANSI/JIS)で認められている形式。
後者はそうではなく、(コンパイルできるとしたらそれは)各コンパイラが独自拡張として受け付ける形式。
392デフォルトの名無しさん:2006/10/31(火) 18:47:38
だれか馬鹿な俺に、ポインタを教えてくれ。
char str[][100]={"JAPAN","USA","CANADA"};
char (*p)[];
p[0]=str[0];

にすると、
(*p)には文字列の先頭アドレスが入る
pにも文字列の先頭アドレスが入る

この違いは何!?
393デフォルトの名無しさん: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;
}
これがエラーになるのは何でですか?
394側近中の側近 ◆0351148456 :2006/10/31(火) 21:07:40
>>393
(っ´▽`)っ
実行時にパラメータを設定してるか?
指定しないとargv[1]はNULLとなり、
%sで異常終了するだろうね。
395デフォルトの名無しさん:2006/10/31(火) 21:07:49
実行時のエラーですか?
コンパイル時のエラーですか?
エラーメッセージは何ですか?
意図する動作は何ですか?
引数には何を渡しましたか?
396デフォルトの名無しさん:2006/10/31(火) 21:12:29
Cで数値計算というとLAPACKあたりできまり?
統計計算は、どれがお勧め?
397デフォルトの名無しさん:2006/10/31(火) 21:16:24
>>392
>char (*p)[];
「p は、char の配列 (= 文字列) の先頭を指すポインタ」という宣言。
因みにこれが char *p だと
「p は、char (それが配列かどうかは別として) を指すポインタ」だが
実質、大差ない。

ただ、いずれにしろ宣言部分の書式なので
>(*p)には文字列の先頭アドレスが入る
わけではない。
398側近中の側近 ◆0351148456 :2006/10/31(火) 21:33:16
>>392
(っ´▽`)っ ポインタを考える時にはメモリの状態を考えると良い☆

番地: 中身
1001: 'J'  ←strが確保した領域(1001〜1300)
1002: 'A'
1003: 'P'
1004: 'A'
1005: 'N'
1006: '\0'
(略)
2101: 1001 ←pが確保した領域

str[0][0] = 'J'
&str[0][0] = str[0] = 1001
p[0] = 1001
&p[0] = p = 2101
*p = 1001
399デフォルトの名無しさん:2006/10/31(火) 22:00:04
いい加減、どうでもいいことはこっちでやって下さい

C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
400デフォルトの名無しさん:2006/10/31(火) 22:51:51
>>392 C++になっちまったが、このソースの結果を考えてみてくれ。
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
char str[][100]={"JAPAN","USA","CANADA"};
char (*p)[100];
p = &str[0];
printf("%p\n%p\n", p, *p);
printf("%s\n%s\n", typeid(p).name(), typeid(*p).name());
return 0;
}
要するに、「たとえアドレスが同じでも、型が違う」ということ。
401デフォルトの名無しさん:2006/11/01(水) 00:11:31
>>392
「本州の最北端」と「青森県の最北端」は同じアドレス
402393:2006/11/01(水) 10:22:51
>>394,395
コンパイル時のエラーです。
/lib/なんちゃらなんちゃらが読み取りエラーみたいな
メッセージがでます。
403デフォルトの名無しさん:2006/11/01(水) 11:04:51
>>402
「/lib/なんちゃら」 が出てくるならコンパイル時じゃなくてリンク時だと思うけど
それ多分ディスク壊れてるよ
404393:2006/11/01(水) 13:33:57
>>403
ガ━━(゚Д゚;)━━ン!
どうも…。
405デフォルトの名無しさん:2006/11/01(水) 17:22:18
過去ログ置き場ってなんでパート123で止まってしまったんですか?
406デフォルトの名無しさん:2006/11/01(水) 19:32:32
407デフォルトの名無しさん:2006/11/01(水) 21:21:44
>>405
管理人が飽きたとか逃げたとか失踪したとか死んだとか
408デフォルトの名無しさん:2006/11/02(木) 00:26:27
すいません、哲学的な質問です。

古いPowerMac上のMPWコンパイラでプログラミングしているのですが、素朴な疑問です。
MacにはToolBoxなるAPIみたいな関数があり、画面への
文字列の描画やリソースへのアクセス、デバイス操作、ファイル操作などは
すべてToolBoxの関数を使って実現されます。

Windowsでも同様と思いますが(MFC/Windows API等)、Unix互換OS上では
gccによりANSI規格準拠のファイル生成作業が行なわれますが、GCCが移植された
DOSやWindows(2k/XP/98/NT)でも同様にfopenやfputs、fcloseで
ファイルが生成されたりします。

当然fopen/fputs/fcloseでファイル生成はMacでも可能ですが、
Unixは別として、WindowsプログラミングやMacプログラミングから見た場合、
こういった生っぽい関数をいじるような低レベルなプログラミングはあまりして欲しくないんでしょうか。

ファイル操作ですが、MacではStandardGetFileというルーチンで
OS標準のファイル選択ダイアログを出して、ファイルの操作を統括しています。
Windowsも同様にエクスプローラのサブセット?を表示してやりますよね。

どう思いますか?
409408:2006/11/02(木) 00:32:16
こういうコードです。完全ANSI準拠ですけど。
Mac/Windows(DJGPP; GCC)/DOS/NetBSDで動作確認済み

#include <stdio.h> /* for file I/O */
#include <stdlib.h> /* for exit func */

int main(void)
{
 char str[80] = "This is a test string to be written onto a new text file.";
 FILE *fp;

 if((fp = fopen("NewFile.txt", "w+")) == NULL){
  fprintf(stderr, "File open failed.\n");
  exit (1);
 }
 if((fputs(str, fp)) == EOF){
  fprintf(stderr, "Write error!\n");
  exit (1);
 }
 if(fclose(fp) == EOF){
  fprintf(stderr, "File close failed!\n");
  exit (1);
 }
 return (0);
}
410デフォルトの名無しさん:2006/11/02(木) 00:34:18
>>408
他の環境に移植する予定がないなら便利な方で
移植する予定があれば標準で

っていうよりも、依存部分をなるべくまとめて
対応する部分の差し替えで済むなら便利な方で

古いMacなら早晩買い替えそうだしね
でも、その時もそのコードを必要とするかというと・・・どうだかね?
411408:2006/11/02(木) 00:40:06
>>410
なるほど。ありがとうございます。
そうすると、たとえばベクターとかにWindows用のアプリケーション・ソフトが
たくさんありますが、これはもうWin32の環境に注力しているのであって、
MacやDOS、Unix互換OSへの移植はほぼ考えていない、と。
ちょっと考えただけでも、タイムスタンプ変更ツールなど。
もろにOS依存ですけど。

常識的に考えてそうですよね。けれども、fopen/fputs/fcloseみたいな
生っぽい関数ってCの中でも(とりわけANSI C)異色ですよね?
412デフォルトの名無しさん:2006/11/02(木) 01:05:17
>>408

Windows用のソフト作者が皆、他環境への移植を考えていないというわけでもないだろう。
例えばテキストエディタでも、グラフィカルな部分はOSごとに全く異なる処理が必要かもしれないけど、
内部的なデータ管理などは環境に依存せずに流用できると思う。
(実際にどう作られているのかは知らないが。)
単に個人レベルでやっていると各種プラットフォームをカバーするほどのマンパワーがないとか、
機能を充実させることが楽しいのであって他環境への移植には技術者的な興味が沸かないとか、
そういう部分も大きいのかも。

fopen等が生っぽくて異色ということは無いだろう。
ファイルという概念はかなり多くのコンピュータで基本的な概念だし、
ANSI準拠の標準ライブラリなのだから、特殊な環境への移植を考えているのでなければ
使用を躊躇う理由はあまりないんじゃない?
むしろ、OS固有のシステムコール等を隠してくれるのだから、移植性を考えるなら
積極的に使っていいと思う。

ユーザにファイルを選択させるなら、そのOSで標準的なデザインのダイアログを開いたほうが便利だから、
その場合は各OS固有の便利なライブラリを使用すればよいし、
内部的な処理でファイルI/Oするならfopen系でも十分なはず。
要は適材適所ということで。

ところで、
>すいません、哲学的な質問です。
これはかなり感覚がずれてないかい? 哲学ってそんなもんじゃないだろう。
413408:2006/11/02(木) 01:38:18
>>412
大部分は同意なんだけど、fopen/fclose/fseekなどが
生っぽいという感触は間違ってないと思うけどな。

だいたい、それぞれの出自をたどればUnixのopen/close/writeとかの
システムコールに行き着くわけでしょ?そもそもUnixを書くために
Cが生まれたくらいだし。

Windows上のVCとかでコンソールアプリ作ってさ、printfやら
fputsやらも使えるけどさ、やっぱコンソールアプリいきなりでてきたら
フツーの人はビビるでしょ。Macでもコンソールアプリつくれるけど、
通常のWindows/Macのプログラミングのゴールはやっぱさ、
こうウインドウが出てさ、ダイアログが出てマウスでポチっとな、ってやつでしょ。

そういう、エクスプローラダイアログ出して、文字入力ボックス出すんじゃなくて、
fputs/fwriteしちゃうのが生っぽい、と思ったわけ。

これ、哲学でしょ、プログラミングの、依存・非依存のハナシとしては。
414デフォルトの名無しさん:2006/11/02(木) 02:44:59
哲学でもなんでもなくって単なる主観の垂れ流しな気がするんだが。
415デフォルトの名無しさん:2006/11/02(木) 04:15:41
そういう哲学考えて生産性なんかあんの?
416デフォルトの名無しさん:2006/11/02(木) 05:25:22
つーか、スレ違い。
417デフォルトの名無しさん:2006/11/02(木) 13:17:43
生っぽく見えるのは見た目がそうだからだろう。
それはOSのアーキテクチャの問題であって言語の問題じゃない。

思えば自分も工房の頃はなんちゃって哲学に目覚めたことがあったな…
418デフォルトの名無しさん:2006/11/02(木) 17:47:39
すみません…
C言語でWinXP上にJavaみたいなウインドウ出したいんですけど、
それって出来ます?
LINUX上でもいいんですけど…
419デフォルトの名無しさん:2006/11/02(木) 19:09:17
>>418
>>1 の「標準C」の意味が解らなかったのか
>>1 の日本語が読めなかったのか
そもそも >>1 なんか読んでないのか知らんが
>>416 を心に刻め。
420デフォルトの名無しさん:2006/11/02(木) 20:59:28
C言語で一文字の変数って非常識?
forに限った使用だったんだが...
421デフォルトの名無しさん:2006/11/02(木) 21:00:55
Javaで出来ることはC言語でも出来る。Javaのコア部分はC言語だから。
422デフォルトの名無しさん:2006/11/02(木) 21:05:39 BE:99846454-2BP(204)
>>421
意味分からん。
VMやらコンパイラがCで書かれてるってことか?
423デフォルトの名無しさん:2006/11/02(木) 21:43:50
>>420
整数にi, j, k, l, n, mを使うのは非常識ではない
FORTRANのなごりか
424423:2006/11/02(木) 21:55:51
あと、ポインタにp. qを使ったり
for文の制御変数に一文字の変数はごく普通
425デフォルトの名無しさん:2006/11/02(木) 22:15:33
無理してlfXとかつけると返って分かりにくくなることがある
426デフォルトの名無しさん:2006/11/02(木) 22:50:55
Deleteキーのキーコードって幾つですか?
また、CTRL+H でバックスペースみたいに、
CTRL+○ でどのキーを押せばDeleteになりますか?
427デフォルトの名無しさん:2006/11/02(木) 23:02:03
そうですよね。使い方さえ間違わなければ一文字変数有りですょね。(´∀`)
非常識って言われてちょっとキョドってしまった。w
楽になりました。ありがd♪
428デフォルトの名無しさん:2006/11/03(金) 00:32:12
C言語と関係ないけど。
>>426 
>Deleteキーのキーコードって幾つですか?
ASCIIコード表を読め。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

キーコード調査プログラム。
#include <stdio.h>
#include <conio.h>
int main()
{
int c;
c = getch();
printf("%x\n", c);
return 0;
}
ただしconio.hはDOS依存。UNIXは知らん。
あとキーコードには2バイトのケースもあるので、
その場合はkbhit関数等を駆使して調べる。
429デフォルトの名無しさん:2006/11/03(金) 01:14:43
>>427
私のコーディング規約では非推奨としている。
特にiは検索しにくいので個人的には好かん。
尚、可読性の点からlは却下。
430デフォルトの名無しさん:2006/11/03(金) 01:17:45
forは何でまわしてるの?
431デフォルトの名無しさん:2006/11/03(金) 01:19:54
dwLoopCounter
432デフォルトの名無しさん:2006/11/03(金) 01:26:46 BE:149769656-2BP(204)
> dwLoopCounter

素人くさい。。。
433429:2006/11/03(金) 01:32:29
>>430
icとかix, iyとかitとか状況により色々。
最近はC++でstl使うことが多いからそもそもループ制御に整数変数を使うこと自体減ってるが。
434デフォルトの名無しさん:2006/11/03(金) 01:57:12
短い変数が嫌いな人への皮肉を込めて書いてみますた
もっと長大な名前にしたかったんだが
435デフォルトの名無しさん:2006/11/03(金) 02:01:17
プログラム書く時間の2割ぐらいは変数とか関数の名前を考えるのに使われてる気がする
436デフォルトの名無しさん:2006/11/03(金) 02:01:37
釣りにもならんわ。

しかし短い変数が嫌いってのもなんだかな。
言語屋や論理屋がCやC++みたいな実務優先の汚れ言語に付き合うのは
疲れるばかりだと思うんだが。
437429:2006/11/03(金) 02:11:52
漏れのことか?
漏れならばりばりの実務屋だが。
エディタで変数を追うのに、i一文字だと一々ifにぶちあたって面倒だとは思わないか?
この板に貼られているコードの断片の制御変数にicを使っているのは漏れだけじゃないようだし、
一文字変数嫌いはそれなりにいそうだが。
438デフォルトの名無しさん:2006/11/03(金) 02:18:22
えーと外部結合の識別子の長さ制限はC99で撤廃されたんだっけ?
と無理やりタイトルに沿った話題に戻してみる
439デフォルトの名無しさん:2006/11/03(金) 02:19:50
カーニハン&パイク両氏のプログラミング作法では、
一文字変数をループに普通に使ってるけどな。
440デフォルトの名無しさん:2006/11/03(金) 02:50:57
まさに自転車置場の議論
441デフォルトの名無しさん:2006/11/03(金) 02:52:32
>エディタで変数を追うのに、i一文字だと一々ifにぶちあたって面倒だとは思わないか?

ぜんっぜん思わんわ。
どんな状況でも俺流を押し通せるのはマの資質の一つかもしらんが
慣習的なものとはいえ、これだけ広く普及してるモツにあえて牙剥くだけアホらしい。
まあ、好きにすれば。
442デフォルトの名無しさん:2006/11/03(金) 02:54:55
>>437
レギュラ検索すればいいんじゃね?
443429:2006/11/03(金) 03:38:12
>>442
インクリメンタルサーチで事足りるときに、一々そこまでするかという問題。
#マウスがないとカーソル移動できなかったりカーソルキーを連打するような使い方に馴れてると面倒を感じないだろうなぁ。

>>441
いや、モツは鍋にしても苦手なんで牙むくことはないがw
冗談さておき、なにをむきになっている?
iは好かんと言うことがそんなに気に入らないのかねぇ……
444デフォルトの名無しさん:2006/11/03(金) 04:21:55
Cを勉強しててソースコード読んでたら
far ポインタ っていうのがあって・・・
char * far lp;
とかあったんですよ。
手元ANSIの辞典には項目がなく
調べてみると、大雑把にはメモリが大きくなったから
セグメントやらオフセットやらがどうのこうのと・・・

それはおいておいて、このfarっていうのが
bcc32だと変数名と認識されるのかエラーなんです

farとかnearとかって廃止された予約語なんですか?
それとも非標準のC?
調べた印象だと普通にあるみたいなのですが、
そのへんの経緯を教えてください

PS 32bit系ならfarをはずすだけでとりあえずそこはおk?
445デフォルトの名無しさん:2006/11/03(金) 04:44:21
16ビット時代の遺物の予約語だな。
BCC5.0.2当たりならまだ現役で残ってるけど
446デフォルトの名無しさん:2006/11/03(金) 04:56:56
#define far
って書いときゃOK
447デフォルトの名無しさん:2006/11/03(金) 05:07:30
((((;゚Д゚)))ガクガクガクブルブルブル
8086セグメントの悪夢を思い出した・・・・・
448デフォルトの名無しさん:2006/11/03(金) 06:08:48
もう、あれだよな
C99とかどうでもいいな
それに厳密にしたがってるコンパイラは
どれだけ普及してるんだってな
449デフォルトの名無しさん:2006/11/03(金) 06:12:26
>>445
>>446
ありがとうございました
型修飾子だった時代もあったんですね
450デフォルトの名無しさん:2006/11/03(金) 07:57:45
>>431
それfor内で何度も出てくると見にくくね?
451デフォルトの名無しさん:2006/11/03(金) 08:05:07
452デフォルトの名無しさん:2006/11/03(金) 08:24:14
ループカウンタ変数を検索するような必要性に迫られるシーンが思い浮かばない orz
453デフォルトの名無しさん:2006/11/03(金) 08:59:05
想像力欠如
454デフォルトの名無しさん:2006/11/03(金) 09:22:46
俺も452と同意見だが、仮にそのような機会があったとしても、
正規表現を持ち出すまではなくても、いわゆる単語検索でi1文字の検索はできるだろうと思う。
455デフォルトの名無しさん:2006/11/03(金) 09:24:59
まぁ変数名ごときで悩むような奴はたいていハゲてる
456デフォルトの名無しさん:2006/11/03(金) 09:29:09
吹いたw
457デフォルトの名無しさん:2006/11/03(金) 09:29:52 BE:89861663-2BP(204)
iの検索でifが引っかかるって問題は、単語単位の検索を使えばいい。

>>452
何百行もあるような関数を書いて、そのなかでアチコチで使いまわしてるとか、
そんなんじゃないの?
458デフォルトの名無しさん:2006/11/03(金) 09:32:08
そんな子供レベルの悩みに拘泥してる奴が実務屋名乗ってたら吹くな。
いくらなんでもそんなこたないだろう。
だからね、2行先の30カラム手前のループ制御変数に移動したかったらどうするか想像してご覧よ。
そんなことで一々マウスに手を出すほど暇じゃないんで、viなら/ic、emacsならC-sicで検索するわけだ。
これなら順に、nで移動したりC-sで移動したりできると言う寸法。
#WindowsのエディタならAlt+Fでicと入力しておいてF3で移動かな?
そんなときに、i一文字だとifに一々引っ掛かるでしょってことくらい判って欲しいなぁ。
#まぁ、本当に2行先の30カラム手前と判っているなら素直にviではjj30h、emacsでC-nC-nC-u30C-bするが。

だから、正規表現を持ち出すまでもないし同様に単語検索を持ち出すまでもないんだけど。

>>455
大丈夫、悩んでないから禿げてない。
つーか、誰か悩んでいるのか?
#あぁ、>458が随分とご執心のようで。
460デフォルトの名無しさん:2006/11/03(金) 10:49:11
> 2行先の30カラム手前のループ制御変数に移動したかったら
幸いにもそういう状況に出くわしたことはないので想像できないよ

素朴な疑問だけど間にClickみたいなicを含む単語があったらどうするの?
461429:2006/11/03(金) 11:06:01
だからぁ、そんなときは(頭の中で「はいはいClickClick」と唱えでもしてから)nなりC-sなりをもう一回押すだけだって。
#少なくとも、i一文字で引っ掛かる確率に比べればicが引っ掛かる確率は低いぞ。

それよか素朴な疑問なんだが、移動のアンカーに変数名を使いたくならないのか?
#そもそもただのコーダーなら(理論的には)修正の必要が生じることもないのかも知らんが。
462デフォルトの名無しさん:2006/11/03(金) 11:06:30 BE:39939124-2BP(204)
> そんなことで一々マウスに手を出すほど暇じゃないんで、viなら/ic、

for (i = 0; i < ... みたいな行のiに飛びたいなら「/i 」でもいけるけどね。
463デフォルトの名無しさん:2006/11/03(金) 11:17:11
結局俺ルールの話じゃないか。
多かれ少なかれその手のルールは皆持ってるもんだが、
それが普遍的なものであるか、真に有用なものであるかは
大抵の場合疑わしく、使ってる本人も大抵「手に馴染んでるから」以上の理由が無いことを
自覚して使ってるもんだ。

本人ペンディングしたがってるみたいだからこの辺でシメでいいとは思うが、
とりあえずこれだけ。
サンプル持ち出すまでも無く、それはそれなりのマイノリティ。

つーか大体にしてスレ違いもいいところだしな。
464デフォルトの名無しさん:2006/11/03(金) 11:23:59
スタイルの話は刷れ痴害
465452:2006/11/03(金) 13:22:00
>>461
一般的な変数アンカーは使うよ。
ただ、ループカウンタをターゲットにすることは稀 ってことで
参照されない回るだけのためのカウンタ or 配列等の引数に渡されるカウンタ

スタイルフリーな言語での宗教論争はしかたないよなぁ…
466デフォルトの名無しさん:2006/11/03(金) 15:58:46
ま、ソースコードを読む上では
別にicだからってそこまで見にくくなるわけじゃないし
他人の性癖にどうこう言う必要はないんだよね

プロジェクトで強要されても痴漢(あれ?)で一発だし
467デフォルトの名無しさん:2006/11/03(金) 16:07:35
置換じゃなくてリファクタリング機能を使おう。
短い変数名ならなおさら
468デフォルトの名無しさん:2006/11/03(金) 23:26:22
質問です。

char *moji[] = {
  "aaa",
  "bbb",
  "ccc",
  NULL
};
このような文字列を
while ( *moji ) {
  printf("%s\n", *moji);
  *moji〜
}
上のようにwhileで表示し、文字列NULLが来るまでアドレスを進めて表示したいのですが
*moji〜のアドレスを進める部分が分かりません。
どのようにすればいいのでしょうか?
469デフォルトの名無しさん:2006/11/03(金) 23:27:30
++moji;
470469:2006/11/03(金) 23:28:41
あ、mojiは配列か

char**p;
for(p=moji;*p;++p){
   printf("%\n",*p);
}
471デフォルトの名無しさん:2006/11/03(金) 23:31:21
氏ね
472468:2006/11/03(金) 23:39:43
>>470
ありがとうございますm(_ _)m
このようなやり方は思いつきませんでした。
別の変数用意しないとダメでしたね・・・。
473デフォルトの名無しさん:2006/11/03(金) 23:43:28
474デフォルトの名無しさん:2006/11/04(土) 04:06:36
>486
耳かっぽじってよく聞けよ
>1だからな>1
ちゃんと>1を見ろよなっ!!
475デフォルトの名無しさん:2006/11/04(土) 10:16:27
聞いたか>>486
これが最後だぞ!
>>1だからな!>>!
476デフォルトの名無しさん:2006/11/04(土) 10:26:17
>>486
どうしてこんなところに迷い込んだんだ…
477saga:2006/11/04(土) 11:58:47
>>486
佐賀ばっか
478デフォルトの名無しさん:2006/11/04(土) 14:29:32
>>486
もう来なくていいよ・・・
479デフォルトの名無しさん:2006/11/04(土) 15:01:36
最近趣味でsin()とかlog()とかの基本的な関数を自分で書き直して遊んでいるのですが、
ANSI Cでこれらの関数がどう定義されているのか載っている本・サイトはないでしょうか?
どのくらいまで誤差を許容しているのか知りたいのです

RAND()やRND()は「C言語による最新アルゴリズム事典」に載っているのを見つけたのですが
その他は見つけることが出来ませんでした
480デフォルトの名無しさん:2006/11/04(土) 15:02:39
>>479
規格書見れば?
481デフォルトの名無しさん:2006/11/04(土) 15:07:05 BE:89862629-2BP(204)
>>479
三角関数のアルゴリズムは、その本に載ってなかった?
(規格でどう規定されてるかは知らないけど)
482デフォルトの名無しさん:2006/11/04(土) 15:12:40
>>486は雑音だったんだよ!
483デフォルトの名無しさん:2006/11/04(土) 15:15:09
>>479
「C言語の規格としての定義」なら、例えばJIS X 3010 では

7.12.4.6 sin 関数群
形式
 #include <math.h>
 double sin(double x);
 float sinf(float x);
 long double sinl(long double);

機能   sin関数群は、x(ラジアン値)の正弦を計算する。
返却値 sin関数群は、正弦値を返す。

と書いてあるだけ。

JIS検索
ttp://www.jisc.go.jp/
484デフォルトの名無しさん:2006/11/04(土) 15:17:16
>>480
ググってみました
…高っ

>>481
三角関数はtan()を連分数展開で求めて、sin()cos()はタンジェントから求めるという方法が載っていたのですが
ANSI Cの規格についてはノータッチでした。

完成したらANSI Cの関数と性能比較をしたいのですが、誤差を大体同じくらいにしないと比較にならないので
困っています。
485デフォルトの名無しさん:2006/11/04(土) 15:21:37
ダウンロードできるぜ。↓の N1124
http://www.open-std.org/jtc1/sc22/wg14/
486デフォルトの名無しさん:2006/11/04(土) 15:32:06
>>485
わざわざありがとうございます。
まだ斜め読みですが、483さんが書いてくださったようなことしか書いてなくて
実装についてはノータッチみたいですね。
結局細かい実装については各コンパイラにおまかせということ、なんですかねえ

ともあれお二方ともありがとうございました。
487479:2006/11/04(土) 15:40:00
数字コテつけておけばよかった

ざっと流して読んだところ>>485さんの教えてくださったpdfには実装例について書いている関数もあれば
定義だけ書いてある関数もあるようです。
RAND()は実装例についても載っていました。
488デフォルトの名無しさん:2006/11/04(土) 17:12:58
>>484
483のサイトからただでPDFが得られる。

ところで数学関数の実装はテイラー展開などの近似式を使う場合もあるが、、
CPUがそういう計算の命令を持っている場合には(アセンブリ言語などで)それを使うこともある。
489479:2006/11/04(土) 17:25:53
>>488
一応マクローリン展開による方法と連分数展開による方法で実装して
速度比較するつもりです

CPUが持ってることもあるんですか、知りませんでした
もし持ってれば大分高速化できそうですね
x86のアセンブリの仕様も読んでおきます
490デフォルトの名無しさん:2006/11/04(土) 18:52:20
コンパイル後に、lint というツールを使用するのは基本なんでしょうか。
lintで構文チェックするのは常識ですか。
491デフォルトの名無しさん:2006/11/04(土) 20:17:49
C言語の規格とは関係ないな
492デフォルトの名無しさん:2006/11/04(土) 20:40:57
>> 491
どのあたりの板になりますか?
493デフォルトの名無しさん:2006/11/04(土) 21:16:36
494デフォルトの名無しさん:2006/11/04(土) 21:31:31
>> 493
そちらに行きます。ありがとうございます。
495デフォルトの名無しさん:2006/11/04(土) 21:37:56
fprintf(gp,"plot \"%s\" using 1:3 with lines \n",fourier);

gnuplotをパイプで使うプログラム内のこの記述でエラーが出ます。
fourierはn行3列のデータです。

どなたかエラーの理由が分かる方教えて下さい。
496デフォルトの名無しさん:2006/11/04(土) 21:46:14
どなたかエラーメッセージが分かる方教えて下さい。エスパーでもいいので
497495:2006/11/04(土) 21:49:10
すいません。自己解決しました。
498479:2006/11/04(土) 22:07:03
>>488
読んできました
x86の命令セットにもサイン・コサイン・タンジェント・アークタンジェント・平方根等の命令がありました

これで悩む必要がなくなって嬉しいような残念なような複雑な気分です
ありがとうございました
499デフォルトの名無しさん:2006/11/04(土) 22:23:38
精度を犠牲にすればCPU組み込みの命令よりさらに早くできるけどな
500デフォルトの名無しさん:2006/11/04(土) 22:28:36
まあソフトウェア実装のほうがいろいろ融通が利くのは当然だわな
501479:2006/11/04(土) 22:32:57
速度出したかったら表作っておいて補間がオーソドックスな方法でしょうか?
FSINのクロック数調べたら60〜100くらいかかる上にペアリングできなくてちょっと驚きました
502デフォルトの名無しさん:2006/11/04(土) 22:49:09
前半はアルゴリズムや計算量の話だし後半はCPU依存だし
このスレで答えていいのか微妙
503デフォルトの名無しさん:2006/11/04(土) 22:57:52
>>502
確かに ISO も ANSI も JIS も関係がないな。
ぶっちゃけ自分の欲しい答えが手軽に手に入ればみんなどこでもいいんだ。
やっぱゆとり教育世代の自己中な性格がこんなところにまで影響してきているということか。
504デフォルトの名無しさん:2006/11/04(土) 23:10:26
まあとりあえず規格から探してみるって姿勢はいいんじゃねーの
505デフォルトの名無しさん:2006/11/05(日) 03:05:49
で、君たち、年はいくつだ?
506デフォルトの名無しさん:2006/11/05(日) 10:47:07
俺33。
嫁なし子供なし。
507デフォルトの名無しさん:2006/11/05(日) 13:39:15
構造体の配列のソート処理について教えてください。
例えば、メンバ a, b, c を持つ構造体の配列を、少なくともひとつの列を選び
その列についてソートします。
ただし、複数の列を選択した場合は、優先度を付けてソートしたいのです。
具体的には、メンバ a, c について、この順の優先度でソートする場合は
配列全体で見た場合、メンバ a でソートされていて、メンバ a の同値ごとに
メンバ c でソートしたいのです。
簡単にやりたいことを言うと SQL の ORDER BY a, c を実装したいのです。

とりあえず、優先度の低いメンバから順々にソートをしていけば目的の結果を得ることができました。
※ 上記の例だと、まずメンバ c でソートして、その後にメンバ a でソートしました。

ただ、ソート処理を何回も繰り返すのが、どうも気に入らないのですが
一度のソート処理で同じような結果を得られる方法ってあるのですか?
508デフォルトの名無しさん:2006/11/05(日) 14:21:12
>>507
qsort() に適当な辞書順比較関数を渡せ。
509デフォルトの名無しさん: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;
}
510507:2006/11/05(日) 14:59:12
レスありがとうございます。

2つのメンバについて比較する関数を用意すればいいのはわかりました。
ということは>>507のように、3 個のメンバを持つ構造体の配列をソートする時
任意の数のメンバを選択して、かつ優先度も任意でつけられる場合は

・メンバ 1 個についてのソート
 3個のメンバから1個を選ぶ・・・3通り
・メンバ 2 個についてのソート
 3個のメンバから2個を選んで優先度で並べる・・・3P2 = 6通り
・メンバ 3 個についてのソート
 3個のメンバから3個を選んで優先度で並べる・・・3! = 6通り

のように、15通りの比較関数を容易しておかないといけないのですか?
それとも、今回のような要件の場合は、ソートを複数回行う方がよいのですか?
511デフォルトの名無しさん:2006/11/05(日) 15:08:31
規格に全然関係ない質問に嬉々として答えてる馬鹿はなんでここにいるの?
512デフォルトの名無しさん:2006/11/05(日) 15:09:54
>509には問題があるので要注意。

>>510
15通りの比較関数の代わりに、一つの比較関数でやれば宜しい。
そのためには、比較関数で参照できるようなフラグを用意すればいい。
Ex.
struct {
enum {CompColNone, CompColA, CompColB, CompColC} Col1st, Col2nd, Col3rd;
} gComp;
int hogeComp(const void * a, const void * b)
{
const hoge * lhs = (const hoge *) a;
const hoge * rhs = (const hoge *) b;
switch (gComp.Col1st) {
case CompColA:
if (lhs->a > rhs->a) return 1;
if (lhs->a < rhs->a) return -1;
break;
case CompColB:
if (lhs->b > rhs->b) return 1;
if (lhs->b < rhs->b) return -1;
break;
case CompColC:
if (lhs->c > rhs->c) return 1;
if (lhs->c < rhs->c) return -1;
break;
}
// 以下同様に2nd、3rdも処理
return 0;
}
// こういう泥臭い実装が嫌ならC++に移行してしまえ
513デフォルトの名無しさん:2006/11/05(日) 15:09:57
>>510
要件がほんとにあんたの言うとおりなら、比較関数の動作はそれだけの種類が必要だろう。
ソートを複数回するのは速度的に不利だが、比較関数は用意しなくていい。
それが「よい」かどうかはあんたが決めること。

複数回ソートでうまく動作させるためには安定ソートじゃないとだめだから、
qsort() が使えないのもデメリットだな。
514デフォルトの名無しさん:2006/11/05(日) 15:10:30
>>511
そりゃあんた、ここは企画のみを云々するスレじゃないからね。
515デフォルトの名無しさん:2006/11/05(日) 15:12:13
>>511
>>1 を読む限り、規格に関連した話題のみという縛りはないからだろう。
嫌ならさっさと誘導しろよ。そして次スレの >>1 を提案するんだ。
516デフォルトの名無しさん:2006/11/05(日) 15:30:52
どうみても宿題丸投げ行きです
517507:2006/11/05(日) 16:27:10
色々とありがとうございました。
>>512さんのをベースにやってみようと思います。

それと、実装する言語がC言語であること、宿題ではなく個人的な疑問だったため
あえて宿題スレではなく、こちらで質問させてもらいました。
不愉快に思われた方、すみませんでした。
518デフォルトの名無しさん:2006/11/05(日) 16:29:58
>>507
これでは不満かい?
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

char *atoffset(const void* s, size_t offset) {
    return (char*)s + offset;
}
size_t comp2configure1, comp2configure2;
#define comp2configure(s,a,b) do{comp2configure1=offsetof(s,a);comp2configure2=offsetof(s,b);}while(0)
int comp2(const void* lhs, const void* rhs) {
    int first = *(int*)atoffset(lhs, comp2configure1) - *(int*)atoffset(rhs, comp2configure1);
    if (first)
        return first;
    else
        return *(int*)atoffset(lhs, comp2configure2) - *(int*)atoffset(rhs, comp2configure2);
}

typedef struct hoge {
    int a, b, c;
} hoge;
int main(void) {
    int i;
    hoge x[] = {{5,1,3},{2,3,1},{3,3,3},{5,2,1},{13,11,4}};
    comp2configure(hoge, a, c);
    qsort(x, sizeof(x) / sizeof(hoge), sizeof(hoge), &comp2);
    for(i = 0; i < 5; i++)
        printf("%d : a->%2d, b->%2d, c->%2d\n", i, x[i].a, x[i].b, x[i].c);
    return 0;
}
519例えば0x7fffffffと-1:2006/11/05(日) 16:55:37
だから整数値を比較のために引くのは(アンダーフローの可能性があるから)拙いってばさ。
520デフォルトの名無しさん:2006/11/05(日) 17:02:10
差の最大値が INT_MAX 以下(未満?) でないと、引き算で代用できないっとことだな。
521518:2006/11/05(日) 17:05:32
んじゃ書き直しで。
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

char *atoffset(const void* s, size_t offset) {
    return (char*)s + offset;
}
size_t comp2configure1, comp2configure2;
#define comp2configure(s,a,b) do{comp2configure1=offsetof(s,a);comp2configure2=offsetof(s,b);}while(0)
int comp2(const void* lhs, const void* rhs) {
    return *(int*)atoffset(lhs, comp2configure1) > *(int*)atoffset(rhs, comp2configure1) ||
        *(int*)atoffset(lhs, comp2configure1) == *(int*)atoffset(rhs, comp2configure1) &&
        *(int*)atoffset(lhs, comp2configure2) > *(int*)atoffset(rhs, comp2configure2);
}

typedef struct hoge {
    int a, b, c;
} hoge;
int main(void) {
    int i;
    hoge x[] = {{5,1,3},{2,3,1},{3,3,3},{5,2,1},{13,11,4}};
    comp2configure(hoge, a, c);
    qsort(x, sizeof(x) / sizeof(hoge), sizeof(hoge), &comp2);
    for(i = 0; i < 5; i++)
        printf("%d : a->%2d, b->%2d, c->%2d\n", i, x[i].a, x[i].b, x[i].c);
    return 0;
}
522デフォルトの名無しさん:2006/11/05(日) 17:08:52
>>521
qsort() の仕様を読み直せ。
523デフォルトの名無しさん:2006/11/05(日) 17:11:55
何この盛り上がり
今ごろ>>511>>516は顔真っ赤にしてるんだろうな
524デフォルトの名無しさん:2006/11/05(日) 17:13:32
>>522
ISO/IEC 9899:1999の7.20.5.2 The qsort functionを読んだけど、どのあたりを
意図しているのか分からなかった。教えて♥
525デフォルトの名無しさん:2006/11/05(日) 17:15:44
>>524
比較関数の戻り値。
>>521 コードじゃ論理比較の結果だから 正(または負)か0しか返さない。
526デフォルトの名無しさん:2006/11/05(日) 17:16:47
1 か 0 しか返らないよ。
527デフォルトの名無しさん:2006/11/05(日) 17:17:25
C++ の sort() と勘違いしてるんだろう。
528デフォルトの名無しさん:2006/11/05(日) 17:20:31
>>525-526
relational operatorsも読んでみた。確かに!

>>527
ご名答。面目ない。
529デフォルトの名無しさん:2006/11/05(日) 17:21:06
つか 0 と 1 しか返せない関数だと qsort で止まるか落ちるぞ?
530デフォルトの名無しさん:2006/11/05(日) 17:23:52
>>529
え?なんで? 0 も 1 も戻り値としては有効だろ?
531デフォルトの名無しさん:2006/11/05(日) 17:25:18
負の戻りも必要だー。
532デフォルトの名無しさん:2006/11/05(日) 17:25:19
>>530
qsort() 内部の要素比較再帰/ループで矛盾が生じるから。
533デフォルトの名無しさん:2006/11/05(日) 17:28:30
つか、みんなイロイロ考えつくな。俺は↓しか思いつかんかった。

int hogecompA(const hoge* lhs, const hoge* rhs){
 return (rhs->a < lhs->a) - (lhs->a < rhs->a);
}
int hogecompB(const hoge* lhs, const hoge* rhs){
 return (rhs->b < lhs->b) - (lhs->b < rhs->b);
}
int hogecompC(const hoge* lhs, const hoge* rhs){
 return (rhs->c < lhs->c) - (lhs->c < rhs->c);
}
int (*hoge_comp1)(const hoge*, const hoge*)=0;
int (*hoge_comp2)(const hoge*, const hoge*)=0;
int (*hoge_comp3)(const hoge*, const hoge*)=0;
int hogecomp(const void* lhs, const void* rhs){
 int dst = hoge_comp1((const hoge*)lhs,(const hoge*)rhs);
 if(!dst && hoge_comp2) dst = hoge_comp2((const hoge*)lhs,(const hoge*)rhs);
 if(!dst && hoge_comp3) dst = hoge_comp3((const hoge*)lhs,(const hoge*)rhs);
 return dst;
}
534デフォルトの名無しさん:2006/11/05(日) 17:55:32
具体的な例を示すことができなくてすいません。
これまで、コンパイルできた古いソースが、コンパイラのバージョンを
上げたり、他のOS上でポーティングしようとした場合、エラーになること
があるのは当り前と考えるべきでしょうか。
ポーティングで気をつけるべき点があれば、ご教示ください。
535デフォルトの名無しさん:2006/11/05(日) 18:06:59
>>534
↓含めて C FAQ に一通り目を通し、規格に沿ったコーディングを心がけろ。
http://www.kouno.jp/home/c_faq/c16.html
536デフォルトの名無しさん:2006/11/05(日) 18:12:42
>> 535
どうも、ありがとうございます。
でもね、誰が作ったわからない巨大なプログラムをポーティングするのは
つらいと思いませんか。コンパイラ以外でチェックする方法はないですかね。
ないでしょうね。
537デフォルトの名無しさん:2006/11/05(日) 18:38:51
>>536
ありませんね。だからこそ世界中で多数の人間が苦労しているわけで。
538デフォルトの名無しさん:2006/11/05(日) 18:43:24
>> 537
なるほど、そうですよね。理解しました。
539デフォルトの名無しさん:2006/11/05(日) 18:48:45
>>と数字の間にスペース入れるなやカス
540デフォルトの名無しさん:2006/11/05(日) 18:51:54
>>539 すまんです。
541デフォルトの名無しさん:2006/11/05(日) 23:22:45
規格ではビットシフトはデリミタを入れてもいいはずだが・・・
542デフォルトの名無しさん:2006/11/05(日) 23:40:04
アンカだろw
543デフォルトの名無しさん:2006/11/06(月) 01:29:08
釣りだろw
544デフォルトの名無しさん:2006/11/06(月) 06:50:44
コマンドからいくつか引数を取って
一つの文字列につきメモリをその都度動的に確保し
逆順に並べ替えて、さらに出力行の最後の一文字目だけ大文字にして
出力するプログラム
(動的メモリ割り当て)

誰か教えて下さい
お願いします
545デフォルトの名無しさん:2006/11/06(月) 06:55:02
>>544
スレ違い。宿題スレ逝け。
http://pc8.2ch.net/test/read.cgi/tech/1161257941/
546デフォルトの名無しさん:2006/11/06(月) 13:09:33
bsearchを用いてlist1を探索するプログラムを以下の様に書いたのですが、
list2を探索する時にはbsearchの引数やcomparをどの様に書き直せば良いのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N_ELEMENTS      3
#define MAX_STRLEN      16
int compar(const char **str1, const char **str2) { return strcmp(*str1, *str2); }
int main(void)
{
  void **p;
  char *key = "orange", *list1[N_ELEMENTS], list2[N_ELEMENTS][MAX_STRLEN] = {
    "apple", "banana", "orange"
  };
  list1[0] = "apple";
  list1[1] = "banana";
  list1[2] = "orange";
  if((p = bsearch(&key, list1, N_ELEMENTS, sizeof(char *), (int (*)(const void *, const \void *))compar)) != NULL) {
    printf("%d\n", ((unsigned int)p - (unsigned int)list1) / sizeof(char *));
  }
  return 0;
}
547デフォルトの名無しさん:2006/11/06(月) 14:05:32
>>546
一つ前のレスに手がかりがあるよ!
548546:2006/11/06(月) 14:35:58
自己解決しました。

>>547
課題とかでは無かったんですが、アドバイスありがとうございます。
549デフォルトの名無しさん:2006/11/06(月) 14:41:39
callback はキャストして渡さずに(bsearch 呼び出し部)、
要求されている通りの型で関数宣言して、その内部で自前の型にキャストして使ったほうが良いよ。

適合していない形式のものを無理矢理渡してしまう可能性があるからね。
550デフォルトの名無しさん:2006/11/06(月) 22:22:00
設問
入力された単語の長さを横棒グラフにして表示するプログラムを作成せよ。
横棒グラフは単語の長さだけ'*'を表示する。ctrl + Z が入力されると処理を終了する。
551デフォルトの名無しさん:2006/11/06(月) 22:51:13
ま た お ま え か
552デフォルトの名無しさん:2006/11/06(月) 23:06:08
int main() {
 char buff[200];
 printf("単語を入力しろ\n");
 scanf("%s", buff);
 printf("単語の長さ分の*を入力しろ\n");
 scanf("%s", buff);
 prinf("%s\nおわり\n", buff);
 return 0;
}
553デフォルトの名無しさん:2006/11/06(月) 23:08:07
554デフォルトの名無しさん:2006/11/07(火) 13:50:58
うんこをしたいんですが、どうしたらいいですか?
555デフォルトの名無しさん:2006/11/07(火) 16:57:34
>>554
まずトイレへ行き、
556デフォルトの名無しさん:2006/11/07(火) 17:51:08
靴下をはけ
557デフォルトの名無しさん:2006/11/07(火) 18:28:35
パンツを脱ぐ
558デフォルトの名無しさん:2006/11/07(火) 18:45:07
玄関に行き、
559デフォルトの名無しさん:2006/11/07(火) 18:45:52
仰向けになる
560デフォルトの名無しさん:2006/11/07(火) 18:48:45
大きな声で 「ぬるぽ」 と叫ぶ
561デフォルトの名無しさん:2006/11/07(火) 18:58:27
その後、
562デフォルトの名無しさん:2006/11/07(火) 19:34:55
デパートへ行って店員に要求を丸投げするのだ。
終わり。
563デフォルトの名無しさん:2006/11/07(火) 19:53:39
規格によると、
排便はコメントか文字列の中でしないとエラーになったと思うが・・・
564デフォルトの名無しさん:2006/11/07(火) 20:30:14
お前ら・・・w
565デフォルトの名無しさん:2006/11/07(火) 21:08:41
規格厨氏ね
566デフォルトの名無しさん:2006/11/07(火) 21:14:57
んじゃなんだ?コンパイラのバックエンドから独自拡張しろとでも?
567デフォルトの名無しさん:2006/11/08(水) 01:20:54
>>554-566
ここまでをまとめると、
Q:うんこがしたい
A:トイレへ行き 〜 中略 〜 後ろの穴を拡張しろ。

そろそろC言語の話をしようじゃないか。
568デフォルトの名無しさん:2006/11/08(水) 02:23:57
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
569デフォルトの名無しさん:2006/11/08(水) 02:26:39
データをビット単位でずらしたい気分になったときに役立つ。
570デフォルトの名無しさん:2006/11/08(水) 02:39:52
char kk[5]="baka"; として
printf("%s",kk); でも出力されなく、
for(i=0; i>5; i++){printf("%c",kk); でも出力されません。
何がいけないんでしょう?
571デフォルトの名無しさん:2006/11/08(水) 05:00:41
前者は不明ですが、後者は明らかにループが回っていません。
572デフォルトの名無しさん:2006/11/08(水) 05:32:04
とりあえず、"%s\n"、"%c\n"に変えてみてくれ。
話はそれからだ。
573デフォルトの名無しさん:2006/11/08(水) 05:45:37
>>572
それなんか意味あるの? このスレ的に。
574デフォルトの名無しさん:2006/11/08(水) 13:58:15
>>570
環境。
575デフォルトの名無しさん:2006/11/08(水) 17:05:47
for(i=0; i<5; i++)
576デフォルトの名無しさん:2006/11/09(木) 05:44:11
>>570
むしろコンパイル通ったのがすごい・・・
577デフォルトの名無しさん:2006/11/09(木) 17:25:15
typedef struct {
    int pc;
    struct PCS *next;
} PCS;

void push(PCS** top,int pc)
{
    PCS* np;
    np = (PCS *) malloc(sizeof(*np));

    np->next = *top;
    np->pc = pc;
    *top = np;
}

このコードで、np->next = *topが
warning: assignment from incompatible pointer type
となる理由教えてくだしゃい
578デフォルトの名無しさん:2006/11/09(木) 17:30:10
typedefするとしてもめんどくさがらずにちゃんと構造体に名前つけたほうがいいと思うよ。
579デフォルトの名無しさん:2006/11/09(木) 17:40:14
つけたけどwarning消えないッス
580デフォルトの名無しさん:2006/11/09(木) 17:47:08
>>579
3行目 struct PCS *next;
って、それ以前を見てもなんなのかわかんな〜い><
581デフォルトの名無しさん:2006/11/09(木) 17:50:11
>>578,580
こういうことか!ありがとうございました
typedef struct PCS PCS;
struct PCS {
    int pc;
    struct PCS *next;
};


ちなみにこうしてたから>>579書きました
struct PCS {
    int pc;
    struct PCS *next;
};
typedef struct PCS PCS;
何がしたかったんだ、、、。
582デフォルトの名無しさん:2006/11/09(木) 18:07:47
ha?
583デフォルトの名無しさん:2006/11/09(木) 18:30:05
だめだ・・・
584デフォルトの名無しさん:2006/11/09(木) 20:16:34
typedef struct pcs {
int pc;
PCS *next;
} PCS;
のほうが良くない?
585デフォルトの名無しさん:2006/11/09(木) 20:23:10
良くなくない?
586デフォルトの名無しさん:2006/11/09(木) 20:48:04
プログラム(foobar)とsharedライブラリ(libhoge.so)があって、foobarのグローバル変数をlibhoge.soから参照したいのですが、どういう風に書けばいいでしょうか。
header.hにグローバル変数を書いて、両方でインクルードしてみたのですが、同名の別の変数になってしまいました。
何かいい方法はないでしょうか。
よろしくお願いします。
587デフォルトの名無しさん:2006/11/09(木) 20:48:24
typedef struct PCS_t {
int pc;
struct PCS_t *next;
} PCS;
のが良いな俺的には
588デフォルトの名無しさん:2006/11/09(木) 20:54:01
typedef struct _PCS {
 int pc;
 struct _PCS *next;
} PCS;
589デフォルトの名無しさん:2006/11/09(木) 21:03:25
タグ名と typedef 名を別にするメリット、あるいは同じにしたときのデメリットって何?

わざわざ別の名前つけて、しかもタグ名のほうは実装向けっぽい名前にするのは、
ヘッダの依存関係を減らすための前方宣言が使いにくくなるんでやめてほしい。
ひどいときには >>588 みたいに平気で予約名使う奴までいるし。
590デフォルトの名無しさん:2006/11/09(木) 21:06:28
opaque でない構造体を typedef するのはあまりお勧めできない
591デフォルトの名無しさん:2006/11/09(木) 21:08:24 BE:79876782-2BP(204)
予約名?
592デフォルトの名無しさん:2006/11/09(木) 21:11:13
予約名って予約語のこと?
593デフォルトの名無しさん:2006/11/09(木) 21:14:06
予約された識別子のことだろう。
先頭アンダースコアで英大文字続く識別子はすべて予約されている。
ユーザープログラムで使用した場合の結果は未定義となる。
594593:2006/11/09(木) 21:15:30
使用した場合じゃなくて、宣言(マクロ定義含む)した場合だな。
595デフォルトの名無しさん:2006/11/09(木) 21:17:40
>>590
opaque な構造体と区別する理由は何?
596デフォルトの名無しさん:2006/11/09(木) 21:19:13
>>595
Typedefs are problematic
because they do not properly hide their underlying type; for example you
need to know if the typedef is the structure itself or a pointer to the
structure. In addition they must be declared exactly once, whereas an
incomplete structure type can be mentioned as many times as necessary.
Typedefs are difficult to use in stand-alone header files: the header
that defines the typedef must be included before the header that uses it,
or by the header that uses it (which causes namespace pollution), or
there must be a back-door mechanism for obtaining the typedef.
597デフォルトの名無しさん:2006/11/09(木) 21:22:27
>>596
その理由なら typedef 全部お勧めできないだろ。 goto >>595
598デフォルトの名無しさん:2006/11/09(木) 21:25:16 BE:279569478-2BP(204)
「opaque でない構造体」って、どんなの?
599デフォルトの名無しさん:2006/11/09(木) 21:27:38
>>598
ヘッダ(公開インターフェース)で定義(宣言だけじゃなくて)されている構造体。
600デフォルトの名無しさん:2006/11/09(木) 21:31:51
>>597
opaqueな状態だと詳細はパッケージの外からは見えないわけだから
許してやってもいいかなとおもっただけ.
パッケージ内ではtypedefされていない方でプログラムするって原則で...
601デフォルトの名無しさん:2006/11/09(木) 21:32:38 BE:359446289-2BP(204)
>>599
サンキュー。
602デフォルトの名無しさん:2006/11/09(木) 21:37:47
>>600
詳細が見えなくても、 typedef は一度しか宣言できないのは変わらなくて、
typedef したヘッダを include しないと使えなくなるのも変わらない。
やっぱり全部やめたほうがいいと思うよ。
603デフォルトの名無しさん:2006/11/09(木) 21:58:14
FILE*を見習えばいいんじゃね
604デフォルトの名無しさん:2006/11/09(木) 23:36:58
>>602
いあ, まぁ, そなんだけどね…
っか, 前後の流れが…

おまえらなんで構造体をtypedefするんだよぉorz
605デフォルトの名無しさん:2006/11/10(金) 00:04:09
構造体の typedef 普通にするけど何か文句あるの?
これぐらい慣れとかないと C++ でのーみそ破裂するぞ。
606デフォルトの名無しさん:2006/11/10(金) 00:06:26
>>605 >>596 (要約 >>600
607デフォルトの名無しさん:2006/11/10(金) 00:16:25
C++ならenumもstructもtypedefなんかせんわい。
608デフォルトの名無しさん:2006/11/10(金) 00:22:36
オバキューって何だよ
609デフォルトの名無しさん:2006/11/10(金) 00:29:44
>>607
C++ は使う時に struct 省略できるし、class だってあるだろ。
610デフォルトの名無しさん:2006/11/10(金) 00:30:12
処で、main()の再帰呼び出しって認められてたっけ?
611デフォルトの名無しさん:2006/11/10(金) 00:36:00
>>610
C では許容されてる。
C++ では禁止されてるはずだけど何故か VC6 では動く。
612610:2006/11/10(金) 00:39:13
>>611
情報THX。
ふむ、禁止はされてないのか。じゃ、ほっとくか。
613デフォルトの名無しさん:2006/11/11(土) 00:18:55
>>593
Win32 APIヘッダって規格の視点から見たら「ユーザープログラム」だよな。
何とかしてくれ
>>610
C++で禁止されてるのには理由もあるけどスレ違いな理由なのでここには書かない
614デフォルトの名無しさん:2006/11/11(土) 00:52:43
CやC++のISO標準仕様を手に入れたいのですが、お金払わないと無理なんでしょうか。
615デフォルトの名無しさん:2006/11/11(土) 00:54:25
すみません。あげさせせて頂きます。
616デフォルトの名無しさん:2006/11/11(土) 00:57:37
>>614
基本的には、買うもの。英語のドラフトでいいならダウンロード可能。
C なら >>485 。 C++ なら、 C++相談室のテンプレに同様のリンクが張ってあったはず。
617610:2006/11/11(土) 08:14:19
>>613
うん、C++の方は理由を含めて知ってた。Cの場合を確認したかったのよ。
618デフォルトの名無しさん:2006/11/11(土) 09:10:26
さんくす616
619デフォルトの名無しさん:2006/11/11(土) 09:20:43
>>614
http://www.jisc.or.jp/
JIS検索→規格番号X 3010

ただしC99相当
620デフォルトの名無しさん:2006/11/12(日) 21:54:32
制限時間を指定して、数字を入力。
制限時間がきたら入力中止。
というプログラムを作りたいのですが
並列処理が必要なので手に余っています。

どなたかアドバイスおねがいします
621デフォルトの名無しさん:2006/11/12(日) 22:17:17
>>620
環境もGUIorCUIかも何も提示せずにそれだけで何か答えがもらえるか?
622デフォルトの名無しさん:2006/11/13(月) 01:02:10
このスレでは標準関数のみ & CUIと決め付けて回答していいだろ。
どっちにしろ宿題スレ行きだとは思うが
623デフォルトの名無しさん:2006/11/13(月) 01:14:29
Cの標準で並列処理は無理だからさようなら。
624デフォルトの名無しさん:2006/11/19(日) 14:13:23
625デフォルトの名無しさん:2006/11/19(日) 21:27:47
>>624
笑いどころは void が暴れてるところ?
626デフォルトの名無しさん:2006/11/20(月) 22:27:24
ファイルを開いた後で、モードを変換することって出来ますか?
具体的には
"r"で開いてscanfで読み込んだ後、"rb"にモードを変更して残りをfreadしたいのです
627デフォルトの名無しさん:2006/11/20(月) 22:52:19
環境依存。
628デフォルトの名無しさん:2006/11/20(月) 22:53:44
>>626
freopen()
629デフォルトの名無しさん:2006/11/20(月) 23:32:10
freopenは標準関数に含まれてるな。
なんでもかんでも環境依存で片付けるなよ
630デフォルトの名無しさん:2006/11/21(火) 01:24:12
そもそも"rb"と"r"のモードが違うという発想そのものが環境依存だ。
POSIXでは全く同じ動作とされている。
631デフォルトの名無しさん:2006/11/21(火) 01:28:48
誰も"rb"と"r"が違うと決めつけてはいない。
ただモードを変えたい、それだけだろ。動作は同じかどうかは
それこそ環境依存だが。相変わらずピンボケレスだな。
632デフォルトの名無しさん:2006/11/21(火) 01:29:13
>>630
アホか。逆だろ。「POSIXでは〜」ってのが環境依存って言うんだよ。
633デフォルトの名無しさん:2006/11/21(火) 02:32:20
>>631
お前が正しい。変なやつにマジレスするな。
634デフォルトの名無しさん:2006/11/21(火) 10:56:24
要は、ISOでは"rb"の動作を規定していないが、"r"と"rb"が違う環境ではそれを切り替える目的にfreopen()が使える、
と言う話だろ。
Linuxのマニュアルでも"rb"を使うことは否定されていないのだし、>630の勇み足だな。
635デフォルトの名無しさん:2006/11/21(火) 12:20:49
"r" → "rb" が出来ない環境があるやもよ?あるやもよ?
636デフォルトの名無しさん:2006/11/21(火) 12:24:30
>>635
634ちゃんと理解した?
637デフォルトの名無しさん:2006/11/21(火) 12:27:30
>>635
それはそうだが、標準でモードを切り替える方法は freopen() しかない。
使うんなら戻り値見てエラー処理しとけってことでいいだろ。

モード切り替えなくても良いようにできればそれがベストではあるんだけど。
638デフォルトの名無しさん:2006/11/21(火) 12:53:26
処で、freopen()ではシークしなおさなければならないわけで、それが果たして>626の遣りたいことなのだろうか。
639デフォルトの名無しさん:2006/11/21(火) 13:02:00
>>638
> freopen()ではシークしなおさなければならない

そんな制限あったっけ?
手元の MSDN にはそんなコト一切書いてないよ。
640デフォルトの名無しさん:2006/11/21(火) 13:06:37
ごめん一切書いてないよは嘘だった。
でも、それは read と write を切り替える時は、と書いてある。

> "r+"、"w+"、または "a+" のアクセス種別を指定すると、読み出しと書き込みの
> 両方を行えます (ファイルは "更新" モードで開きます)。ただし、読み出しと
> 書き込みを切り替えるには、fsetpos、fseek、rewind のいずれかの関数を実行
> しなければなりません。fsetpos 関数または fseek 関数には、現在位置を指定
> できます。
641デフォルトの名無しさん:2006/11/21(火) 13:42:53
お前ら余程原理主義者だな
圧迫したぜ
642デフォルトの名無しさん:2006/11/21(火) 14:46:28
>>636
>、"r"と"rb"が違う環境ではそれを切り替える目的にfreopen()が使える
なんて何処にも記述されていない。
記述されているのは、
>どのようなモード変更を許すか、及びどのような状況での変更を許すかは、処理系定義とする。
だと言ってるんだが。
643デフォルトの名無しさん:2006/11/21(火) 15:01:21
どうでもいいが、「ISOでは」はその読点の前までに掛かっているのだろうよ。
644デフォルトの名無しさん:2006/11/21(火) 19:57:33
>>641
とりあえずスレタイ見たら?
仕様どおりに実装していない処理系の話とかは各々のスレでよろしく
645デフォルトの名無しさん:2006/11/21(火) 23:22:41
負の整数をunsignedにキャストした結果は不定ですか?それとも未定義ですか?
646デフォルトの名無しさん:2006/11/22(水) 00:27:49
>>645
6.3.1.3 により、キャスト先の型の範囲に収まるまでその型の
最大値 +1 の数値が足される(または引かれる)。

型の最大値が処理系定義なんで、厳密には処理系定義なんだろうけど、
結果は十分予測できる。
647デフォルトの名無しさん:2006/11/22(水) 13:15:56
すいません、ANSIってなんて読むんですか?

アンシ?アンサイ?アンスィイ?
それともエインスィイ?
648デフォルトの名無しさん:2006/11/22(水) 13:19:50
>>647
アンジー
649デフォルトの名無しさん:2006/11/22(水) 13:41:47
>>647
えーえぬえすあい
650デフォルトの名無しさん:2006/11/22(水) 23:44:17
>>647
ぬるぽ
651デフォルトの名無しさん:2006/11/22(水) 23:45:11
>>650
ありガとうございます!!
652デフォルトの名無しさん:2006/11/23(木) 20:14:49
>>650
ガッンジー
653デフォルトの名無しさん:2006/11/24(金) 01:22:01
>>650
ガッツリ
654650:2006/11/25(土) 00:46:06
それ以上続けると嫉妬されるのでやめてくれ。
655デフォルトの名無しさん:2006/11/25(土) 00:58:40
>>655の人気に嫉妬
656デフォルトの名無しさん:2006/11/28(火) 21:32:10
入力された文字列にa〜zとA〜Zと0〜9しか含まれていないかどうかを調べる関数を
if ( (*c >= '0' && *c <= '9') || (*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z') )
という条件で実装しようと思ったんですが、例えば0〜9が連続していない文字コード体系ではこの条件は破綻するかなと思い
結局全ての文字について調べるように実装しました。

C言語においては文字コードはどうなってるのでしょうか?
if ( (*c >= '0' && *c <= '9') || (*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z') )
この条件を使ってしまっていいのでしょうか。
657デフォルトの名無しさん:2006/11/28(火) 21:43:16
>>656
#include<ctype.h>
isalnum(c)

あーまぁわざわざ車輪をもう一度作りたいなら一応アドバイスしておくと、
0-9の連続は規格で保障されている。
でもa-z,A-Zは保障されていないから厳密には駄目。
658656:2006/11/28(火) 22:18:27
>>657
isalnum(c)

ぬわあああああ
ありがとうございました。
659416:2006/11/30(木) 01:56:33
>658
こういう関数って、どういうふうに実装されているんでしょうか?
if( c=='0'||c=='1'||c=='2'|| ・・・
 ||c=='a'||c=='b'||c=='c'|| ・・・
みたいに、一個ずつ比較するんでしょうか?
660デフォルトの名無しさん:2006/11/30(木) 01:58:41
>>659
つーか、スレ違い。
661デフォルトの名無しさん:2006/11/30(木) 04:34:21
>>659
普通はテーブル参照。
一度ctype.hを眺めてみそ。
662デフォルトの名無しさん:2006/11/30(木) 05:40:40
>>660
マクロで実装されている場合副作用がある式を渡しても誤動作してはならないとか
規定されてなかったっけ? その場合>>659はありえないという程度のことは
言えそうだけど
663デフォルトの名無しさん:2006/12/01(金) 23:05:57
C99って識別子に日本語使えるのな。
664デフォルトの名無しさん:2006/12/02(土) 00:04:19
C89のときから、識別子に使える文字は処理系による拡張が認められていましたが。
665デフォルトの名無しさん:2006/12/05(火) 23:56:50
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
666デフォルトの名無しさん:2006/12/06(水) 04:02:06
主に高速化・ビットフラグの操作辺り
WindowsAPIではWORD型(2byte)を二つ合わせてDWORD型(4byte)を作るのとかに使われている

あとCPUの内部でも幾つかの命令を実装するのに使われているとか
例えば掛け算・割り算にもビットシフトを使っているらしい

まあ、始めたばかりなら当分使うことは無い
というか、最初はあまり高速化を意識しない方が良いから使い方は知らないでいい

ある程度自力で調べられるようになってサンプルコードとか見て回るようになると色々面白いコードが見つかったりする
ビット演算のスレもあるから、そのうち興味が湧いたらそっちも参考に
667デフォルトの名無しさん:2006/12/06(水) 11:23:57
>>665 のコピペはまだまだ釣れるんだなあ。
668デフォルトの名無しさん:2006/12/06(水) 15:39:28
コピペ!?
669デフォルトの名無しさん:2006/12/06(水) 15:51:18
フラッシュ・ゴードン
あーあ〜
670デフォルトの名無しさん:2006/12/07(木) 04:50:45
俺のターン!
メモリマップドIOを攻撃表示に!
671デフォルトの名無しさん:2006/12/08(金) 17:55:30
mallocでの取得可能サイズってdefine定義ってされていますか?
あるのでしたら教えてもらいたいのですが・・・
672デフォルトの名無しさん:2006/12/08(金) 18:07:40
>>671
処理系が許す限り。
673デフォルトの名無しさん:2006/12/08(金) 21:33:56
int piyo(hoge1, hoge2, hoge3)
int hoge1=0;
int hoge2=0;
double hoge3=0.0;
{
// 関数の実装
}

みたいな形って最近のC言語の教科書ではあんまり見ないんですけど、古い仕様?

int piyo(int hoge1, int hoge2, int hoge3)
{
// 関数の実装
}

みたいに書くのと本質的な違いはあるんでしょうか?
674デフォルトの名無しさん:2006/12/08(金) 21:44:22
前者は古い仕様、K&Rスタイルとも。
後者が新しい仕様、ANSIスタイルとも。もっともANSI Cは後方互換で前者も認めている。

前者だとプロトタイプ宣言で仮引数の型を指定しないことになる。
そのため前者だとfloat型引数はdouble型で渡されるが、後者だとfloat型で渡されるなどの違いが出てくる。
675デフォルトの名無しさん:2006/12/08(金) 21:45:51
>>671
size_tで表せる大きさ
676デフォルトの名無しさん:2006/12/09(土) 15:55:11
>>671
malloc実行時の環境依存
677デフォルトの名無しさん:2006/12/09(土) 17:07:05
>>674
dクス
678デフォルトの名無しさん:2006/12/10(日) 21:30:27
JISから観覧できる規格、pdf内の単語の検索
が出来ないのですが、そうなっているのですか?
Adobe Reader 8
679デフォルトの名無しさん:2006/12/10(日) 21:33:36
>>678
画像形式になってる奴だろ。金払って買えってこと。
680デフォルトの名無しさん:2006/12/10(日) 22:01:37
電子データがなくて
紙スキャンでお茶を濁してるんじゃないのか
681デフォルトの名無しさん:2006/12/11(月) 06:38:28
JIS X 3010じゃないけど買ったらちゃんとテキストを含んだPDFがダウンロードできた。
でも表の中の文字はアウトライン化されてて検索できないという意味不明ぶり
682デフォルトの名無しさん:2006/12/12(火) 20:56:21
所詮JIS
683デフォルトの名無しさん:2006/12/12(火) 21:12:17
そりゃないよ・・・
684デフォルトの名無しさん:2006/12/13(水) 00:39:13
あくまでも紙の規格票が正式ということになってるから
電子データ版のほうが「高機能」だと困るんだろ。
685デフォルトの名無しさん:2006/12/13(水) 01:20:09
文字とコードを結びつける表は"字形"で書いてないと駄目なのでは。

それにしてもJIS規格とかには税金を投入して
もっと自由に便利に使えるようにして欲しい。
686デフォルトの名無しさん:2006/12/13(水) 11:22:24
C++ の方は、なぜかテキストが含まれているのに。いるのに。
687デフォルトの名無しさん:2006/12/14(木) 22:33:17
>>685
まあ確かにその買った規格票はJIS X 0213:2004だったから
例示字形がアウトラインでなければならないのは当然なんだが
なぜかそれ以外の部分まで無意味にアウトライン化されてる。
http://www.itscj.ipsj.or.jp/ISO-IR/233.pdf
に付いているものにはちゃんとテキストデータが入ってるので
わざと削ってることは明白で、もうJISCは死んでくれとしか
688デフォルトの名無しさん:2006/12/17(日) 16:28:31
プロセス間通信、共有メモリ について初学者でも
理解できるページがあればurlを教えて欲しいのです。
実際に動かせるソースファイル例等があればうれしいです。
お勧めの書籍等があればそれも是非お願いします。
forkとかwaitを理解する上で気をつけたほうがいいポイントとかがあったらそれも是非。。
私は、構造体とポインタをやっと理解した程度の初学者です、どうぞよろしくです。
689デフォルトの名無しさん:2006/12/17(日) 16:38:56
>forkとかwaitを理解する上で気をつけたほうがいいポイントとかがあったらそれも是非。。
forkやwaitはOS固有のシステムコールであって、C言語標準のライブラリ関数ではないということ。

他のスレで聞けば親切に教えてくれる人がいると思うよ。
690デフォルトの名無しさん:2006/12/19(火) 20:05:18
689さん、レスありがとうございますー^^

聞くところを間違えたようですね、また改めて他所で聞いてみます。
691デフォルトの名無しさん:2006/12/26(火) 12:53:19
こんなコードかいてますが復元された平文には謎の^@マークが大量に入って
しまいます。どうしていいのかわからないのでどなたか教えてくださいませ。

int main(){
Integer a,b,c,d,e,bb,key,k2,I;
f=fopen("an.cc","rb");
ff=fopen("an.cyp","wb");
fg=fopen("an.txt","wb");
while(feof(f)!=1){
b= fread(s,sizeof(unsigned char),15,f);
if(b<15 && b!=0){ for(i=atoi(Itoa(b));i<15;i++) s[i]=0;}
bb=0;
for(i=14;i>-1;i--) bb=(bb<<8)^s[i];
b= key*bb;
while(1){if((a=random())<key){ break; } }
while(1){ if(bit(d=random())<256){ break;}}
c=(b+a)^d;
I=c;
cout << "c=" << c <<"\n";
for(i=0;i<8;i++){ m[i]=atoi(Itoa((I&atoI("11111111111111111111111111111111",2)))); I=(I>>32); }
fwrite(m,sizeof(unsigned int),16,ff);
e=((c^d)-((c^d)%key))/key;
I=e;
for(i=0;i<16;i++){ k[i]=atoi(Itoa((I&atoI("1111111111111111",2)))); I=(I>>16); }
fwrite(k,sizeof(unsigned short),16,fg);
if(e!=bb) cout << "e=" << e << "\n";
}
fclose(f);
fclose(ff);
}
692デフォルトの名無しさん:2006/12/26(火) 12:55:06
>>691
> Integer
> Integer
> Integer
> Integer
ほほぅ…
693デフォルトの名無しさん:2006/12/26(火) 12:59:44
>>691
色々と論外だけど、せめてコンパイル通るようにしてから出直してください。
694デフォルトの名無しさん:2006/12/26(火) 13:31:28
コンパイルは通ってます。長すぎるのでメインの変換部分だけです。
バイナリでデータを読んで、書き出す間に0x00が混じってしまうようです。
どこでそうなるのかがわかりません。数値的には読み込んだ状態と
同じことを確認してから書き込んでいます。読み出しのときにすでに
エラーが発生しているのでしょうか?
695デフォルトの名無しさん:2006/12/26(火) 13:33:46
馬鹿じゃないの?初心者未満は他所行ってくれ。
>for(i=0;i<8;i++){ m[i]=atoi(Itoa((I&atoI("11111111111111111111111111111111",2)))); I=(I>>32); }
                ~~~~  ~~~~
696デフォルトの名無しさん:2006/12/26(火) 13:35:47
>>694
そうかもね
そうじゃないかもしれないけど、型が分からないから正確なことは何一ついえないね
憶測だけどどこかアルゴリズム間違ってるか、ビット演算子を勘違いしていないかなと思うよ
気のせいかもしれないけど
(もしかしたら他に原因があるかもしれない)


みたいな感じ
697デフォルトの名無しさん:2006/12/26(火) 13:37:04
ItoaとかatoIって自作関数?
698デフォルトの名無しさん:2006/12/26(火) 13:41:17
coutに誰も突っ込みをいれないあたり優しいな
699デフォルトの名無しさん:2006/12/26(火) 13:48:05
random,Itoa,atoI,bitは自作関数か
Integerはtypedefとかされてんのかな
ファイルポインタが宣言されてないがグローバル変数とかなのだろうか
あとreturnがない
700デフォルトの名無しさん:2006/12/26(火) 13:53:33
unicode吐いてるんじゃない? とESPしてみる。
701デフォルトの名無しさん:2006/12/26(火) 14:04:29
>>random,Itoa,atoI,bitは自作関数か
そうです
>>Integerはtypedefとかされてんのかな
昔のC++に付いて来た多倍長整数型です。
読み込みデータに問題はありませんでした。しかし演算の途中で0x00が
混じっていることは確かなようです。
702デフォルトの名無しさん:2006/12/26(火) 14:20:43
>>701
>そうです
…は?
>昔のC++に付いて来た多倍長整数型です。
…へ?

atoI() の第2引数は strtol() 同様、基数を与えているんだろう、くらいが
俺の超能力の限界。
703デフォルトの名無しさん:2006/12/26(火) 14:21:09
奇跡で解決しました。
ありがとうございました。
704デフォルトの名無しさん:2006/12/26(火) 14:22:14
昔のC++ではなく、お前使っているC++処理系についてきた、だろ。
705デフォルトの名無しさん:2006/12/26(火) 14:26:44
gccの2.95.3のG++ですけど・・・
706デフォルトの名無しさん:2006/12/26(火) 14:30:52
今は読み込むファイルのサイズに合わせてパディングが発生しない
様にしているんですが、もし発生した場合、復号のときの逆関数で
0の部分を除去しなければならないはずなんですがいい方法が思い
つきません。何かいいアイデアがあったらよろしくお願いします。
707デフォルトの名無しさん:2006/12/26(火) 14:40:45
ここは 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 ですよ
708デフォルトの名無しさん:2006/12/26(火) 14:45:21
どこに質問すればいいですか?
709デフォルトの名無しさん:2006/12/26(火) 14:47:30
>>708
俺の知っている限り少なくともココ以外で、使っている"Integer"やらatoI()などを知っている環境依存なスレ/掲示板
だろうな
710デフォルトの名無しさん:2006/12/26(火) 15:40:45
パディング解決しました〜。
711デフォルトの名無しさん:2006/12/28(木) 16:47:45
WEB上で日本語のc言語リファレンスってありますか?
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
の日本語版とか
712デフォルトの名無しさん:2006/12/28(木) 19:29:25
便利かどうかはともかく本家本元。
JIS X 3010 プログラム言語C、ISO/IEC 9899 : 1999(標準C99)の翻訳。

ttp://www.jisc.go.jp
JIS検索→規格番号 X3010

713デフォルトの名無しさん:2007/01/06(土) 23:39:16
スレがすたれてるので一つ。


C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
714デフォルトの名無しさん:2007/01/07(日) 00:05:17
休み中にスレッドが伸びないことは決して悪いことではない。
廃れているではなく眠っている、だよ。

そして俺は質問に答えないね。すまん。
715デフォルトの名無しさん:2007/01/07(日) 00:07:24
俺は今日も明日も仕事だよ…
もう寝る。
716デフォルトの名無しさん:2007/01/07(日) 00:23:59
>>713
2のn乗の数での乗除算の代用で使うと少しだけ高速だったりする。
717デフォルトの名無しさん:2007/01/07(日) 00:40:27
それくらいなら今時、コンパイラが最適化するんじゃないか?
718デフォルトの名無しさん:2007/01/07(日) 00:56:31 BE:89861663-2BP(294)
>>713
昔はアプリレベルでも、1バイトとか1ワードを、数ビットごとに区切って
情報をもたせるとかやってたんで、そういうのを取りだしたり、セットしたりで
使ってた。

DOSとか、ファンクションコールを直接コールしたりすると、
ビット操作必須だったような記憶が。
BIOSとかも。

719デフォルトの名無しさん:2007/01/07(日) 01:00:04 BE:99846454-2BP(294)
今でも、ちょっと低レベルだと、ビット操作は必須だろうけど。
720デフォルトの名無しさん:2007/01/07(日) 06:35:44
別に低レベルでなくとも複数のオプションをまとめて扱いたいときとかに
ビットフラグは便利だべ
O_BINARY | O_CREAT みたいな感じで、一引数で渡したり出来る品
721デフォルトの名無しさん:2007/01/07(日) 09:41:05
>>720
そのビットフラグとやらにおいて、ビットシフトは何か意味があるのですか?
722デフォルトの名無しさん:2007/01/07(日) 09:45:03
ビットフラグを作る時にビットシフトを使う。

#define BIT(n) (1u << (n))

として、

#define HOGE BIT(0)
#define HAGE BIT(1)
#define HIGE BIT(2)

とか。
723デフォルトの名無しさん:2007/01/07(日) 10:54:34
#define HOGE 1
#define HAGE 2
#define HIGE 4
でいいだろ。
724デフォルトの名無しさん:2007/01/07(日) 11:11:33
>>722の計算はコンパイル時にされて定数になるから、別にどっちでも
分かりやすい方を使えば良い。
725デフォルトの名無しさん:2007/01/07(日) 11:19:39
>>723
よくない
というか2進リテラルがあればよかったんだけどな、8進でガマンするしかない

できれば
#define HOGE (1)
#define HAGE (HOGE*2)
#define HIGE (HOGE*2)
または
#define HOGE (1)
#define HAGE (HOGE<<1)
#define HIGE (HOGE<<2)
もしくは
#define HOGE (1)
#define HAGE (HOGE<<1)
#define HIGE (HAGE<<1)
726デフォルトの名無しさん:2007/01/07(日) 12:16:50
>>723 が悪いというのはまあいいとして、
>>725 は一見良さそうには見えるんだけど、どうなんだろうな。
一長一短で、>>722>>725 のどっちでもいい気がする。
727デフォルトの名無しさん: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)
とするかも知らん。
728デフォルトの名無しさん:2007/01/07(日) 12:49:38
8bit 単位のビットシフトの方がよく使うな
MAKEWORD マクロとかも、(a << 8) + b だった気がする。
729デフォルトの名無しさん:2007/01/07(日) 17:12:21
inlineを使うデメリットってなんですか?
730デフォルトの名無しさん:2007/01/07(日) 17:22:29
>>729
C言語は標準ではinline関数をサポートしていません。以上。
731デフォルトの名無しさん:2007/01/07(日) 17:31:23
>>730
C99で標準に採用されたハズですが。
732デフォルトの名無しさん:2007/01/07(日) 17:34:50
6.7.4 関数指定子
・・・
意味規則 inline関数指定子で宣言された関数は,インライン関数(inline function)とする。
この関数指定子は複数回出現してもよいが,1回だけ出現したときと同じ動作とする。
関数をインライン関数にすることは,その関数の呼び出しを可能な限り速くすることを示唆する。
この示唆の効果を持つ程度は,処理系定義とする。
・・・
733デフォルトの名無しさん:2007/01/07(日) 21:30:42
外部結合をもつ関数のインライン定義が、静的記憶域期間をもつ変更可能なオブジェクトの定義を含んでいてはならず、内部結合をもつ識別子への参照も含んでいてはならない。
734デフォルトの名無しさん:2007/01/08(月) 07:23:38
>>729
inline 関数をいじった時に、
その定義を参照している全ての .c ファイルを
コンパイルし直さないといけない。
735デフォルトの名無しさん:2007/01/09(火) 12:35:58
>>713 のコピペで今でも釣れるってどうよ。
736デフォルトの名無しさん:2007/01/09(火) 23:17:05
常に新しい人が来てる証拠じゃない、いいことだ
古参しかいないスレなんてすぐ消えるよ
737デフォルトの名無しさん:2007/01/10(水) 20:34:32
ポリュビオアス暗号ってC言語プログラムにするとどんな感じ?
学校の課題にだされて・・・
詳しいコメントつきで誰かお願い!!
738デフォルトの名無しさん:2007/01/10(水) 20:49:11
今ググってきた俺が知ったかぶりすると

5x5の二次元配列にa-z(j除く)ぶっこんで
あとはexcelの要領で
739デフォルトの名無しさん:2007/01/10(水) 21:19:14
あり!
できっかな・・・
740デフォルトの名無しさん:2007/01/10(水) 21:57:48
エスケープシーケンス「\?」が存在する理由はなんでしょうか?
741デフォルトの名無しさん:2007/01/10(水) 22:18:08
Trigraphでぐぐれ
742デフォルトの名無しさん:2007/01/10(水) 22:34:46
>>741
ありがとうございました、理解しました
743デフォルトの名無しさん:2007/01/10(水) 23:38:11
理解できないバグで質問です。
for( int i = 0; i < 30; i ++ ){
FILE* fp;
char fname[10];
sprintf( fname, "f%d%d", (i/10)%10, i%10 );
fp = fopen( fname, "w" );
fprintf( fp, "a\n" );
fclose( fp );
}
のような感じでたくさんファイルを出力したいのですが、
3回目で fopen( fname, "w" ); が終了しないというわけのわからないバグが発生しています。
同じような症状(fopenなどのライブラリの関数が終了しない)に陥り、解決したことがある方
がいらっしゃいましたらどのような場合だったのか教えて頂けないでしょうか。
上の例は動くはずです。
744デフォルトの名無しさん:2007/01/10(水) 23:46:39
>>743
>のような感じで

大事なところを隠すな。ボケ。
バグの原因を聞くのであれば、
変に省略せずにソースを丸々貼ること。

>>743 みたいな聞き方をしている奴のバグは、大抵
「省略しているところ」にバグがあるから。
745デフォルトの名無しさん:2007/01/10(水) 23:48:25
>>743
問題が再現する最小のソースを作ってみな。
大方はその途中で原因に気づくだろうが、もしも
わからなければその最小ソースを貼ってみれ。
746デフォルトの名無しさん:2007/01/11(木) 00:41:42
直接関係ないけど、"f%02d",i%100 くらいは覚えたほうがいい
747デフォルトの名無しさん:2007/01/11(木) 02:54:28
プリプロセス時に行う##の演算子名称ってなんでしたっけ?
[##]でgoogleかけても1件もでてこないです。
748デフォルトの名無しさん:2007/01/11(木) 03:38:10
トークン連結演算子
749デフォルトの名無しさん:2007/01/11(木) 13:30:26
重回帰分析のプログラムを作ろうとしてるけど
なにをしていいのかわからんのです。

誰かプログラム持ってないですか?
750デフォルトの名無しさん:2007/01/11(木) 13:32:50
>>749
そういうのは「作ろうとしてる」とは言わない。
そしてスレ違い。
751デフォルトの名無しさん:2007/01/11(木) 13:34:38
丸投げする気満々なら宿題スレに消えろ
752>>749:2007/01/11(木) 13:36:25
y = a0+a1*x1+a2*x2+・・・+an*xn
の条件式を用いて誤差を最小にすればいいのだろうけど。。。

手順がわかりませんのです。。。

どこのスレなら教えてくれるだろうか・・・
753デフォルトの名無しさん:2007/01/11(木) 13:47:39
>>752
まずは自分で書かなきゃ、どこでも教えてくれないよ。
何を教えたらいいのかわからないもんね。

逆にとりあえずC言語で書いてみて、それでも
うまくいかないということでそのソースと具体的な
問題点を貼れば、このスレの範疇に入るだろう。

どっちかと言うと↓かもしれないけど。
http://pc10.2ch.net/test/read.cgi/tech/1164376287/
754デフォルトの名無しさん:2007/01/11(木) 17:03:07
>>749
とりあえず言語がどうとかプログラミングがどうとかいう以前に問題把握してないんだろう
教授に聞け
755デフォルトの名無しさん:2007/01/11(木) 19:54:06
逆行列とか理解できればどこにでも転がっている
756デフォルトの名無しさん:2007/01/15(月) 02:04:18
char str[1]みたいに要素数1の配列を使うテクニックがあったと思うんだがどこで見たのか何に使ってたのか思い出せない。教えて
757デフォルトの名無しさん:2007/01/15(月) 05:45:27
そのテクニックは移植性がないのでスレ違い。
C99ではcase str[]で可変長メンバを表せる。
758デフォルトの名無しさん:2007/01/15(月) 05:46:00
char str[]の書き間違い
759デフォルトの名無しさん:2007/01/15(月) 06:12:57
構造体の尻っぺたにくっつけておいて、
mallocするときのサイズに細工して
可変長メンバのように使うんだったかな?
760デフォルトの名無しさん:2007/01/15(月) 06:45:54
>>756
http://pc10.2ch.net/test/read.cgi/tech/1164376287/908
なんでわかったかって?
俺が書いたからだよ!
761デフォルトの名無しさん:2007/01/15(月) 06:51:33
そっちにもちゃんと書いてあるな
> ANSI Cではこれは反則。でも大抵の処理系では動く。
> C99では専用の書き方(char s[])があるけど。
762デフォルトの名無しさん:2007/01/15(月) 16:22:30
CでCGIを作ってるのですが、ファイルの排他的制御を行う関数または、アルゴリズムってありますか?
763デフォルトの名無しさん:2007/01/15(月) 17:02:39
>>762
環境依存。
764デフォルトの名無しさん:2007/01/15(月) 17:02:55
環境依存。使っているコンパイラかなにかのスレで聞くといい。
765デフォルトの名無しさん:2007/01/15(月) 17:21:53
lockf,、flock、openでO_EXLOCK 等々。
766デフォルトの名無しさん:2007/01/15(月) 19:32:43
>>763 >>764 bcc55使ってます
>>765 ファイルオープン時に引数として与えると言うことでしょうか?
767デフォルトの名無しさん:2007/01/15(月) 19:55:51
win api呼べるなら、mutex使うとか。
768デフォルトの名無しさん:2007/01/15(月) 19:56:53
winapiならCreateFileの時点でファイルを排他的に開ける。
769デフォルトの名無しさん:2007/01/15(月) 19:57:57
770デフォルトの名無しさん:2007/01/15(月) 20:18:41
>>767 >>768 APIは呼べるか実験してないので、API使わない方向でいったら>>765の方法ですかね?API呼べたらmutex使ってみます
771デフォルトの名無しさん:2007/01/15(月) 20:27:53
お前は何か勘違いしている
772デフォルトの名無しさん:2007/01/15(月) 20:50:27
>>770
素直にbccスレに行け。
773デフォルトの名無しさん:2007/01/15(月) 21:29:25
APIが呼べたら
http://pc10.2ch.net/test/read.cgi/tech/1168708801/l50
な。もう一度だけ言うといずれにしてもここはスレ違いだから
774デフォルトの名無しさん:2007/01/15(月) 21:39:02
解りましたAPI使う方向ではないので試行錯誤します
775デフォルトの名無しさん:2007/01/15(月) 21:40:57
APIがどういうものかわかってないのか・・・
776デフォルトの名無しさん:2007/01/15(月) 23:45:24
APIに嫌な思い出でもあったのか。
777デフォルトの名無しさん:2007/01/17(水) 11:12:55
#include <iostream>
using namespace std;

int main(void)
{
unsigned char x,y;

cout << "2つの値を入力してください。\n";

cin >> x >> y;

int a = x + y;
int b = x * y;

printf("x = %d, y = %d, x + y = %d, x * y = %d",x,y,a,b);

return 0;
}
どうすればunsigned charの文字をそのまま整数として吐き出せるんでしょうか?
778デフォルトの名無しさん:2007/01/17(水) 12:48:51
きやすとするんだ
779デフォルトの名無しさん:2007/01/17(水) 14:57:55
>>777
言ってもいいかな?言っちゃうよ?

  それ C++ だヴォケ。
780デフォルトの名無しさん:2007/01/17(水) 15:17:02
そもそもマルチだし
781デフォルトの名無しさん:2007/01/17(水) 18:32:08
今までコンパイルが通ったものが、
ある必要なライブラリを追加したとたんリンクエラーになるという現象が起こったとき、
原因はそのライブラリファイルにあるということでいいんですか?
782デフォルトの名無しさん:2007/01/17(水) 18:56:00
リンクエラーと一言で言われてもな。
メモリーが足りない場合は君の環境が原因なわけだし。
そして多分スレ違い
783デフォルトの名無しさん:2007/01/17(水) 19:08:30
>>781
コンパイルが通ることと、リンクが通ることは別です。
そのライブラリが原因かどうかはわかりません。


コンパイルとリンクを区別して(できて)いるのかいないのか、微妙だなぁ。
>ある必要なライブラリを追加したとたんリンクエラーになる
まるでそのライブラリを追加する前はリンクエラーにならなかったかのようだが、んなワケないよなぁ。
784デフォルトの名無しさん:2007/01/17(水) 19:20:17
>>781
> ある必要なライブラリを追加したとたん
要するに、
「今まではコンパイル(リンクまで?)通った」が
「そのライブラリが必要になった」
ということは
「コードを書き換えた」
んだろ?

んなら、書き換えたコードの問題である可能性が一番高い。
785デフォルトの名無しさん:2007/01/18(木) 15:49:38
例えば UNIX 系で .a をリンクすると、ライブラリ内部の
オブジェクトファイル単位でリンクされるわけだが
自分の書いたコードと名前が被ってたらエラーになるな。
まあ >>782 の最初と最後の行に同意。
786デフォルトの名無しさん:2007/01/19(金) 17:42:37
// 省略 include <stdio.h>, <stdlib.h>
#define offsetof(type, member) ((unsigned int) &(((type*)0)->member))
#define N 100

typedef struct unko {
 union {
  struct {
   int first;
   int second;
  };
  int v[0];
 };
} Unko;

int main() {
 Unko *u;
 u = (Unko*) malloc(offsetof(Unko, v) + sizeof(int) * N);
 u->first = 334;
 u->second = 666;
 printf("first=%d, second=%d\n", u->v[0], u->v[1]);
 return 0;
}

このコードなんですが、規格上、
&(u->v[0]) == &(u->first)、&(u->v[1]) == &(u->second) になり、
正しく動作することは保障されるでしょうか?ご教示お願いします。
787デフォルトの名無しさん:2007/01/19(金) 20:50:52
されない。
規格は、構造体や共用体の内部構造について何らの規定もしていない。
最初のメンバの先頭や、後に続く各メンバの隙間につめものがされていて、
きっと同じアドレスを持っているだろうと思っていたメンバが、実は違う場所にあるかもしれない
(だいたい、宣言時の配列の大きさを越えたアクセスの結果は未定義である)。

多くの処理系では期待したように動くかもしれない。
しかしその裏づけを規格に求めようとするのは本末転倒だ。
そんな気色の悪いコードを考えている暇があったら、
本当に自分の実現したかった機構が何であり、
それをどうやったら明快なコードで表現できるかを考えるほうが、よほど有意義である。
788デフォルトの名無しさん:2007/01/19(金) 21:06:26
enum{first,second};
int v[2];

v[first]=334;
v[second]=666;

printf("first=%d, second=%d\n", v[0], v[1]);

すっきり
789デフォルトの名無しさん:2007/01/19(金) 21:24:51
つーか、そのoffsetofマクロの実装はANSI準拠じゃないぞ。たしか。
790デフォルトの名無しさん:2007/01/19(金) 21:56:20
Cで入れ子構造体名の省略ってできたっけ?
791デフォルトの名無しさん:2007/01/19(金) 23:23:26
>>786
たぶんシンボリックにも配列的にも扱える変数のセットがほしいんだろうが、
Cでそれをやりたいなら>>788の言うとおり列挙体を使って添字をシンボル化するのが
おそらく最も自然な解になると思う(defineしてもいいが、数が多くなるとつらい)
792デフォルトの名無しさん:2007/01/19(金) 23:30:34
>>786
とりあえず int v[0] は int v[2] と読み替えて・・・。

構造体の先頭にはパディングが入らないことは規格で定められている。
C99 では 6.7.2.1p13 、 C++2003 では 9.2p17 。というわけで
&(u->v[0]) == &(u->first) は保証されている。

しかし first と second の間にはパディングが入る可能性があるので
&(u->v[1]) == &(u->second) は保証されない。
793デフォルトの名無しさん:2007/01/19(金) 23:39:17
offsetofを使ってる理由がわからん
もしuとvの距離が0でないならそんなもの動くはずがない
794デフォルトの名無しさん:2007/01/19(金) 23:42:18
まあintの間にパディングが入るってことは普通考えられないけどな。

とにかく。とりあえず動きそうなコードを書いてから
規格に適合するかを気にするんじゃなくて、
規格に適合するようにコードを書け。最初から。
795デフォルトの名無しさん:2007/01/19(金) 23:50:01
enum{FIRST,SECOND,THIRD, (中略) ,LENGTH};

v[LENGTH];

俺だったらこうするかも
796デフォルトの名無しさん:2007/01/19(金) 23:58:38
int v[LENGTH]; だった

寝よう・・・orz
797786:2007/01/20(土) 08:53:13
皆様、ご丁寧な説明をどうもありがとうございました。
現在、言語処理系をコーディングしているところで、
演算子と関数を同じ構造体で表すとき、u->left、u->rightとアクセス出来ると
非常に直感的だった為、この様な記述をするに至りました。
(関数は引数が可変なので配列として、二項演算子はleft・rightとしてアクセスしたかった、という意味。)

>>788 氏の提案された方法が非常に良いと感じましたので、この方法を取らせていただきます。
本当にありがとうございました。
798デフォルトの名無しさん:2007/01/21(日) 03:24:46
要するにインタプリタを作ってるってことか?
なんで演算と関数を同じ構造体で扱わなきゃならんのかがわからんが
799デフォルトの名無しさん:2007/01/21(日) 07:20:50
内部的には関数と演算子は区別しないほうが楽ですよ。
OOPLでもなければ。
800デフォルトの名無しさん:2007/01/21(日) 11:58:28
定数を扱うとき、
#defineとconstのどちらを、みなさんは使っていますか?

それぞれの使う、メリット・デメリットがあれば教えてください。
それとも、ただ単に好みの問題?
801デフォルトの名無しさん:2007/01/21(日) 12:52:38
enum
802デフォルトの名無しさん:2007/01/21(日) 14:06:28
C++と違い、Cのconst変数はあくまで「代入不可な変数」であって定数ではない
よって定数式が必要なところには使えないので単純に#defineに劣る

意味のある数字が必要なときやビットパターンが必要なときは#defineを使え
ケースを区別するためのシンボルが必要なとき、
または各シンボルが連続した数値と結びついているときはenumを使え
803デフォルトの名無しさん:2007/01/21(日) 14:25:37
>797
+ sizeof(int) * N なんてやってる理由がわからなかったが、そういうことか

規格準拠で作りたいなら最初からNの配列を作るか素直にポインタにmallocしろ
804デフォルトの名無しさん:2007/01/23(火) 16:34:31
20MBほどの.hファイルをインクルードしようとしたらヒープ領域を使い果たしましたというエラーになりました。
うまくインクルードする方法はないでしょうか?
805デフォルトの名無しさん:2007/01/23(火) 16:50:39
>>804
いくらなんでも、それはひどすぎじゃ? <20MBほどのインクルードファイル
コンパイラが処理しきれなかった ってことだから、
コンパイラのオプションでなんとかなるかもしれないがわからん

# バイナリイメージを埋め込もうとしたのかねぇ…
# VC6 include 以下全てのファイルで 約30MB だしなぁ…
806デフォルトの名無しさん:2007/01/23(火) 16:54:14
このスレはマルチにも優しいスレでつね
807デフォルトの名無しさん:2007/01/23(火) 18:00:38
>>803
ありがとう。そうします。
808デフォルトの名無しさん:2007/01/23(火) 21:13:43
>>804
Visual C++ならコンパイラオプション/Zm
809デフォルトの名無しさん:2007/01/26(金) 16:42:14
2*(3+(4+5)*6)を計算するときexpression term factorをどういう順番で呼び出して計算されて
最終的な答えになるか説明してくれ
810デフォルトの名無しさん:2007/01/26(金) 17:34:02
>>809
左カッコが足りないのでダメ
811デフォルトの名無しさん:2007/01/26(金) 17:52:40
>809
本質的にそれはC言語そのものとは何の関係もない
812デフォルトの名無しさん:2007/01/26(金) 18:22:41
>>809
マジレスすると、普通のコンパイラーは定数項にしちゃう
813デフォルトの名無しさん:2007/01/26(金) 18:38:02
配列の要素の最初の要素をなくして
2番目の要素を先頭とするにはどうすればいいのでしょうか?
標準ライブラリの機能でそういうのないですか?
814デフォルトの名無しさん:2007/01/26(金) 18:40:18
813
>MOV ソース、ディステネーション & セグメントレジスタに注意
815デフォルトの名無しさん:2007/01/26(金) 18:45:38
つまりどうすればいいのでしょうか?
816デフォルトの名無しさん:2007/01/26(金) 19:35:27
新たに配列を作る
817デフォルトの名無しさん:2007/01/26(金) 19:45:16
ポインタで2番目の要素を指す
818デフォルトの名無しさん:2007/01/26(金) 19:50:48
>813
memmove(array,array+1,sizeof(array)-sizeof(array[0]));
819デフォルトの名無しさん:2007/01/26(金) 19:55:34
>>813
まず物事を厳密に表現できるようになれ
話はそれからだ
820デフォルトの名無しさん:2007/01/26(金) 20:33:10
>>813
本当にそれがやりたいことなら、>>818のようにmemmove()を使えば良い。
が、それは高くつく処理だ。
配列の先頭、末尾を示すカーソルを持っておき、配列を環状バッファとして
使う手もあるぞ。その場合は先頭を示すカーソルをずらすだけだ。
821デフォルトの名無しさん:2007/01/27(土) 00:16:57
こんな質問する奴にリングバッファを使わせようとするなんて、極悪人め!
822デフォルトの名無しさん:2007/01/28(日) 22:18:51
以下は入力文字列を複写するプログラムです。

#include <stdio.h>
#include <string.h>

int main(void)
{
char str1[81],str2[81];

printf("文字列の入力\nstr = ");
if(fgets(str1,80,stdin)==NULL){
printf("文字列入力のエラーです");
return 1;
}
if(strlen(str1)>80){
printf("文字数が81文字以上です");
return 1;
}

strcpy(str2,str1);

printf("str1 = %s\n",str1);
printf("str2 = %s\n",str2);

return 0;
}

この中に出てくる return 1 ってどういう働きをしているんですか?
これが無かったらどうなるのでしょうか?
教えてください。
823デフォルトの名無しさん:2007/01/28(日) 23:49:32
mainから戻るとその戻り値でexit()したのと同じ効果
> これが無かったらどうなるのでしょうか?
バッファオーバフローは未定義動作なのでこのスレ的には何が起きるのか
誰にもわからない
824デフォルトの名無しさん:2007/01/28(日) 23:58:18
>822
mainのreturn値はプログラムを呼び出したOSに返される。
0は正常終了したことを示し、それ以外の値は別の意味を持つ。
どの値がどんな意味を持っているかはOSによって違う。
OSにプログラムの動作状況を厳密に伝えたいのでなければ、
常に0を返してもいい。

なお、fgets(char *s, size_t size, FILE *stream) は
streamからsに最大でsize-1バイトまで読みこむ関数だから
(詳しくはfgetsの定義をよく読んで頭に入れること)
ヌル文字を入れてちょうど80バイトとなり、strのサイズは80でいい。
また、上で言ったとおりstr1には最大で79バイトしか入らないから、
strlenが81以上の値を返すことはありえない。
よって、この場合 return 1; の行が実行されることはない。

規定以上の文字が入力されたかどうかを調べるには、
str1に取り込まれなかったバイト列がstreamに残っていないかを見ること。
825デフォルトの名無しさん:2007/01/29(月) 04:13:48
C言語では、文字定数はシングルクォーテーションで囲むとありますが、
ダブルクォーテーションが使えないのは何故ですか?
書籍やWebサイトでは、シングルクォーテーションを使うように書いてありますが、
何故そうするべきなのかという記述は見当たりませんでした。
826デフォルトの名無しさん:2007/01/29(月) 04:24:03
ダブルクォーテーションで囲んだものは
その文字列が格納された0終端配列へのポインタと解釈される。
827デフォルトの名無しさん:2007/01/29(月) 04:48:54
ていうか「文法でそう決まっているから」以外にないだろ
828826:2007/01/29(月) 05:14:03
>>827
何故そうするべきなのかという質問の意図するところは結局、
それを決めた人間が何故そう決めたのか、その理由を知りたいということなのさ。
その程度がエスパーできずにどうする。
829デフォルトの名無しさん:2007/01/29(月) 05:24:24
>>825
つまり{'A','B','C','D'}という4つの文字定数をダブルクォーテーションを使うと
"ABCD"と一つの文字列で簡単に表現できるわけだ。

更に詳しく言うと>>826が書いているが、文字列は最後に自動的に必ず'\0'が付いて
「文字はこれ以上ありませんよ」とコンピューターに教えてあげるようになっている。

だから厳密に言うと{"A","B","C","D","\0"}の5つの文字定数を
"ABCD"と表現しているわけだ。

それで
char a='A';と宣言できても
char a="A";とは宣言できない。
なぜなら後者は実際には{'A','\0'}の2文字あるのだから一文字ですよと
宣言する a とは記述できない。
""を使いたいのならば
char a[]="A";として「これは文字列なんですよ」と宣言しないといけない。
解った?
830デフォルトの名無しさん:2007/01/29(月) 05:38:35
>>829
どーでもいいが
> {"A","B","C","D","\0"}
{'A','B','C','D','\0'}
だべ。

char *s = "abc";

は、実際には

static const char hidden[] = { 'a', 'b', 'c', '\0' };
char *s = hidden;

のようなものの便利な略記法だと思えばよいのだが、
で、さらに、コンパイラは文字列リテラルをTEXTセグメントに配置したり
同じ文字列をまとめたりするのだが、
……こんなこと言ってもさらに訳がわからなくなるだけだろうなw
831829:2007/01/29(月) 05:55:57
>>830
ごめん。そこはミスった。
832デフォルトの名無しさん:2007/01/29(月) 05:56:13
んなもん、
リテラルと整定数を
見た目で簡単に区別できるようにするためだろ?

その程度も想像出来ないなんて、本物のバカ^H^Hゆとり世代としか思えない。
833予測される反論:2007/01/29(月) 07:45:05
だって、大抵のスクリプト言語ではシングルコーテーションとダブルコーテーションを区別しないじゃないですか。
なんでCでは区別しないといけないんですか?
834デフォルトの名無しさん:2007/01/29(月) 10:16:44
区別しないといけないから
835デフォルトの名無しさん:2007/01/29(月) 10:56:51
区別しないのってJavaっぽいやつらだけじゃね?
836デフォルトの名無しさん:2007/01/29(月) 11:02:16
文字とその集合としての文字列を等しく取り扱うか次第だろうね。
おおよそ、数値とその集合の配列/リストは等しく取り扱わないだけなんだろう。
837デフォルトの名無しさん:2007/01/29(月) 11:55:09
>>833
理由になって無い件について
838デフォルトの名無しさん:2007/01/29(月) 13:02:15
>>835
×Java
○Perl, Python
839デフォルトの名無しさん:2007/01/29(月) 14:46:29
>>832
char a='A';
int i = 100;
の「'A'」や「100」もリテラルですよ。
840デフォルトの名無しさん:2007/01/29(月) 15:53:07
Cの入門講座みたいなの見ると「Cでは""で括った文字列の事を
文字列リテラルと〜」みたいに、あたかも文字列の事を
「リテラル」っていう専門用語のように表現する事が多いからね。
841デフォルトの名無しさん:2007/01/29(月) 18:42:32
#include <stdio.h>
double pai(int n);
int main(void)
{
int b, n;
do{
printf("項数n=");
scanf("%d", &n);
printf("π=%f\n", pai(n));
b=getchar();
}while(b=='Y');
return 0;
}

自作のpai関数へ、変数n(項数)の値を送ってπの値を取得し、
その後、1文字入力して、それが'Y'なら処理を繰り返すプログラムを組んでいるのですが、
上のソースのように、getchar()がscanf()より下にあるときは、
getchar()の処理が飛ばされてしまいます。
どこが間違ってるのでしょうか?アドバイス下さい。
環境はbcc5.5+BccDevです。
842デフォルトの名無しさん:2007/01/29(月) 18:55:51
getchar() の前に rewind(stdin) を入れてやれ
843デフォルトの名無しさん:2007/01/29(月) 19:49:50
どうでもいいけどpi
844デフォルトの名無しさん:2007/01/29(月) 20:58:40
>>842
それはダメ。

>>841
scanf()の食い残しが残っているから、scanf()直後に空読みすればいい。
845デフォルトの名無しさん:2007/01/29(月) 21:21:34
scanf(" %d", &n);
846デフォルトの名無しさん:2007/01/29(月) 21:24:05
>>845
問題の解決になってませんが。
847デフォルトの名無しさん:2007/01/29(月) 21:31:29
while(isspace(b = getchar()));
if(b == 'Y') ...;

これでOK?
848デフォルトの名無しさん:2007/01/29(月) 22:23:34
isspace()って拾った文字がEOFとかでも未定義動作にならないこと
保証されてたっけ?
849デフォルトの名無しさん:2007/01/29(月) 22:27:51
stdinの場合、人間はナニを入力するかわからんから、
scanfはあまりおすすめしないんだけどね
(実際こーゆーややこしい問題が起きるし)
ちょっとでも規定と違ったらバッサリエラーにするか、
fgetsでまるごと引き抜いて独自に解釈するのが良い
850デフォルトの名無しさん:2007/01/29(月) 22:32:48
>841
とりあえず、おかしいと思ったら関連する変数の値をすべて調べてみること。
この場合はnとbに何が取り込まれたかを見ろ。
あとは関数の仕様をしっかりと読めば何が起きたかを類推できる。
851デフォルトの名無しさん:2007/01/29(月) 23:12:40
isXXXは、EOFは普通に動くはず。
(配列を+1個分用意している実装が普通)
が、8bit符号付charで不具合が出る可能性があるはず。
特に日本語化されてないコンパイラ付属のライブラリは怪しい。

規定は知らんが。
852デフォルトの名無しさん:2007/01/29(月) 23:29:40
> 規定は知らんが。
このスレ的にはそれが一番知りたいんだが…
853デフォルトの名無しさん:2007/01/29(月) 23:32:49
>>841
scanfは普通、その終了時に、標準入力の最後に付加されている「\n」をストリームに放置する。
これはscanfが、特別な指定のない限りは、変換されなかった入力を棄てずに残すからである。

次にscanfを呼んで、最初の変換指定子が数値用のものであればこの\nは棄てられるが、
%cや%sを指定したり、fgetsやgetc(getchar)を使うとそのまま(しかも即座に)取り込まれて
しまって問題が起きることになる。

一般に言って、標準入力を読むときにscanfを使う場合はscanfだけを使うべきである。
fgetsやgetcを混ぜて使うべきではない。また最初の変換指定子が%cや%sである場合は、
前の入力の\n(正確には「 」と「\t」をも含む空白文字)を読み飛ばすことを明示するために、
" %c" のように書かなければならない。
854853:2007/01/29(月) 23:40:54
↑訂正。%sの場合は問題ない。%cだけが問題。
855デフォルトの名無しさん:2007/01/29(月) 23:47:27
>>853
すばらしい説明です。
856デフォルトの名無しさん:2007/01/30(火) 00:03:50
>>854
>↑訂正。%sの場合は問題ない。%cだけが問題。
いいえ。%cだけではありません。
857デフォルトの名無しさん:2007/01/30(火) 00:12:39
念のため補足すると

scanfはそもそも連続したデータをいっぺんにざばーっと取り込んで
処理をするための関数で、人間と対話的に入出力を繰り返すのには向いてない
理由は>853にあるとおり、余分な入力でも捨てないでストリームに残しておくためだ
たとえば>841の「項数n=」のときに「1 hogehoge」と入力したら、
値1がnに読み込まれたあとでも「 hogehoge」はストリームに残っている
ここに一体なにが入っているのかを予想する方法はない(人間のやることだから)

どうしてもscanfを使いたいなら、というか標準入力を使って対話的に人間と
データをやりとりしたいなら、一回一回ストリームを確実に空にする方法を考えること
それぐらいは自分でやれ、というか、それができないならどうせ問題が起きる
858デフォルトの名無しさん:2007/01/30(火) 00:25:19
>>856
%[]もだったな。あと%nはないのと同じ。
859デフォルトの名無しさん:2007/01/30(火) 00:28:58
> あと%nはないのと同じ
単に役に立たないだけならまだしもFormat bugでバリバリ活躍してくださるな。
でも実装しないと規格適合は名乗れないという
860デフォルトの名無しさん:2007/01/30(火) 00:37:20
>>859
ないのと同じってのは先頭の指定子としてみなせないって意味だろ
861デフォルトの名無しさん:2007/01/30(火) 00:49:40
どうしてCの入門書の入出力練習問題ってどいつもこいつもscanfを使うんだろうargcとargvを使うべきだだだだだ

ごめん全てのOSで使える保証はなかったね
862デフォルトの名無しさん:2007/01/30(火) 00:54:16
>>861
たぶんfgetsで読んでstrtokで切り分けて
atoiなりstrtodなりで解釈するのが正しいんだろうが
そのためにはまずポインタの何たるかを教え込まなきゃならんので
手順的にできないのだろう

でもscanfも本当はポインタ理解してないと使いこなせないのだが
863デフォルトの名無しさん:2007/01/30(火) 00:54:32
規格合致ホスト処理系で使えないことってあるの?
864デフォルトの名無しさん:2007/01/30(火) 00:55:02
863は>>861
865デフォルトの名無しさん:2007/01/30(火) 00:57:26
>>862
fgets()からsscanf()なら、そんなにむずかしくないでしょ。
866デフォルトの名無しさん:2007/01/30(火) 01:01:01
最終的に使いこなせればいいってことだろう
でも使いこなすより先に見限る率のが高い気ガス

そしてついでに見限られるfscanf/sscanf
867デフォルトの名無しさん:2007/01/30(火) 01:04:41
つまりgetchar()/putchar()は至高
868デフォルトの名無しさん:2007/01/30(火) 01:05:03
>863
使えることは使えるだろうけど、所謂コマンドラインOS同様に
実行時引数をスパっと打ちこめるかどうかはわからない
(たとえばWindowsの.lnkのプロパティに細工するようなことを
しなきゃいけないかもしれない)
そうなるとちょっと入力手段としては問題がある
869デフォルトの名無しさん:2007/01/30(火) 01:09:13
scanf()はつかえんだろう。。。
入力バッファのクリアが、気持ちいい解決方法がない。
ちょっと手間が増えるだけの、fgets()+sscanf()ですっきり解決するから、つかう価値が見出せん。
870デフォルトの名無しさん:2007/01/30(火) 01:15:14
ワードを数えるプログラムはscanf()で簡単に書ける。
でも行をscanf()で数えるのは厳しいw

#include <stdio.h>

int main()
{
    int n = 0;
    while (scanf("%*s") != EOF)
        ++n;
    printf("%d words\n", n);
    return 9;
}
871デフォルトの名無しさん:2007/01/30(火) 01:26:39
まあ>841の件については、

scanf("%s",s);
}while(strcmp(s,"Y")==0);

のようにするだけでもそれなりだと思うけどね
scanfで%cなんか使うもんじゃないよ
872デフォルトの名無しさん:2007/01/30(火) 01:27:58
>>867
なにその超力技志向
873デフォルトの名無しさん:2007/01/30(火) 01:33:38
C言語で組んだシステムに
形態素解析システム「ChaSen」の機能を組み込むにはどうすればいいでしょうか
ユーザの打ち込んだ文章を形態素解析して品詞別に表示させたいのですが・・・

ぐぐってもなかなかよい判例が見つかりませんお願いします
874デフォルトの名無しさん:2007/01/30(火) 01:37:24
chasenのサンプル、というか、インストールされる実行ファイル?の
ソースみるのが一番はやいいと思うのだが。
875デフォルトの名無しさん:2007/01/30(火) 01:48:33
>>874
どれがソースなのかすらさっぱり分からない状態です
876デフォルトの名無しさん:2007/01/30(火) 02:03:03
普通にマニュアルに茶筌ライブラリの使用法が載ってる
黙って公式文書を全部読め
877デフォルトの名無しさん:2007/01/30(火) 02:03:57
っていうかC言語と関係ないだろ
878デフォルトの名無しさん:2007/01/30(火) 05:25:58
c言語をつかってプログラムを組む仕事をしている人は、結局入力にどの関数を好んで使っているの?
879デフォルトの名無しさん:2007/01/30(火) 05:32:41
gets()に決まってるだろ
880デフォルトの名無しさん:2007/01/30(火) 05:40:44
マジレスすると、getchar
881デフォルトの名無しさん:2007/01/30(火) 06:24:30
マジレスすると、fgets()
882デフォルトの名無しさん:2007/01/30(火) 11:43:57
>879 ダメ。ゼッタイ。
>880 ご苦労様です。
>881 セオリーですな。

>878 DialogBoxですが、何か?
883デフォルトの名無しさん:2007/01/30(火) 16:11:56
GUI なら、エディットボックスの文字列の長さを予め取得して、
それから malloc して、そこに入れることになるね。
884デフォルトの名無しさん:2007/01/30(火) 16:50:54
2006年1月1日は日曜日である。月と日を入力すると、この日をもとに曜日を出力するプログラムを作成せよ。月日の入力は「/」で区切ることにする。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
【出力例】
日付を入力してください(MM/DD):12/24
12月24日は日曜日です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
この問題についてなんですが配列を使うとは思うんですがどのようにすれば配列で○月○日は○曜日と出せれるようなるのかがわかりません
どなたかお願いします
885デフォルトの名無しさん:2007/01/30(火) 17:14:34
C言語と関係ない
宿題スレ逝け
886デフォルトの名無しさん:2007/01/30(火) 17:21:27
質問なのですが画面への表示にタブを \t を使ってではな、
キーボード入力で入れても画面上に表示されますが、
タブの表示に \t があるということは
表示されたとしても処理上はキーボード入力でのは
よろしくないと言う事なのでしょうか?
887デフォルトの名無しさん:2007/01/30(火) 17:30:15
日本語を話せ
888デフォルトの名無しさん:2007/01/30(火) 17:33:07
>>886
何を心配してるのかよくわからないけど、
タブを処理しないソフトにタブを入力してもきっと無視されるだけでしょう。
889デフォルトの名無しさん:2007/01/30(火) 17:40:43
()内エスパー補間
  質問なのですが画面への表示にタブを \t を使ってではな(く)、
  キーボード入力で入れても画面上に表示されますが、
  タブの表示(用リテラル)に \t があるということは表示されたとしても
  処理上はキーボード入力での(タブのリテラル指示)はよろしくないと言う事なのでしょうか?

printf("<タブキー叩いて得られるTABリテラル>"); と printf("\t"); との差はどうよ?

ソースを印刷したり、空間が開くことより1文字であることが重要な場合(n個のスペースで代用不可)は
明示的に \t としてるな。
890886:2007/01/30(火) 17:54:18
887-889
拙い質問の仕方ですみません、
>>889で補間して下さりありがとうございます。
\tを使わずタブキー入力での場合に
処理上で問題があるかどうか知りたかったのですが申し訳ないです。
891デフォルトの名無しさん:2007/01/30(火) 18:07:41
untabify...あ。
892デフォルトの名無しさん:2007/01/30(火) 18:38:05
row*colの2次元配列のa[i][j]を
1次元配列に置き換えたらどうかけるんでしたっけ・・・
893デフォルトの名無しさん:2007/01/30(火) 19:38:39
>892

例)

int a[ROW*COL],i,j;

for(i=0;i<ROW;i++){
  for(j=0;j<COL;j++){
    a[i*COL+j]=0;
  }
}
894デフォルトの名無しさん:2007/01/30(火) 19:45:36
>>893
どうもありがとう
895デフォルトの名無しさん:2007/01/30(火) 19:46:29
一次元の配列要素を二次元的に扱う方法はプログラミング工学の問題であって
言語とは関係ないぞ
896デフォルトの名無しさん:2007/01/30(火) 19:59:13
>>890
処理上問題はないはずだが、それに何かメリットがあるとは到底思えない
素直に\tを使え
897デフォルトの名無しさん:2007/01/30(火) 20:25:06
>>895
ど忘れしちゃったもんで
898デフォルトの名無しさん:2007/01/30(火) 20:28:46
忘れるとかそういう問題のレベルの話じゃないな。
要するに、何も理解してないということだ。
899デフォルトの名無しさん:2007/01/30(火) 20:30:43
C言語やろうと思うんだけど、Cの練習ってC++のソフトでもできるか?
教えろ
900デフォルトの名無しさん:2007/01/30(火) 20:32:33
嫌だ
901デフォルトの名無しさん:2007/01/30(火) 21:33:12
>>899
マリオやろうと思うんだけど、マリオの練習ってドラクエのハードでもできるか?
教えろ
902デフォルトの名無しさん:2007/01/31(水) 07:50:45
>>890
以下全部、俺の推測・妄想。
エスケープシーケンスはコンパイル時に処理系により(文字コードにより?)適応したリテラルに置き換えられる。
例えば俺の処理系で"\t"をコンパイルしたら0x09(ASCII・Unicode等のHorizontal Tabulation)に置き換えられた。
でも別の処理系なら別のコードがリテラルとして出るかもわからんし、なまけものの俺は調べるのもめんどい。
対してソース書いてる時に得られたTABコードのリテラルはその時の環境によって違うだろう。
ASCII・うにこーど・EUCのHTは全部0x09ってとこまでは知ってるけど、他の全部の文字コードも同じか
そうかって言われたら俺にはわからんし、調べるのもめんどくさい。つまり得られるリテラルは
ソース書いてる時の環境によって変わる可能性がある。これは再現性の観点から避けたい。
だから俺は普通に"\t"でタブコード出した方がいいんじゃないかと思うよ。

見直したら全然答えになってないし間違ってるかも知れないけど折角書いたから送信。
903デフォルトの名無しさん:2007/01/31(水) 07:56:46
HTのコードが違うのを前提にするなら、
ほかのa-zA-Zなんかも違う可能性があるわけだが。
904デフォルトの名無しさん:2007/01/31(水) 07:59:45
>>903
だからこそ'a'と書くのであって、0x61と書いちゃいけないわけだ。
当然、a >= 'a' && a <= 'z'なんてもってのほかだな。
905デフォルトの名無しさん:2007/01/31(水) 08:01:20
'a'をASCIIでかいて、適切に変換してくれるなら、
'[タブ]'も変換してくれるんじゃないの。
906デフォルトの名無しさん:2007/01/31(水) 08:53:15
'a' が symbolic な a になる場合があるとしても
'\x9' が symbolic な tab になることはまずなさそうだな
907デフォルトの名無しさん:2007/01/31(水) 10:31:08
>>906
なんでだよ?
908デフォルトの名無しさん:2007/01/31(水) 12:49:22
ASCII非対応で標準C適合な環境など存在しません
909デフォルトの名無しさん:2007/01/31(水) 14:48:25
文字を書くのか文字コードを書くのかは色々問題だな

> ASCII非対応で標準C適合な環境など存在しません
あるよ
910デフォルトの名無しさん:2007/01/31(水) 15:33:23
ASCII規格はANSI規格の上にのっかってるもんじゃなかったっけ?
ANSI準拠ならASCII準拠なのは決まってるんじゃないの?
911デフォルトの名無しさん:2007/01/31(水) 15:49:52
>910
違う。
Cの概念において、文字は数値と等価である。
これはコンピュータというもの自体においてそうであり、
そしてCがコンピュータを非常に低いレベルで扱える言語だからである。
これはCの規格自身は文字の見かけというものに一切関心を持たないことを意味する。
入力された数値を文字として表示したり、エスケープシーケンスを
(そのマシンでの)適切な文字コードに変換するのは、そのマシンのOSや、
ソースを編集するエディタや、そのマシン用のコンパイラであって、Cの規格ではない。

わかりやすい例を出すと、Windowsでの改行コードは
実際には改行と復帰という2バイトのコードからなるが、
fopen()でテキストモードを指定して「\n」を書き込めば
それはコンパイラが適切なコードに変換してくれる。
912デフォルトの名無しさん:2007/01/31(水) 16:00:31
訂正
×コンパイラが適切なコードに変換してくれる
○コンパイラが適切なコードが書き込まれるようにしてくれる
913デフォルトの名無しさん:2007/01/31(水) 16:18:01
>>902
>>905
どんな場合であれ、コンパイラは文字リテラルを数値データとして解釈するから、
タブと他の文字とで扱いが違うということはない。
開発環境と実行環境の文字セットが同じならそのまま使用されるし、違うなら適宜変換してくれる。
もしソースコードを別の文字セットの環境で再利用したいという場合でも、
ソースコードをその環境に持ち込む時点で文字コード変換が行われているはずで、
つまりタブもその環境での正しいダブのコードになっている。
914デフォルトの名無しさん:2007/01/31(水) 16:44:18
>913捕捉

ただし、元のテキストファイル中のタブをスペースに変換して表示したり、
ファイルを保存する際にタブをスペースに変換する機能を持つエディタというものが
実際には存在するし、そういったエディタでついうっかりタブリテラルを含む
ソースコードを編集してしまうということは十分考えられる。
この危険性を受容してまで「\t」を使わない積極的な理由は考え付かない。
915デフォルトの名無しさん:2007/01/31(水) 19:08:11
でもソースに"    "←(タブ相当のインデント)って書かれるより
"\t"って書かれる方が見やすいよね(´・ω・`)
916デフォルトの名無しさん:2007/02/01(木) 00:08:03
文字定数って、int型なんだね。知らなかった。

sizeof( 'a' ) は4となる(intが4バイトの場合)

char型で扱っても何の不都合はないのに、
どうして文字定数はint型なんだろう?
917デフォルトの名無しさん:2007/02/01(木) 00:20:54
>916
getcのようにchar相当の値を返す関数が、エラーを知らせるために
charにない値(EOF)を返して、それを適切に比較できるようにするため
918デフォルトの名無しさん:2007/02/01(木) 00:33:39
それはgetcの戻りがintであればよくて、何も文字定数全体が
intである必要はないと思うのだが。C++ではcharだし。
919デフォルトの名無しさん:2007/02/01(木) 00:34:06
C の規格で文字コードに対して課してる制限って、
数字の 0 から 9 までが連続してるってことだけだよな?
例えば A 〜 Z が連続である必要性は無いし、
事実 EBCDIC では連続してない。
920デフォルトの名無しさん:2007/02/01(木) 00:35:39
そもそも汎整数拡張とかいう仕様があるから、
char にしてもあんま意味が無いよね。
C++ だとオーバーロードの呼び分けとかで必要になってくるけど、
C だとそういうのないし。
921デフォルトの名無しさん:2007/02/01(木) 00:37:17
intで扱っても不都合はないと思う。
どうせリテラルはint境界に従って配置されるだろうし、
式を評価する時点で整数はみんな暗黙にintになるから。
922デフォルトの名無しさん:2007/02/01(木) 00:40:35
必要とか意味とか不都合がどうであろうと
文字定数は int なのが C の仕様
923デフォルトの名無しさん:2007/02/01(木) 00:41:13
EBCDICは方言がたくさんあるけど、オリジナルにはa-zが存在しないので
規格を満たせない。
924デフォルトの名無しさん:2007/02/01(木) 00:42:02
malloc( element_of_char * sizeof(TCHAR) );
のときにメモリを多く喰うくらいの話か。
925デフォルトの名無しさん:2007/02/01(木) 00:42:44
>>922
意味を考える事は重要だぜ?
それが分かってないようだと、
言語を本当に使いこなす事は出来ない。
926デフォルトの名無しさん:2007/02/01(木) 00:51:04
文字定数がcharだと、それが式の中で出てくるたびに
コンパイラはいちいちintに変換するコードを埋めなきゃならなくなるだろ
927デフォルトの名無しさん:2007/02/01(木) 00:55:50
>926
文字定数の比較対象はたいていは(const) char*
なんだから、話が逆だな。charなら、そのまま比較すればいい。
928デフォルトの名無しさん:2007/02/01(木) 01:17:27
>>927
汎整数拡張があるからそれでは仕様を満たしていない
929デフォルトの名無しさん:2007/02/01(木) 01:18:30
もちろんコンパイラが内部的に最適化してcharのまま比較してるかもしれないけど
あたかも汎整数拡張されているかのように全く同じ動作を保証する必要はある
930デフォルトの名無しさん:2007/02/01(木) 01:19:08
>>918
妄想半分になるんでテキトーに聞いてくれるとありがたいが、

たとえばASCIIでなく、「z」が0xffになってるような環境があったとする
この場合、getcが「z」を読んだときに返して来る値は0x000000ffだ
これをすぐcharの変数に落とすならffとなって何の問題もないが、
もしそのまま'z'と比較しようとすると、'z'がcharの0xffだった場合に
intの0xffffffffに変換されてしまって等しくないことになってしまう

これを防ぐにはgetcの戻り値をEOFと比較するためだけに
intの変数に落としてからまたすぐcharの変数に入れるか、
文字定数を含めて一切合切をunsigned charにしなくちゃならない

といった面倒があると思うのだが実際にそんな環境があるかどうかは知らない
931デフォルトの名無しさん:2007/02/01(木) 01:25:11
ひどい妄想だ。
もしそんな環境があったら、'z'は0x000000ffだということになるが、
それをcharの0xffと比較しようとしたらどっちみち問題が起きる。
文字定数は負数にならないことは保証されてるんじゃなかったっけ?
932デフォルトの名無しさん:2007/02/01(木) 01:26:11
×文字定数は
○文字定数となることのできる文字は
933デフォルトの名無しさん:2007/02/01(木) 01:29:49
っていうか単にEOFを文字定数と同じ分類で扱うためじゃないの?
934デフォルトの名無しさん:2007/02/01(木) 01:31:33
>930
int main(){
int i=getc(stdin);
if( i == '\xff' ){
printf("FF:%d\n", i);
}
}
vc6でコンパイル・実行して^Zくわせてみたが、
C/C++ともFF:-1と表示したわけだが。
/Jを付ければ表示はなかった。
935デフォルトの名無しさん:2007/02/01(木) 01:37:38
>>931
z はともかくとして、文字列の中のある文字を is 系関数に突っ込んだ時に
0x80 以上の場合負数になって落ちる事はよくある話。
936デフォルトの名無しさん:2007/02/01(木) 01:38:20
>934
'\xff'は(32ビットなら)0xffffffffですが何か?
sprintf("%.8x\n",'\xff');
で吐かせてみろ
937デフォルトの名無しさん:2007/02/01(木) 01:38:48
>929
charとcharの比較で整数拡張は無関係に最適化できるだろ。
938デフォルトの名無しさん:2007/02/01(木) 01:40:13
>936
ちょ、おま。引数に入れた時点で符号拡張されちゃうだろが。
あと、charが符号付きかどうかは処理系依存だろ。
939936:2007/02/01(木) 01:43:09
ああごめん.8で見ても意味なかったな
sprintf("%d\n",sizeof('\xff'));
940デフォルトの名無しさん:2007/02/01(木) 01:44:08
いずれにせよsizeof('\xff')が4だろうが1だろうが、
getcが文字としてのffを返してきたのかEOFなのか
区別を付けるの面倒具合は変わらない、ということ。
941デフォルトの名無しさん:2007/02/01(木) 01:45:58
>あと、charが符号付きかどうかは処理系依存だろ。
ソウナノ?(゚д゚)
942デフォルトの名無しさん:2007/02/01(木) 01:56:07
X3010:2003 6.3.1.1
>…“単なる”char型を符号付きとして扱うか否かは、処理系定義とする。…

あと、もしも'z'が0xFFという値を持つなら 6.2.5から
>…実行基本文字集合の任意の要素をchar型のオブジェクトに格納した場合、
>その値は非負であることを保証する。…
より、charは符号無しであることを強制される。
943デフォルトの名無しさん:2007/02/01(木) 02:01:08
>>941
他のスレでも話題になってたけど、charがsignedかunsignedかは処理系依存。
しかも大抵の処理系ではコンパイルオプションなどで換えられるようになってたりする。
#逆に言えば、charが常にsignedであることがISOの要求であるなら、
#unsignedにするオプションは非ISO化オプションと言うことになってしまう。
944デフォルトの名無しさん:2007/02/01(木) 02:02:02
要するに文字定数は負数にならないから符合拡張云々は妄想ということね
アホなこと言ってスマンカッタ
945デフォルトの名無しさん:2007/02/01(木) 02:02:49
で、なんで文字定数はintなんだ?
946デフォルトの名無しさん:2007/02/01(木) 02:03:48
文字定数全般じゃなくて、ASCIIで表示可能な文字定数は、負にならない。
947デフォルトの名無しさん:2007/02/01(木) 02:04:45
たぶん>926や>933
C++でcharな理由はたぶん>920
948デフォルトの名無しさん:2007/02/01(木) 02:09:27
昔考え無しの誰かがintにして、
実害がないからそのまま放ってあるだけでは。
949デフォルトの名無しさん:2007/02/01(木) 02:09:42
ところで文字列の終端が00であることは保証されてたよね?
950デフォルトの名無しさん:2007/02/01(木) 02:11:15
>>948
考えなしってことはないだろう
コンピューターってのはワード単位にデータをアクセスするのが普通なんだから、
特段の事情がなかったからintにしたというほうがずっと自然だ
951デフォルトの名無しさん:2007/02/01(木) 02:13:18
5.2.1
>すべてのビットが0であるバイトをナル文字という…文字列の終わりを
>示すためにナル文字を用いる。
952デフォルトの名無しさん:2007/02/01(木) 02:14:02
>950
じゃあなんで文字列はワード集合にならなかったの?
953デフォルトの名無しさん:2007/02/01(木) 04:09:47
>>952
別に>>950とは無関係に決められたから。
954デフォルトの名無しさん:2007/02/01(木) 07:05:29
(アメリカでは)8bitあれば十分なのにメモリがもったいないから
955デフォルトの名無しさん:2007/02/01(木) 09:08:53
>>926
最適化でどうとでもなることだろう・・・
956デフォルトの名無しさん:2007/02/01(木) 10:52:32
最適化って言葉の意味わかってんのかなぁ
957デフォルトの名無しさん:2007/02/01(木) 11:28:52
最適化というのはコンパイラの進化によって得られたものであって
Cの規格が最適化しろと定めているわけじゃないぞ

逆に言えば、本当によくできたコンパイラなら、
文字定数がintだろうとcharだろうと
charと比較したときの最適化の結果は同じにできるはず
958デフォルトの名無しさん:2007/02/01(木) 11:41:01
よーするにCでは文字定数がcharでもintでもほとんど差がないから
「自然な整数はint」の法則に従ってintにしたってことだろ。
C++で事情が違うのは既出。
959デフォルトの名無しさん:2007/02/01(木) 11:46:04
>>952
テキストデータというものが既にそういう仕様だったから。
あと、バイトの連続からなるデータを1バイトずつ処理するのは確かに手間がかかるけど、
文字列全体をまとめて扱うぶんにはワードで(2/4バイトいっぺんに)処理すれば済むから。
960デフォルトの名無しさん:2007/02/01(木) 14:27:46
配列のサイズについて質問なのですが、
char data[100];
があったとして、そこにはサイトのURLなどが入ったりするとします。
たいていのURLは100文字未満なので、
dataにURLを入れた後、残りの長さの部分を切り詰めたい時には
どうすればよいでしょうか。
961デフォルトの名無しさん:2007/02/01(木) 15:15:12
>>960
自分の質問の意味を本当に理解しているか。
長さが100の配列に101個以上のデータを入れてから100個に切り詰めることはできない。
もし101個以上つめこんだらそれはバッファオーバーランであり、その結果何が起きるかは誰にも保証できない。

文字配列の長さギリギリまで文字を詰めるには、strncpyを使うこと。
962デフォルトの名無しさん:2007/02/01(木) 15:16:38
CFAQ調だがいまいち
963デフォルトの名無しさん :2007/02/01(木) 15:16:42
それはどーにもならないっしょ
964デフォルトの名無しさん:2007/02/01(木) 15:20:05
訂正
×strncpy
○strncat
965デフォルトの名無しさん:2007/02/01(木) 16:19:21
>961の補足

strncpy()は末尾に\0をつけないことがあるので現在では好まれない
strncat()で文字列を他の文字列(たとえばsrcとする)から所定の長さまでコピーするには、

data[0] = '\0';
strncat(data, src, 99);  /* 100文字目は\0だから */

のようにする

ファイルや標準入力から文字列を直接読む場合には、fgets()を使うこと
ただし、たいてい末尾に\nがくっついていることを忘れないように

なお、gets()は 絶 対 に 使ってはいけない
966デフォルトの名無しさん :2007/02/01(木) 16:51:06
俺、独学で勉強してて書籍とかでgets()は非推奨的なのをすぐ知って、もう今では
使い方すら忘れてる(fgets()をよく使います)。
学校に行って勉強している(うらやましい)環境の人でも、講師からgets()を使ってどうのこうのって
教えられるの?
電気学科卒で学校で教えられたのはFORTRANだけだったけど、情報学科ってどんなんなんだろ。
情報系いっとけばよかったかな〜・・・

以上、独り言。
967デフォルトの名無しさん:2007/02/01(木) 16:55:12
>>965
通りすがりですが
data[100]の領域をとっていて30しか使わなかったら70余るから
どうにかしたいってことだからなんかちがうような

mallocoで確保して足りなくなったらreallocで再確保すればいいんじゃねぇの?
968デフォルトの名無しさん:2007/02/01(木) 17:03:09
静的に確保したあとにreallocなんて使えるの?
969デフォルトの名無しさん:2007/02/01(木) 17:05:35
動的確保すればいいじゃん
970961:2007/02/01(木) 17:24:59
静的に宣言した配列の長さを切り詰めたい、という発想はまったく思いもよりませんでした。
不明をお詫び致します。

>>960
どうしても配列を切り詰めなければならない理由が本当にあるのか。
もし高々数十バイトのメモリすら節約しなければならないとしたら、
そんな環境でそもそも100バイト近いURLを扱うことができるのか。
どんなものでも節約できるなら節約したほうがいいことは確かだが、
瑣末な「効率化」に目を奪われてもっと大事なことを忘れてはいけない。

どうしても必要なぶんだけのメモリを使いたいなら、静的な配列ではなくポインタを用意して、
そこにmallocで領域を割付け、必要ならreallocでサイズを変更し、使い終わったらfreeで解放すること。

971916:2007/02/01(木) 23:01:16
文字定数がintの件、こんなにレスついてどうもです。
で、なんで疑問に思ったかというと
「明解C言語入門編」で、文字を1文字として扱う部分では
すべてint型で扱うようになっていて、いままでcharだと
ばかり思ってたんで、ショックを受けたんです。
文字列として扱う場合はcharとかchar*が使われてるから
違和感無いんですが。
getchar()もcharを返すと勘違いしてたし・・・
C&Rからそうだったんでしょうか・・・
972デフォルトの名無しさん:2007/02/01(木) 23:07:00
次スレ立ててく
973デフォルトの名無しさん:2007/02/01(木) 23:09:47
974デフォルトの名無しさん:2007/02/01(木) 23:10:00
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc10.2ch.net/test/read.cgi/tech/1170338926/
975デフォルトの名無しさん:2007/02/01(木) 23:13:17
はえーよ
976デフォルトの名無しさん:2007/02/01(木) 23:16:58
どうせ文字定数をchar型にしようとしても、汎整数昇格がある限り、結局見た目にはint型であるように振舞うことになると思う。
977デフォルトの名無しさん:2007/02/01(木) 23:21:17
いや、そのりくつはおかしい
978デフォルトの名無しさん:2007/02/01(木) 23:33:30
計算を伴わないchar型同士の比較に関して、整数拡張の出る幕無いだろ?
979デフォルトの名無しさん:2007/02/01(木) 23:41:45
>978
>957
980デフォルトの名無しさん:2007/02/01(木) 23:56:28
>>978
規格は、オペランドの型拡張は「計算を正確に行えるもの」のうち「もっとも計算しやすい型」になると規定している。
charの値を正確に扱える型のうち、最も計算しやすい型はintである。よってchar同士の演算は、規格上は必ずintで行われる。

コンパイラが最適化を行わないなら、Cの規格に従って常にintへの変換が行われる。
コンパイラが最適化を行うなら、(コンパイラが賢ければ)文字定数がcharでもintでも同じコードが生成される。

結論として、charでなければならない積極的な理由は存在しない。
ならば値が整数である以上、整数を扱うのに最も自然なサイズであるintを使うのはごく妥当である。
981デフォルトの名無しさん: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のときは適用されないんじゃないの?
982デフォルトの名無しさん:2007/02/02(金) 00:12:55
あ、あほなこと言ってもた。
983デフォルトの名無しさん:2007/02/02(金) 00:22:42
はい
984デフォルトの名無しさん:2007/02/02(金) 00:38:17
はいじゃないが
985デフォルトの名無しさん:2007/02/02(金) 02:41:32
>978
比較は実際には引き算です
それと規格上intで表現できる整数は全部intになります
あなたがコンパイラに何を期待しようと勝手ですが、
文字定数がcharであるべきだと主張するのは滑稽です
986デフォルトの名無しさん:2007/02/02(金) 07:47:57
>>985
あなたがコンパイラに何を期待しようと勝手ですが、
比較は実際には引き算だと主張するのは滑稽です
987デフォルトの名無しさん :2007/02/02(金) 08:12:58
>>986
あなたが俺に何を期待しようと勝手ですが、
セックスは実際には足し算だと主張するのは滑稽です
988デフォルトの名無しさん:2007/02/02(金) 09:17:11
そーいやアセンブリ言語で比較は結果を格納しない減算命令を用いてやってたっけ。
で、Zフラグが立ったらとか立たなかったらで条件ジャンプ命令でジャンプと。
マシン語に憧れた子供時代でした、はい。
989デフォルトの名無しさん:2007/02/02(金) 09:32:02
文字定数をintで扱う?
ソース読みにくくするだけじゃん
990デフォルトの名無しさん:2007/02/02(金) 10:57:01
エスパーに >>989 の解読をお願いしたい
991naka_hiro:2007/02/02(金) 11:04:59
function utf16to8(str) {
    var out, i, len, c;

    out = "";
    len = str.length;
    for(i = 0; i < len; i++) {
        c = str.charCodeAt(i);
        if ((c >= 0x0001) && (c <= 0x007F)) {
            out += str.charAt(i);
        } else if (c > 0x07FF) {
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
            out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        } else {
            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));
        }
    }
    return out;
}
992デフォルトの名無しさん:2007/02/02(金) 12:08:37
文字定数の主たる演算対象がcharだと考える事自体偏見
993デフォルトの名無しさん:2007/02/02(金) 23:30:36
埋め
994デフォルトの名無しさん:2007/02/03(土) 05:18:33
^
995デフォルトの名無しさん:2007/02/03(土) 12:26:01
埋め
996デフォルトの名無しさん:2007/02/03(土) 18:57:45
umeume
997デフォルトの名無しさん:2007/02/03(土) 19:26:16
int main(void) {
998デフォルトの名無しさん:2007/02/03(土) 20:28:49
// >>997 上手いな…ム板住民の性質をよく見抜いた、
// 埋めカキコを促す良い方法だ。

printf("埋め\n");
999デフォルトの名無しさん:2007/02/03(土) 20:32:35
/* 梅
1000デフォルトの名無しさん:2007/02/03(土) 20:33:57
*/

return -0721;
}
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。