トップページ⇒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/
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
ビックエンディアンとリトルエンディアンは調べた?
0661デフォルトの名無しさん2005/08/22(月) 21:57:26
どう考えても...入るんじゃないのか?
0662デフォルトの名無しさん2005/08/22(月) 22:05:28
ググッたら IntelのCPUなのでリトルエンディアンを採用しているようです.
下位ビットから転送されるということは例えば,
ch[0] の値が100,ch[1] の値が120 としたとき二進数表記がそれぞれ 01100100,01111000
となっているとしたらメモリのビットの並びは
00100110 || 00011110
となっているということでしょうか?
0663デフォルトの名無しさん2005/08/22(月) 22:05:57
>>659
#include <stdio.h>
void dump(void *data, int size)
{
  unsigned char *p = data;
  int i;
  for(i = 0; i < size; ++i) printf("%02X ", p[i]);
  putchar('\n');
}

union { 
  short sht; 
  char ch[4]; 
  long lng;
} u_test;

int main()
{
  printf("ofset: 00 01 02 03\n------------------\n");
  u_test.sht = 0x1234;
  printf("sht  : "); dump(&u_test, sizeof(u_test));
  u_test.lng = 0x12345678;
  printf("lng  : "); dump(&u_test, sizeof(u_test));
  return 0;
}
06646592005/08/22(月) 22:12:39
すみません,コテ忘れました...>>662 == >>659です.
0665デフォルトの名無しさん2005/08/22(月) 22:17:23
なんか、バイナリ入出力だ endianだ、似たようなバカ
なこと聞いてくるのが沸いて出るなあ。
>>643,650
>>共用体を使ってshort型で入れた整数をlong型に変換
そもそも bit操作を(言われてもendianも理解しないで)
こういう方法でやるのが間違い。
というか、スレ違いは相手にするなと。
初心者系かなあ。少なくとも実用プログラムじゃないよなあ。
(もともとその処理自体意味無いんじゃね? 会社の、とか言い出したりして……)
0666デフォルトの名無しさん2005/08/22(月) 22:26:24
某所より


#include <stdio.h>

int sum(int,int);/* プロトタイプ宣言 */

int main(void)
{
int value;
value = sum(50,100);
printf("%d\n",value);
return 0;
}

int sum(int min,int max)
{
int num;
num = (min + max) * (max - min + 1) / 2;
return num;
}

return numはどこに返り?
return numでなくreturn 0ではだめなんですか?
0667デフォルトの名無しさん2005/08/22(月) 22:28:18
>>666
いいよ
0668デフォルトの名無しさん2005/08/22(月) 22:29:30
659,662 のあほさ加減は、ネタなんだよな!?
0669デフォルトの名無しさん2005/08/22(月) 22:31:07
>>666
return 0でもいいけど、それじゃ何のためにsum()呼んでるの?
0670デフォルトの名無しさん2005/08/22(月) 22:31:37
>>665
質問者と回答者の双方が学生さん
0671デフォルトの名無しさん2005/08/22(月) 22:32:15
いや、わかりません。。

解説おねがいできますか?
06726592005/08/22(月) 22:33:19
ネタではないです......
独習C の練習問題でどうしても解答のやっていることが理解できなくて質問させていただきました.
スレ違い,失礼いたしました.
0673デフォルトの名無しさん2005/08/22(月) 22:41:33
>>672
ちょっと待って。それこそ初心者系じゃないか、とか、
endianとかは他の書籍も参考にきちんと調べろよ、とか
は置いといて…
その「独習C の練習問題」というのは一般の書籍のことなのか?
スレ違いだがいちおう最後に晒してくれ。
(書籍にきちんと解説があるはずの場合もあるし、例題、書籍自体が
トンデモナイ場合があるので…)
0674デフォルトの名無しさん2005/08/22(月) 22:44:33
そもそも

return numとreturn 0

の違いが分かりません。。
厨質すんません。。
0675デフォルトの名無しさん2005/08/22(月) 22:45:02
そういうのは先生に聞いてくれ
0676デフォルトの名無しさん2005/08/22(月) 22:50:23
>>673
「独習C 第三版・Herbert Schildt著・翔泳社」です.
すでに改訂版が出ているようですが.....
事前に代入処理の型変換についての解説はありました.
0677デフォルトの名無しさん2005/08/22(月) 22:53:39
>>674
厨質にもほどがある。
まずはまともに本で自習してくれないか。
0678デフォルトの名無しさん2005/08/22(月) 22:54:41
今日からC言語を勉強し始めたばかりのものです。
ぶっちゃけ、
int a=1;
・・・・
とかからどうやってドラクエとか作るんでしょうか?めちゃめちゃ不思議です。
0679デフォルトの名無しさん2005/08/22(月) 22:54:47
>>677
いや、ネタだろういくらなんでも・・・
とりあえず676が本気でやる気あるのなら、
トリップつけて(自分でくぐれよ)初心者スレへどうぞ...
0680デフォルトの名無しさん2005/08/22(月) 22:56:45
猫。
ttp://www.kumei.ne.jp/c_lang/index_c.html
0681デフォルトの名無しさん2005/08/22(月) 22:59:05
>>678
戦闘のダメージとかはただの計算式だし
表示は画面を構成する二次元の点々に色付けるだけだし。
まずはマルバツでも作ってみたら。
ユーザーの入力、計算、画面の出力という意味でドラクエと変わらんw
0682デフォルトの名無しさん2005/08/22(月) 23:06:00
俺にはプログラムでドラクエが動くことよりも、ドット絵師の技術の方が不思議に見える。
0683デフォルトの名無しさん2005/08/22(月) 23:06:24
>>682
漏れも。
0684人事部2005/08/22(月) 23:20:22
社員番号:0x0255の方、次の職探しで大変ですね。
受けた会社から聞き合わせの電話が来たら、しっかりとあなたの問題行動を伝えておきますので。
0685デフォルトの名無しさん2005/08/22(月) 23:21:17
ヒットアンドブローはお手軽に作れてそれなりに遊べて、
プログラムの練習に超おすすめ。
0686デフォルトの名無しさん2005/08/22(月) 23:24:47
聞き合わせ?
0687デフォルトの名無しさん2005/08/23(火) 06:18:47
>>676
お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。

0688デフォルトの名無しさん2005/08/23(火) 09:43:34
プログラムの一部を//や/**/等でコメントにすることをなんと言いますか?
■ このスレッドは過去ログ倉庫に格納されています