トップページ⇒tech
1001コメント273KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/08/08(月) 01:32:01
まず問題を冷静に吟味して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/

C言語なら俺に聞け! Part 111
http://pc8.2ch.net/test/read.cgi/tech/1121657911/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0561デフォルトの名無しさん2005/08/21(日) 19:50:11
ではまず駄弁るだけの>>560さんが移動してください
0562デフォルトの名無しさん2005/08/21(日) 19:53:14
>>561
つ ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
0563デフォルトの名無しさん2005/08/21(日) 20:00:55
階乗と累乗教えてください
0564デフォルトの名無しさん2005/08/21(日) 20:04:26
>>563
階乗は自分で書け
累乗はpow
0565デフォルトの名無しさん2005/08/21(日) 20:09:14
新しめのC規格で、オーバーロードってできるのですか?
0566デフォルトの名無しさん2005/08/21(日) 20:23:17
>>555
脳内コンパイル注意
#include <stdio.h>
#include <math.h>
int fact(int n)
{
 int ret=1,i;
 for(i=2;i<=n;i++)ret*=i;
 return ret;
}
double func(double x,int r)
{
 double ret=1.f,t;
 int i;
 for(i=1;i<=r;i++)
 {
  t=pow(x,i);
  t/=(double)fact(i);
  ret+=t;
 }
 return ret;
}
int main()
{
 double x;
 int r;
 printf("x,r= ");
 scanf("%lf,%d",&x,&r);
 printf("Ans= %lf",func(x,r));
 return 0;
}
0567デフォルトの名無しさん2005/08/21(日) 20:27:32
char *hoge = NULL;
int *hogo = 0;
となっているのですが、
NULLと0は何が違うのですか?
0568デフォルトの名無しさん2005/08/21(日) 20:33:18
FAQ参照。
0569デフォルトの名無しさん2005/08/21(日) 20:40:17
はぁ?
書き込むんなら答えをかけよ糞が
0570デフォルトの名無しさん2005/08/21(日) 20:41:25
#define NULL 0
0571デフォルトの名無しさん2005/08/21(日) 20:42:56
mallocでメモリを確保してそれを全て0にしたいのですが
forで回す以外の方法は無いのでしょうか?
0572デフォルトの名無しさん2005/08/21(日) 20:46:25
calloc
memset
0573デフォルトの名無しさん2005/08/21(日) 20:47:01
forで回すのなんて本当にやってるやついるの?
0574デフォルトの名無しさん2005/08/21(日) 20:51:42
なんで、mallocはゴミつめたままで、callocはZeroFillなんだろうな?
0575デフォルトの名無しさん2005/08/21(日) 20:51:50
566さん
ありがとう!!!! 
0576デフォルトの名無しさん2005/08/21(日) 20:54:45
>>>574
絶対にする必要は無いからだろ
0577デフォルトの名無しさん2005/08/21(日) 20:56:02
>>574
常にZeroFillする必要は無いけど、
必要な時には効率よくZerofillしたいからじゃない?
0578デフォルトの名無しさん2005/08/21(日) 20:56:36
mallocは絶対にゼロで埋める必要がないといいたいのだろうか。情報少なすぎて意味分からん。
少なくとも>>571には必要なようだが。
0579デフォルトの名無しさん2005/08/21(日) 20:57:09
>>577
だとしたら、何故callocは?
05805792005/08/21(日) 20:57:49
あ、その使い分けが出来るように、変えてあるということか。
0581デフォルトの名無しさん2005/08/21(日) 20:59:15
>>579
自前でfor回したり、後でmemsetするよりも効率よくZerofillすることが
可能かもしれない。
05825792005/08/21(日) 21:00:37
でも、calocとmallocは本来目的が違う関数なのに、そういう設計はなんだかな。
だったらmallocにZeroFillフラグつけるとか、mallocZとかいう別関数で用意するほうが分かりやすいのに。
0583 ◆fZOaF4CQP6 2005/08/21(日) 21:10:15
ここは阿呆連中ばっかりか?
そんなもん、なんで"printf"があるのに"puts"があるのですか
っていってるようなもん
0584デフォルトの名無しさん2005/08/21(日) 21:11:40
そりゃそうだな
ごめん
0585デフォルトの名無しさん2005/08/21(日) 21:42:16
1 + 1/r^2 + 1/r^2 +・・・・+1/r^n
rとnを聞いて
と求めるプログラム
0586デフォルトの名無しさん2005/08/21(日) 21:43:33
>>585
C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/l50
0587デフォルトの名無しさん2005/08/21(日) 21:58:59
>>583
おまえ、その二つは用途が完全に違うだろ。
0588デフォルトの名無しさん2005/08/21(日) 22:01:34
だからなに?
用途が違うのに一緒のように使おうとするっていう例では丁度いいじゃん
0589デフォルトの名無しさん2005/08/21(日) 22:15:01
int this_option_optind = optind ? optind : 1;
と言うのがあるのですが = の後ろからの意味が分かりません
どのような意味なのでしょうか?
0590デフォルトの名無しさん2005/08/21(日) 22:16:54
自分で調べろ
0591デフォルトの名無しさん2005/08/21(日) 22:17:20
ヒント:三項演算子
0592デフォルトの名無しさん2005/08/21(日) 22:18:33
>>590
答えなかったら?
0593デフォルトの名無しさん2005/08/21(日) 22:23:27
煽りすらまともに出来ないのかよ。
それだけじゃ、何言ってるのかわからん。
0594デフォルトの名無しさん2005/08/21(日) 22:37:54
static struct hoge hoge_hoge[] =
{
{"hoge1", 1, 0, 'a'},
{"hoge2", 1, 0, 'a'},
{"hoge3", 1, 0, 'a'}
};

