トップページ⇒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/
0357デフォルトの名無しさん2005/08/15(月) 21:09:23
ふ、ふろーと
0358デフォルトの名無しさん2005/08/15(月) 21:20:44
>>356
一般的にfloatの精度は23ビット、即ち高々7桁しかない。
従って、有効なのはは56.78000までが関の山。
%fの代わりに%gを使うことで、誤差を余り見ないで済むかもしれない。
尤も、素直にdoubleを使っとけと言う話になるが。
03593562005/08/15(月) 21:22:01
>>358
ありがとうございました。
0360デフォルトの名無しさん2005/08/16(火) 10:54:11
お邪魔します。

ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
コマンドの引数として、別のファイルの定数一覧からCSVの区切り文字数を受け取って
処理させるものを作りたいと思っていますが、どう作っていけばいいのか分かりません。

どんな感じで作る物なのか、ヒントかもしくは
参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
0361デフォルトの名無しさん2005/08/16(火) 12:12:25
>>360
>ファイル内のバイナリの数字の羅列に対して、CSV処理するコマンドを作りたいです。
具体例をあげて何がしたいのか説明して。
0362デフォルトの名無しさん2005/08/16(火) 12:16:53
エラトステネスのふるいのプログラムがわからないので質問させて下さい。

#include <stdio.h>

#defineN 1000 /* Nまでの素数を求める*/
#defineTRUE 1 /* 真:素数である */
#defineFALSE 0 /* 偽:素数でない */
charis_prime[ N+1 ]; /* 結果を格納する配列*/

int main( void )
{
int i, j;

/* 配列を初期化 */
for( i = 1; i <= N; i++ )
{
is_prime[ i ] = TRUE; /* 最初はすべて「素数」とする */
}
is_prime[ 1 ] = FALSE;

/* エラトステネスのふるい */
for( i = 2; i*i <= N; i++ )
if ( is_prime[ i ] )
for( j = i*2; j <= N; j += i )
is_prime[ j ] = FALSE; /* この倍数は「素数」でない */
/* 結果の出力 */
printf( "%dまでの素数は、\n", N );
for( i = 1; i <= N; i++ )
if ( is_prime[ i ] )
printf( "%d ", i );
return 0;
}
0363デフォルトの名無しさん2005/08/16(火) 12:19:48
>>360
>>1読め。ここは「C言語」自身に関して、だから
プログラムの組み方、等は激しくスレ違い。
0364デフォルトの名無しさん2005/08/16(火) 12:22:16
このソースのエラトステネスのふるいのfor文if文がわかりません。
最初のfor文のi*iの意味、次のif文に論理演算子がないこと、次のfor文のi*2の意味
がわかりません。

そこがわからないので結果の出力のfor文とif文もわからないです。

ネットでも調べたり本でも調べたんですけど、他のソースは別の書き方をしていて
そのやり方なら理解できるのですが、このソースはちょっとわからないのでよろしくお願いします。
0365デフォルトの名無しさん2005/08/16(火) 12:42:25
>>362

>最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。

>次の if 文に論理演算子がない
C の条件判断は、0 以外で真。
つまり、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。

>その次の for の i*2 の意味
さらにその次の行のコメントのとおり、
素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。

こんな感じでどうよ?
0366デフォルトの名無しさん2005/08/16(火) 13:14:29
>最初の for の i*i の意味
ある数の約数の片方は必ず平方根以下であるから。
逆に考えると、約数( = i )の2乗が合成数以下。

これはわかりました。

>、#define された TRUE が入ってれば真になる。
そもそも C には本当の意味での bool 型がないから整数で代用してる。
if文のis_prime[i]が整数で代用してるってことですか?ここら辺がちょっとわからないんですけど。
s_prime[i]は確かに整数・・・ああ、なんとなくわかってきた気がします。
s_prime[i]の要素の整数とif文の条件判断で使う1,0の整数と整数は二つありますね。
1,0の整数のことですね。ただif ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
何かの省略なんでしょうか?

>素数の *2 *3 *4 …を約数でないとするため、
i*2 i*3 i*4…の数列を作るための for 文。
i*2の2がわからないです。jがカウントアップしていきますよね。
そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思うのですが、

すぐ答えていただきありがとうございます。できればもうちょっとだけ上記のヒントを下さい。

