C言語なら俺に聞け! Part 112
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/08/08(月) 01:32:01質問する前には最低限検索を。
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/
0604デフォルトの名無しさん
2005/08/21(日) 22:56:310605デフォルトの名無しさん
2005/08/21(日) 22:58:47見苦しいぞ
0606デフォルトの名無しさん
2005/08/21(日) 22:59:20たとえ何回ループされようとソースコード上ではたった1箇所でしか定義がなされていないから。
0607デフォルトの名無しさん
2005/08/21(日) 22:59:280608デフォルトの名無しさん
2005/08/21(日) 23:00:40一度目のループで宣言され
二度目のループで2回目は宣言されないのですか?
0609デフォルトの名無しさん
2005/08/21(日) 23:02:54悪いが言ってる意味が分からん
具体例を挙げてくれ
0610デフォルトの名無しさん
2005/08/21(日) 23:06:01だから1回目とか2回目と考えるのがナンセンス。
プログラムの実行するとき、ソース上でstatic変数の宣言している箇所を通ったらその変数が用意されるというわけではない。
コンパイル時にコンパイラがstatic変数を見つけたらその時点で領域を確保しておく。
実行時にはただ確保された箇所をstatic変数として使うだけ。実行時には宣言なんてどこにも残っていない。
0611デフォルトの名無しさん
2005/08/21(日) 23:06:53static int hoge = 0;
hoge++;
}
これだと何度もhogeが宣言されると思うのですが
0612デフォルトの名無しさん
2005/08/21(日) 23:08:48なんで?
0613デフォルトの名無しさん
2005/08/21(日) 23:08:54static の意味調べてね
べーた臭がする・・・
0614デフォルトの名無しさん
2005/08/21(日) 23:09:21プログラムの実行時に静的変数の宣言は実行されるものではない。
予め場所だけ用意しておき、静的変数を参照するときにはいつでもそこを見に行くだけ。
0615デフォルトの名無しさん
2005/08/21(日) 23:10:43static int hoge = 0;
hoge++;
}
は
static int hoge = 0;
void foo()
{
while(1){
hoge++;
}
}
とほぼ同じ。違いはブロックの外からは直接参照できないこと。
0616デフォルトの名無しさん
2005/08/21(日) 23:12:49お前友達いるのか?
0617597
2005/08/21(日) 23:17:00なんであなたは自分の意見を共有したがるのですか?
自分で意見があるのなら他人まで巻き込まないで自分で実行しましょうよ
>>616
いますよ
そんなこと聞いてどうするんですか?
私の経験から行くと、「友達いるのか?」って聞く人のほうが
友達がいないような気がするんですけど
0618デフォルトの名無しさん
2005/08/21(日) 23:19:490619デフォルトの名無しさん
2005/08/21(日) 23:21:34お前らがやめろ
それで終わる
0620デフォルトの名無しさん
2005/08/21(日) 23:22:150621デフォルトの名無しさん
2005/08/21(日) 23:26:14そうか、いるのか。
ふーん。では、ここではそういう現実とネット上の世界の区別を付けてるわけか。
0622デフォルトの名無しさん
2005/08/21(日) 23:28:130623デフォルトの名無しさん
2005/08/21(日) 23:40:46>なんであなたは自分の意見を共有したがるのですか?
あなたも >>569 の意見を共有できるものならしてみたらどうですか?
0624デフォルトの名無しさん
2005/08/21(日) 23:45:33NULL = ヌルポインタ
プロセスが0ということだ
int *a =0
は
int* a;
a = 0;
でポインタaにプロセス0を渡してる
0625デフォルトの名無しさん
2005/08/22(月) 00:00:55お前らって・・・
俺書き込んでなかったんだけど。
まあいいけどさ。
0626デフォルトの名無しさん
2005/08/22(月) 00:03:36お前も同類だバカ
0627社長
2005/08/22(月) 00:45:47解雇
0628デフォルトの名無しさん
2005/08/22(月) 00:58:23プロセスって…
0629デフォルトの名無しさん
2005/08/22(月) 01:15:51そもそもchar型ポインタにNULLのファイルポインタを代入している時点で
ファイルはクラッシュします.
NULLは0ではありません.
0630デフォルトの名無しさん
2005/08/22(月) 01:24:35ここを最初から最後まで読め。
ttp://www.kouno.jp/home/c_faq/c5.html
0631人事部
2005/08/22(月) 02:22:370632デフォルトの名無しさん
2005/08/22(月) 02:26:36あれ? そうだったっけ? それは保障されてなかったっけ?
0633デフォルトの名無しさん
2005/08/22(月) 02:32:06ポインタへの 0 の代入は NULL の代入になる。
http://www.kouno.jp/home/c_faq/c5.html#2
0634629
2005/08/22(月) 02:52:43fopen()で(FILE *)を返すのでFILEという構造体を返すものだと勘違いをしていました......
0635デフォルトの名無しさん
2005/08/22(月) 05:11:11629 はてっきり冗談(悪意の)だと思ってたが…
つ ttp://pc8.2ch.net/test/read.cgi/tech/1124511889/
0636デフォルトの名無しさん
2005/08/22(月) 07:28:15>>558 を読んでやりなおし。
0637デフォルトの名無しさん
2005/08/22(月) 08:45:210638デフォルトの名無しさん
2005/08/22(月) 13:46:07>あなたに解雇処分が決定しました
日本語で話してください。
0639デフォルトの名無しさん
2005/08/22(月) 14:28:55あなたを、解雇です。
0640デフォルトの名無しさん
2005/08/22(月) 14:40:090641デフォルトの名無しさん
2005/08/22(月) 14:40:34あなたに、解雇です。
0642デフォルトの名無しさん
2005/08/22(月) 15:54:320643デフォルトの名無しさん
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なにがまずいわけ?
0645デフォルトの名無しさん
2005/08/22(月) 17:36:26Windowsの話なら
union int_long {
short i[2];
long j;
} itl;
にして、
itl.i[1] = 1024;
とすることでコメント行の結果になる。
キーワードはhighとlow
0646デフォルトの名無しさん
2005/08/22(月) 18:08:30内部で Big endian (上位桁が下位アドレスに入る形式) で数値を扱っている
マシンならお望み通りになる。Little endian (下位桁が下位アドレスに入る
形式) のマシンの場合は正の整数の値の場合 short を long に入れても値に
変化はない。図にするとこうだ。
上位addr 下位addr
00000000 00000000 00000100 00000000
|-------------- long -------------|
|------short-----|
ずれているかも知れないが脳内で修正しろ。
0647デフォルトの名無しさん
2005/08/22(月) 18:10:210648デフォルトの名無しさん
2005/08/22(月) 18:10:540649デフォルトの名無しさん
2005/08/22(月) 19:04:02実際にメモリに置いた状態との対比とかしないと。
0650643
2005/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:480652デフォルトの名無しさん
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:500654651
2005/08/22(月) 19:30:02スレ違いスマソ
0655デフォルトの名無しさん
2005/08/22(月) 20:33:44用途は違うかもしれないが、参考までに。
-- 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
0656652
2005/08/22(月) 20:38:08unko.txtに出力できるようになる。
また、_OUTPUT_FLAGの定義をコメントアウトすることで、
ソース中のOUTPUT_NUM()があっても出力を抑止できる。
0657デフォルトの名無しさん
2005/08/22(月) 20:43:47正直思っとりませんでした
さすが2ちゃん・・・
>>656さま本当にありがとうございました
0658656
2005/08/22(月) 20:48:46>>656 = >>655ね
なんで質問者になってるんだよ俺www
ちなみに、↑のはVCのTRACEマクロと同じやり方ね。
0659650
2005/08/22(月) 21:42:05union {
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ビックエンディアンとリトルエンディアンは調べた?
0661デフォルトの名無しさん
2005/08/22(月) 21:57:260662デフォルトの名無しさん
2005/08/22(月) 22:05:28下位ビットから転送されるということは例えば,
ch[0] の値が100,ch[1] の値が120 としたとき二進数表記がそれぞれ 01100100,01111000
となっているとしたらメモリのビットの並びは
00100110 || 00011110
となっているということでしょうか?
0663デフォルトの名無しさん
2005/08/22(月) 22:05:57#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;
}
0665デフォルトの名無しさん
2005/08/22(月) 22:17:23なこと聞いてくるのが沸いて出るなあ。
>>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いいよ
0668デフォルトの名無しさん
2005/08/22(月) 22:29:300669デフォルトの名無しさん
2005/08/22(月) 22:31:07return 0でもいいけど、それじゃ何のためにsum()呼んでるの?
0670デフォルトの名無しさん
2005/08/22(月) 22:31:37質問者と回答者の双方が学生さん
0671デフォルトの名無しさん
2005/08/22(月) 22:32:15解説おねがいできますか?
0672659
2005/08/22(月) 22:33:19独習C の練習問題でどうしても解答のやっていることが理解できなくて質問させていただきました.
スレ違い,失礼いたしました.
0673デフォルトの名無しさん
2005/08/22(月) 22:41:33ちょっと待って。それこそ初心者系じゃないか、とか、
endianとかは他の書籍も参考にきちんと調べろよ、とか
は置いといて…
その「独習C の練習問題」というのは一般の書籍のことなのか?
スレ違いだがいちおう最後に晒してくれ。
(書籍にきちんと解説があるはずの場合もあるし、例題、書籍自体が
トンデモナイ場合があるので…)
0674デフォルトの名無しさん
2005/08/22(月) 22:44:33return numとreturn 0
の違いが分かりません。。
厨質すんません。。
0675デフォルトの名無しさん
2005/08/22(月) 22:45:020676デフォルトの名無しさん
2005/08/22(月) 22:50:23「独習C 第三版・Herbert Schildt著・翔泳社」です.
すでに改訂版が出ているようですが.....
事前に代入処理の型変換についての解説はありました.
0677デフォルトの名無しさん
2005/08/22(月) 22:53:39厨質にもほどがある。
まずはまともに本で自習してくれないか。
0678デフォルトの名無しさん
2005/08/22(月) 22:54:41ぶっちゃけ、
int a=1;
・・・・
とかからどうやってドラクエとか作るんでしょうか?めちゃめちゃ不思議です。
0679デフォルトの名無しさん
2005/08/22(月) 22:54:47いや、ネタだろういくらなんでも・・・
とりあえず676が本気でやる気あるのなら、
トリップつけて(自分でくぐれよ)初心者スレへどうぞ...
0680デフォルトの名無しさん
2005/08/22(月) 22:56:45ttp://www.kumei.ne.jp/c_lang/index_c.html
0681デフォルトの名無しさん
2005/08/22(月) 22:59:05戦闘のダメージとかはただの計算式だし
表示は画面を構成する二次元の点々に色付けるだけだし。
まずはマルバツでも作ってみたら。
ユーザーの入力、計算、画面の出力という意味でドラクエと変わらんw
0682デフォルトの名無しさん
2005/08/22(月) 23:06:000683デフォルトの名無しさん
2005/08/22(月) 23:06:24漏れも。
0684人事部
2005/08/22(月) 23:20:22受けた会社から聞き合わせの電話が来たら、しっかりとあなたの問題行動を伝えておきますので。
0685デフォルトの名無しさん
2005/08/22(月) 23:21:17プログラムの練習に超おすすめ。
0686デフォルトの名無しさん
2005/08/22(月) 23:24:470687デフォルトの名無しさん
2005/08/23(火) 06:18:47お手数です。続けるべきじゃないですがチト引っかかるので…
「代入処理の型変換」って「代入文での型変換」ということですよね。
そもそも、
>>643 >>共用体を使ってshort型で入れた整数をlong型に変換
にある例を、いわゆる"型変換"と呼ぶ(考える)のは誤解のもと
でしょうから注意。(強いて言えば byte(or bit)列の操作かなあ?)
その本も見たこと無いんで十分な説明があるのか良否はわかりませんが、
入門者に誤解を与えかねないのは危険かも。
どちらにせよ学習者が1冊だけを参考にするのは不備でしょう。
0688デフォルトの名無しさん
2005/08/23(火) 09:43:340689デフォルトの名無しさん
2005/08/23(火) 09:44:510690デフォルトの名無しさん
2005/08/23(火) 09:45:07コメントアウト
0691デフォルトの名無しさん
2005/08/23(火) 09:46:09ありがとう
では、コメントアウトした部分をもとに戻すことはなんと言いますか?
0692デフォルトの名無しさん
2005/08/23(火) 09:56:50encomment/decomment
0693デフォルトの名無しさん
2005/08/23(火) 13:05:450694デフォルトの名無しさん
2005/08/23(火) 17:19:150695デフォルトの名無しさん
2005/08/23(火) 17:34:200696デフォルトの名無しさん
2005/08/23(火) 23:18:29# なんだ、この流れは。
0697デフォルトの名無しさん
2005/08/23(火) 23:21:52uncomment out
オプションを設定するヘッダーファイルのなかでこんなの良く見るよ。
/* uncomment out the following line to enable XXX */
/* #define OPTION_XXX_ENABLED 1 */
0698デフォルトの名無しさん
2005/08/23(火) 23:43:39だれか分かり易く教えてくれない?
0699デフォルトの名無しさん
2005/08/23(火) 23:55:10リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
0700デフォルトの名無しさん
2005/08/23(火) 23:55:25A→Cの間にBを挿入するなら、BにCをつないで(B→C)、AにBを
つなげば(A→B)いい。
具体的にstruct list {struct list *next;};みたいな単純な線形リストなら、
CへのポインタをBのnextに入れて、BへのポインタをAのnextに代入する。
0701デフォルトの名無しさん
2005/08/24(水) 00:06:57◆を挿入
口→◆♂■⇒
0702698
2005/08/24(水) 00:25:47よんでもいまいちワカランのよ
0703デフォルトの名無しさん
2005/08/24(水) 00:26:590704デフォルトの名無しさん
2005/08/24(水) 00:31:15■ このスレッドは過去ログ倉庫に格納されています