のようなコードがあるのですが、
なぜhogeとhoge_hogeを二つの変数を宣言しているのですか?
0595デフォルトの名無しさん2005/08/21(日) 22:43:32
>>569
お前生意気帰れ二度と来るな
0596デフォルトの名無しさん2005/08/21(日) 22:47:18
>>594
hoge は変数じゃない
05975692005/08/21(日) 22:48:44
>>595
帰れって言われてもここは自宅ですよ?
あなたが現実とネット上の世界の区別が付かないといわれている人ですか?
0598!=5952005/08/21(日) 22:50:47
>>597は無視でいきましょう。
0599デフォルトの名無しさん2005/08/21(日) 22:52:05
>>594
「struct hoge」型の変数hoge_hogeの宣言。
0600デフォルトの名無しさん2005/08/21(日) 22:52:27
>>598 = >>595だな
0601デフォルトの名無しさん2005/08/21(日) 22:53:21
それが何か?
0602デフォルトの名無しさん2005/08/21(日) 22:54:11
必死だな
0603デフォルトの名無しさん2005/08/21(日) 22:55:33
>>589
条件演算子
そのコードの意味としてはこんな感じ。

int this_option_optind;
if (optind != 0)
    this_option_optind = optind;
else
    this_option_optind = 1;
0604デフォルトの名無しさん2005/08/21(日) 22:56:31
static hogeをループで回したときは、なぜ多重宣言にならないんですか?
0605デフォルトの名無しさん2005/08/21(日) 22:58:47
>>597
見苦しいぞ
0606デフォルトの名無しさん2005/08/21(日) 22:59:20
>>604
たとえ何回ループされようとソースコード上ではたった1箇所でしか定義がなされていないから。
0607デフォルトの名無しさん2005/08/21(日) 22:59:28
見苦しいのは595だと思う
0608デフォルトの名無しさん2005/08/21(日) 23:00:40
>>606
一度目のループで宣言され
二度目のループで2回目は宣言されないのですか?
0609デフォルトの名無しさん2005/08/21(日) 23:02:54
>>604
悪いが言ってる意味が分からん
具体例を挙げてくれ
0610デフォルトの名無しさん2005/08/21(日) 23:06:01
>>608
だから1回目とか2回目と考えるのがナンセンス。
プログラムの実行するとき、ソース上でstatic変数の宣言している箇所を通ったらその変数が用意されるというわけではない。
コンパイル時にコンパイラがstatic変数を見つけたらその時点で領域を確保しておく。
実行時にはただ確保された箇所をstatic変数として使うだけ。実行時には宣言なんてどこにも残っていない。
0611デフォルトの名無しさん2005/08/21(日) 23:06:53
while(1){
static int hoge = 0;
hoge++;
}

