C言語なら俺俺に聞け! Part 73

このエントリーをはてなブックマークに追加
1v(^o^i)d
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

コンパイラを探しているなら >>2-13 を。
上記を逸した場合の結果は激しく未定義だYO!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンクは>>3-20あたり(誰か適当に貼って)

C言語なら俺俺に聞け! Part 72
http://pc2.2ch.net/test/read.cgi/tech/1075532838/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:04/02/18 18:19
2ゲット
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
otu
6デフォルトの名無しさん:04/02/18 19:18
キカネー
|っ ヤッホッ
8依頼した人:04/02/19 00:55
あ!!
「俺俺」を「俺」に直したつもりが直していなかった!!
あ、俺俺。
実は会社の先輩の車で事故起こしちゃって、修理代50万ぐらいかかるんだよね
>>9
あなたの講座に50万ペソ振り込みました
ウソだったら、通報の上、針千本飲ますのでよろ
50万ペソって日本円にして200円くらいじゃん。まあ金額の問題じゃないが。
>>11
アルゼンチンペソで換算すると約1800万でふ
by ttp://www.bloomberg.co.jp/markets/jp_currcalc.html
まぁ金額の問題ではありませんが
  ./:;:;:;:;:;:;:;/:::..   |
 /:;:;:;:;:;:;:;:/;;;;;;;;;,,,, .|
 l:;:;:;:;:;:;:;/""  ""|
 i:;:;:;:;:;/.,,ぇzv、..,::;:.|
 l:;:;:;:i′.`'':::.:;;'`::.; |
 i:;:;:/      ::. |
 l:;:;i::.....    .;''  |
 i:;:;:;ト;;;;;;;;.......'ヾ :|
 .\;l';;;`':::;'    ,|
   l:.   ヽ.'',,,,::;;|
   ヽ:. .... ヾ;i;f"|
    ヽ;:::   .ヾ';;|
    ,,ヽ;.    |, -─-、
 ._./''';;iiヾ;;,,,  / ,.-─'´
ノ    (l ~`''‐( ζ___
        /   __:_冫
       (   (____
       (    _:_冫
        (   く__
        `ヽ、___`>
          |
          |
getopt() 使ってるアプリってgetoptのソースをまるまる梱包してる
のをよく見かけるんですが、あれはなんでですか?
15デフォルトの名無しさん:04/02/19 11:49
>>14
getoptがない環境でも使えるように。
argvってポインタ配列も文字列も書き換えていいんだよな。
最近まで知らなかった。
constついてないからね。
18デフォルトの名無しさん:04/02/19 14:13
         ∧_∧
         < `ш´>
       _φ___⊂)
      /旦/三/ /|
    | ̄ ̄ ̄ ̄ ̄|  |
    | 香典百円 |/
ミヤ大工トンプソンに聞け!
>15
getoptがある環境では無用のモノってことですね。
ありがとうございました。
>>16
でも、元のサイズを超えて書き込むとヤヴァイ。
22デフォルトの名無しさん:04/02/19 22:07
前スレが埋まったのでちょっと age ますね
23デフォルトの名無しさん:04/02/19 22:22
ちょっと教えてください。

今、他人の作ったプログラムをメンテナンスしてるんですけど、
vsnprint( buf, size, "%255-255s", args );
ってあるんですよ。
"%255-255s"って、どんな意味なんでしょうか?
C言語の本とかみても、こういう書き方載ってないんですよ…。
>>23
その処理系の拡張機能になければ、
そんな書式はないなぁ。
どういう動作が期待されるかを調べて、
書き直すのがいいかと思われ。
%255.255とかならあり得なくもないが、、、
%255.255s の間違いじゃないかなあ・・・
>>23
いままでそのプログラムは正常に動いていたのか?
28デフォルトの名無しさん:04/02/19 23:14
とりあえず、今までおかしな動きをしたという話は
聞いてはいないんです。
(聞かされてないだけか?)


他にも数箇所同じ書き方してるところがあったんで、
てっきり、こういう書き方もあるのかと思って調べてみたんだけど。

やっぱり間違いですかね。
%-255.255sとか。。。
>>27
俺俺
まあおかしいって言っても
%-255s と同じ挙動をするみたいだから、気がつかなかったんだろうな
255文字を越えることがあるかどうかで変わってくるけどな
右詰め? 左詰め?
均等割付でお願いします。
え、C99ではそんな拡張が!
C90, C99, C08小隊
37 :04/02/20 04:57
GNU MP と MPFR を使ってます。今まで盲目的に使っていたのですが、
最近 mpfr.h をのぞいてみたら次のような記述がありました。

  typedef __mpfr_struct mpfr_t[1];

これ、main() では mpfr_t x; のように使っているのですが、
この typedef の意味するところがわかりません。
mpfr_t[1] 型 ってなんのことやら…

もしかしてこれって、 mpfr_t という型は
「_mpfr_struct 構造体 の大きさ1の配列の先頭へのポインタ」
だと主張しているのでしょうか…
typedef宣言は、"typedef"の文字を取り除くと変数の宣言に見えるはず。
その変数(に見える物)の型がtypedefされた型で、
その変数(に見える物)の名前がtypedefされた型の別名。
mpfr_t x; は __mpfr_struct x[1]; と同等。

typedef __mpfr_struct mpfr_t[1];
   ↓
   ↓typedef を除く
   ↓
__mpfr_struct mpfr_t[1];
   ↓
   ↓mpfr_t を x で置換
   ↓
__mpfr_struct x[1];
>>37
その通り。mpfr_t x;という宣言があるとき、xは__mpfr_structの大きさ1の配列である。
また、xは式の中では(殆どの場合)__mpfr_structへのポインタに読み替えられる。

そのライブラリを使ったことが無いので以下の文章は憶測に過ぎないことを予め断わっておく。

mpfr_t x;と宣言して、f(x, foo, bar); の様な呼びかたをする関数がそのライブラリに
含まれていると思が、ここでfの第一引数は__mpfr_structへのポインタになる。
また、そのポインタは既に有効な領域を指している。

こうすることで、__mpfr_structの値渡しによるオーバヘッドを避けることが出来、
しかもそれをライブラリの利用者に意識させることがない。

FILE構造体もポインタを用いたオーバヘッドの回避をしているが、FILE構造体「へのポインタ」
をライブラリの利用者に意識させてしまうし、構造体の領域確保をライブラリが行う必要がある。

この2つの問題を少し変わったtypedefを提供することで回避しているのだろう。
>>40
> その通り
>>37 を斜め読みして嘘を書かない。
> 「_mpfr_struct 構造体 の大きさ1の配列の先頭へのポインタ」
ではなく、
> 「_mpfr_struct 構造体 の大きさ1の配列型」
が正しい。
ちなみに、なぜわざわざ「サイズ1個の配列型」を別名定義しているのかというと
関数の引数の関係で、アドレスを渡したいのに
引数の型がポインタになっていないんだと思う。
確かjmp_bufもこんな理由だったはず。

ほぼ確実に言えるのは、
「そのライブラリ使用者は、実装の詳細を知る必要はないだろう」ということ。
FILEの実装を知らなくてもstdioは使える。
>>41
確かに。このtypedefの技法に感心してしまって>>37の書き込みを斜め読みしてしまった。
申し訳ない。
4442:04/02/20 06:13
おもくそかぶってた
4537:04/02/20 06:22
>>38-44 ありがとうございます。

そう、ヘッダファイルを見た理由は、
foo ( mpfr_t x, mpfr_t y); なんていう宣言の関数があって、
一見すると値渡しなんですけど実際には x の中身が変更されてるんですよね。
で、ハァ?と思ってソースを眺めていたのです。

ちなみに GNU MP ってのは多倍長精度数値演算ライブラリです。
http://www.swox.com/gmp/
IEEE754 の精度だと足りない数値計算をやっていて、
どうしても精度が足りなかったので使ってみようかと。


MPFR てのはそれを利用した sin cos exp とかを
提供してくれているライブラリです。
http://www.mpfr.org/
>>45
ホンマ面白い技法やな。
こういうことよね?

#include <stdio.h>

typedef struct foostruct_tag_ {
 int a;
 int b;
} foostruct_;

typedef foostruct_ foo[1];

void show(foo a) { /* a は foostruct へのポインタ変数 */
 printf("%d %d\n", a->a, a->b);
}

int main() {
 foo a; /* 実体が作られる */
 a->a = 2; /* a->a は a[0].a と等価 */
 a->b = 3;
 show(a); /* 参照渡し */
 return 0;
}
アドレス渡しと言ってください。
>>46
でも便利でもなんでもないよね。
. と -> の使い分けも要らなければ、
& を書く必要もないというのは、
少しだけ魅力的かも。

>>46

typedef struct foo_ {
 int a, b;
} foo[1];

と短縮できるね。
50デフォルトの名無しさん:04/02/20 07:43

#include <stdio.h>
↓なんでエラーがでるのかわかりません。おしえてください!
int main(void)
{
int i;
char cs[3][6] = {"Turbo", "NA", "DOHC"};

printf("%s", cs[1][0]);

return (0);
}
printf("%s", cs[1]);
むしろ、そのiはなんだ?
消し忘れだろ?
54デフォルトの名無しさん:04/02/20 09:41
質問する時はエラー内容も書けな。
コンパイルは通るだろうしな、それ
コンパイルエラーとは言っていないしな。
まあこれくらいはすぐに分かるが。
57デフォルトの名無しさん:04/02/20 11:22
#define MAX 1000000

int main(int argc,char *argv[]){
unsigned long int AR[MAX];
printf("HEE");
}


これをコンパイルするとアプリケーションエラーになるんですがどうしてでしょうか
58デフォルトの名無しさん:04/02/20 11:28
こんにちは

ある文字列内の改行(\n)を、strncmpで見つけだすプログラムを組んでいますが、なかなかうまくいきません。

if(0==strncmp(cp,"\n",2){
//改行が見つかった場合
}

何か間違いのある箇所はあるでしょうか?
>>58
if (strchr (cp, '\n')) {
//改行が見つかった場合
}
にすれば多分動くんじゃない?
ついでに言っとくが\nは2文字じゃないぞ。
それとも終端のナル文字まで比較したいのか?
>>61
後者ならstrcmp(cp,"\n")ですむよな。
50ではないですが、50がなんでエラーになるのか分かりません・・
ご教授願います。
64デフォルトの名無しさん:04/02/20 12:19
>>63
cs[1][0]は'N'
"NA"を出力したいのなら
cs[1]
65デフォルトの名無しさん:04/02/20 12:20
printf("%s",(char *)'N');
>>65
奈落に落ちろ
>>66
>printf("%s", cs[1][0]);

>printf("%s",(char *)'N');
は同じような事をやっていると言いたいのではないかと
>>67
上は int 値を渡し、下は char* 値を渡している。
同じ環境も多いだろうが、例えば 64ビット機では
int が 32 ビット、ポインタが 64 ビットなことが多く、
その場合は明らかに挙動が違う。
上は %s の要求するサイズの値を渡してないのでゴミが入るが、
下はゴミが入らない。
ゴミが入らなかった場合は大抵不正アクセスで落ちるだろうが、
入った場合はたまたまアクセスできちゃう可能性も無きにしも非ずだ。
まぁ、多分不正アクセスになるとは思うけど。
>>68
>同じような
  ~~~~~~
>>68
なんか難しいですが覚えときます。それでは例えば配列2つ目の最初の
1文字を出力したい場合どう書けばよいのですか?
printf("%s",(char *)'N');だと最初からNが入ってるのが分かりきってる
場合ですよね。
1文字出力したいんなら、%sじゃなくて%cだ
7270:04/02/20 13:14
>>71
そうでした;; どもです
#include <stdio.h>

void kan(char*);
int main()
{
char ab[ ]="DDD";
kan(ab);
puts(ab);
return 0;
}
void kan(char *a)
{
puts(a);
*a="ABC";
}
他の関数にabを送ってポインタaに入れました、
それでaに"ABC"を入れてmain関数でABCと表示するプログラム

のつもりなんですが;
コンパイルしたら「移植性のないポイント変換」と出て原因もわからずじまいです。TT
俺俺さん教えてください!!
*a="ABC";

文字列を配列に代入できない。
strcpy(a,"ABC");
>>74
> 文字列を配列に代入できない。
解法はあってるが、この部分違うだろ。

*aじゃポインタじゃなくて、先頭データ指しちゃってるから
そこに文字列のポインタを入れることはできんぞ。

だから、a="ABC";にすれば、コンパイルは通るんじゃないか?
しかし、strcpy(a,"ABC"); にしろこれにしろ、バッファサイズのチェックを
してないから、そこは気を付けておいた方がいいぞ。
拡張していって、知らずうちにバッファオーバーフロー起こすとかありそうだしなw
文字列のポインタっていうか文字列を指してるアドレスな
>>75
おまいさんは
char ab[ ]="DDD";
ab = "ABC";
これが許されると思っているのかね?
ポインタっていうのはアドレスを指す変数を言うのであって
"ABC"= ポインタじゃねーぞ
>>77
>void kan(char *a)
>{
>puts(a);
>*a="ABC";
>}


>void kan(char *a)
>{
>puts(a);
>a="ABC";
>}

に変更した場合は、ローカル変数「a」に、
文字列リテラル「"ABC"」の先頭アドレスを格納するだけ。

>char ab[ ]="DDD";
>ab = "ABC";

とは訳が違う。
8079:04/02/20 17:31
>>79
×先頭アドレス
○先頭ポインタ値
81デフォルトの名無しさん:04/02/20 18:07
先頭アドレスで問題ない
82デフォルトの名無しさん:04/02/20 18:11
っていうか、おまえら低次元なことでもめてるなあ。
ちゃんとした入門本読んで出直して来いよ。
初期化と代入は別物だからな
ちゃんと理解しておかないとC++のオブジェクト指向で必ず壁にぶつかる
>>82
うるせーバカ。
>75,77
>79に補足だけど
ローカル変数に代入しても呼び出し元に伝わりませんよ、と。

呼び出し元に値を渡したいときは、、
返値にするか、その変数の型のポインタを引数にする。

引数で、ポインタを渡したければ、ポインタのポインタを受け取れ、と。
ローカル変数に代入してもっていうか
"ABC"の有効範囲がkan()関数内だけだからじゃないの?
うはwwwwwwwwwバカwwwwwwwww
文字列リテラルとは、(ry
文字列リテラルのスコープは、書かれた位置によって異なるので注意しろよvv
変数じゃあるまいし、定数にスコープなんてないだろ。
ちなみにスコープ!=寿命
>>83
ある1つの言語を学習中に無理に他の言語まで抱え込む必要はないと思うし、
初期化と代入は別って話はそうなっている言語があるってだけでOOPの本質なわけじゃない。
だからそういうのは言語を1つ憶えるたびにその都度確認するしかないよ。
92デフォルトの名無しさん:04/02/20 21:52
っていうか、おまえら、
「作ってわかるCプログラミング」でも読んで
出直してこい。ってかんじー
94デフォルトの名無しさん:04/02/20 21:56
92==93 ?
>>92とは仕事したくない。
よく ATOM って型が Windowsプログラムとかに使われているが、
どういう意味で使われているのでしょうか?。

VCでは、定義を調べたら

typedef WORD ATOM;

となってました。
>>96
文字列リテラルに対応した整数値
98デフォルトの名無しさん:04/02/21 03:41
ユンソナとBoaは同一人物なんでしょうか??
2個の四角形の交差判定ってどうやって考えればいいの?
コード書いてみたら馬鹿みたいにチェックがかかるから頭パンクしそうです。
具体的にはシューティングなんかの弾丸等の衝突判定っぽいやつなんだけど。
>98
ユンソナの歌手名がBoAだっけ?
101デフォルトの名無しさん:04/02/21 03:51
>101
誘導Thx!
セグメンテーション・フォールトとは、実際どのような場面で起こるのでしょうか?
今作ってるプログラムが、コンパイルは通るんですが実行すると
セグメンテーションフォールトだと叱られて止まってしまいます。
原因はある程度は絞れたんですが、肝心なところがわからず困っています。
どなたかアドバイスお願いします。m(__)m
104デフォルトの名無しさん:04/02/21 05:51
>>103
変なところに書き込んだり二度freeしたり様々。
105103:04/02/21 05:53
ソースはこんな感じです。

typedef struct {
int hfile;
long fsize;
}FILEINF;

int fileinit(FILEINF *fi,char *fname){
fi->hfile=os_OpenFile(fname);
/*ここでエラー*/
/*処理が続く*/
}

int os_OpenFile(char *fname){
int handle;
handle=…
/*ここまでは正常*/
return handle;
}
10650:04/02/21 05:54
ちょっと待って!
#include <stdio.h>
int main(void)
{
char cs[3][6] = {"Turbo", "NA", "DOHC"};
printf("%s", cs[1][0]);
return (0);
}
↑cs[1]は分かるけど、なんでcs[1][0]にしてはいけないの?
Nが表示されてもいいはずじゃん!
問題が発生したため、〜.exeを終了します。ご不便をおかけして
申し訳ありませんでした。って謝られるんだけど!!
107デフォルトの名無しさん:04/02/21 05:55
>>105
そのfileinit関数を読んでいるところをさらしてみて。
108デフォルトの名無しさん:04/02/21 05:56
>>106
scanfの%sが何を求めているか調べれば分かる。

>>103
この>>106もそれが起こりうる良い例。
109104:04/02/21 05:57
おっと、書き込むだけでなく読み込むときも発生する可能性があるな。
110107:04/02/21 05:58
読んで→呼んで
>>106
%c
>>108
scanf()じゃなくてprintf()だけど。
>>112
オーアイムソーリー
114デフォルトの名無しさん:04/02/21 11:53
きっと、scanfを見ればわかる、という意味だろ?
scanfが学習に役立つのって、このことぐらいのものだ ;)
%d、%c、%s &i、&c, s (scanf)
%d、%c、%s i、c、s (printf)
この、非対称性の意味するところは大きい
(ポインターと引数の仕組みをわかってないと)
>>114
違う。素で間違えた。指摘されるまで気づかなかった。
116デフォルトの名無しさん:04/02/21 11:57
災い転じて、というやつだな
>>114
scanf の %f or %lf と printf の %f もね。
ポインタと引数の仕組みだけでなく、
可変個引数の仕様(float → double 拡張)も把握してないと
理解できない。
>>114
どうせなら、%fの非対称性を指摘しようよ。
119118:04/02/21 12:05
被った…
#つーか、リロードしようよ>漏れ
確かに、どうしてprintfには%lfがないのか(C99には%fと同義としてあるらしいけど)考えると可変個引数について理解できるようになるね。
73のプログラムをみてると混乱してくるな・・基礎が大事だって気づくよ。
>>121
アンカーくらいつけろ。あほ。
そんなあなたに Live2ch 。
124103:04/02/21 18:27
>>107
遅レススマセン。

typedef struct {
FILEINF *hage;
FILEINF *hoge;
}DATA;

int init(DATA *datas){
if(!initfile(datas->hage, "hage.dat"))return 0;

if(!initfile(datas->hoge, "hoge.dat")){
 os_Close(datas->hage->hfile);
 return 0;
 }
return 1;
}
125103:04/02/21 18:31
補足:hage.datを開いてinit()に戻ってくるまでは正常なんですが、
hoge.datを開こうとすると、fileinit()の中でos_OpenFile()の返り値を受け取る辺りで止まってしまいます。
126デフォルトの名無しさん:04/02/21 18:44
>>124-125
とりあえず晒した部分には問題はない。
略したところかまだ晒していない部分にバグがある。
たとえばdatas->hogeが指す領域が確保されていないとか。
>>126
>たとえばdatas->hogeが指す領域が確保されていないとか。
その通りなんだろうな、きっと
128103:04/02/21 19:26
>>126-127
ありがとうございます!やっと目が覚めました(^^;)
DATA datas;
と宣言して勝手にhage,hogeも確保したつもりになってました…
ケアレスですね。今後気を付けます。
char **pp;
pp = (char **)malloc(100);

とした場合ppを解放するにはどうしたらいいんでしょうか?
free(pp);
>>129
pp = malloc(100 * sizeof (char*));
の悪寒
>>130
それだとGCCではセグメンテーション違反と言われてしまいました。
A〜Gまでをランダムで発生させたいんですけど、
同じ文字が2個以上連続で出ないようにするにはどうすればいいのでしょうか?
〇 ABACDGD
× AABCCGD
>>131
ようやく意味がわかりました。
確かにそうですね。
けど相変わらずchar **の解放はできず。
そもそもmallocはchar *でとどめておくべきなのかなあ。
>>133
それはランダムとは言わないのでは?
>>133
一個前に出たやつ記録しとけばいいじゃん
>>134
それはポインタ壊してるんじゃないか?
通常はどんなポインタでもmallocしたやつならfreeできるぞ
一応出来るぞ。

STLのAlgorithm使って

string str="abc de f";
str.erase(remove(str.begin(), str.end(), ' '), str.end());

ただあまり良い方法ではない
スマソ誤爆(´・ω・`)
>>139
またおまいか!
141133:04/02/21 20:28
>>136
そのやり方が分からないのです・・・_| ̄|○
>>137
free((char *)pp);
でセグメンテーション違反は出なくなりましたがこれでちゃんと解放されたのかな?
>>133
例えばこんなのとか
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 20
int main(void){
int i=0,r,r_save=-1,ch;
srand((unsigned)time(NULL));

while(i < N){
r = rand() % 7;
if(r == r_save) continue;
printf("%c",'A'+r);
r_save = r;
i++;
}
return 0;
}

144143:04/02/21 20:48
ch消し忘れ。
以前free時にセグメンテーション違反が起きて困ったことがある。
理由はまさに今回と同じ、「*sizeof(char *)」を忘れたこと。
書き込むときではなくfreeする時に起こる(freeを呼ばないと起こらない)ものだから原因を特定するのに時間がかかった。
146133:04/02/21 21:14
>>143
ありがとうございます。
とても参考になりました。
>>142
そんなんで出なくなる状況は、真っ当な状況であるはずがない。
絶対なんかまずいこと起きてるよ。
1. 初期化してない変数
2. バッファオーバーラン(配列などの正規のサイズを超えて書き込むこと)
3. 予期しないアドレスの入ったポインタでの参照
あたりを重点的にプログラム全体をチェックしてみれ。
>>142
char **pp;
void free(void *);

(void *)(char *)pp == (void *)pp
だから
  free((char *)pp);
これでどうこうなるはずがないとおもうんだが。

stdlib.hをincludeしてなくてppが整数にされてるとか?
デバッグ用にprintfも同時に付け加えてるとかそんなオチじゃねえよなw
freeに渡すポインタをキャストしたくらいで挙動が変わるとはちょっと思えない。
バッファオーバランが原因だろ?
もう結論出てるじゃん。

オーバランした時にエラーを検出するのではなく、
カーネルにメモリを返却したとき(この場合free)にエラーを検出する。
>>150
細かいことだが、普通のfreeの実装はfreeのたびにカーネルにメモリを返したりしないのだが。
そんな実装も可能性としてはあるが、性能悪すぎて使い物にならんだろうね。
>>151
それは「あなたの普通」。
mallocがなぜ関数にしてあるのかが解ってないね。
>>151
アローケートサイズが8192バイト以下ならそうかな(i386)。

今回は、オーバランチェック用バッファが散らかされた事を検出したうえで、
ライブラリ内部から(ユーザーコードから)あぼーとを実行してるんじゃない?
そこでPHK mallocですよ
>>152
なぜ関数にしてあるかを考えたらそこでカーネルが出てくること自体が疑問なんだがな。
ライブラリレベルで十分検出できるしさ。実際バッファオーバーランを検出する
malloc/freeラッパを作って使ってるしね。>>154で出てくるPHK mallocもその系統のひとつだし。
おれのしょぼい自作ラッパよりははるかに高機能だけどw

んで、>>148のstdlib.hをincludeしてないって説もちょっとありうるかなと思った。
sizeof(int) != sizeof(char **)の処理系だと不幸なことがおこりそうだもの。
どうかな。この辺考察不足で勘違いかも知らんけど。
>>155
オーバーランした時点から動作も結果もすべて未定義。
あなたの言うようにカーネルが出てくる150の説は一般論にはなり得ないし、
それに乗じて返却のタイミングについて特定の処理系を普通と言っている151の説も不適切。
未定義の動作が進行中のfreeの挙動については、いかなる説も成り立たないと考えてこそgeneric。
>>152
なぜ関数かって...、C から簡単に呼べるようにするからだと思うけど...。
(多くの処理系で、API も関数になってると思うし。)

malloc() がなぜライブラリなのかと言いたいのか ?

>>156
>>151 は、オーバーランした時の話をしてるんじゃないと思うぞ。
>>150 が、「カーネルにメモリを返却したとき(この場合free)」 とあたかも、カーネルにメモリを返却 ≡ free() のように書いてるから、噛み付いただけだろ。

少なくとも、全ての処理系が >>150 の言うようになっていないのは事実だけど、>>151 の言うような処理系が「普通」かどうかはちょっと微妙。
もし、普通と言うのがダメならあんたが言ってる「>>150 の言ってる処理系は特定の処理系」とまで言うのもダウトだと思う。
>>157
mallocの実装はユーザ定義、規格は結果しか規定しない。
mallocの実装者(あなたかも知れない)は、
freeに渡されたポインタが示すメモリのアドレスが
以後mallocが返すポインタが示すメモリのアドレスとしてもよいし、
意図的に避けてもよい。「微妙」にするのはあなたの創作のみ。

ところで「あんたが言ってる」に該当する記述とは?
>>158
なんか思いっきり論点がずれてる気が...。

> ところで「あんたが言ってる」に該当する記述とは?

>> 返却のタイミングについて特定の処理系を普通と言っている151
160デフォルトの名無しさん:04/02/22 02:18
> 同じ文字が2個以上連続で出ないようにするにはどうすればいいのでしょうか?

それはランダムとはいわない。
>>159
論点ずらしてるのはお前だろ
>>162
規格の話でもしたいのか ?
多分 >>158 みたいな話はみんな (また噛み付かれるか ? (藁)) おなかいっぱいだと思うけど。

>>150 の最後の文と、>>151 は、free() の実装の話だよ。
まあfreeで発覚するのはメモリ管理テーブル(リスト)を
変更しようとするからだろ
そんな誰でも知ってることを堂々と書かれると、赤面しちゃうな。
もう、て れ や さ ん ♥
型の大きさを掛け忘れる奴はcalloc使え。ゼロクリアのコストはかかるが。
168150:04/02/22 07:07
やれやれ、メモリ解放に関する記述をアバウトに書いたせいで、
大漁になってしまったようだな。
今更、>>153を書いたのも漏れだとは言えんな。

ま、実際間違いなんだけどな。>>150
でも何となく意味は通じただろ?貴様ら。
>>168
× > やれやれ、メモリ解放に関する記述をアバウトに書いたせいで、
○ > やれやれ、メモリ解放に関する記述を間違って書いたせいで、

自覚がないのか...。
>>153 のアフォ発言は、正直スルーしてた。
正解だったな。
このスレでは「普通」というと噛み付かれるということが分かった。
常に、規格に沿って正確に表現しなければいけないわけだな。
>>170
プログラムでメシ食ってるやつはいつも「普通」という言葉にはにひどい目に合ってるからね。

本当に「普通」が普遍的なものならどんなに幸せなことか。
#include <stdio.h>

main()
{
printf("まんこ?お前らまんこか?\n");
}
>>172
全然おもしろくない。
シモネタ=ユーモアのない人が頼るブラックジョークだからね。
恐らくプログラミングも初心者なんだろうね。
もうだめだめw
>>172
main()だけかよ(藁
mainの戻り値を省略するのは現代的で好感が持てるな。
>>175
そーゆー意味じゃねーだろ?
C は戻り値の型を省略すれば int になるので問題ないが
(C99 だとだめだけど)、
return 0; が無いのは規格違反。
main()の戻り値がintだとか、そんなの
スタートアップルーチンの作り次第でしょ?
voidじゃなにがまずいのかね。
シェルが無い環境なら引数も不要だし。
>>178
規格に(ry
>>177
C99だとreturn 0;を省略してもいいんだよな。
まあ、どちらにしても>>172は糞なわけだが。
これだけ釣れれば>>172も本望だろ。バカ丸だしだけど。(w
>>179
規格がどうしたの?
>>182
過去ログ読め
184デフォルトの名無しさん:04/02/22 16:37
>>174
まんどくせかたからさ。
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("まんこ?お前らまんこか?\n");

return 0;
}
コレで問題ないか?
main=-61;
186174:04/02/22 17:17
>>184
ネストくらいしろよ。見づらいだろ?バカ丸だしだな.〔藁
それはもういいって
>>186
ネスト?
189デフォルトの名無しさん:04/02/22 17:18
現在、500Mのファイルにすべて"0"を書き込みする方法(ファイルの新規作成・初期化)
を考え中なのですが、この処理をなるべく早く終わらせたいと思っています。

main(){
FILE *fp;
char *buf;
int i;
long loop; 
long mod;

buf=(char *)calloc(1024,sizeof(char));
loop=5000000/1024;
mod=5000000/1024;    

fp=fopen("test.c",a+);
for(i=0; i<loop ;i++){
fwrite( buf, sizeof(char), 1024, fp );
}

for(i=0; i<mod ;i++){
fwrite( buf, sizeof(char), 1, fp );
}
fcolse(fp);
free(buf);
}
ちなみに、callocの1024のサイズを8086などに変えても、
高速化にはなりませんでした。
もっと良い方法がありますでしょうか?
もし、あればご教授いただければと思います。
>>186
ネストって何?
どこをネストしていいものやら。
>>189
まず本当に0で埋めることが必要なのか、小一時間考え直せ。
あと"0"じゃなくて\0といったほうがいいだろうな。
193デフォルトの名無しさん:04/02/22 17:28
>>186
もしかして、”インデント”って言いたかったのか?
>>189
だいたい、プログラムの実行速度よりディスクへの書き込み速度の方が遅いからな。。。
>>189
単にでかいファイルを作りたいだけなら、
seek&writeとかtruncate()とかいろいろあるわけだが。
196デフォルトの名無しさん:04/02/22 17:43
>>195
ちなみに、Linuxで、作成中なんですが、
truncate()使って、ファイルを500Mbyte分取ったんですが、コマンド"ls"を使うと、
ファイルのサイズは、変わるんですが、コマンド"df"で、ディスク容量を
確認すると、ディスク容量としては、変化しないんです。
ハードディスクの容量をファイルの作成した容量分減って欲しいのですが・・・
>>189
とりあえず、
mod=5000000/1024;  これって
mod=5000000%1024;  こうじゃね?

あと、500MBなんだよね。このプログラムって5MBしか処理してないように
見えるのは気のせい?

それと
for(i=0; i<mod ;i++){
fwrite( buf, sizeof(char), 1, fp );
}
のループは
fwrite(buf,sizeof(char),mod,fp);
でいいんじゃね?
198デフォルトの名無しさん:04/02/22 17:55
>>189です。
すみません。
mod=5000000%1024;でした。。。
書き間違いです。
あと、桁も間違っていました。
loop=500000000/1024;
mod=500000000%1024;
でした。
>>189
mkfileってコマンドなかったっけ?
$ mkfile 500m hoge
でhogeって名前の500MBのファイルが作れるやつ。

Cとは関係ないけど。
>>196
現代的なファイルシステムでは、ファイルを作ってもデータの存在しない領域は物理的な領域を確保しない。
疎ファイルとか言う。
Cと関係ないけど下のようなコード
はインテル系やAMD系のCPUでfloatの
ビット長が同じならどれでも同じ
演算結果になりますか?
float angle = 0.1f;
cosf(angle);
最適化によって最後の桁くらいは
ちょっと変わるかもしれない。
CPU は関係なしに。
204デフォルトの名無しさん:04/02/22 18:48
P2P作れ。
205デフォルトの名無しさん:04/02/22 18:53
>>199,>>200
Cプログラミングのみで、行う予定です。
>203 さんくす
>>189
500MB だと 500*1024*1024 じゃない?
208デフォルトの名無しさん:04/02/22 20:29
なんでcalloc(というか動的メモリ確保)なんか使っているんだろう。
209デフォルトの名無しさん:04/02/22 20:55
>>208
0で初期化したいんじゃない?
だったら
static char buff[1024];
とでもしろって言いたくなるけど。

>>189
なんか余りを求めたりめんどくさいことしてるけど
#include <stdio.h>
static char buff[1024];
int main(void)
{
 FILE *fp = fopen("500MB", "w");
 int i;
 for (i = 0; i < 500 * 1024; ++i)
  fwrite(buff, sizeof(char), sizeof(buff), fp);
 fclose(fp)
 return 0;
}

じゃだめ?
210209:04/02/22 21:13
>>209
>static char buff[1024];
>とでもしろって言いたくなるけど。
これでbuff[]が全部0で初期化されるんだっけ?
なんか違うような気がしてきた。
>>189が作りたいのは
500MBのファイルを勝手に作成してHDDの寿命を縮めるウイルス










と言ってみる学年末テスト。
ディスクフルアタックじゃねーの?
>>202
演算結果の保証は無いと思われ
floatのビット長が同じと言うのはメモリやレジスタでの表現形式のことであって
演算ユニット内部での計算精度はまったく異なる
また、cosf関数の内部的な実装は激しく未定義であることもこれの原因になる
>214
>cosf関数の内部的な実装は激しく未定義

未定義の定義は?
>>215
定義の意味がわからないのに定義を聞いてもしかたないだろ。
>>210
されるよ。
>>215
そもそもcosf関数はC99からだし
(質問内容からANSI C以降のすべてのコンパイラと推測)

未定義と定義されている場合もあれば
定義されていないことを見て意義と言う場合もある
第一標準ライブラリの内部の実装などどうやって定義するんだか…
>>189
setvbuf調べてみな。
220209:04/02/22 22:26
>>217
レスthanx
>可搬性がない若しくは不正なプログラム構成要素の使用における動作、
>又は不正なデータ若しくは不確定な値を持つオブジェクトの使用における動作であり、
>この規格が何ら要求を課さない動作。

つまり、cosf関数の内部的な実装は非常に高い率で(訳注:原文「激しく」から意訳)、
可搬性がない若しくは不正なプログラムの構成要素を含んでいる、と>>215215は予言したわけだな。
>>202
先ずは同じ演算結果になって欲しい理由を教えてくれ。
全てはそれからだ。
>>222 sinf,cosfで角度を求めてそれだけなら
別に多少の精度は問題ないけど例えばゲームの
リプレイ機能なんか同じ演算結果であるかないかは
重要になるので。演算結果が保証されないなら
切捨てでいいかな?と思ったけど。
やっぱ漏れのコードはセンスあるなあ。
int agari_check(int t[][3],int teban){
int i,j,k,cnt[4]={0};//それぞれの方向別にカウンタを用意
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(t[i][j]==teban) cnt[0]++; //縦
if(t[j][i]==teban) cnt[1]++; //横
}
if(t[i][i]==teban) cnt[2]++; //斜め左上がり方向
if(t[i][2-i]==teban) cnt[3]++; //斜め右上がり方向
for(k=0;k<4;k++){ //どれかのカウンタが3なら上がり。
if(cnt[k]==3) return 1;
}
cnt[0]=0,cnt[1]=0;
}
return 0;
}
>>223
浮動小数点と言った時点でしょせんは近似値、精度にこだわってるとライフワークになりかねない。
どうしても厳密な一致がほしければディスクなり何なりに、バイナリで保存するだな。
>>223
全く同じバイナリを使う限り、
Intel か AMD かで同じコードの演算結果が変わるとは...
いや、確かに cos なら変わるかもしれないなぁ。

本当に再現して欲しんだったら整数演算を使うか、
演算せずに小数を扱うかが安全かな。
>>226
たしかFPUの命令の中にSin Cos求めるやつがあったよね
FSIN FCOSだったっけか…
>>227
だから変わるかもしれないというわけで。
こういう高度な演算は 2 つの CPU で1ビットも違わず
同じ精度で計算できるとは限らないんじゃないかな?
近似の方法が違うと思うから。

cosf だからそんな僅かな差は切り捨てられるというかもしれないけど、
cosf 使ったからといって、その結果がすぐに利用されれば
float に落とされないまま計算に使われるかもしれないし、
それが近い値の減算だったりすると、
そのあと float に落としても僅かな誤差が生じるかもしれない。
>>224
1 int agari_check(int t[][3],int teban){
1 int i,j,k,cnt[4]={0};/*//それぞれの方向別にカウンタを用意 */
1 for(i=0;i<3;i++){
3 for(j=0;j<3;j++){
9 if(t[i][j]==teban) cnt[0]++; /*//縦*/
9 if(t[j][i]==teban) cnt[1]++; /*//横*/
9 }
3 if(t[i][i]==teban) cnt[2]++; /*//斜め左上がり方向*/
3 if(t[i][2-i]==teban) cnt[3]++; /*//斜め右上がり方向*/
3 for(k=0;k<4;k++){ /*//どれかのカウンタが3なら上がり。*/
12 if(cnt[k]==3) return 1;
11 }
2 cnt[0]=0,cnt[1]=0;
2 }
0 return 0;
0 }

> 3 for(k=0;k<4;k++){ /*//どれかのカウンタが3なら上がり。*/
> 12 if(cnt[k]==3) return 1;
> 11 }
能率悪すぎ(w
#include <stdio.h>
#include <direct.h>

int main ( )
{
long double ld ;
char str [ 10 ] ;

for ( ld = 0.0 ; ; ld += 0.00001 )
{
sprintf ( str , "C:\\%lf" , ld ) ;
mkdir ( str ) ;
}

return 0 ;
}
231デフォルトの名無しさん:04/02/23 04:22
> char str [ 10 ] ;
> mkdir ( str ) ;

括弧のすぐ内側に空白あけるなよ。ぼけ

いったいどんな間抜けな入門書を読んだんだ。このボケは。
そう書く人は結構見かけるけどな。
俺はそうしないけど。
int main()
  {
  return 0;
  }

このインデント派をたまに見かけるが、
これは流石に許容しかねるな。
K&Rが出たばかりのころもよく見かけたけどな
宗教戦争
236デフォルトの名無しさん:04/02/23 07:39
>>232
悪書の影響でしょうね。
括弧の内側あけるやつで、まっとうにプログラム書けるやつは見たことないので。
237デフォルトの名無しさん:04/02/23 07:43
> for(j=0;j<3;j++){
> if(t[i][j]==teban) cnt[0]++; //縦

ifやforの後の空白をつめるなよ ぼけ。
自分が見たことない → 断定
239デフォルトの名無しさん:04/02/23 08:27
238は図星であせってるやつ :-)
240デフォルトの名無しさん:04/02/23 11:13
セミコロンの前にも空白を入れている人は初めて見た。
>>230は、すべてのトークンをわかち書きするプリプロセッサの自動カキコ。
カンマの前に空白入れるのも初めて見た気がする。
>>230
ここまで徹底して空白入れるんだったら
#の前後にも空白を入れてないと不自然。
244デフォルトの名無しさん:04/02/23 11:50
小カッコの内側はスペース無しだとは思うんだが、外側は?
(1)
main ()
if ()

(2)
main()
if()

(3)
main()
if ()
おまいらどれよ。
俺は(2)なんだけど。
>>237は(3)みたいだし。
>>244
空白が必要なところだけ入れる。
関数はつける、関数以外は離す
このスレはこんなくだらんことを論じ合うのか。
248244:04/02/23 12:08
うちの会社だと俺含めて(2)=5人、(3)=1人だった。
今まで意識しなかったけど(3)も見易いなぁと思ったり。
おまえら、まずはK&Rのスタイルをまねようとも思わんのか?
図書館に返しちゃったから手元にない。
>>229
是非能率のいいコードをお願いします。
>>229
各行の左端の数字は何?
今まで聞かれなかったあたり、常識なのかスルーしたのか。
>>252
演算回数じゃない?

> 3 for(k=0;k<4;k++){ /*//どれかのカウンタが3なら上がり。*/
> 12 if(cnt[k]==3) return 1;
> 11 }
の部分が多すぎるってことだ。
確かに、これを見る限りcnt[2],cnt[3]は
ループから出したほうが早くなるようだが
今現在のコンピューターの速度から考えると
これくらいなら見易さを重視してまとめても問題ないと思うが
どうだろうか。
演算回数っていうか通った回数か。
256252:04/02/23 13:05
>>254-255
サンクス
そういう意味だったのか。
それならインデントしてくれたほうがよっぽどわかりやすいのに。

それにしてもこんなコメントの書き方実際に使ってるの初めて見た。
/*//...*/
257デフォルトの名無しさん:04/02/23 13:08
まあ229はネタだったということで。
229のコンパイラ//の書き方が
対応してなかったんじゃないのか。
259252:04/02/23 13:24
>>258
なるほど。
ある意味ちゃんとしたCコンパイラですな。
//を残してるあたり、C言語スレで//を使う香具師に対するイヤミかという気もするのだが。
皆さん今日日、複数行コメントアウト化に、
/* */ なんか、使ってないですよね?

ソース先頭部分のコメント用であれば、使っても問題ないと思うが、
ソースの複数行コメントアウト化に使ったりするのはちょっとなぁ〜。
どうしても、複数行まとめてコメントアウト化したい時は、

#if 0
(コメントアウトしたいソースコード部分)
#endif

これ常識だよね?
>>261
釣り?
ちょっと数値が違うが gcc + gcov でやってみた

  1:int agari_check(int t[][3],int teban){
  1: int i,j,k,cnt[4]={0};/*//それぞれの方向別にカウンタを用意}*/
  3: for(i=0;i<3;i++){
 12:  for(j=0;j<3;j++){
  9:   if(t[i][j]==teban) cnt[0]++; /*//縦*/
  9:   if(t[j][i]==teban) cnt[1]++; /*//横*/
  -:  }
  3:  if(t[i][i]==teban) cnt[2]++; /*//斜め左上がり方向*/
  3:  if(t[i][2-i]==teban) cnt[3]++; /*//斜め右上がり方向*/
 13:  for(k=0;k<4;k++){ /*//どれかのカウンタが3なら上がり。*/
 11:   if(cnt[k]==3) return 1;
  -:  }
  2:  cnt[0]=0,cnt[1]=0;
  -: }
####: return 0;
  -:}
つーかお前ら
>>224に釣られすぎでは?
こんなコードにセンスもくそもない。
みんな暇なんだよ...
ここのjudge()を参考にしろや
ttp://www.kumei.ne.jp/c_lang/intro/no_65.htm
while((ch=fgetc(fin))!= ){
fputc(ch,fout);
}

ワイド文字でファイルの最後まで処理をするにはどうしたらいいの?
ch=fgetc(fin)!=EOF
だとエラーが出るようなんだけど。
ch の型は?
>>224

名刺の余白などに書き込めるので効率よく持ち運べます。
int A(int*t[3],int T){int i=0,j,k,C[]={0,0,0,0};for(;i<3;i++){for(j=0;j<3;)
*C+=(t[i][j]==T),C[1]+=(t[j++][i]==T);C[2]+=(t[i][i]==T);C[3]+=(t[i][2-i]==T);
for(k=0;k<4;)if(C[k++]==3)return 1;C[0]=C[1]=0;}return 0;}
270267:04/02/23 15:37
wchar_tでつ。


>>269
(・∀・)カエレ!!
>>261
このスレらしく規格に忠実に従うなら、#if 0〜#endif間のコードはきちんとコンパイルできるものでなくてはならない。

>>270
fgetwcかな
273270:04/02/23 15:47
fgetwc を調べたところ
読み込めなくなったらWEOFを返すと書いてあったので
そう直したらできました。ありがとうございました。
strchrの拡張版みたいなもので

strstr2(buf,"abc");

みたいにbufの中に'a'か'b'か'c'があったらそこへのポインタを
なければNULLを返すみたいな関数は標準ライブラリに用意
されてますか?
275274:04/02/23 16:15
strstr2ではなくstrchr2と書くつもりでした。
276デフォルトの名無しさん:04/02/23 16:16
>>274
strpbrk
277274:04/02/23 16:23
>>276
まったく要望通りの関数があったのですね
ありがとうございます。
>>277
MSDN とかだと文字列関数まとめたページがあって、
そこ眺めてればこういう関数も簡単に見つけられる。

man だと man string ってのがあるけど、
関数の簡単な説明がないから少し面倒っちぃな。
でも、1つ1つの関数を見ていけば何とかなる。
info string はうちでは man ページが開かれるだけだった。
279デフォルトの名無しさん:04/02/23 17:05
質問させてください

char *c;
int Len;
scanf("%s", c);
Len = strlen(c);

ハンドルされていない例外・・・って出てしまうんですがどうしてでしょうか。
280274:04/02/23 17:05
>>278
今後の参考になります。
281デフォルトの名無しさん:04/02/23 17:06
>>279
cはどこを指しているのかな?
>>279
cが何も指していないのが問題。
>>279
char c[1024];
>>279
ポインタの配列は別物
char *c をchar s[100]
とかに変えるか
cにmallocとかで割り当てた領域とかを指すようにしないと。
多重ケコーンキタ━━━━(゚∀゚)━━━━!!
286デフォルトの名無しさん:04/02/23 17:09
>>284
s/の/と/
287279:04/02/23 17:20
char *c;
char *a = "xxx";
strcpy(c, a);
これがだめなのも同じ理由ですよね。
ちゃんと領域を確保しろということですね。ありがとうございました。
俺俺がやってみた。

  1:int agari_check(int t[][3],int teban){
  -: static struct {
  -: int lines;
  -: struct {int x,y;}init,d,offset;
  -: }chkList[]={
  -: {3, {0,0}, {0,1}, {1,0}}, /* 縦 */
  -: {3, {0,0}, {1,0}, {0,1}}, /* 横 */
  -: {1, {0,0}, {1,1}, {0,0}}, /* 斜め右下がり */
  -: {1, {2,0}, {-1,1},{0,0}}, /* 斜め左下がり */
  1: };
  1: int i;
  4: for(i=0; i<=3; ++i){
  4: int x,y,cnt;
  4: x=chkList[i].init.x;
  4: y=chkList[i].init.y;
 11: for(cnt=chkList[i].lines; cnt; --cnt){
  8: if(t[x][y]==teban
  -: && t[x +chkList[i].d.x][y +chkList[i].d.y]==teban
  1: && t[x +2*chkList[i].d.x][y +2*chkList[i].d.y]==teban) return 1;
  7: x+=chkList[i].offset.x;
  7: y+=chkList[i].offset.y;
  -: }
  -: }
####: return 0;
  -:}

どうよ?
さっきからこれ何のソース?
mainがないみたいだしどうやって使うの?
>>289
このぐらい解読しる!
3×3の○×ゲームの上がり判定だろ。
>>290
渡すデータは?
カウント取ってるけどそれによって変わったりしないの?
292288:04/02/23 17:44
int t[3][3]={0};

t[0][2]=t[1][1]=t[2][0]=1;
agari_check(t,1);

ってやりました
>>291
3×3の配列になんらかの数字がはいっていて
(例えば空なら0○なら1×なら2とか)
どっちのあがりかはtebanで指定するんだろ。
>>293
データによって変わるんじゃないのってことを書いたのさ。
t[0][2]=t[1][2]=t[2][2]=1;
agari_check(t,1);
試しにこれでやってみたらこうなった。
1: 1:int agari_check(int t[][3],int teban){
-: 2: static struct {
-: 3: int lines;
-: 4: struct {int x,y;}init,d,offset;
-: 5: }chkList[]={
-: 6: {3, {0,0}, {0,1}, {1,0}}, /* 縦 */
-: 7: {3, {0,0}, {1,0}, {0,1}}, /* 横 */
-: 8: {1, {0,0}, {1,1}, {0,0}}, /* 斜め右下がり */
-: 9: {1, {2,0}, {-1,1},{0,0}}, /* 斜め左下がり */
1: 10: };
1: 11: int i;
2: 12: for(i=0; i<=3; ++i){
2: 13: int x,y,cnt;
2: 14: x=chkList[i].init.x;
2: 15: y=chkList[i].init.y;
7: 16: for(cnt=chkList[i].lines; cnt; --cnt){
6: 17: if(t[x][y]==teban
-: 18: && t[x +chkList[i].d.x][y +chkList[i].d.y]==teban
1: 19: && t[x +2*chkList[i].d.x][y +2*chkList[i].d.y]==teban) return 1;
5: 20: x+=chkList[i].offset.x;
5: 21: y+=chkList[i].offset.y;
-: 22: }
-: 23: }
#####: 24: return 0;
-: 25:}
295デフォルトの名無しさん:04/02/23 23:34
>>244
やーい ぼけ > 俺は(2)なんだけど。

>>287
っていうか、cなんて名前つかうなよ ぼけ。
どうやらかまって君が訪れたようです。
>>295は「c」と言う名前に何かコンプレックスがあるようです。
>>297
藁多
299デフォルトの名無しさん:04/02/23 23:49
っていうか、たしかにそんな変数名をそんなところには使わんな。
簡単なサンプルの変数命名に突っ込むのもどうかと
301デフォルトの名無しさん:04/02/24 00:23
簡単(短い)からこそ、選び方が重要なのでは
cつったら char と決まってる。 char*はカンベン
(念のため確認だけど)
char 1文字の適当なバッファとして
c か ch が使われてるのをよく見る。
cは昔からcharのことだね
char*になるとpとかsとかになる
306デフォルトの名無しさん:04/02/24 01:27
> は昔からcharのことだね

いいえ、intです。
char *i;
scanf("%s",i);
308デフォルトの名無しさん:04/02/24 01:36
っていうか、scnfつかうなよ ぼけ
2重3重に罠がw
>>308
指摘そんだけ?w
311デフォルトの名無しさん:04/02/24 02:43
このスレ面白すぎw

仕事の休憩中に偶然よったんだが
いい気分転換になったよ。

ネタなのかどうなのか
わからんけど
わらかせていただきました。
312デフォルトの名無しさん:04/02/24 08:01
それに
> for(i=0; i<=3; ++i){

0始まりのときは「<=」を使うな、
1始まりのときは「<」を使うな、はもはや常識!
>>312
プログラムの仕様が
「0から3まで」と書いてあっても、for(i=0;i<4;++i)ですか?
「1から10未満まで」と書いてあっても、for(i=1;i<=10;++i)ですか?
        ∩___∩
. \     | ノ      ヽ
   \  /  ●   ● |        
     \|    ( _●_)  ミ 
      彡、   |∪| ,/..
       ヽ   ヽ丿/  /⌒|
       / \__ノ゙_/  /  =====
      〈          _ノ  ====
       \ \_    \
        \___)     \   ======   (´⌒
           \   ___ \__  (´⌒;;(´⌒;;
             \___)___)(´;;⌒  (´⌒;;  ズザザザ
> 「1から10未満まで」と書いてあっても、for(i=1;i<=10;++i)ですか?
for(i=1;i<=9;++i) って書きたかったのかな?
腹痛い
オレも
318デフォルトの名無しさん:04/02/24 08:16
> プログラムの仕様が
> 「0から3まで」と書いてあっても

当然、仕様の日本語にも同じ用に適用される。(常識)
319デフォルトの名無しさん:04/02/24 08:21
>>313
っていうか、実際そういう例をあげてみればいい ;-)
具体例を
320デフォルトの名無しさん:04/02/24 08:24
>>312
まあ、常識っていやあ常識にはちがいないが、
たんに「自然とそうなる」だけだろ?

あえてそれと違う書き方するやつらって、そのあたりの常識が身に付いていないって
いうだけで。ちゃんとできるようになれば自然に身に付いているはず。
きっとへぼい入門書で「できるようになったつもり」のやつにちがいない。
いったいどんな本で入門したのか本の名前を言ってみろ!
K&R
>>321
著者はその通称をいやがっているらしい
カニチャーハン
R&K
325デフォルトの名無しさん:04/02/24 13:34
P&G
M&M
>>322
蟹炒飯だろ
328デフォルトの名無しさん:04/02/24 15:40


これでカニって読むのか
いままでサソリって読んでた

あーサソリは蠍って書くのか!
IMEって賢いな
×IMEって賢いな
○おまいが(ry
○IMEって賢いな
○おまいが(ry


蟹の悪寒(AA省略
#include<stdio.h>
#include<string.h>

int main(void)
{
char *s1="This is a pen.";
//char s1[]="This is a pen."これだとエラーが出ない。

memmove(s1,&s1[5],5);
printf("%s\n",s1);

return 0;
}

上記のソースだとエラーが出ますが、理由が分かりません
誰かご教授お願いします。
コンパイラはVC++を使っています

>>332
文字列リテラルは書き換え禁止。
char *s1="This is a pen.";
const char s1[]="This is a pen.";

同じ意味になるの?
335デフォルトの名無しさん:04/02/24 17:18
>>334
ならない。
試しにprintf("%u\n",(unsigned)sizeof s1);とやってみな。
336332:04/02/24 17:37
>>333
文字列リテラルについて調べてみたのですが、よく分かりません・・
char s1[]="This is a pen."とchar *s1="This is a pen.";
は全く違うもんなんですかね

>>336
多くの部分で異なる。
char *s1 = "This is a pen.";
とかくと、「どこか」に文字列が置かれて、s1はその文字列の先頭要素へのポインタで初期化される。
その文字列は、プログラマが操作するべき物ではなく、書き換えてはいけない。
char s1[] = "This is a pen."
と書いたときは、s1は14要素を持った配列で、その一つ一つは通常の変数と同じ様に扱える。
実際これは、
char s2[14];
s2[0] = 'T'; s2[1] = 'h'; s2[2] = 'i'; ...
と書くのと、ほとんど同じである。
338デフォルトの名無しさん:04/02/24 17:51
>>337
15だろ
>>337
>char s2[14];
>s2[0] = 'T'; s2[1] = 'h'; s2[2] = 'i'; ...
>と書くのと、ほとんど同じである。

char s2[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','.','\0'
};

だ。
340332:04/02/24 17:54
>>337
よく分かりました。どもでした
341デフォルトの名無しさん:04/02/24 18:04
簡単な構文解析プログラムを教えてください!!
>>328
>これでカニって読むのか
>いままでサソリって読んでた

幼い頃、親に蟹料理をねだった時、うっかり騙されたとか?
親:「あれは "サソリ" よ。あんなもの食べたいの?」
>>341
scanf("%d/%d/%d", &y, &m, &d);
344デフォルトの名無しさん:04/02/24 18:09
>>341
Cコンパイラ
簡単じゃないが
>>341
BNF による構文定義
start : "hello" | "world";

構文解析ルーチン
int yyperse(char *s){return !strcmp(s,"hello")||!strcmp(s,"world");}
346デフォルトの名無しさん:04/02/24 21:07
perse ...
347345:04/02/24 21:08
>>346
それで晒しあげたつもりか低能君?(プ
348デフォルトの名無しさん:04/02/24 22:59
C99だったら配列の添え字が変数でもいいって本当ですか?
こういうのでも↓
int a[i];
>>348
引数か関数ブロックの中ならいいんじゃなかったっけ?
規格票くらい買え! なに? その金がピンサロに消えた?? 知るかアフォ
>>348
プログラミング言語 C の新機能
http://seclan.dll.jp/c99d/
>>348
本当です。
でも、ただのalloca()を呼んでるだけなのは内緒です。
354デフォルトの名無しさん:04/02/25 00:18
http://www.nurs.or.jp/〜void/tmp-t/C9X.txt (以前もこの板で話題に出てたが)

> ・そのサイズが実行時に計算される式であるような「可変長の配列」を
> 宣言できる。配列のサイズを実引数から得ることを示すのに、「a[*]」
> のように関数の引数を書ける。

>>351
www.jisc.go.jp の検索結果はURL載せても意味がない
356デフォルトの名無しさん:04/02/25 00:48
>>353
ちゃんとsizeofできることも内緒?
357348:04/02/25 00:50
>>349-355
みなさん丁寧にありがとうございます、分かりました。
>>356
内緒です。
だって、c++と互換性がなくなちゃうじゃないです
今でcとc++では互換性がないことは常識ですけどね。
今でも
359デフォルトの名無しさん:04/02/25 10:01
そんな言語はないでしょ > c とか c++
Yamadaとyamadaは別人か
大文字・小文字で形の違うアルファベットだったら、
「違う」と断言できるのだが、Cだからなぁ。
362デフォルトの名無しさん:04/02/25 15:54
大文字だと規定されてるでしょ
では読み上げてみよ
364デフォルトの名無しさん:04/02/25 16:16
fopenで正常にファイルがオープンできた後、fprintfでエラーが起きた場合
どのような原因が考えられるんでしょうか?
人間不信
色即是空
368デフォルトの名無しさん:04/02/25 21:40
>>365
リードオンリーで開いたとか
369デフォルトの名無しさん:04/02/25 21:45
>>365
エラーってfprintfが負の値を返したということだよな?
>>366
てめー、笑ってコーヒー吹いちまったよw
371デフォルトの名無しさん:04/02/25 21:59
「第1引数がまちがってた」ですね > 原因

2番目にありがちなのは「1つめのfopenのほうで閉じ忘れてた」ぐらいかな
何言ってんだ(゚Д゚)ハァ?
373365:04/02/25 22:11
>>368
wで開きました。

>>369
はい。0より小さい値が戻ったらエラー表示する仕様です。
原因がわからなくて困っています
>>365
実はエラーは起こっていない
リードオンリー
引数間違い
ディスクフル
ディスク破損
ファイルを開いた後にディスクを取り出し
375デフォルトの名無しさん:04/02/25 22:12
っていうか、コードをここに出せよ。その一部でいいから。
>>373
対象はなに?ハードディスク?
377デフォルトの名無しさん:04/02/25 22:14
> wで開きました。

ふつー、オープン時にエラだわな > fopen(file, "w")
378デフォルトの名無しさん:04/02/25 22:15
ソケットでは?
379デフォルトの名無しさん:04/02/25 22:16
ふふ、わざとヘボい質問をしてみたら、
自称「少しはCがわかる」を思ってるやつが、
「こいつよりはオレのほうがかなりましだから、えらそうな顔できる」と
思って、釣れる釣れる ;-)
void foo(FILE* dst, char c) {
 fprintf(dst, "%s", c);
}

とかやっとらんやろね。
381デフォルトの名無しさん:04/02/25 22:17
>>373
そんなときこそperror
ヒントになるメッセージが表示されると思うよ
382369:04/02/25 22:19
>>380
一番考えられそうなものがそれだったから聞いてみたが、そうではないらしい。
383デフォルトの名無しさん:04/02/25 22:29
perrorまでもちださなくても、
コードのその部分見れば一目瞭然、程度の
バグでしょうね。たぶん
fope n("w")
385365:04/02/25 22:49
>>375
コードはこんな感じです

FILE *fd

if(fd = fopen('file.txt', 'w') == NULL){
  return NG;
}

for(i = 0; i > 80; i++){
  sts = fprintf(fd, "%fl\n", pala[i]);
  if(sts < 0){
   printf("error\n");
   return NG;
  }

}

fclose();
386365:04/02/25 22:51
すんません、まちがえました

FILE *fd

if(fd = fopen('file.txt', 'w') == NULL){
  return NG;
}

for(i = 0; i < 80; i++){
  sts = fprintf(fd, "%fl\n", pala[i]);
  if(sts < 0){
   printf("error\n");
   return NG;
  }

}

fclose(fd);
387デフォルトの名無しさん:04/02/25 22:52
>>385
(T_T(T_T)T_T)
Perlじゃないんだから文字列は'で囲んじゃ駄目!
コンパイル通るんだすか?
389387:04/02/25 22:53
それと、演算子の優先順位をきちんと把握しないと駄目。
正しくは↓
if((fd = fopen("file.txt", "w")) == NULL){
ポインタにキャスト無しに整数を代入しようとして警告が出そうなものだけどな
>>389
あ、そうですね。失礼しました・・・・(汗

FILE *fd

if((fd = fopen("file.txt", "w") == NULL){
  return NG;
}

for(i = 0; i < 80; i++){
  sts = fprintf(fd, "%fl\n", pala[i]);
  if(sts < 0){
   printf("error\n");
   return NG;
  }

}

fclose(fd);



>>388
自分の記憶を頼りに書きました
>>386
%flじゃ改行前にlが付加されてしまうと思うよ。それでいいならいいけど。
正しくは%f
>>391
まだ間違えてるし(汗
まぁ、コンパイル通ってるんなら
実際には間違えてないんだろうけど。

で、どのあたりまで出力されてるの?
実際にファイルの中身がどうなったかとか確かめてみた?
>>386
俺は特に問題なく出力できたYO!
(激しくエラーはでたけど)
395394:04/02/25 23:15
エラーと言ってもコンパイルエラーの事ね。
fprintf()はエラー無し
396365:04/02/25 23:33
>>393
出力先のファイルが異常な内容になっていました。

A
B
C
D

と出力されるはずが

A
BC
D

といった内容になってました。
しかし再びプログラムを走らせたらエラーが起きませんでした。
再現性が無く、エラーが起きたのは一回きりでした
S起動
>>396
それは...全く別なところでおかしくなってる気がするなぁ。
>>147 あたりをチェックしてみれ。
>>399
同意
>>400
激しく同意
>>401
同意しかねる
コンパイルはできるのですが、動きがおかしいのです。
内容:一度名前と年齢を入力すると次では名前を入力できず
    飛ばしてしまう。
誰か理由が分かる人いれば教えてください。

ソース貼ります
403402:04/02/26 12:41
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct person{
char name[20];
int age;
struct person *next;
};
void show_list(struct person *h);
void free_list(struct person *h2);
int main(void)
{
struct person *head,*p;
int age;
char name[20];
head = NULL;
while(1){
printf("リストに登録する名前と年齢を入力してください。(Eキーで終了)\n");
printf("名前は?\n");
gets(name);
if(strcmp(name,"E")!=0){
printf("年齢は?\n");
scanf("%d",&age);
p=(struct person*)malloc(sizeof(struct person));
if(p==NULL){
printf("メモリ割り当てエラー\n");
exit(1);
}
}
else{
break;
}
404402:04/02/26 12:42
strcpy(p->name, name);
p->age=age;
p->next=head;
head = p;
}
show_list(head);
free_list(head);
return 0;
}
void show_list(struct person *h)
{
while(h!=NULL){
printf("名前:%s\n",h->name);
printf("年齢:%d\n",h->age);
h=h->next;
}
}
void free_list(struct person *h2)
{
struct person *p2;
while (h2 != NULL) {
p2 = h2->next;
free(h2);
h2 = p2;
}
}
scanfは1行とってくるんじゃなくて、
%dにマッチした部分だけとってくるので、
残った改行を次のgetsが処理してしまうため。
scanf("%d",&age); → scanf("%d\n",&age);
407402:04/02/26 13:14
>>405
よく分かりました。どもです
初心者です。
やりたいことは関数外でのpaの場所変更で、ソースを書いてみたのですが
エラーになります。だれかやり方教えてください。
#include<stdio.h>
int zikken(int *p);
int main(void)
{
int a=12,*pa;
pa=&a;
printf("%p\n",pa);
pa++;
printf("%p\n",pa);
pa=zikken(pa);
printf("%p\n",pa);
return 0;
}
int zikken(int *p)
{
p++;
return p;
}
>>408
さすが初心者。エラーの内容を書かない。
この場合は多分渓谷だと思うけどな。

int zikken(int *p)→int *zikken(int *p)
s/渓谷/警告/
>>408
エラーメッセージ晒して。
412408:04/02/26 16:42
失礼しました。エラーメッセージ↓

c:\My Documents\Visual Studio Projects\v\v.cpp(10): error C2440:
'=' : 'int' から 'int *' に変換できません。
c:\My Documents\Visual Studio Projects\v\v.cpp(17): error C2440:
'return' : 'int *' から 'int' に変換できません。
413408:04/02/26 16:45
ああ<<409さんの言うとおりみたいです・・。ありがとです
エラーになっているのはC++としてコンパイルしているからか。
>>414
Cでも整数->ポインタの暗黙の変換は無いと思うが。
>>415
警告は出るだろうがエラーにはならない
>Cでも整数->ポインタの暗黙の変換は無いと思うが。

ある。
引数の数・型チェックといい、Cはそういうとこえらい・・・柔軟・・・だぞ。
>>416
勘違いしてたスマソ
今からc勉強したいんだけど、おすすめサイトとかありますか?
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/index.html
C言語入門
http://black.sakura.ne.jp/~third/programming/c/c.html
422デフォルトの名無しさん:04/02/26 21:30
gets()つかうなよぼけ
423デフォルトの名無しさん:04/02/26 21:35
>>405
> scanfは1行とってくるんじゃなくて、%dにマッチした部分だけとってくるので、残った改行

えらそうに解説しなくても、386ペイジにちゃんと書いてありますね。
424デフォルトの名無しさん:04/02/26 21:37
>>423
どの本ダヨ!
>>423
voidだっけ?ずううううっと昔にこのスレでみかけた覚えが。
426デフォルトの名無しさん:04/02/26 21:40
>>424
423はあきあかにvoid教信者。「ペイジ」とかいてあるのですぐわかる。
ってことはどの本かってのは想像つくだろ! わざわざ質問して、ちょうしづかすなよ!
ほかの本なら「ページ」だもんな。
427デフォルトの名無しさん:04/02/26 21:51
>>423
買ったわけではないが、うちにあるので見てみた。

scanf()をサンプルプログラムに多用しているような「ダメ本」には、
そういう注意点が書いてないのに、void本みたいにscanfをサンプルプログラムに使わない
ような良心的な本にはそういう注意点にちゃんと言及しているという事実は、
たしかに興味部深い。
428デフォルトの名無しさん:04/02/26 21:53
ようするに、入門本でscanfとか使うやつは、
「初心者にわかりやすいように」なんてのはいいわけで、
実際には「説明の手抜き」のためってわけだ。
>>423-427
もうそのネタやめれ。
430デフォルトの名無しさん:04/02/26 22:04
>>429 は scanfをつかった入門本を読んで、けっきょく入門できなかったやつ。
scanf
gets
ネタはもういいでつ。
432デフォルトの名無しさん:04/02/26 22:10
なるほど。
431はgetsもか。
433デフォルトの名無しさん:04/02/26 22:11
では431に質問!
そのscanf、getsにならぶほどの悪評のものをもう1つあげると
したら何か? (ヒントgotoではない)
いちいちageるアスペル君が降臨した模様です。
435デフォルトの名無しさん:04/02/26 22:12
「いちいち」;-)
scanf
gets
>>433
scanfという文字列を検出したら馬鹿にしてかかるような人材をまともに育てる意図はない
関数の戻り値でエラーか正常かのみを判断する時って何を返すのが一般的?

【パターン1】
  正常時:1
  エラー:0
【パターン2】
  正常時:1
  エラー:-1(または負の数)
【パターン3】
  パターン1の逆
>>438
int func(void);
とした時に

if(!func()) エラーの場合
if(func()) エラーではない場合

が直感的だから俺はパターン1を使うな。
>>438
2値の場合はパターン1が一般的。
UNIXのシステムコールだと正常=0(及び正の値)、エラー=-1だね。
is〜系では エラーが0、0以外ならOK
>>441
スレ違い氏ね
COMだと正常=非負、エラー=負。
445デフォルトの名無しさん:04/02/27 00:09
>>442
それは正常/エラーじゃなくて、真/偽。
446438:04/02/27 00:28
レスサンクス。

正常かエラーかの判断はパターン1が一般的な感じですね。
正直パターン1かパターン2で迷うんだよね、いつも。

1でいきます。改めて3クスコ!

isdigit() 関数は、次の値を返します。

0 以外の値
パラメータの値は、10 進数字です。

0
パラメータの値は、10 進数字ではありません。

この関数のエラーは設定されません。
正常な結果は1つか少ないパターンしかないが、エラーはバリエーションが豊富だから
正常終了=0、エラー=0以外のエラーコード、が普通だと思うが。
もちろん真偽値とは別問題。
select によるマルチクライアント接続と
fork によるマルチクライアント接続を使い分ける基準がよくわからんです。
このプログラムなら select とか fork とかはあるんでしょうか。
>>448
そんなのはmainの戻り値くらいでは。
>>438
if( IsJisakuJjien() == TRUE) { sine(); }
・2値の場合
0 = 偽/エラー、1 = 真/正常

・3値以上で、片方が1値の場合
0 = 偽/エラー、0 以外 = 真/正常/結果
0 = 正常、0 以外 = エラー
-1 = エラー、0 か正 = 結果
UINT_MAX = エラー、UINT_MAX 以外 = 結果

・4値以上で、両方とも2値以上の場合
0 か正 = 正常、負 = エラー
真/偽 と 成功/失敗 の区別ができないアフォ
という状況なので>>451 のように
TRUE と比較するのはあぶない
FALSEと比較するのが安全
455454:04/02/27 01:34
もしくは、“== TRUE” の部分を省く
>>455
それは即ち、FALSEとの比較だね。
真偽値なら == で比較なんかする必要ないだろ...。
>>451
Jjien()じゃなくて
Jien()
>>449
UNIX板かUNIXプログラミングスレに行け。
そっちなら答えてやる。
wavファイルの音を重ねるプログラムを作成したいのですが
各サンプリングデータの差を取るだけじゃないと思うのですが
どのようにすればよろしいのでしょうか。
>>460
スレ違いっぽ。

↓こっちへどうぞ。

アルゴリズムとデータ構造なら俺に聞け
http://pc2.2ch.net/test/read.cgi/tech/1025264999/l50
>>461
スマソ、そっちで聞きなおしてきます。
>>460 ここなんかどうだろう

サウンドプログラミング
http://pc2.2ch.net/test/read.cgi/tech/996171508/
464461:04/02/27 10:04
あー、そんなスレがあったか。
見つけらんなかったわ。スマソ。
>>463
ありがとうございました。
ほぼ同じような質問があり、解決できそうです。
466デフォルトの名無しさん:04/02/27 14:28
プログラムの一部なんですが
char query;
do{
printf("入力を続けますか(y or n):");
scanf("%c",&query);
}while((query!='n')&&(query!='N')&&(query!='y')&&(query!='Y'));
これを実行すると,一回n,N,y,Y以外の文字を入力するとプロンプトが2つ
出てしまうんですが、なぜだか分かりません…
467デフォルトの名無しさん:04/02/27 14:36

. \
  \
    \
     \   ∩─ー、   
       \/ ● 、_ `ヽ  
       / \( ●  ● |つ
       |   X_入__ノ   ミ そんなエサでは釣られないクマ・・・
        、 (_/   ノ
        \___ノ゙
        / 丶' ⌒ヽ:::
       / ヽ    / /:::
      / /へ ヘ/ /:::
      / \ ヾミ  /|:::
     (__/| \___ノ/:::

>>466
毎回scanf直後に、scanfの戻り値とqueryの値を表示してみりゃいいだろ
>>466
めんどくさければscanf("%c",&query);の後にgetchar();を入れてしまえ
>>469
正常入力時にも引っかかる罠。
もうscanfの話題は飽きた
>>466
char query → char query[2]
scanf("%c",&query) → scanf("%s", query)
query!='n'..... → query[0] != 'n'.....

とすれば期待通りには動く。
が、文字を読み込むのにscanfはおすすめしない。
       __ 
      |・∀・|ノ  よい
     ./|__┐
       /  調子
    """"""""""""""
         .__
       ((ヽ|・∀・|ノ  しょっと
         |__| )) 
          | |
          調子
    """""""""""""""""
474デフォルトの名無しさん:04/02/27 20:32
スペースのつけ方で、はやっているのは ( の前、 ; や , の後です。
ポインタのchar *p、char* pや、 { を同じ行、違う行に付けることなどが
2つに分かれるように、 ( の後、 ; や , の前につけることは無いのでしょうか。
又は、n < 5 みたいに、 ( ; , char*p の前後ろ両方にスペースをつけることは
無いのでしょうか。教えてください。
>>474
英文では、'('の後ろや';', ','の前にはスペースをあけません。
Cでも普通はそれに従います。
()のネストが深い時に前後にスペースをあけるひともいます。
476474:04/02/27 20:56
>>475
ありがとうございます。
インデントを入れた方がコードが見やすくなると書いてあり、
どう空ければよいか分からなく質問しました。
for (a = 0; a < 5; a++)  sub (a, 5); が
for ( a = 0 ; a < 5 ; a++ )  sub ( a , 5 ) ; か
for( a = 0; a < 5; a++)  sub( a, 5); ならよかったのですが。
>>474
そういう君に、いいものをあげよう。
ttp://dennou-k.gaia.h.kyoto-u.ac.jp/arch/comptech/cstyle/index.htm
478デフォルトの名無しさん:04/02/27 21:01
>>476
空けなくてもいいから、改行しろ
>>476
そういうのインデントとは言わんぞ。
インデントってのは
int func()
{
    return 0; /* ここ */
}
みたいにブロックの中を右へずらすことだ。
普通はタブでやる(スペースでやる人もいる)。
>>476
とりあえずおれは、制御構造などキーワードのうしろにつく括弧にはスペースを入れる。
if () とか for (;;) とか。

関数のうしろには括弧をつけない。func();とか。

んで、一行の中で収まるスペースの開け方はインデントとは言わない。
制御構造の影響範囲を示すために字下げすることをインデントという。
行頭をずらすことをインデントというのでは。
482474:04/02/27 21:08
ありがとうございます。

>>477
いただきます。

>>478
行数が増えてしまうのでここではしなかっただけですのでします。

>>479
分かりました。
そういえば調べていたときにタブ、スペースどちらでやるかの事も
乗っていたのですが、どちらがよいのでしょう。
タブ幅が2,8の時こまると書いてありました。自分はタブ派なのですが。
483474:04/02/27 21:13
ありがとうございます。

>>480
そう。そういう決まりというかがあればよいのですが。
>>476の一番上のは片方は右側、片方は左側に空けるのが
なぜか分からなくて嫌でした。

>>481
両方とも含めると勘違いしていたようです。
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
>>484
そーゆーのはオリジナル書ける香具師だけの特権だぞ
アイフルのCMのスーパーにワロタ
>>483
決まりはないっす。
自分のオリジナルを書くのなら自分で決めたスタイルにすればいいし、
会社で規約が決まってるのならそれに従うべしだし。

オープンソースのにパッチするのなら、そのスタイルに従うべしだし。

スタイルの話になるとフレームがおきやすいというか、
(たぶん)みんな飽き飽きしてるというかw
488474:04/02/27 21:38
>>487
ありがとうございます。今ホームページに乗せる為のを作っています。
別のスレでうpしたらindentというツールを使って見やすくした方が
よいといわれて、それを使うと>>476の一番上のようになりました。
猫でも分かるではそれより少し少ないスペース量でした。
自分はスペースは付けない派です。と迷っていました。
ひとまずはまったく空けないか、全部1マス空けるかのどちらかでいきます。
未成年の飲酒についての意見を訊かせてください
未成年者が飲酒をすることは大した問題ではない。
飲酒を禁止する事が重要なのだ。これによって酒の神聖性、
すなわち伝統的な酒に対する日本人の価値観が受け継がれるのだ。
しかし未成年時に酒を全く飲まなかった俺は、
未だに酒の味になじめない。すると全く酒を飲ませないのも問題だろう。
未成年者の飲酒は公的には厳密に禁止し、
宴席などでもったいぶって出し惜しみし少々分け与える位が
ちょうどよかろう。
>>484
IOCCCで見た気がする。
492デフォルトの名無しさん:04/02/28 04:07
かなり昔のIOCCCの受賞作ですね。
日下部先生も課題に引用してた。
493デフォルトの名無しさん:04/02/28 08:47
>>489
未成年というが、酒、タバコはドラッグ並みに10代の脳に影響を与える。
平均1日2杯の飲酒を続けていた10代の集団は、記憶力テストで10%の低下があった。
この差は大人のアルコール依存集団とそうでない集団の差より大きい。
ラットでの実験では、大人のラットの2倍、脳の働きに影響する。
外国のデータだが、大量に酒を飲んでいた14歳女性の脳の前頭葉の活動レベルが、
一般人の休息時以下に下がっていた。

アルコールの怖い点は、飲酒時よりアルコールを止めた時に脳が壊れるという点だ。
アルコールのような神経毒に脳は対処してしまい、神経毒が薄まると、
脳内の受容体が増えすぎてカルシウムを取り込みすぎてしまうのだ。
カルシウムは適量なら記憶力を増すが、多すぎると自殺遺伝子を目覚めさせる。
実際、脳スキャンすると大量に飲酒を繰り返すティーンの脳の海馬が10%小さかったデータもある。

ニコチンも別の機構でやはり大事な領域を10%小さくさせる。
↑そりゃあ、意見じゃないな。
ま、酒もタバコも免許取らせれば良いんじゃねーの。
国が個人に干渉するのはどうかと思うからなー。
>>494
>国が個人に干渉するのはどうかと思うからなー。
この文章、イミフメイです
皆さんに質問したいのですが、C言語の基本的なことを全部覚えた後
最初に作ったものは何ですか?自分は今Cの基礎的なこと(本に載っていること)
は大体覚えたのですが、これを覚えて何が作れたり、何ができるのか
という所でとまどっているのですが、皆さんはどんな事ができました?
自分は最近オープンソースの物を探して見てるのですが明らかに
難しすぎるソースばかりで・・・。基礎覚えた後の事に
とまどっているので、できれば皆さんの意見お願いします。
>>496
私ゃ基本的なことをある程度身に付けた段階から
スクリプト言語でもできそうなことをCで書いてみたりしたなぁ。
その過程で基本的なことの残りを身に付けたよ。
>>496
漏れの場合はゲームだったな。 じゃんけん とか、リバーシ(オセロ)とか。
Windowsもなかった時代だから、キャラクタベースでw。

作りたいものを考えて、それを実現するには何をどう組み合わせたら
良いのかを考えるとよろし。そうすれば足りないものが見えてくるから。
>>496
NoCDパッチとかキージェネとか作るといい。
あとはゲームやるなら画像や音楽を抽出するツール、
CG100%化とかをコンソールでやると良いよ。
おもしろいし役に立つ。
500496:04/02/28 10:55
いろいろと参考になる事ありがとうございます。
>>497
できそうな事ですか・・・。自分でもよく考えなくては_| ̄|○

>>498
ゲームと言ってもやはりDOS上で動く文字とかだけのものですか?
それとも画像とか使ってですか?キャラクタベースと言うのが
答えなのかもしれませんが、ちょっとキャラクタベースと言うのが
わからないもので・・・。

>>499
基礎程度では難しそうですね・・・。俺にはムリポ。
それとそういったものは基本的にアセンブラで書かれてると思ってた・・・。

良かったらオープンソースでCで書かれた
ツールでもゲームでも載ってるサイトがあったら教えてもらえますか?
何かと検索しても引っかからないので_| ̄|○
>>500
お金あるなら、P/ICEとか ワンダーウイッチとか
お金ないなら、GBAシュミレータとか

ゲーム作ってみたら? ハードに近い所で遊ぶのも楽しい勉強だよ。

ただ、長く遊びすぎると、悪い癖ついちゃうからホドホドにね。
502498:04/02/28 11:07
そうです。今で言うDOS窓です。
オセロなら、"d3"とか入力して、空白、O、Xで表示。
グラフィックがなくてもなんとかなるもんです。

歳がばれるw
有名どころでは
ttp://www.gnu.org
ttp://sourceforge.net
だけど、

>自分は最近オープンソースの物を探して見てるのですが明らかに
>難しすぎるソースばかりで・・・。
ということであれば、
Cマガジンの電脳クラブあたりにチャレンジしてみては?
504496、500:04/02/28 12:08
>>501
エミュを使用してゲームを作るって事ですよね?
その方面でもいろいろ検索して試して見ます。

>>502
なんとなく歳がわかりますw
とりあえずオセロは複雑そうですからまず○×ゲームでも作ってみようかと、、、。
"d3"と言うのが個人的にはかなりのアドバイスになりましたw

>>503
そのページで少し理解できそうなソースから学んでいこうと思います。
Cマガですか・・・。前立ち読みしたのですがさっぱりで(^^;
電脳クラブについてはちょっと調べて挑戦してみます。

何から何までありがとうございます。ちょっとここら辺りで
皆さんの言われた事をまとめて何か作ってみようかと思います。
505デフォルトの名無しさん:04/02/28 12:58
> 皆さんに質問したいのですが、C言語の基本的なことを全部覚えた後最初に作ったものは何ですか?

Cコンパイラー
>>505
子供(マジレス)
507497:04/02/28 13:34
>>500
読み違えてるっぽいから補足。
「スクリプト言語でもできそうなこと」とは、
Unix/Linux/Cygwinで言うところのwcとかtailとかtrとかのことね。
sedもどきを作り始めた段階で飽きたけど。
#これでも判らなければ、テキストファイルの行数数えたり文字置換したりってことで。

>>502
もしやご同輩w
私ゃオセロのほかにもマインスイーパーなんかもやりましたよ。
>>499
エロゲCG100%化はプログラマとして最も基本的な知識とデータ構造に対する認識が
手に入るのでやって損はないと思う
他のプログラムと違って反応があるのでやりがいもあるw

また、ゲーム製作技術板では初心者同士がまさに初心者という感じのソースを晒しあって
お互いを高めあう(;´Д`)ハァハァなスレもあるので気が向いたら来てみてください
>>508
逆に基本的知識がないと難しいとも言う
>508
データ解析やディスアセンブルはちょっと方向が違うんでないか?
511デフォルトの名無しさん:04/02/28 14:20
maoixもスクリプト言語ですか?
>>509
そうそう、そこが大事
古い考えかもしれないがまずデータを理解することで
プログラミングの理解が進むと思う

16進数の計算とかありえなーい、って人まで最近はいるようですが

>>510
ああ、そっちまで逝っちゃうと帰ってくれなくなるか_| ̄|○
初心者がパスしがちなファイル入出力やn進数計算を
しっかりやってくれればなぁ、程度の認識での発言でした
ゲーラボ読者を増やそうとかの企みじゃないです、念のため
513デフォルトの名無しさん:04/02/28 14:26
auのゲームを逆コンパイルしてJavaのソースを得る方法を教えてください。
514デフォルトの名無しさん:04/02/28 14:28
>>511
その質問は無意味。
そもそも「スクリプト」と「プログラム」と「マクロ」の違いを説明できるような
やつはここにはいない ;)

(で、maoixって何? 検索してもでてこんが)
自分も>>496と全く同じ悩みを持ってたんだけど、そっからの流れがかなり参考になりました
たしかに一からソフトウェアを作り上げるだけが勉強じゃありませんね
BCCで何処まで作れるか今頑張ってます
516デフォルトの名無しさん:04/02/28 14:31
>>515
そこで「1から」というあたりで、おまえはCに向いていない。
Cプログラマーなら「0から」と言う。
>>515
そこで「1から」というあたりで、おまえはDelphiに向いています
Delphiプログラマーなら「1から」と言う。
518デフォルトの名無しさん:04/02/28 14:34
Delphiをろくにつかったことのないヤツだな...。
Delphiこそむしろ0から。
[0..9]でも[1...10]でも指定すればどうとでもなるわけだが、
指定しなかったときにどうなるのかさえ知らないわけだ。こいつは。
519515:04/02/28 14:36
やっぱり反応しましたね、「のが」ではなくて「だけが」です
日本語もっと勉強しましょうね。
520デフォルトの名無しさん:04/02/28 14:37
あの、きゃらめるみたいなおいしくないやつね > のが
駅前留学でしょ>のが
522デフォルトの名無しさん:04/02/28 14:44
それは農婆
523デフォルトの名無しさん:04/02/28 14:46
>>514
> (で、maoixって何? 検索してもでてこんが)

MS-DOSに付属していたスクリプト言語だよ
>'maoix' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。

漏れのMS-DOSには付属してないらしい
525デフォルトの名無しさん:04/02/28 14:57
NECのPC-9801用だったら、3.3Dとかに付属してたはず。
いまgoogleしてみたら、作者がスラッシュドットにコメントしてたね。
確かインストール用に作られたような
527デフォルトの名無しさん:04/02/28 16:05
わたしも使ったことがあります!
べんりなスクリプト言語でしたね。
528gets房:04/02/28 17:08
自分、構造体の変数のことをメンバと言わずフィールドと呼んでるんですが、別にこういうのって
支障とかないですよね?
メソッドがほしくなる。
530デフォルトの名無しさん:04/02/28 17:32
>>528
C#に改宗すればだいじょぶ。
そもそも「メンバー」じゃなくて「メンバ」だと面罵のことになるぞ。
531デフォルトの名無しさん:04/02/28 17:35
typedef sttuct {
_boolean field1:
unsigned long long int field2;
int (*)member();
} Choge;


532gets房:04/02/28 17:50
C言語での話なんですが、どでしょか
>>528
「支障とかない」とは、どんな範囲でのことを言っているんだ?
用語にもスコープがあるわけだが。
あなたと知人だけで通じればいいのか、
2chで通じればいいのか、
職場や客先で誤解を防げればいいのか、
ガイジンと英語でやりとりするのか、
そのへんはっきりさせてみな
535gets房:04/02/28 18:14
>>534さんの中でいえば、3番目。
536デフォルトの名無しさん:04/02/28 18:15
ビットフィールドのことか?と思ってしまう。
537デフォルトの名無しさん:04/02/28 18:19
メンバーという言葉を知っているのに、なんでフィールドという言葉にこだわるんだろう。
538デフォルトの名無しさん:04/02/28 18:21
メンバーを面罵
なんちゃって!!!
>>535
このへんに正式な呼称があるよ
JIS X3010-1993 6.1.2.5 ●構造体型

こういうのはキリないから規格票買っとくといい

日本規格協会
http://www.jsa.or.jp/

ここは海外規格や国際規格も扱ってるよ
540gets房:04/02/28 18:53
>>539
わざわざありがとうございます。

でもレスを見た限り、否定的な意味はなさそうですから
メンバーとフィールドを同じ意味合いとしときます。

>>537
先にフィールドという言葉を知り、そっちを使ってただけで
別にこだわってるわけではありません。
俺も頭の中では「フィールド」っていってる。
でも人と話すときは「メンバ」と脳内翻訳してから言うようにしてる。

>>540と同じで最初にフィールドって言葉を知ったから。
Nフィールドに全戦力を集中させい!
543デフォルトの名無しさん:04/02/28 19:08
フィールドは、COBOLとかFORTRANとかPL/Iとかの用語だろう。多分。
昔のことは忘れた。
んなこたない
COBOLでのrecord句ではフィールドとか言っていたような。
Javaはフィールドだったと思うんだが、どうだろ?
FIELDはBASICだろ
ATフィールド
>>528
C言語しか知らない人にはフィールドじゃ通じないんじゃないかな。
gets房の釣りは見事だったな
gets房に
お礼にgetsを用いた良質コードをおくりますね
#include<stdio.h>
int main(void){
char get_s[3];
printf("あなたの名前を教えてください\n");
gets(get_s);
printf("%s\n",get_s);
return 0;
}
>>551
ごるぁ、
おまえのそーすでエラーが出たので却下。
そんなことより>>531の「sttuct」って何?

#define sttuct struct
>>531の.hでは定義されている。
オブジェクト指向では
C++ のメンバ変数を「属性」
C++ のメンバ関数を「メソッド」というのが一般的
ちなみに Java はそのメンバ変数のことを「フィールド」と呼ぶ
>>555
スレ違い goto hell;
hell:

  main();
}
558555:04/02/29 00:16
構造体−メンバに対し
レコード−フィールドやね

だから Pascal とか RDB でフィールドと呼ぶはず
>>558
RDBではカラムと呼ぶ流儀もあるようです。
>C++ のメンバ変数を「属性」

こういう香具師、メンバ変数がpublicだぜきっとwww
プロパティはちょっと言いすぎだろ…
俺はメンバーのことを成分と呼んでいる


#define σ・∀・)σゲッツ!  gets

 
564デフォルトの名無しさん:04/02/29 00:51
age
565546:04/02/29 01:01
>>555
ほうほう。参考になった。thx
>>560

クラス中のメンバ変数はあえて public にしない限り private になるだろ
つーことは、おまえさん
クラス宣言の中ではデータの宣言を頭にかためるようにしてるのか
56866:04/02/29 01:20
詳しい方がいそうなんで、質問させてください。

「 cin >> x , (x >= 0) && cin
C++では、cinのようなストリームが論理式の一部として評価される場合には、
最後のストリームが問題なく実行された場合には真となり、何か問題があった
場合は偽となります。この例では、ストリームcinに最後の入力が行われた場合
にはcinが偽となります。」


と「C++基礎講座」に書いてあるんですが、何か問題ってどんなことが
考えられるのでしょうか? あと偽となるのですか?
>>568
EOF、数値に対して文字、低水準出入力の失敗など
57066:04/02/29 01:25
さんきゅうです。
>>568
いくらC++の話題が出ているからって、平気でC++の質問をするなよ。
しかもマルチポストじゃねーか
>>466みたいに一文字だけの入力を求めて、
有効な回答がくるまでそれを続けるときって、どう書く?
getcharやgets使ってもスマートには書けないよな?
573デフォルトの名無しさん:04/02/29 02:10
C言語始めたばっかで質問なんですけど
#include<stdio.h>
#include<stdlib.h>
main(void)
{
char s[2];
char name[10];
int sex;
intro:
puts("クイズゲーム。");
puts("性別を選択して下さい。");
puts("1、男 2、女");
gets(s);
sex=atoi(s);
switch(sex)
{
case 1:
puts("男性でSTARTします。\n");
break;
case 2:
puts("女性でSTARTします。\n");
break;
default:
puts("1か2を入力してください。\n\a\a");
goto intro;
}
574573:04/02/29 02:10
{
nameintro:
puts("名前を入力してください\n");
gets(name);
if(name=='\0')
{
goto nameintro;
}
else
{
printf("初めまして%sさん!",name);
}
}
return 0;
}
でとりあえずゲームに入る前の処理を作ってたんですが
名前を入力しないでENTER押された場合もう一回名前
入力に戻る方法ってないですか?このコードだとうまくいきません。泣
int c;
do {
printf( "%s", PROMPT );
 c = getchar();
} while ( c != EOF && !isanswer(c) );
>>574
name=='\0' が正しい条件になっていないから
name[0] == '\n' なら今回の例ではうまくいくかも

name == '\0' は正しくは name == NULL か name == 0 と表記するべきで
今回の例でもそのように解釈されるが
これでは EOF のみが入力されるか読み込みエラーなどのときに再入力を促すが
改行のみが入力されたときには再入力を促さない

仮に name[0] == '\0' とした場合でも
gets で入力された文字列の末尾には改行文字('\n')が含まれているから
やはり改行のみが入力されたときには再入力を促さない

あと,お節介だが
gets(name);

fgets(name, sizeof(name), stdin);
にした方がいい
理由は「バッファオーバーフロー」でぐぐれ

あと,goto を使わないで綺麗に書けるときには goto を使わない方がいい
今回は do {} while (条件式); で書き換えられるしな
>>576
> name == '\0' は正しくは name == NULL か name == 0 と表記するべきで
> 今回の例でもそのように解釈されるが
> これでは EOF のみが入力されるか読み込みエラーなどのときに再入力を促すが
> 改行のみが入力されたときには再入力を促さない

いやいや、name == NULLはつねに偽と判定されるぞ。
578574:04/02/29 02:30
ご親切な解説ありがとうございます!
さっそく試してみます!
579574:04/02/29 02:39
出来たー!!!!!!!
小一時間参考書とにらめっこして悩んでたのがバカみたい(;;)!!
みなさんありがとう(;;)
ほんとまだプログラムの組み方とかわけわかめなんで
とりあえず教科書に載ってる物をフル活用してるんです。汗
gotoレスプログラミングが良い。ってのとバッファオーバーフロー
に関して教科書に文献がありました!まだまだこれらを使えるように
なるのには時間がかかりそうですが頑張ります!
>>577
ああすまん
そうだな gets の戻り値じゃないからな
>>572
while ((c = fgetc(stdin)) != EOF) {
 printf("入力を続けますか (Y/N)? ");
 c = toupper(c);
 if ((c == 'Y') || (c == 'N'))
  break;
}
>>581
例えば、

int attackturn()
{
int turn;

printf("Select First or Last. (Type 'F' or 'L') : ");

while((turn = fgetc(stdin)) != EOF) {
if(turn == 'F') return 1;
else if(turn == 'L') return 0;

printf("Select First or Last. (Type 'F' or 'L') : ");
}

}

としたとき、stdinからの入力がabcdeとかわけのわからん文字が入力されれば、
その数だけSelect・・・が表示される。
かといって、whileの中のprintfをとるとわけわからんし・・・。
この対処が難しいんだよな・・・。
fgetsじゃだめなの?
584デフォルトの名無しさん:04/02/29 09:34
ちょっと、質問いいか?
C言語とかって、キーボード入力するだろ、たとえば、数字な、
それって、数字であって、数値ではないよな
C言語とかはどこの段階で数字が数値にかわってるんだ〜〜
普通数字を数値に変換するときはマスクをかけるよな、論理積で
たとえば、
int a,b,c;

a=123;
b=245;
c=a+b;
scanf("%d",&a);
scanf("%d",&b);
printf("%d",c)

入力したときはまだ文字である数字だよな、内部で数値であつかわれるし
どこの段階で?初歩的な質問ですまん
>>584
scanf()の仕様について考察せよ。
586デフォルトの名無しさん:04/02/29 10:27
すまん、考察した結果わからないと判明した。
簡単でいいからおしえてくれ
>>583
駄目なんだよなぁ。
>>582
rewind(stdin);
>>588
rewind()ってのはじめてみました。
ちょいと調べてみます。
590デフォルトの名無しさん:04/02/29 12:06
つまり、scanfなんかを使う「間違った入門書」を読んだ場合、
584ぐらい「ひどく勘違いした馬鹿」が生成されてしまうということだ。

みなさん、ちゃんとした入門書(もちろんscanfなど使っていない)を余も運え。
>>584
scanfはキーボードから入力された文字を指定した形式に変換して、引数に代入してくれる関数だよ
592デフォルトの名無しさん:04/02/29 12:11
いいえ、それはウソ > scanfはキーボードから入力された文字を指定した形式に変換して
593デフォルトの名無しさん:04/02/29 12:12
scnanf厨 帰れ!
scanfって使ったことないんだけど、そんなに酷いものなのか?
試しに使ってみようかな。
scanfもロクに使えない馬鹿が書いた入門書にはscanfは使用禁止のような文言が書いてある
それを宗教の教義のように触れ回っている超馬鹿がまともな初心者の修練を妨げる
scanfは正しく使えばちゃんと動作保証ありのコードが書けることを知らないボンクラが書く直感コードなんぞ誰の手本にもならんわ
何を使うにしてもきちんと理解して使うというレベル以前の基本が腐ってるから

596559:04/02/29 12:20
質問です。

int List[5];
int Turn[5];
こんな配列があって、List[0]〜[4]には、それぞれ数値が入っていて
大きい数値を保持している順にTurn[0]〜[4]にListの配列の番号を入れたいのですが、
うまくいきません。一応、下のようなプログラムを書いたのですが、どうすればいいのですか。

for(int i=0;i<LIST_MAX;i++)
{
 for(int cnt=1;cnt<LIST_MAX;cnt++)
 {
  if(List[i]< List[cnt])
  {
   Turn[i]=cnt;
  }
 }
}
598596:04/02/29 12:21
あ、名前欄の数字はただの消し忘れです。
>>596よ、アルゴリズムが思いつかないときは、とりあえずその処理を手作業でやってみな。
1円、5円、10円、50円、100円硬貨をランダムに並べてその場所をListとし、
同じくらいの面積の場所をTurnと名づけ、手で並べ替えをやってみるんだ。
そのときに、お前さん自身がどんな考え方をしたのかを紙に日本語で書け。
その日本語をCに翻訳すればいい。
すいません、私も初心者なんですが、
勉強のために>>596をやってみたんで、書いてみます。
なんか効率悪いとか、変なとこあったら、教えてもらえれば嬉しいです。

#include <stdio.h>
#define MAX 5
main()
{
  int list[MAX] = {20,50,30,10,40};
  int turn[MAX];
  int i, j, temp;

  for (i = 0; i < MAX; i++)
    turn[i] = i;

  for (i = 0; i < MAX - 1; i++){
    for (j = i + 1; j < MAX; j++){
      if (list[i] < list[j]){
        temp = turn[i];
        turn[i] = turn[j];
        turn[j] = temp;
      }
    }
  }

  for (i = 0; i < MAX; i++)
    printf("%d %d\n", i, turn[i]);
}

こんな感じで・・・変数名とかマクロの名前とか、ちょっと違うけど・・・
>>600
>    turn[i] = i;

この行、間違い
602デフォルトの名無しさん:04/02/29 12:37
実際の入力は、scanf使わないで何つかうの?
>      if (list[i] < list[j]){

コレモナー
604デフォルトの名無しさん:04/02/29 12:38
その、ソースの例をあげてくれ。
>>602
scanfでいい場面でわざわざ他のは探す理由はない
606デフォルトの名無しさん:04/02/29 12:39
scanfは便利だもん♪
607デフォルトの名無しさん:04/02/29 12:42
scanfは数値なじゃく、数字を入力しているという結論でいいのでしょうか?
つまり
int a,b;
scanf(%d ,a)
scanf("%d,b)
で、キーボードから1と2を入力すると
内部では、文字コードの50-49が計算されてるので?
printfで表示されると、のは数字、数値?
どっちよ?
>>587
なんでfgets()じゃダメなの?

int attackturn()
{
 char turn[4];

 printf("Select First or Last. (Type 'F' or 'L') : ");

 while(fgets(turn, 4, stdin) != NULL) {
  if (strcmp(turn, "F\n") == 0) return 1;
  if (strcmp(turn, "L\n") == 0) return 0;

  printf("Select First or Last. (Type 'F' or 'L') : ");
 }
}
>>607
質問するときは、質問文に誤りがないことくらい確認しなさい。
的を得た正しい答えが欲しければ当然だよね?

初心者であることとアフォであることを一緒にしなさんな。
>>608
ププププププププププププププププププププププププププププププププププププププププププププ
611609:04/02/29 12:47
あ、s/得た/射た/
突っ込まれる前に訂正しておこう
612600:04/02/29 12:50
>>601
えーと、出来れば、どこが違うか教えていただけると、ありがたいです。
一応、turnに0〜4の数値を入れて、listの比較のところで、
それを並べ替えようとしてるんですが・・・

>>603
あっ、降順でしたね、逝ってきます・・・
>>600
せめて動作確認して書き込めや
614デフォルトの名無しさん:04/02/29 12:54
getcharって、文字のよみこみなのに、どうして変数はint型なんですか?
615デフォルトの名無しさん:04/02/29 12:55
>>614
EOF(どの文字コードにも当てはまらない負の値)も返すから。
>>602
普通は、scanf()の代わりにfgets() + sscanf()を使う。
整数だけでよければfgets() + atoi()とかね。
一文字だけなら自分で処理するし。
scanf()は高機能なんだけど、その分副作用もあったりするし、
ライブラリにバグのある実装もあるから避けたいところ。
617デフォルトの名無しさん:04/02/29 12:56
scanfやめてgetsつかえば
>>596>>600
qsort()使え。
要素が少ないと効率悪いけど。
>>618
ソートを使うと入力と同じ長さの作業変数が必要になるだろ
620デフォルトの名無しさん:04/02/29 13:01
>>619
int Turn[5];があるじゃねーか
621600:04/02/29 13:04
>>613
ギャーーすいません、今実行したら全然違いました。
しかも>>612でかなり見当はずれな事言ってますね・・・
もっかい勉強しなおしてきまつ。
>>608
最初に100文字入力されるとSelect・・・がいっぱい出ます。
623620:04/02/29 13:05
なんか勘違いしていた。
配列のインデックスを・・・か
要はランキングか。
625デフォルトの名無しさん:04/02/29 13:22
>>614
> getcharって、文字のよみこみなのに、どうして変数はint型なんですか?


33ペイジに理由が書いてあります。
626デフォルトの名無しさん:04/02/29 13:23
>>625
見てみたけどTCPの説明しかなかったよ
627デフォルトの名無しさん:04/02/29 13:23
>>617
> scanfやめてgetsつかえば

おおぼけ!

gets厨発見!
628デフォルトの名無しさん:04/02/29 13:24
めくそがだめならばはなくそをたべればいいのに! ってかんじー (何かちがう)
629デフォルトの名無しさん:04/02/29 13:26
>>600
「){」はひどいな。
630608:04/02/29 13:27
>>610>>622
fgets()って余った分は捨てちゃうのかと思ってた。
余りの前に'\0'を入れて次回に持ち越すのね。
知らんかった。
>>596>>600
#include <stdio.h>
#define MAX 5

int main(void)
{
int List[MAX] = { 20, 50, 30, 10, 40 };
int Turn[MAX];
int i, j, temp;

for (i = 0; i < MAX; i++)
Turn[i] = i;

for (i = 1; i < MAX; i++) {
j = i;
temp = List[j];
while (j > 0 && temp > List[Turn[j - 1]]) {
Turn[j] = Turn[j - 1];
j--;
}
Turn[j] = i;
}

for (i = 0; i < MAX; i++)
printf("%d %d\n", i, Turn[i]);

return 0;
}
632デフォルトの名無しさん:04/02/29 13:54
なんでTが大文字?
633デフォルトの名無しさん:04/02/29 13:55
> qsort()使え。
> 要素が少ないと効率悪いけど。

こいつも知ったかぶり。
どう効率が悪いのか言ってみろよ! ;-)
>>633
関数呼び出しのオーバーヘッドだろ
STL の sort ならそれは起こらないが
>>633
もしプログラム作ってるんなら
アルゴリズムも勉強した方がいいぞ。
636600:04/02/29 14:02
>>631
うーん・・・なんとなく、解ったような、気はします。
1つ前の添え字をコピーして、変えないで置いたiの値を、入れていってる感じですかね・・・
でも、これを自分で書けと言われると、まだ無理ですね・・・
最近ソートを勉強したので、なんか嬉しくて、つい出しゃばってしまいました。
でも最初の印象ほど(私にとっては)簡単な問題じゃなかったです・・・すみません。
これからそのコードをもうちょっと解析して、なんとか完璧に理解したいと思います。
ありがとうございます。
>>636
ソートのアルゴリズムにしてもバブルソートよりも
簡潔さと実用性を兼ね備えた挿入ソートなんかがおすすめ
638600:04/02/29 14:07
あ、それから>>629で指摘されてるんですが、
「for () {」の方が一般的な書き方なんですか?
ここに書き込まれた内容だと、確かに見にくいですが、
エディタでは「for (){」でもくっついて見にくいということは無かったんで・・・
前記の方が浸透している書き方なら、これからはそちらを使おうと思うんですが、どうなんでしょう・・・?
>>636
>>637も言ってるとおり、>>631がやってることは挿入ソートな。
>>638
煽りはスルーしる
>>638
そんなもん、好きなの使えよ
642デフォルトの名無しさん:04/02/29 14:12
なぁ、scanfは結局、なんなの?
int a,b,c;
scanf("%d",&a);
scanf("%d",&b);
c=a+b;
printf("%d",c)

aに1 bに2をいれたら、これって、数字だよな?
結局、みんなしらないのか?


2-6ヶ程度の要素をソートするための良いアルゴリズムを教えてください。
これぐらいの要素の為にクイックソートを使うのが良いとはとても思えません。
644600:04/02/29 14:16
>>637.>>639
あ、そうなんですか!?
とりあえずソートの1番簡単な方法が基本選択法、ということで、
それしかちゃんとやってませんでした・・・
あと基本交換法というのもザッとはやってたんですが、
挿入ソートというのはまだですね。
こんな無知が紛れ込んでしまって、重ね重ねすみません。精進します。
>>642
数字が入力されEnterが押されたら2進数のデータに変換される
by独習C
646デフォルトの名無しさん:04/02/29 14:23
221ページに
選択ソート selection sort
挿入ソート insertion sort
バブルソート bubble sort
シェルソート Shellsort
ヒープソート heap sort
マージソート mergesort
クイックソート quicksort
分布数えソート distribution counting sourt
逆写像ソート inverse mapping sort
基数ソート radix sort
と、書いてあるね。(大文字小文字の違い、空白をあけるかどうかの違いにも着目!)
「算術ソート」がないのはなぜかなあ?
>>646
「算術ソート」って何?
>>638
「for () {」の方が一般的。
477の「Indian Hill Style Manual」に目を通しておくと良い。
あとK&Rのスタイルも。
649デフォルトの名無しさん:04/02/29 14:24
>>645
ひどいせつめいだ...。誤訳ってわけでもなさそうだし。
その本はどうみても却下だな。
>>642
結局、お前は何なの?
651デフォルトの名無しさん:04/02/29 14:26
> 「for () {」の方が一般的。

っていうか、くっつける(「){」にする_のがよほどどの馬鹿だけだってことだ。
652デフォルトの名無しさん:04/02/29 14:27
>>651
落ち着け
653デフォルトの名無しさん:04/02/29 14:28
>>638
そもそも、どんな入門書読んだんだろうな。
たぶん、小手本にしたものがよくないとおもわれ。
その本の名前を書けよ!
654デフォルトの名無しさん:04/02/29 14:29
>>647
算術ソートもしらずにCやってんのかよ。このぼけ
>>654
Googleタンも知らないそうです。
>>642
scanfでは、文字列を入力することもできるよ。
あとはprintfと比較でもしてみれ。
657デフォルトの名無しさん:04/02/29 14:33
char a[5];
gets でキーボードから数字を1を入力。
aは今数字の1ですよね。
atoi(a)で数値の1、これはわかるんだよ。
scanfで1を入力、数字だよな。
で642みたいに、すると、数字のままだよな、やはり数字で処理されてるのか?
内部では?
ずっと、その辺調べてるんだけどわからん・・・まぁしらなくても支障はないんだけど
気になってな、、だれか、完璧な回答をしてください。たのみます
658デフォルトの名無しさん:04/02/29 14:33
>>655
そんなのはgoogle3級のおれでもみつけられたぞ!
659デフォルトの名無しさん:04/02/29 14:33
>>657
それを一関数でやってはいけないのか?
>>657
お前、printfって知ってるか?
661デフォルトの名無しさん:04/02/29 14:36
> ずっと、その辺調べてるんだけどわからん
うそつけ! おまえは調べていない。
調べたら3秒でわかるはず。つまりおまえはしらべていない。

調べるってのはscanfのソース読むことだ。
662デフォルトの名無しさん:04/02/29 14:38
これだからscanf厨たちはなあ...
scanfやgetsみたいなののどうでもいいのに「こだわる」やつは(まさにここでは「こだわる」の正しい意味)、
ろくなやつがいないってこと。
そういうのを入門書につかうやつにもろくなやつがいない。
663デフォルトの名無しさん:04/02/29 14:39
そのソースどこにあんの?
↑拘るに拘る奴。
665デフォルトの名無しさん:04/02/29 14:40
入門書は明解C言語す、望洋さんのやつす
osietekun uze
細かいこと調べるなら、C言語辞典が良い
668600:04/02/29 14:43
>>648
おぉー、こんなのがあったんですね!
ありがとうございます。目を通しておきます。

>>653
商業高校に行ってた友達に、情報処理の検定試験の問題集をもらったんです。
COBOL用のだったんですけど、アルゴリズムは一緒かなと思って。

>>666すみません。退散します。
printfで16進で表示させてみるとかすりゃいいじゃん
混同してるのはPerlの影響じゃないか?
670デフォルトの名無しさん:04/02/29 14:46
結局、みんな、わからないのか、scanfで数字よみこんだときは
数字のままなのか数値にどこかでかわってるのか
つかえねーな
671デフォルトの名無しさん:04/02/29 14:47
> 入門書は明解C言語す、望洋さんのやつす

こいつもだめすぎ。あんな本を「いい!」っていう時点で、K&Rこわがり症と診断できる。
672デフォルトの名無しさん:04/02/29 14:48
>>668
そりゃアルゴリズム的にはそのまま使えるが、
COBOLの本読んだだけではCはかけないだろ?
何らかの方法でCの書式を知ったわけだろ?
それに本でもよんだんだろ? それは何かときいている.
>>670
分かってないのはお前だけだから心配すんな
674デフォルトの名無しさん:04/02/29 14:55
k&Rっていいの?
675デフォルトの名無しさん:04/02/29 14:56
っていうか、scanfにこだわる時点で、だめ決定!
676デフォルトの名無しさん:04/02/29 14:57
>>674
いいよ!
軽いし小さいから。電車の中で読むならK&Rで決まりだね!v(^-^,,)
>>674
いいよ。
個人的には演習が気に入ってる。結構骨がある。
Cが分かってる人もパズル感覚でやってみるといい。
678600:04/02/29 14:59
>>672
あ、本は買ってないんです。
ネット上の講座サイトを見て勉強したんです。
4月から専門学校に行くので、そのときにどうせ教科書買うからいっかー、と思って。
今勉強してるのは、予習のつもりで。(退散するとか書いてまた書いちゃってsorry)
#define forever for ( ; ; )
680デフォルトの名無しさん:04/02/29 15:02
これから、cの本買おうと思ってるんだけど、K&Rと独習Cどっちがいいですか?
>>680
もう勘弁して。ほんとそういうの。
>>681
もう勘弁して。ほんとそういうレス。
>>682
はいはい。じゃあK&Rを買った方がいいよ。終わり
684デフォルトの名無しさん:04/02/29 15:06
> K&Rと独習Cどっちがいいですか?

君がこわがりくんで無いならK&Rがいいよ ;-)
>>680
↓で書評見てみ。君のと同じような質問があって、それへのレスもある。
http://www.1point.jp/~book_2ch/
>>678
悪いことは言わないから、ネット上の講座サイトなんて当てにするな。
無料の講座は大抵何かしら問題があるもんだから。
つーか、そもそも予習のつもりなら尚更無駄だ。
専門学校の教え方が悪い場合は授業に不満を覚えることになるし、
教え方がいい場合は予習することで却って変な癖がつくことになる。
推薦図書/必読書のためのスレッド PART 16
http://pc2.2ch.net/test/read.cgi/tech/1076851442/

超初心者にもわかるC言語の本ってないですか?
http://pc2.2ch.net/test/read.cgi/tech/1053091019/

悪い本とは?
http://pc2.2ch.net/test/read.cgi/tech/1076328171/

読んだ書籍の感想・紹介
http://pc2.2ch.net/test/read.cgi/tech/1064681919/
お勉強ページ 勝手にリンク 第2版
http://pc2.2ch.net/test/read.cgi/tech/967778156/
689600:04/02/29 15:32
>>686
そ・・・か。そういうもんですか?
どっかで、「プログラムは、ある程度の実力までなら、組めば組むほど力がつく」
と書いてあったので・・・入学までに、やれる事はやっとこうかと・・・
確かに仰る事には一理あると思います。
でも、2ヶ月間、何もせずに過ごすというのが、すごくもったいない気がしたんで。
まぁ、コツコツやろうと思います。変な癖は、後からでも直せると思います。多分。
さすがにスレ違いなので、そろそろ本当に退散しますね。みなさんありがとうございました。
>>671
その本は俺も読んだことあるが、どこが悪いんだ?
少々時代遅れな記述も見受けられるが、
格別悪いもんでもないだろう。
最新の解釈では、「的を得る」方が「的を射る」よりもふさわしいらしい。
鼬害提げ
「最新の解釈」とやらの出所教えてくれないかなぁ。
#と、これはこれで鼬ごっこか。
>>691
ということは的を射るというと馬鹿にされて訂正されるのか…
嫌な世の中だな…
ターゲットをゲットするのとシュートするのと
どっちがよりお得感があるか、ということだな
695デフォルトの名無しさん:04/02/29 16:39
#include<stdio.h>
int main (void)
{
int s,i,j;s=1;
for(i=0;i<5;i++){
for(j=0;j<s;j++){
printf("☆");
}
printf("\n");
s++;
}
return 0;
}
文をネストした時にコンピュータはどのような順序で実行されてるんですか?
1回目に実行した時はprintf("☆");}→printf("\n");の順にすすんでるのですか?
こんがらがってしまったのでよろしくお願いします
>>695
何でやってるの? たいていデバッガでソースレベルでトレース出来るから それやってみたらどう?
sなんていらないよ。
for(i=0;i<5;i++){
for(j=0;j<i+1;j++){
printf("☆");
}
printf("\n");
}
ってゆーかさ、printf()してんだから分かるだろが...
リスト構造体からファイルにデータを書き込んだり、ファイルからリスト構造体
にデータを読み込んだりしたいんですがどうやればいいですか?
調べてみたけど分かりません・・
for(i=0;i<5;i++){
/* [A]ここが繰り返される */
}

ってのはOK?
[A]は0〜4の5回、繰り返される (ってのもOK?)
>>699
gets
>>701
"バッファオーバーフロー"って知ってる?
(f付きに汁!)
703699:04/02/29 17:42
http://www.morikita.co.jp/soft/kiriyama/8399/4/r04-07.c

やっと例っぽいの見つけたんですが、これ見てたら分けわかんなくなってき
ました。もっと簡単にできないんですかね
「的を射る」と「的を得る」の解釈

「● それはヤバイですね。」以降を参照のこと
ttp://www.ne.jp/asahi/wh/class/oubunsha.html
も前の知りたい事は何?
・メモリ上でリストで保持しているものについての追加/更新/削除
・構造体のファイル入出力


#define σ・∀・)σゲッツ!  gets

 
707699:04/02/29 17:54
>>705
・構造体のファイル入出力です。ただ、配列だと分かるんですが
リストになってるんで・・
>>706 ?
>>707
はは〜ん、も前のやりたい事は
・メモリ上でリスト管理している全体のファイル入出力
か?
たぶんインデックス管理のような仕組みを考えないとダメであろう
>>707
まず構造体1個の書き出し・読み込みをする処理を考える。
関数名はserialize()、unserialize()が良いだろう。
そのあとリストへ拡張すればよし。
>・構造体のファイル入出力です。ただ、配列だと分かるんですが
>リストになってるんで・・

なぜこうなるかがわからない。
構造体もリスト構造もファイル入出力(配列の)もわかっていればこんな疑問は
出てこないと思うんだが。
>>709
unserialize()よりdeserialize()のほうがいいな。
712699:04/02/29 18:25
>>709
助言どもです。考えてみます
713709:04/02/29 18:28
>>711
deserialize()の方がいいっぽいね。thx
714デフォルトの名無しさん:04/02/29 18:29
Casl2ってC言語の拡張型言語だよね
>>710
リスト構造のときはポインタでリンクしてるんで、
そのままファイルに書いて読んだだけではリンクしてるポインタが無効になっちゃう。
単純な、たとえばintの配列の読み書きよりは手数が増えるよ。
何らかの手段でリンクを維持しないとならんからね。
C言語ってどうして0から数える仕様にしたんですか?
1から数える言語もある中で、何か理由とかあったんでしょうか?
別に不満があるわけではないのですが、当時はみんなだったこうだったのかと気になります。
>>717
arr[n]は*(arr+n)と等価にしたかったから
>>717
数学的に0から数えるほうが自然なんだよ。
コーディングや設計をこなすうちにわかってくる。
自然というより>>718の通り、 ポインタと配列概念を混交させてしまいたかったのでしょう。

アセンブラ的な発想というか、今ではチョッとアレですけどね。
>>717
ふつう0から数えるんでは?
Pascalやってた人とかから見ると異質なんだろう
+1と-1の差が2あって変だろ?
プラスとマイナスの境目
配列のindexの数え方ととらえてレスしている人と
数字の数え方ととらえてレスする人に分かれている模様…

>1から数える言語もある中で
この文章から察するにおそらく前者
しかし「言語」を自然言語にまで拡大解釈すると後者も可か…
>>717
この本を読んで君もタジマ先生に怒られなさい。
http://www.amazon.co.jp/exec/obidos/ASIN/4061494201/250-3011215-8849007
>>717
foo[index]はfooのポインタをindexだけインクリメントした先を参照する演算子
決して0から数え上げるという仕様があるわけではない(結果としてそうなっているだけ)
1から数えたければ

int foo[3]={0,1,2};
(foo-1)[1]=3;
ptinrf("%d %d %d\n",foo[0],foo[1],foo[2]);

こんな風にするのがいいと思う
>720
>アセンブラ的な発想というか、今ではチョッとアレですけどね。
なら、どうしてアセンブラは0から数える仕様にしたんですか?
何か理由とかあったんでしょうか?
>>726
一応ポインタ値は実体の末尾+1を生成するのは合法だが、
-1を生成するのは違法で、未定義なのだな。厳密には。

マクロで包んで、

#define pascal_array(a, i) ((a) + (i) - 1)

pascal_array(foo, 1) = 3;

とするなら合法になる。
>>717
1から数えて得をするのはヒープソートを使う時位だからだろ。
>>717
最初の要素が1だと仮定すると
int a = 1; /* 配列の最初の番目 */
int b = 1; /* 配列の最初の番目 */
int array[] = { 1, 2, 3, 4, 5 };

array[a+b] は2番目の要素を示してしまう。
引き算したらいいわけだけど
 array[a+b-2+1]
なんだこの汚い式は?ということになる。
>>727
アセンブラに配列など無い
>array[a+b] は2番目の要素を示してしまう
ハァ?
1+1=2
>>730
全く説得力が無いが・・・
735デフォルトの名無しさん:04/02/29 19:35
>>732
多分最初の要素は0番目なんでしょう。
もはや数学のセンスの問題だな。
>>733
おそら>>732はそういうことを言いたかったんじゃなくて、
何故故array[a+b]という式を書いたのかってことじゃないの?
実は漏れも意味がわからない
気持ちが悪いなら自由に設定できるPerlを使えってこった。
>>731
では、どうしてアセンブラではメモリの最初の番地が
1ではなく0なんですか?
>>736
ttp://www.math.tohoku.ac.jp/~kuroki/keijiban/a.html より

>日本の中学・高校の数学で0を自然数に入れないのは、日本の中学・高校でのローカルルールです。それ以上でもそれ以下でもありません。

>ペアノは1から、ブルバキは0から、どっちでもいいんじゃ?
>>739 ばか?
Cの場合、配列の添字は「先頭からの距離」と捕らえた方が理解しやすいと思うが。
漏れはそうしてる。
0が最初に発見された数だったなら
こんなに混乱せずにすんだかもしれないね。
>>743
国語では先頭のことを一番とか1stと言うからな
5-1=4
5-0=5

これでわからないなら帰っていいよ。
ところで、配列の先頭のインデックスが 37 という言語があった場合、
実用時に困ることが発生するだろうか?
ところで
>>582
を美しく書ける方、ソースをあげてください。
>>745
どう贔屓目に見ても、それで分かる奴は
この世で一人だけしかいないと思うがな(w
すまん、スレ違いなのは重々承知しているが
一体どこで聞けばわからないので、このスレで
あえて聞かせてもらう、それは他でもない動画の
加工のことなのだが、例えばmpgをいらない部分は
カットするにはどうしたらいいのか、頼むから教えてくれ
または、適している板に誘導をお願いしたい
漏れはこのスレで、幾度と自分の意見を言ったり
わかる範囲で答えたりしてきた、そんな漏れだ
おまいらもどうか、察して欲しい。
>>749
板違い
スレ違い
>>747
getch とか rawmode とか調べれ。
752749:04/02/29 20:21
>>750
だからわからないから言っているんじゃないですか。
私は麻雀板、ミステリ板、そしてム板などを主に
渡り歩いていますが、一番知識があり、また温厚な
人間が揃っているのがここム板だと確信しています。
だから聞くとすればここだと決めました。
せめて誘導だけでもお願いしますよ。
>>752
ソフトウェア板いけ。
なんで今時Cなの?
C++やjavaのほうが
オブジェクト指向で
よりいいプログラムが書けると思うんだけど。
>>755
君、CもC++もjavaもやったことないでしょ?
>>756
図星ついちゃいかんよ、君w
まあ平然と全角使ってるあたりプログラマではないな。
>>747
>>608のwhile文の次の行に
rewind(stdin);
を追加。
>>759
いやぁ、すみません。
できました。
そういや上でrewind()教えてもらったような・・・。
その後寝てたんで忘れてました。
どうもありがとでした。
761596:04/02/29 21:10
質問です。
int List[5];
int Turn[5];
こんな配列があって、List[0]〜[4]には、それぞれ数値が入っていて
大きい数値を保持している順にTurn[0]〜[4]にListの配列の番号を入れたいのですが、
うまくいきません。ちょっと説明しにくいので、例を書きます。
List[0]=10;
List[1]=5;
List[2]=50;
List[3]=1;
List[4]=100;
だったとすると、
Turn[0]=4;
Turn[1]=2;
Turn[2]=0;
Turn[3]=1;
Turn[4]=3;
こうなるようにしたいんです。
>>761
同じ数字が2個以上配列にあった場合は?
>>761
Turn[]はどういう順になってるの?
Turn[0]=2;
Turn[1]=3;
Turn[2]=1;
Turn[3]=4;
Turn[4]=0;
なら分かるんだけど。
100 50 10 5 1それが入ってるインデックス
4 2 0 1 3

ということでは?
765デフォルトの名無しさん:04/02/29 21:29
>>763
List[Turn[0]],List[Turn[1]],...,List[Turn[4]]とすると降順にならぶってことだろう。
766デフォルトの名無しさん:04/02/29 21:30
どなたか、IPMessengerの会話を解読できる人はいませんか?ソースをみたらCで書かれているみたいなのです。
教えてください。
767763:04/02/29 21:32
>>764
なるほど。わかりました。
>>766
ゴメンそもそもその意味が解読出来ない。
769765:04/02/29 21:34
俺のじゃわかりにくかったか。やっぱり(´・ω・`)
770763:04/02/29 21:36
>>765
thx
771763:04/02/29 21:39
>>769
いやいや。
リロードしなかっただけっす。
>>770を書き込んだのも>>769を見る前だし。
またもやすれ違い。
772デフォルトの名無しさん:04/02/29 21:40
>>768
暗号化されてるようなんです...
Listに同値が入っていた場合の処理はしてない。
とりあえず力技w

#include <limits.h>
#define SIZE (5)
#defineDONE (1)
intmain()
{
intList[SIZE] = {10, 5, 50, 1, 100};
intDone[SIZE] = {0};
intTurn[SIZE];

long i, j;
long MAX;
long save_index;

for(i = 0; i < SIZE; i++) {
MAX = LONG_MIN;
save_index = 0;
for(j = 0; j < SIZE; j++) {
if(List[j] > MAX && !Done[j]) {
MAX = List[j];
save_index = j;
}
}
Turn[i] = save_index;
Done[save_index] = DONE;
}
return 0;
}
>>761
>>631の挿入ソートじゃだめなの?
>>772
RSA+Blowfishって書いてあるじゃないか
ポインタとソートを使って書いてみよう。
要素数がたった5なので効率が悪いだろうが

#include <stdio.h>
#include <stdlib.h>

int cmp(const int **x,const int **y)
{
return (**x==**y)?0:(**x>**y?-1:1);
}

int main()
{
int List[]={10,5,50,1,100};
int Turn[5];
int *hatena[5];
int i;

for(i=0;i<5;i++)
hatena[i]=List+i;
qsort(hatena,5,sizeof(int),(int(*)(const void *,const void *))cmp);
for(i=0;i<5;i++)
Turn[i]=hatena[i]-List;
for(i=0;i<5;i++)
printf("%d\n",Turn[i]);

return 0;
}
777776:04/02/29 21:56
「見よう」じゃなくて「みた」だ・・・
778デフォルトの名無しさん:04/02/29 22:05
c言語、ちゃんとやりたい。
始め方がわからないよ?
コンパイラって必要なの?どれがオススメですか?
コマンドプロンプトでどうやって実行するの?

/* サンプルプログラム */
#include<stdio.h>
void main(void)
{
printf("Hello\n")
}
>>778
Linux か cygwin が(・∀・)イイ!!
Windowsなら、BCCとCPadの組み合わせが手軽でよいですよ。
781778:04/02/29 22:15
え、、、linuxなんてインストールしてないよ。。。。。。
ノートがもう1台あるので、それをサーバーにして、linuxやりたいんだけど
後回しになってるんです。linuxはわからないから。。。。
うーん、とりあえず、winではだめなの?混在できない?
cygwin ですか?初めて聞いたのでネットであとで調べる。
>>781
www.cygwin.com
デフォルトインストールではコンパイラが入らないから Devel を追加すれ
>>739
>では、どうしてアセンブラではメモリの最初の番地が
>1ではなく0なんですか?
ハードウェアの仕様がそうだから

>じゃあ何でハードウェアの仕様ではメモリの最初の番地が0からなんですか?
同じビット数でより多くのアドレスを表すため(たったの一バイトだが…)
もしくは、同じアドレス数を少ないビット数で表すため(一ビットお得)
つーか、>>3に色々書いてあるな・・・吊ってきます
>>739
Instruction Pointer の初期値が 0 とか、
Vector Table Base の初期値が 0 とか、
じゃないかな?

回路構成にもよるけど、かつてのありふれた構成では
1 より 0 の方が出力インピーダンスが低く安定していたので
ど初っぱなの出だしを 0 にしたがる傾向があった・・・
てなとこで納得してもらえるかな?
>>717

index を 1 から数える場合:
base - 1 + index
減算器1個、加算器1個

index を 0 から数える場合:
base + index
加算器1個

コストが安いのは後者
787781:04/02/29 22:53
>>782 さん、ありがとうございました。
サイトは英語だったのでダウンロードは間違えてしまったかもしれないです。
正しく動作した場合の画面の表示のされ方はどうなりますか?
>>787
デスクトップに死ぐwinのアイコンができてて、
それをクリックするとDOS窓みたいな黒いウインドウが出てきて

$ _

と表示される。gccとタイプして Enter を押すと

$ gcc
gcc: no input files

のように・・・って、そこまで面倒みてられないよ〜ん。
彼女ならこの時間でも喜んですっとんでくけど。
cygwinは初心者向けでは無い。ヤメトケ
>>787
cygwinでググればすぐ見つかると思うんだけど。
ttp://www.mars.dti.ne.jp/~sohda/cygwin/
そもそも数学だって、インデックスを0から始める場合は多いわけだが。
792787:04/02/29 23:09
$ gcc
bash: gcc: command not found でした。
だめっぽかったので今日はこのくらいにしといて、座学にします。
ではでは。
float型の最大値は、FLT_MAX
ということは、
最小値は-FLT_MAX
でよろしいのでしょうか?
>>793
よろしくないでしょう。
FLT_MINってない?
絶対値とは書かれてないが?
>>794
FLT_MINは正の値なのです…

>>795
マイナスの値は定義されてないので-をつけるので
いいのですかね…?

797デフォルトの名無しさん:04/02/29 23:51
整数の最大最小と、実数の最大最小では意味がちがうぞ。
たしか実数のサインって、1ビットで判断するんじゃなかったっけ
799デフォルトの名無しさん:04/02/29 23:55
> 4月から専門学校に行くので、そのときにどうせ教科書買うからいっかー

とりあえず入学前に、どんな教科書を使うのかきいとけ。
たぶん独自のじゃなくて、市販の本の流用だとおもうが、
そこでおぶらーと系のを使うようだとその学校自体だめ。
800デフォルトの名無しさん:04/02/29 23:58
> でも、2ヶ月間、何もせずに過ごすというのが、すごくもったいない気がしたんで。

じゃあ日下部大先生の「作ってわかるCプログラミング」でも買っとけ。
K&Rが怖いようなやつにはちょうどいい。

> まぁ、コツコツやろうと思います。変な癖は、後からでも直せると思います。多分。

それが甘い! > あとからでも。
このスレッドあたりにへんなソース書くやつみてればわかるだろ?
最初に読んだ本の影響は大きい。
>>797
すいません。言葉足らずでした。

負の最大値。
数直線上の最小値。
どっちかならOKですかね…
802デフォルトの名無しさん:04/03/01 00:08
>>716
こいつはしったかぶりだな「なんらかの方法で維持しないと」なんていってるあたりで
あきらか。
そもそも、たどって順にかけばいいだけだろうが。
(そうすれば書くときにその順につかげばいいだけ)
803デフォルトの名無しさん:04/03/01 00:12
>>776
> 要素数がたった5なので効率が悪いだろうが

こいつは、あきらかにしったかぶり。
どうして'5程度の少ない場合は効率悪いんだ?
悪いわけねーだろ ぼけ
いいかげんなウソいうんじゃねーよ
804デフォルトの名無しさん:04/03/01 00:14
>>761
なんでCのソースなのにPascalCaseで書くんだよぼけ。
C#じゃあるまいし。
一番の知ったかぶりは
>>802=>>803のようですね。
806デフォルトの名無しさん:04/03/01 00:16
>>778
> コンパイラって必要なの?どれがオススメですか?
> コマンドプロンプトでどうやって実行するの?

2ペイジにかいてある。

> c言語、ちゃんとやりたい。

大文字と小文字の区別もつかんのか! このぼけが。
あと「言語」ってなんだよ。言語って


>>805
根拠を示さないと誰も同意してないよ
808デフォルトの名無しさん:04/03/01 00:19
> のように・・・って、そこまで面倒みてられないよ〜ん。

398ペイジに書いてあります。(Cygwin + gccの場合)
809デフォルトの名無しさん:04/03/01 00:21
測定しろよ! あきらかだろうが > 5個の場合のソーティングの効率
っていうか、測定するまでもなくあきらかに「少ないからといって効率はわるくない」
810778:04/03/01 00:23
「C言語がわかる」という本がでてるよ。正しくは「C」なの?
1-3 はみたよ。でもちゃんと読まなかった。
>>809
で、>>773>>776のどっちが何秒なんですか?
>>809
測定しただけじゃ結論にたどり着けないよ。
何に比べて効率が悪いかを確認しなきゃ。
dqnの香りぷんぷん
813デフォルトの名無しさん:04/03/01 00:26
> 正しくは「C」なの?

いいえちがいますね。(ってvoid信者なら必ず言う! (に500円))
814デフォルトの名無しさん:04/03/01 00:28
>>778

っていうか、mainの前にvoidってつけるなよ!
だめすぎ!

ちゃんとした入門書でも読め!
しったかぶりするから、へんな癖がついたり、へんな思い込みするんだよ。
>>814
778のどこが知ったかぶりなんだ?
おまえこそmainの戻りがvoidってとこにしか
噛み付くチャンスのない完全バカだろ
816デフォルトの名無しさん:04/03/01 00:30
っていうか「効率悪い」っていうほうが根拠しめすべきだろうが、
(わりこみしつれい!)
>>816
この場合、「悪い」でも「悪くない」でも、とにかく「言う」人に挙証責任があるだろ
>>815
まあまあ…
ほっときましょうよ。
819778:04/03/01 00:36
うーん、C今日から始めたんで、全くわからないです。
高校生のつかうような学校系の問題集を買ってきてやってる。
ソースにはこうかいてあったけどダメなの?
うーん、でも「C言語がわかる」には確かにmainの前にvoidなんて入力
してないね。ちゃんとした入門書ですか・・・。金がない。
図書館でかりるか。
820デフォルトの名無しさん:04/03/01 00:37
> この場合、「悪い」でも「悪くない」でも、とにかく「言う」人に挙証責任があるだろ

たしかに、しめしてほしいよね > 効率悪くなるなどというしったかぶりしてるぼけに

(って、まわりの程度が低すぎるので、そんなしったぶりがまかりとおっちゃうんだろうが...
...ふつうの高校生レベルなら、さすがにまわりも「まあまあ、どっちも云々」なんていうやつは
いねーぞ。あきらかだもんな)
しようがないなぁ、俺俺がぐぐって見つけましたよ
はれ↓
ttp://www.emit.jp/prog/prog_s.html
822デフォルトの名無しさん:04/03/01 00:39
> 高校生のつかうような学校系の問題集を買ってきてやってる。
> ソースにはこうかいてあったけどダメなの?

あきらかにダメ本です。いますぐ捨てなさい。
で、もうすこしまともなの買ってきなさい。

823デフォルトの名無しさん:04/03/01 00:41
>>819
「金がない」はいいわけにならんよね。
だめな本なら金だせてるんだから。

ようするにこわがって買ってないだけなんだよ。
借金してでも買えよ!
824778:04/03/01 00:42
  ∧__,,∧         
 (´・ω・`)       
 (つ旦と)    しょぼーん。
 と_)_)
825デフォルトの名無しさん:04/03/01 00:44
>>802
304ページにまるっきりそのまんまの例がでてるぞ!
ソースつきで
>>818
ほっとけなくてごめんなさい。

qsort()って要素数が少なくてもバカ正直に再帰やってんの?
それともある数以下だったら違う方法でソートする?
実装者の趣味次第?規格で決まってる?
>819 とりあえず
ANSIではmainの戻り値はint
828デフォルトの名無しさん:04/03/01 00:47
>>803
これくらいでqsortを持ち出すのは大げさと書くべきだったかな。
>826
実装者の趣味次第だ
830デフォルトの名無しさん:04/03/01 00:48
>>825
「ペイジ」じゃないのか? :-P

�で、おれも妹の本棚からもってきてみてみた。
たしかに第9章に出てるな。
双方向連結リストを表す構造体をファイルに書いて、
それをあとで読む、という例だ。
というか、テキストエディターが例題になってる。
あれはたしかにリスト構造だもんな。
>>716 はようするにリストとグラフ(ツリーも)の区別がついていないボケなだけでは?
>>819
>うーん、でも「C言語がわかる」には確かにmainの前にvoidなんて入力
>してないね。
mainの前にintとも入力してなかったら多分ダメ本
>>793
たとえintだとしても-INT_MAXがint型の最小値になる環境は少ないと思うぞ。
>828 いや、5程度なら挿入ソートとかの方が効率が良いな
834デフォルトの名無しさん:04/03/01 00:50
>>826
> 実装者の趣味次第?規格で決まってる?

再帰をつかったヴァージョンのクイックソートかどうか以前に、
クイックソートするかどうかさえも規格では決まっていない。

「作ってわかるCプログラミング」P222の脚註より
: 実際には、qsort()関数がクイックソートのアルゴリズムで実現されている保証は
: 規格上はない。
835デフォルトの名無しさん:04/03/01 00:52
そもそも「再帰は遅い」っていう思い込みが、またしったかぶりの先輩にだまされている
パターンだな。
いや、実際遅いだろ、再帰
どんな型にでも使えるようにした設計や、比較のたびに関数を呼ぶことの方が再帰よりも速度に影響を与えるのでは。
838778:04/03/01 00:54
「C言語がわかる」は電車とかで読む程度のつもりで買った。
というか、急いでて適当に選んでしまった。
入門書として使おうとはさらさら思ってないよ。
でも、エンジニアの人は動物の絵のオライリ?とかから入るの?
余談だけどさ。
839デフォルトの名無しさん:04/03/01 00:55
> たとえintだとしても-INT_MAXがint型の最小値になる環境は少ないと思うぞ。

規格上の「最小限」の環境ではまさにそれですね。
プラスもマイナスも32767(8ではない)。
つまり、2の補数方式をとらないで、1の補数方式のマシンまでかんがえたスペックだ。
実際そういうコンパイラーは10回ぐらいしかであったことがないが(なつかしい)

C#なんかは逆に、言語のスペックが1の補数方式のものには実装がむずかしいね。
(マイナス側が1個多い例のパターンなのを要求するので)
それもそうだが、単純なループよりも再帰は遅いぞ
841デフォルトの名無しさん:04/03/01 00:56
> でも、エンジニアの人は動物の絵のオライリ?とかから入るの?

あひるのですね。
842デフォルトの名無しさん:04/03/01 00:57
>>840
それは一般にはそうだとは言えない。
ほとんどかわらないか、むしろ再帰のほうが速いぐらいの環境もあるので
843826:04/03/01 00:57
>>829>>834
レスどうも。
クイックソートかどうかすら決まってなかったんですね。
名前にだまされてた。
>838
エンジニアの俺俺はASCIIから出てるC言語の本から入ったYo
工業・・・の・・情報処理検定2・3級の・・・C言語冊子・・・
>>843
実際、VisualC++6.0のqsortは、基本的にはクイックソートだけど、分割された部分の要素数がある程度少なくなると他のソート法に切り替えるようになっている。
>846
って事は少ない要素をクイックソートするってのはヴァカ?
848デフォルトの名無しさん:04/03/01 01:06
> どんな型にでも使えるようにした設計や、比較のたびに関数を呼ぶことの方が再帰よりも速度に影響を与えるのでは。

後者はたしかに、関数呼び出しのオーヴァーヘッドはあるが、たいした問題ではない。
(単純な比較のときならともかく、そうでない場合は、結局関数の1つもかかないと
汚くなるので)
前者はさらに後者ほど問題にならない。
クイックソートの原理頭いたくなる
850デフォルトの名無しさん:04/03/01 01:08
>>848

だが、そのどちらも要因も、「qsortは効率わるい」はいえても、
「要素が少ないと効率悪い」にはならないよね?
要素が多くたってqsortは効率が悪いのだ! (データ型依存の速いコードかいたやつや、
関数呼び出しのオーヴァーヘッドをさけるように1関数で書いたものとくらべて)
851デフォルトの名無しさん:04/03/01 01:10
>>849
qsortも怖いのかよ
852826:04/03/01 01:11
>>846
thxです。
規格で決まってないとはいっても大抵は
クイックソート使ってるんでしょうね。

>>847
Knuthさんは配列の大きさが9以下だったら
もっと簡単なアルゴリズムを使うことを提案してるそうです。
(「データ構造とアルゴリズム(培風館)」より)
853デフォルトの名無しさん:04/03/01 01:13
今朝だったか、別のスレッドに書いてあったが、
専門学校で、教科書をピアソンの「C言語入門」から
「作ってわかるCプログラミング」に変えたら、
検定試験の合格率が2倍以上にアップした、ってかいてあったぞ!

それでも読んどけばいいのでは? > void mainとか書いてたやつ

854778:04/03/01 01:16
あー、本、欲しいな。
いろいろ情報ありがとうございます。
>>853
検定試験を2倍以上簡単にしたんじゃないか?
856デフォルトの名無しさん:04/03/01 01:22
> 大抵は
> クイックソート使ってるんでしょうね。

初期のLattice-Cはちがいましたよ。

さすがはレタス
858デフォルトの名無しさん:04/03/01 01:24
>>855
っていうか、例の専門学校だろ?
だったら、著者本人が講義したんだろうから、
それが前年度(たぶん著者じゃない人が教えたんだろう)とくらべるのは、
かなり不公平じゃないかと思うが。

やはり本人がおしえたほうがかなり有利。
859778:04/03/01 01:35
他スレで叩かれてる・・・・。
  ∧__,,∧         
 (´・ω・`)       
 (つ旦と)    しょぼーん。
 と_)_)
>>819
こういうところで ANSI とか言ってる>>826のような連中に
main の戻り void なのを批判する資格は大抵ないよ

なんせ、ANSI の規格票を持たずに「ANSI 規格で決まってる」なんて
いい加減なことをほざいてるシッタカばっかりだから
8611002:04/03/01 01:36
www.catnet.ne.jpが落ちている・・・・。
  ∧__,,∧         
 (´・ω・`)       
 (つ旦と)    しょぼーん。
 と_)_)
862デフォルトの名無しさん:04/03/01 01:36
どこだろー
>>860
持っているよ。日本語訳だけど、以前のも今のも。
>>853
マルチ氏ね
>>862
>>1
C FAQ 日本語訳
>>863
はいはい
867デフォルトの名無しさん:04/03/01 01:42
>>860
> こういうところで ANSI とか言ってる>>826のような連中に
> main の戻り void なのを批判する資格は大抵ないよ

別の人間でしょ。どうみても。
868デフォルトの名無しさん:04/03/01 01:43
>>860
いまどき「ANSI」なんていってる860がどうみてもしったか。
>>868
826が言ってるんだよヴォケ
失礼!

s/826/827/g

すまん、これは俺が悪かった
871デフォルトの名無しさん:04/03/01 01:48
っていうか827はだれがどうみても、そのままスルーするものだろ。

わざわざそんなのにかみつくやつってのは、「お、これならおれでもわかる! おれよりへぼい
やつがいた!」とうれしそーに、さわいでる馬鹿だろうに。
ワロタヨ
オモシロェ
!
>>872
突撃厨うざい。静かにヲチっていろ。
盛ってるなあ
ワロタ
3桁の数字も区別ができないアフォがいるスレはここでつか?
876デフォルトの名無しさん:04/03/01 04:06
お聞きしたいのですが,
x[100]というように配列を使った場合と
x1,x2,…,x100というように一つづつ変数を定義した場合とでは
どちらも,その変数を呼び出したり,計算したりするのにかかる時間は
同じなのでしょうか?また,それをx[10][10]というように
2次元配列にした場合も同じなのでしょうか?
気になるならアセンブラ出力を見て比較しな
878デフォルトの名無しさん:04/03/01 05:04
うーん。アセンブリ言語は全然知らないです。
構造体を使った方が速いのでしょうか?
>>876 >>878
実装依存だと思う。
どうしても知りたいなら、実際に動かして試せ。
最適化を無視すると、一般に、
1.変数のアドレスを得る
2.配列インデックスを1に加える
3.必要なら2を繰り返す
となるから、1だけで済むx0,x1のほうが早い。
でも最近のコンパイラは賢いしCPUも早いから、
読みやすいほうを使ったのでいいと思う。
おいおい、配列の添え字に変数を使わない限り(>876の使い方は違う)
配列の何番目の要素であろうと、アドレスはコンパイル時に決定されるよ。
どんなタコなコンパイラであろうと。
差が付くとしたら、自動的なレジスタ変数割付とかその程度。
だから実装依存だし、アセンブラ出力を見ろと書いた。
882デフォルトの名無しさん:04/03/01 05:34
>> 880
配列のほうがいらない作業をしていることになるんですね。
ありがとうございます。
いやすまんぬ。俺はインデックスは変数のつもりで書いた。
ま、揉めるつもりはないんで許しておくれ。
884デフォルトの名無しさん:04/03/01 05:59
>> 881
ちなみに、プログラムでは一次元配列の添え字に変数を使っています。
その添え字の部分の変数として、2次元配列を使っているのですが、
そこを普通の変数で置き換えてから一次元配列の添え字としたほうが
いいかどうか迷いました。
その2次元配列の要素をしばらく使いつづけるので、もしかしたら
置き換えてしまったほうが速いかな、と思った次第です。
どうもありがとうございます。
x1,x2...では添え字が使えないからな。
実行時間のナノ秒単位の節約だけでなく
メンテナンス時間の節約も含めて判断すべき。
886デフォルトの名無しさん:04/03/01 06:08
ちょっと分かりにくいので分かりやすく書いておくと
a[b[i][j]]のb[i][j]をcとかで置き換えたほうがいいかなー、
という疑問でした。もう少しいうと、このb[i][j]のままで
x[b[i][j]]とかy[b[i][j]]とかいうように多用しているので、
cなどに置き換えたほうが速いのかどうかが疑問でした。
使う状況によるということですね?
わかりました、どうもありがとうございます。
添え字自体を配列から読み出しているのだったら、
一時変数に代入して使った方が速い「かもしれない」。
2次元配列を使わずに1次元にすることが可能なら(==高次の添え字を毎回計算しなくて済むなら)
1次元にした方が速い「かもしれない」。

低次の配列(or構造体)部のサイズが2のべき乗でないなら
2のべき乗にした方が、もしかしたら「極僅かに」速くなる「かもしれない」。
またはポインタで参照した方が速くなる「かもしれない」。
でも逆に遅くなる「かもしれない」。
よほどクリティカルな部分でない限り、速度を気にするべきじゃない。

ただ、a[b[i][j]]なんてするくらいだったら
読みやすさからも別な変数を使うべき。
889デフォルトの名無しさん:04/03/01 06:24
あまり素人が、細かく速度をとやかく気にしないほうがいいという感じですかね?
確かに全然素人なのでもう少しいろいろと他のことに力を使おうと思います。
本当にいろいろな意見ありがとうございます。
890デフォルトの名無しさん:04/03/01 07:39
> おいおい、配列の添え字に変数を使わない限り(>876の使い方は違う)
> 配列の何番目の要素であろうと、アドレスはコンパイル時に決定されるよ。

っていうか、添字が定数だけだったら、配列使ういみねーだろ ぼけ
891デフォルトの名無しさん:04/03/01 07:41
> a[b[i][j]]のb[i][j]をcとかで置き換えたほうがいいかなー、

それは「置き換える」んじゃなくって、一旦代入した臨時変数を使うかどうかってことでしょ。
それはむしろ「しないほうがいいい」ですね。(速度の点でいうなら)
むしろするかしないかは、「どっちが読みやすいか」だけできめるべし
>>890
そんなことないだろ。
というか添え字云々は本筋じゃなくて、
対象のデータ構造(ベクトルや行列は典型)に応じて使うべきだと思うが。
データが一体だということを明示的に主張できるし
関数間の受け渡しの効率化の意味もある。
893デフォルトの名無しさん:04/03/01 08:17
> というか添え字云々は本筋じゃなくて、
> 対象のデータ構造(ベクトルや行列は典型)に応じて使うべきだと思うが。

そうではなくて、倫理的なデータ構造が「配列」とするのが最も適しているってことは
そのロジックでは必然的に添字は変数になるだろってことだ。そんなこともわからんのか
ちっとは頭を使え!
894デフォルトの名無しさん:04/03/01 08:18
こんなのはちょっとした入門書で勉強しただけでも身に付くことなのになあ。
はあ、ここレベル低すぎ...!
書き込みせずに放置できないお前も同レベル。
倫理的なデータ構造
倫理的なデータ構造
倫理的なデータ構造
落ち着け。
倫理的はおそらく論理的の間違いだと思うが、
変数を使って処理するのが適しているからって
変数しか使わないということにはならないだろ。
まさか定数で添え字を指定した経験がまったくないのか?
898デフォルトの名無しさん:04/03/01 08:25
> 変数を使って処理するのが適しているからって
> 変数しか使わないということにはならないだろ。

いまさらごまかしても無駄。

「添字に定数しかつかわないようなもの」
と「変数を主に使うもの」の話だろうに。
899デフォルトの名無しさん:04/03/01 08:27
>>897
まあa[0]だけは添字が定数なことは多いだろうなあ。
だが、0〜MAX-1まであるような環境で、「5」だけを定数で指定するような
コードがあったら、それは「配列というデータ構造」を使っているのではない
可能性も高い。(配列というデータ構造を「流用」してるだけで)
たとえば文字列テーブルの参照用なんかは定数使わない?
それともこれも「流用」になるのか?
確かに、定数自体をenumで指定して・・・
なんてのもありがちだね。
>>832
INT_MINは、負の値なんですよね。
たいてい-INT_MAX-1の値が定義されていると思います
たぶん…

しかしDBL_とFLT_は正の値(絶対値?)しかなく、
負の値に対しての説明もないANSIの本(ANSI FAQ)みたけど…

-FLT_MAXで一応実装はしたけど、本当にこれでよいのかと。
stdinやstdoutも配列+定数でdefineされている処理系が多かったり