0367デフォルトの名無しさん2005/08/16(火) 13:50:06
>if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。
つ[if文の定義]
03683652005/08/16(火) 14:14:47
>>366

>if ( is_prime[ i ] ) の括弧の中がis_prime[ i ] !=0とかとなっていないのがわからないです。

if 文は 真/偽 を判断する、と考えてるとそういう思考に陥ります。
まず定義として if 文は、条件として与えるものは整数で、「0 か否か」を「偽 or 真」として判断します。

そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。

>そのときに2が変数でカウントアップしていかないと常に2の倍数になってしまうと思う

2が変数ってどういうことでしょうか?

for( j = i*2; j <= N; j += i )

i*2 は最初の j の値で、二週目以降 i ずつ増えます。
つまり、i*2、i*2+i、i*2+i+i、…となるわけで、i*2 i*3 i*4…となるわけです。
0369デフォルトの名無しさん2005/08/16(火) 15:27:07
唐突なんですが、構造体のポインタを返す関数があったらそのポインタの指すメモリ領域は
いつ開放されるのでしょうか。

関数の中で新たにヒープに割り当てて、そのアドレスを返したりしているのだったら、
あとでfreeなどで開放してやらないとマズイと思うのですが、
標準関数のlocaltimeなんかはそんなことしませんし。
その辺の解説してもらえるとありがたいです。
0370デフォルトの名無しさん2005/08/16(火) 15:48:41
ヒープに割り当ててないから。
0371デフォルトの名無しさん2005/08/16(火) 15:53:48
>>369
libc の localtime は、static な構造体へのポインタを返したり、
内部で自動確保&終了時に自動破棄しています。
そのため、受け取ったポインタを明示的に破棄する必要はありません。

ただし、前者はマルチスレッドの時に問題を引き起こす可能性がある
( 排他処理すればいいけどね ) ので、あまりおすすめはされない手法です。

そんなわけで生存期間は実装依存になるため、
あまり離れると移植性の点で問題になるかもしれません。
すぐに手元のローカル変数などにコピーするのがベターです。

ちなみに自分で関数を書く場合には、
struct tm *localtime_r(const time_t *timep, struct tm *result);
この result 引数のように、バッファを渡してもらう形にすると
余計なことを考えなくて済むのでベストです。
03723692005/08/16(火) 16:09:02
>>370
回答ありがとう。
書き方が悪くてすみません。
localtimeは開放しない関数の例として挙げました。
一般に内部しようの分からない関数だったり、自分で作ったりしたときの当該問題における
寿命についての質問です。
03733692005/08/16(火) 16:16:29
>>371
あらたな回答ありがと。

localtimeの仕様は了解しました。
さっきの質問、書き方が悪かったのですが、自分で作った関数内でメモリを割り当てて
そのポインタを返した場合はどうのようにするのが、適切なんでしょうか。

例えば、調べてて、見つけたのですが下記のようなプログラムは非常にマズイと思います。
ttp://c-production.com/contents/c/sec11.html#15

0374デフォルトの名無しさん2005/08/16(火) 16:30:49
>>373
その例がマズイと思えるなら特に言及する必要はなさそうね。

>>371 の最後に書いてあるように、特に何か事情がない限りは
バッファは呼び出し側が用意するのが一番いいかな。
new で確保して free() で解放するようなバグをなくすためにも。

どうしても関数内でメモリを確保しなきゃならないときは、
malloc で確保したら free、new で確保したら delete・・・
というルールを忠実に守ればOK。
0375デフォルトの名無しさん2005/08/16(火) 16:31:14
>>373
fopen()とfclose()みたいに、リソースを確保する関数と開放する関数を作って、
必ず両方呼び出してくださいとすればいいと思う。
(直接「free()を呼び出して下さい」でもいいと思うけど)

そのリンク先は、引数は値渡しなんだから、リターンも値で返せばいいのにな。
0376デフォルトの名無しさん2005/08/16(火) 16:41:01
>>374-375

よくわかりました。
そのルールを徹底します。
丁寧な解説ありがとうございました。
0377デフォルトの名無しさん2005/08/16(火) 16:52:11
>>373の例・・・なんでマズイんか教えてください。。
夏厨で申し訳ないんですが・・・orz
0378デフォルトの名無しさん2005/08/16(火) 16:57:37
>>377
変数 st のスコープが関数 p_output() 内に限られてるため、
st のメモリ領域は関数を抜けた時点で無効になる。
だから main() でこのポインタの先にアクセスしちゃだめ。
0379デフォルトの名無しさん2005/08/16(火) 17:00:22
例はたまたまうまく逝くだけ。以下のように変えると良く分かるかも。