これだと何度もhogeが宣言されると思うのですが
0612デフォルトの名無しさん2005/08/21(日) 23:08:48
>>611
なんで?
0613デフォルトの名無しさん2005/08/21(日) 23:08:54
>>611
static の意味調べてね

べーた臭がする・・・
0614デフォルトの名無しさん2005/08/21(日) 23:09:21
>>611
プログラムの実行時に静的変数の宣言は実行されるものではない。
予め場所だけ用意しておき、静的変数を参照するときにはいつでもそこを見に行くだけ。
0615デフォルトの名無しさん2005/08/21(日) 23:10:43
while(1){
static int hoge = 0;
hoge++;
}
は
static int hoge = 0;
void foo()
{
while(1){
hoge++;
}
}
とほぼ同じ。違いはブロックの外からは直接参照できないこと。
0616デフォルトの名無しさん2005/08/21(日) 23:12:49
>>597
お前友達いるのか?
06175972005/08/21(日) 23:17:00
>>598
なんであなたは自分の意見を共有したがるのですか?
自分で意見があるのなら他人まで巻き込まないで自分で実行しましょうよ

>>616
いますよ
そんなこと聞いてどうするんですか?
私の経験から行くと、「友達いるのか?」って聞く人のほうが
友達がいないような気がするんですけど
0618デフォルトの名無しさん2005/08/21(日) 23:19:49
いい加減C言語と関係ないこと書き込むのやめれば?
0619デフォルトの名無しさん2005/08/21(日) 23:21:34
>>618
お前らがやめろ
それで終わる
0620デフォルトの名無しさん2005/08/21(日) 23:22:15
構って君を構うやつが一番悪い。
0621デフォルトの名無しさん2005/08/21(日) 23:26:14
>>617
そうか、いるのか。
ふーん。では、ここではそういう現実とネット上の世界の区別を付けてるわけか。
0622デフォルトの名無しさん2005/08/21(日) 23:28:13
>>621は 宣言子でいうと auto あたりかな
0623デフォルトの名無しさん2005/08/21(日) 23:40:46
>>617
>なんであなたは自分の意見を共有したがるのですか?
あなたも >>569 の意見を共有できるものならしてみたらどうですか?
0624デフォルトの名無しさん2005/08/21(日) 23:45:33
>>567
NULL = ヌルポインタ
プロセスが0ということだ
int *a =0
は
int* a;
a = 0;
でポインタaにプロセス0を渡してる
0625デフォルトの名無しさん2005/08/22(月) 00:00:55
>>619
お前らって・・・
俺書き込んでなかったんだけど。
まあいいけどさ。
0626デフォルトの名無しさん2005/08/22(月) 00:03:36
>>625
お前も同類だバカ
0627社長2005/08/22(月) 00:45:47
"\x35\x39\x37"
解雇
0628デフォルトの名無しさん2005/08/22(月) 00:58:23
>>624
プロセスって…
0629デフォルトの名無しさん2005/08/22(月) 01:15:51
>>567
そもそもchar型ポインタにNULLのファイルポインタを代入している時点で
ファイルはクラッシュします.
NULLは0ではありません.
0630デフォルトの名無しさん2005/08/22(月) 01:24:35
>>567
ここを最初から最後まで読め。
ttp://www.kouno.jp/home/c_faq/c5.html
0631人事部2005/08/22(月) 02:22:37
社員番号 0x255の方、あなたに解雇処分が決定しました。
0632デフォルトの名無しさん2005/08/22(月) 02:26:36
>>629
あれ? そうだったっけ? それは保障されてなかったっけ?
0633デフォルトの名無しさん2005/08/22(月) 02:32:06
>>629
ポインタへの 0 の代入は NULL の代入になる。
http://www.kouno.jp/home/c_faq/c5.html#2
06346292005/08/22(月) 02:52:43
ごめんなさい,根本的なところを間違えていました.
fopen()で(FILE *)を返すのでFILEという構造体を返すものだと勘違いをしていました......
0635デフォルトの名無しさん2005/08/22(月) 05:11:11
スレ違いとアホ大杉…… orz
629 はてっきり冗談(悪意の)だと思ってたが…
つ ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
0636デフォルトの名無しさん2005/08/22(月) 07:28:15
>>566
>>558 を読んでやりなおし。
0637デフォルトの名無しさん2005/08/22(月) 08:45:21
友達はいても会社クビになる見苦しい人、何で恥の上塗りしてるんですか?
0638デフォルトの名無しさん2005/08/22(月) 13:46:07
>>631
>あなたに解雇処分が決定しました
日本語で話してください。
0639デフォルトの名無しさん2005/08/22(月) 14:28:55
>>638
あなたを、解雇です。
0640デフォルトの名無しさん2005/08/22(月) 14:40:09
お部屋をお連れします
0641デフォルトの名無しさん2005/08/22(月) 14:40:34
>>639
あなたに、解雇です。
0642デフォルトの名無しさん2005/08/22(月) 15:54:32
あなたは、可愛い子です
0643デフォルトの名無しさん2005/08/22(月) 17:26:50
いきなり大きなコピペでごめんなさい.
次の共用体を使ってshort型で入れた整数を
long型に変換するように作ったのですがどうしてもコメント行のような結果になりません.
どこかまずかったのかどなたかご指摘をお願いします....

