トップページ⇒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/
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
プログラムの一部を//や/**/等でコメントにすることをなんと言いますか?
0689デフォルトの名無しさん2005/08/23(火) 09:44:51
コメントアウト
0690デフォルトの名無しさん2005/08/23(火) 09:45:07
>>688
コメントアウト
0691デフォルトの名無しさん2005/08/23(火) 09:46:09
>>689-690
ありがとう

では、コメントアウトした部分をもとに戻すことはなんと言いますか?
0692デフォルトの名無しさん2005/08/23(火) 09:56:50
あまり使わないような気もするけど
encomment/decomment
0693デフォルトの名無しさん2005/08/23(火) 13:05:45
コメントアウトを戻す
0694デフォルトの名無しさん2005/08/23(火) 17:19:15
コメントイン
0695デフォルトの名無しさん2005/08/23(火) 17:34:20
お前マジ頭いいな
0696デフォルトの名無しさん2005/08/23(火) 23:18:29
普通だって。
# なんだ、この流れは。
0697デフォルトの名無しさん2005/08/23(火) 23:21:52
>>691
uncomment 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
>>698
リストって線形リストか?
とりあえず新たに挿入するノードようの領域をmallocなりcallocなりで確保して
こいつへのポインタをnewにでも放り込んでおく
んで、挿入位置の直前にあるノード(A)の次のノードへのポインタをnewの次へのポインタに複写
その後、Aの次へのポインタをnewへのポインタに書き換えて終了
0700デフォルトの名無しさん2005/08/23(火) 23:55:25
>>698
A→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
口−−→■⇒

 ◆を挿入

口→◆♂■⇒
07026982005/08/24(水) 00:25:47
簡単な挿入をおこなってるプログラム書いてほしいって言ったら…駄目?

よんでもいまいちワカランのよ
0703デフォルトの名無しさん2005/08/24(水) 00:26:59
今読んでるの葬ってソースの載ってる本探せよ。
0704デフォルトの名無しさん2005/08/24(水) 00:31:15
持ってる本はリスト関連がのってなくて…
0705デフォルトの名無しさん2005/08/24(水) 00:31:56
>>704
線形リストでググれ
0706デフォルトの名無しさん2005/08/24(水) 03:25:26
単方向リスト?
双方向リスト?
0707デフォルトの名無しさん2005/08/24(水) 03:35:59
>>698の態度が気に入らない
0708デフォルトの名無しさん2005/08/24(水) 03:37:56
すいません、質問です

char * GetStr ()
{
 char _szTemp[128];
 strcpy(_szTemp, "abc");
 return _szTemp;
}

int main ()
{
 cout << GetStr() << endl;
 return 0;
}

GetStr()関数で char 型に入ってる文字列を返したいのですが、
どうすればいいんでしょうか。

void GetStr(char *_szTemp)

みたいに引数に入れて返すのではなく、
戻り値で返したいんです。
どなたかお願いします m(__)m
0709デフォルトの名無しさん2005/08/24(水) 03:40:50
char * GetStr (char *_szTemp)
{
 strcpy(_szTemp, "abc");
 return _szTemp;
}
07107082005/08/24(水) 03:45:23
>>709
にゃるほど。それで行けますね。
どうもありがとうございます。 m(__)m

GetStr()で宣言した文字列を返したほうがスマートになるような
気がするんですが、それは無理ですか?
0711デフォルトの名無しさん2005/08/24(水) 03:45:52
>>710
std::string GetStr() 
{
  std::string str("abc");
  return str; 
}
0712デフォルトの名無しさん2005/08/24(水) 03:49:27
/* 俺も暇だなぁ */
typedef struct ulist ulist;
struct ulist {
 int value;
 ulist *next;
};

ulist *ulist_create() {
 ulist *res = malloc(sizeof (ulist));
 res->value = 0;
 res->next = NULL;
}

void ulist_insert_next(ulist *prev, ulist *node) {
 node->next = prev->next;
 prev->next = node;
}

void ulist_remove_next(ulist *node) {
 ulist *next = node->next;
 if(next == NULL) { return; }
 node->next = next->next;
 free(next);
}

void ulist_free(ulist *node) {
 ulist *next;
 if(node == NULL) { return; }
 next = node->next;
 free(node);
 ulist_free(next);
}
0713デフォルトの名無しさん2005/08/24(水) 03:51:32
>>710
char *GetStr()
{
return "abc";
}

0714デフォルトの名無しさん2005/08/24(水) 03:53:55
>>710
動的に確保していいんなら

char *GetStr() {
 return strdup("abc");
}

きちんと後で free すること。


あと、静的なデータならそのまま return できる。

char *GetStr() {
 return "abc";
}

char *GetStr() {
 static char _szTemp[128];
 strcpy(_szTemp, "abc");
 return _szTemp;
}

ただ、静的なので当然データは同時に1つしか存在できない。
呼び出すたびに違うのを返したい場合には使えない。


ただまあ、普通は >>709 の形にするんじゃない?
■ このスレッドは過去ログ倉庫に格納されています