#include<stdio.h>
struct st_samp{
int x;
int y;
int z;
};
struct st_samp *p_output(struct st_samp st);

int main()
{

struct st_samp s1={2,3,0}, s2={4,5,0};
struct st_samp *p_st;

p_st = p_output(s1);
p_output(s2);

printf("%d * %d = %d\n",p_st->x,p_st->y,p_st->z);
return 0;
}

struct st_samp *p_output(struct st_samp st)
{
st.z = st.x * st.y;
return &st;
}
0380デフォルトの名無しさん2005/08/16(火) 19:01:35
C++スレで質問してしまったので、こちらへ移動させて下さい
a_positionの位置から、配列の後>前へとhoge処理を行いたいのですが
これをfor文だけで綺麗に記述することは可能でしょうか

if( a_position == 0 )
 hoge( *array );
else
 for( int i = a_position; i >= 0; --i ) hoge( array[i] );
0381デフォルトの名無しさん2005/08/16(火) 19:02:45
for( int i = a_position; i >= 0; --i ) hoge( array[i] ); 
これで何が問題?
0382デフォルトの名無しさん2005/08/16(火) 19:09:30
381の回答がすぐ出ないC++スレの連中は一体
03833802005/08/16(火) 19:13:05
>>381
申し訳ないです、仰るとおりっす
これと間違えていました…

if( a_position == 0 )
 hoge( *array );
else
 for( unsigned long i = a_position; i >= 0; --i ) hoge( array[i] );
03843802005/08/16(火) 19:19:55
すいません、>>383もバグありです
要するに符号無しでの綺麗なループの話だったのですが、ぐだぐだなので出直してきます
0385デフォルトの名無しさん2005/08/16(火) 19:21:06
添え字にunsignedを使いたいなら
for( unsigned long i = a_position+1;i--;)hoge( array[i] );
03863802005/08/16(火) 19:27:45
これで解決できました…こんな事でスレ汚しすいません

unsigned long a_position = 0;
do{
 hoge( array[i] );
}while( array_pos-- != 0 );

と、思ったら>>385さんのスマートなレスが!
やっぱり聞いて良かった、ありがとうございました。
ループは前置って刷り込みが駄目でした orz
0387デフォルトの名無しさん2005/08/16(火) 19:29:42
unsigned long a_position = 0;
do{
 hoge( array[a_position] );
}while( a_position-- != 0 );

もう寝よう…
0388デフォルトの名無しさん2005/08/16(火) 20:48:18
ほんとうに(なんで) unsigned long の範囲じゃないといけないのか?
含めて意味ないしすべてスレ違いだと思う。
>>385 境界条件 a_position = ULONG_MAX のふるまいは無視なのか?
03893602005/08/16(火) 21:01:21
>>361
具体的に言うとファイル内に
「1234567890」
等の数字(バイナリ)が入っていて、
また別のファイルに
「3,4,3」
のように数字が入っていて、
これを
「123,4567,890」
に変える処理でう。


>>Cでプログラムを作るのですが、
 Cの仕様に関する質問じゃないとダメでしょうか?
03903602005/08/16(火) 21:02:30
↑すみません抜けてました。
下段のは「>>363」です。
03913852005/08/16(火) 21:08:29
>>388
a_position = ULONG_MAX のときは、
array の配列長が ULONG_MAX より大きいということになるから無視ということで。
無視してもそんな馬鹿でかい配列は滅多に無いですし、実用上は問題ないでしょう。
一応それも回避するなら >>386(の間違いを直したやつ)で
unsigned long i = a_position;
do hoge(array[i]);while(i-- != 0);
0392デフォルトの名無しさん2005/08/16(火) 21:09:02
>>360
バイナリを連呼しているが、「バイナリ」と「区切り文字数」という二つの単語は矛盾しているよ。
ファイルには単に十進数字文字が入っているだけだろ
03933602005/08/16(火) 21:11:58
>>392
すみません、ちょっと抜けてました。

