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

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

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

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 87
http://pc5.2ch.net/test/read.cgi/tech/1090654469
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
>>1
初めてのCってなんですか?
>>2
Cの解説書だよ。
>>2
赤裸々な体験を綴った往年の名著
赤裸々な性体験ですか?興味あります。
スレ勃て直すか?
やりすぎると削除の憂き目を、
えーと、憂き目を得るだっけ?
憂き目に遭う、だっけなぁ
scanf達人の漏れに言わせれば、憂き目を見る、だぜ。
gets達人の漏れに言わせれば、憂き目には憂き目を、だぜ。
Java達人の漏れに言わせれば、憂き目はぬるぽ、だぜ。
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__∧∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>11
13デフォルトの名無しさん:04/08/03 23:47
void reverse(char *s)
{
  int c, i, j;

  for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}
void itoa(int n, char *s)
{
  int i, sign;

  if ((sign = n) < 0)
    n = -n;
  i = 0;
  do {
    s[i++] = n % 10 + '0';
  } while (( n /= 10 ) > 0);

  if (sign < 0)
    s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
NULLぽ
>>15
誤爆?
>>16
「猫でも解る」のc言語編の丁半ゲーム
http://www.kumei.ne.jp/c_lang/intro/no_24.htm

long motokin;
if (motokin <= 0L)
の 「0L」 は一体どういう意味があるのでしょうか? 
(motokin <= 0) でも良いと思うのですが。よくわかりません
motokinと0を同じ土俵(long値)で比較することを示している
>>18
あぁ、なるほど、早いレスありがとうございます。
getsではなくfgetsを使え〜
21デフォルトの名無しさん:04/08/04 06:07
>>17
ただし、この場合不要、付けない方が良いから真似しないように。
つけない方が良い?
つけなくても良いじゃないのか
23デフォルトの名無しさん:04/08/04 10:46
ママにも言われた事ないのに_______
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__∧∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>14
scanfを使った書き方が分かりません。
教えてください。
・数値を一つ入力してそれを表示する。書式は"n=数字\n"
・数値以外のものが入力された場合
  ・"quit"が入力されたら終了する。
  ・それ以外の文字列の場合はエラーとその文字列を表示する。
・終了しなかった場合は最初に戻る。
模範解答はコピペしないの?
もしかして誰も応えられないとかw
ワンパターンだな。
29デフォルトの名無しさん:04/08/04 17:18
一般的に*printfや*scanfの戻り値は検査されているのでしょうか?
>>29
printfの戻り値は捨てるのが普通。scanfはそれ以前に使わないのが普通。
あと、printfもscanfも戻り値はポインタ型じゃないから * は付けない。
>>30
printf だと使わないけど、sprintf だと結構使う罠
>>30
その*はポインタの意味として使ってるんじゃないべ
どんな意味だよ。
3432じゃないが:04/08/04 18:04
>>33
多分ワイルドカード
はぁ、さいですか。
printf fprintf sprintf snprintf vprintf vfprintf vsprintf vsnprintf等
って書くのもめんどいでしょう
そういう時はな、printf、fprintf等、とか言っときゃいいんだよお嬢ちゃん。
うんちゃら系で良いじゃん。
ほげ系
>>33
(*printf)("Hello, Warld.");
(void)printf(...
って書けやぼけ
>>41
int i;
じゃなくて、
auto int i;
と書く人ですか?
auto signed int i;

だな
44デフォルトの名無しさん:04/08/04 20:46
str[5];
fgets(str, sizeof str, stdin);

if (str[0]) printf("%s", str);

これでstrに0だけを入れてもprintfが実行されてしまいます。
str[0]が0だったら偽だと思うんですけど。
str[0]!=0としてみましたがやはりprintfが実行されてしまいました。
なぜなんですか?
変な改行は気にしないで下さい
0と'0'は違うんだが
>>44
いや、 str[0] != 0 とかやっても変わんないから
>>44
君はC使うのにむいてないから
早く他のツールつかった方がいいよ
論理演算はCに限らず必要。
がんばれ。
50デフォルトの名無しさん:04/08/04 22:31
混じれ酢すると
fgets で 0 をキー入力した場合、(UNIX系なら)
str[0] = '0' (= 0x30)
str[1] = '\n' (= 0x0A)
str[2] = '\0' (= 0)
51ビル・ジョブス:04/08/04 22:46
>>44
NUMLOCKしてなかったとか特殊なオチは勘弁してくれよな。
ところで、printf()の結果も書いてくれよ。
>>51
NUMLOCK しててもだめだろ?
str[0] != 0 なんだから。

>>44
if (str[2]) printf("%s", str);
にしる。
右辺値の取り得る最大の値(計算途中も含む)は、処理系の持つ最も大きい型の最大値(この例では一応unsigned longに)なんでしょうか
(というか、計算途中の事が知りたい)
例えば、
a= (b+1)%100;
b=ULONG_MAXでunsigned long型とすると
1. b+1を計算して0になる
2. b+1を計算してULONG_MAX+1の値になる

で、試してみたら1番の結果になりました。
計算途中は処理系限界最大値を超えてるけど、左辺に代入する時は
左辺の型の最大値を下回ってるっていう時、皆さんはどうします?
54デフォルトの名無しさん:04/08/04 23:40
string.hよりも使いやすい文字列操作ライブラリはありますか?
Javaの様にまではいかないまでも長さチェックなどの機能ぐらいはほしいです。
>>54
それ以上を求めるならC++に行くしかないね。
>>54
探せば幾らでもあるし、自分で作ってもいいし、
それらすら出来ないようなら、>>55 のように
すればいい。
>探せば幾らでもあるし
例えば?
知らないならだまっときゃいいのに
>>58
それは探したとは言わん。単に検索結果を表示しただけ。
そのくらいなら誰にでもできる。
本当に、幾らでもあったのか?
実は調べてないだろ。
誰も探したなんて言ってねーじゃん
>>53
a = b % 100 + 1;

>>53
オペランドのうち大きな方の型。
>>63
自分で使ってもいないものを他人に勧めるなよ。アホか
>>65
http://www.and.org/vstr/comparison.html
"String library comparison" って、
なんて書いてあるか、読める?
>>66
お前が何も知らないのは分かったからもう失せろよ。ボケが
67 名前:デフォルトの名無しさん[sage] 投稿日:04/08/05 00:30
>>66
お前が何も知らないのは分かったからもう失せろよ。ボケが

↑面白いw
69デフォルトの名無しさん:04/08/05 00:44
配列同士の乗算はポインタ演算の方が早いんでしょうか?
ポインタだからって早いことは何一つ無い。
>>53
a= (unsigned long)((longlong)b+(longlong)1)%(longlong)100;
括弧が足りなかった。スマソ
a= (unsigned long)(((longlong)b+(longlong)1)%(longlong)100);
>>62
それをしたいなら厳密にはこうするべき。
a = (b % 100 + 1) % 100;
>>69
配列同士の乗算っていうと内積とか外積の計算をするってことか?
75デフォルトの名無しさん:04/08/05 03:09
>>53
オーバーフローしたら結果はsignedなら不定。unsignedなら不定ではないが
正しい結果にはならない。
上回らないように計算するか、doubleを使う。素人はfloat使うな。
↑素人
float
↑フロート
質問するな
回答するな
議論するな
↑知的障害
↑恥的生涯
↓おいなりさん
(´-ω-`)
83デフォルトの名無しさん:04/08/05 14:28
【コンパイラ】
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/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

【ライセンスや機能などに問題あり】
Microsoft 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
遅れてきたテンプレ乙
意見を聞かせて。

-----
char *buf;
buf = (char *)malloc(sizeof(char) * BUFSIZE);
-----
っていうコーディングは異常? (sizeof(char)あたり)
仕事で書いてるものじゃないから、好きにやればいいのだろうけど、
一般的にはどうなのかな、と。

例えば、これがintだと
-----
int *intarray;
intarray = (int *)malloc(sizeof(int) * ARRAY_SIZE);
-----
って書くのは普通だと思うんだけど、charの時だけsizeofを省略するのが
嫌だなと思うんだよね。
charの大きさは1byte、mallocの引数は確保するメモリブロックのbyte数
だからってどうしろという規則は無いんだから、勝手にすれ
素直にマクロでも作っとけ
>>85
そういうことで迷わないよう、次からはtchar.hを組み込んで、
_TCHAR buf;
buf = malloc(sizeof (_TCHAR) * ARRAY_SIZE);
ただし非標準という罠。
89デフォルトの名無しさん:04/08/05 18:58
double (*hage)[10];

これはどういった宣言なんですか?
double *hage[10];
とは違いますか?
>>89
↑:『double 型の要素数 10 の配列』へのポインタ
↓:『double 型のポインタ』を 10 こ格納する配列
double (*hoge)[10];
double *(hoge[10]);
9289:04/08/05 19:22
『double 型の要素数 10 の配列』へのポインタ
とは、具体的にどう使うのでしょうか?

double c[10];
double (*hage)[10];
hage = c;

だと3行目でエラーが出ます・・・
テンプレ
 エラーが出ますだけじゃなく、エラーメッセージくらい書け
9490:04/08/05 19:24
>>92
hage = &c;
9589:04/08/05 19:29
&c ですか・・・なんだか混乱してきましたよ><
確かにコンパイル通りました。
&cって一体何を示しているのですか?
アドレスのアドレスって事ですか?

9690:04/08/05 19:32
>>95
そう
ちなみに、c をアドレスだと思うより配列だと思った方が、この場合は分かりやすい
アドレス演算子が & で c が配列なら、配列 c のアドレスは &c
9789:04/08/05 19:46
なんとなく分かってきました。
最後に教えてください。
『double 型の要素数 10 の配列』へのポインタ の要素数2の配列
の使用例はこんな感じで合ってますか?

double a[10], b[10];
double (*hage[2])[10];

hage[0] = &a;
hage[1] = &b;

(*hage[0])[9] = 4.2;
>>97
gcc で確かめた
こんなかんじであってます
>>97
これもできる。
double a[10], b[10];
double *hage[2];
hage[0] = a;
hage[1] = b;
100100:04/08/05 20:35
おくちにひゃっく
したのおくちにニャンニャンしたいでつ
10289:04/08/05 20:45
ありがとうございました。精進いたしますです。
103デフォルトの名無しさん:04/08/05 20:50
そんな書き方が必要になることは
ない
104ガンバル初心者! ボクにも出来た!:04/08/05 21:46
#include <stdio.h>
#include <string.h>
int main(void){
int roop;
char ask[50];
roop = 0 ;
while ( roop == 0 ){
puts("Yes or No ?");
gets( ask );
if ( strcmp( ask, "yes\0") == 0 ){roop++ ;
}else if ( strcmp( ask, "YES\0") == 0 ){roop++ ;
}else if ( strcmp( ask, "Yes\0") == 0 ){roop++ ;
}else if ( strcmp( ask, "no\0") == 0 ){roop-- ;
}else if ( strcmp( ask, "NO\0") == 0 ){roop-- ;
}else if ( strcmp( ask, "No\0") == 0 ){roop-- ;
}else{}
}
switch( roop ){
case 1: puts("Yesの箱舟"); break;
case -1: puts("Noストラダムス"); break;
default: puts("ありえな〜い"); break;
}
return(0);}
105ガンバル初心者! ボクにも出来た!:04/08/05 21:49
ゴメン、また改行がおかしくなった……orz
getsとstrcmpを教えてもらったらら、やりたかったことができたよ。
嬉しかったから、ご報告。これ以上、スレ汚ししないように、
これからは自力でやるようにガンバリますです。んじゃ!
106デフォルトの名無しさん:04/08/05 21:50
http://hidebbs.net/bbs/suzukitibi
管理人が殺したらいいよ
>>104
非ANSIだけどstrcmpの大文字・小文字を区別しない_stricmpとかそういう名前の関数を探してみな。
toupperまたはtolowerかますだけなのに。
日本語ではまるに一票。
>>109
_mbsicmp
111デフォルトの名無しさん:04/08/05 23:03
#include <stdio.h>

int f(int a, int b, int c, int d)
if (b == 0)
return a;
if (c == 0) {
return a+b;
} else if (d == 0) {
return f(a, f(a, b-1, c, 0), c-1, 0);
} else {
return f(a, b, f(a, b, c-1, d), d-1);
}

return 0;
}

int main(int argc, char** argv)
{
printf("%d\n", f(3, 3, 65, 2));
return 0;
}


このプログラムがうまく動かないのですが、どうすればよろしいでしょうか?
ただ数値を出力するだけなんですけど・・・。
>>111
関数 f の開始括弧が無い

……あとは再帰関数の停止可能性を考えるだけか
113デフォルトの名無しさん:04/08/05 23:17
すみません、こういうことで。

#include <stdio.h>

int f(int a, int b, int c, int d)
{
if (b == 0)
return a;
if (c == 0) {
return a+b;
} else if (d == 0) {
return f(a, f(a, b-1, c, 0), c-1, 0);
} else {
return f(a, b, f(a, b, c-1, d), d-1);
}

return 0;
}

int main(int argc, char** argv)
{
printf("%d\n", f(3, 3, 65, 2));
return 0;
}


間違いがなければ必ず有限時間で停止するはずなのですが・・・・・・。
114112:04/08/05 23:25
>>113
ちょっと確認できそうに無い
でも、こっちで試したら無理だった

有限時間で停止するけど、その間に関数が再帰する個数が
システムで用意されたスタック数を超えているような気がする

多分そっちも何も出力されずに終了したんだと思うけど、
それは多分スタックオーバーフローが起きているせい

遅延評価をサポートすれば平気かもしんない
スタックの容量を拡張してみるとか。
再帰関数を用いないような構造にするとか・・・。
>>109
/* _Bool volatile Switch; */
...
puts("しばらく止めますんで、変数Switchにtrue/falseを念写してください。");
for(;;);
...
>>113
いたる return の前の行に
printf("[%d %d %d %d]",a,b,c,d);
でも入れてみなさい。
>>117
それなら
int f...
{
/* ここ */
に1個だけで十分だと思うが
119117:04/08/05 23:53
あ、あぁぁ・・・。
(・・;)soune
>>113
例えスタックが足りても,intじゃすぐに桁溢れしそうな気分。
121デフォルトの名無しさん:04/08/06 00:46
> 例えスタックが足りても

漢字ぐらいちゃんと書け ぼけ
122デフォルトの名無しさん:04/08/06 00:47
> intじゃすぐに桁溢れしそうな

intであふれるのは「桁」じゃねーよ ぼけ
BCDじゃああるまいし ぼけ
123デフォルトの名無しさん:04/08/06 00:56
> printf だと使わないけど、sprintf だと結構使う罠

昔と今では戻り値が違ってしまっている関数の典型!
124デフォルトの名無しさん:04/08/06 00:57
>>40
> (*printf)("Hello, Warld.");

ぼけ。英単語くらいちゃんとかけよ
>>124
もっと早くつっこめ ぼけ
ぼ け先生の臭いがする!クンクンッ!くさっ!
127デフォルトの名無しさん:04/08/06 01:12
>>125
じゅうぶんぬれてから
128デフォルトの名無しさん:04/08/06 01:28
>>113
再帰関数を使わないプログラムにする必要がある。
最悪の場合、goto を使うしかないのか・・・。
>>113 >>128
アルゴリズムどうにかする方が先だろ。
else { //d>0
return f(a, b, f(a, b, c-1, d), d-1);
}

ここ,aやbが変化しないから,まじめに再帰させる必要がない。
a+bの値だけチェックして,処理省略しろ。
>>124
世界は戦争(war)に満ち溢れているんだよ。
131デフォルトの名無しさん:04/08/06 11:30
war==ワーですか?
www = わーわーわー
  ○○
 ○  ○   ワー
○ ● ○    ワー
 ○  ○
  ○○
>>133
こんな所でジーコの対中国選の秘策をばらすなよ
warning
×ワーニング
○ウォーニング
136デフォルトの名無しさん:04/08/06 11:38
NULLは?
ニル
ナォ
んうるるるる
なあ、120 じゃないんだけど突っ込ませてもらうぞ

>>121
>漢字ぐらいちゃんと書け
描いてあると思うぞ

>>122
>intであふれるのは「桁」じゃねーよ
溢れるのは2進数の1“桁”
十進数だけが世の中を支配していると思ってはいけませぬ
>>136 なる
NULL ぬる
'\0'  なる
>>135
最後を「グ」って表記した時点で君の負け。
144デフォルトの名無しさん:04/08/06 13:00
>>129
具体的には?
再帰関数を使わずに再帰的な計算をするためには、
かなりの工夫が必要だと思うけど・・・。
ping = ピング
The world is mine.
The world is a mine.
>>144
>>144
末尾再帰でぐぐりなさい

具体的には、関数 f の一番初めにラベル START を作って、

f(a, f(a, b-1, c, 0), c-1, 0)

の呼び出しなら

b = f(a, b-1, c, 0);
c--;
d = 0;
goto START;

に変換
こうすれば呼び出しネスト数が稼げる
……稼げてないような気もしないでもない

これ以外の方法だと、スタックをヒープか2次記憶上に作る方法
148デフォルトの名無しさん:04/08/06 13:34
>>147
それだと、行きは出来ても帰りが出来ないような・・・。
しかも goto が出てくるし。
149デフォルトの名無しさん:04/08/06 13:45
>>148
その次の行に return があるから、戻ってくる必要ないのよ
goto でとんだ先で return すれば、元の文の return を行ったのと同じになる

ちなみに末尾再帰は遅延処理と同じ、再帰関数を高速化する手法
かなりシステムに易しいけど……C では goto を使わないと出来ない
150129:04/08/06 13:45
>>144
アホっぽく書くと
数列 A(n)=A(n-1)+1 を計算するのに,再帰を使うのはあらゆる資源の無駄。
そういう話。<アルゴリズム
最適化を言葉尻に付けないと伝わらない?

else{
  if( a+b == 0 ){ return 0;
  }else{ f(?????); }
}
さて ????? に入るのは?
>>150
いや、そのコードだと値を返さないコードパスが出てくるやん
??? に書き換えたとき間違えた…(TT

else{
  if( (a+b)==0 ){ return 0; }
  else{ return f(?????); }
}

まぁ,最終的にはcとd書き換えて,ループ回すかgotoで飛ぶかになると思うけど。
153151:04/08/06 14:12
なんだろ
  return f(a, b, f(a, b, c - 1, d), d - 1);
のコードがそれと等価なら、a + b == 0 の時に 0 が返る理由がまずわからないOTL
>>153
ごめん思いっきり訂正
ちゃんと返るわ
155151:04/08/06 14:14
おっけ、答えは
  a, b, a + b, d - 1
でFA
156129で150:04/08/06 14:22
ざんねん。
d-1も定数にできます。
そのための if( (a+b)==0 )

>>113と元ネタを書いておくテスト
157151:04/08/06 14:30
んじゃ
  a, b, a + b, 0
と言ってみる
>>140
漢字くらいちゃんと書け。
ついでに言えば、「たとえ」と「たとえば」くらい区別しろ。
159デフォルトの名無しさん:04/08/06 14:53
やったね(^_-)⌒☆
>>158
「例え」……この場合は「仮令」が正解か
間違っても「例えば」じゃないぞ
161デフォルトの名無しさん:04/08/06 15:11
結局、いくらになるんだろう。
桁数だけでも分かる方法はないのかな。
>>161
たらいまわししているだけで、あまり大きな値にはならないような気がする
>>120のソース
スタックサイズに30000000バイト用意してもおわんねえ('A`)
変換ミスっているかもしれないけど、誰かこれを実行お願い
今使ってるパソコンコンパイラ無くて

#include<stdio.h>

int f(int a, int b, int c, int d){
START:
if (b == 0)return a;
if (c == 0)return a + b;
if (d == 0) {
b = f(a, b - 1, c, 0); c = c - 1;
goto START;
}
if (a + b == 0)return 0;
c = a + b; d = 0;
goto START;
}

int main(int argc,char **argv){
printf("%d\n", f(3, 3, 65, 2));
return 0;
}
('A`)おわんない
f(3,3,65,2)→f(3,3,6,0)で
f(b,c) [a=3,d=0] が
f(f(f(f(f(f(f(f(f(f(f(0,1),1),1),2),2),3),3),4),4),5),5)
=f(f(f(f(f(f(f(f(a^3+a^2+a=39,2),2),3),3),4),4),5),5)
=f(f(f(f(f(f(蚤^x(x=1→{蚤^x(x=1→39)}+1),3),3),4),4),5),5)
=f(f(f(f(f(f(蚤^x(x=1→"10進数19桁ぐらい"),3),3),4),4),5),5)
f(f(f(f(f(f("10進数5803181603368462434桁ぐらい"),3),3),4),4),5),5)

ぬるぽ!!
(´ι _`  )
168164:04/08/06 16:34
やっぱ手元でテストできないと不便だな
すまない、164 は忘れてくれ
わっすれられないの〜
28734重の関数呼び出しまでいって撃沈した
171164:04/08/06 16:38
>>164
わすれろーわすれろー
>>111はどういう関数が欲しくてこういう再起にしたのかまったく見えてこないのは凄いと思った。
>>172
みんな当然のようにがんばってるから、もしかしてあの関数の意味が
分からないのって俺だけかと思ってたよ。

安心。
int& x という宣言を見かけたのですがこれってどういう意味なんですか?
参照、すなわち変数の別名定義のためのもの。
でもC++。
例えばint *(*(**Hoge)())();という宣言があったとしたら、
式の中で*(*(**Hoge)())()と書けばint型の値が得られる。
って具合のCの宣言の構文からは大きくはずれているんだな。
178174:04/08/06 19:02
どうもありがとうございました。
>>177
ワケワカラン(AA略
>>179
お前はVBでも使ってろよ。
>>177
そもそも
int *a; じゃなくて
int* a; って書くのが標準の
キモ言語だから仕方ない。
どうでもいい
お前らいい加減FAQまとめろよ。
何回同じ質問すれば気が済むんだ。
お前がやれ
/* >>113 と等価なプログラム */
#include <stdio.h>
int a

int g(int b, int c)
{
if (b == 0) return a;
if (c == 0) return a + b;
return g(g(b-1, c), c-1);
}

int f(int para_a, int b, int c, int d)
{
a = para_a;
if (d != 0) c = a + b;
return g(b, c);
}

/* main()は >>113 と同じ。 */

>>111,113 は、計算できないのを知ってて訊いてるような気がするな。
なにか、解答の用意があるなら教えて。
それともレポートか何か?
アッカーマン
似てるけどチョト違う。
188デフォルトの名無しさん:04/08/06 21:13
>>185
スタックサイズを大きくするか、再帰関数を使わないプログラムに書き換えない限り無理みたいです。
普通の方法だと容量おヴぇrしてしまうから。
再帰にも色々あってさ、なにも一気に全演算をしなくてもいいわけさ。
10000回の再帰でも、100段の再帰*100回(+ある程度のコスト)に帰着させられる場合も多いし。
それが帰着できないから困っているのですけど・・・・・・。
スレタイは前の
「Cなら俺に訊け」
の方がよかった。
プログラム言語じゃない方のC・・・
193デフォルトの名無しさん:04/08/06 21:41
ダッコ♪
C言語
C++言語
C#言語
Pascal言語
C言語・C++と言う奴は多くても、C言語・C++言語という奴はほとんど居ない。
C・C++と言えよぼけ、とも思うがどうでもいい。
C++は"言語"を付けなくても区別(する対象もない)がつくだろ。
とりあえず、185のg関数について考えてみる。
これを展開して行くと判るが、
g( 0, 1 ) = a; g(1,1) = a+a; g(2, 1) =a+a+a... g( t, 1 ) = (t+1)*a;
g(t,1)を g1(t) とおく。 ( g1(t) = (t+1)*aということ. )

g( 1, 2 ) = g(a, 1); g(2,2) = g1(g1(a) ) ...
g( t, 2 ) = Σ(j=1; j<=t; a^j ) =  a^(t+1) + a^t + a^(t-1) + .... + a
これを、g2(t)とおく。
g( t, 3 ) = g2( g2( g2(....g2(a)...) ))) となる。
これで明らかだが、もはや手に負えない爆発ぶりで、そもそもintの
範囲を超えるので、答えは「未定義」。
198デフォルトの名無しさん:04/08/06 23:31
scanf のあとに getchar が実行されない場合があるのを予防するために、
scanf 直後に rewind(stdin) をいれてるんですが、
これ以外の予防方法とかってありますか?
ベテランさんのウンチク待ってます。
>>198
最大の予防方法:scanf自体を使わない。
"他の方法"としては、fflush(stdin);

ただし。rewind(stdin);もfflush(stdin);も、処理系によっては動かないこともあるので注意。
staticの意味が
privateだったりreadonlyだったりコロコロ変わるのが許せません。
こんなおかしな言語体系は初めて見ました。
staticがreadonlyになるときってどんなときだ?
みなさんscanf使わないで、標準入力からの入力に何使ってるんですか?
fgets()とか?
fgets()とか
fgetcとか。
システムコールとか。




つかわねえよ
独習Cによるとgetche()と標準の入力関数とを併用すると不都合が
あるそうですがどういうことが起こり得るんでしょうか?
208デフォルトの名無しさん:04/08/07 01:47
> staticの意味が
> privateだったりreadonlyだったりコロコロ変わるのが許せません。

readonlyの意味なんかどこにもありません
209デフォルトの名無しさん:04/08/07 01:47
> システムコールとか。
> つかわねえよ

こいつ、いみわかってないでしったかぶり君
210デフォルトの名無しさん:04/08/07 01:48
> スレタイは前の
> 「Cなら俺に訊け」
> の方がよかった。

じゃあ次はおまえが作れ!
ぜったいタイミングのがすなよ!
のがしたら100たたき!
>>208
C++のstaticなクラスメソッドはメンバを書き換えられないという意味。
とか無理やり解釈してみる。
unsigned int data = xxxxx;
unsigned int mask;
mask = ((data & 0xFF000000) ? 0 : 0xFF000000)
   | ((data & 0x00FF0000) ? 0 : 0x00FF0000)
   | ((data & 0x0000FF00) ? 0 : 0x0000FF00)
   | ((data & 0x000000FF) ? 0 : 0x000000FF);

sizeof(unsigned int) が4バイトです。
dataの特定のバイトブロックが0xFFなら0に、0なら0xFFに変えて
mask に格納したいのですが、これをもっと高速に実現する
方法はありますか?皆さんのお知恵をお貸しください
そのロジックは説明文と違う気がするが。
0でもFFでもないブロックはどうなるべきだ?
214デフォルトの名無しさん:04/08/07 01:52
FAQ 1. 「あのー、scanfでうまくいかないのですが、教えてもらえますか? 具体的には...」
答え 「使うな」(おしまい)

FAQ 1. 「あのー、同じ変数がポインターだったり配列だったりするのは」
答え 「それは配列なわけではない、ポインターの指す場所の内容を得る書き方に、
配列にそっくりな[ ]を使う書き方があるだけ」
215デフォルトの名無しさん:04/08/07 01:53
>>212
bit field使えよ ぼけ
216212:04/08/07 01:58
>>213
あー、すまそです。0以外のブロックを0xFFに、でした。
>>215
ビットフィールドを使うと出来るんですね!?
不要と思って勉強を飛ばしてた箇所でした。これを機会に
勉強してみます。どうもです。
212に関連して質問だけど
unsigned intをunsigned char[4]にキャストしてバイト単位でアクセスするとエンディアンの影響受けるけど
ビットフィールドだとどうなの?
>>209
あれ、readってシステムコールの1つじゃなかったっけ?
219デフォルトの名無しさん:04/08/07 02:16
>>212
インラインアセンブラが使えるコンパイラならインラインアセンブラで書くのが最も高速かと。
220212:04/08/07 02:18
再三の間違いでスレ汚し申し訳ない…
(誤) 0以外のブロックを0xFFに
(正) 0以外のブロックを0に
221212:04/08/07 02:26
>>219
それがあいにく手元の環境と私の知識では…という
不甲斐ない状況なので、なんとか小細工しながらやってみますw
222デフォルトの名無しさん:04/08/07 02:39
>>212
unsigned int data = xxxxx;
unsigned int mask;
mask &= ((data & 0xFF000000) ? 0x00FFFFFF : 0xFFFFFFFF)
   & ((data & 0x00FF0000) ? 0xFF00FFFF : 0xFFFFFFFF)
   & ((data & 0x0000FF00) ? 0xFFFF00FF : 0xFFFFFFFF)
   & ((data & 0x000000FF) ? 0xFFFFFF00 : 0xFFFFFFFF);
三項演算子って、速度的なメリットはあまりないんだよね。
アセンブラ出力をみると、結局if-elseと変わらなかったり。
(まあ、両方定数だからjmpなしのコードに最適化されるかもしれないけど)
普通にifを使って(elseをなくす)書いた方が良い時も多々。

で、まあ、俺なら条件(0/1)に対応したテーブルを使うかな。
cmov使わないコンパイラでも、setccは使うからね。
メモリ参照になるけど、キャッシュに入っていれば分岐よりずっとマシだし。
こんな感じで。

#define maskshift(n) (((1<<8)-1) << (n))
static unsinged t24[] = { 0, maskshift(24), };
static unsinged t16[] = { 0, maskshift(16), };
static unsinged t08[] = { 0, maskshift(8), };
static unsinged t00[] = { 0, maskshift(0), };

mask = 0;
mask |= t24[(data & maskshift(24)) != 0];
mask |= t16[(data & maskshift(16)) != 0];
mask |= t08[(data & maskshift(8)) != 0];
mask |= t00[(data & maskshift(0)) != 0];
224223:04/08/07 02:43
あ、見ただけじゃ何やってるかすぐには理解しにくいから
コメント必須だよ。
unsigned char *d = (char*)&data;
unsigned char *m = (char*)&mask;

m[0] = d[0] ? 0 : 0xff;
m[1] = d[1] ? 0 : 0xff;
m[2] = d[2] ? 0 : 0xff;
m[3] = d[3] ? 0 : 0xff;

//実はこれでも分岐は無し
バイト単位で処理すると、プロセッサによっては
パーシャルレジスタストールが発生しそうで。
メモリ上だと大丈夫なのかな。
実は212が最速というオチ。
228デフォルトの名無しさん:04/08/07 03:38
>>223-224
メモリ参照になってしまっている以上、
定数利用による最適化の恩恵を受けなくなる。

普通にifで
unsigned int data = xxxxx;
unsigned int mask = 0;
if(!(data & 0xFF000000))
  mask |= 0xFF000000;
if(!(data & 0x00FF0000))
  mask |= 0x00FF0000;
if(!(data & 0x0000FF00))
  mask |= 0x0000FF00;
if(!(data & 0x000000FF))
  mask |= 0x000000FF;
普通にというならifなんて使うなよ
SDKってなんだ?
振り向かない事さ
アニキィィ
233デフォルトの名無しさん:04/08/07 05:12
ってなんだ?
寸止めキック
MaわレMEら輪な居


(゜д゜)サァ?
>>223
比較演算の結果ってコンパイラによって真値が異なるから
人に勧められるソースじゃないと思う。

>>229
なんでだ?
(a ? b : c)
より
if (a) b;
の方が処理が軽いぞ?
>比較演算の結果ってコンパイラによって真値が異なるから
>人に勧められるソースじゃないと思う。

もう一度、入門書を読んで勉強し直しましょうね。
ちゃんと>>1のリンク先にも書いてあったよ。
http://www.kouno.jp/home/c_faq/c9.html#2
>>236
処理が軽いか重いかなんぞ、標準Cには関係無い。
信じられるのは実測のみ。
で、実測の結果は?
聞いてどうする
全知全能な>>236様が各コードのアセンブラ出力と
実測結果とそれらの考察をレポートしてくれるでしょ。
まさか妄想であんな偉そうなことを書くなんて
恥ずかしいことはしてないはずだから。
仮に真のとき「1」であることが保証されるとして、

if(!(data & 0x000000FF)) mask |= 0x000000FF;

であれば直接イミディエイト値とのORですむものを、

m[(data & 0x000000FF)];

ってすると、わざわざ「&の式を評価」したあと(ifのときの手間と同じ)
「1」をレジスタに代入してからメモリ参照に行くんだよね。
245デフォルトの名無しさん:04/08/07 09:43
>>214
>(おしまい)

ということにしたいのですね
>>214
>FAQ 1. 「あのー、同じ変数がポインターだったり配列だったりするのは」
>答え 「それは配列なわけではない、ポインターの指す場所の内容を得る書き方に、
>配列にそっくりな[ ]を使う書き方があるだけ」

どっちの解釈をしても吐き出されるコードにはそれほどの違いはないのだが?
配列=ポインタと教えたいのか?
ポインタで配列の代用は出来ますが、
配列でポインタの代用は出来ません。
実体からポインタのポインタを取り出す方法ってありますか?
int foo;
&(&(foo))なんてことは出来ませんし
ポインタ(a)のポインタ(b)は、ポインタ(a)の実体が出来て
はじめて意味を持つだろ?
>>249
int n;
int *p = &n;
int **pp = &p;
しかできないぞ。何をしたいのか知らないけど。
ひょっとして

char *argv[];

のことを言ってるんじゃないか?
>>249
「実体」のポインタはありますが、「実体」のポインタのポインタはありません。
「「実体のポインタ」という実体」があるなら、「「実体のポインタ」という実体」のポインタを得ることができますが。
254デフォルトの名無しさん:04/08/07 10:39
>>249
foo にポインタのポインタがはいっているって事?
だとしたら単にキャストすれば済むんだが、違うよね。



>>254
だったら、&はつけないと思われ
>>255
254は釣りっぽ
257デフォルトの名無しさん:04/08/07 10:42
>>246
auto char sine[] = "nurupo";
auto char *afo = "galtu";
extern char wara[];
char *wara;
配列ってのはただ配列なんだから、
int a;
char *p;
p = &a;
とした場合、aは配列である、ともいえる。
ハァ?
260デフォルトの名無しさん:04/08/07 10:45
>>258
キャストしろ ぼけ
配列のように扱えるだけであって
実際には違うじゃん
http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H16a2/pm06.html
を見てたんですが、仕様に
> B 移動係数を 倍にして,A へ戻る。
とあるにも関わらずソースでは
> mvrate /= 2.0;
となっています。これは動作目的からして仕様の間違いだと思うんですが、どうなんでしょうか?
char a[100];
とした場合でも、「a」が配列なのではなくて、そこから始まるメモリのセットが配列なんだよ。
264249:04/08/07 10:51
皆様ありがとうございます。言われてみると当然のことですね。
むしろ、このようになっていないと予めプロセス空間内にポインタへのポインタへのポインタへの・・・と
無限のポインタリファレンスが存在しなければならない事になりかねませんし。
配列ってのは、使い方のことではなく、
メモリブロックの扱いのことなんだよ。
だから、スタック域だろうがヒープ域だろうがテキスト域だろうが、
特定の型が複数並んでいるという認識で使う場合、
それは配列なんだよ。
>>261
だからそれが配列なんだよ。
sizeof
>>263
char a[100];
として、
&a[0]
&a
は別物だが?
>>262
100回おきに移動係数を倍にしていけば誤差が酷くなる一方で、
いつまでたっても収束しないから仕様書側が間違ってるな。
問題を書き写した時のtypoじゃないかと推測するが…。
IPAがそんなにアホとも思えないし。
>>268
同じですが
おまいは&0[a]って書いて自己満に浸ってろ
>>268
バカハケーン
>>270
アフォですか?
>>272
&a[0] は char*
&a は char**
なんだが
論より証拠

#include <stdio.h>

int main() {
  char a[100];
  printf("&a[0]: %d\n&a: %d\n", (int)(&a[0]), (int)(&a));
  return 0;
}

>gcc tes.c

>a
&a[0]: 2293528
&a: 2293528
>>273-274
バカハケーン
277デフォルトの名無しさん:04/08/07 11:16
>>274
じゃ、これやってみろ
char **kuzu;
kuzu = &a;
値は同じでも型は違う。
279デフォルトの名無しさん:04/08/07 11:16
>>275
じゃ、これやってみろ
gets(a);
gets(&a);
今始めて気づいたが&aの仕様って

int a[10], b, *p;
p = &a;
p = &b;

みたいに配列と変数を統一的にアドレスが取れるメリットがあるんだな。
ようやくこの変態仕様の謎が解けたような気がする。
281デフォルトの名無しさん:04/08/07 11:18
>>280
キャストしろ ぼけ
>>270
ワラタ
>>275-276
本気ならオモシロすぎるぞ
>>278
バカハケーン
>>279
>> gets(&a);
tes.c:6: warning: passing arg 1 of `gets' from incompatible pointer type

あたりめぇだろ。この場合aはcharへのポインタと同義、&aはcharへのポインタへのポインタ
gets(&a[0])とすりゃ当然通るがな
>>284
おまいが赤面してるのは分かったから荒らすな
>>280
そういうときは
p = a;
だろ。
小括弧→()が関数への引数を渡すためのものだと思い込んでいるとCの随所でハマる気がする。
関数ポインタとかキャストとか。
>>287
字面を統一的に書けなくもないって話だよ。実際に書くかどうかはともかく。

>>ALL
C FAQ 6章 配列とポインター
6.12:
配列を参照することはポインターに成り下がることを考えれば、arr という配列があったとしてarrと&arrの違いは。

A:
データ型。

ANSI/ISO Cの元では&は「Tの配列へのポインター」を産み出す。これ は配列全体を指す。
(ANCI Cが誕生する前は、arrの前に&を付けるこ とは、たいてい警告を招き、たいてい無視された。)
すべてのCコン パイラで配列への(キャストのない)参照はポインターを産み出す。
こ のポインターはTへのポインターで配列の最初の要素を指す((質問 6.3, 6.13, 6.18も参照のこと)
>>289

>>280
はキャストしてないとコンパイルエラーですが何か?
>>290
warning C4047: '=' : 間接参照のレベルが 'int *' と 'int (*__w64 )[10]' で異なっています。
# Visual C++@/W3
だから配列ってのは使い方の名前なんじゃなくて
使われる対象の名前なんだってばよ。
つまり>>289自身、自分で貼ったFAQの意味が理解しきれてないと。
分かってたら型の違う物を無キャストで代入したりしないよな。
(>>280=>>289という仮定のもとに、だが)


あ、仮定が違ってる気がする
前から読み返してみると、どうも>>263に対する>>268の答えかたが著しくまずかった気がする。
メモリ位置の話の流れを汲んで読むと、>>268は&a[0]と&aのアドレスが別と言ってるように読み取れる。
>>274あたりもそう考えた上でのサンプルだろうし。
(ANCI Cが誕生する前は、arrの前に&を付けるこ とは、たいてい警告を招き、たいてい無視された。)
↑ここなんだが、
拡張子 .c ならwarningでとりあえずコンパイルは通る。
拡張子 .cpp ならエラーでコンパイルは通らない。
そして、ここは「C言語なら俺に聞け!」スレ。
>>290はC++でコンパイルしてるんだろ。
>>294自己レス
>>274あたりも→>>275あたりも
おまえら warning 出ても放っておくタイプ?
たとえば、
char a[100];
として、
char (*p1)[100];
char *p2;
を定義して、
p1 = &a; (warning 出ない)
p2 = &a; (warning 出ても無視)
と代入して、
p1++;
p2++;
の意味の違いについてどうよ?
>>298
コンパイルできないのが問題なんじゃなかったのか?w
それに実際の開発で&aなんて書く奴はいないから警告なんて発生しないだろ。
>>298
あるソフトの開発を引き継いだんだが、
ビルドしようとしたとき、warningが100個ぐらい出て泣きたくなった。
>>298
基本的に-Wall -Werrorだけど、未使用変数の警告だけはUNREFERENCED_PARAMETER()で殺してる。
ところで、ちょっとスレ違いっぽいがこのマクロはWin32専用なんだけどUNIX系ではどうやって警告殺すものなの?
殺さない
>>299
意味って言うか挙動は代わらないんじゃないの。
高度なバグ検出ツールならp1の範囲チェックをしてくれるかもしれないけど。
>>303
GTK+やXでプログラム組んでると渡されても使わない変数ってのが出てくるものじゃないの?
ひょっとすると
int foobar(int int1, int int2) {
/* int2が不要 */
printf("%d", int1);

/* 警告対策 */
int2 = 0;
return 0;
}
こうやって逃げるとか?
>>304
p1++ は p1 = p1 + sizeof(char) * 100;
になる
>>301
ホントに100個なら、楽勝。
なぜかコンパイルすら通らないソースが回ってきたことはあったが。。。
a[100]のaをポインタ変数と勘違いしている人がいるスレはここですか。
309デフォルトの名無しさん:04/08/07 12:23
定数は変数の代わりをすることはできませんが、
変数は定数の代わりをすることができます、

程度のセリフにすぎないな
310デフォルトの名無しさん:04/08/07 12:23
> 拡張子 .c ならwarningでとりあえずコンパイルは通る。

いいえ、ノーエラーで通ります。
311デフォルトの名無しさん:04/08/07 12:25
うちも警告でないなあ
> いいえ、ノーエラーで通ります。

いや、拡張子 .c ならwarningでとりあえずコンパイルは通る。
メモリやレジスタ上での変数の扱われ方を考えればすぐの答えがでるはずだけど。
314デフォルトの名無しさん:04/08/07 12:26
> いや、拡張子 .c ならwarningでとりあえずコンパイルは通る。

警告もエラーもでません
315デフォルトの名無しさん:04/08/07 12:27
> a[100]のaをポインタ変数と勘違いしている人がいるスレはここですか。

ポインター定数でしょ?
316デフォルトの名無しさん:04/08/07 12:27
> 警告もエラーもでません

コンパイラがぼけなんでしょう
ちょっと待って、トイレ逝ってくる
>>314
警告レベルは
>>317がトイレに行ってるうちに勝利宣言ニダ!チョッパリは逃げたニダ!ウリの勝ちニダ!
>char (*p1)[100];

こんな定義は面倒だからあまり使わないな…。
それが厳密なんだろうけど。
これじゃどっちもあらしと変わらんなぁ
322デフォルトの名無しさん:04/08/07 12:33
char (*p1)[100];
char a[100];

p1 = &a;

ノーエラー、ノー警告
警告でるコンパイラーにおめにかかりたい
scanfの話をしないだけマシと思え
324デフォルトの名無しさん:04/08/07 12:34
> UNIX系ではどうやって警告殺すものなの?

そもそも出るようなコードかかないので平気
>>302
#define UNREFERENCED_PARAMETER(P) { (P) = (P); }
なんてdefineされてるだけだな。
lint用にもなってるし、
(void)(P);なんてのが書けない頃からあるのかな。
なんか、骨董品て漢字だね。
char *p = "0123"+4;
printf("%s", p);
>>320
厳密か厳密じゃないかということではなくて、
char (*p1)[100];
char *p2;
これらはそもそも意味が違う。

charのsizeを1とするなら、
p1++ が p1 += 100;
p2++ が p2 += 1;
で、
p2の意味で使いたいなら、
p2 = a; または p2 = &a[0];
と書くだろ?
p2 = &a;
はおかしいって話。(そう書くヤシがいるかいないかは別問題。)
>>322
おい、おおぼけ。いつの間に話の対象コードをすりかえてんだよ。
>>280がCで警告出るという話だったんだろうが。勝手に>>299と混ぜるなよ。
>>328

>>280 がCで警告が出るかどうかは環境依存らしい。

>>289
ANSI/ISO Cの元では&は「Tの配列へのポインター」を産み出す。これ は配列全体を指す。
(ANCI Cが誕生する前は、arrの前に&を付けるこ とは、たいてい警告を招き、たいてい無視された。)
すべてのCコン パイラで配列への(キャストのない)参照はポインターを産み出す。
こ のポインターはTへのポインターで配列の最初の要素を指す((質問 6.3, 6.13, 6.18も参照のこと)
お前らC FAQなら俺に聞けスレでも立ててここから出て行け
>>310=>>314=>>322でしょ。問題にしてるコードが違うのに何言ってんだって話なんだけど。
夏だな
ノーエラーでフィニッシュです。
314 じゃないけど一応書いておきます。
みなさん適当に実行してください。

#include <stdio.h>

int main(void)
{
char a[100];
char *p;
char (*pp)[100];
char *p2;

p = &a[0];
pp = &a;
p2 = &a; /* warning */

printf("p = %08X, pp = %08X\n", p, pp);
p++;
pp++;
printf("p = %08X, pp = %08X\n", p, pp);

return 0;
}
>>334
直張りする

C:\DOCUME~1\Owner\デスク~1\未整理>gcc --version
gcc (GCC) 3.3.1 (mingw special 20030804-1)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

C:\DOCUME~1\Owner\デスク~1\未整理>gcc test.c
test.c: In function `main':
test.c:12: warning: assignment from incompatible pointer type

C:\DOCUME~1\Owner\デスク~1\未整理>gcc test.c -Wall
test.c: In function `main':
test.c:12: warning: assignment from incompatible pointer type
test.c:14: warning: unsigned int format, pointer arg (arg 2)
test.c:14: warning: unsigned int format, pointer arg (arg 3)
test.c:17: warning: unsigned int format, pointer arg (arg 2)
test.c:17: warning: unsigned int format, pointer arg (arg 3)

C:\DOCUME~1\Owner\デスク~1\未整理>a
p = 0022FF18, pp = 0022FF18
p = 0022FF19, pp = 0022FF7C
警告
(14): warning C4313: 'printf' : 書式文字列内の '%X' が '<不明>' 型の引数 2027955116 と競合しています。
(12): warning C4047: '=' : 間接参照のレベルが 'char *' と 'char (*__w64 )[100]' で異なっています。
(17): warning C4313: 'printf' : 書式文字列内の '%X' が '<不明>' 型の引数 2027955116 と競合しています。
(14): warning C4313: 'printf' : 書式文字列内の '%X' が '<不明>' 型の引数 2027957036 と競合しています。
(17): warning C4313: 'printf' : 書式文字列内の '%X' が '<不明>' 型の引数 2027957036 と競合しています。

実行結果
p = 0212FE6C, pp = 0212FE6C
p = 0212FE6D, pp = 0212FED0
Press any key to continue

Visual C++
336に書き忘れ。

/W3
338デフォルトの名無しさん:04/08/07 13:54
>>331
っていうか、違う話してたのはおまえのほうだろうが
339デフォルトの名無しさん:04/08/07 13:55
%X なんかふつうつかわねーよ ぼけ
%xか%08xとかだろ?

もしくは %p
340デフォルトの名無しさん:04/08/07 13:56
Cで16進を大文字で書くやつはぼけ
341デフォルトの名無しさん:04/08/07 13:56
> /W3

ふつう -W3
(わたしは-W4か-Wxだが)
藻前はVCのWallで氏ね
-W4
にしといた方が良いって聞いたことあるんですけど・・・
344デフォルトの名無しさん:04/08/07 14:26
>>341
通は-W0で完璧なコードを書く
345デフォルトの名無しさん:04/08/07 14:45
>>343
ふつうそうだね。
っていうか、それ以前にVCなど使うやつはぼけ
346デフォルトの名無しさん:04/08/07 14:55
コンパイラをひょいひょい変えられる香具師がうらやますい
世間一般そんなに甘くない
-W4 がいいっていう話が載ってるサイトってありますか?
348デフォルトの名無しさん:04/08/07 15:01
> コンパイラをひょいひょい変えられる香具師がうらやますい

ふつうひょいひょいかえねーよ ぼけ
かえないからこそVCだめなわけ。わかる?
349デフォルトの名無しさん:04/08/07 15:01
-W4より-WxだなあVCなら常識
オプションのよしあしについて書かれたサイトってありますか?
351デフォルトの名無しさん:04/08/07 15:07
>>348
全然わかんねー(プ
おめーヴァカ?

「だめ」の理由言ってみな
>>351
>>348には複雑すぎて使えないんだろ ぼけ
353デフォルトの名無しさん:04/08/07 15:13
ふつうcc
354デフォルトの名無しさん:04/08/07 15:27
VCたしかにだめだね。
「//」が使えるかのようにかいてあるが、
また、改行をLFだけにしてもうごくようにみえるが、
実はその両方を同時にだと混乱してエラーでまくりになる。ぼけすぎ > VC6
"Visual" C++である以上、
IDEからの利用を想定してるだろう・・・
IDEでもLFだけにできなかったっけ?
DOS窓で画像使うことってできるの?
標準じゃないかな?(´・ω・`)
>>357
98なら出来るよ。
自分でcmd.exeのフロントエンド作れ
>>358
MEじゃ無理?
できるならやり方ググッてきて分からなかったら質問します。
ずいぶん流れちゃったけど、一応おバカな>>236==>>243につっこみ。

>仮に真のとき「1」であることが保証されるとして

「仮に」じゃなく、「どんなコンパイラでも」「常に」であると指摘されているのに
理解できないのですね。

>if(!(data & 0x000000FF)) mask |= 0x000000FF;
>
>であれば直接イミディエイト値とのORですむものを、

「分岐予測ミス」とか「パイプらインストール」という言葉を聞いたことが無いのですね。
メモリ参照と分岐予測ミスのどちらを避けるかというだけの話でしょ。
一般には、頻繁に参照されるメモリへのアクセスのほうが、
ある程度予測をミスする可能性のある分岐よりは、速くなるけどね。

でも、私はあなたと違って、実測しないとどちらが速いかは断定できませんが。
パイプらインストール
363デフォルトの名無しさん:04/08/07 17:55
すでにどっかで質問されてたらスマソ。

初めてC言語をやってみようと思ってパソコンにダウンロードしてやってみました。
プログラムを作ってみてコンパイルしてみたら
インクルードファイル 'stdio.h' をオープンできないって言われました。

これはどういうことですか?インクルードファイルってものがないのでしょうか。
364デフォルトの名無しさん:04/08/07 17:58
>>363
・パスがきちんと設定されていない
・インストールミス
初心者/環境依存スレで何度も何度も何度も同じ質問が出てると思うよ。
366デフォルトの名無しさん:04/08/07 18:07
PATH=%PATH%;C:\BORLAND\BCC55\BIN
LIB=C:\BORLAND\BCC55\LIB
INCLUDE=C:\BORLAND\BCC55\INCLUDE

と設定して、INCLUDE、BIN、LIBっていうディレクトリもそこにちゃんとあるのですが

ならインストールミスになるんですかね
http://www.borland.co.jp/cppbuilder/freecompiler/devsupport.html

それと、続きはこっち
http://pc5.2ch.net/test/read.cgi/tech/1091264964/l10

ちゃんとスレ内だけでもCTRL+Fしてからな。
>>360
98ってのは、Windows98のことじゃなくて、
PC-98シリーズのってことね。
98版ウィンドウズでも対応してたはず。
16bitでSVGA-BIOS叩けば出来るとは思う。MEだし。


やりたくないけど。
370デフォルトの名無しさん:04/08/07 19:14
>367
ありがと。

けどやっぱし出来ないです。才能ねぇなぁ。こっち方面には向いてないのかな…
>>368
さんくす
x = (a ? b : c);
これって分岐含まないのですか?
>>372 どっちともいえない。
>>372
含みます
まあ、演算子だからな。
制御文とは違う。
>>374
そもそも「分岐含む」の意味自体不明なのに、何を根拠にそう言えるのですか?
>>376
馬鹿から根拠の無い自信を奪ったら廃人が残るだけですよ。少しは察しなさい。
質問スレで根拠の無い回答をするような迷惑な馬鹿はいっそ・・・
379374:04/08/07 22:24
すまねぇ_| ̄|○
ただ単にコードを見た途端に、脳内でアセンブラに変換されただけ
確かにそれは C では条件分岐じゃない
脳内でも最適化は掛けろよ。
ほんとだ、確かに消えた
逝ってきますねOTL
>>381
aが静的に分かれば消える。そうでないなら分岐する。
まぁ条件付きmoveとかあればそれになるかも知れないが。
相変わらずレベルの低いスレだな。
アセンブラの出力見れば一発なのに
なんでこんな何十レスも引っ張ってるんだ。
>382
一応突っ込んどくと
最適化で分岐命令をなくすために
定数であることが望まれるのは、bとcな。
で、変数であっても、条件付きmoveで分岐をなくせる場合がある、と。
>>384
真性?
マンコ演算子
>385
x = (a ? b : c);
の場合だろ?
何かおかしいか?

あ、おまえの頭か。すまんすまん。
>>383

>>212 あたりからだから、170レス超えてる
途中>>246-356あたりは、「配列とポインタ」「警告オプション」の話題。
ま、レベル的には同じようなものかも。
390デフォルトの名無しさん:04/08/08 00:40
さらしあげ
391デフォルトの名無しさん:04/08/08 01:35
> IDEからの利用を想定してるだろう・・・

ここいらでもうだめすぎ
392デフォルトの名無しさん:04/08/08 11:06
exit関数でプログラムを強制終了すると開いてあるファイルはすべて閉じられるそうですが、
malloc関数や、realloc関数類などのメモリ確保関数で確保したメモリ領域もexit関数を実行
すると解放されるのでしょうか?
それともexit関数で終了する時もfree関数は必要ですか?
393デフォルトの名無しさん:04/08/08 11:12
自動で解放されます。
freeはしなくても開放されます。
ただ、exitで終了しないときに、
色々トラブルの元になるのでfreeはしろ。
>>393-394
ありがとうございます。
ちゃんと解放されるみたいですね。
>>394
嘘を教えないように。
まあ、自動で解放するとしても、可能な限り free しておくのが吉ってことだ
警告 W8004 HIMITU.cpp 111: 'HOGE' に代入した値は使われていない(関数 main() )

HOGE=100; で宣言したんですけどほんとにHOGEに代入されていないの?
HOGE += HOGE * i でインクリメントしています。
必要なデータをfreeしちゃうバグが入り込む確率が上がる
自動で解放される処理系も結構あるらしいな。
規格にあるわけじゃないので、全部が解放してくれるわけじゃないが。
物事には全て対称性というものがあるんだよ。
openとclose, mallocとfree, ちんことまんこ。
この対象性を無視すると人類は絶滅する。
対称性の破れがあってこそ、この世は物質が安定に存在していられる。
(゚д゚≡゚д゚)
404デフォルトの名無しさん:04/08/08 12:37
> freeはしなくても開放されます。

漢字ぐらいちゃんとかけよ ぼけ
405デフォルトの名無しさん:04/08/08 12:39
> まあ、自動で解放するとしても、可能な限り free しておくのが吉ってことだ

こいつしったかぶりのぼけ。
406デフォルトの名無しさん:04/08/08 12:39
> 自動で解放される処理系も結構あるらしいな。

こいつもしったかぶり
規格で規定されています。
>>406
ANSI-Cから?C89,C99から?
見た所では規定されてないような書き方だったんだが…
規格で規定 規格で規定 規格で規定 規格で規定 規格で規定
規格で規定 規格で規定 規格で規定 規格で規定 規格で規定
規格で規定 規格で規定 規格で規定 規格で規定 規格で規定
規格で規定 規格で規定 規格で規定 規格で規定 規格で規定
規格で規定 規格で規定 規格で規定 規格で規定 規格で規定
409デフォルトの名無しさん:04/08/08 13:25
> ANSI-Cから?C89,

なーんてまぬけなことを言っているやつが (どう違うのかわかってるのだろうか?)

> 見た所では規定されてないような

なんてかいても「読んでもいない」ことがばればれ
410デフォルトの名無しさん:04/08/08 13:25
おまえらCの標準規格ぐらいよんどけ。安いんだし
プログラム終了前のfreeは何度か論議されているが
まともなOSであれば開放するので書かないというのが大多数
そして、freeしろという人は明確な理由を書けない
>>409
規格を読んだんじゃなくて、どっかのページだ。
規格は読んでない。
413デフォルトの名無しさん:04/08/08 13:34
> まともなOSであれば開放するので書かないというのが大多数

っていうか、おまえがまずまともに日本語書けよ ぼけ
414デフォルトの名無しさん:04/08/08 13:35
> 開放するので

しません
ぼ  けはスルーで。
416デフォルトの名無しさん:04/08/08 13:36
> 規格を読んだんじゃなくて、どっかのページだ。

内容以前に、ANSI-Cと、C-89とかいてあるが、どうちがうのか知ってるのか? ぼけ
417デフォルトの名無しさん:04/08/08 13:37
じゃあ415はスルーってことになるな
ANSI-C == C89です。書き間違いです。
はい、すいません。
419デフォルトの名無しさん:04/08/08 13:38
boke: n 《俗》 鼻 (nose).
bike: vi, vt ゲッ[ウェッ]とやる, 吐く, げっぷをする.
n 嘔吐, げっぷ.
Bo・ker /buk(r)/
n. ボーカー George Henry Boker (1823-90) 《米国の詩人・劇作家・外交官;
400 点のソネットと, 南北戦争以前の最高の悲劇 Francesca da Rimini (1855) で認められた;
南北戦争で, 北部のために情宣活動をし, 戦後, トルコ (1871-75), ロシア (1875-78) 駐在の大使をつとめた》.
420デフォルトの名無しさん:04/08/08 13:39
はあ? じゃあC89以降のはANSIじゃないってわけ?
421デフォルトの名無しさん:04/08/08 13:40
bike->bokeの書き間違いだった
422デフォルトの名無しさん:04/08/08 13:40
三週間以上こんなのが続くのか・・・
423デフォルトの名無しさん:04/08/08 13:41
1はvoidか?
424とほほ:04/08/08 13:41
>>422
え、ここって規格と仕様のスレなんだとてっきり
こんなの以外にどういう展開がお好みで?
425デフォルトの名無しさん:04/08/08 13:42
>>423
いやちがうはず
426デフォルトの名無しさん:04/08/08 13:43
> 三週間以上こんなのが続くのか

っていうか、ここ80スレほどこういうの続いているじゃん。
いまさらその伝統を壊す気?
>>420
C99はISOだけじゃなかったか
428デフォルトの名無しさん:04/08/08 13:47
ISOできまってからそのまんままるまるANSIにとりいれられたんだよ。
C89のときと逆!
>>426
お前が伝統を重んじるとは、失笑を禁じえない。
430デフォルトの名無しさん:04/08/08 13:48
>>425
でも、
1 :main(void) :04/08/02 22:12
と、さりげなく書いてある。
431デフォルトの名無しさん:04/08/08 13:49
それいぜんにC89以降、C89になるまで
1回も改訂や追補がなかったと思ってるのか? このぼけは
432デフォルトの名無しさん:04/08/08 13:50
>>430
なわけない。

そもそも
> Cプログラマ必読 ・プログラミング言語C(通称 K&R)

この「K」の前の文字は、voidならぜったい書かない。
大きい改訂はそれぐらいだと把握しているが
>>432
全角スペースか?
435デフォルトの名無しさん:04/08/08 13:51
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

この文の空白も彼ならあり得ないな。分かち書き嫌いみたいだし
436デフォルトの名無しさん:04/08/08 13:52
>>433
すくなくとも2回はあるぞ ぼけ
437デフォルトの名無しさん:04/08/08 13:53
>>432 >>435
おまえら、細かいところばかり見るなあ...。

それ以前に考えて見ろよ。スレッドのタイトルは1が決めるんだろ?
voidやその手下(? 信者?)が、
> C言語なら俺に聞け! Part 88

などと書くわけねーじゃん。
細かいところ見るまでもない。
438デフォルトの名無しさん:04/08/08 13:55
「言語」がいけないのか? それを抜けばいいのか?
じゃあ、次に89を作るときには、おれが「言語」を抜いたのにしてやろう。

(ちなみに、いままで88回中、6回は俺が1だった)
439デフォルトの名無しさん:04/08/08 13:56
> > Cプログラマ必読 ・プログラミング言語C(通称 K&R)
> この「K」の前の文字は、voidならぜったい書かない。

そうだな。それに、その場合の括弧の前には空白空きそう。
へぇ 6回もスレ立ててるんですか へぇすごいですね
>>438
俺は3回ぐらいだなぁ
442デフォルトの名無しさん:04/08/08 13:58
>>439
細かいな...。
おまえらvoid研究家か?

ある意味voidファン?
その能力を生かして SPAM フィルタ作ってくれ マジで
>>436
AM1, TCOR1/2のことか?
445デフォルトの名無しさん:04/08/08 14:02
じゃあ、おまえもつぎは「言語」ぬいてみろ > 441
void信奉者とまちがえられてふくろだたきにあう...かもな。

「聞け」がちょっといやだなあ。変えたい。
446デフォルトの名無しさん:04/08/08 14:07
なんで「C言語」だとだめなんだ?
447デフォルトの名無しさん:04/08/08 14:08
>>446
少しは自分の頭で考えろ!
厨が多いスレだな
449デフォルトの名無しさん:04/08/08 14:08
>>446
規格票読め!
C, the Programing Languageだから
451デフォルトの名無しさん:04/08/08 14:18
Shadow of Your Smile, The

Taste of Honey, A
>>450
ならCじゃん
>405 名前: デフォルトの名無しさん 投稿日: 04/08/08 12:39
>> まあ、自動で解放するとしても、可能な限り free しておくのが吉ってことだ
>
>こいつしったかぶりのぼけ。

こいつら気に入らない。
で、どっちがいいの?
C言語の範囲で自動で解放されると決まっているわけじゃない。
解放されるかどうかはOSや処理系依存。
あとはOSや処理系依存のコードを書くか。
依存しないコードを書くか好きにしろ。

456デフォルトの名無しさん:04/08/08 14:59
C言語では決まっていないかもしれないが、
Cでは決まっている。
じゃあ、ファイルはオープンしたまま、
mallocはfreeしないってことでOKですね。
458デフォルトの名無しさん:04/08/08 15:08
当然です
459デフォルトの名無しさん:04/08/08 15:08
たとえばstdinを閉じるひといますか?
あれなんかopenさえしないじゃん
>>457-459
このレビューは参考になりましたか?
◎はい ○いいえ
○はい ◎いいえ
462デフォルトの名無しさん:04/08/08 15:17
>>457
確保したものは開放しろ。
これ常識。
463デフォルトの名無しさん:04/08/08 15:22
OSが解放してくれるから、
デバイスコンテキストもGDIオブジェクトも、
確保したままプログラムを終了すべき。
>>456 意味不明。
>>459
自分でopenしないものは自分でcloseしない。
自分でopenしたものは自分でcloseする。
自分で確保したものは自分で解放する。
常識です。
466デフォルトの名無しさん:04/08/08 15:28
いいえしません。
467デフォルトの名無しさん:04/08/08 15:29
そもそも終了が遅くなるのでいや
後片付けのできないガキどもめ
エディタってメモ帳じゃ駄目ですか?
>>469
「メモ帳」というWindowsアプリケーションでもいいです。
>>470
え?
たとえば異常終了など、プログラム中のexitの直前にopenやmallocを
開放するコードを書く奴はいるのか?
462とか465はそんな馬鹿な事をやっているんだろうな
473デフォルトの名無しさん:04/08/08 15:43
>>472
漢字ぐらいちゃんと書いてからえらそうなこと言えよぼけ
474デフォルトの名無しさん:04/08/08 15:44
よくみたら「〆モ帳」だったりしませんか?
>>473
反論できないからって・・・情けない。
476デフォルトの名無しさん:04/08/08 15:46
反論するまでもないとおもわれたんだろ
477462=465:04/08/08 15:46
>>472
malloc したら必ず atexit していますが、
何か?
>>477
馬鹿ですね。
freeしない奴はメモリリーク検出ライブラリの存在を知らないアホ
>>477
atexitには関数のポインタしか渡せないけど、どうやって解放対象を指定するの?
>>479
ちょっとまて
お前は何の話をしているのかわかっているのか?
メモリリークは関係無いぞ
>>481はメモリリーク検出ライブラリの存在を知らないアホ
>>482
マジで言ってるのか釣りなのか
実行開始時にプロセスごとにヒープ領域が割り当てられて
終了時にそれがまるごと捨てられるんであれば、
実行中に取得したメモリは自分で解放する必要ない罠
>>482
馬鹿ですね。
>>472
異常終了はしゃーないが、せめて正常終了するときくらいは書いとけよ
プログラムなんてどこで落ちるか分かんないんだから、全ての場合を考えるのは“無理・無駄”
>>486
書いて何かメリットあるの?
>>486
ヒープごと解放する手間と、確保したメモリブロック単位で解放する手間を考えると
後者はかなりの無駄と思えるが。
自己満足だけです。
だから後片付けはOSがしてくれるんだってば
自己満足という理由以外で
誰かfreeしない人たちを納得させる説明できませんか
自己満足だけです。
一瞬で終わる物ならいいが、何ヶ月も動きつづけるサーバプログラムで確保したメモリを解放しないと
メモリ上にゴミが増えすぎて最終的に破綻するから
プログラムの性質によるんじゃない?
単純に流れ作業実行したら終了、みたいなのだとfreeしなくてもいいけど、
ずっと無限ループして基本的に終了しないプログラムならfreeすべきだろ。
freeしなかったらプログラムを部品化できなくなるだろ。
かぶったな
>>491

468「後片付けのできないガキどもめ 」
491「だから後片付けはママがしてくれるんだってば 」

w
exitの前の話じゃなかったのか?
main関数のみで済ませるので問題ありません
>>494
それはあなたの想像での話ですか?実際にあった話ですか?
まあ、あれだな。
どんなプログラムか、という前提を抜きには語れないってことだ。
freeしないのは
・趣味的プログラミング
・小規模開発
・個人使用のプログラム
・一人で開発
・メガネでぶ or がり
・引き篭もり
・オタ
>>503
俺全部に当てはまるがちゃんと free してるぜ
このスレは参考になりましたか?
◎はい ○いいえ
>>501
そんなもんは実際にありますよ。
もっとも、最近はそういう分野ではCを使うことは減ってますが。
>>506
freeするプログラムとしないプログラム、違いはありましたか?
ここは違いの分かるインターネッツですね
freeするプログラムがエラー等で不意に落ちる確率の方が
freeしないことによるメモリリークで落ちる確率より高い罠
夏だな
511462=465:04/08/08 16:18
>>480
void *ptrtbl[32];
int ptrtblnum;

#define DeclAtExitProc(n) void _USERENTRY AtExitProc ## n(void){free(ptrtbl[n]);}

DeclAtExitProc(0) DeclAtExitProc(1) DeclAtExitProc(2) DeclAtExitProc(3) DeclAtExitProc(4)
DeclAtExitProc(5) DeclAtExitProc(6) DeclAtExitProc(7) DeclAtExitProc(8) DeclAtExitProc(9)
DeclAtExitProc(10) DeclAtExitProc(11) DeclAtExitProc(12) DeclAtExitProc(13) DeclAtExitProc(14)
DeclAtExitProc(15) DeclAtExitProc(16) DeclAtExitProc(17) DeclAtExitProc(18) DeclAtExitProc(19)
DeclAtExitProc(20) DeclAtExitProc(21) DeclAtExitProc(22) DeclAtExitProc(23) DeclAtExitProc(24)
DeclAtExitProc(25) DeclAtExitProc(26) DeclAtExitProc(27) DeclAtExitProc(28) DeclAtExitProc(29)
DeclAtExitProc(30) DeclAtExitProc(31)

void (* _USERENTRY atexitproctbl[32])(void) = {
AtExitProc0, AtExitProc1, AtExitProc2, AtExitProc3, AtExitProc4,
AtExitProc5, AtExitProc6, AtExitProc7, AtExitProc8, AtExitProc9,
AtExitProc10, AtExitProc11, AtExitProc12, AtExitProc13, AtExitProc14,
AtExitProc15, AtExitProc16, AtExitProc17, AtExitProc18, AtExitProc19,
AtExitProc20, AtExitProc21, AtExitProc22, AtExitProc23, AtExitProc24,
AtExitProc25, AtExitProc26, AtExitProc27, AtExitProc28, AtExitProc29,
AtExitProc30, AtExitProc31, };

void *MyMAlloc(int z)
{
void *p;

if (p = malloc(z)) ptrtbl[ptrtblnum] = p, atexit(atexitproctbl[ptrtbl]), ptrtbl++;
return p;
}
mallocでメモリリークなんてあんの?
プログラムが終了してもメモリが確保されたまんま?!
>>512
というような処理系があるかもしれない。
ねえよ。
>>514 そーでもないかも
>>512
だから、終了しないプログラムの話をしてるんだろうが。
>>516
exitの前のfreeが必要かどうかの話なのに何故・・・
夏だから
501=507=512=517 でつか?
>>519
それだけではありません。
free しない派って、
「極端にレベルが高い奴」と、
「極端にレベルが低い奴」の
2通りいるし、

free する派は、
「凡庸な奴」か、
「先生にそう言われたから無批判でやっている」か、
「ただの偏執狂」かの
何れかだからな。

こんな奴らが集まって議論しても
話がかみ合わないのは当たり前だな。
そんなに沢山いなくて、2〜3人のような気がする
>>516-517
なんか前提が混乱しとるな
>>392からの流れだからなぁ
既に 100 近いレス消費しているのか……
夏だな
>>525
それなりに面白いネタだからな。
こんな素敵なネタを発見してくれた太田先生に乾杯。

また何か面白いネタを見つけれくれないかなぁ。
毎度毎度よく釣られること
     ____
    /∵∴∵∴\
   /∵∴∵∴∵∴\
  /∵∴∴,(・)(・)∴|
  |∵∵/   ○ \|
  |∵ /  三 | 三 |  / ̄ ̄ ̄ ̄ ̄
  |∵ |   __|__  | < うるせー馬鹿!
   \|   \_/ /  \_____
      \____/
530デフォルトの名無しさん:04/08/08 18:50
昔から気になっていたんですけど、複数のメモリ領域を確保する必要が生じた場合ってどうしますか?
型が複数の場合とか。

if ((ary1 = malloc(Type1Max*sizeof(Type1))) == NULL) { exit(0);}
if ((ary2 = malloc(Type2Max*sizeof(Type2))) == NULL) { free(ary1); exit(0);}
・・・・・・
if ((aryn = malloc(TypenMax*sizeof(Typen))) == NULL) { free(ary1); ・・・, free(aryn_1); exit(0);}

みたいな場合です。
何に対して「どうしますか?」と聞いているのかが分からない
>>530
それでもいいし、こんなのもある
arr1=arr2=arr3==NULL;
if((arr1 = malloc(1))==NULL) goto error;
if((arr2 = malloc(2))==NULL) goto error;
if((arr3 = malloc(3))==NULL) goto error;
return; // succ
error:
free(arr1);
free(arr2);
free(arr3);

やり過ぎたければ
if((arr1 = malloc(1))==NULL) goto error1;
if((arr2 = malloc(2))==NULL) goto error2;
if((arr3 = malloc(3))==NULL) goto error3;
return; // succ
error3: free(arr2);
error2: free(arr1);
error1:
exit前でもfreeやfcloseしないとおかしくなるbugが
Winであったような…。
巨大なファイルを作ったまま削除されないとか、そんなやつ。
もうそのネタは終わってるから。
535デフォルトの名無しさん:04/08/08 20:05
malloc前にfreeしたら動作がおかしくなりませんか?
>>535
free(0)は問題なし。
532の上は ==NULL を =NULL にすれば問題なし。
537デフォルトの名無しさん:04/08/08 20:08
NULLを入れておけば大丈夫
538デフォルトの名無しさん:04/08/08 20:13
>>536-537
free(NULL)は問題を起こさないんですね。ありがとうございます。
volatileをK&Rで調べたのですが意味不明のことしか書いてありませんでした。
なんやねんこれ。
>539
volatile は「なんやねんこれ」等と
言っている奴が使うものじゃないから
安心しな。
忘れてかまわんぞ。
>>540
知らないなら無駄だから反応しなくていいです
煽ったら答えが沸いてくると思ったら大間違いです:)
543539:04/08/08 20:49
>>540
コンパイラに“最適化(による変数削除の)阻止”の指定を行うということは理解しています。
問題は、K&Rで全く説明がなされていない点です。
いやしかし、手を変え品を変え荒らし続けるもんだな。
  ヘ( `Д)ノ  モーコネーヨ ウワァァァン!!
≡ ( ┐ノ
:。;  /
>>543
volatile は
「意味不明のことしか書いてありませんでした」

「全く説明がなされていない」
が "同じ" と考える奴が使うものじゃないから
安心しな。
忘れてかまわんぞ。
>>546
ではあなたは、あの説明でvolatileの意味が説明されていると、そう謂われるわけですね?
>>547
volatile は
>>546 の前提から >>547 の結論を
導き出せる奴が使うものじゃないから
安心しな。
忘れてかまわんぞ。
549547:04/08/08 21:07
>>548
とりあえず、あなたのマヌケなレスは安心して忘れることにします。
ありがとうございましたマヌケ。






























A8.2の説明である程度分かると思うが>volatile
つってもK&Rは全く予備知識が要らないわけじゃないから
分からないこともあるかもしれないが。
>550よくやった。
typedef struct {
char usragent[STATUS_LEN];
char refere[STATUS_LEN];
}PROFILE;
↑file1.h

PROFILE loadprofile(void)
{
PROFILE pfile;
/* いろいろな処理 */
return pfile;
}
↑file2.c

int main(void)
{
PROFILE pfile;

pfile = loadprofile();

return 0;
}
↑file3.c
554デフォルトの名無しさん:04/08/08 22:31
上記のfile3.cのpfile = loadprofile();のところで
代入する変数の型が違うというエラーが出て
コンパイルできません。
何故?
>>555
漏れの環境だと通るけど。
変なオプションとか設定してない?
>554 なぜなら file3.c だと loadprofile() は int だとされるからだ
includeし忘れてるならPROFILE pfileで止まりそうな気が
即レスありがとうございます。
環境はcygwin,gcc3.3.1でオプションは何も指定してないです。
違う。
file1.hをincludeしても、loadprofileは宣言されてていない。
プロトタイプ宣言が問題とされている。
>>556
そう思って(PROFILE)とキャストしてみたんですけど
そういうキャストは出来ないとコンパイラに言われました。
PROFILE loadprofile(void);
を file1.h に書けばいい希ガス
6匹
釣れた
お騒がせしてすいません。
>>559の言うとおりプロトタイプ宣言忘れてました。
無事コンパイルできました。
ありがとうございました。
VxWorksとかでプログラミングしてたら、taskを終了する前に
mallocしたものは当然freeするよな。

OS非依存とか言うわりには、無意識のうちになんらかのOSを
前提としているんだろうな。
567デフォルトの名無しさん:04/08/09 04:49
> free(NULL)は問題を起こさないんですね。ありがとうございます。

BSDではたまたま問題ないが、SystemV系ではcore dumpする。
(ってちょっと古いか)
568デフォルトの名無しさん:04/08/09 04:49
> 問題は、K&Rで全く説明がなされていない点です。

カーニハンもよくわかっていないのでしょう ;-)
569デフォルトの名無しさん:04/08/09 04:52
> VxWorksとかでプログラミングしてたら、

で、それなに?
どうでもいいようなマイナーなものを出せばごまかせるとでも?
>>569
おめーそれぜんぜんまいなーじゃねぇよ
>>569
充分メジャー。
おまえが知らんだけだ。
taskの終了とexitとは微妙に違うと思うな
釣り針マダー?
>>573
575デフォルトの名無しさん:04/08/09 11:10
> taskの終了とexitとは微妙に違うと思うな

いいえ同じです
576デフォルトの名無しさん:04/08/09 11:14
abort って exit ?
kill したら task 終了だけど exit ?

教えてえらい人
577デフォルトの名無しさん:04/08/09 11:48
教えません
coreダンプ吐いて落ちるときもexit?
>>576
何を言ってるのかさっぱりだが
スレ違いなのは確かなようだ。
580デフォルトの名無しさん:04/08/09 12:25
coreダンプは吐きません
coreなら吐きます
そんな揚げ足鳥はいいから
coreメモリイメージをダンプしたものだからcoreダンプでいいんでは
頭痛が痛いみたいな
ダンプを吐くのがおかしいってアゲアシトリだろ
アゲ厨に釣られるな
ところで、未だに秋葉原で「磁気コア」が売られているのは
一体どういう訳なのだろうか。

やっぱり未だに「需要がある」ということなのか?
8インチFDのデータが残ってるところもある(´д`)
実用的な記憶媒体としては意味無いけど、歴史的な記憶媒体を見てみたいとは思う。
高くないんだったら、真空管・トランジスタ・磁気コア・リレーとかの記憶媒体が欲しい。
中途半端に古い媒体は要らない。
590デフォルトの名無しさん:04/08/09 19:46
プログラムの実行速度を計測したいのですが、
time_t型の値を使ってtime();で秒数を代入しました。
time()の戻り値が整数のため
difftimeで差を求めると、ほとんどが「0秒」になってしまいます

プログラムの実行速度を求める方法で
良い方法はないでしょうか?
環境書け
>>590
環境と、今のソース貼ってみろ。な。
戻り値が整数なのは理由にならんよ。
593590:04/08/09 19:56
>>591
FreeBSD5.2上です。
ご迷惑をおかけします。

$gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.3.3 [FreeBSD] 20031106
ちなみに、VC++のtime_tは64bit整数(__int64)です。
gettimeofday
596590:04/08/09 20:05
>>595
「gettimeofday」をキーワードにググったら
下記のサイトを見つけ、大変参考になりました
http://www.super-computing.org/sr8000/timer.html

皆様ありがとうございました。
597デフォルトの名無しさん:04/08/09 22:48
> coreメモリイメージをダンプしたものだからcoreダンプでいいんでは

いいえ、coreをダウンしたファイルはcoreです
598デフォルトの名無しさん:04/08/09 22:49
ダウン->ダンプ
599デフォルトの名無しさん:04/08/09 22:50
> 実用的な記憶媒体としては意味無いけど、歴史的な記憶媒体を見てみたいとは思う。

うちでは大根おろし器にしてます > こあめもり
K&Rの5.11、P.145に載っているプログラムに

qsort((void **) lineptr, 0, nlines-1,
 (int (*)(void *,void *))(numeric ? numcmp : strcmp));

という文がありますが、この二行目は何をしているのでしょうか。
型キャスト?
「戻り値がintで、void*引数を二つとる関数」ポインタへのキャスト
三項演算子でqsortに渡す関数を選択してる


わかりにくッ
int (*fp)(void *, void *);
fp = numeric ? numcmp : strcmp;
のfpを使ってるだけ。これだと分かる?
603600:04/08/09 23:49
>601-602
理解できました。ありがとうございました。
コアってメモリのことだろ(フェライトコア)。
605デフォルトの名無しさん:04/08/10 09:35
忘年会の季節になると、
下北沢の駅や明大前の駅に、
よく落ちてます > core


find . -name core -delete
解析木の論理的な構造について、
プログラム中で定義した構造体や変数との具体的な関係を説明せよ

という課題があるんですが、講義メモや教科書を読んでも良く分かりません
教えてもらえないでしょうか?
>>608
エスパーを探しているのか? そうか・・・

夏だな
>>608
こっちから課題を出そう。話はそれからだ。

レスの抽象的な質問について、
講義メモや教科書を読んで分からない点を具体的に説明せよ。
全部
612C超初心者:04/08/10 14:04
お聞きしたいのですが
calloc関数で確保したメモリをfree関数で開放したのですが
その確認をしたい場合どうすればいいのでしょうか
613デフォルトの名無しさん:04/08/10 14:06
>>612
かなり難しいと思う。
逆に解放していないことを確認する方が簡単。
課題2つ目

レスの質問について、
プログラムを見ないで、中で定義された構造体や変数などの関係を知る方法を具体的に説明せよ。
紙に書かれた10桁の数字を、紙を見ずに当てる方法でも構わない。
>>612
お前、超初心者とか言っておきながら、
実はベテランの釣り師だろ?
616C超初心者:04/08/10 14:18
>>613

>>開放していない事を確認するほうが簡単。

とは、printf関数等で、%pにて表示すれば良いと言う事ですか?
>>616
簡単に言うとmalloc(calloc)した回数とfreeした回数を数えて
プログラム終了時にそれらの回数が一致していなかったら
freeし忘れたということが分かるとかそういう話。

質問の意味が、確実にfreeを実行したけど
解放されないことがあり得るかという意味なら通常はありえない。
freeしたらNULLを代入をするようにして、
NULLだったら解放済み。


ぐらいしか対処方法なくない?
>>613 >>617-618
お前等、親切な回答者のふりをしているが、
実は撒き餌だろ?
真相: 全員グル
>>619
何を言ってるのか分かりかねます;-(
622C超初心者:04/08/10 14:46
>>617-618
え〜っと、 calloc関数で確保した領域があるわけじゃないですか。
その領域を開放するのがfree関数と自分は認識しているのですが、
その確保されている領域がfree関数を実行した後に、利用出来ると
思うのですが、領域が取られていない事を確認したいのですが
それは可能でしょうか?可能な場合、どのようなプログラムを
組んでいくと視認することが出来るでしょうか?
> その確保されている領域がfree関数を実行した後に、利用出来ると
これは、「freeした後の領域をそのまま使える」ということか?
利用しちゃいけません
>その確保されている領域がfree関数を実行した後に、利用出来ると
出来ません。利用できなくするのが free です。
他者が利用できるっていう話ならそう書いてください。
>領域が取られていない事を確認したい
文脈から「領域が取られる」の意味が読み取れません。
他者に取られるっていう話ならそう書いてください。

ちなみに他者に取られるかどうかは他者がいるかどうかですが
free したんならそんなこと気にしなさんなや。
>>622の「その確保されている領域がfree関数を実行した後に、利用出来ると思うのですが」はまたcallocすればってことじゃないのか?
>>621-625
もう俺は騙されないぞ!
真相: 漏れは可愛い女の子
>>622
ヒープの利用状況を視認する機能を持ったヒープマネージャを作って、
calloc/free の代わりにそっちを使えばおけ。
藻前ら、ハンドルが語っているじゃないか。

>C超初心者
初心から始めるわけだから、超えたということは既に初心者ではないのだろうよ。
どっちの方向に超えたかが問題な訳だが
たぶん左斜め上45度くらいかな。
なんの目的でそれを確認したいのか書かないと
話が見えてこないな
634C超初心者:04/08/10 17:26
>>623-626 >>629 >>633

あらかじデータの件数を取得し、その分だけmalloc関数
(またはcalloc関数)を用いてメモリを確保してから入力し、
それぞれ出力しなさい。また、入力において名前が空であった場合は、
そこで入力、及び出力を終了するようにしなさい。
終了時にメモリを開放していることを確認しなさい。

と、言う課題をしています。今、試しているのが下記のソースなんですが、
struct meibo {
char name[21];
char address[129];
char birth[11];
char phone[17];
}list;
int main( int argc , char *argv[] )
{
/* 変数宣言 */
struct meibo *pt;
/* メモリ領域確保 */
pt = ( struct meibo * )malloc( sizeof( struct meibo ) );
/* デバック用(解放前) */
printf( "Before!\nsize : [%d] address : [%p]\n\n" , sizeof( *p ) , p );
/* メモリ領域開放 */
free( pt );
/* デバック用(解放後) */
printf( "After!!\nsize : [%d] address : [%p]\n\n" , sizeof( *p ) , p );
}
開放の前後で同じ表示がされてしまいます。
635C超初心者:04/08/10 17:30
>>634

すいません printfで呼んでいる p 及び *p は ptの間違えです
free(pt); で pt が変更されたら大変だな。
pt変わらないよ
あと、list使ってないじゃん
>開放の前後で同じ表示がされてしまいます。
当たり前だろ。ローカルに取ってある値なんだから。

>終了時にメモリを開放していることを確認しなさい。

きちんとメモリを解放する処理を入れたかどうか
ソースを良く見て確認してから提出しなさいちう意味にも読めるな
釣りか
640C超初心者:04/08/10 18:34
>>636-638

皆さんありがとうございました。
この問題に関して無事解決致しました。

分かりやすい回答ありがとうございます
なぜC言語は難しい難しいと言われるのでしょうか
先入観?
言語仕様駆使しようとすると えてして記号だらけになるから
>>641
むずかしいと言った奴に訊いてくれ
>>641
「ポインタが解らん!」と言う人が多い。
しかし、そーゆー人はポインタ以外も解ってなかったりするので
実際のところは >>640
プログラミング言語自体が難しいから
んで
javascript での「わーいマウス持ってったら画像が変わったー簡単だね」みたいなのと比べてるから
>>641
C ってのは、アセンブラ使えることが前提だから。
strlenなど失敗時に何々を返すって書いてない関数って
失敗しないのが前提なんでしょうけど、もし失敗しやがったら
そのプログラム上からは成す術無しなんですか?
失敗するときは、OSとかそういうレベルの問題だから。
>>647
でも、仮に exit() に「失敗しますた(^_^;)」って
言ってこられても対処に困るだろ?
exit()の中の人はマァヴなんですか?
>>647
strlenなら例えばこんな実装だろうけどヌル終端の正しい文字列を引数に渡す限り、
どこかで問題がおきることはないと思うけどもしエラーが起きるとしたらどこだ?
size_t strlen(char *s)
{
 size_t i = 0;
 while (s[i] != '\0')
  i++;
 return i;
}
中の人などいない
>>651
色々あると思うが・・・

i = 0; <-初期化に失敗する
while (s[i] != '\0') <-比較を間違える
i++; <- インクリメントを忘れる
return i; <- i と間違えて s を返す
>>653
そういうのはバグとして修正できるだろ。
>>653
初期化失敗はまだしも、あとはちょっとテストするだけで分かるはず。
>>654
いや、たまには実行時にプロセッサが
間違うこともあるだろ?
マルチプロセス/スレッドの切替に間違うとか。
そんなことより、sのNULLチェックしろよ。
いや、strlenみたいな「軽くあるべき」関数が
毎回ぬるぽチェックをするのはどうかな。
例えば、fclose(NULL)は成功して欲しいし
free(NULL)は無事に戻って来ないといけないんだけどさ。

で、strlenがぬるぽチェックしてないと
NULLを渡したときに失敗する(=戻ってこない)環境が殆どだと思うけど
それはそれでかまわないと俺は思うんだけど。
660デフォルトの名無しさん:04/08/11 02:29
(1) ヌルポインターをキャストするのってどう思いますか?
foo = (HOGE *)NULL; みたいに

(2) ヌルポインターの代わりに0って書いてもいいんですか?
661デフォルトの名無しさん:04/08/11 02:31
> 終了時にメモリを開放していることを確認しなさい。

漢字ぐらいちゃんと書けよ ぼけ
662デフォルトの名無しさん:04/08/11 02:33
>>660

ヌルじゃなくてナルだろぼけ
663デフォルトの名無しさん:04/08/11 02:34
ヌルだろ
664デフォルトの名無しさん:04/08/11 02:35
おい、おまえら、そういう話題をしてると日下部がくるぞ!
665デフォルトの名無しさん:04/08/11 02:52
>>664
夜、口笛をふくとどろうぼうが来ますよ! と同じレベルか?
666デフォルトの名無しさん:04/08/11 02:53
どういう関連だよ!
667デフォルトの名無しさん:04/08/11 02:53
古代朝鮮語では「ナル」には太陽と日の両方の意味がある。ナもナルも同じ意味。
また、ニハは古代朝鮮語で「門・口・出口」等の意味があり、
ナニハは「日ノ出・日の門」となり日の出る聖なる場所を意味することとなる。

新羅第17代奈勿(ナル)は太陽王の意味である。

また、ナニハのナは古代朝鮮語で「生成」の意味を持つ。
(この名残が大阪市西成区・東成区として今に残る)
これらのことから大和岩雄氏はナニハの地名を
“太陽の光の降り注ぐ水辺の生成の土地”と解釈した。
つまり迎日祭祀の場所で、日庭であると説く。
大和氏は三国遺事の迎日祭祀の場所が都祈野と書かれていることと
難波の都祈野(ときの)との関連に注目する。

http://www003.upp.so-net.ne.jp/kodaisi/right-kusaka.htm
風邪をひいてもオッケー。カモーン!

みたいな関連だな。





ごめん。苦しすぎた。
669デフォルトの名無しさん:04/08/11 02:59
今の大阪あたりは、4世紀ごろは、クサカ(草香)と呼ばれてた。
しかも、そこは、ひのもと(日下)の国(日の出ずるところの意味)であるから、
他の草香と区別するため、「日下(ひのもと)の草香(くさか)」と呼ばれていた。
現在でも「日下」と書いて「くさか」と読むのは、
「春日(はるのひ)のかすが」や「とぶとりのあすか」と同様である。

日本という呼び名は、弥生時代に平和に過ごしていた今の大阪あたりの人たちの国名(ひのもと)だったのを蘇我馬子により、蘇我氏が建国した国は、
真に倭人の国という意味で「日本(日本語読みでニホン、中国語読みでジベン)」と提案され対中国に対して使ったが、蘇我氏の滅亡とともに使われなくなった。
100年を経て、持統天皇・文武天皇のときに、改めて倭国を「日本(ニホン)」と呼ぶように決めた

http://www.eonet.ne.jp/〜ombudsman/kusakabeke04-kojiki.htm
670デフォルトの名無しさん:04/08/11 03:00
という関連だ。
671デフォルトの名無しさん:04/08/11 03:01
~を〜と(ry
672デフォルトの名無しさん:04/08/11 03:11
そんな関連持ち出すまでもなく、

void
a. 1 役に立たない; 【法】 無効の; 無効にできる.
2 空(から)の、空(くう)な、中空の、空虚な; (家・土地など)空いている; 無い、欠けた;
n 無いこと、欠如; [the 〜] 虚空、真空、宇(宙); 隙間、空所、空隙; 空虚な感じ;
vt 空にする; 放出する,無効にする、取り消す;

null
a. 1 無効な、拘束力のない; 無益な; 価値のない、無意味な; 特徴[個性]のない.
2 存在しない; 【数】 ゼロの、零の、 《計器の》零位法の; 零位調整の.
n. 零、ゼロ; 《計器などの》零の目盛り、零度; 【通信】 《受信機の》零位;
vt. ゼロにする.

明白な関連だろ ;-)
673デフォルトの名無しさん:04/08/11 03:12
> > ヌルじゃなくてナルだろぼけ
> 新羅第17代奈勿(ナル)は太陽王の意味である。

そういえば、日本の皇太子も「ナルちゃん」だよね? いま
674デフォルトの名無しさん:04/08/11 03:16
つまり、
ナル==void==朝鮮人==西成区==天皇家に近い==日下部 ってこと?
>>660
(void *)型をキャストすんなっつってんだろ ぼけ
プログラム板で「ぼけ」という言葉を多様する人が約一名いるが
語調があまりにいつも同じなので同一人物ってすぐわかるなw
677デフォルトの名無しさん:04/08/11 08:58
そうだな ぼけ































679デフォルトの名無しさん:04/08/11 09:02
> 「ぼけ」という言葉を多様する人が約一名いるが
漢字ぐらいちゃんと書けよ ぼけ
というようにこのキャラは複数人が演じてる
680679:04/08/11 09:02
空改行忘れたわ































682デフォルトの名無しさん:04/08/11 09:20
C の開発者の一人であるデニス・ホッパー博士って、
アメリカ人ですか? それとも他の国の人ですか?
683デフォルトの名無しさん:04/08/11 09:31
お前の嫌いな韓国人
RECT rc = { 0, 0, 1, 1 };
みたいな書き方ってRECTの定義の変更にめちゃくちゃ弱くないですか?
>>684
メンバを後ろに追加していけば、とりあえず問題はおきない。
そこで C99 ですよ。

RECT rc = { .left = 0, .top = 0, .right = 1, .bottom = 1 };
ダサッ
>>684
そもそもそういう初期化を多用するのがヤバい。
>>688
じゃ、どうやって初期化すんの?
NULLとNULってなんなんだあqwせdrftgyふじこ
691デフォルトの名無しさん:04/08/11 22:42
リッチーだろ ぼけ
692デフォルトの名無しさん:04/08/11 23:35
char const *p;

const char *p;
の違いについて教えて下さいまし
>NULLとNUL

使い分けろ、アドレスとしての0と単なる数値の0
そもそもNULは定義されてない場合がある
>693
ハァ?
>>692
ない
697デフォルトの名無しさん:04/08/12 00:27
文字コードの\0のことは
nulと小文字にするか、カタカナでナルと書け。
>>692
↑p は変更できるが *p は変更できない
↓*p は変更できるが p は変更できない
>>698
逆じゃないか?
>>698
それは、
char const *p;
char * const p;
の場合じゃない?
またfuckか
>>698
char *const と勘違いしてないか?
>>700>>702
うん、見間違えてたスマン

ほんとの事言うと、知識が足りなかったスマソ
int *p派の人に質問です。
typedef int* IPもtypedef int *IPと書く方ですか? 
うん。
706704:04/08/12 00:55
>>705
ご丁寧に、ありがとうございました
>>704
struct{} とかの定義だと顕著かな?
WinAPI のヘッダ覗くと大体 int *IP のほうを使ってる
スタイルネタはこっちでやれ
http://pc5.2ch.net/test/read.cgi/prog/1086146814/
709デフォルトの名無しさん:04/08/12 02:18
for(;;)とwhile(1)ってどちらが早いですか?
forはインクリメントがどうのこうのとかで微妙に遅くなるとかならないとか
聞いたんですが分かる人おりますか?
>709
都市伝説
>>709
gotoがまじですごいらしいよ
while(0) がマジで速いよ
>709
誰から?
>>709
どっちも大差ない
あーあ
>714
「差」(w
>709
実はdo while(1);が最速
718デフォルトの名無しさん:04/08/12 03:19
longjmpは遅いかも
const っていつから ANSI-C に入ったんだっけ?
ANSIでCの規格が制定されたときから。

正確には、ドラフト案が出た段階で
関数プロトタイプやvoidなどと共に導入が提案されていたはず。
すげーなこんなんでも釣れるのか
722デフォルトの名無しさん:04/08/12 08:30
いまどきANSI-C...
Fedora Core 2で、こんなプログラム(hoge.c)を記述しました
/*** ここから ***/
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]){
char *str = (char *)malloc(100);
char *argstr = (char *)malloc(100);
if (str == NULL || argstr == NULL) {
sprintf(stderr,"Memory Allocation Error!\n");
exit (1);
}
if (argv[1]==NULL){
printf("str>");
scanf("%s",argstr);
}else strcpy(argstr,argv[1]);
str = getenv(argstr);
printf("STR:%s\n",str);
free (str);free(argstr);
exit (0);
}
/*** ここまで ***/
(続く
$ gcc hoge.c
$ hoge=a ./a.out hoge
STR:a
$ hoge=a ./a.out
str>hoge
STR:a

ここまではいいんですが

$ a=a ./a.out a
STR:a
free(): invalid pointer 0xfefb45be!
$ a=a ./a.out
str>a
STR:a
セグメンテーション違反です

なにがわるいんでしょうか
変数にaaaaを使うとaを使った場合と同じになります。abcdを使うとhogeの場合と同じになり、bbbbだと、これもhogeの場合と同じになります。

分っている範囲でおかしくなる条件
・a=a
・aaaa=a
正しく実行される条件
・hoge=a
・abcd=a
・bbbb=a

よろしくです
725723-724:04/08/12 20:52
XMODIFIERS,WMAKER_BIN_NAMEを指定した場合も駄目(invalid pointer,SegV)なようです。
str = getenv(argstr); // ここでstrがgetenvの戻り値に書き換えられる
free (str);free(argstr); // 何解放してんだ
727723-724:04/08/12 20:59
>>726
どうもです。解放しないようにすると正しく実行されましたが,どこで解放するのが正しかったのでしょうか。
>>727
そもそもstrはgetenvの戻り値を入れるだけだからmallocする必要も無い。
となるとprintfで出力するときしか使っていないから、直接printf("STR:%s\n", getenv(argstr));と書けばいい。
つまり変数str自体要らない。
str = getenv(argstr);
printf("STR:%s\n",str);
free (str);free(argstr);
exit (0);
}

strに確保した領域使ってないじゃん。

char *str; /* mallocは消す */
free (argstr); /* free(str);は消す */
730デフォルトの名無しさん:04/08/12 22:02
> セグメンテーション違反です
> なにがわるいんでしょうか

scanf使っているから
731デフォルトの名無しさん:04/08/12 22:17
こういうボケな質問するやつはたいがいscanfつかってるなあ。やはり































プロトタイプ宣言で
void (*signal(int sig, void (*func)(int)))(int);
となっているんですが、どうしてもこれが理解できません・・・
お力をお貸し下さい。

http://www.google.co.jp/search?q=signal+typedef&ie=UTF-8&hl=ja&lr=lang_ja

ところで、
typedef long LONG;
unsigned LONG var;
みたいな使い方って合法?
合法
736デフォルトの名無しさん:04/08/12 23:55
>>735
いいえ
737デフォルトの名無しさん:04/08/12 23:56
> どうしてもこれが理解できません・・・

「どうしても」ってことは、おれが説明してもってことだ。
だから説明しても無駄なので、しないぞ。

「どうしても」ってのは、ほんとうにすべてのかぎりを尽くしたとにだけ言えよぼけ
738デフォルトの名無しさん:04/08/12 23:57
何にもしないやつほど「どうしても」とか言うぞ
739733:04/08/12 23:57
すみません・・・「どうしても」は撤回します・・・
「関数ポインタ」+適当な単語でぐぐるといいよ。
あとは何も聞くことは無いはず
問)「どうしても」を使った短文を作りなさい
答)「かんどうしてもよいです」
742733:04/08/13 00:16
>>740
誠にありがとうございます!!
743デフォルトの名無しさん:04/08/13 00:22
解答例2:
Undoしてもとにもどらない!
( ´,_ゝ`)プッ
> 誠にありがとうございます

・・・・・・・・・・・・・・・

746デフォルトの名無しさん:04/08/13 00:56
ほかになにもいうことはなーいー
ただのアホは寝てろ
特殊なアホは起きてろ































750初心者:04/08/13 04:36
初歩的な質問かもしれませんが、
char型の配列について、
配列の数を大きくすると宣言できなくなってしまいます。
char a[1000]ならプログラムが動くのに、
char a[500000]にすると動きません。

メモリの関係で大きな数の配列は無理なのでしょうか。
解決法があれば教えてくれると助かります。
スタックにあまり大きなものを置いちゃだめ。
752デフォルトの名無しさん:04/08/13 05:13
750はぼけ厨と同一人物
>>733
typedef void *PFUNC(int);
PFUNC signal(int sig, PFUNC func);
これと同じ。関数へのポインタを2つ目の引数に取って戻り値の型も関数へのポインタ。
754デフォルトの名無しさん:04/08/13 06:40
>>753
typedef void (*PFUNC)(int); ではないだろうか。
755デフォルトの名無しさん:04/08/13 06:52
typedef に逃げるデメリットがモロに出てるな
若者たちよ、こいつらは悪い手本だぞ
>>750
一応マジレスしとくと、malloc() 使いなさい。
757デフォルトの名無しさん:04/08/13 07:26
751はアホ。
「宣言できない」だからスタック上ほげほげの問題じゃあないだろう。
intが16bitな処理系でa[500000]は無理なのはあたりまえだろぼけ
758デフォルトの名無しさん:04/08/13 07:30
757=750
やっぱり750はぼけ厨か。
>>757
ひとつ言っておく

extern int a[]; /* これは宣言 */

int a[1000]; /* これは定義 */
すげぇな>>757って。
勝手に思い込んで決め付けるタイプだな。
8bitコンパイラの可能性を見落としているところが757の能力的限界だな。
BDS C か!
MAKELONGとかのマクロ(古くはfarポインタ生成マクロ等)で
上位と下位を加えるのに+ではなく|を使ってるのって
不要な繰り上がり計算をさせないためだったんだ。
今初めて気がついた。
>>763
違う
>>761
> char a[1000]ならプログラムが動くのに、
8bitではないらしい
>764
では何故?
>>763
違う。
unsigned にキャストするより短いから。
余計意味が分かりません。
何が短いのでしょうか。
コードの長さじゃないのか?
767みたいなアホは放置
ビット演算は論理演算が基本ってことで納得しとけ
??
|を使うとunsignedにキャストするよりコードが長くなる?
+を使うとunsignedにキャストしなくてはいけない??

もちろん>763では
定数以外で「+」を使うと、キャリーの加算が別途必要だから
「|」よりコードが長くなる(可能性がある)という意図で書いたんだけどさ。
16bit環境で32bit値を生成、あるいは32bit環境で64bit値を生成するときの話ね。
32bit環境で32bit値を合成するなら+も|も一緒だから。

MAKELONGLONGを自分で書こうとしてふと思っただけ。
多くの人は昔から気づいていただろうし。
772デフォルトの名無しさん:04/08/13 17:24
void aaa(int[][10])
{
/* 略 */
}

関数の引数を2次元配列にする時だけ1番目の要素を省略できるのは何故ですか?
それと、2番目はどうして省略できないのでしょうか?
また1番目は省略しておくと要素数が変わっても対応できますか?
通常は省略するものなのでしょうか?
質問多くてすいませんがどなたか教えてくださいm(_ _)m
>>772
void aaa(int hoge[][10])
の場合、hoge[2][5]は*(hoge + 10 * 2 + 5)と書き換えられる。この中の10というのはもちろん2番目のの要素数。
2番目以降の要素数を省略できることにするとこの10と言う2番目の要素数も引数として受け取らなければならなくなるから。
(C99ではそこんところを明示的に引数にしてvoid aaa(unsigned num, int [][num]);のような記述が可能)

そして要素数の1番目は省略するのが普通。
>>773
どうもありがとうございます。m(_ _)m
参考にさせていただきます。
そんなの使うなよ
776デフォルトの名無しさん:04/08/13 19:17
教えてください。
今、strcpyの機能をmain関数内でやろうとしてみたんですが全く下のプログラムじゃ
結果ぬるになります。
26からのプログラミングは前途多難ですね。お願いします。

void main(){
char a[64],b[64];
char *c;

printf("つなげられる文字列入力-->");
scanf("%s",&a);
printf("\nつなげる文字列入力-->");
scanf("%s",&b);

int i;

for(i=0;a[i] == '\0';i++)
(*c)+=a[i];
for(i=0;b[i] == '\0';i++)
(*c)+=b[i];

printf("結果表示\n%s\n%s\n%s\n",a,b,*c);
}
777デフォルトの名無しさん:04/08/13 19:24
>>776
いろいろ突っ込みどころはあるが、
とりあえず、
お前は scanf を使うのをやめた方がいい。
778776:04/08/13 19:32
scanf以外だとgetなんとかってやつですか?
まだそこまで勉強進んでないんです。
っつーか、つっこみどころいっぱいあるんだったら
一からやり直してみます

すみませんでした
void main(){ // あえてつっこまない方向で
char a[64],b[64];
char *c; // これポインタ

printf("つなげられる文字列入力-->");
scanf("%s",&a); // ここでは無駄につっこまれるので、fgets(a, sizeof(a), stdin);で
printf("\nつなげる文字列入力-->");
scanf("%s",&b); // aと同じ

int i;

for(i=0;a[i] == '\0';i++)
(*c)+=a[i]; // cはポインタでどこを指してる?−不定値です。
for(i=0;b[i] == '\0';i++)
(*c)+=b[i];

printf("結果表示\n%s\n%s\n%s\n",a,b,*c);
}
>>776
一応できるだけ君のコードを尊重した上でマジレスすると、

c に値入ってないのに (*c) とは何事?
せめて、
char d[128];
char *c = d;
くらいにしとけ。

さらに (*c) に += し続けても文字列の結合にはならない。

それに、
printf("結果表示\n%s\n%s\n%s\n",a,b,*c);
じゃなくて
printf("結果表示\n%s\n%s\n%s\n",a,b,c);

あと、
scanf("%s",&a);
じゃなくて
scanf("%63s",a);
781776:04/08/13 20:03
なんか間違いだらけなんですね。
かなりはずかしいコードを晒したんですね。

しかし勉強になります。
周りにプログラミングやってる人いないので。

さらに質問なんですけど>>779さんのfgets(a,sizeof(a),stdin);はググって解ったんですけど
>>780さんの
scanf("%63s",a);
の %63s ってどういうことですか?
782デフォルトの名無しさん:04/08/13 20:18
>>781
あー、scanf使うなって言われてるんだから、fgetsでいいんじゃない?
なぜscanfが駄目なのかは自分で調べて味噌
783776:04/08/13 20:40
猫でもわかる〜でもscanfってなんだっけ?的な発言ありましたしね。
まだまだ俺のレベルじゃstrcpyの真似はできないと悟りました。

基本情報技術者受けようと思ってたけどやめときます
784デフォルトの名無しさん:04/08/13 20:43
>>781
a[64]ってあるから
aに入る最大の文字数を63としてる。
scanfして、AAA[半角スペース]BBB[半角スペース]CCCって
入力してみ。
786デフォルトの名無しさん:04/08/13 20:45
>>781
調べるのはいいが、はじめから「だめ」って先入観は捨ててドライに論考しろ
それが科学者とごっこの境だ
>>783
猫でもわかるとか読んでないで本買え。
猫でも分かるんだぞ!!!
789デフォルトの名無しさん:04/08/13 21:01
まず、どの猫でもいいから、そのHPを見てC言語を理解した猫をうpして欲しいw
猫でもわかるって分かりやすいのか?
メリハリなく、だらだら書かれてるだけって感じ。
コードもかなり下手だし。
「猫撫で声」「猫をかぶる」etc

ほら、脊椎動物亜門 哺乳綱 ネコ目 ネコ科の動物である必要はない!
792776:04/08/13 21:03
785さんの言うとおり入力テストしようと思い下記を確かめました。
言いたいことが解りました。
でもfgetsとscanfの順番を逆にしたら入力がscanfだけしか受け付けなくなってしまいました。
どういうことでしょうか?

#include <stdio.h>
main(){
char a[64],b[64];
printf("文字だ、文字を入れろ-->");
fgets(a, sizeof(a), stdin);
printf("もう一回文字だ、文字を入れろ-->");
scanf("%63s",&b);
printf("\n\n1:%s",a);
printf("\n2:%s",b);
return 0;
}

ちなみに、オーム社のCの本買ったけど今、構造体のネストでつまずいております。
>ちなみに、オーム社のCの本買ったけど今、構造体のネストでつまずいております。

分からないところは飛ばして進めば?
794デフォルトの名無しさん:04/08/13 21:14
>>790
小学校の授業に積分が出てこないのをレベル低いって言ってるようなものだなw
>>794
初心者向けだからダメだと言ってるわけじゃない。
796デフォルトの名無しさん:04/08/13 21:20
>>794
>小学校の授業に積分が出てこないのをレベル低いって言ってるようなものだなw

そう言ってるようには見えないが。
797デフォルトの名無しさん:04/08/13 21:25
猫でもわかるが持ち上げられてるコミュニティーって、だいたい初心者向けの
ところだけど、最近2chでも「猫でもわかるをみろ」みたいなカキコが目に付く
ようになってきたな。
>>798
初心者向けのスレしか見ないようになったのでは?
800デフォルトの名無しさん:04/08/13 21:32
794の言ってることは
激しく的外れだなw
801デフォルトの名無しさん:04/08/13 21:43
よっぽど悔しかったんだねw
猫でもわかる敷居が低いとは思うよ。
あのサイトを1から順にこなしていけば、
ざっくりとした雰囲気はつかめるっしょ。
そういうサイトが他にはないと思うんだな。
803デフォルトの名無しさん:04/08/14 03:36
>>792
最初に、scanf関数ってのは書き込む変数に対してのポインタを渡すもの
scanf("%63s",&b); のbは本来配列名だけど、インデックスを省くとその配列の先頭へのポインタを示すことになるから'&'は付けなくていいよ。

それはさておき、*gets関数はバッファに改行(\n)が現れるまで文字を読み込む。だから途中に何があろうが無視して変数へ格納していく。
それに対し*scanf関数は何もしなければバッファにホワイトスペース(スペースやタブのこと)が現れた時点で読み込むのを止めちゃう。

今回の例でいうと、最初のscanf()でスペース入りの文字列を入力したからAAAまでがaに格納される。
次のfgets()の時はバッファ(stdin)に先ほど読み込まれなかったBBB CCC\nが残っているので、それをユーザの入力よりも先にbに格納する。
というような流れで動くんだよね。こんな説明でわかってもらえた?
猫でもが高く評価されているのは、"WIN32SDK"に関してだな。
"C/C++"に関しては、他にもサイト/書籍が豊富だから傑出しているわけでは無いが、俺達よりはレベル高いな。
>>804
少なくともおまへはレベル低い
?:演算子の使い方教えてください。
または、記号を具ぐる方法教えてください。
それと、小さい方を返す演算子ってありますか?
副作用についても教えてください。
簡単にでいいです。
キーワードわかれば具繰りmass。
よろ。
807デフォルトの名無しさん:04/08/14 08:05
>>806
これと
int a,b;
if(a<0) b=-1;
else b=1;

これが
int a,b;
b=(a<0 ? -1:1);

等価。
「google 記号を検索」でgoogle検索。
そのあと「三項演算子」でgoogle検索。
if( a<b ) min=a ; else min=b ;
min = a<b ? a : b ;

副作用は無い。
ここは厨の質問に専門学校生が答えるスレだから、レベルの高低とは無縁の世界。
>>807-809
お前らすごいですね。
すげーたすかります。
サンクスコ!
>ここは厨の質問に専門学校生が答えるスレ
逆だろ。
enum hoge
{
LESS=-1,
EQUAL,
MORE,
};
int a,b,c;
a=5;b=1;
c=a<=b ? a<b ? MORE:EQUAL:LESS;
814デフォルトの名無しさん:04/08/14 08:34
>>806
「副作用」って用語がどういう意味かわかって使っているか?
>>806じゃないんですが、
薬の副作用とは違うんですか?
>>809
「副作用」って用語がどういう意味かわかって使っているか?
817デフォルトの名無しさん:04/08/14 09:41
#define A AAAA

int _tmain(int argc, _TCHAR* argv[])
{
printf ( "%s", A );
return 0;
}
このプログラムでコンソールに文字列としてAAAAを表示させるにはどうすれば良いですか?
どうしても良い方法が思いつきません。
(#define A "AAAA"はなし)
819デフォルトの名無しさん:04/08/14 09:51
すみません、これのどこがまずいでしょうか?

/* 各部屋の寸法から、家屋の床面積を計算するプログラム */

#include <stdio.h>

int main(void)
{
int num, i, length, width, space;

printf("部屋の数はいくつですか : ");
scanf("d%", &num);

space = 0;

for(i=1; i!=num; i++)
{
printf("%d番目の部屋の寸法を入力してください\n", i);

printf("縦 : ");
scanf("%d", &length);

printf("横 : ");
scanf("%d", &width);

space = length * width;
}

printf("家屋の総床面積は%dです", space);

return 0;
}
820デフォルトの名無しさん:04/08/14 10:01
>>818
どうしようもない

>>819
d%
d%
i!=num
今木がついた。
日本人ってヲタだったんだ。
823822:04/08/14 10:05
スマソ
誤爆した。
>>823
勝手にフォローすんなよ。
まぢで気がついたし。
825819:04/08/14 10:16
d%あっ(;;´Д`)~~
修正しました。ありがとうございます。

しかしまだ問題が…
部屋数が多くてもspaceが加算されていかない…

それと、条件判定部がいまいち理解できないのですが、
i=1からi==numまでi++するとなると

for(i=1; i!=num; i++)じゃなぜまずいのでしょうか?
例えば2!=2は偽なのでforループから抜け出るはずなのですが、抜けでないです…
i<num+1では問題ないのですが、納得できない…。
826デフォルトの名無しさん:04/08/14 10:18
>>825
<=を知っているか?
827818:04/08/14 10:20
>>820
どうしようもないんですか・・・・
本当の本当に不可能なんでしょうか?
何か名案はないでしょうか?

#define A AAAA

でAAAAを文字列として表示したいだけなのですが・・・
>space = length * width;
829819:04/08/14 10:22
>>826

あ、
i<=num
でも大丈夫ですね。
>>827
それをすることにどんな意味がある?
"AAAA"では駄目な理由は何なのか?
831デフォルトの名無しさん:04/08/14 10:23
>>827
無理。
文字列にするための#はマクロの引数にしか使えないし。
>(#define A "AAAA"はなし)
C言語はお前等の母親ではない(利根川
不合理なことをなんでもかんでもサポートするほど甘くは無い
833818:04/08/14 10:27
>> 830
ただ単にですね
AAAAは関数名なんですよ。#defineで切り替えて呼び出す関数を変える。
デバッグのためにその関数名を表示したいんですが無理なんですかねぇ・・・
834819:04/08/14 10:28
>>828

あ、
space = space + length * width;
ですね。

とりあえず、問題なく動作するようになりました!ありがとうございます。
あとは、i!=numじゃなぜまずいのか、納得のいけば良いのですが…。
>>825
>for(i=1; i!=num; i++)じゃなぜまずいのでしょうか?

num=0の場合を考えてみよう
836819:04/08/14 10:33
num=0の場合だと、永久にループから抜け出さないのは、一応分かります。
が、他の数字の場合でも、ループから抜け出さないプログラムになってしまうんです。
それはなぜなんでしょう?
あと、書くとすればi!=num+1ですね。
837819:04/08/14 10:36
ああ(;;´Д`)~~
i!=num+1
でも、これなら問題ないですね。ありがとうございました…。
今どうなっとんねんもっかいソース貼れ
839819:04/08/14 10:39
一応、こうなりました。とりあえず、無事動いているみたいです。。

/* 各部屋の寸法から、家屋の床面積を計算するプログラム */

#include <stdio.h>

int main(void)
{
int num, i, length, width, space;

printf("部屋の数はいくつですか : ");
scanf("%d", &num);

space = 0;

for(i=1; i!=num+1; i++)
{
printf("%d番目の部屋の寸法を入力してください\n", i);

printf("縦 : ");
scanf("%d", &length);

printf("横 : ");
scanf("%d", &width);

space = space + length * width;
}

printf("家屋の総床面積は%dです\n", space);

return 0;
}
>>819
まぁ、がんがれや。
841819:04/08/14 10:42
ありがとうございます。
Cは始めたばかりですが、頑張ります(`・ω・´)
それだったら、
printf("%s", __FUNCTION__);
でいいでしょう。

あとは、
#define AAAA
#define A_STR(v) #v
printf("%s", A_STR(A));
とかね。
>>833
手打ちしてコメントにしておけば済むだろ。

//#define A AAAA
//#define AS "AAAA"
#define A BBBB
#define AS "BBBB"
//#define A CCCC
//#define AS "CCCC"

コメントを消したり付けたりするのすら面倒だというなら#ifつかえ。
>>842 利口
>>843 暇人
>>833 無知
845デフォルトの名無しさん:04/08/14 10:45
>>842
それは"A"になる。もちろん#define A AAAAにしても。
846845:04/08/14 10:46
ああ、もちろん「あとは、」より下の例が。
>>818
#define _STR_(x) # x

printf("%s", _STR_(A));
848デフォルトの名無しさん:04/08/14 11:04
>>827
cpp のソース持ってきてちょこっと書き換えればできるだろ。
それくらい自分でやったらどうだ?
849デフォルトの名無しさん:04/08/14 11:09
>>847
だからそれじゃ"AAAA"ではなく"A"になるってば。
>>847
識別子の先頭に '_' 付けるな! ヴォケ

#define REP(x) x x x x
#define STR(x) REP(#x)

printf("%s", STR(A));
851818:04/08/14 12:04
なかなか良いアイディアってないもんですね。。。。
あきらめます。
852818:04/08/14 12:08
>>842
__FUNCTION__マクロなんてあるんですね。
勉強になりました。
他の人もいろいろ考えてくれてありがとう。
つか、>>850 で駄目なの?
>>853
質問するときの例が悪いだけ。つか悪すぎるだけ。最悪なだけ。
>>853
850はネタじゃないの?
>>818
これでいんじゃね?

#define A AAAA
#define TO_STR(x) #x
#define XTO_STR(x) TO_STR(x)
#define A_STR XTO_STR(A)

printf("%s¥n", A_STR);

だまされたと思ってやってみ
とりあえず次の関数だけ定義しておく
void printFUNCname(void (*f)(void))
{
if(f == AAAA) print "AAAA";
if(f == BBBB) print "BBBB";
if(f == CCCC) print "CCCC";
}

プログラム中で
printFUNCname(A);
を実行
>>853
何処が?
>>857はPerler
>>859
意図は分かってくれ。
っていうか、結局 >>818>>833 で自白しているように、
最初から関数ポインタ使っとけっていう場面。
861デフォルトの名無しさん:04/08/14 14:43
>>759
ぼけ

int i; // これが宣言
i = 0; // これが定義
あついあつい
863デフォルトの名無しさん:04/08/14 14:45
> 関数の引数を2次元配列にする時だけ1番目の要素を省略できるのは何故ですか?

いいえ。1時限配列にするときも3時限配列にするときも「1番目の要素数」を省略できますよ。
864デフォルトの名無しさん:04/08/14 14:48
> 「副作用」って用語がどういう意味かわかって使っているか?

水戸のご隠居の別名
865デフォルトの名無しさん:04/08/14 14:49
> すみません、これのどこがまずいでしょうか?

scanf使っているところ。
866デフォルトの名無しさん:04/08/14 15:05
マクロの副作用:食欲不振・下痢になることがあります。
867デフォルトの名無しさん:04/08/14 15:07
>>861
int i; //定義宣言
extern i; //宣言

もしiについてのextern宣言が他にあったなら
int i; //定義
868867:04/08/14 15:09
ごめん、下の2行間違い。削除
869デフォルトの名無しさん:04/08/14 15:27
> //定義宣言

そんなもなーないぞ
870867:04/08/14 16:25
>>869
int i;
なんか定義と宣言を同時に行っているだろ?
あまり使われないみたいだけど定義宣言という言葉はある

ってか調べおしたら変数で一般的に定義といわれているものは正しくは定義宣言、
externで変数名を導入することは参照宣言というらしい。
ということはどっちも宣言だ
872デフォルトの名無しさん:04/08/14 16:32
> なんか定義と宣言を同時に行っているだろ?

いいえ。

> あまり使われないみたいだけど定義宣言という言葉はある

いいえ。まったくありません。
873デフォルトの名無しさん:04/08/14 16:34
> ってか調べおしたら変数で一般的に定義といわれているものは正しくは定義宣言

それウソ。いいかげんなこと言うな。
どこが「正しく」だよ ぼけ。
初心者は回答禁止
ここは中途半端な知識をひけらかしたり、
ちょっと調べただけの情報を広めるスレですか?
>>875
ぼ    けと書く人はスルーで。
今ごろ気付いたの?
定義宣言っていう言葉が定義されてるのはどこだ?
879デフォルトの名無しさん:04/08/14 16:44
どこにもないって
ここは凄いインターネットですね
定義宣言w
定義宣言って英語でいうと何?
883デフォルトの名無しさん:04/08/14 17:02
>>827

こんなことがしたいのか?

#define E(x) char x[] = #x;

E(A)
E(AAAA)

#undef
884デフォルトの名無しさん:04/08/14 17:04
>>863

揚げ足厨がtypoしてるぜ(プ
885デフォルトの名無しさん:04/08/14 17:07
わざとだろ?
#define macro // マクロの定義宣言
void func(void) // 関数の定義宣言
{
 int var; // 変数の定義宣言
}

テストに出るらしいぞ。
887デフォルトの名無しさん:04/08/14 17:12
>>886
1つ聞くが、おまえさんは国内での用語の基準は何だと思っている? もちろんCに関して
どーせふざけて誤魔化すだけだろうが(プ
888759:04/08/14 17:13
>>861

>int i; // これが宣言

それは定義

>i = 0; // これが定義

それは代入

プロトタイプ無しで現れた関数定義なんかは、
宣言も兼ねている。
というか886は何を基にしてるんだ?
俺は867じゃないんで詳しくは知らんが、
Cはgrammarだけを見れば、外部定義の中に関数定義と宣言があるだけだな。

file : external_definition | file external_definition ;
external_definition : function_definition | declaration ;

だが、Cは宣言の中で定義もできるという無茶な仕様の言語と言われることもあったと思う。
grammarを全部みれば俺もわかると思うんが、たとえば、

int i;
int i;
int i;

このように、「int i;」は宣言だから複数宣言しても昔はOKだったが、今は変更されたんか?
定義宣言という言葉はしらんが、「int i;」は宣言であり、最後の宣言だけが有効になる、と聞いたと思ったんだが…
ちなみに
宣言は declaration。
定義は definition。

定義宣言なんて知らん。
あれだろ、あれ、ハングル文字
それによって、実体が作られるものが定義。
そうでないものは宣言。
こう考えればおけ。
894デフォルトの名無しさん:04/08/14 17:23
でも構造体や共用体は定義しても実体はつくられないよね。
895デフォルトの名無しさん:04/08/14 17:24
べつに実体ができるわけじゃないからなあ > int i;
896デフォルトの名無しさん:04/08/14 17:25
> このように、「int i;」は宣言だから複数宣言しても昔はOKだったが

いいや。昔のUnixのCの時代だらそれはエラーだった。
次の3つについて定義か宣言かとその機能の違いについて述べよ
int i;
extern int i;
static int i;
898デフォルトの名無しさん:04/08/14 17:26
autoの変数で
int i;と書いてあっても、
その変数を1回もつかっていないと、その分スタックをオフセットしないので
「実体は作られていない」ですよね?
>>897
(ry

ちなみに試験に出るらしいぞ。
>>870
>ってか調べおしたら変数で一般的に定義といわれているものは正しくは定義宣言、

引用してみてよ。気になる。
901デフォルトの名無しさん:04/08/14 17:27
>>898
下手な釣りだな
902デフォルトの名無しさん:04/08/14 17:28
何もかかなければ「int」だったので、数年前までのCでは、
foo()
{
i;

for (i = 0; i < 10; i++)
...
もOKだったのですが、5年ほど前からでてきているC99準拠の処理系だとだめ。
構造体の場合は

struct s { int x; int y; };
みたいのは定義。
変数の定義とは違うにょ。

struct s;
みたいのは宣言。

>>895,898
最適化をまったくしないとすれば、実体はできるでしょう。

お前ら思い付きで物言うな。
何か主張したいならすべて引用元を明示しろ。
脳内はかんべんな。
> int i;

定義。
スコープは書かれる場所による。

> extern int i;

宣言。
なので実体が作られないので、
定義が別になければリンクエラーになる。

> static int i;

定義。
スコープは書かれる場所による。
906デフォルトの名無しさん:04/08/14 17:38
引用でないと主張できないんだろうか。
907デフォルトの名無しさん:04/08/14 17:40
>>903
>struct s { int x; int y; };
これは宣言

>struct s;
これは不完全型の宣言

>int i;
おまえさんは、リンカがしている「ある仕事」を知らないようだな
autoとか突然言い出した898はぼけ
>>906
お前らはすべきじゃない>引用なしの主張
>>904
お前こそ引用元を明示しろ
910デフォルトの名無しさん:04/08/14 17:41
>>907
struct s { int x; int y; }; が構造体の定義で、
struct s S;が構造体変数の定義じゃないの?
911デフォルトの名無しさん:04/08/14 17:42
>>908
失礼なやつだな
人の言うことを頭から剽窃行為と決め付けてやがる
912デフォルトの名無しさん:04/08/14 17:44
なんでここでスクイズ・・・
しかも失敗してんじゃねーか!!
>>911
剽窃だからじゃない
不正確だからちゃんとソースを確認して正確に引用しろといってるだけ
914912:04/08/14 17:45
おっと、、、
915デフォルトの名無しさん:04/08/14 17:47
>>910
× struct s { int x; int y; }; が構造体の定義で、
○ struct s S;が構造体変数の定義じゃないの?
プログラミング言語Cの表記見ればいいんじゃない。
いけいけダルビッシュ〜
918燃料投下(^^!:04/08/14 18:10
>>struct s { int x; int y; };
>これは宣言

型の定義(^^!

>>struct s;
>これは不完全型の宣言

型の宣言(^^!
919デフォルトの名無しさん:04/08/14 18:16
>>918
不発

思考停止したアフォは放置
920デフォルトの名無しさん:04/08/14 18:27
おまえらだめすぎ
921デフォルトの名無しさん:04/08/14 18:28
extern int i; /* これは宣言 */
static int j; /* これは定義 */
共産党○○ /* これは宣言 */
ウィルス○○ファイル /* これは定義 */
○○温泉
924デフォルトの名無しさん:04/08/14 18:50
白骨温泉
>>912
京都負けちゃったね
926867:04/08/14 20:07
おい、本屋でこの本の293Pでも立ち読みしてみぃ、ちゃんと説明でてるからぁ。
http://www.amazon.co.jp/exec/obidos/ASIN/477410843X/249-1598953-0831507

あとぉ、ネット検索しても本当に少しだけだけど触れているページだってあるぞぉぉ!w
K&RまたはANSI/ISO Cの規格書以外のソースは却下
928デフォルトの名無しさん:04/08/14 20:10
>>926
この本を正規購入して読め、「本当に少し」の理由がわかるはず
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3010%3A2003&dantaiCd=JIS&status=1&pageNo=0
929867:04/08/14 20:14
>>928
ほい、みてみまつ。
930デフォルトの名無しさん:04/08/14 20:28
>>918
今時 struct をそのまま使う香具師の気が知れない。
使うなら、

typedef struct mytype_ {/* mytype_ は自分の構造体の中で mytype へのポインタが
                  出てくる場合のみ */
・・・・・
} mytype;

という「熟語」を使うのが常套手段。
>>930
構造体かどうかの区別がつきにくくなるだろ!
932デフォルトの名無しさん:04/08/14 20:42
>>930
俺も>>931に同意だけど、好きな方使えばいいんでない?
だから素直にstruct ***とやっている人を馬鹿にしてはいけない



なんてカッコつけて言ってみたw
がびーん、>926の本持ってた...。

p.293 19.3.3 宣言と定義のセクションより引用
>変数宣言は, 宣言であり, かつ定義でもある.
>(中略, 定義と宣言についての説明がある)
>変数宣言のように宣言と定義が同時に行われるのを定義宣言という.

強調されて書かれてるしw → 定義宣言
934デフォルトの名無しさん:04/08/14 20:46
>>931
変数の意味も分からずに使うことはまず無いので無問題。
変数の宣言・定義の度に struct を打つのは無駄。

関数だったら、何も分からなくても

sometype myfunc(mytype a, mytype2* b, ・・・)
{
・・・
}

とかで済むし、必要があれば a.member, b->member2 とすれば良いし、
構造体でない型の変数でドットやアローを付けてしまっても syntax error になるだけだから、
一切問題は起こらない。

では、問題になるケースというのは?
935デフォルトの名無しさん:04/08/14 20:48
>>932
どちらも間違いではないけど、既製のヘッダファイルを見ればほぼ例外なく
typedef struct と書いてある。
936デフォルトの名無しさん:04/08/14 21:05
>>933
焚書推奨
937デフォルトの名無しさん:04/08/14 21:20
>>936
       ヽ|/
     / ̄ ̄ ̄`ヽ、
    /         ヽ
   /  \,, ,,/    |
   | (●) (●)|||  |
   |  / ̄⌒ ̄ヽ U.|   え? なんだって?
   |  | .l~ ̄~ヽ |   |
   |U ヽ  ̄~ ̄ ノ   |
   |    ̄ ̄ ̄    |
6.9.2 External object definitions
Semantics
1 If the declaration of an identifier for an object has file scope and an initializer, the
declaration is an external definition for the identifier.
2 A declaration of an identifier for an object that has file scope without an initializer, and
without a storage-class specifier or with the storage-class specifier static, constitutes a
tentative definition. If a translation unit contains one or more tentative definitions for an
identifier, and the translation unit contains no external definition for that identifier, then
the behavior is exactly as if the translation unit contains a file scope declaration of that
identifier, with the composite type as of the end of the translation unit, with an initializer
equal to 0.
3 If the declaration of an identifier for an object is a tentative definition and has internal
linkage, the declared type shall not be an incomplete type.
4 EXAMPLE 1
int i1 = 1; // definition, external linkage
static int i2 = 2; // definition, internal linkage
extern int i3 = 3; // definition, external linkage
int i4; // tentative definition, external linkage
static int i5; // tentative definition, internal linkage
int i1; // valid tentative definition, refers to pre vious
int i2; // 6.2.2 renders undefined, linkage disagreement
int i3; // valid tentative definition, refers to pre vious
int i4; // valid tentative definition, refers to pre vious
int i5; // 6.2.2 renders undefined, linkage disagreement
extern int i1; // refers to pre vious, whose linkage is external
extern int i2; // refers to pre vious, whose linkage is internal
extern int i3; // refers to pre vious, whose linkage is external
extern int i4; // refers to pre vious, whose linkage is external
extern int i5; // refers to pre vious, whose linkage is internal
939デフォルトの名無しさん:04/08/14 22:06
>>934
自分が使いやすいと思ったほうを
使うのが一番だと思われ。
そんなムキになるようなことじゃない。
940デフォルトの名無しさん:04/08/14 22:08
>>939
ムキになることじゃない、この点はよい
ただし理由がおかしいよ
941デフォルトの名無しさん:04/08/14 22:14
>>940
え?
何かおかしい?
別に普通の理由だと思うが?
942デフォルトの名無しさん:04/08/14 22:16
自分が
943デフォルトの名無しさん:04/08/14 22:45
Cのsocketプログラミングについて質問させて下さい。
最初にWSAData構造体に何が格納されているかを表示させるプログラムを
書いたのですがいきなり躓きました。
以下のようなコードを書いたのですが
wVersion=257
wHighVersion=514
という結果が出ました。
自分の環境だとwVersion=1.1,wHighVersion=2.2になると思ってたのですが
何故こんな結果になってしまったのでしょうか?

#include <winsock.h>

//以下main文
WSADATA wsadata; //WSADATA型変数宣言

if(WSAStartup(MAKEWORD(1,1),&wsadata)){
printf("WSAStartup関数失敗です\n");
return -1;
}
printf("wVersion=%u\n",wsadata.wVersion);
printf("wHighVersion=%u\n",wsadata.wHighversion);
printf("szDescription=%s\n",wsadata.szDescription);
944デフォルトの名無しさん:04/08/14 22:47
>>943
%uで小数が表示されるわけないだろ
945デフォルトの名無しさん:04/08/14 22:59
>>944
はう、お盆なので親戚が来てかなり酒が入ってる状態です
お許しください
俺が書きたかったのは下のコードでした
printf("wVersion=%d.%d",LOBYTE(wsadata.wVersion),HIBYTE(wsadata.wVersion));

じゃあ、
printf("wVersion=%u\n",wsadata.wVersion);
printf("wHighVersion=%u\n",wsadata.wHighversion);

wVersion=257
wHighVersion=514
は何なんでしょうか?
脳が既に活動停止しているようです。
とっとと,お帰り下さい。
wVersion=MAKEWORD(1,1)
wHighVersion=MAKEWORD(2,2)
WORD型で定義されてるから。
%hsにしる。

# そもそもスレ違い
あら?typoしてまってた。%hdだ。

その点は確かにそうだけど
その点での誤動作は絶対にしないんだな。

intサイズ以下の整数を可変引数をとる関数(の可変引数部)に渡すと
必ずint型に格上げされるからね。
ああ。そうだった。ついでに、floatもdoubleに格上げされるんだったね。
痛いな。俺。

wVersion == 0x0101
だから257
951デフォルトの名無しさん:04/08/15 04:09
> おい、本屋でこの本の293Pでも立ち読みしてみぃ、ちゃんと説明でてるからぁ。

有名な「ダメ本」じゃん。
952デフォルトの名無しさん:04/08/15 04:10
> 変数宣言は, 宣言であり, かつ定義でもある.

こういうウソを平気で書いている本を買うなよなあ。

953デフォルトの名無しさん:04/08/15 04:11
> はう、お盆なので親戚が来てかなり酒が入ってる状態です

あと2週間も先だろ > お盆
>>953
お前はどこの国の人間だ?
お盆の時期

毎年、七月十五日を中心に、十三日を迎え盆、十六日を送り盆といい、
十三日から十六日までの四日間を、お盆の期間とします。ただし、
旧暦の七月十五日や、月遅れの八月十五日を中心にお盆をつとめるところもあります。

本来は、仏教の行事だったお盆ですが、働く人は盆休みをこの時期にとり、
故郷のある人は帰り、盆踊りをして楽しみ、生きている私たちの生活のなかに、
しっかりと根ざしている、夏の季節の節目となっています。
956デフォルトの名無しさん:04/08/15 04:28
> 本来は、仏教の行事だったお盆ですが、働く人は盆休みをこの時期にとり、

もともと仏教なんかよりはるか以前からある行事でしょ
それを否定するわけにはいかないので、仏教でもそれをoverloadしただけ。
(お盆っていう言い方もそのとき以来のもの)

キリスト教でも「そうそう! イエス様は12月24日生まれだったんですよ!」ってことに
して、古くからある冬至のイヴェントをoverloadしたように(本当は4月上旬生まれらしい)。
957デフォルトの名無しさん:04/08/15 04:33
仏教でも「そうそう、お釈迦様のありがたいおことばにこんなのがあります!」と
7月15日の行事を肯定するためのにせもののお経をでっち上げて、
(中国語じゃなくてサンスクリット語で!)そうまでしてoverloadする必要が、
中国南部と北部ではあったわけだ (中央部では民族に違いによりなかった)。

でも、そんなお経よりはるか以前から、日本の島々では、7月15日に先祖の霊を
うやまうための行事がずっと行われていた。
958デフォルトの名無しさん:04/08/15 04:46

それは日本や沖縄も客家の人たちと同じ祖先の血をひいているから。
インドよりももっと西方、いまのイランやイラクあたりから来た人たちだから。

そもそも「お盆」というネイミングも、イラン語系の古い言葉で精霊を意味するurvan -> サンスクリット語のullanbana -> 盂蘭盆 -> お盆
となったもの。
959デフォルトの名無しさん:04/08/15 04:48
なので、7月15日の満月の晩にやらなきゃいけない行事なので、
日付をずらすのはナンセンス。
お正月と七月の行事は日付の変更はあり得ない。
5月の行事は生きているひとのほうの都合である程度の変更は許されている。
ちょっと待って
>イランやイラクあたりから来た
>日付をずらすのはナンセンス
と言うなら、日本の太陽太陰暦(いわゆる旧暦)で日付を決めるのは変でない?
だから満月を基準にしてるんでしょ?
7月は、何を基準に7月なの?