/* int型をlong型に変換するプログラム */
#include <stdio.h>

union int_long {
 short i;
 long j;
} itl;

int main(void)
{
 itl.j = 0L;
 itl.i = 1024;

 printf("%ld", itl.j);
 // 00000100 00000000 00000000 00000000 = 67108864
 return 0;
}
0644デフォルトの名無しさん2005/08/22(月) 17:35:32
>>643
なにがまずいわけ?
0645デフォルトの名無しさん2005/08/22(月) 17:36:26
>>643
Windowsの話なら
union int_long {
 short i[2];
 long j;
} itl;
にして、
 itl.i[1] = 1024;
とすることでコメント行の結果になる。
キーワードはhighとlow
0646デフォルトの名無しさん2005/08/22(月) 18:08:30
>>643
内部で Big endian (上位桁が下位アドレスに入る形式) で数値を扱っている
マシンならお望み通りになる。Little endian (下位桁が下位アドレスに入る
形式) のマシンの場合は正の整数の値の場合 short を long に入れても値に
変化はない。図にするとこうだ。

上位addr         下位addr
00000000 00000000 00000100 00000000
|-------------- long -------------|
         |------short-----|

ずれているかも知れないが脳内で修正しろ。
0647デフォルトの名無しさん2005/08/22(月) 18:10:21
そんなエサに俺様が
0648デフォルトの名無しさん2005/08/22(月) 18:10:54
ずれまくりw
0649デフォルトの名無しさん2005/08/22(月) 19:04:02
紛らわしい書き方だなぁ。
実際にメモリに置いた状態との対比とかしないと。
06506432005/08/22(月) 19:18:10
お返事ありがとうございます.
>>645,>>646
さんの通りにやったら思ったとおりの値が出ました.
あと,混乱するようなソースを作ってしまったのでこれも出来ればお願いします.
pak    |-[7]   [6]   .......    [2]  [1]  [0]----|
double  |---------------d---------------------|のように捉えたのですが考え方は間違ってますか?
union {
 double d;
 char pak[sizeof(double)];
} _ddat;

 int i;
 FILE *fp;
 _ddat.d = 1283648236.434532;

 if((fp = fopen("double", "wb+")) == NULL) {
  printf("ファイル展開に失敗.");
  exit(1);
 }

 for(i=sizeof(double); i; i--)
  fwrite(&_ddat.pak[i-1], sizeof(char), 1, fp);
 fclose(fp);
 _ddat.d = 0.0;

 if((fp = fopen("double", "rb")) == NULL) {
  printf("ファイル展開に失敗.");
  exit(1);
 }
 fread(&_ddat.d, sizeof(double), 1, fp);
 fclose(fp);