元のファイルはバイナリで、
それをテキストファイルに、特定の箇所に「,」を入れて出力する感じになります。
0394デフォルトの名無しさん2005/08/16(火) 21:13:01
>>393
そのバイナリファイルには何が入ってるんだ?入ってるのは文字では
ないわけだからカンマ区切りも何もないわけだが。
0395デフォルトの名無しさん2005/08/16(火) 21:18:23
>>383
このスレって黙ってC99前提?
0396デフォルトの名無しさん2005/08/16(火) 21:19:23
>>395
どっちでもいいんじゃね?
0397360=389=3932005/08/16(火) 21:21:28
>>394
見づらくなってしまって申し訳ありません。

書き込みが>>360と>>389と>>393とに分かれてしまっています。
>>389の書き込みで返事になるでしょうか?
0398デフォルトの名無しさん2005/08/16(火) 21:23:12
>>397
なってない。数"字"とバイナリデータを一緒にするな。
0399デフォルトの名無しさん2005/08/16(火) 21:24:51
>>389,360
ソース丸投げだか初心者向きかに逝け、と言われとるんだよ。
質問さえきちんとできてないだろ? ヒント程度では手も足も出ないだろ?
>>394 マヌケは質問者の補助にもならないから黙ってろ。
0400360=389=3932005/08/16(火) 21:28:37
了解しました。

初心者向き、もしくはソース丸投げスレを探してみます。
お騒がせして申し訳ありませんでした。
0401デフォルトの名無しさん2005/08/16(火) 21:58:23
>>360の言いたいのは
要するにバイナリダンプだろ。単にスペースがカンマになっただけで
[offset]: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF
----------------------------------------------------------------------------
00000000: 4D,5A,90,00,03,00,00,00,04,00,00,00,FF,FF,00,00 MZ・..........
00000010: B8,00,00,00,00,00,00,00,40,00,00,00,00,00,00,00 ク.......@.......
00000020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ................
04023602005/08/16(火) 22:55:23
>>401
フォローしていただいてありがたい所ですが、自分でもよく分かりません。

先日見た設定書では、
ファイルの中の先頭から**バイトにAの情報、次の**バイトにBの情報、・・・
というようなことが書かれていたと記憶しています。
また、「ダンプ」という言葉もチラッと耳にした覚えがあります。

教えを請うには色々と情報が足りなかったようです。
0403デフォルトの名無しさん2005/08/16(火) 23:04:48
>>368
>そして、!= とか == などの演算子は、0 かそれ以外の値をとる整数値になります。
>よって、 たとえば (12 == 13) という条件文は「偽」ではなく 0 という "整数" をとります。

比較演算子は0か1を返してくるよ。
a = ( x > 0 ) ? ( 1 ) : ( 0 );
は
a = x > 0;
と同じ。
見辛いからあまりお勧めはしないけど。
0404デフォルトの名無しさん2005/08/16(火) 23:17:29
>>403
...
0405デフォルトの名無しさん2005/08/16(火) 23:19:19
>>403は何が言いたいのか
0406デフォルトの名無しさん2005/08/16(火) 23:26:15
>>404,405
?
比較演算子は0か1しか返さないって言いたいだけだよ。
0かそれ以外の整数を返すって>>368に書いてあるじゃん。
0407デフォルトの名無しさん2005/08/16(火) 23:39:34
>>406
ならば次の順序で書くべきだな。

a = x > 0;
は
a = ( x > 0 ) ? ( 1 ) : ( 0 );
と同じ。
0408デフォルトの名無しさん2005/08/16(火) 23:43:19
>>404==405==407?
結局何が言いたいの?
0409デフォルトの名無しさん2005/08/16(火) 23:43:40
初歩的な質問で申し訳ないのですが

変数の初期化について質問です

unsigned int x=0;

x++;

こんなプログラムを書いたとすると

延々 xが0になっちゃいますよね

