1 :
v(^o^i)d :
04/10/02 14:50:53
2 :
デフォルトの名無しさん :04/10/02 14:51:36
2
4 :
デフォルトの名無しさん :04/10/02 19:50:01
ifで式を , で複数書いたとき一番右の式だけが評価されて次の行に実行が移るのですが これは仕様で決まっているのですか?
>>4 >ifで式を , で複数書いたとき一番右の式だけが評価されて
んなこたーない。
VBとかでのdir関数に相当する事をC言語の標準関数でできますか? やっぱりAPIを使う必要がありますか。
Ruby!!!
>>6 システムコールを使わないとだめだね。
だって環境によって違うもの。
9 :
デフォルトの名無しさん :04/10/02 20:08:35
>>5 #include <stdio.h>
int main(void)
{
int m=0;
if (m == 0, m == 1) printf("%d %d\n", __LINE__, m);
if (m == 0, m == 1, m == 0) printf("%d %d\n", __LINE__, m);
if (m == 0, m == 1, m == 0, m == 1) printf("%d %d\n", __LINE__, m);
if (m == 0, m == 1, m == 0, m == 1, m == 0) printf("%d %d\n", __LINE__, m);
if (m == 0, m == 1, m == 0, m == 1, m == 0, m == 1) printf("%d %d\n", __LINE__, m);
return 0;
}
これで一番右がm==0の時だけ真と評価されているみたいなんですけど
実際はどういう動作をしているんでしょうか?
>>9 m == 0 もしっかり評価されている。
その後、最後に書いた m == 1 の結果が
全体的な式の評価結果となっているだけだ。
if (printf("評価してるよー\n"), m == 0)
を実行してみろ。
>>9 m = 0;
m = 1;
m = 2
if(m == 2) printf("mは2です。");
とするとm = 0; m = 1; m = 2;すべてが実行されて
最終的にmは2になるだろ。
それと似たような原理で、すべて評価した上で最後の式が
ifにかけられている。
つか、まずは「評価」という言葉の意味をしっかり理解しれ
volatileってなに? 言語仕様の外側の話?
その変数への最適化を抑制するようにコンパイラに指示する
全角で書くな
マルチスレッド動作してたり、割り込み処理があるなどで変数が突然書き換わる場合があるときにつけるやつ
いみわかんね 言語仕様として定義できるキーワードじゃないってこと?
19 :
デフォルトの名無しさん :04/10/02 20:39:32
彼女のはあともvolatile ↑こんなかんじ
int i = 0; while(i == 0){ printf("Waiting...\n"); } は、最適化されて while(1){ printf("Waiting...\n"); } こういう動作をしても仕様上問題はない。 しかし、他のスレッドから書き換えられるのを待ってたりするときに 最適化されて評価されないと困る。 だから、volatileを付けてiに最適化を加えるなと指示する。
>>8 やっぱりそうですか。ありがとうございました。
>>18 いみわかんねー奴には
一生関係ないものだ。
もともと足りない脳みそを
無駄に使うようなマネをするな。
宿題で「この中からC言語の仕様として定められているキーワードを選びなさい」という問題が出てるんでしょ。
>>24 はあ?w
volatileはどう考えてもC言語の使用だろ?w
volatileはコンパイラへのメッセージ。 言語仕様ではない、かも。。
>>26 >volatileはコンパイラへのメッセージ。
いみふめ。
ソースコードは全て「コンパイラへのメッセージ」だろ?
>>26 何をもって「言語仕様」と言ってるのかはわからんけど。
少なくとも規格にはありますぜ。
こうしてまたひとつ新たなトリビアが誕生しました 「volatileは、言語仕様ではない」
trivialな例で申し訳ないが、以下の関数fooが割込処理にiのアドレスを登録するものだったとする。 その割込処理は登録されたアドレスに何か書いたりする。 void func(void) { static int i; foo(&i); i = 1; while (i) ; } んで、のようにやったときはループから抜け出すことができない(可能性がある)。 コンパイラは最適化でiは1から変わらないと思ってiの評価をループの外で終える ようにするかもしれないからだ。 しかし、iの宣言をvolatileつきにすると、そのような最適化は一切行わない。 なので割込処理でiに0を設定するとループから抜けるようになる。 この辺がvolatileの存在意義。
>>32 NULL の内部表現は 0 とは限りません。
'N''U''L''L'という文字が入っている可能性だってあります。
>>33 NULL は0です。
しかし、必ずしも
0の機械上での表現が
0x0000とは限りません。
>>32 一応FAQなんだけど、ポインタとして評価される文脈で字面の0が出てきたら、
それはNULLポインタとして扱われる。また、その文脈ではNULLポインタは
0として扱われる。
これはあくまでCとしての評価の話で、NULLポインタが実際にバイナリ0で
あるかどうかとは関係のない話なのだ。ただし、おれはNULLポインタを
バイナリ0以外にしている処理系は見たことがないが規格上は区別されてる。
ポインタとして扱われる文脈とは、たとえば
(void *)0; /* キャスト */
int *i = 0; /* ポインタ変数への代入*/
void foo(void *);
foo(0); /* ポインタを取る関数のパラメータ */
など。fooを例に取るとこいつに渡るのはたしかにvoid*型のNULLポインタなのだが、
パラメータを積んだスタックにバイナリ0があるとは限らないっていうこと。
# もっともスタック渡しかどうかも処理系によるんだけどそこはそれ
>>34 はじめから内部表現の話をしているのだから一行目の突っ込みは意味不明だが・・・。
>>35 昔そういう環境もあったって話が過去スレであった気がする。
>>32 >NULLの内部表現は0と一致していると私は思うのですが、
>先輩はNULLの内部表現は0とは限らない、
ここで書かれている 0 が内部表現なのか数値なのかによって
話が変わってくるから、いくら議論しても無駄。
ていうか、 「どちらも本当。但し、話がかみ合っていないけど」 という回答もありうるな。
>>32 「内部表現」の意味がわかってない気がする。
つーか、ネタだろ・・ 新スレになったばっかだっつーのにご苦労さん
printf("%s\n", NULL); ってやると、 (null) ってでるよな。 てことは、どこかで #define NULL "(null)" ってやってあるのか?
>>42 printfの中で
0なら"(null)"を出力する
というふうにしてるんだろ。
char *ptr = 0; *ptr = 1; ってやると、 ぬるぽ ってでるよな。 てことは、どこかで #define ぬるぽ 1 ってやってあるのか?
プックス
46 :
デフォルトの名無しさん :04/10/03 00:44:07
先生!Wide Studioでボタンに出力ってどうするんですか。
おまいら、ヘッダファイルをのぞいてみましたよ。 linuxならこんな感じ。 % grep "define NULL " /usr/include/*/** /usr/include/g++-3/streambuf.h:#define NULL (__null) /usr/include/g++-3/streambuf.h:#define NULL (0) /usr/include/linux/stddef.h:#define NULL 0 /usr/include/linux/stddef.h:#define NULL ((void *)0)
grepの使い方間違ってるし。
_
ミ ∠_)
./
/_∧
/,,・∀・)
// と ) | | ガッ
Y /ノ 人 ガッ
て / ) < >__Λ ガッ
_/し' //.V;´Д`)
(_フ彡 / ヽ ←
>>44
ごめん、こうだった。
% grep "define NULL " /usr/include/**/*
/usr/include/freetype2/freetype/internal/ftobjs.h:#define NULL (void*)0
/usr/include/g++-3/streambuf.h:#define NULL (__null)
/usr/include/g++-3/streambuf.h:#define NULL (0)
/usr/include/glib-2.0/glib/gmacros.h:# define NULL (0L)
/usr/include/glib-2.0/glib/gmacros.h:# define NULL ((void*) 0)
/usr/include/libio.h:# define NULL (__null)
/usr/include/libio.h:# define NULL ((void*)0)
/usr/include/libio.h:# define NULL (0)
/usr/include/linux/stddef.h:#define NULL 0
/usr/include/linux/stddef.h:#define NULL ((void *)0)
>>49 厨な漏れにgrepの使い方を教えてください。
そもそもしよう目的が違ってるとか...?
>>51 find /usr/local -type f -print | xargs grep -n define | grep NULL
とかかな…。
これが
>>49 的正解かどうかは分からない
s/local/include/
>>51 zshが前提になってるのがいかんのじゃなかろうか。
あとgrepは
egrep '^ *# *define +NULL'
で探さないといけないんじゃなかろうか。あ。tabも考慮せんとならんか。
\s
>>52 ,
>>54 zsh依存なのがだめなのか(´・ω・`)
って、grepの使い方とかとは関係ないような。。
zsh使ってなかったら自分が使ってるshellに適当に読み替えればいいことだし。
いずれにしてもすれ違いな質問に答えてくれてありがとうございます。
57 :
デフォルトの名無しさん :04/10/03 12:50:09
ISO C99を使うと char *s; s=strdup("test"); とすると implicit declaration of function `strdup' と文句を言われるんですが、これってC99ではstrdupなんて使うなってことなんでしょうか?
そもそもCにstrdupなんか無い。
zsh依存って、**かな? 他のシェルなら例えばcshで*{,/*{,/*{,/*}}}くらいやっておけば事足りそうだけど。 #まぁ、find使えと。
ちょっとお尋ねしたいのですが、引数でデータ型の後ろに*だけつけて宣言してる関数があるのですがどういう意味でしょうか? void aaa(char *) こんな感じです
>>60 プロトタイプ宣言で変数名は必修じゃないよ
64 :
デフォルトの名無しさん :04/10/03 22:15:09
65 :
デフォルトの名無しさん :04/10/03 22:21:40
だっくぉ?
ageとsageを掛けたり割ったりするにはどうすればいいのですか? double age(double a1, double a2){ return 0.5*a1 + a2; } と double sage(double b1, double b2, double b3){ return -7*b1 + 8*b2 + b3; }
またお前か!
>>68 いや今回係数の掛け算は出来てるから別の意図の質問と思われる。
わけわかなのは以前と一緒だが。
age(1.0,1,0) * sage(1.0,1.0,1.0); age(1.0,1,0) / sage(1.0,1.0,1.0);
67と同一人物か同じクラスのやつの書き込みを3つは見たな・・・。
74 :
デフォルトの名無しさん :04/10/05 14:36:23
ポインタの中身同士の割り算で ひっさびさに例のアレやっちったよ びっくりこいたぜ
>>74 あぁ、ゼロ割りか。たまにやっちまうよな
まあ、がんばれ
76 :
デフォルトの名無しさん :04/10/05 19:58:35
ゼロ除算には聞こえないなあw
77 :
デフォルトの名無しさん :04/10/05 20:09:30
*a/*b; ↑これだろ? 空白厨が空白あけろぼけと言いそうだ。
つか、アドレス同士で割り算するのが間違ってるだろ。
>>77 厨でもなんでもないだろう。
空白を空けた方が見やすい。
81 :
デフォルトの名無しさん :04/10/05 20:14:09
>>79 「空白あけろぼけ」を連呼していた奴のこと>空白厨 ぼけ厨と言うべきか。
正直、召喚するような気がするのでよしてくださいませんか…
キー入力するときに脳内コンパイルで気付く
84 :
デフォルトの名無しさん :04/10/05 21:39:46
85 :
デフォルトの名無しさん :04/10/05 22:09:13
ある数の三分の一乗とか四分の一乗を計算するための関数ってありますか? 自作しなくてはならないのでしょうか?
86 :
デフォルトの名無しさん :04/10/05 22:10:58
math.h の pow
ぽw
88 :
デフォルトの名無しさん :04/10/05 22:12:39
>86 即レスありがとうございます!
#include <stdio.h> 〜 typedef struct hit{ int atari; int hazure; } HIT; 〜 int main(void) { 〜 HIT data[9000]; 〜 return 0; } HIT data[9000];の上限を500万ほどにしたいんですが 数を増やすして実行すると「問題が発生したため〜」 とでてきて動きません解決方法をお教え下さい。
static つけるか、グローバル変数にするか
>89 コンパイラオプションでスタック領域を増やす
92 :
デフォルトの名無しさん :04/10/05 23:02:38
>>89 コンパイラのマニュアルで、スタックサイズを指定する方法を調べれ。
プログラムの中に不明瞭な処理系依存を持ち込むようなバカな真似はやめれ。
トラブルが起きたとき、論理的な間違いが、まず自分にあるかどうか調べ、
しかる後に相手にあるかどうか調べ、大局的に妥当な解を導く能力を大事にすれ。
93 :
デフォルトの名無しさん :04/10/05 23:06:21
#include <stdio.h> #define STR_MAX 20 void strngcpy(char *s, char *t){while (*s++ = *t++) printf("s => %c t => %c\n",*s,*t); } int main(void){ char source[] = "hello, world"; char dest[STR_MAX]; strngcpy( dest, source ); printf("%s\n", dest); exit(0); } // strngcpyで*sにアクセスするにはどうすればいいんですか?
>89 巨大なデータはファイルとかDBを利用した方がいい鴨
95 :
デフォルトの名無しさん :04/10/05 23:08:30
>>93 いつの時点でだ? s++ の前か、後か。
s++ の後です よろしくお願いします
>93 void strngcpy(char *s, char *t) { while (*s = *t) { printf("s => %c t => %c\n",*s++,*t++); } }
ありがとうございます
99 :
デフォルトの名無しさん :04/10/05 23:53:54
100 :
デフォルトの名無しさん :04/10/05 23:59:35
>>89 UNIXの場合、スタックサイズは、ユーザ側の設定でも制限がかかることがある。
bashなら、
ulimit -s
で確認
ulimit -s unlimited
で制限をはずせる。
# これでハマッタことがある。
Windowsはしらん。
>>89 普通に malloc でヒープ領域にとれないの?
HIT のメンバに next と prev 作れば可変的にも増やせるし。
実際に500万件登録する可能性があるんなら例外が少ないほうがいいんじゃないか?
103 :
デフォルトの名無しさん :04/10/06 01:05:12
そんなもの関数呼ぶ前にチェック汁
NaN位返せばいいのに…
な、なんだってぇぇぇ
もるぱ
110 :
デフォルトの名無しさん :04/10/06 19:10:10
>>103 浮動小数点の等値・非等値比較は誤差を考慮しないという致命的な欠陥を抱えている
>>110 0除算で問題が起こるのは分母が厳密に0に一致するときだけじゃないか?
112 :
デフォルトの名無しさん :04/10/06 19:44:58
問題が起きないケースまではねてしまうよね
>>112 つまりa!=0はaが厳密に0じゃなくてもfalse返すことがあるってこと?
・・・true返すと思い込んでたよ・・・(´ー`;)
114 :
デフォルトの名無しさん :04/10/06 20:56:31
そこでイプシロンですよも前ら。
115 :
デフォルトの名無しさん :04/10/06 21:07:53
>>112 確認してみたけどやっぱり厳密に 0 になるときだけだったよ。
だからそのコードは問題ないんじゃない?
確認方法は、下記のとおり。
double a = 1;
while( a!=0 )
{
a /= 2;
std::cout << a << "!=0 == " << (a!=0) << std::endl;
std::cout << a << "*2 == " << (a*2 ) << std::endl;
}
>>117 ふぉっΣ(゜o゜;)
すんません。もし動かす人がいたら適当にprintfに置き換えて。
119 :
デフォルトの名無しさん :04/10/06 22:49:57
これは1つまたは有限個の処理系での結果の写像が結論であるべき問題なのだろうか・・・・
#include <stdio.h> #include <time.h> #include <stdlib.h> main() { int computer; printf("【ジャンケン】\n"); srand(time(NULL); computer = rand()%3 + 1; printf("コンピュータは %d",computer); return 0; } ↑のプログラムを実行するとコンピュータの出す値が、 1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,・・・のようにかなり偏って出てきてしまうんですがどうしてなんでしょう? コンパイラはGCCです。
すみません
>>120 の10行目は
srand(time(NULL)); でした。
>>120 実装によるんじゃないか?
srand直後のrandが3の倍数を返す確率が高いのかもしれない。
>>122 なるほど そんなこともあるんですか〜。
即レスどうもありがとうございました。
>>120 randは下位ビットがランダムにならない線形合成法を使っている事が多い。
下位ビットは捨てて、上位ビットを使え。
>>124 レスありがとうございます。
プログラミングを始めてからまだ1週間程度なので、
下位ビットとか上位ビットの意味がわからんです。。。
敢えてマジレスするとtimeの返す値が変わってなくて 同じseedが使われてるからだろ
>>125 まーなんだ、
rand() / (RAND_MAX / 3) + 1
とかすれば、切り捨ての分偏りはでるものの、
余りを使うよりはいい結果がでるってこった。
>>125 マジレス感謝いたします。
>>126 おお〜 なるほど〜。それを使って再度朝鮮してみます。
どうもありがとうございました。
>>119 ISO/IEC 9899:1999には特記事項なし。
>>119 >>113 にも理解できるように言い換えると、
「俺の環境で出来たら問題ない、とかほざくんじゃねーよ!」
って事ですね?
131 :
デフォルトの名無しさん :04/10/07 00:49:16
>>118 その顔文字いいな。
使わせてもらおう。
132 :
デフォルトの名無しさん :04/10/07 01:38:29
きょうは、あたらしくおぼえたかおもじのれんしゅうをしました。 ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;)ふぉっΣ(゜o゜;) たのしかったです。 おわり。
133 :
デフォルトの名無しさん :04/10/07 02:02:06
バルタン星人!
134 :
デフォルトの名無しさん :04/10/07 13:53:29
Σ(゜o゜;)
32767 何が発想できますか?
>135 サンニーナロナ
135見てサンニーナロナがすぐに思いつかないやつはプログラマ失格
??なにそれ。。。
知らないやつがいるとは・・・。
オナニーは他でやれ
142 :
デフォルトの名無しさん :04/10/07 20:57:55
143 :
デフォルトの名無しさん :04/10/07 21:47:38
145 :
デフォルトの名無しさん :04/10/07 21:56:41
146 :
いなむらきよし :04/10/07 23:25:51
奇形の俺でもよければ何でも聞いて欲しいキケー!
147 :
デフォルトの名無しさん :04/10/07 23:29:06
ソケットのプログラミングやってるんですが、 サーバ側のrecvの返値が、クライアントから送ったデータのサイズになりません。 つまり全部送られてきていないみたいなんです。 どういう原因が考えられますでしょうか。
148 :
デフォルトの名無しさん :04/10/07 23:31:06
突然ですみません。 浮動小数点演算エラーって何ですか? また、よくある原因は?
>>147 それは正常な動作です。
ソケットプログラミングの入門書でも読みましょう
150 :
147 :04/10/07 23:33:00
いや、入門書買うお金がないからここで聞いてるんですが・・。 正常ってどういう意味ですか?
そっちで質問します
153 :
初心紗 :04/10/07 23:46:29
大学の課題で、ファイルの16進ダンプを作成しなければならなくなりました。 で、プログラムを作ったのですが、こんなもんで世の中で通用しますか? /*////////////////////////////////////////////////////////////////////////////*/ /* */ /* 機能:指定されたファイルを16進数でダンプする */ /* 使い方:HEXDMP FILE-NAME */ /* */ /*////////////////////////////////////////////////////////////////////////////*/ /* インクルードファイル定義 */ #include <stdio.h> #include <fcntl.h> #include <string.h> #include <memory.h> #include <io.h> #include <conio.h> /* マクロ定義 */ #define OK 0 #define NG 1 #define HEXLEN 16 /* 出力幅 4の倍数指定 */ #define STRMAX 256 /* プロトタイプ宣言 */ int MemDmp(int, unsigned char *, int);
半角カナ使ってる時点で0点。
いみわからね
全角数字使ってる時点で0点。
タブ使って書き込みした時点で0点
ネタじゃないとしたら相当なアホだな。 実際にそれを使ってダンプしてみろよ。
誰が松本香やねん
161 :
デフォルトの名無しさん :04/10/07 23:56:57
/*////////////////////////////////////////////////////////////////////////////*/ ↑ やる気のなさが致命傷
163 :
初心紗 :04/10/08 00:22:08
くそ〜みんなで ば〜にしやがって! それならウナラセルプログラムをみせてみろってんだ。 ってねぇ。言うだけならだれでもねぇできるもん。
>>163 あなた誰ですか?
冗談は止めてください
今は作ってる最中だからな。完成したら見せてやるよ。 俺は今、Winnyのようなファイル共有方式の掲示板を作ってるんだ。 2ちゃんねる以上の匿名性を備えた、完璧な掲示板だぜ。
他のスレで誰かが答えるなと思ったら誰も答えないのが2ch
そう言って傍観してるのも2ちゃんねるらしいね。
初心者です。 ライブラリに登録されているようなヘッダーファイル開いても意味がわかりません。 みなさんはわかりますか? 完璧に理解できるようになるまで、みなさんはどのくらいの年月がかかったですか。 教えてください。
ヘッダファイルの中身を見るようになったのは1年以上たってからだな。 それにヘッダファイルの中身は理解する必要はない。
名前が化けやがった。 いいか、俺のトリップをよく覚えておけ。 そのうちインターネットの歴史に名を残すようなソフトを公開するからな。
173 :
デフォルトの名無しさん :04/10/08 00:42:36
>>170 ・ドキュメントのバグか?
・隠しコマンドがありそう
・どう考えても自分に責任のなさそうなエラー
こんなときだな
ヘッダファイルなんて読んでも意味がない。処理系固有のことしか書いてないんだから。
>>168 286マシンで、メモリが無くてソースが詰め切れなくてヘッダ内の要らない関数宣言とか削除したとき。
という過去があるので、一ヶ月くらい?
176 :
デフォルトの名無しさん :04/10/08 00:58:46
・マクロにハメられたとき 他に同様の危険物がないか確認にいったりする
・標準以外かつ他人が作った物を触るとき
>>175 >メモリが無くてソースが詰め切れなくて
すまん、これさっぱり解らんのだが。どーゆーコンパイラだ?それ…
メモリがたりなくてヘッダを展開しきれなかったとか 64k以上の行のソースを読めないのもあったな
SDKのヘッダなら良く開いたりする。ドキュメントよりも進んだことが書いてあったりするし。
Cのヘッダはよく中身最初見てたがC++は見ない。MSDNマンセー
ある配列があって、それをある処理にかけるのに 要素と要素の間でsleepをはさんだりするとき for(i=0;i<len;i++){ if( i ) sleep(30); hoge( array[i] ); } のようなコードなんだけど もっとエレガントに書きたいです これって 配列の各文字列をカンマでつなげるときとかも 同じようなもんだと思うけど この書き方だとちょっとダサいし・・・
184 :
デフォルトの名無しさん :04/10/08 13:27:03
音声ファイル変換を行っています。 以下のようなプログラムがあります short* prbuf = new short[remain]; intTmpFlame = pWAV->_GetRemData(prbuf); strcat(LPSTR(wh->lpData) , (LPSTR)prbuf); _GetRemData(short*)の引数にポインタを渡すと その型のデータを取得できるメソッドがあるのですが、 そこで取得したshort*型のデータをWAVEHDR構造体のデータ部である LPSTR lpData// 音声データ部 に新たに追加(元からデータが格納されています)させたいのですが、 型が違うデータの追加の仕方がわかりません。 どなたか教えていただけないでしょうか? ちなみにstrcatで strcat(LPSTR(wh->lpData) , (LPSTR)prbuf); とキャストしても考えていたような 結果がえられませんでした。 よろしくおねがいします。
>>183 配列の話の最中にいきなり文字列云々が出てくるし、何を聞きたいのか判らん。
186 :
デフォルトの名無しさん :04/10/08 13:30:47
>>183 質問の意味というか意図がよくわからん。
if( i ) で何がしたかったの?
あなたの言うエレガントとはどんなことを言うの?
>>184 wh->lpData = (LPSTR)prbuf;
じゃあダメなのか?
lpDataってこたぁポインタだろ
内容の確保されていないポインタに文字列コピーしてどうするよ?
ポインタの概念を一度勉強しなおすべし
>>189 ハァ?質問者に回答しろって?アホかアホかアホか
>>191 なんだ質問者か。だったら>190をよく読んで出直せ。
>どなたか教えていただけないでしょうか? >質問してる範囲はスレ違いじゃねえだろ >ハァ?質問者に回答しろって?アホかアホかアホか スレ違いって言うより、生きててごめんなさいって感じだな。
194 :
184 :04/10/08 13:43:31
>>190 wh->lpDataは、内容が確保(?)されてるんです。
(っというか、既にデータがある先を指しています。)
wh->lpData = (LPSTR)prbuf;
これだと上書いてしまいますよね。
あくまでその指してるデータに追加したいのです。
ちなみにwh->lpDataには、追加されるprbuf分のメモリも
確保されています。
>>186 a[0] a[1] a[2] a[3]
↑ ↑ ↑
配列を処理するときに、矢印のところでも
なにか処理をはさみたい という話
196 :
陽気な名無しさん :04/10/08 13:51:37
mutukasiidesu
>>194 まずはなんでstrcatを使ってるのか理由を教えてくれ
あと、文字列型でのNULLの意味も書いてみてくれ
その2つがわかってれば、バグの原因もわかるだろう
ぬるぽ
>>195 >183で何が気に入らないのか書いてみ。
>>194 wav形式の取り扱いなら適切なスレがある。このままこのスレだといつまでもこの調子で話が展開するぞ。
>>183 OK。俺に任せろ
#define elegant_sleep sleep
#define elegant_hoge hoge
#define ELEGANT_SLPTIME 30
for ( elegant_i = 0; elegant_i < elegant_len; elegant_i++){
if ( elegant_i ) elegant_sleep(ELEGANT_SLPTIME);
elegant_hoge( array[elegant_i] );
}
こんなところでどうだ?
forやifまでエレガントにしたかったら、自分でやってくれ
>>200 いや、スレ違いのところに書き込んだはいいが、
>>194 がstrcpyなんていう
馬鹿なものを使ってるからここで正解だろう
WAVEに限らず、NULLが混じるデータを扱う場合全般にかかわる馬鹿コードだからな
>>199 if( i ) sleep(30);
この判定文が、うまいこと他んところに紛れ込ませないかなと。
ループの最初の一回だけ処理しない、または最後の一回だけ処理しない
というのが エレガントに記述できたらなぁ と。
ループはi=0から始まるとは限らないし
hoge(array[0]); for(i = 1; i < len; i++){ sleep(30); hoge(array[i]); } ではイヤかね?
>>183 一定時間ごとにタイマイベント発生させて
イベントハンドラを呼び出すようにしたら?
スレッド作るとかして
WindowsだったらWM_TIMERメセージつかうとか
for ( i = 0; i < len; i++, sleep(30) ) hoge( array[i] ) ;
208 :
デフォルトの名無しさん :04/10/08 15:55:20
v(^o^i)d
209 :
デフォルトの名無しさん :04/10/08 16:22:54
>>203 その調子で、何がしたいのかを、
まず日本語ではっきり書いてみれ。(ここにじゃなくていい)
はっきりとはどの位かというと、規格や法律の条文くらい。
1点のあいまいさも残さないように要求をきっちり定義すれ。
いざコードを書こうとすると、やることが決まっていて
悩んでいる余地がなくなっているのが理想形だ。
あなたの考える「エレガント」とは違うかも知れないが、
俺の考える「エレガント」の1つに「フラットであること」がある。
例外的な扱い(≒if 文)はいわば反例へのフォローであり、
数学的な正しさに疑問符がつくとこれがまた不快だったりする。
前提条件はあっていいが、論理の本体に傷が残るとブスなコードになる。
あなたのコードと
>>204 はこの点で大きく違う。
>>209 でも、もういいです。ありがとう。
綺麗には書けないから仕方なくif文使います。
i = 0; goto L1; while(++i < len){ sleep(30); L1: hoge(array[i]); } でいいだろ。
数字好きな人って変な人が多いよね ガンヲタとかアニヲタとかPCとか
正確な統計は取ったんでしょうか。 あと数字好きという点の定義は?
>>210 しょうがないな、のび太くんは。
for (i=0; i<len; i++) switch (i) {
default:
sleep(30);
case 0:
hoge(array[i]);
}
これでいい?
>>215 それだと
for(i=0; の 0 と、case 0: の 0 というように
同一の意味を持つ定数が2箇所に分かれて出てくるから
美しくないと思う。
が、しょうがないな
218 :
デフォルトの名無しさん :04/10/08 18:30:26
>>216 だから要求定義をまずはっきりさせてからでないとキリねえっつの。
それとも T array[0]; ができるって言いたいのか?
for( loop_count = 0, i = 0; i<len; ++loop_count, ++i ) { if ( loop_count!=0 ) sleep(30); hoge(array[i]); } これがもっとも思考に忠実でエレガント。
思考的には 0かどうかの判定など存在せずに、 単に間に sleepを挟むだけでは?
// (a)original(183) for (i = BEGIN; i < len; ++i) { if (i != BEGIN) sleep(30); hoge(array[i]); } // (b)分岐なし(len対策済み)(204) if (len > 0) hoge(array[BEGIN]); for (i = BEGIN + 1; i < len; ++i) { sleep(30); hoge(array[i]); } // (c)switch(215) for (i = BEGIN; i < len; ++i) { switch (i) { default: sleep(30); case BEGIN: hoge(array[i]); } } // (d)分岐なしの派生 i = BEGIN; if (len > 0) hoge(array[i]); for (++i; i < len; ++i) { sleep(30); hoge(array[i]); } >217の言う、定数の出現数だけなら(d)がいいように見えるが。 #私なら(a)のままだな。
// (e)変数追加(219) for (loop_count = 0, i = BEGIN; i < len; ++loop_count, ++i) { if (loop_count != 0) sleep(30); hoge(array[i]); } これはこれで、定数出現が一回か。
>>218 長さが0ということはよくある。
T array[0];
とは無関係の話。
今回の場合 sleep() だからいいけど、何億何十億とまわるループだと ループ内の条件分岐を外に出せるなら出したほうが良い。
>>224 何億何十億と配列操作するならその方が考えもんだ。
それくらいすぐに行くけどな。
227 :
デフォルトの名無しさん :04/10/08 20:22:36
#include <stdio.h> main(){ char buffer[1024]; scanf("%s", buffer); printf("%s", buffer); } というプログラムをtest.exeにコンパイルして DOSからtest.exe | test.exeとパイプして起動したら キーボードからの入力をそのまま画面に出力されることを期待してたのですが、 最初のprintfからパイプを通してscanfへと流れてないようです。 どうすれば期待通りのプログラムに出来ますか。
>227 printf("%s\n", buffer);
>>217 「switch を goto として使う最悪の例」というボケだったんだが…
>>230 ^Z+Enter で
入力したやつまとめて出てくるんじゃね?
233 :
デフォルトの名無しさん :04/10/08 20:49:49
>>227 OS が NT 系で test.exe が 16bit の旧EXEなら、
COMMAND.COM を起動してから実験してみるもよし
234 :
デフォルトの名無しさん :04/10/08 20:50:17
>>232 俺も一瞬そう思ったが、EOF 判定はしてないぞ
>>232 質問ちゃんと読んだら?
オレは答えはわかるけど、説明する気にもなれん
236 :
89 :04/10/08 20:51:48
>>90-92 どうもありがとうございます。
スタック領域を増やすと少し増やす事が出来ました。
>>233 OSは2000でEXEのbitはわかりませんが、
変わりありませんでした。
>>227 DOSはマルチタスクではないので、前段プロセスが終了するまで後段プロセスがスタートしない。
そうでない場合でも、改行するまでは入力がバッファリングされてしまう。
Win2kならDOSじゃないだろ……_/ ̄|○
241 :
デフォルトの名無しさん :04/10/08 21:04:24
>>237 >EXEのbitはわかりませんが
コマンドラインみしてみ
242 :
デフォルトの名無しさん :04/10/08 22:59:07
レスちがいを承知でおしえてもらいいことがある、パソコンのプロのみなさまへ 今日メモリクリーナなるものをDLしてつかったところ何も開いていない状態で みたら60Mぐらいつかわれていた・・これって一体なににそんなとられてるの? メモリー俺のパソは128しかないんで・・・解放しても70Mぐらいからはじまる まじでいったい何が60Mもつかってるの?てかfreeとなんか似てるな って、まじでおしえてください・・60Mのメモリのパソならなんもできないじゃん 60も意味不明にとられてたら・・バスタかなんかですか?
>>242 メモリクリーナってのはわざと大量のメモリを確保する。(中身は全く手を付けないけど)
そのときWindowsはメモリが足りなくなるので今までのメモリの内容をスワップファイルへ書き出す。
そしてすぐに確保したメモリを解放する。当然このときにスワップからメモリに書き戻されるのだが、
このときWindowsは虫食い状態になっていた空き領域を1ヶ所に集めて空き領域が連続ようにメモリに書き出す。
基本的にはこの空き領域が連続させることがメモリクリーナの効果。
こういうのはソフトウェア板で聞け。
おまえらconst付けてるか
246 :
デフォルトの名無しさん :04/10/08 23:21:11
明らかに釣りだな マジレスしてるやつ頭悪スレ池
C言語の中括弧とかのタブの取り方っていろんなスタイルあるけど, 大体手本となるような本とかWebページは同じやり方だよね。 例えば,if文を例に取ると,大概のページ・書籍には if(……){ 処理1; 処理2; } って書いてあるけど,俺は if(……) { 処理1; 処理2; } っていうほうが見やすい。 やっぱり前者のほうで書いて勉強を続けていったほうがいいのかなぁ。
248 :
デフォルトの名無しさん :04/10/08 23:29:50
サンキュウ
250 :
デフォルトの名無しさん :04/10/09 02:58:22
プログラムの高速化を図りたいのですが各命令の速度の比較は分からないでしょうか? 例えばa=a+bを1とすると a=a*b 3 if 10 rand 20 みたいな感じで。
>>250 プロファイル取るか、CPUの仕様書でも読め。
>>250 a=a+bがいつも1だとは限らないしな。
数万個ある小さなファイルを順番に読み込んでるんですが、数が進むにつれて 読み込み速度がどんどん低下してしまいます。何か解決法はありますか?
なぜ遅くなってるのかを解析する。
>>253 例えば読み込んだファイルを全てメモリに確保して、
新しいファイルが読み込まれても削除してないとか。
>>253 読んだデータは全部メモリ上に保持してたりする?
メモリ不足でページフォルト起こしてるんだろ。
>253 小さなファイルが数万個あること自体がアウツ
万個って言いたかっただけだろ。
259 :
デフォルトの名無しさん :04/10/09 11:39:16
C言語でメールクライアントを作っているのですが retr 1をした後に送られてくるデータを*bufに入れたはいいが 空行でメールのヘッダと本文に分けたい(分かれ目のポインタの値が知りたい) strcmpとかでやってみたところ、うまく分かれてくれないんだが どうすればいいんでしょうか?
あきらめろ
261 :
デフォルトの名無しさん :04/10/09 11:42:49
*bufをchompしても、最後の改行が消えるだけで 分けれないんですが。
正規表現使えば楽。
264 :
デフォルトの名無しさん :04/10/09 12:16:38
p = strstr(buf, "\n\n"); ?
p = strstr(buf, "\n\n"); 最初、それで余裕とか思ってたらOUTでしたorz
\n\r\n\r じゃないの?
orz \n\r\nで、逝けた。。。。。。 板汚しスマソ
execやspawnは外部プロセスを終了させないと制御が戻ってこないですが、 外部のプログラムを実行して、そのプロセスを終了させないで、制御を元のプログラムに戻すことはできるのでしょうか?
269 :
デフォルトの名無しさん :04/10/09 13:11:39
_P_NOWAIT もしくは INT 27H などいかが?
もしかしてボーランドのコンパイラでしょうか? 私はLSIC試食版を使っていますが、INCLUDEの中からは発見できませんでした。
>>269 >INT 27H
それはどうかと…w
mov ax, 35xxh
int 27h
だっけか?もうとっくに忘れてるや
>>268 (POSIX って前提で) ふつー、fork して exec か、または popen しないか?
一度、system("hoge &"); してるのは見たことがあるが。
>274 ごめんなさいwindowsXP Proです
276 :
デフォルトの名無しさん :04/10/09 15:13:51
MSYSでmingwを使うと、日本語部分が文字化けするのですけど どうやれば対処できるのでしょうか?
マルチスレッド化してみましたがやはりうまくいきませんでした。 #include <stdio.h> #include <sys/types.h> #include <process.h> #include <windows.h> unsigned __stdcall func(void *arg){ char buf[1024]; while(1){ scanf("%s", buf); printf("%s", buf); } } int main(int argc, char *argv[]) { unsigned d; int id; id = _beginthreadex(NULL, 0, func, (void *)1, 0, &d); if( id==NULL ){ fprintf(stderr, "error."); return 0; } while(1){ Sleep(100); return 0; } }
>>278 1行ずつバッファリングされるってレスついてたと思ったけど?
どううまくいかないのかね。
280 :
デフォルトの名無しさん :04/10/09 18:49:21
aやsなどのキーを押したように仮想させるには、具体的にどのように書けばいいのでしょうか?
>>280 標準入出力だけじゃ無理。
即ち、標準関数だけじゃ無理。
>280 stdinから読み込むがごとく、ファイルから読め
284 :
デフォルトの名無しさん :04/10/09 19:12:37
他のヘッダファイル等を使えば可能ですか? ルーチンのようなものをCで作れればと思っているのですが。
286 :
デフォルトの名無しさん :04/10/09 19:21:54
>>285 すみません。
Cは数値解析で使ったことしかなく、他の事に関してはまったくの初心者なのです。
287 :
デフォルトの名無しさん :04/10/09 19:46:14
Microsoft Visual Studio .NET でC/C++の基本的練習するとしたら、どうしたらいいと思いますか?
288 :
デフォルトの名無しさん :04/10/09 19:47:05
次の質問をどうぞ
自作関数のヘッダにstring.hという名前をつけて#include "string.h"で インクルードしてるんですが、#include <string.h>を同じソース上に書いても 問題ないのでしょうか?
290 :
デフォルトの名無しさん :04/10/09 20:33:14
>>289 問題ないと思うがお薦めしない。
その自作関数のヘッダのファイル名を変えとけ。
292 :
デフォルトの名無しさん :04/10/09 22:27:46
構造体のメンバーに long hoge:8; のようなものがあるのですが、 ':'の意味と、そのあとの数字の意味を教えて下さい。
long hoge:8;って激しく無意味だな・・・。
295 :
デフォルトの名無しさん :04/10/09 23:03:45
long unko:69;
C標準関数とシステムコールの違いを教えてください
この書き方がよくない理由はなに? if (!strcmp(a, b))
>>300 strcmp が真偽値を返すわけじゃないから、かな。
別に結果は同じだけど ==0 にした方がわかりやすい。
strequal という関数を作ったほうがもっとわかりやすい。
>>279 みのがしてました
printfのあとにfflush(stdout)をいれることで解決しました。
みなさんありがとうございます。
303 :
デフォルトの名無しさん :04/10/09 23:45:55
>>300 not string compare と読ませることにメリットがない
>301 >strequal とはいえ大小比較するからなぁ...
#define strequal(a,b) (strcmp((a),(b))==0)
306 :
デフォルトの名無しさん :04/10/10 00:59:25
localtime()はtmのポインタを返すんですが、 これによって得られたtmは使った後解放してやる必要があるんでしょうか。
307 :
デフォルトの名無しさん :04/10/10 01:10:44
308 :
デフォルトの名無しさん :04/10/10 01:15:39
ポインタを返すということは、localtime()の関数内部でmallocをしている可能性があるので、 こっちで解放してやらないとメモリがどんどん食われると思ったんです。 あるいはローカルの静的なオブジェクトを返しているのかもしれないですが、 どちらか分からないので。
仕様書読めば書いてあることをわざわざ聞くのは その仕様に納得してないから?
311 :
マジレスしてみるテスト :04/10/10 02:14:46
>>310 いいえ。仕様書へのアクセス手段を知らないからです。
みながみなεπιστημηみたいな言語オタクだと思うなよ。
標準関数の仕様書くらいどこにでもころがってるだろ
επιστημηって言語の仕様をすべて暗記してるのか?
επιστημη氏は、記憶力聡明な人ではあると思う。 が、全てのプログラマが記憶力聡明であるわけではないし、 また優秀なプログラマでも、記憶力が乏しい人もいる。 お互いを摺り寄せる努力が必要だ。
316 :
デフォルトの名無しさん :04/10/10 03:36:39
記憶力聡明? いいかげんな造語だな。
> そうめい【聡明】 > ―な > ―に > > 〔「聡」は耳が、「明」は目がさといこと〕 物事や人情などに対する判断力・洞察力にすぐれ、自分の置かれている > 環境で第一になすべき事を十分に自覚している様子。 Shin Meikai Kokugo Dictionary, 5th edition (C) Sanseido Co., Ltd. 1972,1974,1981,1989,1997
まぁ、まともな奴ならマニュアルくらい普通に読めるだろって話だな。
マニュアルを持ってればな
マニュアルにアクセスすることすらできない奴はまともとは言えない。
まぁ、まともな奴ならマニュアルくらいどこで見つけられるか知ってるだろって話だな。
このヌレの住民って本当に優しいな。見なおしたよ。
int a; printf("%d %d\n", sizeof(int), sizeof a); というのをiccでコンパイルすると ero.c(6): remark #181: argument is incompatible with corresponding format string conversion sizeof(int), sizeof a); ^ のようなのが出ます。 sizeofの前に(int)とかつけると出なくなりますが そもそもsizeof演算子を使うと、どういうデータ型になるので すか?
>>311 >仕様書へのアクセス手段を知らないからです。
ばかだからでは?
>>323 size_t
これは大抵unsigned intがtypedefされている。
>>325 %u にすると出なくなりました。
ありがとうございます。
少しえろくなりました。
%uにするよりも、頭に(int)つけるほうが賢い対処法だったのになぁ・・。
>>327 gcc に糞メッセージを出させないようにするのがスジな気がしないでもない。
329 :
デフォルトの名無しさん :04/10/10 12:29:10
iccだよ
ちょいと調べてみると、size_t には POSIX では %zd Microsoft では %Id C99 のフォーマットマクロにはなし なんだな。
>>331 あれ ?
%zu ではなくて %zd なの ?
>>332 確かに%zuの方が良いかもしれん。
符号無から符号有の変換は未定義だか処理系依存だからな。
C++ の bool のようなものを定置したいんですが、 typedef enum{ false = 0, true = 1 } bool; と typedef enum{ false = ( 0 != 0 ), true = ( 0 == 0 ) } bool; のどちらがいいのでしょうか…
Cでは真偽値は0と1と決まっているから前者でいい。
336 :
デフォルトの名無しさん :04/10/10 21:43:33
>>334 どちらよりも、 #include <stdbool.h> がよい。
それがだめなら、どちらかというと前者。
理由は、下の書き方にしてもメリットは無いから。
学校の課題で使うので stdbool はちょっと無理かなと… 長いことC++やってるんでCの細かい仕様なんか忘れちゃった(´・ω・`)
stdbool.hがないなら、 #ifndef STDBOOL_H #define STDBOOL_H typedef enum {false, true} bool; #endif をstdbool.hと名付けるよろし。
しばらくC++ばっか使ってたら頭からstdbool抜けてた(焦
>>337 stdbool.hは標準のヘッダだから、なかったらその環境がおかしい。
>>338 stdbool.h を真似るなら、もっと小細工が要りそうだ。
>>339 いや、C99がどうとかじゃなくて、例えばC++の演習で
std::vectorとか使ったらやり杉じゃないのかなあ…という感じで・・
まだCのテキスト渡されて関数すらやってない感じなので・・・
342 :
デフォルトの名無しさん :04/10/10 21:56:18
複数のCプログラムから実行ファイルを作る make を(WindowsXPの)コマンドラインで使いたいのですが、 ググってみても分かりませんでした。どうすればよろしいのでしょうか? Linux環境であれば make が出来るのですが、Windows でのやり方が分かりません。
343 :
デフォルトの名無しさん :04/10/10 21:57:11
DVD-RAM書き込みや、メディア(DVD-RAMの空き容量)の情報を取得するには、 どのようにすればいいのでしょうか? MMCのコマンドを使用すれば可能とのことらしいのですが、 ググッテもよくわかりませんでした。 ご存知の方いらっしゃいましたら、教えてください。 参考になるHP/書籍を教えていただけるだけでも構いませんので、よろしくお願いします。 OS:windows2000 言語:C言語 コンパイラ:VC6.0
344 :
デフォルトの名無しさん :04/10/10 22:00:19
>>334 できない。あきらめろ。
bool a;
a = 2;
if(a == true) goto hell;
>>344 そこまで厳密にやるわけではないので大丈夫です…
にしても C++ だと enum では int からの暗黙の型変換が
出来ないために bool が新しく出来たってのに、Cでは
typedef enum{ false = 0, true = 1 } bool;
bool b = ( 0 == 0);
これが動くんですね…
346 :
デフォルトの名無しさん :04/10/10 22:11:10
>>345 某社のライブラリのように大文字で BOOL なら
まがいものと割り切って使えという表示になる
>>345 C++のboolでも bool b = ( 0 == 0); はコンパイルとおるぞ。
「動く」とはまた違うのかもしれんが。
348 :
デフォルトの名無しさん :04/10/10 22:15:27
「まがいもの」で済む問題かどうかも疑わしい それは #define begin { と同質 頭がおかしくなってしまってからでは自覚不能に陥るぞ
>>347 それが通るように bool が新しく作られたですよね・・
プリプロセッサは使いたくないし、class にしてもうまくいかない…
enum にしても型変換が出来ない・・
皆さんのアドバイス通りとりあえず前者にしておきます。
ありがとうございました
351 :
342 :04/10/10 22:36:37
354 :
343 :04/10/10 22:58:51
>>350 ありがとうございます。
ですが、書き忘れていました。言語は「C言語」のみで(「C++」は不可)でした。
折角、教えていただいたのに申し訳ございません。
webでちょこちょこ調べてみてはいるのですが、
実装出来そうな方法が、「ASPI(SPTI)」、「MMC(マルチメディアコマンド)」
位しか出てきませんでした。
この辺を使用してCプログラムを書いたことがある方いらっしゃいませんでしょうか?
>>354 DirectXはCでも使えなかったっけ?
Cでも使えたと思うが
>>355-356 すみません。Cで使えるとは知りませんでした。
使用方法と自分のやりたい事が実装できるか調べてみます。
どうもありがとうございました。
>>358 図に乗っていません。本気で困っています。
たしかにC以外のlibやapiを使うと言う意味ではスレ違いかもしれませんが、
他に適切なスレが見つからなかったので、ここで聞いています。
適切なスレをご存知であれば、誘導してもらえないでしょうか。
360 :
デフォルトの名無しさん :04/10/10 23:33:16
int double float
363 :
デフォルトの名無しさん :04/10/10 23:35:21
C限定なんですけど・・・
>>361 、363
どうもです。そっちに移動します。
DirectXで実装できなそうだったら、戻ってくるかも知れませんが、
その時は、またよろしくお願いします。
>>364 は、俺じゃないです。
よくそうやってからかえるよな。あんた最悪だな。
>366 おいおい、このスレには戻って来ちゃだめだっつーの。 後、最後の1行は余分。2ch で質問するなら煽り耐性は持っててほしい。 とりあえず自分の心の中だけで罵っとけば平和。
>>365 スレッド検索はしました。
「【初心者歓迎】C/C++室 Ver.10【環境依存OK】 」は見つけたんですが、
こっちとの違いが良く分からなかったので。
(
>>1 を読んだらすれ違いだと分かりました。)
↑のほうが適切だったんですね。以後、気をつけます。
今更書いてもしょうがないかも入れませんが、Win32Apiではなく(Dos)Commandを
作るイメージでした。
(俺が、細かいことまで書かなかったのが原因です、すみません。)
>>367 >>354 は自分です。
>>368 ベタのC言語専用スレだったんですね。すみません。
main で return するのと プログラムのどこかで exit するのと どこが違うのでしょうか?
おなじ
処理系によってはI/Oのフラッシュ等をせずに終らせる機能もある。非常用。<exit
ありがとう。
>>372 そのexitはやばいんじゃないの?
abortならそれでもいいけど。
375 :
デフォルトの名無しさん :04/10/11 00:30:38
整構造で組み立てる気がない者が使う分には exit と abort は気分の差
exit で終わろうが、セグフォで終わろうが、気分の差
377 :
デフォルトの名無しさん :04/10/11 00:36:24
で、どっちの場合も malloc してた場合は free しないといけないんですか?
free不要。時にexit書くような所では危険。
379 :
デフォルトの名無しさん :04/10/11 00:43:42
char a; // (中略) printf("あああ%cいいい",a); これで、「あああいいい」という風に、空白も無しに表示させるにはaに何を代入すればいいのでしょうか?
char a[] = { 0, 0 }; // 中略 printf("あああ%sいいい", a); として a[0] に \0 を入れる。
a=255;
385 :
デフォルトの名無しさん :04/10/11 00:50:43
>>377 main()
{
malloc(1);
exit(0);
}
これがOKと言いたいだけな消防と話すことはない
'\b'
a=127;
388 :
デフォルトの名無しさん :04/10/11 02:00:54
Cのプログラムで、複数の .c ファイルをコンパイル・リンクするときに、 グローバル変数が二重定義になることがあるのですが、 それを避けるにはどうすればよろしいのでしょうか?
static
390 :
デフォルトの名無しさん :04/10/11 02:06:45
>>388 extern で宣言と定義を区別
初期値を指定しない
名前がファイルによってかぶっているときには
>>389 実体が1つのはずのものが二重定義になるときは
>>390
392 :
デフォルトの名無しさん :04/10/11 02:10:16
>>389 ありがとうございます。
>>390 ヘッダファイルは extern にして、.c ファイルで定義するということでしょうか?
>>391 複数の .c ファイルで同じヘッダファイルを使うときはどうなのでしょうか?
390-391では無いが、 ヘッダにグローバル変数は書かない事を勧める。 IDEなら良いが、素のエディタでは把握できなくなる。
例えば、xxx.h を yyy.c と zzz.c の両方で include するとき、 xxx.h では変数を extern 宣言して、yyy.c で変数の実体を定義すればよいのでしょうか?
398 :
デフォルトの名無しさん :04/10/11 02:25:29
レス・ハンコック「C言語入門」という本を見てみたら、冒頭のサンプルソースに#include <stdio.h>なしにprintf()関数を使ってるソースを出してるんですが、一応コンパイルできるんでしょうけども、入門書的にはアリなんでしょうか? それとも昔はこれでよかったんでしょうか?
>>395-396 御親切なアドバイスをありがとうございましたm(_ _)m
またどうしても分からなかったら質問させて頂きます。
>398 リンカのデフォルトに入っている処理系は多い。 たとえばVCだと、 #pragma comment(linker, "/nodefaultlib:\"libc.lib\"") として実行ファイルサイズを切り詰める場合もある。
>>398 いい訳がない。もしそれよりも前のどこかに「冗長になるから省く」などと
書かれていれば理解できるけれども。
>>400 なんかズレてないか? なぜリンカが出てくる?
>>398 昔はそれでよかった。
今でもプロトタイプを省略しても間違いではないのだが、省略するメリットは無く、思わぬデメリットを食らうこともある。
よって、入門書的にはNG。
.cファイルって.hファイルがインクルードされる前に 全てコンパイルされるんですか?
プリプロセス(含インクルード)してからコンパイルだろ
>>403 プリプロセッサ→コンパイラ→リンカ
の順に動くから、#include が先に展開される。
ヘッダファイルを処理するプログラムを日本語に訳してみろ
違った。 ○#ディレクティブを処理するプログラム ×ヘッダファイルを処理するプログラム
409 :
デフォルトの名無しさん :04/10/11 12:57:50
#include "oresama.h"
>>379 ちょっとうるさいけど char a='\a';
411 :
デフォルトの名無しさん :04/10/11 13:42:30
return文では、なぜ括弧をつけるスタイルとつけない スタイルが許されているのでしょうか?
>>411 は?
a = 1;
は許すが、
a = (1);
はコンパイラで弾けって事か?
>>412 if a {}
はなぜ弾くのかってことじゃないか?
おまえらくだらない話題ほどよく絡みますね
>>414 おまえくだらない話題ほどよく絡みますね
>>411 文法的にそういう決まりになっているから。
未だにCでは最後の評価式の値がそのまま返り値にできないんですか?
無名関数が欲しいです
>>410 char a[2] = {'\0', '\0'};
a[0] = 'a';
printf("->%s<-\n", a);
a[0] = '\0';
printf("->%s<-\n", a);
>421 %sぢゃねーて
>>401 ,
>>402 お返事ありがとうございます。
そういえばK&Rにもプロトタイプ省略のソースが載っていたと思うんですが、今でも推薦する人が多いようですね。
>>417 昔からCではreturnを書かない時は最後の評価式の値がそのまま戻値だ。
最近のコンパイラは関数定義で戻値の型が指定されているときはreturnが必要で、
戻値がvoidの時は逆にreturnを書くな。とコンパイルエラーが出る。
ただそれだけ。
C言語で連想配列やスタック、キューといった基本的なデータ構造が 使えるSTLみたいなライブラリはありませんか?単純なものでいいんですが、 できればGPLでないやつがいいんですが・・・
boostってGPLだっけ?
>>428 この際boostがGPLかどうかは殆ど関係ないと思うのだが。
433 :
デフォルトの名無しさん :04/10/11 17:52:12
434 :
デフォルトの名無しさん :04/10/11 17:53:11
> 戻値がvoidの時は逆にreturnを書くな。とコンパイルエラーが出る。 おいおい。
boostってCのAPIあんの?
> 戻値がvoidの時は逆にreturnを書くな。とコンパイルエラーが出る。 とあるんだから、、
あーなるほど。確かにreturn書くなって言われたら困るわなぁ。
だめなんだ!? うるさくなったな。エラー吐くんだろ。わー人具じゃないんだろ?
>>439 エラーになるのは、voidとしているのに値を返している場合。
それ以外は出ても警告のみじゃないかな。
#C99は知らん。
--- Compile log ------------------------------------ Error - voidなのにreturnが書かれとる。 Warning - scanf使うのはやめときや。 Warning - gets使うのはやめときや。 コンパイルに失敗したで。直しときや。 --------------------------------------------------
いいな、大阪弁で答えてくれるのか その中の人がさんまさんだったら余計なことが80%は占めるんだろうな。
Error - voidゆーてreturnで値返しよる。 やな
444 :
デフォルトの名無しさん :04/10/11 18:55:46
最近よく見るのは↓だなー。リンカが出してるようだ。 /tmp/cccaJuBA.o(.text+0x18): In function `main': : warning: the use of `mktemp' is dangerous, better use `mkstemp'
これってたまたまうまくいってるだけですか? #include <stdio.h> int test() { volatile int a = 123; volatile int b = 456; volatile int c = a + b; } int main(void) { printf("result = %d\n", test()); return 0; }
>446 ネタのマジレスするとw 1.test()は戻り値を返せ 2.マルチスレッドでもないローカル変数ごときにvolatileを使うな
>>446 たまにはソースとアプリケーションだけじゃなくコードも眺めてみれ
っとそれはC言語じゃないな
>>448 もしかしてアキュムレータの値が戻り値になるっていう話のことを言っているのですか?
デスマで死にそうなときにそっとリアルゴールドを出してくれるコンパイラが欲しい
んなもん呑んだら吐くわい
453 :
デフォルトの名無しさん :04/10/12 02:49:47
> return文では、なぜ括弧をつけるスタイルとつけない > スタイルが許されているのでしょうか? 大昔はつけなければいけなかったから。 大昔といっても、void型が導入されるよりはずっと前、 かつ、 += という演算子ができたよりはあと、だ。
454 :
デフォルトの名無しさん :04/10/12 02:51:41
> /*////////////////////////////////////////////////////////////////////////////*/ > ↑ > やる気のなさが致命傷 じゃあ //**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//**//
int foo, hoge 1.foo / hoge 2.foo % hoge 1 と 2 ではどっちが遅いですか?
x86のDIVの場合、/の結果と%の結果は同時に取得できるから、
>>455 の1と2はどっちが速いとか遅いとかじゃなくて不可分の関係
stdio.hのstdioって何って読むんですかぁ? ストディオ?
すたっどあいおー
>>459 すたっどあいお、スタッドアイオともにgoogleで検索してみたけどともに0ヒットでした
本当にこの読み方なんですかぁ?
Standard Input Output 標準入出力
462 :
デフォルトの名無しさん :04/10/12 07:29:36
えすてぃーでぃーあいおー が業界標準です。日本のUnix業界では。
すたんだーどあいおーと読んじゃうけど
現場からは以上です。それではスタジオにお返しいたします。
>>465 そこらへんに何個も貼り付けてんじゃねーよカスチンが
>>466 何個もって2個しかない
つーか質問スレなんだから答えてやれ
>>467 自演モツ彼
>ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
LINUX(UNIX)でファイルが指定ディレクトリ下に作成されたのを検知する方法 ってあるでしょうか?(C言語で) やりたいのは、指定ディレクトリ配下にファイルが生成されたら、その ファイルの内容をチェックする仕組みを作りたいのですが、ディレクト リはルートから複数(可変数)ディレクトリ下ったところに生成され、 なおかつファイル数が膨大なため、いちいちチェックしていると非常に 時間がかかってしまうためです。 もしご存知の方がいましたらお知恵をお貸し下さい。
#includeで netint/in.h arpa/inet.h sys/socket.h fcntl.h unistd.h errno.h がコンパイルできるコンパイラ教えてください。 VC++6.0ではできませんでした。
環境違うもんな。コンパイラ以前の問題。
473 :
デフォルトの名無しさん :04/10/12 18:21:07
errno.hがないはずはない
475 :
デフォルトの名無しさん :04/10/12 20:33:33
>>455 聞く前に実測しろ
理屈の上では完全に等速のはず
Cでもアセンブラでもいいから
除算プログラムを自分で書いてみれば明らか
商を求めるアルゴリズムと
余を求めるアルゴリズムが
全く同じになることがわかる
>>471 > コンパイルできるコンパイラ教えてください。
根本的なところが解ってない悪寒。
ヘッダファイルがないんでしょ?
で、上3つは winsock2.h で代用できればラッキー。
fcntl.h は、あるはずだ。
unistd.h はインクルードしなくて宜しい。
まあ多分、エラーが山ほど出て来るだろうな。
480 :
デフォルトの名無しさん :04/10/12 20:59:41
$ cat test48-1.c test48-2.c int waru( void ) { int foo = 4; int hoge = 2; return foo / hoge; } int jyouyo( void ) { int foo = 4; int hoge = 2; return foo % hoge; }
$ cat test48-1.s test48-2.s .file "test48-1.c" .text .p2align 4,,15 .globl waru .type waru, @function waru: pushl %ebp movl $2, %eax movl %esp, %ebp popl %ebp ret .size waru, .-waru .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.4 (Debian 1:3.3.4-13)" .file "test48-2.c" .text .p2align 4,,15 .globl jyouyo .type jyouyo, @function jyouyo: pushl %ebp xorl %eax, %eax movl %esp, %ebp popl %ebp ret .size jyouyo, .-jyouyo .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.4 (Debian 1:3.3.4-13)"
>>482 その前に
gcc -O2 -S test48-1.c test48-2.c
484 :
デフォルトの名無しさん :04/10/12 21:17:57
486 :
デフォルトの名無しさん :04/10/12 21:21:42
488 :
デフォルトの名無しさん :04/10/12 21:22:33
低脳確定x2
489 :
デフォルトの名無しさん :04/10/12 21:24:13
>>487 おい、アセンブラ読めない低脳
除算でも剰余でもなくなってることに気付・・・けるわけねえな (プププ
>>488 やーいつくれねーって意味解からない。
何を作って欲しいの?
C:\>debug -a0 3643:0000 mov dx, 0004 3643:0003 mov ax, 0000 3643:0006 mov cx, 0064 3643:0009 div cx 3643:000B -t=0 AX=0000 BX=0000 CX=0000 DX=0004 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3643 ES=3643 SS=3643 CS=3643 IP=0003 NV UP EI PL NZ NA PO NC 3643:0003 B80000 MOV AX,0000 -t AX=0000 BX=0000 CX=0000 DX=0004 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3643 ES=3643 SS=3643 CS=3643 IP=0006 NV UP EI PL NZ NA PO NC 3643:0006 B96400 MOV CX,0064 -t AX=0000 BX=0000 CX=0064 DX=0004 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3643 ES=3643 SS=3643 CS=3643 IP=0009 NV UP EI PL NZ NA PO NC 3643:0009 F7F1 DIV CX -t AX=0A3D BX=0000 CX=0064 DX=002C SP=FFEE BP=0000 SI=0000 DI=0000 DS=3643 ES=3643 SS=3643 CS=3643 IP=000B NV UP EI PL NZ NA PO NC 3643:000B 03D9 ADD BX,CX -q C:\>
492 :
デフォルトの名無しさん :04/10/12 21:25:37
x86 だの 4 だの 2 だのと電波が飛んでくるらしいが・・・キモッ
493 :
デフォルトの名無しさん :04/10/12 21:26:43
debug.com で速度が論じれると思ってるアフォがいるづらだぁ
あ、ごめんごめん。 こうしないといけなかったか。。。 アセンブリ見てなかった。 $ cat test48-1.c test48-2.c int waru( int foo, int hoge ) { return foo / hoge; } int jyouyo( int foo, int hoge ) { return foo % hoge; }
497 :
デフォルトの名無しさん :04/10/12 21:30:57
おうおう、喧嘩か?おい!
498 :
デフォルトの名無しさん :04/10/12 21:32:17
やめとけ、アフォは放置に限る
499 :
デフォルトの名無しさん :04/10/12 21:34:23
プログラミングから少し外れるかもしれませんが… (1)大学でプログラミング(C言語)を教えている先生って ISOなりJISなりのCの規格を直接調べているのが普通なんでしょうか? (2)本格的に言語を学ぶ場合には(1)の書籍って必須なんでしょうか?
500 :
デフォルトの名無しさん :04/10/12 21:36:36
501 :
デフォルトの名無しさん :04/10/12 21:38:20
>>499 人に教える立場の人間ならば、持っていて然るべき。
それ以外ならどうでもいい、かな。
504 :
デフォルトの名無しさん :04/10/12 21:43:00
尋ねてはみたものの、実際の本(?)を見たことがないんで
実感が沸かなかったりします(スンマセン
プログラミング(とりあえずC)を本格的に勉強したいと思っているんですけど
値段にビビッっているんですよね、僕。
>>504 多数派とか8割以上とかってあたりです。
>>505 その定義なら標準偏差で 10〜90 の範囲に含まれるものってことになるな
270ドルか…K&Rでも読んだほうがいいな
508 :
デフォルトの名無しさん :04/10/12 22:14:34
for文の++iとi++は使い分ける必要はありますか?どんなタイミングで加算されますか?
510 :
デフォルトの名無しさん :04/10/12 22:34:45
>>509 for(;この辺;)
の ++i と i++ は意味がぜんぜん違うから使い分けろ。
>>509 なんか似たような質問、最近みたな
このスレ的答えならば、実測しろ。
514 :
デフォルトの名無しさん :04/10/12 22:38:21
++iはインクリメントしてから計算するのに対して、 i++は計算してからインクリメントする。 (例) int main() { int i=0, j=0; printf("%d,%d\n", i++, ++j); return 0; }
( ; ;++i)と( ; ;i++)の場合の違いです。
517 :
デフォルトの名無しさん :04/10/12 22:48:06
>>516 今からでも「わざわざ」憶えろ。それほどのことだ。>汗
(;_;)と(T_T)の違いを教えてください。
519 :
デフォルトの名無しさん :04/10/12 22:53:28
(*^o^*)
>>518 無限ループを作るとき、以下のように使い分けます。
#define _ 1
#define T_T 1
for (;_;) {
// ...
}
while (T_T) {
//...
}
523 :
デフォルトの名無しさん :04/10/12 22:57:49
while(T^T);
コマンドラインオプションの解析とかしてると switch( optionChar ) { case _T('o'): hoge; break; case _T('v'): hage; break; case _T('-'): hege; break; } とか出てくんの。なんかかわいいの。
0 か 1 が入る配列 a[] (a[10])がある。 1 は必ず[0]から入り、歯抜けは無い。但し、いくつ 1 が入るかは不定。 で、1 が入っている個数分の桁を 1〜3 の値で表示する。 例) a[0] が 0 → 表示なし a[0] が 1 1 2 3 a[0] a[1] が 1 → 1,1 1,2 1,3 2,1 2,2 2,3 3,1 3,2 3,3 を表示 (上のように各表示改行して) a[0]〜[2] が 1 → 1,1,1 1,1,2 1,1,3 1,2,1 1,2,2 1,2,3 ・・・ 3,3,3 を表示(同) a[0]〜[3] が 1 → 1,1,1,1 1,1,1,2 1,1,1,3 1,1,2,1 1,1,2,2 ・・・ 3,3,3,3 を表示(同) ↓ 以下同様(最大[0]〜[9]) どう作ればエレガントかなぁ(´・ω・`)
>>522 様
470です。感謝感謝です。では早速試してみます。
どもありがとうございました。
ごめん、読解力なくて理解出来ん
529 :
ぼるじょあ ◆yBEncckFOU :04/10/13 00:02:43
な〜んとなく分かった気がするが、a[10]にする必要があるんだろうか。
int i = 0; while(i < 10 && a[i]) i++; これでi桁になるわな。
5桁だったら 最小値を1,1,1,1,1 最大値を3,3,3,3,3 に設定して一つずつインクリメントすればいいんじゃ?
組み合わせみたいなもんかな、とかオモタけど それじゃ a[10]じゃ収まらないし・・・うーん?? どゆこと?
こういうのをかぐわしいという
>>526 醜いかなぁ…
#include <stdio.h>
#include <string.h>
char temp[20];
void inc(int digits, int n){
if (n > 1){
strcpy(temp + 2 * (digits - n), "1,");
inc(digits, n - 1);
strcpy(temp + 2 * (digits - n), "2,");
inc(digits, n - 1);
strcpy(temp + 2 * (digits - n), "3,");
inc(digits, n - 1);
}else if (n == 1){
printf(temp);
printf("1\n");
printf(temp);
printf("2\n");
printf(temp);
printf("3\n");
}
}
int main(){
int a[10] = {1, 1, 1, 1, 0, 0, 0, 0, 0, 0};
int n = 0;
while(n < 10 && a[n]) n++;
if (n > 0) inc(n, n);
}
>>526 printf(t + 1); がちょっとトリッキーだけど、ま、こんな感じかなぁ。
#include <stdio.h>
#define N 10
#define R 4
void PrintRec(int a[], int p)
{
static char t[N * 2 + 2], *u = t;
int i;
if (p < N && a[p]) {
*u++ = ',';
for (i = 0; i < R; i++) {
*u++ = '0' + i; PrintRec(a, p + 1); u--;
}
u--;
} else {
*u++ = '\n'; *u = '\0'; printf(t + 1); u--;
}
}
int main(void)
{
int a[] = {1, 1, 1, 0, 0, 0, 0, 0, 0, 0};
PrintRec(a, 0);
return 0;
}
あ、うっかりmain()なんて書いちまった。
げ、間違えてた。 for (i = 1; i < R; i++) { に修正してくれ。
自作自演乙
strtok 並のタコさを感じる関数だ
再帰するのにメインの変数はstaticって、 難読化してるんじゃないかと疑いたくなる。
配列の先頭から 1 を数える処理と、 1,2,3 による組み合わせを列挙する処理を別々でつくっちゃだめなの?
544 :
デフォルトの名無しさん :04/10/13 08:30:20
ちなみにうちには規格票あります。
>>530 氏
>>535 氏
わーい。お二人ともサンクス!!
自分もチョビっと作り始めてたけど、リカーシブルコールはイマイチ苦手で (´・ω・`)ゞ
精進します。
自作自演乙
>>522 様
試してみました。ディレクトリ内で更新があることは検知できるのですが、
どのファイルが更新(作成)されたか?という所までは取れないみたいですね…
なにか方法があるのかもしれませんが…
もう少し調べてみます。どもでした。また何か情報がありましたら追加情報を
お待ちしています(^^;;
>>548 更新される以前の状態を自分で保持してればいいだけでは?
char配列の終わりを示す文字っていうか数字ってあります?
ありがとうございます。 charのポインタから配列の終わりを探そうと四苦八苦していたのですが これでようやく諦めがつきました。
>>549 様
階層が固定、小数のファイルならそれでも良いのですが、ルート以下の階層数
は不定であり、その中に含まれるファイル数も膨大で(一階層下に数万ファイル、
全体で数百万ファイル)ある事を想定しているため、前回の情報を保持して…っ
て言うのは非現実的なんです(´;ω;`)
また秒間数件のファイルが作られる事もあり、単純に各階層化をチェックして…
って事も無理なのです(処理スピードが追いつかない予感がして…)。
なのでファイルが作成に対して機能をフックするみたいな事が出来ないかと
思い、質問させていただきました(Windowsなら簡単なんですが…)。
何か妙案がありましたらご教授お願いします(^^;;
K&R第2版(邦訳) p.125 の、ポインタ同士の比較に関する 内容についてなんですが、 |…つまり、pとqが同じ配列の要素をさしていれば、==、!=、<、>= |などの関係演算子は正常にはたらく。 (略) |しかし、同じ配列のメンバーをさしていないポインタ同士の演算や |比較を行うと、結果は不定となる 前半部は分かるのですが、後半部については例えば char *p = malloc(〜); char *q = malloc(〜); if (p == q) 〜 このケースで大小比較がまずいのはわかるのですが、==による比較も、 実は規格的にはまずいということになるのでしょうか。
>>556 いえ、後半部分に、同じ配列のメンバーをさしていないポインタ同士の
演算や比較を行うと結果は不定となるとありましたので、
p==q という比較演算の結果が不定とはどういうことなのだろうかなと、、
>>558 p==q という比較演算の結果が不定ではありません
飽きた。
どうも良く分からないです。 前半部の例は「関係演算子は正常にはたらく」例として 挙げられていますから、後半部の「しかし〜」以降の内容は 「関係演算子は正常にはたらかない」ということを 暗に示しているのだと思うのですが、そうではないのでしょうか
>しかし、同じ配列のメンバーをさしていないポインタ同士の演算や >比較を行うと、結果は不定となる =「もし p!=q ならば、p==q または p<q または p>q」 別に矛盾はしていない。 ただ、p!=q なら p!=q であるのは間違いないだろうな。 何しろ >…つまり、pとqが同じ配列の要素をさしていれば、==、!=、<、>= >などの関係演算子は正常にはたらく。 =「もし p==q ならば、p==q」 だといっているのだから。
> ただ、p!=q なら p!=q であるのは間違いない それは間違いないだろう。p!=qなのだから。 しかし、同じ配列のメンバーをさしていないポインタ同士の演算では 常にp!=qが成立するということが保証されているかどうかの問題だろ? 不定であるのならば、規格としては保証されていないということでFA?
詳しい人いないかなあ 仕様はともかくデファクトではどう扱われるのか興味ある
>>564 「比較を行うと結果は不定」の結果というのは
比較演算の結果ではなく、そういうことを指して言ってたんですか…
何とも分かりづらいですが、比較演算の結果としては
正しい論理値が得られるわけですね。安心しました。
| 同じ配列のメンバーをさしていないポインタ同士の
| 演算や比較
意味があるかないかは別として、
char c1, c2;
char *p1=&c1, *p2=&c2;
if (p1 < p2) 〜
このような比較演算を実行すること自体は
規格上問題はないのでしょうか。
>>566 デファクトでは直感的な理解で問題ないのでは?
大抵はポインタ=そのマシンにおけるメモリアドレスとして扱われてるだろうし。
569 :
デフォルトの名無しさん :04/10/13 14:49:43
メモリリークの検査のためにプログラムのmain部を何度も繰り返すテストをしました。 リークは問題なかったのですが、長時間(2、3時間ぐらい)続けていたら mallocが0を返す事がありました。 メモリのブロックの断片化か何かでメモリ確保できなかったと想像していますが、 プログラムの性質上、メモリ破壊は考えにくく、 再現性がないので原因が特定できていません。 これを防止する方法はあるでしょうか。 (WindowsXPSP1 VC6SP6) とりあえず再発したら同じサイズのメモリ片に対してmalloc/freeを繰り返さずに キャシュしておく方法を試すつもりです。遅いですし。
>>550 但しchar配列を文字列として扱っているなら'\0'で終わるのが通例。
セグメントありなメモリモデルだと、別の配列をさすポインタが同じ値 になることがなかったっけ
オフセットだけ同じってか? ラージポインタでもなんでも、全く同じ値になったら駄目だろう。
関数の中でポインタに配列の頭のアドレスをおしえても、呼び出し側に戻って(pt++)で一文字づつ表示させても、全部0、0、0、0...です。なんででしょうか?
わけわからんが、関数内でポインタの指す領域を変更したのではなく、 ポインタ変数の値を変更したのなら、呼び出し元には反映されんよ。
>>567 演算を実行すること自体は問題ない。
どんな値が返ってくるかはわからないが、少なくともディスプレイが突然爆発したりはしない。
>>576 了解しました。
ありがとうございます。
ニ、三時間に一回mallocが0を返すっていったら、 原因はやっぱり宇宙線以外考えられないから、 対策としては鉛の板でパソコンを覆うことだね。
int main(void) {char i=0; char ss[80] int a[80], *apt=a; gets(ss); op(ss,a,apt); printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]); void op(char ss[],int a[],int *apt) { char i=0; while(a[i]){a[i]=ss[i++];} apt=a; }
ソースは上の通りです。
>>554 creatとかopenのシステムコールをフックするモジュール書けば検知できるけど、
一般的にはファイル作る側が勝手に作るんじゃなくて、作る時に管理プロセスに
通知するとかDBに登録するとかの構成にしたほうがスマートだろう。
Linux板行けばもっといい方法教えてくれるんじゃない?
582 :
569 :04/10/13 16:08:35
>>578 ありがとうございました。
仰るとおり宇宙線が原因でした。
鉛の板をパソコンに覆ったところ、無事対策できました。
今後再発するようでしたら鉛の板を増築しようと思います。
>>582 宇宙線の影響はほとんどないと思われます。
もっとも有力な原因はあなた自身の電波ではないでしょうか。
>>580 gets()はさておき、op()の第三引数意味無かったり、a[i]=ss[i++];とか
突っ込み所は多いけど、そのコードなら表示内容が0ばっかにはならんだろ?
>>581 様
ありがとうございます。実はファイルを生成する側のモジュールは
自分達で生成したものではなく、とある製品が生成するものなので
こちらの都合にあわせてDB等に通知してもらう事が出来ないんです(´;ω;`)
>Linux板行けばもっといい方法教えてくれるんじゃない?
ですね、アドバイスどもでした。そちらでも聞いてみます。
>>580 清書してみました。おいらもこれが全部0になるとは思えないのだが・・・
環境は何??
void op(char *ss,int *a )
{
for(;*ss; a++, ss++)
*a = (int)*ss;
*a = 0;
}
int main(void)
{
char ss[80];
int a[80], i;
gets(ss);
op( ss,a );
for( i = 0; a[i]; i++ )
printf( "%d\n", a[i] );
}
>>573 ポインタについて根本的に判ってない悪寒。
指摘しようと思ったが、指摘箇所が二桁になりそうなのでやめた。
>>584 自動変数の内容が0になってしまう環境ならそれも有り得る。
メイン関数閉じてませんでした。直しました 何入力しても、0、0、0...です.. int main(void) {char i=0; char ss[80] int a[80], *apt=a; gets(ss); op(ss,a,apt); printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]);printf("%d\n",a[i++]); return 0; } void op(char ss[],int a[],int *apt) { char i=0; while(a[i]){a[i]=ss[i++];} apt=a; }
>>586 おいおい、清書の段階でバク取っちゃダメだろ。
>>579 初期状態ではa[]の中身は何もないんだよな?
while(a[i])してるが、iはss[i++]でインクリメントされた後の数
つまり、a[i]の判定に使われているのはまだデータが入力されていない場所じゃないか?
a[0]の初期値がNULLだったら、そのまま終了してしまうぞ
ゼロフィルされたデータだったら、そりゃ0ばっかりになる
あー、条件判断ssじゃなくa見てたのか こりゃ釣られちまったぜ
whileと代入文を別の行にしてデバッガ動かせば一発でわかるバグじゃないか?これ
>>585 kernel2.4付属ののdnotify.txt読んだ?
あとはdnotifyのソースを参照するとか。
IRIXで向けにFAMとかいうライブラリもあった気がする。
C言語をはじめよう! Ver.1.1.0.9 Copyright (c) 1998-2004 AOK. と LSI C-86 Ver. 3.30c試食版 です。
いや、答えでてるだろ、もう
ホントだ。すまん。
ありがとうございます。もっと修行します
>>598 ところでcharを整数型として使うな。文字型だと思え。
整数はint使え。
>>599 intよりlongとかのほうがよくないか?
601 :
デフォルトの名無しさん :04/10/13 17:00:39
>>601 >float MySin(float x,int m)内のルーチンがよく分かりません。
いや、それを作れという問題じゃないのか?
低能どもが
>>605 よう。元気か?前スレ893
レポートはちゃんとでっちあげることができたか?
どこの前スレだよ
ここは酷いスレですね
宇宙線て何? ヴァカ?
611 :
デフォルトの名無しさん :04/10/13 17:45:28
restrict キーワードについて教えてください。 int * restrict p[7]; とすると、コンパイラに怒られました。restrict ポインタ の配列は意味がないのでしょうか? エイリアスなし、変更なしのポインタを int * const restrict p; と宣言するとコンパイラの最適化を助けることができますか? よろしくお願いいたします。
612 :
デフォルトの名無しさん :04/10/13 17:50:49
xの2n+1乗ってCで書くにはどうしたらいいのかなぁ。 もちろんXには数字を代入するんだけど。
>>612 printf( "%dの2n+1乗", number );
614 :
デフォルトの名無しさん :04/10/13 17:53:19
>>612 最初にxとnを読み込んでおいて、
さっきいった関数に読み込んで累乗の計算させるんですけど。
615 :
デフォルトの名無しさん :04/10/13 17:54:40
Cソース中から、決められたディレクトリにあるファイルを FTPで送信(PUT)することってできるんでしょうか? fprintf(stdout, ゙ftp ホスト名・・・ なんて記述じゃ駄目でしょうか? やはり、ソケットを使ったプログラムにするしか無いのでしょうか? なにせ、ソケットの知識が無いもので。 すいませんが、よろしくお願いします。
>>612 #include <math.h>してpow()、powf()またはpowl()
>>611 君は素晴らしい。才能がある。intelやAMDに入社すべき。
619 :
デフォルトの名無しさん :04/10/13 18:33:30
>>615 コマンドファイルを生成してリダイレクトしちゃう?
#include <stdio.h>
main()
{
char command_buf[256];
FILE *fp;
fp = fopen( "command.txt", "w" );
fprintf( fp, "open HOSTNAME\n" );
fprintf( fp, "USERNAME\n" );
fprintf( fp, "PASSWORD\n" );
:
:
fprintf( fp, "quit\n" );
fclose( fp );
sprintf( command_buf, "ftp<command.txt" );
system( command_buf );
}
と思ったが、パスワードの入力部分で止まっちゃうだろうな・・・たぶん・・・
>>620 そういう用途のために、止まらないftpクライアントもあるよ。
>>619 まず、indexの宣言がポインタもしくは配列じゃないとダメでしょ?
ばっふぁおーばーらんで打ち壊してるよ。
あとはwhileの条件文だが、
while(scanf(中略)==4)
にした方がよくねぇか?
これだと、1文字とか入力した段階で終われるし。
そもそもindex無意味のような
>612->614 センス良すぎ。笑ってたら聞こうとした質問忘れた
構造体の中に関数ポインタを含ませるなんて事、出来ま・・・・・・・・・・せんよね。
それ位己でやってみそ。
627 :
デフォルトの名無しさん :04/10/13 21:43:40
>>625 Cで virtual 使いたくなったときの常套手段
出来るんか!Σ(´Д`;)
むしろ出来ない理由がまったく思いつかないが・・・。
うほっ、出来た。 書き方悪かっただけなのね・・・ お邪魔しますた
632 :
デフォルトの名無しさん :04/10/13 22:49:25
太陽風
>>615 Unix でならやった事あるよ。
/dev 配下のファイルに直接アクセスしたような記憶が...
質問です。 1〜16の数をそれぞれ 1/16 で発生させるプログラム を作りたいんですがどうやればいいのでしょうか? 誰かご教授下さい。
635 :
デフォルトの名無しさん :04/10/13 23:04:23
下位ビットがどうのとか荒らしてみる
637 :
635 :04/10/13 23:06:26
おっと、 ランダムにとは書いていないな。ならば(ry
>>634 確実に1/16発生させたければ、160個ほどの配列を作り1〜16を10回繰り返し入れ
シャッフルさせ、一個ずつ取り出す。無くなったら先頭に戻ってシャッフル
639 :
デフォルトの名無しさん :04/10/14 00:40:57
scanf()を用いて以下の通り関数の値を出力するプログラムを作戦してください 1を入力したときにsin(x)の値 2を入力したときにcos(x)の値 3を入力したときにtan(x)の値 お願いします
>>639 ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
>>639 -lmでいいと思います
と、エスパーレス
scanf("%d",a); if(a==1){printf("%f\n",sin(x));} とか。
644 :
デフォルトの名無しさん :04/10/14 00:56:46
int (*a)[3]; int *a[3]; ↑二つの違いは判るのですが、()によって 配列[3]へのポインタになるのか すっきりしません。 ルールですか?それとも[]演算子の結合ルールによる記述なのですか? 教えてください。 ※a[x][j] = *(*(a+x)+j)
>>644 Cの変数/関数宣言は大体
型 式;
の形になるように出来てる。
上の int (*a)[3] の場合、式 (*a)[n] の型が int になる。だから a は配列へのポインタ。
下の int *a[3] の場合、式 *a[n] の型が int になる。だから a はポインタの配列。
>>509 for に限った話でもないし、ちょっと遅いレスだけど
int
main (void)
{
int i;
i = 0;
printf("%d, %d, %d\n", i++, i++, i++);
i = 0;
printf("%d, %d, %d\n", ++i, ++i, ++i);
return 0;
}
こんな感じになるのも注意。
>>647 環境依存なので自分の環境で試すがよろし
650 :
デフォルトの名無しさん :04/10/14 01:42:20
>>645 質問の仕方が悪かったかもしれん、
大きさnの配列へのポインタを定義する際に
()を付与する必要があるが、付与しなければならない理由が今一
理解できていない。
int *a[n];はint*[n]型、int (*a)[n]はint(*)[n]型。
652 :
706 :04/10/14 01:51:49
お願いします * * * * * * * * * * * * * * * を表示するプログラムを作りたいんですけどどうすればいいでしょうか?
しつこい
655 :
706 :04/10/14 01:53:16
* * * * * * * * * * * * * * * です。すみません
>>655 はいよ。
main(){printf("*\n * *\n * * *\n * * * *\n * * * * *\n");}
657 :
デフォルトの名無しさん :04/10/14 02:09:03
>> 650 前置演算子 * は [] よりも優先度が低いからっす。似たようなものに、 void (*foo)(void); void *foo(void); とかあります。
658 :
デフォルトの名無しさん :04/10/14 02:36:34
>>657 「*a」ポインタ変数→[]演算子ってなって 配列へのポインタ?
こうなると、先にポインタ変数である事が定義されて
[]演算子で指定した大きさを参照するポインタになる?
逆に
*a[n]
[]演算子→「*a」ポインタ変数になって、ポインタ変数の配列になる?
これだと、配列である事が先に定義されてから
その一要素サイズがポインタ変数(int)である事が定義されるのか?
[]()の演算子の優先順位が関係してるから、()を付与しなければ
配列へのポインタとして定義できないのかな。
ここの所が知りたい。
※今、ちょうど この答えが出たんだが こういうことですか?
*a は *(a+0) と表せ、a[0]と同じで、 同様に *(a+1)はa[1] *(a+2)はa[2]...となる。 例えばポインタ変数aはとある領域、仮に1111番地 を指すとすると、 *(a+1)は1112番地 *(a+2)は1113番地...を示す。 つまり、a[i]はポインタ変数aの指す領域からi番目の場所を指す。
foo[] のように[]がくっつくと、 最初に配列であることが確定するので *foo[]とすると foo は "array" of pointer となりまs 順番を変えて、 foo は "pointer" to array にするには (*foo)[] としまs そんな感じで (*foo)() で "pointer" to function となりまs ...のようなことが K&Rの5章12節にかいてありまs
配列のポインタって全く使って無いな。。。 全く頭に無かったけど。いつ使うの?
662 :
デフォルトの名無しさん :04/10/14 04:38:43
多元配列を引数で受け渡す時とか、C++でnew演算子を使用して多元配列の領域を 確保した際とか。
#include <stdio.h> int main(void) { char a[100]; char *p; char (*pp)[100]; char *p2; p = &a[0]; pp = &a; p2 = &a; /* warning */ printf("p = %08x, pp = %08x\n", p, pp); p++; pp++; printf("p = %08x, pp = %08x\n", p, pp); return 0; }
>>660 ちゃんと最後の「u」まで打てや(@u@ .:;)
>646>648 ありがとうございました。i++と++iの違いはわかります。配列やポインタについてはあの後復習したら理解できました。 >647>649 ガッ ガッ
>>641 ありがとうございます
ここですね。<, =<, >, >= について以下のように書かれていました。
| You can compare two pointer values only if they are the addresses
| of elements within (or just beyond) the same array object.
2つのポインタが同じ配列の要素を指している場合に限って
それらの大きさを比較してもよいというわけなんですね。
もっともだと思います。また == の解説にはこのような
記述はありませんでした。納得です。
=< =< =<
オレが許してもコンパイラが許さん
670 :
デフォルトの名無しさん :04/10/14 19:03:50
みなさん、ヘッダファイルのインクルードガードって どういう工夫してますか? 大文字? 小文字? アンダースコア使う? ついでに GUID も混ぜ混んじゃう? ------------------------- #ifndef MYLIB_H #define MYLIB_H XXXXX XXXXX XXXXX #endif ------------------------- ANSIでは、アンダースコアで始めちゃだめ、とかいろいろあるんですよね? ん、アンダースコア2発だったかな??
>667>669 _, ,_ ガッ ガッ _**_* ( ・д・)三●☆))Д´;((☆拳三(・А・ )
アンダースコア開始は駄目だからね 駄目駄目、駄目だからね
おれWindowsでしかソフトつくったことないんだけど、 UNIXにもGUIDの考え方ってあるの?
なんでそんなに「駄目」なの?
システム予約の識別子、って事になってなかったっけ。 まぁやめとけと。
MACアドレスとかもGUIDなんじゃねーの? と用語サイトを検索した結果をそのまま書く俺。
これからC始めるならどのコンパイラがいいですか?
OSはXPです。
とりあえず
>>2 のVC++toolkit2003を入れてみました。
おれ
>>673 です。
GUIDには、いつも世話になっています。
これって生成ソースが公開されてるのかな。
VisualStudioだったら「GUIDの生成」というメニューがあるけど、
gccの関連ツールとか関連ライブラリにはそんなのあるのかなと思って。
681 :
デフォルトの名無しさん :04/10/14 21:46:55
#include <stdio.h> main(void){ double x; while(1){ printf("整数入力してね : "); if(scanf("%lf",&x)!=1) break; if(x>=0.0) printf("%15s%22.15e\n%15s%22.15e\n%15s%22.15e\n", "x=" , x , "sqrt(x)=" , sqrt(x) , "pow(x,x)=" , pow( x , x )); else { printf("負数は無理 \n"); break; } } printf("EXIT \n"); } 結果 整数入力してね : 2 x= 2.000000000000000e+00 sqrt(x)= 1.414213562373095e+00 pow(x,x)=3.903118602145848e-322 整数入力してね : 3 x= 3.000000000000000e+00 sqrt(x)= 1.732050807568877e+00 pow(x,x)=-2.424659668443082e-231 整数入力してね : 4 x= 4.000000000000000e+00 sqrt(x)= 2.000000000000000e+00 pow(x,x)= 8.000000000000140e+00 なぜに?
682 :
デフォルトの名無しさん :04/10/14 21:57:18
そもそもGUIDが必要な理由がわかれば答えもわかるはず。
>>681 コンパイル時にwarningでてないか?
684 :
681 :04/10/14 22:12:54
>>683 warning出ません
ちなみにMac OS 10.2 gcc3.1 です
685 :
デフォルトの名無しさん :04/10/14 22:15:16
warningはしょせんerrorじゃない
うちのコンパイラは出してくれるなぁ test.c : warning:#include <math.h>を忘れています
687 :
デフォルトの名無しさん :04/10/14 22:18:06
if(a=kansu(b)) こんなんでも出すものがあるしな。
689 :
681 :04/10/14 22:43:46
>>686 #include <math.h> 入れてみました
結果
整数入力してね : 2
x= 2.000000000000000e+00
sqrt(x)= 1.414213562373095e+00
pow(x,x)= 4.000000000000000e+00
整数入力してね : 3
x= 3.000000000000000e+00
sqrt(x)= 1.732050807568877e+00
pow(x,x)= 2.700000000000000e+01
整数入力してね : 4
x= 4.000000000000000e+00
sqrt(x)= 2.000000000000000e+00
pow(x,x)= 2.560000000000000e+02
なにげに進歩?
>>689 進歩ってどういう意味だ?ちゃんと答え出てるだろ
691 :
681 :04/10/14 22:58:41
>>690 アホですんません
答え出てますね パニ食ってました
みんなが普段使ってる文字フォントはなんですか
はい
>>665 >>646 は実行したときの結果が思っているものとは違うかも、ってこと
i++ と ++i の違いじゃなくて、
i++, i++, i++ ってなっているときに
0, 1, 2 とか 1, 2, 3 となるのが当然とは限らない
>i++と++iの違いはわかります。
>理解できました。
とあるので、分かってくれているのかもだが
実行せずにレスしたんなら一度試しておけ
696 :
デフォルトの名無しさん :04/10/15 03:11:52
あ、あの、結構前に restrict ポインタの配列等について質問した ものなのですが... ひょっとして忘れられてるのかと思ってひつこく もう一度投稿します。困っています。気になって夜も眠れません。 static const int * const restrict * const restrict * const restrict ppp = ... とかなってしまいます。ひょっとしたら僕は騙されているのではないか? と思い始めています。typedef で見た目スッキリにはできるけれども、 僕の心はスッキリしません。エイリアス一切なしのソースを書き、その 決意をコンパイラにオプションで伝えた方がよっぽどましです。 そもそも、restrict キーワードなんて使っている人は、 ぼ く だ け で す か ?
この辺を言っているのかな。 ISO/IEC 9899:1999 6.5.2.2 -10 The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified.
アセンブラリスト見ればいいじゃないか
699 :
デフォルトの名無しさん :04/10/15 03:35:14
C言語って何ですか?
701 :
デフォルトの名無しさん :04/10/15 03:41:47
うひょひょ
702 :
デフォルトの名無しさん :04/10/15 04:51:17
いくつかの標準関数の引数にはrestrictがつけられるようになったんじゃなかった? memcpyとか。
>646 実行結果 2, 1, 0, 3, 2, 1, ひえーっカウントダウンしてます! 表示の順番が逆に!
>>703 Sun-OSだと昇順になるよ。
引き数をスタック渡しするCPUだと降順になると思われ。
Cの引数の評価順は不定
不定というと、毎回バラバラみたいな印象だな。
Cの引数の評価順は俺に聞くな
J=0の畤、 *(a+J++) は、a+何と書いたことになりますか?
>>709 当然 a+J++ と書いたことになります
0
>>709 *(a+(J++))と同じになると思われる
今、お遊びでVC++ .NETで
int i=1, j=2, k;
k = i+++j;
としてみたら、
k = (i++)+j
として処理された・・・i+(++j)とどっちになるかと思ったけど、つまらん結果だった
>711さん ありがとうございます。
自演したと言いたいのか? なんか知らんがガンバレ。
>>712 は
>>709 が聞きたかったこととは少しずれてるが、
>>711 の補足として読んでおけばいいのかな?
>>709 はJが0の場合の計算結果を知りたかったみたいだし
>>712 のがちょっとおもしろかったので、俺も今試してみた。
i++++jもi+++++jも不可だな
i+++++jは(i++)+(++j)と処理したらMSを見直したんだが
見直すって? ((i++)++)+jでもi+(++(++j))でもなく、そうなるべきという根拠は何だ。
>>712 ,716
演算子は可能な限り長くなるように解釈すると仕様で決められていたと記憶しているが。
頻繁に使われる   って何ですか? どんな働きをしますか?
>>717 いや、((i++)++)+jでもi+(++(++j))でも構わんのだけど、
i+++jを通すなら、i+++++jも適当な解釈で通してくれてもいいじゃん、って思っただけ
融通利かせてくれたら、ネタ提供してくれたMSを見直す、って意味だよ
723 :
デフォルトの名無しさん :04/10/15 15:12:03
演算子の優先順位のお勉強からはじめようね。 とりあえず。
あぁ、 って書いてたのか。 また何かネタかと思った。
>722英語がわかりません
*(p++)++ は出来ると思うんですけど、 *++(++p) ってやっても大丈夫?
ありがとうございます!よくわかりました!
プログラムの勉強なんて俺にとってはぶっちゃけウォナニー。英語も数学も全くだめなんだから。 16でGUIアプリに挑戦中とかいう奴もいる。俺は18。始めて3ヶ月。 鬱だ。この差は埋められないのか...
なんちゃって
でも気持ちいいんだろ?
ウォナニーが出来れば充分
[email protected] 初めまして、C言語を初めて1ヶ月もまだ経っていない16歳です。
メッセにてC言語のことを助言及び教えていただける方、募集中です。
私の質問に答えてくれる人、登録お願いいたします!!
>731 はい..気持ち...いいです..(w
とりあえず、荒らし依頼として通報しとくね ^^
確かに半年立つまでは気持ち良かったが...(ry
>>726 ++ 演算子の結果は右辺値なので不可。
質問 /*compute Mass of Black Hole */ /*Print Data for M vs C vs P Plot */ #include <math.h> #include<stdio.h> main( ) { float C0, /* Orbital circumference, km */ P0, /* Orbital Period, seconds */ G; /* Gravitational constant km**3/s**2 per solar mass*/ float pi, MassHole; G=1.327E11; pi=3.14159; for(C0=1E5; C0 < 1E7; C0=C0+2E5){ printf("C0 is : %f\n",C0); for(P0=10; P0 < 1000 ; Po=P0+10){ MassHole=C0*C0*C0/(2*pi*G*P0*P0); printf("%f %f\n",P0, MassHole); } } } 上記のコードでコンパイルしようとしてもエラー E2451 未定義のシンボル P0( 関数main() ) トエラーメッセージが出てコンパイルできません。どうしたら解決しますでしょうか?
嘘を吐くな 未定義なのはPoだろ >for(P0=10; P0 < 1000 ; Po=P0+10){ エラーメッセージの意味を読み取る努力しろ
742 :
デフォルトの名無しさん :04/10/15 21:29:56
Windows 環境なのですが、コマンドプロンプトに色をつけることは出来ないのでしょうか? "\x1b[33m" などを使っても、文字に色がつきません。 どうすればよろしいのでしょうか?
743 :
デフォルトの名無しさん :04/10/15 21:31:35
GUIなどは標準Cではできない そもそもなんで? OS書くため生まれた言語としては グラフィックが扱えないと言うのはいささか手落ち、 そんなことが あってたまるかの一言。
>>742 NT系統はANSI.sys入ってないからエスケープシーケンス不可
9xは標準で入っているから可の場合「も」ある
NT系統は自分でANSI.sys入れることが必須だが、
入れて正しく記述しても付かない人も多いし、上手いこと付いた場合でも
それを人に渡す場合、相手も入れてないと結局色はつけられない
>>744 XPもNT系統なのでしょうか?
無理そうなので、別な方法で(特定の文字列を)強調してみます。
ありがとうございましたm(_ _)m
>>743 適切なライブラリさえあれば、標準Cで十分可能ですが。
>>743 別にできないとは規定されてないぞ。
fread/fwrite で VRAM を読み書き出来るようにすれば良い。
748 :
デフォルトの名無しさん :04/10/15 21:45:50
>>743 オブジェクトモデルが規定されていないため cdecl のような非標準拡張が必要となったまで
リッチー氏が C を設計した当時、Unics はモノリシックカーネルでよかったので静的リンクについてしか設計をしていなかった
2000はMeより前だがな
>>743 全ての環境のI/Oなんて標準化できない、
お前の使ってるヘボイPCとOSが世の全てじゃない。
>>743 C言語が出来た頃のコンピュータを見てきてからそれを言えヴォケ
>>749 cygwinのbashとかはどうやって色をつけてるんだろう?
>>754 bash は コマンドプロンプト ではない
757 :
デフォルトの名無しさん :04/10/15 23:42:54
数学にもC言語にも強いお方助けてくださいまし・・・ 多項式の次数Nを読み込む N+1個の係数a[0]・・・a[N]を読み込む y=aN XのN乗+aN-1 XのN-1乗+・・・+a1 X+a0 =(((aN X+aN-1)×X+aN-2)×X+・・・+a1)×X+a0 【aNのNは下付きのちっちゃいNで、×は”かける”、Xは”エックス”】 読み込む部分はmain関数でおこない 多項式の計算する部分を関数にせよ (戻り値は多項式の場合) 式がかなりわかりずらいですがなにとぞよろしく
要は多項式をHorner(ホーナー)形式に書き換えよということか?
759 :
デフォルトの名無しさん :04/10/15 23:49:58
むむ? ホーナー形式? そんな難しい話ではないはずなのだが。。。
>>757 あぁ、早とちりした。ホーナーじゃないか。で、何がしたいんだ?
つまり半スイング状態でホームラン打つ奴のことだな
762 :
デフォルトの名無しさん :04/10/15 23:58:29
C言語の課題で
>>757 これを作れと。。。
なんだかよく分からなくてあの授業にはもうついていけんorz
763 :
デフォルトの名無しさん :04/10/15 23:59:57
>>762 エスパーでもないとこんな問題文読み取れない。
関数にしてほしいのは何だ?多項式の次数と係数を配列にでもして
引数にとって値を返すのか?
がんがれー
767 :
デフォルトの名無しさん :04/10/16 00:16:28
あー下付きのNとか階乗の表示がしづらい。。。 数列のつもりなんだがそこらへんは伝わってた?
768 :
デフォルトの名無しさん :04/10/16 00:17:03
>>1 > ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
769 :
デフォルトの名無しさん :04/10/16 00:19:59
了解。さわがせました。
でも、ここで
>>757 解けるかたいたらよろ
770 :
デフォルトの名無しさん :04/10/16 00:20:42
ダディクールスレを見て逃げ帰ってくる予感
>>756 あれ?、コマンドプロンプト上で動いてるようにしか見えないんだけど違うのか・・・
773 :
デフォルトの名無しさん :04/10/16 00:30:32
>>771 はい、なおします。
でも、大学でたら永久就職する予定なんだが...
永久就職も社会に出るのと同じか...
どっちにしろもうちょっと自分で努力します
大学卒業と同時に無期懲役刑
776 :
デフォルトの名無しさん :04/10/16 00:34:39
>>774 あれ?永久就職しらん?
結婚すよ。
数学の助教授とね。
永久就職を知らん人も知らん人だが 性格を注意されて永久就職するからって言い訳するのもなぁ・・・ なんていうか・・・orz
>>767 y=aN XのN乗+aN-1 XのN-1乗+・・・+a1 X+a0
これは
y=a_N*X^{N}+a_{N-1}*X^{N-1}+…+a_1*X+a_0
と書くとわかりやすい。
数式を書くとき、TeX風の疑似表現をしてみると良いでしょう。
779 :
デフォルトの名無しさん :04/10/16 00:38:51
>>778 おお〜、なるほどね。
有り難う御座います!
大学生だったのか。小学生かと思った。
781 :
デフォルトの名無しさん :04/10/16 00:43:59
えー。。。小学生_| ̄|○ これでも、貴族なかんじの大学なのに...
いいから消えろよ
自作自演乙
数学の先生か。 数学のことしか興味がなく、世間知らずでワガママなんだよな。 御愁傷様。
785 :
デフォルトの名無しさん :04/10/16 00:48:41
う”...消えろか...。イタイ もうちょっとハッキリした答えが来るまで待ちたいんだが。 というか、誰か教えておくれよ
ヒントは再帰だ
ちなみに再帰ってのは「二度と再び帰ってくるな」って意味です。
789 :
デフォルトの名無しさん :04/10/16 00:52:23
再帰。。。 あー、情報の先生もそんなこと言ってたかも。
791 :
デフォルトの名無しさん :04/10/16 00:56:19
>>790 わかってるね。。。
授業中遊ぶか寝るかしかしてなかったもんで(汗
>>785 親切に色々ヒント出してくれて有り難う
でも自分、アフォでごめ。
ビットフィールドは移植性が無い といわれますが、何故なんでしょうか
>>757 汚いが、こんなんでどう?
#include <stdio.h>
#include <stdlib.h>
double evaluate(double* a, int N, double x, int level)
{
return level == N ? *(a + N) : evaluate(a, N, x, level + 1) * x + *(a + level);
}
int main(void)
{
double *a, x, f;
int N, i;
printf("Input degree of a polynomial:");
scanf("%d", &N);
a = (double*)malloc(sizeof(double) * N);
for (i = 0; i <= N; i++)
{
printf("Input coefficient of pow(x, %d):", i);
scanf("%lf", a + i);
}
printf("Input x:");
scanf("%lf", &x);
f = evaluate(a, N, x, 0);
printf("value:%lf", f);
free(a);
return 0;
}
794 :
デフォルトの名無しさん :04/10/16 01:02:15
全角スペースを判定するマクロを作りたいのですが、 #define IS_SPACE(x) ((unsigned char)(x) == 0xa1) char* str = " "; if(IS_SPACE(*str) && /* 1バイト目を比較 */ IS_SPACE(*(str+1)) /* 2バイト目を比較 */ ) { } と、いう風にやってみたんですが、うまく判定できません。 どこが間違ってますか?
全角空白って0xa1a1なん? つか文字コードは?
797 :
デフォルトの名無しさん :04/10/16 01:12:00
>>793 キタ――――(・∀・)――――!!!
どもどもー!
あれ?実行するとなんか・・・なんか??
数字を入れると答えが出る感じじゃないの?
他の文字に0xa1はいってたらダメじゃん
0x8282
>>795 諦めて素直にstrcmp使うのはだめなん?
801 :
デフォルトの名無しさん :04/10/16 01:16:14
>>795 #define IS_SPACE(x) !strncmp(x," ",2)
char *str=" ";
if(IS_SPACE(str)){
#define IS_SPACE(x) ((x)[0] == " "[0] && ((x)[1] == " "[1])) でも、文字列の先頭から真面目にマルチバイト文字の処理していかないと、 誤認識する文字コード系が多い気もする。
全角スペースを使ってる国って日本以外にあるのか!?
804 :
デフォルトの名無しさん :04/10/16 01:21:44
BIG5とか
>>797 ・多項式の次数Nを読み込む
・N+1個の係数a[0]・・・a[N]を読み込む
の2つは満たしているはず。最初に"Input degree of a polynomial:"で次数を、
"Input coefficient of pow(x, n)"でx^nの係数を入力する。次にxを入力すると
xを代入した時の多項式の値が出力される。っていうか、問題の後半から問題文
そのものが意味不明だから、もしやることが間違ってたら参考に作り直しな。
この場合だとShift_JISなら誤認識はしない、かな? EUC-JPは、ある漢字の2バイト目と別の漢字の1バイト目が、また別の漢字と同じバイト列に見えたり。
皆さんありがとうございます
>>802 の方法でうまくいきました
808 :
デフォルトの名無しさん :04/10/16 01:35:08
struct Tree{ Hoge data; Tree* next; //姉妹Treeへのポインタ Tree* child; //子Treeへのポインタ }; こういう構造体で構成される階層データがあるのですが、 これを再帰無しで全検索するスマートな方法ってあるでしょうか。 スタックがつぶれてしまって…。
しまった、記法がC++ですいません。
810 :
デフォルトの名無しさん :04/10/16 01:42:51
>>807 あたりまえだが移植性とかまったく考えてないし、
素直に801のstrncmp版使っとけ
>>808 アドレスだけスタックに入れて、プログラムの構造はループにする
>810 一緒じゃない、問題はあるが違うネタ。全てが2バイト文字ならShift_JISは無問題。 使ってる領域見れ。
>>812 ありがとうござます、標準ライブラリですよね
試してきます。落ちませんように…
>>808 どうせ再帰が使えないなら横型探索で。
#include <stdio.h>
#define Q_SIZE 1024
struct Tree {
int data;
struct Tree *next;
struct Tree *child;
};
void search(struct Tree *p)
{
struct Tree *queue[Q_SIZE + 1] = { p };
int i, j = 1;
for (i = 0; p = queue[i]; i++)
do {
printf("%d\n", p->data);
if (p->child)
queue[j++] = p->child;
} while (p = p->next);
}
int main(void)
{
struct Tree root = { 1 };
search(&root);
return 0;
}
標準ライブラリ、特に入出力関数がどう実装されているかを わかりやすく解説した本ってありませんか? リダイレクトしたときに、入出力関数の動きがどのような仕組みで 変わるのかを知りたいのですが?
>>817 そんな事言うと、ソース読めと言われますよ。
本ではなく、WEBページでも結構です。 宜しくお願いします。
そういうのを知る必要がないしコンパイラごとで違うので誰も知らない アセンブラコードでも吐かせて見てみるか
でも煽りじゃなくソース読むのがてっとりばやくないか?
自分の考えを確かなものにする裏付けが欲しいのだろうか
だいたいリダイレクトはC言語じゃなくてシェルの機能だし
パブリックドメインのprintfやscanfの実装ってありませんかね?
>>817 >リダイレクトしたときに、入出力関数の動きがどのような仕組みで変わるのか
単にstdoutの指す先が変わるだけじゃないの?
>>818 私、最近勉強始めたばかりで、
ほんとにまだ最初の方で、fprint()、scanf()のところでもう壁にぶち当たっています。
scanf()は、キーボードからの入力を変数に代入する関数であると説明がありますが、
エコーバックは、何がどのようにうやってくれているんだ?
scanf()がやっているのではないのか?
そして、それはリダイレクトするとどうなるんだ?
ってことがわかりません。
簡単な概要を取り敢えず知りたいのですが・・・
dup2やpopenや、あとなんだろう
>単にstdoutの指す先が変わるだけじゃないの? 出力関数の場合、論理出力装置が変わるだけだと思うのですが、 入力関数の場合、エコーバックしたり、しなかったりという動きの変化は どなっているのでしょう?
あれ・・・ すみません。「論理出力装置」っていう用語ありませんでしたね。 yahooで検索しても引っかからない。 私の記憶違いでした。
そこまでくると、C言語の範疇じゃなくなるな エコーバックはOSが勝手にやっててCがエコーバックしてるわけじゃないし。 //今はINT21とかやらないからなー
VC++のcrtのソース見てたら・・・ gotoが・・・・・
俺は構わんが
836 :
デフォルトの名無しさん :04/10/16 08:51:45
誰も構わないだろう。
837 :
デフォルトの名無しさん :04/10/16 09:30:11
>>833 オマエのソースだってどーせ break の嵐だろ
この前見たソース、 for (;;) { ...; ...; if (...) { break; } ...; ...; break; } って感じだった。ループさせる意図が無いならgotoか、 さもなくばswitchかせめてdo whileにして欲しいと思った。
839 :
デフォルトの名無しさん :04/10/16 10:49:09
挿入法のソートのアルゴリズムなんですけど、参考書ではif文のあと にelse{break;}をいれてるんですけど、これはいるもんなんでしょうか いれずにしても、ちゃんとソートしました。 #include <stdio.h> void main(void){ ・・・・・int gakusei[]={165,158,170,156,175}; ・・・・・int i,j;int temp; ・・・・・・for(i=0; i<5; i++){ ・・・・・・for(j=i-1;j>=0;j--){ ・・・・・・・if(gakusei[j]<gakusei[j+1]){ ・・・・・・・temp=gakusei[j]; ・・・・・・・gakusei[j]=gakusei[j+1]; ・・・・・・・gakusei[j+1]=temp;}}} ・・・・・for(i=0; i<5; i++){ ・・・・・printf("%d\n",gakusei[i]);}}
つか、バブルソートじゃ?
842 :
デフォルトの名無しさん :04/10/16 11:03:20
なぜelse でbreak文がいるんですか? for文で条件があわなくなったら勝手にぬけるんじゃ?
>>842 勝手に抜ける前に終了させてるんでしょ。
>>813 全てが2バイト文字ならEUCも無問題なんだが。
845 :
デフォルトの名無しさん :04/10/16 11:42:19
>>839 どこの参考書だ?それは挿入ソートとは違う。
>>844 文字の組み合わせで、2バイト目と1バイト目が別の文字と被る、
と、そもそも806のレスがあるでしょうに。
>>846 全てが2バイト文字なら文字位置が偶数番目か奇数番目かで
2バイト目か1バイト目かがすぐに分かるだろ。
848 :
デフォルトの名無しさん :04/10/16 11:56:33
>>845 まじですか?c言語で学ぶアルゴリズムとデータ構造
って本です。挿入ソートのアルゴリズムでのってました
849 :
デフォルトの名無しさん :04/10/16 11:59:58
解説では一気に挿入位置をきめてるのではなく一つのデータの 挿入位置が決定するまで末尾から先頭にむかって値の交換を くりかえしていると解説しています。
よーしパパ2バイト文字しか使わない言語作っちゃうぞー main() { printf(”Hello, World.¥n”); }
改行コードが入ってる
なんで850にフォローしてるんだ?
855 :
悲しい。 :04/10/16 12:40:41
856 :
デフォルトの名無しさん :04/10/16 13:02:05
親衛隊でも出没したのか
>>838 do { } while(0); だと警告が出るんですよ。VCの/W4だと。
858 :
デフォルトの名無しさん :04/10/16 13:22:01
ふつうUTF-8
>>857 大丈夫、for (;;) {...}でも最後にbreakしたら大抵警告出るから。
do {..} while (0) を使えといっているわけではないことに注意してくれ。
861 :
デフォルトの名無しさん :04/10/16 15:29:01
警告(857): 頭悪スレへ逝ってよし。
>>859 >大丈夫、for (;;) {...}でも最後にbreakしたら大抵警告出るから
そんなコンパイラあんのかよ
863 :
デフォルトの名無しさん :04/10/16 20:28:27
warning: warning oriented programming is now obsolete.
>>859 今、Visual C++とBorland C++ Compilerで試したら出なかったが。
865 :
デフォルトの名無しさん :04/10/16 22:00:07
> do { } while(0); だと警告が出るんですよ。VCの/W4だと。 常識的に for (; ; ) do { } while (1); や while (1) は使わない。 それと同じ理屈だ。
for(;;)かwhile(1)か、そんなのは何も考えずに会社のコーディング規則に 従えばそれでいいと思うが。
867 :
デフォルトの名無しさん :04/10/16 22:03:14
> 挿入法のソートのアルゴリズムなんですけど、参考書ではif文のあと っていうか、まずそのまぬけな本の名前を言えよ! void mainなんていう書き方してる時点でだめだめだし、 初心者が間抜けな勘違いをしそうなインデントをわざわざしてるあたりが 間抜けな本だ。 まず書名を書け!
868 :
デフォルトの名無しさん :04/10/16 22:04:57
まずスレを嫁!
870 :
デフォルトの名無しさん :04/10/16 22:11:37
#include <stdio.h> #define MAX 5 main() { ・・int g[MAX] = {165, 158, 170, 156, 175}; ・・int i, j, t; ・・for (i = 0; i < MAX; i++) { ・・・・for (j = i - 1; j >= 0; j--) { ・・・・・・if (g[j] >= g[j + 1]) ・・・・・・・・break; ・・・・・・else { ・・・・・・・・t = g[j]; ・・・・・・・・g[j] = g[j + 1]; ・・・・・・・・g[j + 1] = t; ・・・・・・} ・・・・} ・・} ・・for (i = 0; i < MAX; i++) ・・・・・printf("%d\n", g[i]); } こうかけば、そういう間抜けな勘違いをするやつもでてこない。
871 :
デフォルトの名無しさん :04/10/16 22:12:32
> for(;;)かwhile(1)か、そんなのは何も考えずに会社のコーディング規則に いいえ、どちらもだめです。
872 :
デフォルトの名無しさん :04/10/16 22:28:31
みんな突っ込みどころ違うんじゃないのか? do{ }while(0); 間にcontinue入れたらわからんでもないが、 これじゃループにもならんがな('A`)
>>862 Solaris2.8のccは警告が出た。
曰く、ループの終端に辿り着けないとさ。
来年就職し、C言語を使うといわれたのですが 勉強しとくのはVCとかC++でも大丈夫ですか? 何やっとけばいいかわからないんですけど、なにか作ったほうがいいでしょうか?
>>876 何を作ってる会社かも知らんのか!?
お前の人生それでいいのか!?
どんなのを作ってるのかは知ってますけど、どうゆう受注でなんの言語を使ったかは知りませんが 普通入社前でも知ってるものなんですか?
879 :
デフォルトの名無しさん :04/10/16 23:23:55
>>876 このへん、おすすめ
http://www.kumei.ne.jp/c_lang/ 題材ははっきり言ってえり好みしてても意味がない
所詮は付け焼刃ってとこ忘れていい気になってると一番痛いカウンターもらう
とにかく、色々ちゃらちゃら見て、やりたいのから逝け
有料製品でリッチにやるもよし、フリーでハングリーにいくもよし
まさしくあんたの人生だ、思うようにいけばいい
>>878 当たり前だ。自分がどんな仕事するかわからん所に行けるか!
>873 do{ 〜 }while(0)(最後に ; をつけない)なら 複数の文を含む関数っぽく使えるマクロ組むときに使うな。 #define HOGE(i) { foo(i); bar(j); } と定義すると if(〜) HOGE(i); else piyo(); とするとコンパイルエラーになる そこで、後に ; がつけられて、ループしないdo{ 〜 }while(0)を使って #define HOGE(i) do{ foo(i); bar(j); }while(0) とやればちゃんとコンパイルできるようになる。
882 :
デフォルトの名無しさん :04/10/16 23:30:19
それ専用
途中でbreak;かませば最後まで行ってくれる。gotoなし。
884 :
デフォルトの名無しさん :04/10/16 23:44:36
int (*poly[5])[3]; これは、どう読めばいいのでしょうか?
do{ 一回しか実行しないけど括弧でくくりたい(==breakを書きたい)処理 }while(0); でいいんじゃないの?
887 :
デフォルトの名無しさん :04/10/16 23:47:27
>>884 int poly[3]へのポインタの配列(要素数5)
>>887 それは
int poly[5][3];
かも
889 :
デフォルトの名無しさん :04/10/16 23:51:17
890 :
デフォルトの名無しさん :04/10/16 23:54:43
int [3]へのポインタの配列poly(要素数5)と書くべきか polyは配列名だし
配列(要素数3)のポインタの配列(要素数5)
int oreryu[3]; int (*donden)[3]=&oreryu; int (*daichan[5])[3]; daichan[4]=donden;
893 :
デフォルトの名無しさん :04/10/17 00:07:45
>>885 何も言わずにただカッコでくくるだけじゃ物足りないの?
{
// 1回だけだよ〜
}
つまりintポインタの2次元配列?
896 :
デフォルトの名無しさん :04/10/17 00:43:31
>>896 むずい・・
(*poly[5])が3つあるってことだよね。
でも、そのpolyはintポインタが5つ。
899 :
デフォルトの名無しさん :04/10/17 01:05:11
>>898 違う。
配列へのポインタ(配列を指すポインタ)って分かる?
int a[3]で&aとすると得られるものの型なんだけど。
それの5つの配列。
int (*poly)[3];
これが配列へのポインタ(あくまでもポインタで配列ではない)で、それを配列にするとint (*poly[5])[3];
うまく伝わりそうにないなぁ。
そこでtypedefですよ
なんでこんな基本的なことでいまさら盛り上がるのか。 C言語が難しい言語なのか、 それともここにいるやつらが馬鹿なのか。
CなのにC++の//のコメントを書くのが気に入らない。 便利なのは分かるがCではない。 そうだ、Cのソースファイルの // を /* に置き換えて行末に */を追加する処理を 作ってくれないか。ただし、ダブルクォーテーションで囲まれた文字列リテラルは 無視するように。
904 :
デフォルトの名無しさん :04/10/17 01:32:22
906 :
デフォルトの名無しさん :04/10/17 04:18:21
>>902 簡単だよ。マクロ作ればいいじゃん。
#define //(comment) /* comment */
プリプロセッサの出力ファイルをまた保存して新たなソースに・・・ 余計なところまで展開されて・・・
908 :
デフォルトの名無しさん :04/10/17 05:54:31
struct kouzoutai *kouzoutai 構造体のポインタは struct kouzoutai kouzoutai kouzoutai.変数=100; こういうのはできないの?
>>908 struct kouzoutai *p;
p->hoge = 100;
ぽーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
913 :
デフォルトの名無しさん :04/10/17 07:00:39
> CなのにC++の//のコメントを書くのが気に入らない。 いいえ。Cのコメントです。 私はBCPLの時代のくせで//ばかりでしたが、 Cで15年ほど前から//が使えるように拡張されている処理系が多かったのは うれしかったです。 5年前に標準規格にもとりいれられたのは「いまさら」って感じです。
914 :
デフォルトの名無しさん :04/10/17 07:05:19
↑それ、「C++の真似でそうなってるとか思ってるやつはボケだ! むしろ先祖返り」って、 日下部先生も本に書いてたよね。
やっぱりコメントは○○じゃなきゃ落ち着かない。 って人も、 #define REM // #define rem // #define ' // #define # // #define ! // #define ; // これで万事解決だね!
#define Rem //
char rem; if (rem != '#') rem='$';
918 :
デフォルトの名無しさん :04/10/17 11:04:53
919 :
デフォルトの名無しさん :04/10/17 11:38:09
int main(void) { char buf[64]; char **p=0; fgets(buf, 64, stdin); *p = (char *)malloc(sizeof(char) * 64); p[0] = strtok(buf, " "); printf("%s\n", *p); free(*p); } こんな感じでポインタのポインタを使って、動的 に領域を確保したいんですけどどこらへんが だめなんですかね、プログラムの途中で終 わってしまうんですけど。
*p = (char *)malloc(sizeof(char) * 64); の前に一行 p = (char **)malloc(sizeof(char *)); 入れとけ
>>920 >921したらfree()も忘れずに。
#キーワード抽出にはstrtok()よりもsscanf()使用をお奨め。
924 :
デフォルトの名無しさん :04/10/17 12:39:19
>
>>915 の最後のオチに気づいてやれよ
このぼけって、最後の1つしかネタだと思わなかったわけだな...
*p = (char *)malloc(sizeof(char) * 64); p[0] = strtok(buf, " "); ↓ p[0] == *(p + 0) == *p ↓ *p = (char *)malloc(sizeof(char) * 64); *p = strtok(buf, " "); ... free(*p) ………あれ?
926 :
デフォルトの名無しさん :04/10/17 12:41:38
> char **p=0; > > *p = (char *)malloc(sizeof(char) * 64); まず、ここで間違い。 > free(*p); NULLかもしれないものをfreeしてる時点でまちがい
927 :
デフォルトの名無しさん :04/10/17 12:42:04
> これで万事解決だね! これのことだろ
p = (char **)malloc(sizeof(char *)); で確保した分はfree(p) *p = (char *)malloc(sizeof(char) * 64); で確保した分はfree(*p);で解放。 でいんですか?
929 :
デフォルトの名無しさん :04/10/17 12:45:25
> これのことだろ ちがうだろ。その上の5行の中の違いに気づかないのかよぼけ
いんですか?
931 :
教えて :04/10/17 13:31:45
文字列にループで数字を入れていくにはどうすればいいですか? 例えば、file001,file002,file003・・という風につけていきたいのです。
sprintf()
933 :
デフォルトの名無しさん :04/10/17 13:35:03
sprintfで我慢してください
3連コンボワロタ
936 :
教えて :04/10/17 13:39:33
ありがとうございます!!!
937 :
デフォルトの名無しさん :04/10/17 13:43:35
>NULLかもしれないものをfreeしてる時点でまちがい こいつ ぼけ
struct test { int num; }; struct test *t; としたとき、tの中のnumのアドレスをとるには、どう記述すればいいですか?
&(t->num)
#include <stdio.h> struct test { int num; }; void func(struct test *t) { int a = 10; t->num = a; printf("%d\n", t->num); return ; } void func2(struct test *t) { int a = 10; &(t->num) = &a; printf("%d\n", t->num); return ; } int main(void) { struct test t; func(&t); func2(&t); return 0; } としたとき、func2がエラーになるのはなぜですか?
int i,j; int *p; j=1; で、 i=j; がOKで &i=&j; がNGなのとおなじ。 (変数のアドレスは書き換えられない) やるなら p=&j;
やたら初心者スレ逝けって言ってる奴なんなんだ? 質問スレに何故居るんだ。
>>943 一応回答しているし、説明するのが面倒なんだろ。
#だったら放置すりゃいいのにとは思うが。
>>939 ,942
どうもありがとうございました。
まあ、初心者スレ行けと言っておけば、 ・自分が回答できないということを言いつつ ・相手より自分のほうが知識があると思わせることが出来る 矮小な自我を守るために必死なんですよ。(・∀・)ニヤニヤしてあげましょう
つか、宿題スレ行きだろ。
ニヤニヤ
わかったから初心者じゃない高尚な話題ふれよ(・∀・)ニヤニヤ
ここのスレは何の話題やるんだ?
>>920 int main(void)
{
char buf[64];
char *p=0;
fgets(buf, 64, stdin);
p = (char *)malloc(sizeof(char) * 64);
strncpy(p, strtok(buf, " "), 64);
printf("%s\n", p);
free(p);
}
君のやりたいことはこれで充分。
64 はマジックナンバーだから #define すれ。
ここでstrtokはリエントラントじゃないぞと無意味に絡むのがこのスレの流儀
main関数だろ、なんでリエントラントの話に
どこでも同じだろ。
あのソースでリエントラントがあるとどう困るんだ?
リエントラントになってるほうがうれしい
テストコードだから、サンプルだから、そう理由をつけて糞コード書く香具師に限って 製品コードでも似たような糞コード書くんだよな。 #つーか、コメントに1秒ウェイトと書いてSleep(2000)なんて書くんじゃねぇよ(鬱
で、それがこの場合にどう関係するんだ?
>962 HTなんだよ、きっとw
リエントラントにこだわることないじゃん。
return 0; が無いぞと無意味に絡むのはこのスレに相応しいですか? あ、それはコンパイラが絡んでくれるからいいのか。
お前はふさわしくない
大学でC習ってるんですが、今時Cの案件なんかあるんですか?
>>968 持ってるところは持ってるし、持ってないところは持ってない。
そうなんですか? 今時Cの案件なんか組み込み系CPUの一部でしかないと思ってました。 禿ですらプログラミング言語C++でCイラネって言ってるんでどんなもんなのかと
イランと思うなら勉強せず、その単位も捨てとけ。 お前以外の誰も困らない。
973 :
デフォルトの名無しさん :04/10/17 18:56:26
>>971 組み込み系がマイノリティという前提での発言か?
974 :
デフォルトの名無しさん :04/10/17 19:02:32
次スレたててくる。
975 :
デフォルトの名無しさん :04/10/17 19:08:04
976 :
デフォルトの名無しさん :04/10/17 19:08:37
実行ファイルのインスタンス数は圧倒的に組み込みの方が多いかも・・・
>>859 >大丈夫、for (;;) {...}でも最後にbreakしたら大抵警告出るから
なんてコンパイラになんてコンパイルオプション付けたら出んのか書いてみろよ
981 :
デフォルトの名無しさん :04/10/17 22:15:14
つまんねぇんだよボケが
ヘッダを全部合わせて、"all.h"とか作ったら怒られますか?
>>983 意味が解からない。
想像するには、
hoge1.h
hoge2.h
hoge3.h
というのがあって、
all.hの中身が、
/* all.h */
#ifndef __ALL_H_
#define __ALL_H_
#include "hoge1.h"
#include "hoge2.h"
#include "hoge3.h"
#endif /* __ALL_H_ */
というものを使っても良いか否かということを聞いているのかな。
だとすると、うん、それはもちろんOK。
985 :
デフォルトの名無しさん :04/10/18 01:37:43
本物の大学生は「案件」なんて言わない。
986 :
デフォルトの名無しさん :04/10/18 01:46:20
9bitの2の補数を正しくintに変換するにはどう書けばよいでしょうか?
>>985 大学生でもいろいろいる。
業界に片足突っ込んだ学生もいるし。
988 :
986 :04/10/18 02:02:27
ちなみに元の値はchar *型です。 下位9bitを用いた数値をint型変数に置き換えてプログラムで使用したいと 思ってます。 int new char *old; ------ new = (int)(old[0] & 9) とかしても失敗でした。 よろしくです。
そのまえに普通charは8ビットだよな。
charは普通8bitだろう
ビットフィールド
997 :
デフォルトの名無しさん :04/10/18 03:22:51
記念カキコ v(^o^i)d
998 :
デフォルトの名無しさん :04/10/18 03:53:24
↓999
999 :
デフォルトの名無しさん :04/10/18 03:58:20
↓1000ゲット厨必死だなw
1000 :
デフォルトの名無しさん :04/10/18 03:59:55
(((;;;:: ;: ;; ;; ;:;::)) ::)
( ::: (;; ∧_,∧ );:;;;)) )::: :; :))
((:: :;; (´・ω・)っ旦;;;; ; :))
((;;; (っ ,r どどどどど・・・・・
i_ノ┘
((;;;;゜;;:::(;;: ∧__,∧ '';:;;;):;:::))゜)) ::)))
(((; ;;:: ;:::;;⊂(´・ω・`) ;:;;;,,))...)))))) ::::)
((;;;:;;;:,,,." ヽ旦⊂ ) ;:;;))):...,),)):;:::::))))
("((;:;;; (⌒) |どどどどど・・・・・
三 `J
.∧__,,∧ ;。・
⊂(´・ω・`)⊃旦
☆ ノ 丿 キキッ
ヽ .ノ (⌒) 彡
と_丿=.⌒
.∧__,,∧ゼェゼェ
(´・ω・;)
( o旦o ))) お茶どうぞ
`u―u´
C言語なら俺に聞け! Part 93
http://pc5.2ch.net/test/read.cgi/tech/1098007606/
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。