0651デフォルトの名無しさん2005/08/22(月) 19:28:48
なんか中庭ででけえ音楽鳴らして車に乗ってるカスがいるな
0652デフォルトの名無しさん2005/08/22(月) 19:29:39
雰囲気を感じ取ってもらえれば良いのですが、
#define OUTPUTNum1(fname,id1) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d" ,id1 );\
fclose( test );\
}
#define OUTPUTNum2(fname,id1,id2) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d" ,id1, id2 );\
fclose( test );\
}

#define OUTPUTNum3(fname,id1, id2, id3) \
{\
test = fopen( "unko.txt", "w" );\
fprintf( test, "%d %d %d" ,id1, id2, id3 );\
fclose( test );\
}
こんな感じの、可変長の引数にうまく対応するマクロ、
もっと簡潔にかけませんか?
0653デフォルトの名無しさん2005/08/22(月) 19:29:50
広い中庭ですね。
06546512005/08/22(月) 19:30:02
スレッドミス.....orz
スレ違いスマソ
0655デフォルトの名無しさん2005/08/22(月) 20:33:44
>>652
用途は違うかもしれないが、参考までに。
-- hoge.h --
#define _OUTPUT_FLAG

#ifdef _OUTPUT_FLAG
extern void _OutputNum( const char *format, ...);
 #define OUTPUT_NUM(...) _OutputNum(__VA_ARGS__)
#else
 #define OUTPUT_NUM(...) ((void)0)
#endif //_OUTPUT_FLAG

-- hoge.c --
#include "hoge.h"

#ifdef _OUTPUT_FLAG
 #include <stdio.h>
 #include <stdarg.h>
 void _OutputNum( const char *format, ...)
 {
  va_list args;
  char buf[256];
  FILE* fp = fopen( "unko.txt", "w" );
  
  va_start(args, format);
  vfprintf(fp, format, args);
  va_end(args);
  
  fclose(fp);
 }
#endif //_OUTPUT_FLAG
06566522005/08/22(月) 20:38:08
↑のように書くことで、OUTPUT_NUMマクロはprintfと同じ書式で
unko.txtに出力できるようになる。

また、_OUTPUT_FLAGの定義をコメントアウトすることで、
ソース中のOUTPUT_NUM()があっても出力を抑止できる。
0657デフォルトの名無しさん2005/08/22(月) 20:43:47
まさかこれほどすばらしい答えが得られるとは、
正直思っとりませんでした
さすが2ちゃん・・・
>>656さま本当にありがとうございました
06586562005/08/22(月) 20:48:46
今更ながら>>656の名前間違えてたorz
>>656 = >>655ね
なんで質問者になってるんだよ俺www

ちなみに、↑のはVCのTRACEマクロと同じやり方ね。
06596502005/08/22(月) 21:42:05
すみません.よく考えてみたのですが
union {
 short sht;
 char ch[4];
 long lng;
} test;
でポインタのアドレスを求めたら,
|--sht--|
|------lng------|
|--ch[0].......ch[3]--|
のようなアドレス分布になったのですが,このshtとlngを考えたら
どう考えてもlngの左端のビットにshtを介して1は入らないと思うのですが,実際は入ります.
>>646さんのように
      |--sht--|
|------lng------|
|--ch[3].......ch[0]--|
と考えるのでしょうか?double型のデータを一旦,共用体の配列メンバchから適当なファイルに保存して,double dとして読み込むと考えると以下のように
考えれば読み込めば正常な値が得られるのですが,
|------------------------double d--------------------------|
|-----ch[0]-----ch[1]---.............................----------------ch[7]----|
ひとたび,
|------------------------double d--------------------------|
|-----ch[7]-----ch[6]---.............................----------------ch[0]----|
と考えてやるとdouble dの値は意味のない値となってしまいます.
かなり混乱してしまって何がどうなっているのかよく,掴めません.どうか,お願いします.(´・ω・`)
0660デフォルトの名無しさん2005/08/22(月) 21:52:51
>>659
ビックエンディアンとリトルエンディアンは調べた?
■ このスレッドは過去ログ倉庫に格納されています