一回だけ初期化して 二回目は無視みたいなことは簡単にできないのでしょうか?
0410デフォルトの名無しさん2005/08/16(火) 23:46:39
>>409
unsigned int x=0;
x++;
こんなプログラムを書くとx==1になるが?
0411デフォルトの名無しさん2005/08/16(火) 23:46:45
static unsigned int x=0;
しかしわかりにくい日本語と情報量だな、>>409糞ガキ
0412デフォルトの名無しさん2005/08/16(火) 23:57:57
比較演算子の演算結果って真偽じゃないの?
0と-1の可能性もあると思ったけど
0413デフォルトの名無しさん2005/08/16(火) 23:59:48
>>409
つ[static]
0414デフォルトの名無しさん2005/08/17(水) 00:00:48
>>402,360
>フォローしていただいてありがたい所ですが、自分でもよく分かりません。
まともに質問できないどころか、設計、仕様さえ理解してなかったわけね。
いいかげん腹たってくるな。ここでそんな告白しないで、挨拶して誘導して、
あっちでちゃんととりさげるのが筋じゃあるまいか? (あやまれとまで言わんが)
ttp://pc8.2ch.net/test/read.cgi/tech/1121644782/433
>教えを請うには色々と情報が足りなかったようです。
まあ、仕事がらみなら会社ん中でちゃんと解決しろよ。
もともとほんとにこの程度の話なら、基礎応用に過ぎないので、
解説やらヒントも何も、アドバイスしようが無いほどなので。
0415デフォルトの名無しさん2005/08/17(水) 00:06:54
>>412
ISO/IEC 9899:1999の6.5.8 -6と6.5.9 -3によれば、Relational operatorsも
Equality operatorsも共に結果は0と1で、その型はintだそうな。
0416デフォルトの名無しさん2005/08/17(水) 00:35:53
C言語の本 買ったは良いけれど
他に アルゴリズムの本買えば
C言語のプログラムは作れる様になるの?
0417デフォルトの名無しさん2005/08/17(水) 00:37:34
>>411 413

それでやったけど 延々1のままです
0418デフォルトの名無しさん2005/08/17(水) 00:42:05
日本語が使えないなら該当コード晒せよ
0419デフォルトの名無しさん2005/08/17(水) 00:45:38
もうグローバル変数でも使ってください。
0420デフォルトの名無しさん2005/08/17(水) 00:47:43
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
}

省略するとこんな感じですかね
0421デフォルトの名無しさん2005/08/17(水) 00:52:13
>>420
まさか起動する度に数字を変化させたいのか?
だったらファイルに書き出すしかない。
0422デフォルトの名無しさん2005/08/17(水) 00:53:04
市ね>>420
市ね>>420
市ね>>420
市ね>>420
氏ね!>420
0423デフォルトの名無しさん2005/08/17(水) 00:53:26
爆笑スマソ
0424デフォルトの名無しさん2005/08/17(水) 00:56:15
>>420
何がしたいのかハッキリ書かんと
どうしようもないよ
0425デフォルトの名無しさん2005/08/17(水) 00:58:03
おそらく>>421の書いたとおりのことじゃないのか
0426デフォルトの名無しさん2005/08/17(水) 00:58:05
>>424

あ いけました
0427デフォルトの名無しさん2005/08/17(水) 01:02:04
そうか、いけたんか。
なんか、もやもやする。
0428デフォルトの名無しさん2005/08/17(水) 01:13:28
>>427

と思ったらいけてないかもorz

pspの自作プログラムのソースをいじってるところなんです
0429デフォルトの名無しさん2005/08/17(水) 01:37:21
int main(int aaa char* aaa[])
{
static unsigned int c=0;
c++;
Printf("%d",c);
main(aaa,aaa)
}
。
0430デフォルトの名無しさん2005/08/17(水) 01:45:21
>>429
えぇっと、何がしたいんですかぇ?

先ず、何でもいいからC言語の本買ってきて
読みましょう。
0431デフォルトの名無しさん2005/08/17(水) 01:48:18
あっ、ついでに言うと
メチャクチャです。
04324202005/08/17(水) 02:00:05
ありゃ ここ IDでないのか

>>430


429は僕じゃないです
0433デフォルトの名無しさん2005/08/17(水) 02:01:11
じゃあ再帰でどうよ?みたいなネタでしょ。
>>409が再帰を理解しているとは思えんし。
0434デフォルトの名無しさん2005/08/17(水) 02:03:33
>>432
そっそうですか。
でも、先ず本読んでください。
0435デフォルトの名無しさん2005/08/17(水) 03:24:42
(笑) >>1嫁。>>420含めておまえらみんな出て逝け(怒)
0436ぼるじょあ ◆yBEncckFOU 2005/08/17(水) 09:20:26
(・3・)
0437ぼるじょあ ◆yBEncckFOU 2005/08/17(水) 10:35:54
>>436
(・3・)エェー ちみも出て行けYO!
04383772005/08/17(水) 14:02:29
>>378-379さん
遅レスになりましたがわかりました、どうもありがとうございます!!
0439デフォルトの名無しさん2005/08/17(水) 18:00:21
初歩的な質問ですが、

固定文字列をソースの中に持たせる時、
1) #define FIXED_STRING "hogehoge"
2) static const char* FIXED_STRING[] = "hogehoge";
と2種類の方法がありますが、両者に違いはあるのでしょうか?
違うのだとしたら、どういう場合で使い分ければよいのでしょうか?

「こういうときはこうする」、「俺はこうしてる」等
意見があったら教えてください。
0440デフォルトの名無しさん2005/08/17(水) 18:07:53
>>439
前者は後者より古い流儀。
後者は前者よりプログラムサイズが小さくなるけど、
それ以外の違いは開発時に感じた事はないな。
0441デフォルトの名無しさん2005/08/17(水) 18:09:48
>>439
static const char* FIXED_STRING[] = "hogehoge";

これは構文ネラーになるはず
0442デフォルトの名無しさん2005/08/17(水) 18:22:15
>>439
static const char FIXED_STRING[] = "hogehoge";
か
static const char* FIXED_STRING = "hogehoge";
ですね。一般的にマクロはデバッグしにくくなりますね。今回の場合は
関係ないかもしれませんが。
0443デフォルトの名無しさん2005/08/17(水) 18:31:16
>442の前者は配列なので長さをsizeof(FIXED_STRING)-1で得られる代わりに、
複数の関数内で利用すると実体が複数作られる。
後者は長さが得られないが実体は複数作られない(かもしれない)。
Cの場合、マクロで充分な気もするのだが。
0444デフォルトの名無しさん2005/08/17(水) 19:54:15
const 変数て、Cだと定数扱いにならないんじゃなかたっけ?
配列サイズの指定で使えない。
0445デフォルトの名無しさん2005/08/17(水) 21:20:29
char[]だとコンパイル時に連結できない
マクロならできる
0446デフォルトの名無しさん2005/08/17(水) 21:26:39
>>445
イヤな使い方だw
0447デフォルトの名無しさんNGNG
>>440
staticにしてるってことは、インクルードファイルにでも書いておいて、
それぞれのファイルで、インクルードするような使い方を想定してるっぽいから、
ファイルサイズは小さくはならないと思う。
0448デフォルトの名無しさん2005/08/17(水) 22:30:54
グローバル変数にすればいい
0449デフォルトの名無しさん2005/08/17(水) 22:37:13
(^^)
0450デフォルトの名無しさん2005/08/18(木) 00:16:18
>>445>>446
#define INI_FILE_DIR "../config"
#define INI_FILE_NAME "foo.ini"

fopen(INI_FILE_DIR "/" INI_FILE_NAME, "r");
とか?
別にいいじゃん。
0451デフォルトの名無しさん2005/08/18(木) 00:36:05
>>450
お前は俺か!>>445じゃないけど
0452デフォルトの名無しさん2005/08/18(木) 00:54:11
マクロなら#ifdefできる。
0453デフォルトの名無しさん2005/08/18(木) 00:55:53
>>452
使えても便利と思ったことはない
0454デフォルトの名無しさん2005/08/18(木) 01:10:45
正直、マクロは結構見辛い。
ただ、セミコロンを打たなくていいのは結構うれしい。
0455デフォルトの名無しさん2005/08/18(木) 01:25:33
セミコロンうたないとオートインデントがおかしくなるんですよ。
0456デフォルトの名無しさん2005/08/18(木) 03:10:20
10人の身長デ−タ(data)を背の高い順に並べ換えた後打ち出すプログラムです。正しく動くように虫を取って下さい。
#include<stdio.h>
#define num=10;
int i;
double data[num]={ 173.8,168.2,180.3,166.0,189.7,167.4,159.8,170.5,167.5,167.4};
int main(void)
{
 for(i=1;i<=num;i++){
  int j,max=i;
  for(j=i+1;j<=num;j++) /*最大の要素の場所を捜す*/
   if (data[max]<data[j]) max=j;
  data[i]=data[max];
  data[max]=data[i]; /*入れ換え*/
 }
 for(i=1;i<=num;i++) printf("%7.1f ",data[i]);
 return 0;
}
■ このスレッドは過去ログ倉庫に格納されています