C言語なら、俺に聞け! <32>

このエントリーをはてなブックマークに追加
1SHOW-A孫
漏れ10才。3才のときから父SHOW-A息子にプログラムを叩き込まれてきたんだ。
いろいろな言語を極めたけど、一番漏れになじんだのはCかな。
Cのことなら父をも超えた。疑問な点があったら漏れに聞け。

便所とメシ食ってる時以外は暇だが、いちいちFAQに載った質問に応えるほど暇じゃないよ。
課題丸投げなら別スレにいってね。あと、至急父に仕事を与えてやってください。

コンパイラ、過去ログなどのリンクは>>2-5 あたり
2SHOW-A孫:02/09/13 17:26
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
3SHOW-A孫:02/09/13 17:27
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
4SHOW-A孫:02/09/13 17:27
C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART 5
http://pc3.2ch.net/test/read.cgi/tech/1027593322/

前スレ <31> http://pc3.2ch.net/test/read.cgi/tech/1031340950/
5SHOW-A孫:02/09/13 17:29
【過去ログ】
31 http://pc3.2ch.net/test/read.cgi/tech/1031340950/
30 http://pc3.2ch.net/test/read.cgi/tech/1030786546/
29 http://pc3.2ch.net/test/read.cgi/tech/1029605182/
28 http://pc3.2ch.net/test/read.cgi/tech/1028495798/
27 http://pc3.2ch.net/test/read.cgi/tech/1027160374/
26 http://pc3.2ch.net/test/read.cgi/tech/1026048820/
25 http://pc.2ch.net/tech/kako/1024/10249/1024918442.html
24 http://pc.2ch.net/tech/kako/1024/10240/1024033400.html
23 http://pc.2ch.net/tech/kako/1023/10230/1023024817.html
22 http://pc.2ch.net/tech/kako/1022/10224/1022402165.html
21 http://pc.2ch.net/tech/kako/1022/10220/1022045622.html
20 http://pc.2ch.net/tech/kako/1021/10214/1021459016.html
19 http://pc.2ch.net/tech/kako/1020/10207/1020756993.html
18 http://pc.2ch.net/tech/kako/1020/10202/1020260813.html
17 http://pc.2ch.net/tech/kako/1019/10193/1019372139.html
16 http://pc.2ch.net/tech/kako/1018/10184/1018453690.html
15 http://pc.2ch.net/tech/kako/1016/10165/1016519243.html
14 http://pc.2ch.net/tech/kako/1015/10152/1015286974.html
13 http://pc.2ch.net/tech/kako/1013/10139/1013990673.html
12 http://pc.2ch.net/tech/kako/1012/10123/1012348974.html
11 http://pc.2ch.net/tech/kako/1009/10094/1009499565.html
10 http://pc.2ch.net/tech/kako/1008/10083/1008300863.html
9 http://pc.2ch.net/tech/kako/1007/10072/1007272267.html
8 http://pc.2ch.net/tech/kako/1005/10058/1005811510.html
7 http://pc.2ch.net/tech/kako/1003/10034/1003418249.html
6 http://piza2.2ch.net/tech/kako/999/999617524.html
5 http://piza2.2ch.net/tech/kako/994/994908590.html
4 http://piza.2ch.net/tech/kako/992/992357382.html
3 http://piza.2ch.net/tech/kako/989/989929288.html
2 http://piza.2ch.net/tech/kako/979/979529893.html
1 http://piza.2ch.net/tech/kako/967/967985026.html
>>1 乙
>>1
お疲れ〜。これで粘着がいなくなるといいね。
8デフォルトの名無しさん:02/09/13 17:42
>>1
おつかれ。
しかし、メール欄にvoidを忘れてる。
SHOW-Aがスレ主になっても、伝統は守らねば!

そしれ新スレ上げ
9デフォルトの名無しさん:02/09/13 17:43
>>1
すげー、10歳で父を越えるとは。
将来有望じゃん。
>>1の居候のララベルです。
次スレはひ孫で次はやしゃごか?
ロマサガ2みたいに継承をきぼん
13684:02/09/13 18:08
>>1
お疲れ様。

どうもこの684というハンドルは験が悪いようなので、次に質問する時は
また新しいナンバーを使います。
>>1
仕事を振るべきなのは祖父の方じゃなかったか?
>>13
気にするなよ。
一部のfread厨が騒いでいるだけだから。
でも他のスレでレス番号の684は使えないな(ワラ
16デフォルトの名無しさん:02/09/13 20:14
mallocを使って動的に確保した3次元配列と同じくmallocを使って
確保した2次元配列をつくり、3次元配列の値を2次元配列に代入したいのですが
どうもうまく行きません。全て"0"の値をもつテストデータを3次元配列に格納
してから2次元配列へ

a=xxx[i][j][k];
xx[j][k]=a;

のように代入してからxx[j][k]の値を出力すると

4252620
4252620
0
0
0
0
.
.
.
のように、先頭2つにおかしな整数値が現れます。
どこがおかしいのでしょうか?
>>16
ソースを見せてもらわないと、文章だけじゃ分からないです…。
>>16 変数の型を正確に書け。どうやって表示したのかも
>>16
int xxx[ISIZE][JSIZE][KSIZE];
int xx[JSIZE][KSIZE];
だったら、
memcpy (xx, xxx[i], sizeof (xx));
でいけるんじゃないか?完全なコピーではないなら別だが

それはそれとして、おかしくなった原因を必ず突き止めておくべき。
最低でも変数定義、malloc部分、表示部分を見ないとわからない
2016:02/09/13 20:51
>>17>>18>>19
すみません。
結構長いコードなので、必要部分を抜き出して
再掲します。
ふーっ、また1はつまらん名前だな・・・
22デフォルトの名無しさん:02/09/13 21:19
unsigned doubleは合法?
>>22
1ビット目使用しないだけ?扱える数増えるの?
>>22
そういう拡張をしてはならん、という規定はないと思うから、合法なんじゃない?
そんなの見た事ないけど。>>22がそれを何に使いたいのかも知らないけど。
符号なし浮動小数点数・・
2616:02/09/13 22:19
--->>16の再掲です。-----
void main(){
int ***xxx,***yyy,**xx,**yy,a;
// 3次元配列を確保
// 2次元配列を確保
//ファイルオープン
for(i=0 ; i < t ; i++){
for(j=0; j < 128 ; j++){
for(k=0; k < 40 ; k++){
fscanf(fp1,"%5d", &a);
x[i][j][k]=a; //データは全て"0"
}
}
for( m=0 ; m < 6400 ; m++ ){
for(i=0 ; i < t ; i++){
for(j=0 ; j < 128 ; j++){
for(k=0 ; k < 40 ; k++){
a=xxx[i][j][k];
xx[i][m]=a;
}
}
}
}
for( m = 0 ; m < 6400 ; m++ ){
for(i = 0 ; i < t ; i++ ){
xx=xx[i][m];
printf("%d\n",xx);
}
}
}
2716:02/09/13 22:20
改行の数が多すぎて書き込めないのでmallocを使った
配列の動的確保の部分はとりあえず省いています。
本当にきちんと三次元配列みたいなものをつくれているのかしら・・・心配だ。
2916:02/09/13 22:23
>>28
こんなのでやっていますが......。
(一応、失敗はしていないようです)
int ***new_matrix3d( int time, int range, int sector ){
int i,j;
int ***a;
if( ( a = ( int*** )malloc( sizeof( int** ) * time ) ) == NULL ) return NULL;
memset( a, '\0', sizeof( sizeof( int** ) * time ));
for( i = 0; i < time; i++ ) {
if( ( a[ i ] = ( int** )malloc( sizeof( int** ) * range ) ) == NULL ) {
free(a);
return NULL;
}
memset( a[ i ], '\0', sizeof( int* ) * range );
for( j = 0; j < range; j++ ) {
if( ( a[ i ][ j ] = ( int* )malloc( sizeof( int ) * sector ) ) == NULL ) {
free(a);
return NULL;
}
memset( a[ i ][ j ], '\0', sizeof( int ) * sector );
}
}
return(a);
}
一様乱数を作りたいんですが。
randでは無理ですよね?
31デフォルトの名無しさん:02/09/13 22:24
>>29
ゼロクリアならmemset使わないでcallocでいいでしょ。
32デフォルトの名無しさん:02/09/13 22:31
>>29
メモリーの確保に失敗した時、freeするのはaだけじゃまずいでしょ。
メモリーリークの原因になるよ。
33デフォルトの名無しさん:02/09/13 22:33
>>26
for(i=0 ; i < t ; i++){
・・・
 for( m = 0 ; m < 6400 ; m++ ){
  for(i = 0 ; i < t ; i++ ){
   xx=xx[i][m];<−−−−−−−−??????
   printf("%d\n",xx);
  }
 }
}
?のとこはこれでいいつの?
>>30
ええ、思いっきり疑似乱数ですから。

数学の本見てその通り実装するのが吉。探せばありそうだけど。
35デフォルトの名無しさん:02/09/13 22:35
>26
a=xxx[i][j][k];
xx[i][m]=a;
一対一の射像になっていない。>
>>26 >>29
まず、全然多次元配列になっていない。
3716:02/09/13 22:38
即レス有難うございます。
>>31
callocってつかった事が無くて...同じような使い方
ができるとは聞いていますが。
>>32
あ、そうですね。ループして全部開放して
やらないといけないですね。
>>33
そうです。まずいですか?
3833:02/09/13 22:38
>>36
斜め読みだと>>29は多事件配列になってそう(不安
39デフォルトの名無しさん:02/09/13 22:40
>26
for(i〜〜){
for(i〜〜){ と iが2つ重なっているよ。
重箱

・多次元配列 a[1,3,5];
・配列の配列の配列 a[1][3][5];
xx=xx[i][m];これは駄目!
#define JSIZE 128
#define KSIZE 40
...
int t;
int (*xxx)[JSIZE][KSIZE];
int (*xx)[KSIZE];
...
xxx = malloc (sizeof (int) * t * JSIZE * KSIZE);
xx = malloc (sizeof (int) * JSIZE * KSIZE);
...

とりあえず、こっち↑のほうが余分なループがなくていいと思う。
xxは固定サイズなので、動的に割り当てる必要はないと思うのだが?
43デフォルトの名無しさん:02/09/13 22:42
>>37
xxかえたら迷子にならない?
ポインタの計算元じゃあないの?
>>30
一様乱数で検索かければたくさん出てくるじゃん。
っていうか一様乱数って知らなかったから検索かけちまった。
4542:02/09/13 22:44
あっ、勘違いした!xxのサイズが全然違うな。スマソ
つーかポインタやりなおし
木構造実装してみ勉強になると思うよ
参考
struct foo{
 type Obj;
 foo* pParent;
 foo** pChild;
};
4742:02/09/13 22:52
ひょっとして、これって。。。

int (*xxx)[JSIZE][KSIZE];
int (*xx)[JSIZE * KSIZE];
...
int xxx_size = sizeof (int) * t * JSIZE * KSIZE;
xxx = malloc (xxx_size);
...

xx = xxx; // 内容を一致させるのであれば、ポインタの置き換えで終わり
または
xx = malloc (xxx_size); // 同じサイズ
memcpy (xx, xxx, xxx_size); // コピー

これで終わり?
>>46
そういうあなたもポインタを勉強し直してね。
foo *pChild;でしょ。
>>46
> foo** pChild;

これに何入れるか教えてあげないと怪我すると思った。
5048:02/09/13 22:54
違う、
struct foo *pChild;だ。
511:02/09/13 22:54
これのやり方おしえてください。
基本情報の問題なんですけど、ずっとわからなくて次に進めません。
回答や参考書を見てもわからないです。
どなたかわかりやすく教えてください!
--------------------------------------------------------------------------------
次のような3バイトで数値±a×16^nを表現する浮動小数点がある。

     |    指数部7ビット  |       仮数部16ビット     |
 ┌─┐─────────┐──────────────┐
 │   |        n         |             a            |
 └―┘―――──――――┘―――───────――――┘
  ↑         ↑     ▲
ビット0  数値全体の符号   小数点の位置
      (0:正、1:負)

・仮数部の数値は、絶対値で表す。 0<=a<1。
・指数部のnは、指数部が16^nであることを表す。
・指数部のnの負数は、2の補数で表す。

この形式で表現できる負の数の最大値(0に最も近い値)はどれか。


ア 000001   イ 00FFFF   ウ 410001   エ C00001   オ F00FF1
---------------------------------------------------------------------------------
答えは「エ」なんです。でも、やり方がわかりません。
自分で問題を解いた時は、
「この形式で表現できる負の数の最大値(0に最も近い値)はどれか。」
と書いてあるので1 111 1111 1111 1111 1111 1111(2)にしてFFFFFF(16)って
答えがなったんですけど、解答欄にないんです。
5246:02/09/13 22:54
>>47
ああそれだ!
5316:02/09/13 22:55
>>38
え.....そんな....。
>>39
あ、ミスです。i〜、j〜です。
>>40
重箱??
>>41
あ、そうでした。
a=xx[i][j];
とかにしないと。

>>42
それでも2次元、3次元つくれるんですね。
(知らなかった)
xxのインデックスも変わる可能性があるので、一応、
動的に割り当てています。

とりあえずありがとうです。
今日は終電近いので帰ります。
(連休も無しだな......とほほ。)
明日またレスします。
>>51
あちらこちらに貼るなよ。
荒らすなら例のスレだけにしろよ。
5546:02/09/13 22:57
>>48
多木構造なので子供がイパーイあるのよ
子供ポインタの配列でしょ
>>55
ああすまん、木構造って二分木かと思った。
でも、foo **pChild;じゃなくてstruct foo **pChild;にしないとだめじゃない?
5742:02/09/13 23:00
>>47はキャストが無かったので、一応完全版

#define JSIZE 128
#define KSIZE 40

main () {
  int (*xxx)[JSIZE][KSIZE];
  int (*xx)[JSIZE * KSIZE];
  int t;
  int xxx_size;
  //
  t = 3;
  // xxx
  xxx_size = sizeof (int) * t * JSIZE * KSIZE;
  xxx = (int (*)[JSIZE][KSIZE]) malloc (xxx_size);
  // xx
  xx = (int (*)[JSIZE * KSIZE]) xxx; // 内容を一致させるのであれば、ポインタの置き換えで終わり
  //
  free (xxx);
}
5856:02/09/13 23:00
つーか、二分木なら子供へのポインタが二つあるだろうが(鬱
5946:02/09/13 23:00
>>56
structいる?
省略できるんじゃない?
>>59
C++ならね。
6146:02/09/13 23:03
>>60
漏れはVC++使ってる罠
>>61
拡張子を.cppじゃなくて.cにしてコンパイル。
いや、その子供達のリストを保存する領域作らないといけないでしょと。
6442:02/09/13 23:05
いちおうまとめとこう。
>>16
>>57を使うと、常に
(xxx[i][j][k] == xx[i][m])   (ただし m = j * KSIZE + k)
が成り立っている状況を作れる。多次元配列の要素の連続性を利用している

。。。というつもりで作ったけど、バグってたらごめん
6546:02/09/13 23:06
>>62
そこまでCにこだわってるわけじゃないので・・・
このスレとしては不可?
6646:02/09/13 23:09
>>63
うん、だから
AddChild()DelChild()GoToChild()とか
実装するとポインタとメモリの動的確保の練習になるでしょ
>>前スレ955
1000でマジレスカコイイ!
6846:02/09/13 23:16
それでfoo構造体にpChildの数とか必要だけど内緒(w
>>68
配列の末尾にNULLはどう?
7046:02/09/13 23:20
>>69
*とunsigned intはサイズ同じだからお好きなほうを
>>67
そうそう、最初コピペかと思って読んでみたら
>>70
これまた処理系依存とかじゃないの?
7346:02/09/13 23:23
子供辿るには再帰呼び出しが必要になるからその練習にもなるぽ
74デフォルトの名無しさん:02/09/13 23:25
可変この引数を持たせる関数は

__cdecl

じゃないとだめらしいのですが、この関数はどうやって引数の数を調べるのでしょうか?
7546:02/09/13 23:25
>>72
つーかポインタのsizeof(p)ってunsigned intしかないと認識してますが
>>74
引数を右からとか左からとか
VCならヘルプみそ載ってたよ
んなこたぁない
7874:02/09/13 23:30
>>76
ちがーう。アセンブラレベルでの話だ
呼び出し元でpush/popするか呼び出し先でするかの差?
_cdeclと_pascalって。
8046:02/09/13 23:31
>>77
そうでふか
winかunix位でしか組んだこと無いのでスマソ
8176:02/09/13 23:37
>>78
アセンブラならフォーマット調べてスタックから取ってくるだけじゃない?
Cでやるより楽なはずだけど
>>80
大抵の環境でintと同じサイズになると言うのは真だけど、
標準で規定されているわけじゃないから、実装依存と言わざるを得ないってところ。
8374:02/09/13 23:42
>>76
本読んでたら 79が言うように _cdcelは呼び出し元で引数をPUSH/POPするんだって。
呼び出された側ではドンだけ引数が渡されるかわからないから。
でもそのままだとどっちにしろドンだけ引数が渡されたかわからない気がするのは僕だけ?
だから、引数の数を渡したりターミネータを渡したりprintfのようにフォーマットで指定したり工夫がある
8574:02/09/13 23:46
>>84
なるほど。printfって引数の数が合ってないときは動作保証なかったしね。
納得っす。ありがとー。
tmpfileの実装方法がはげしくわからん。
どうやったらクローズ時にファイルが消えるようにできるんだYO!

独り言スマソ
1クローズしてから消す
2作ったときからインデックスと分離しておく
3OSの機能
>>86
remove()でだめぽ?
>>86
>tmpfile
とりあえずこんな妙な英単語はない。

最近の若いもんはテンポラリも知らんのか・・・。
>>87
悪い、3以外全然わからん(煽りじゃなくてマジで)

>>88
fcloseも改造すればいいのかな???
fclose時に削除ルーチンを呼ぶ方法がわからないのよ。
>>89
Cの標準関数にあるはずだけど・・・
>>89
省略形くらい大目に見てやってよ
通じるんだから
93デフォルトの名無しさん:02/09/13 23:55
NEG命令ってなにに使うのでしょうか。
>>90
tmpfileで作成したディスクリプタを判別する方法があるんだろ
#ライブラリ内部で
で、fclose時に自動的に消している、と。
9688:02/09/13 23:58
>>90
改造とかじゃなくて(できんのか?
オープン->何か処理->クローズ->再オープン->remove()->クローズ
で駄目?
>>95
ああやっぱりfcloseにしかけがあるんだね。ありがとう。
プログラム終了時に削除ってのはatexitでどうにかなるかな。
98デフォルトの名無しさん:02/09/13 23:59
先輩からC言語なら大抵どんなことでもできると教えてもらいました。
で、早速C言語でXBOXを作りたいのですが、C言語はドコで習えばいいのですか?
>>96
ごめんなさい、実装方法なんて書いたけれど、
本当はtmpfileの仕組みが知りたかっただけなんです。
>>98
NOVA行きな!
101やった〜:02/09/14 00:02
0時丁度に100ゲトー
>>100
2011/11/11 11:11に111取ることを忘れるな
10342:02/09/14 00:06
>>16
聞きたいんだけど(寝てるだろうけど)、>>29の、
int ***new_matrix3d( int time, int range, int sector );
↑これで得られる、ツリー状にポインティング(?)された配列の集合、
この構造がどうしても必要なの?(ちなみに、この関数はエラーに弱い)

というのも、最初は多次元配列であれば何でもいいのかと思ってたんだけど、
このnew_matrix3dという関数は、どうやら16の作ったものじゃなさそうだから、
これと互換性のある構造を使わなければいけないのかな、と思って。

だとすれば、>>57は全く見当違いだから、忘れてほしいw
(つづく)
>>98
学校or本とかネットで独学
というかここでそんな質問をしている時点で
才能はないと思われているかもしれない…
がんがれ
>>98
猫でも見とき
106デフォルトの名無しさん:02/09/14 00:13
>>42
忘れて済んだら警察いらねーんだよ。
>>106
殺人犯して忘れて欲しいってアリ?
>>98
糞箱の中身が実質WinNTだと理解した上で言ってるのか?
109デフォルトの名無しさん:02/09/14 00:18
糞箱って言うなゴルァ
110デフォルトの名無しさん:02/09/14 00:23
ループ付きの迷路の解答で道が1つの所を消していくよね
最短距離割り出すには距離保持しつつ再帰呼び出しで辿るしかないですか?
11142:02/09/14 00:25
(つづき)
>>16
で、>>26のコードにはいろいろ疑問な点があるってのは既出のとおりだけど、
一番本質的な問題は、
  xxx[i][j][k] と xx[i][m] の要素どうしの対応関係
が書かれていない、ということ。普通に考えれば、
  m = j * 40 + k, i = m / 40, k = m % 40
または
  m = k * 128 + j, k = m / 128, i = m % 128
だと思うんだけど、
  0≦m<6400 に対して
  0≦j*40+k (または k*128+j)<5120
という、致命的なサイズの不一致!!!これが何を意味しているのかが
わからなければ、何もアドバイスできないよw
まあがんばってくれ
(おわり)
>道が1つの所を消していくよね
「行き止まりのところを消す」でしょ。

距離保持しつつ〜はあってると思う。

>>111
というか、一番外で6400回も回すなといいたい。
意味無い事してる。
113112:02/09/14 01:34
いや、あの、111の方に言っているのではないですよ。
11442:02/09/14 01:39
>>113
いやわかってるよw
彼はね、パフォーマンス云々以前の水準だと思うから、
とりあえず判然としないロジックから正す方向で。。と。
まじめそうだし礼儀あるから見込みはあると思われ
>>99
tmpfile()内で作成したファイルを消す関数を
atexit()で登録してるんじゃないかな?
と思ってみるテスト。
116デフォルトの名無しさん:02/09/14 03:07
糞コードメンテ中。

グローバル変数 const char foo[] = "hogeratta"; があるとき、
fooのメモリ領域に(適当にキャスト使って)書き込むのって、規格上safe
でしたっけ?? const はとりたくないんです。C++のmutableなメンバ
変数のような役割なので。

117デフォルトの名無しさん:02/09/14 03:24
>>116
const char buf[] = "ABC";
int main()
{
int n = (int)buf;
char* pbuf = (char*)n;
cout << buf << endl;
strcpy(pbuf, "abc");
cout << buf << endl;
return 0;
}

コンパイルは通ったけど・・・
118デフォルトの名無しさん:02/09/14 03:31
>>117
うん。そりゃコンパイルは通せるよ。そうではなく、どんな処理系でも書き込み可能な位置に
"hogeratta"が置かれる事が保証されるか、をしりたかった。

あとできればC++ではなくANSI Cの規格がしりたいです。
119デフォルトの名無しさん:02/09/14 03:35
プログラムうpしたいんだけどあげるとこのリンクおしえて
スレ違いとか言わないで・・・
safeでは。
配列を確保してから書きこみしているのだから。
char *p = "hogeratta"; ならマズイ。
121 :02/09/14 03:35
>>86
OSに依る。
unix系なら、オープンされているファイルでも削除できるので、
オープンした直後に削除する。この場合の削除は、ディレクトリ
エントリからファイル名を削除するだけで、ファイルがオープン
されている間は、ファイルの実体は存在したままとなる。ファイル
への参照がすべてクローズされると、ファイルの実体が削除される。
windows系なら、ファイルをオープンする際に、delete-on-closeが
指定できる。
122デフォルトの名無しさん:02/09/14 03:35
123120:02/09/14 03:36
あ。const か。スマ。
124デフォルトの名無しさん:02/09/14 03:48
>>116
規格はもっていないが、「ANSI C言語辞典」によると
"非volatileのconstオブジェクトを読み込み専用領域に置く処理系もある"
そうなのでunsafeかもね。volatileつけとけ。
125 :02/09/14 03:52
>>118
ISO/IEC 9899:1999 によれば、変更できることは要求されていない。

"/tmp/fileXXXXXX"
(char []){"/tmp/fileXXXXXX"}
(const char []){"/tmp/fileXXXXXX"}

The first always has static storage duration and has type array of char,
but need not be modifiable; the last two hav e automatic storage duration
when they occur within the body of a function, and the first of these two
is modifiable.

現実的には、コンパイラオプションでread-onlyでない場所に置くよう
指定できる場合が多いが。
const で volatile って矛盾してるような......
127質問者:02/09/14 03:54
>>125
ありがとうございました
>>117
なぜ一度intにcastしているのかを小1時間(略)
129119:02/09/14 03:58
>>122
Please describe your Registration Purpose in a more comprehensive manner
とか出て先に進めないんですが(英語嫌
それとpublic domainがフリーですか?
>>119
何がしたいの?詳しく書いてみ。

131119:02/09/14 04:00
>>130
多分木構造C++(win)で作ったからフリーでうpしたいのですが
sourceforgeはちゃんとしたオープンソースのソフトウェアを多人数で開発するための
もろもろを貸してくれる場所。

そういう習作を晒したいならgeocitiesでも借りれ。

133119:02/09/14 04:03
>>132
はぁい
134120:02/09/14 04:04
[#5]
If an attempt is made to modify an object defined with
a const-qualified type through use of an lvalue with non-
const-qualified type, the behavior is undefined. If an
attempt is made to refer to an object defined with a
volatile-qualified type through use of an lvalue with non-
volatile-qualified type, the behavior is undefined.104)

あ。おそかったか。まあいいや。C99ね。
135119:02/09/14 04:06
>>132
と思ったけどHP作るんじゃなくてUp版みたいのないですか?
136119:02/09/14 04:07
Up版->Up板(鬱
yahooのブリーフケースでも借りとけば?
>>134
なるほど
C99でもダメってことですね。
さんくす。
139 :02/09/14 04:12
>>126
constは左辺値になれないだけであるので、
別に矛盾はしていないと思われ。
で、volatileならいいのか?
>>138
(´-`).。oO(ISO/IEC 9899:1999 == C99 なわけだが……)
142119:02/09/14 04:19
多分木構造
http://proxy.ymdb.yahoofs.jp/users/e0437b1f/bc/Projects/TreeObj.lzh.lzh?bcGOq09AE5WRJ50Z
これでいいのかな?
見て見てぇ
>>141
ガーン。無知です。ありがとう。
144143:02/09/14 04:20
って、:1999 って書いてあるわな(鬱
吊ってきます。
145119:02/09/14 04:21
>>142
ゴミが入ってたTreeObj.cppは捨ててね
Cスレなんだが…
>142
403 forbidden. 取れない。

148119:02/09/14 04:32
>>146
いや46なんですがオペレータオーバーロードしたほうが見やすいので
スレ違いですが・・・
main()の正規書式だと見ずらいでしょ
それに参照便利だし・・・
>>148
だからlzh取得できねって。
150119:02/09/14 04:35
>>148
おまけにテンプレートもあるし
これは頑張ってCにした方がいいですか?
151119:02/09/14 04:37
>>149
件の共有フォルダ開いてブラウザのアドレスをコピペするんですか?
152119:02/09/14 04:39
153119:02/09/14 04:41
>>152
あれだめぽ
ごめん
GlobalFree(this); ってのは…?
>>150
中途半端すぎて笑える。何故
TreeObj<T> **pChild;
なんだ? std::vectorを使用しない理由は?
std::mapが木構造を使っているのは有名な話だと思っていたんだが。
上まあスレ違いなわけだが。苦笑。
157155:02/09/14 04:47
・メンバ変数はコンストラクタの初期化リストで初期化しましょうね
・コピーコンストラクタを、実装するかは別にして書きましょうね
・operator=の戻り、おかしいですよ?
・addChildの引数は値渡しでいいんですか?

以下延々と続く…

ちなみに delete this は気をつければ危険ではないよ。
object suicide という。
159119:02/09/14 04:51
>>154
TreeObj.cppは捨てて下さい
>>155
>>156
VC5.0だとvectorは自己参照ポインタ使うと引っかかるんですよ
メモリの動的確保も練習したいし
んでmap使うと習作の意味がなくなるんで
160155:02/09/14 04:51
>>159
STLPort入れろって
161119:02/09/14 04:57
>>157
はい参照渡しでないと大量コピーが起こります
=の戻りおかしいですか?
>>154
>GlobalFree(this); ってのは…?
そういえば MS 社は WinAPI::waveOut*** のサンプルで
HeapAlloc() 使ってるけどよそのサイトでは malloc で済ませてる
ところもあるんだけど、malloc じゃダメなのかな。
163155:02/09/14 05:03
一般的には TreeObj<T>& operator=(ほげ); で定義して
return (*this); ね。

多分Effective C++かMore Effective C++に載ってる。
164155:02/09/14 05:06
夜が明けるのでスレ違いはこのへんでやめます。ゴメンナサイ。
// 子供から先に解放していく
while(ChildNum) (*pChild)->del();

これ大丈夫なん?
166119:02/09/14 05:10
>>163
ほげはどう使うんですか?
漏れには無変化に思えてしまうのですが・・・
=(ほげ){Obj=ほげ;return(*this);}
ですか?
167162:02/09/14 05:12
ねぇ誰か教えてよ
168119:02/09/14 05:13
>>165
それは大丈夫なはず(弱気
子供が解放されると親のChildNumが減ってくから
常に先頭の子供を解放してやればいいはず
169155:02/09/14 05:15
最後ね。もしくは別スレに移動してくれ。
return (*this); しないと

TreeObj<std::string> x, y;
x = y = "foo";

の2行目がコンパイルできないだろう?
170119:02/09/14 05:21
>>169
ああ、そうですね勉強になりました

聞きたいことはまだありますがやめときます
スレ違いだけど燃料になりましたか?
卑屈になんなよ(ワラ
個人的には全部ディープコピーってあたりが漢だねぇって感じだヨ
楽しいときには邪魔がはいるものだねぇ
173119:02/09/14 05:33
>>172
C++スレ行ってしばいてくれるんなら行きますが(自爆
行きますか?
相手が教えてクンだと盛りあがりに欠けるねぇ・・・
燃料になんないよ
>174
NULL紛争でも起こしたいのか?(藁
177119:02/09/14 05:45
隠蔽とかクラスとか無理矢理実装できるけどそれは置いといて
Cの標準的な文法で比較的分かりにくいのって
ポインタと再帰呼び出しくらいですよね
> 再帰呼び出し
文法関係ない
179119:02/09/14 05:52
>>178
書き方誤り
文法->手法
これならどう?
>>119
わかりにくいならsignal()の定義はなかなかのものだと思う
181119:02/09/14 05:58
>>180
WinProcもsignalも似たようなもんじゃない
漏れはDOS時代にint86使ってたけど確かに割り込みは敷居高いかも
182119:02/09/14 05:59
>>181
WinProcつーかThreadProc
>>181
void (*signal(int sig,void (*func)(int)))(int);
まあ似たようなもんですが
WinProcなら LRESULT CALLBACK (*WinProc)(HWND ...); ですかね
184119:02/09/14 06:13
int86に比べてThreadのEvent定義って若干使いやすくなったよーな
これも進化ですかね
燃料の意味を考えよう
おならぷー
187119:02/09/14 08:17
>>185
うんだから必死だよ(w
多分木言われたとこ直してみたり(まぁ、相変わらずmemcpy()使ってないが
Cでのクラス実装で突っ走ったこと逝ったりすればいいのかな
188119:02/09/14 08:57
あ、子供ポインタリストリークしてた
逝ってきます
189デフォルトの名無しさん:02/09/14 09:22
インクリメントとデクリメントって
190デフォルトの名無しさん:02/09/14 09:25
大分出身なの知ってました?
191デフォルトの名無しさん:02/09/14 10:18
>>189
++,--

>>190
なんとなく言動で気づいていました。
セミコロンってどうよ?
>>192
そうか、もう秋なんだね。
>>193
そっちか 風流だなぁ
おれはセミの匂いのするコロンかと思ったよ
195155:02/09/14 12:20
196 ◆ZMVdytmo :02/09/14 12:27
int a = 123;ってなってるのをchar s[10]に文字列123としていれる方法を教えてください。
voidには教えたくない
198 ◆ZMVdytmo :02/09/14 12:35
>>197
そこをなんとか教えてください
>>196
だからぁ〜
aを10で割ると余りはどうなるよ?アレになるっしょ?そんな感じで...
200デフォルトの名無しさん:02/09/14 12:42
>>199
なるほど!
ありがとうございました
201119:02/09/14 12:42
コンパイルしないで直接書いてるんでバグったらごめん
for文の継続条件ちょっと違うかも。でもこんなかんじだとおもわれ
char *hoge(int a)
{
  static char str[256];
  int i,j,k;
  //桁拾い
  for(i=0,j=a;j>0;i++,j/=10);
  //代入
  for(j=0,k=a;j<i;j++,k/=10) str[j]=k%10+'0';
  return(str);
}
202119:02/09/14 12:44
>>201
あれ桁拾いは要らなかったけ?
203155:02/09/14 12:46
>>201
なんで snprintf(s, 10, "%d", i); じゃいけないんだ?
204119:02/09/14 12:50
>>203
実装方法知ってると改造できるでしょ
例えば、printf()でQWORDを表示したり・・・

つーかすいませんsnprintf()知りませんでした
sprintfでいいじゃん・・・>>203
>>205
DQN
207201:02/09/14 13:01
ぐはぁ、最後に'\0'入れ忘れますた
逝ってきます
>>206
オーバーフロウするかどうか判断できない方がDQN
209201:02/09/14 13:05
それにa==0の時何も表示されなさそう
もっかい逝ってきます
210201:02/09/14 13:07
>>208
オバーフローしないでしょ下げっぱなしなんだから
でもa<0の時は・・・
またまた逝ってきます
>>208
考え方がC-dog
終ってる

>>210
オーバーフロウってバッファオーバーフロウのことだよ。
213155:02/09/14 13:11
>>208
LP32を仮定しろってことですか?
snprintf使ったら宣言のない関数の呼び出しと言われた上に、リンクエラーが発生しますた。
215155:02/09/14 13:11
>>214
適宜読みかえてくださいな。僕はVC++は知らない。

216201:02/09/14 13:13
>>212
int型で255桁は逝かないと思うが10桁は逝くね
>>216
255桁も10桁も逝くか逝かないかはintのビット数によるだろ。
218155:02/09/14 13:15
というわけで、208には賛同しかねるってことで。

219208:02/09/14 13:17
標準関数でできることは標準関数でやればいいと言っているだけなんだけど・・・
C99?しらん
220201:02/09/14 13:18
>>217
現状ではintがそんなに大きいの無いと思われ
スパコンでだって10進256桁のintなんてメモリがひどいことになるよぅ
>>220
重箱の隅をつついてみただけだ。気にしないでくれ。
222155:02/09/14 13:19
>>219,220
普段高級言語しか使わない身では考え方についていけない。
でかけます。さよならw
223201:02/09/14 13:20
>>220
つーか10進256桁のintって楽しすぎ
biosからvramまで1つの転送で終わり?
itoaって標準関数だと思っていて、Linux+gccで使えなくて初めて標準関数じゃないと知った。
馬鹿だった・・・・
255桁のintはかんがえられんが、10桁ゆかないintなら考えられるな。
226デフォルトの名無しさん:02/09/14 14:38
fp = fopen ("file", "r");// or fp = fopen ("file", "rb");
fseek (fp, 0, SEEK_END);
l = ftell (fp);
このコードってUNIX系でしか正しく動かないようなのですが
標準でファイルサイズを取得する方法はあるんですか?
227デフォルトの名無しさん:02/09/14 14:41
>>226
Windowsでも正しく動くけど・・・
>>227
そうなんですか。
確かfseekにSEEK_ENDを指定したときはテキストモードでオープン
しないと動作は保証されないようなことを読んだことがあったので。
UNIXだとバイナリモードもテキストモードも同じなので"rb"でオープン
しても問題ないけど両方のモードが違ったときはまずいのかと思ってました。
>>228
じゃあバイナリモードで開けばいいでしょ・・・
>>229
いや、それだとだめってことなんですけど。
バイナリファイルの場合に。
whileとfgetcでファイルポインタを末尾までもってゆく。
>>230
「バイナリモードではfseekが正しく機能しない」?
とりあえず、、、

はつみみです

てか、困らない?
自分としては動作を保証するモードが逆だと思うんですけどね。
>>232
バイナリモードで「SEEK_ENDを指定した」場合です。
つか、>>228の思い込みだろ。あるいは、モードを逆に憶えているか

> 確かfseekにSEEK_ENDを指定したときはテキストモードでオープン
> しないと動作は保証されないようなことを読んだことがあったので。
とりあえず >>228 はうろおぼえみたいだから、
SEEK_END ともう一つ別の方法でファイルサイズをとってみて、
食い違うっていう例を、自分のハードディスクの中でみつけてから
逝ってくれ
http://www.bohyoh.com/CandCPP/C/Library/fseek.html
これはいま検索したんですが今までもおかしいと思っていたので
複数あたっていました。
>>237
この記述も俄かには信じがたいけど、「サポートしなくてもいい」って意味だよね
じゃあ、特定のライブラリの仕様を確認すればいいんじゃないの?

少なくとも、↓ここには変なことは書いてない
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fseek.asp
23916:02/09/14 15:19
みなさん沢山のレスをどうもありがとうございます。
まずはレスの中身を理解してからレスします。

(休日出勤です。すこし寝過ぎました。)
>>238
書籍でも「C言語によるプログラミング スーパーレファレンス版」と
あと一冊名前を忘れてしまった本にも載ってました。
いまwindowsでgccでやってみたら問題なかったです。
以前 linux で libc の fopen のソースを見たら確かにモードを区別
していなかったのでそっちでは安心して使っていたんですが。
>>240
もしサポートしてなければ、たぶんエラーコードを返したりすると思うから、
それをはじけば問題ないんじゃない。まあ、まったく出鱈目な結果になるという
恐れもあるが。。
242デフォルトの名無しさん:02/09/14 15:46
offsetof についての質問なのですが、

struct foo {
int member;
} foo;

とあるのをファイルに出力するときに、

foo f;
ptr = &f;
len = offsetof(f, member) + sizeof(int);

とやっているのがあるのですが、
これは、やっぱり構造体の padding を意識しているのでしょうか?(C FAQより)
とすると、メンバーを

struct foo {
int member;
long member2;
} foo;

と追加したときには、

ptr = &f;
len = offsetof(f, member) + sizeof(int) + sizeof(long);

とするのが正しいのでしょうか? それとも、

ptr = &f;
len = sizeof(struct foo);

とするのが正しいのでしょうか?
243デフォルトの名無しさん:02/09/14 15:50
>>242
つまり、一番最後尾にあるかもしれない詰め物を、避けているってわけ?
だとすれば、member2が最後の要素なんだから、

ptr = &f;
len = offsetof(f, member2) + sizeof(f.member2);

こうじゃないの?最後の要素の末尾=全体の末尾
絵で描くと、
|member1|???|member2|???| (= f)
これを、ファイルの中では
|member1|???|member2|
これだけにしたいのでは?
246explosion.cpp:02/09/14 15:56
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Explosion.h"

#include "global.h"
#include "RenderTex.h"
#include "debug.h"
#include "RenderSprite3.h"
#include "d3dutil.h"
#include "sndset.h"
#include "sndid.h"
#include "TexSet.h"
#include "particle.h"
#include "sub.h"

#include "debug.h"
USE_TR;

//---------------------------------------------------------------------------
#pragma package(smart_init)
247explosion.cpp:02/09/14 15:57
//---------------------------------------------------------------------------
// 爆発・抽象基本クラス
//---------------------------------------------------------------------------

// 爆発クラスへのCasterを返す (DeleteClass用)
//static
const LAppCaster<CExplosion>& CExplosion::Caster()
{ SV
static LAppCaster<CExplosion> c;
return c;
}

// cter, dter
CExplosion::CExplosion()
:CAppObj(g->appMan)
{ SV
}

CExplosion::~CExplosion()
{ SV
}
248explosion.cpp:02/09/14 15:58
//---------------------------------------------------------------------------
// 普通の爆発
//---------------------------------------------------------------------------

static const intTEX_NUM = 9, TEX_NX=999;
static const CPointTEX_POS(0, 0);
static const CSizeTEX_SIZE(54, 54);
static const floatANIM_TIME = FPS30*4.0f;

CNormalExplosion::CNormalExplosion(const CVector3& pos, float size)
:CExplosion(),
mTime(0.0f), mIndex(0)
{ SV
mSpr.pos = g->camera->Proj2D(pos, 640.0f, 480.0f,
P2D_CENTER|P2D_CENTER, TEX_SIZE.cx*size, TEX_SIZE.cy*size);
mSpr.scale = CVector2(size, size);
mSpr.tex = g->texBomb;
mSpr.rect = CRect(TEX_POS, TEX_SIZE);
g->renderSprite->Add(&mSpr);
>>246 C++はスレ違い。それ以前に、長いソースはうpしろヴォケ
250explosion.cpp:02/09/14 15:59
for (int i=0; i<20; i++)
{
float cr, cg, cb;
// 一定の確率で、真っ白の火花
if ( g->rand(100) < 10 )
cr = cg = cb = 1.0f;
else // それ以外は適当な色
cr=frand(0.7f,1.0f), cg=frand(0.7f,1.0f), cb=frand(0.0f,1.0f);

CParticle::New(pos,
1.5f, 0.4f,
CVector3(-15.0f, -15.0f, -15.0f), CVector3(+15.0f, 15.0f, 15.0f),
CVector3(1.0f, 1.0f, 1.0f),
CParticle::Tex(CParticle::WHITE), 0.5f,
cr, cg, cb
);
}

g->sysSnd->Play(SE_HIT01); // 爆発音
}
>244-245
あーなるほど。最後の詰め物だけを除いているわけですか。
ふむふむ。そうかそうか。

ところで、こういうコーディングって一般的なんでしょうか?

いや、今回初めて見たんですけども、
最後の詰め物_だけ_を取ってる、ということは、
メンバーが増えれば増えるほどその意義は小さくなりますよね?

んー、やってることは分かったけど、
意図しているところが全然分からんちーん。

他の構造体では sizeof(struct bar) とかやってるし。
まあ、構造体をそのままの形で保存するって事自体、
あまりよくないと思うけどね。面倒でも適切なバイト列に変換する
手続きを書いた方がいいかと
確かにそうですよね。
ただ、既存のものと整合性を取らないといけないので、ちょと大変。
もうちょっと考えてみます。ありがとうございました。
254デフォルトの名無しさん:02/09/14 17:39
みなさんは数値を一定の範囲でループさせたいときってどうしてますか?
私は、一回のマイナス方向の変化量が、変化量の最大を超えないっていう前提で

a = (a + max) % max;

ってしているのですが、もっといい方法はありますか?
>>254 減らすときは確かにそうする
これって動くか?
a = (0 <= a) ? a % max : max-1 - ((-a) % max);
あ、なんか勘違いしてる
a=(a<min ? a+max:a);
は恥ですか?
259258:02/09/14 17:52
割り算使ってないから自分としてはまぁまぁかなと
260256:02/09/14 17:55
>>256が動きますた。これは変化量に制限がないから、安全といえば安全かな。
261デフォルトの名無しさん:02/09/14 17:56
DLLを使ってデータ圧縮したいんですけどやり方がわかりません
教えてください
googleでは調べたんですけどね…
262256:02/09/14 17:56
いや、まてよ?何か間違っているような気がする

質問です

以下において

x = 式(1) || 式(2);

式(1)または式(2)の結果が0以外であれば他方が評価されないのは
処理系依存でしょうか
264担当TSJ/霧生:02/09/14 18:00
★誰でも出来る!!お小遣い稼ぎ★
■PC初心者でも出来ます■
   ■ 仕事は、宣伝のみ!■
     PCでのメール・掲示板の書き込みetc....
     あなたしだいで50万以上も可能!
     即日スタート可能!
       収益100%ひとり占め!

      まずはメールでお申し込み下さい。
    
         [email protected] 担当TSJ/霧生
>>263
その話、昨日か一昨日どっかで出たばっかりだ。
>>263
左から右だけど処理系依存ではないと思う(たしかANSI
ショートサーキット
>>263
探してきてやったぞ。俺っていい奴だな。

http://pc3.2ch.net/test/read.cgi/tech/1031340950/n637-660
x=でしたね
270256:02/09/14 18:07
>>254
わかった、こうこう:
a = (0 <= a) ? a % max : max - 1 - ((-a - 1) % max);

実行例:(max=10の場合)
14
==> 4
1024
==> 4
-1
==> 9
-10002
==> 8
そーいえばifネストしないとまともに動かないのはVCだけ?
272256:02/09/14 18:12
a = (0 <= a) ? a % max : max - 1 + ((a + 1) % max);
>>270はこっちのほうがキレイかな
273256:02/09/14 18:14
a = (0 <= a) ? a % max : max - 1 + (a + 1) % max;
カッコいらないや
274デフォルトの名無しさん:02/09/14 18:47
>>263
A 申し訳ございません。文化についてはあまり知識がありません。
275デフォルトの名無しさん:02/09/14 18:51
>>271
>>39
A. そういう言葉は好きではありません。アイフルのサイトやサービスについてご質問はございますか?
276254:02/09/14 19:01
みなさんレスありがとう。

>>256
マイナスの値に対して % 使ったときの結果って処理系依存じゃなかったですっけ?
私の勘違いかな?

>>258
割り算よりも条件分岐によるパイプラインの乱れの方が
実行時コストが大きいような気がするのは
私だけでしょうか?
>>276
> 私だけでしょうか?
私も同感です。ハイ。
278277:02/09/14 19:10
maxが 2の累乗で表せる数なら
a &= max - 1;
がいいかもしれないね。
勘違いしてたらごめん。
>>276
そこまで気にするならCは使うな。
>>279
ハア?
>>280
アセンブラでも使えよ。
282254:02/09/14 19:17
>>277
ですよねー

>>278
たしかに2の累乗ならビット演算の方が速そうですね。

>>279
その昔VB厨だった頃、(別の問題で)「そこまで気にするならVB使うな」
と言われて C 系言語に乗り換えたのですが…。
私はこのまま汗使いになるしかないのでしょうか?
関数も呼び出し時のオーバーヘッドが気になるから使わないとか言い出すんだろうか。
284256:02/09/14 19:25
>>276
> マイナスの値に対して % 使ったときの結果って処理系依存じゃ
おうそりゃ初耳だな。んじゃ>>270
>>283
イソライソカソスウ
>>282
>私はこのまま汗使いになるしかないのでしょうか?
なれ。
>>281
ハア?
実行速度を気にするヤシはCを使うなと?
画像操作とか、データ圧縮とかのソースなんかも
全部アセンブリ言語で書かれていると?
すごい世界だな。

>>283
速度的に最適化すべきところはCでも当然気にして作るし、
気にせんところでは関数呼び出しのコストも気にせん。

まあ初心者スレで言っても無意味か。
>>287
必 死 だ な ( 藁
287はインラインアセンブラとかしらんのだろうか。
>>285
Cにはインラインないから・・・
オーバーヘッドが気になると言うなら、
やっぱ、すべてmain関数に同じような処理でもすべて書いて、
main関数は数万行突破となるのかな?(w

利点を欠点と考えるのは間違ってると思いま〜す。
最適化は実行速度が気になってから初めて考慮に入れてください。
292晒しage:02/09/14 19:37
>>289
287はインラインアセンブラとかしらんのだろうか。
 (プププッ
最適化はコンパイラにまかせておけ
>>289
> 287はインラインアセンブラとかしらんのだろうか。
(ぷっ!
>>290
c99とか誰かが書く
多分コストがかかるから嫌だと言っている人はネタだと思うんだけど、
そんなに気になるものなの?
インラインアセンブラは別にいいじゃん。使いたきゃ
298287:02/09/14 19:49
>>289
知ってますがそれが何か? (プ
>>296
だから問題はそのコストをどこにかけるかってことだろ?
300デフォルトの名無しさん:02/09/14 20:04
すみません、質問させてください。

a = (char *)malloc(30);
b = (char *)malloc(30);

strcpy(a, "abcde");
strcpy(b, "ABCDE");

a = b;

と、こうした場合、最初のaの値のメモリは自動開放になるのでしょうか?
リンク切れの状態でメモリに存在するんでしょうか?
> リンク切れの状態でメモリに存在するんでしょうか?
の方が正しいです。

>>300
C に「自動開放」なんて期待するなよ。
303デフォルトの名無しさん:02/09/14 20:11
>>301-302
やっぱり、そのままメモリに残るんですか・・・。
ありがとうございました。
>>300
それで解放されるんならfreeは要らんな・・
少し上で処理速度うんぬんでアセンブラ使えだのインラインアセンブラがあるだのといっているが、
それが必要になるほどきちんとしたアルゴリズムを採用していてそれをきちんとソースに落とせているレベルの
人間の会話とは思えないんだが。
306mukku:02/09/14 20:28
ほとんど初心者なんですが MS-DOSからワードパッドを呼び出すのは
どうやったらいいんでしょう(爆)
notepadしか使わないもんで ほんとに初歩的な質問で気を悪くされたら
ごめんなさい
cd C:\Program Files\Windows NT\Accessories
wordpad
308デフォルトの名無しさん:02/09/14 20:38
>>306
まあ好みだろ。自分でわかりやすけりゃそれでいい。
309デフォルトの名無しさん:02/09/14 20:43
>>306 , 308
このつながりがさっぱりわからんのだが?
>>306 C言語でか。それって難しくないか?
>>306 >>308
2chのスクリプトの混乱か?

main () {
  int ret = system ("\"C:\\Program Files\\Accessories\\WORDPAD.EXE\"");
  printf ("ret = %d\n", ret);
}
>>306
ShellExecute かな
そうでもないよ
system ("ワードパッド");
C:\WINDOWS>write <リターン>

つーかネタにマジレスはイタイ。
俺、思うんだけどよ。
ネタ披露するなら、面白くなくっちゃダメだと思う訳よ。
で、笑えねーし、ジョークなのかマジなのかわからねーようなネタは、
ただの糞レスだと思う訳よ。
マジだと思って、ちょっとレス入れたら、「ネタにマジレスするな」とか言われると、
「マジレスされるようなネタかましてんじゃねーよ!」って思う訳よ。

ネタにマジレスするのが痛いんじゃなく、
マジレスされるようなネタが痛いと思う訳よ。
質問です。
int *hoge;
のように宣言すると、これはintへのポインタ型の変数hogeというわけですよね?
では、これを
int *hoge="チンカス";
と書くと、これは配列になりますよね?なぜですか?
しかも、hoge[2]のように変数hogeを使えますよね。
ポインタなのに、なんで配列と同等に扱えるのですか?
>>315
これしきのネタを見抜けないお前の方がイタイ。
でも半分同情する。正直でいい人なんだろうなと。
>>316
ワーミングが出たYO?
_a.c: In function `main':
_a.c:3: warning: initialization from incompatible pointer type
>>317
>>316はネタなのかマジなのか教えてください。
>>319
マジです。
マジレスキボンヌ!
321317=316:02/09/14 21:26
>>316はマジッス。答えてやってくらはい。
322317:02/09/14 21:32
> ポインタなのに、なんで配列と同等に扱えるのですか?
それがC言語の仕様だからです。としか答えようがありますまい。

配列は式内でポインタに成り下がります。
とどのつまり、char配列 → char*と解釈され、
それを(キャストを怠りながらも)int*に代入
しているのであります。

> しかも、hoge[2]のように変数hogeを使えますよね。
これではバッファオーバーランとなりますまいか?
>>316
仕様だから。
>>316
このへんでも読んで理解を深めてきたまへ。
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
>>315
そーゆー話は他所でやって下さい。つか、1byteカナ多すぎてうぜぇ。

>>316
あなたが使っているコンパイラに興味があります。
ふつー >>318 の様に、怒られる筈ですが…
コンパイラはSC使っています。
327 ◆/SrH4d2Q :02/09/14 22:11
C言語勉強のおもしろいサイト知りませんか?
scってなに?
Symantec Cとか?
過去の遺物じゃん
32916:02/09/14 22:21
はるか昔の16です。
42さんが教えてくれたことを中心にポインタを勉強し直して
書き直すこと7時間余、ようやく正常に動いているらしきソース
ができました。
>>112さんの御指摘と42さんのコメントを基に、だいぶ速度も
あげることができました。(処理する内容は
(128+26)*(26+40)*12*24*98個と6400*30個のデータのマッチング
なので速いほうが助かります。)

我ながら意味不明の箇所も多いのですが、また整理して質問いた
します。
皆様ありがとうございました。

> (128+26)*(26+40)*12*24*98
=286868736

なんかとんでもねェなオイ
ウォーニング
ワーミング

全然違うのに何故話か話が通じるという…

余談だが、インラインアセンブラじゃなくインラインアセンブリじゃないの?
>>331
ワーミングはネタだってばw
>>331
インラインアセンブラ→インラインのアセンブリ(言語)を
翻訳するための機能(道具)。
こんなところでよろしいか?
全言語のページから"inline assembler"を検索しました。 約12,900件中1 - 10件目 ・検索にかかった時間0.04秒
全言語のページから"inline assembly"を検索しました。 約12,800件中1 - 10件目 ・検索にかかった時間0.09秒
335デフォルトの名無しさん:02/09/14 23:19
ちっちぇーなー、
>>335
>>334の気が?
確かに検索してみると「インラインアセンブリ」より「インラインアセンブラ」の方が多いが
そもそも「アセンブリ」より「アセンブラ」の方が圧倒的に多いという罠があるからなぁ

>>333もいまひとつ納得できん
英語じゃどう表現してんのよ?
オンラインハンドアセンブルサーバー
>>334
なるほど。つまりインラインアセンブラ/inline assemblerが多数派だと…
assemblyというのが、そもそも名詞として用いにくい
理由があるんじゃないの。某宗教関係とカブってたり
ウォーニングムスメ
>>341
あんた今日ここでは一番の輝き。
ウォ娘。?
>>337
ごめん。英語は疎いのでパス。
つーかそんな細かいこと気にすんな。
ハッカーとヒッキーほどの違いはないだろ。
>>334
同異します。
void a( KOU Kou )
{
free(Kou.lpNum);
}

アドレスを渡していない場合で,変数のポインタを開放したらどうなりますか?
解放されるだけ。
たとえ構造体をポインタ渡ししても同じこと。
そりゃそうだ
書き忘れです

関数に,構造体をポインタで渡さない場合で,
その構造体のポインタ変数を開放しようとしたら出来ますか?
こういう場合,構造体は,ポインタで渡したほうがいいですか(ポインタ変数以外値を変える気がありません)?
>>349
構造体のアドレスを渡さなければ、元の構造体の内容を変えることができない、
て事はわかってるのか?
「構造体のポインタ変数」ってのは、メンバ(lpNum?)の事だよな
>>349
もっと具体的に書いてくれないとわからないよ。
>>346
ポインタのような複雑な内容をもった構造体を、
そのまま引数で渡すって事自体、かなり異常だから、
たぶん考え方が完全に間違ってる
構造体のアドレスを渡さなければ、元の構造体の内容を変えることができない、
て事はわかってるのか?

わかります

「構造体のポインタ変数」ってのは、メンバ(lpNum?)の事だよな

そうです
354デフォルトの名無しさん:02/09/15 00:31
僕は作りたいものがあってC言語を勉強してきました。
文法はほぼ完璧になったのですが作りたいものが作れません。
そこで皆さんのアドバイスをいただきたく書き込みさせていただきました。

僕が作りたいと思っているものはTVの画面をリアルタイムで変更して表示を変えるというものです。
でもこれからなにを勉強していっていいかわかりません。
アドバイスをお願いします。
> わかります
ホントか?例えば、これ↓では、呼び出し側の構造体の lpNum にNULLが入らない。
void a( KOU Kou )
{
  free(Kou.lpNum);
  Kou.lpNum = NULL;
}
そしてこれ↓なら、入る。
void a( KOU *pKou )
{
  free(pKou->lpNum);
  pKou->lpNum = NULL;
}
わかるよ
あ,つーことは,NULLいれるためにはポインタで渡さんといけんね
>>354
> TVの画面をリアルタイムで変更して表示を変える
例えば?ビデオジョッキーみたいな?
>>354
おそらく、ビデオキャプチャのデバイスを叩くことになると思うので
お使いのOSの関連API群を調べたりサンプルを実行してみるといいでしょう
WindowsならVFWあるいはDirectShow
Linuxならv4l(video for linux)
MacならQuickTime? よく知らない...
などなど。画面への表示は書籍などをあたればよいと思います。
>>354
それってC言語じゃないとできないのかな。もっとまともなツールがあるような気が。
まあアリモノではいろいろ制約があるだろうけど
>>349
> こういう場合,構造体は,ポインタで渡したほうがいいですか
どういう場合でも、普通、構造体はアドレス渡し。
内容を書き換えられたくなければ、引数を const で修飾。
363デフォルトの名無しさん:02/09/15 00:49
typedef struct {
int i;
} SUPER_INT;

36418:02/09/15 00:50
俺は放置プレイかよ
>>364 悪いが、18は俺だ
>>362
const について誤解があるようですね。
>>362
呼び出された側では内容を書き換えるけど、
呼び出し元にそれを反映したくない時は
どうすればいいですか?
メンバを1つずつ仮引数に書き並べるべきですか、
それともアドレスで渡した後、呼び出された側で
複製すべきでしょうか?
368デフォルトの名無しさん:02/09/15 01:04
struct{
char *p;
...
}test;

t.p=malloc(....)
...
func(t);
...

func(struct test t)
{
free(t.p);
}

こういう場合はポインタ渡しでなくてもで解放される。
369362:02/09/15 01:05
>>366
えっと思ってやってみたら、警告が出るだけ。。そうなのか。。ショボーン

struct foo {
  int bar;
};
void inc_bar (const struct foo *p) {
  p->bar++;
}
main () {
  struct foo a = { 123 };
  inc_bar (&a);
  printf ("a.bar = %d\n", a.bar);
}
370362:02/09/15 01:06
>>367
内容を書き換えてはいけない。以上
>>368
>>346-347で書かれた回答と どの辺が違うのかと 小一(略
372362:02/09/15 01:10
>>367
どうだろうな。やっぱりアドレス渡しなら複製もできるわけだし、
自由度が高いと思うが。アドレスの幅がオーバーヘッドになるかもしれないし。。
とにかく、引数のサイズはバカでかくするべきではない。

>>368
それガイシュツ
373362:02/09/15 01:12
×アドレスの幅がオーバーヘッドになるかもしれないし。。
○アドレスの幅がオーバーヘッドになるかもしれないが。。(大した事はないだろう)
374デフォルトの名無しさん:02/09/15 01:12
*(&(*(&(*(&(*(&p)))))) = 1;
375デフォルトの名無しさん:02/09/15 01:13
>>367
pushしておけ。
>>367
caller:
type_hogera data1, data2;
data2 = data1;
modifier( &data2);

int modifier( type_hogera *tekito) {
tekito->hoge = ...;
return 0;
}
377367:02/09/15 01:30
>>369
はあ?

>>370
マッ マジっすか?

>>372
参照渡ししてから複製するくらいなら
はじめから値渡しする方が一度の処理で済んで
効率的だと思うのは間違いですか?

>>375
pushとは構造体の値渡しのことを指しますか?
それとも仮引数を1つずつ書き並べることを指しますか?
それとも内容を一時退避して復元することを指しますか?

>>376
modifier側で複製せずにcaller側で複製する意図は何でしょう?
寿命はmodifier内で完結させた方が得策ではないでしょうか?
>377
376 はネタ
>>377 まあこれでもマターリ嫁
http://www.catnet.ne.jp/kouno/c_faq/c2.html
380367:02/09/15 01:56
>>379
ありがとうございます。マターリ読んでみました。

ここの皆さんの回答は「何がなんでもアドレス渡し」でほぼ一致、
しかしリンク先の記述では
「構造体の値渡しを使うこともためらう必要はない」(ANSI C)
と書かれているように解釈しました。
一体どうすれば...
>>380
じゃいいんじゃない、ためらわなければ
というか本当は、実際に複製する必要があるのかどうか疑問だったりする
Aという関数にポインタで,値を渡します
Aという関数で,Bという関数を呼び出します
Bという関数には,引数として,値を渡します
Aという関数では,*を使ってBに引数を渡すんですが,
普通,引数渡すのに,*を使いませんよね?
>>382 じゃあ、配列も値で渡してくれ給え
おっと脊髄反射しちった
こうかい
A (Foo *foo_p) {
  ...
  B (*foo_p);
  ...
}
B (Foo foo) {
  ...
}
まあ、ポインタに統一した方が美しい、とは言える罠
386367:02/09/15 02:32
>>381
ありがとうございました。
臨機応変ということでもよさそうですね。

> というか本当は、実際に複製する必要があるのかどうか疑問だったりする
たまにそういう場面に出くわします。
たとえば64ビットや128ビットの整数を扱う時などです。
(64ビットは拡張機能でサポートするコンパイラも多いみたいですね)
387デフォルトの名無しさん:02/09/15 02:36
ユーザー定義型、配列に限って言えば*で渡すのが吉。
>>387
VB?
>>388
基本型の反語の意味で使ったんだが。

VBのユーザー定義型は参照渡しみたいだな。
>>387
ずばり、あなたの言うユーザー定義型とは、「構造体」のことですな?
意味上ではtypedefが合っているけれど、実体がintとかdoubleだったら必要な時以外アドレスわたしなんてしないし・・・
>>390
392デフォルトの名無しさん:02/09/15 13:50
>>387
というか、配列はどう頑張っても値渡しはできないのだが。

>>391
typedef unsigned char UBYTE;
UBYTE b;
とかしてるときにbを常にアドレス渡しするメリットはないわけで。
>>392
> 配列はどう頑張っても値渡しはできないのだが。
構造体に入れろ。
hoge (hoge[0], hoge[1], hoge[2], hoge[3], hoge[4], hoge[5], ........);
>>385
そうです
39660cm浮き上がるストレート:02/09/15 18:32
下の4つについて機種、OSなどの違いにより
動く動かないがあるのなら、どなたか教えてください。
また何かが付属していないと動かないとかなら、
その付属品があるかないかの調べ方を、どなたか教えてください。

1、VisualC++6.0で作ったC言語のexeファイル
2、1のプログラムの中のエスケープシーケンス
3、1のプログラムの中のwindows.hによるDOS窓へのドット表示
4、1のプログラムの中のwinmm.libでの音楽
>>396
exeファイルがOSの壁乗り越えるならjavaは何ですか?
csvファイルの、例えば列がBで行が2の所のデータを参照したい時には
どうしたらいいのでしょうか。教えてくださいませ。
.NET CLRの実行ファイルなら、.exeでも壁乗り越えますが何か?
>>396
VC6って書いてあるじゃん
40160cm浮き上がるストレート:02/09/15 18:51
>>396へ付け加え
僕のパソコンで作ったexeを別のパソコンで使った場合。
2は僕の知り合いの方のパソコンでやった場合、\x1b[3;3H
等がそのまま出てしまうらしいです。
>付属品があるかないかの調べ方
列挙してください
>>401
ANSI.SYS
40560cm浮き上がるストレート:02/09/15 19:11
>>403
なるほど。ANSI.SYSがあることがエスケープシーケンス使用の
条件になるんですね。ありがとうございました。
http://www.nifty.ne.jp/forum/fpcu/dosvcmd/ansi.htm
ではexeをアップロードする場合ANSI.SYSがない場合
ゲームが正しく動作しませんみたいに書けばいいのですね。
>>396
そこに出てるうち、ANSIエスケープシーケンス(ANSI.SYS)以外の話は、
原則的にはこっちだ↓
http://pc3.2ch.net/test/read.cgi/tech/1022499000/l50
VisualC 相談室【8】
アカデミーパックのVC買うときに作ったアプリの再頒布は駄目ですよ
って言われたことあるけどそれはどうよ
別にいいんじゃないの?再頒布するときに何買おうが
>>408
アカデミーパックは学術用に安くしてるから
頒布を考えてるならスタンダートエディション以上を
買って下さいってその店員に言われましたが
410409:02/09/15 19:23
漏れは騙されたのか?
>>409
間違えた。再頒布するアプリを作るときに何を買っていても
かまわないんじゃないだった。
騙されてる。
.NETは知らないけど、6.0までのアカデミックは
再頒布しようが問題ない。
勿論有償のソフト開発でも。
再頒布可能コンポーネントについては、使用許諾契約書に書いてある。
だいたい、この記述と同じ↓
http://www.auemath.aichi-edu.ac.jp/teacher/iijima/qbforum/QB2VB.htm
DLL,OCXなど,どこまで配布可能なのか(2)
414409:02/09/15 19:27
>>411
アカデミーパックで作ったアプリを再頒布するとMSに訴えられますか?
アカデミックは販売対象を制限しているだけで、
ライセンス自体は各エディションに従います
>>414
407を読み間違えてた。
アカデミーパックのVC買うときに「作ったアプリの再頒布は駄目ですよ」
って言われたことあるけどそれはどうよ
ではなくて
「アカデミーパックのVC買うときに作ったアプリの再頒布は駄目ですよ」
って言われたことあるけどそれはどうよ
このように読んでしまってた。すまんです。
41760cm浮き上がるストレート:02/09/15 19:31
よくわからないのですが>>396の1〜4以外に
なんか必要なものがあるのでしょうか。
頒布のことについて書いてありますが、動作する以前に
権利のこととかについて書いているのですか?
418409:02/09/15 19:31
>>413
サンクス
あの店員訴えてやる
>>396
俺はFreeBSD使ってるけど、そこでも動くようにしてくれ。
OSが違うだけだぞ。
>>417
それ以上Visual C++の話を続けるなら、>>406に逝ってくれ
>>412
そうだったんだ・・・
じゃあ商売してもいいわけか。卒業したらだめだったりして・・・
俺、卒業後にアカデミーパックで商売しちゃった。
ある小さい会社の顧客管理システム。大丈夫かな。
LPCTSTRって使わないほうがいいですよね?
今使っているんですが,
全部const char*に置き換えた方がいいですよね?
>>423 WindowsのAPIと関係ない部分ならな
>>423
なんで?
>>422
大丈夫

>>423
使え
427デフォルトの名無しさん:02/09/15 20:36
俺もC言語をマスターしたいと思ってるんだけど
まずどんな本を買えばいい?
あ、今はC言語初心者。
>>424
なんで?
>>424
文字配列(というのか?文字列へのポインタかな)を渡して,
それ使って表示しています
>>429
使わない方がいいと思う根拠は何なの?
>>429
WindowsのAPIに渡す値なら、そこに指示された通りの型名を使え。
Windows特有の話題は余所でたのむ
BOOLって使わないほうがいいですよね?
今使っているんですが,
全部intに置き換えた方がいいですよね?
>>432 WindowsのAPIと関係ない部分ならな
ブルッ
>>432
enumでも#defineでもかまわんから使え。
>>435
typedefなのでenumか#defineに直すべきでしょうか?
どれでもいいのではない? C99には _Bool 型があるね。
enumってなに?
c++でよく見るけど,Cでも使えるの?
もともと C にあった。
>>437
_Boolってまたパッとしない型名だね。
過去の資源との互換性の問題があるからかな。

_Boolも別名を定義して使うのが主流になりそうな予感。
441デフォルトの名無しさん:02/09/15 21:05
>>439
structとenumはC++じゃないと使えないぞ
>>438 列挙型も書いてないようなテキストは直ちに焼き捨てること
443デフォルトの名無しさん:02/09/15 21:05
>>438
列挙
constはC++から流用(?)したんだっけ?
_BoolじゃなくてC++と同じboolじゃだめなのだろうか・・・
445デフォルトの名無しさん:02/09/15 21:08
>441
(゚Д゚)ハァ?
446439:02/09/15 21:09
>>441 どういうことでせう?
明らかにネタだけど、C++じゃstructは使わないよな。
448438:02/09/15 21:10
structもあかんと
>>447
おまえもネタだろ
>>449
C++でstruct使うことあるの?
classとはデフォルトのアクセスレベルが違うという程度でしょ?
451440:02/09/15 21:13
>>444
ああそうか。確かにboolでよさそうだよね。
何で_Boolなんて名前に決まったんだろう?
C++のboolとも型の規格が異なるということかな?
C++でも関数の引数にするとか、fread、fwrite で読み書きするときに
あえて struct 使ってる。
関数オブジェクトとかtraitsとかを書くときはstruct使わない?
# つーかスレ違いスマソ

>>451
typedef int bool;
とかやってた既存のコードを壊さないように、ということではないかなぁ。
「アンダーバー+大文字」で始まる名前は処理系側に予約されてるから、
_Boolならその危険が少ないので。
454440:02/09/15 21:30
>>453
それは440でも書いてるけど、
確かに現状ではC++との互換を意識して書かれている
コードなんて少数派だろうから、その通りだね。
CとC++を混同して考えない方がいいということか。
ありがとう。
455デフォルトの名無しさん:02/09/15 21:48
_+大文字ってつかっちゃいけないんだよな・・・・
最近知った。
どうしよう。当然の如く使っていたよ(おろおろ)
>>455 痴漢しる
ところで「置換」は「ちかん」なのか?
どう考えても「おきかえ」だと思うんだけど?
>>457
理科でなんとか置換法なんてのがあって
そのとき先生は激しく「ちかん」と逝ってたのを思い出した
というか常識だろ
459458:02/09/15 22:45
おっと誤解のないようにいっておくが「ちかん」が常識ね
さすがに口頭では誤解を与えやすいから
「ちかんしろ」とは言わないだろうがな(w
>>461
俺は使う。
・・・・おかしいか?
>>458 あーやったね、上方置換とか下方置換とか。
464デフォルトの名無しさん:02/09/15 23:26
ちかんで正しいぞ。国語辞典みろ
カミカタオキカエ
クニガタリコトバノリ
467デフォルトの名無しさん:02/09/15 23:41
Solarisで以下のコードを書くと、バッファオーバーランになりますか?


char buf[1024]
sprintf(buf, "%s%s", getenv("LOGNAME"), getenv("DISPLAY");
>>467
その前に、コンパイルエラーになるよ。
getenvしてからメモリ確保すればいいじゃん。アフォですか
ほんとだ
471 ◆pavzJkL2 :02/09/15 23:49
/* 最大値と最小値を求めるプログラム */
#include <stdio.h>
main()
{
int a[10]={59,20,504,69,333,98,246,352,111,423};
int b,max,min;
for(b=0;b<10;++b)
printf("%d ",a[b]);
printf("\n");
max=a[0];
min=a[0];
for(b=0;b<10;++b){
if(max<a[b])
max=a[b];
if(min>a[b]);
min=a[b];
}
printf("最大値=%d 最小値=%d\n",max,min);
return 0;
}
なんとなく違うのはわかるのですが、教えてください
if ( a == b )
  return true;
else
  retrun false;



if ( a == b )
  return true;
retrun false;

は、コンパイラで最適化されちゃうような差ですか?
473デフォルトの名無しさん:02/09/15 23:53


max = min = a[0];
for(b = 1 ; b < 10;b++) {
  if(max < a[b])
    max = a[b];
  if(a[b] < min)
    min = a[b];
}
>>472
自分のコンパイラでアセンブラして確認してください。
>>472
何故 return a == b; と書かないんだろう...。
>>473 インデントすれば一発だよなあ。
477471 ◆pavzJkL2 :02/09/16 00:03
>>473
ありがとうございます。即行で答え出ました
もうちょっと考えてみます
478デフォルトの名無しさん:02/09/16 00:06
このパターンで最大最小求めるだけなのにこれ以上何かいい方法があるとは思えんのだが。
>>478
最大値より大きい時は、最小値との比較は不要だから...

if(max < a[b]){
 max = a[b];
} else if(a[b] < min){
 min = a[b];
}

とすると、ちょっと速くなるかも...。
480471 ◆pavzJkL2 :02/09/16 00:15
>>478
>>471のプログラムだとなぜ答えが合わないのかがわからないのです
>>467
書いただけではならない。
>>480
if(min>a[b]);
min=a[b];

セミコロンが余計
483471 ◆pavzJkL2 :02/09/16 00:21
>>482
あらー・・。ありがたう
484というか:02/09/16 00:23
if(min>a[b]);  ←ここにセミコロンあるけれど大丈夫????????
min=a[b];
初心者質問で申し訳ないんですが
for(〜;〜;++i)

for(〜;〜;i++)
が変わらない時があるのは何故ですか?
継続判定の前か後ろだから明らかに違うはずなのに
VC5はくそですか?
a += f() -@
において、f()の結果がaの値を変える場合、
加算されるaの値は変わる前と後のどちらになるかは
処理系依存でしょうか。
@が
a = a + f()-A
と同じであればaとf()の評価順は処理系依存だと
K&Rに書いてあるのですが、
@とAは全く同じではなさそうですし、、
前置インクリメントでも後置インクリメントでも変わらなくない?それ?
>>485
どっちも同じ。
>>489
継続判定〜とか書いてた本のほうがくそだったんですね
ありがとう
for(初期設定;継続判定;増分)
 文〜;
初期設定=>継続判定=>文=>増分=>継続判定=>文=>〜〜
の順でしょ?
>>491
初期設定=>増分=>継続判定=>文=>増分=>継続判定=>文=>

初期設定=>継続判定=>文=>増分=>継続判定=>文=>
となるって本に書いて(そう解釈させる文)あったんですが
493デフォルトの名無しさん:02/09/16 00:46
>>492
(・∀・)ニヤニヤ
>>492
それってさ、条件式の中に++、--を使った場合の事じゃないか?
for (i = 10; 0 < --i; ) と
for (i = 10; 0 < i--; ) の違いとか
>>494
そのころは工房っだったんで覚えてませんが
今その本捜してみます
#define N 10
unsigned i;
for (i = N; 0 <= --i; )
昔ハマった無限ループ・・・我ながらアフォであった
for (i = N; 0 < i--; )
やるならこれ↑かな?
for (i = N - 1; i <= N; i--) // こういう手もあるか
498495:02/09/16 00:59
見つかりませんでした
>>494
だったのかもしれません

何いってんの?
500495:02/09/16 01:05
>>499
(本に書いてあったのが)
>>494
だったのかもしれません
日本語ヘタレですね鬱
void a(const int *n);
void b(int *n);

aからbを呼び出す時に,そのまま渡したら,constつけろよと言われたので,うっかりしちゃったと思ってつけました











void b(int n);
だったら,文句言われない?
>>501
なにそれ。配列じゃないintをアドレス渡ししてたってこと?
Aではintを変えたいんだけどBは変えなくていいってこと?
>>501
void a(int *n);にすればいいと思うが・・・
>>504
そうだったconstついてたんだ
ネタ?
やれやれ
>>501
どうしてもconstにしたいんだったら、呼び出し時にint *にキャストしろ。

しかしなんのためのconstなんだろ・・
>>507
思い入れのため。
ヘッダの先頭に次の行を追加。
#define const
ひとつのヘッダーファイルにexternを集めて,
全部の.cppファイルでインクルードするのって普通?
追記

変数にexternつけてですね
512デフォルトの名無しさん:02/09/16 05:05
strncmpとmemcmpの違いってなんですか?
>>512
"a\0b" と "a\0c" が一致するかしないか。
>>510
集めるほどグローバル変数を使わないのが普通。
>>513
strncmpだと一致するけどmemcmpだと一致しないってこと?
>>515
聞いてばかりいないで自分で実際に確かめろ。
> 全部の.cppファイルでインクルードするのって普通?
全然普通じゃない。スレ違い。
518デフォルトの名無しさん:02/09/16 08:25
>>475
>>472 のこのプログラムの断片では、
true, false が
それぞれ1, 0 ではないのかも。
>>518
ああなるほど...って、もっと嫌じゃん。
520デフォルトの名無しさん :02/09/16 10:27
データの保存についてなのですが、
for(i=1;i<=n;i++){
  fprintf(fxy,"%f %f %f %f \n",a[i], b[i], c[i], d[i]);
}
みたいにして、a,b,c,dの値がそれぞれエクセルの別の枠に自動的に
入るようにしたいのですけど、どうすればいいでしょうか?

>520
csv形式?
>>520
カンマで区切って書き出して、
エクセルでCSV形式としてインポートすればいいよ
523520:02/09/16 10:37
レスありがとうございます。
すみませんが、CSV形式というのが良く分からないのですが、
具体的にはどういう風にすれば良いのでしょう?
カンマで区切って書き出すというのが良く分かりませんので
お願いします。
拡張子を.cvsにして、できたファイルをダブルクリックしてみろ。
間違えた。csv。メンゴ。
526デフォルトの名無しさん:02/09/16 10:40
すっごい基礎であれなんすけど

char *String;
char *stop;
stop = String + strlen( String );

strlenってint返すと思うけどこういうのはどういう意図なんすかね?
for (p = String; p <= stop; ++p)
ってやりたいんだろ。他に解釈しようもないと思うけど。
>>526
Stringの指す文字列の終わりを示すヌル文字、
そのアドレスをstopに入れたいのだと思われ。
その用途は分かりかねるが。
529デフォルトの名無しさん:02/09/16 10:46
1234567890を1,234,567,890のようにカンマ付けするのに
ベストだと思う方法を教えてください。
530デフォルトの名無しさん:02/09/16 10:47
>>526
Stringの終端文字(='\0')の位置を調べて、そのアドレスを stopに代入。
つまり、Stringの終了アドレスを求めていると。
>>529
C言語以外の言語を使うのがベスト。なんて答えじゃだめ?
532デフォルトの名無しさん:02/09/16 10:48
私の使ってる Linux 上の glibc (になるのかな ?)では BIG_ENDIAN, LITTLE_ENDIAN,
BYTE_ORDER がdefine されているので, ソースで使えないのですが,
規格としては, 規格で定められているものをつぶさない限り,
処理系が独自のマクロを提供するのは自由, ということになっているのでしょうか.
ていうか、

char *p;
p = String;
whille(p != '\0'){

/* … */

p++;
}

とかじゃ駄目なんだろうか…
>>529
後ろから3文字ごとにカンマを挿入するだけだろ。
>>532
だめ。だって
while (*p != '\0')
だも〜ん。
536533:02/09/16 10:53
>>535
そうですね。わたしが馬鹿でした。
ていうかやったら人生終わる…(氏
>>533
開始アドレスと終了アドレスを必要とするライブラリ関数に渡すつもりかもしれない。
>>537
そういう処理だと確かにポインタ演算が一番速いですね。
539デフォルトの名無しさん:02/09/16 10:59
ああ、なるほどーーー>527

>528,530
わっかりました。でも、
strlen( String);である必要ってあるの?
~~~~~~~~~~~~~~~
ちなみに文字列置換する用途で検索してたら
こんなコードが多くあったもんで。

>533
たぶん。ポイントで終端アドレス知りたいんだとは思いますが。
540529:02/09/16 11:00
説明不足でした。
整数を表示する際に、3桁毎にカンマ区切りを付けたいとします。
例えば 12345 なら 12,345 と。
それを行うのにベストな方法を教えてください。
単純な除算とstrrevを使った方法は知っているので、出来ればそれ以外を。
> strlenってint返すと思うけど
そうなのか?知らんかった。
542デフォルトの名無しさん:02/09/16 11:04
size_t?ってつっこみたいの?
543539:02/09/16 11:05
>539
あ。なんか分かった気がするので取り下げ
544541:02/09/16 11:09
>>542
ああ!それかもね。
>>532
処理系独自のマクロ一覧がドキュメントに書いてあるはずだよ
ぶつかるのは仕方ないんじゃない
ENDIAN云々はglibcじゃなくてglibのような気もするが
546デフォルトの名無しさん:02/09/16 11:14
>>540
ベストって、なにを評価してベストなのか?
処理時間なのか、移植性なのか、コードの量なのか?

面倒だったらとりあえずprintfで何とかならないか調べろ。
size_t

BCCの場合、<stddef.h>から辿っていったところ
<_stddef.h>内にある

typedef unsighned int size_t

から、unsighned int
になるっぽいのかな?
コンパイルのオプションで変わるのかもしれんけど。
まあ環境に依存するということなんだろうか。
unsighned?
typo?
>>548
うぇーん、またミスったみたい。
×unsighned
○unsigned
ですた。
もうだめぽ…
size_tがunsignedで迷惑こうむった人の数→
というスレを立てていいですか?
>>510見て気になったのですが、
ひとつのヘッダーファイルに関数のプロトタイプ宣言を集めて、
全部の.cファイルでインクルードするのって普通?

そのヘッダファイルを編集すると、全部の.cをmakeしなおさないと駄目になるような
気がするのですが。
>>552
サイズって自然数であるはずだけど不都合あった?
K&R読み返してみたところ、
「厳密に言えば,size_t は符号なし整数値を作成する」
と書いてあったよ。
これはデータの意味を表す為に
型定義を行ったと考えるべきなんだろうかな。
555デフォルトの名無しさん :02/09/16 12:01
1<x<2,2<x<3のそれぞれの範囲で関数f(x)が定義されていて
同時に両方の範囲で関数のグラフを表示させることできますでしょうか?
556デフォルトの名無しさん:02/09/16 12:02
関数へのポインタ?
同時に、って?
551はintを単純にsize_tに置換したクチだろ
559555:02/09/16 12:07
>>557
1<x<2,2<x<3のそれぞれの範囲のグラフを
両方表示するってことです。
>>560
ええ、どうぞ表示してください。としか言いようがない。
C言語の仕様見れば出来るか出来ないかは自明だと思われ。
>>545
どうもありがとうございます.

ただ BIG_ENDIAN は BIG_ENDIAN だからなあ, 発想が貧しい私には
代わりのいい名前が思い浮かばん ...
>>561
そういう時は、プリフィックス付けれ
>>552
あまり普通では無いと思う。
ただ、コンパイル時間はあまり気にしなくていいと思うけど。
(1万行程度のコードなら数十秒でコンパイルできるし)
>>562
マクロ相手に意味ないのでは.
マクロだとプリフィックス付けても置換されるの?
初耳だ!
>>559
なぜできないと思うの?
567552:02/09/16 13:00
>>563
あ、やはり普通ではないのでしょうか(あまり、というのが少し気になりますが)。

こちら
ttp://www-watt.mech.eng.osaka-u.ac.jp/~tasai/kadai4/node6.html
に書かれているように、プロトタイプ宣言はヘッダファイルに書け、
というのを何度か見掛けたことがあったので、質問しました。

ただ、たしかに
ファイル間でプロトタイプ宣言に矛盾があっても、
ファイル毎にプロトタイプ宣言を直書きしてると
コンパイラは矛盾を見付けられないなぁ、
と、今ちょっと試してみて思いました。
こういうのが心配なときはヘッダファイルに書いちゃう方が良いんでしょうか…
>>565
あうち, 置換されなかった.
thx
>>567
モジュール毎に分けて、ヘッダでプロトタイプ宣言しる。
>>563
数十秒はかかりすぎー
571555:02/09/16 13:44
>>566
できるなら、やり方教えてください。
>>570
いや、自分のPCだと10秒程度なんだけど、
もっと遅いマシンも現役かなと。開発用マシンなら特に。
>>571
「書籍も買えない貧乏人は麦を食え」ってことわざ知ってる?
米を麦に買えて節約しろと
575デフォルトの名無しさん:02/09/16 14:57
直線 m があって任意の座標 A があるとすると、
点Aが直線mの右側にあると判定する最もよいアルゴリズムってどんなのですか。
スレ違い質問が多いなー

どなたか>>486教えてください
お願いします
>>577
式の評価単位で同じ変数に二度代入が行われると
常に未定義か不定かだったと思う
>>577
アセンブラで書ければ理解できると思います。
この際、アセンブラに挑戦してみては?
多くの疑問が多々解決しますよ。
a += f() は
a = a+f() と同じさ。
>>577
答え: はい。
>>580
結局はコンパイラが同じにしちゃうんですよね。
int a, b;
int f() { ++a; return a; }
int g() { ++b; return b; }
main(){
 a += f(); // 1
 b = b+g(); // 2
}
1と2で結果が変わるかってこと?
多分未定義(コンパイラによって結果が変わる)
仮に定義されていたとして、こんな書き方はやめて
>>577
@未定義。
AE1=E1+E2とE1+=E2の違いは、後者はE1が一度だけ評価されるということのみ。
 したがって、E1が副作用を持たなければ全く同じ。
 いずれにしても評価順は不定。
>>583
「未定義」は「コンパイラによって結果が変わる」という意味ではないよ。
586デフォルトの名無しさん:02/09/16 16:02
先制!
typedef enum{

hoge
foo
bar

} hogehoge
とかいう構文の意味がわかりません!中のメンバの型宣言とか見当たんないし。
587デフォルトの名無しさん:02/09/16 16:02
>>586
enumだよ・・・
>>585
未定義 == 定義されていない
コンパイラの製作者が独自の実装を行って良い。
という意味ではないのですか?

VCは、デバッグオプションでも変わるとかはナシですよ。
>>586
anonymous enumをその場でtypedefしてるだけ。
590デフォルトの名無しさん:02/09/16 16:16
ファイルを開くのに失敗します。

FILE *fp3;

fp3= fopen(Name,"r");
if (fp3 == NULL) {
printf("ファイルが開けませんでした");
exit (1);
}

どこか間違っているでしょうか?
どなたかご教授願います。
591デフォルトの名無しさん:02/09/16 16:17
>>590
ファイルがない。
Nameが指す文字列を確認しろ。
592586:02/09/16 16:17
あ、猫にきちんと書いてありますな。
皆さん乙〜
>>588
未定義==言語仕様にない==動作保証なし
実装依存==正しく実行され処理系ごと結果が定義される
不定==正しく実行されるが結果が特定できない
594デフォルトの名無しさん:02/09/16 16:22
>>591
ファイル名を確認したらおかしな文字列が入っていました。
無事修正しました。
ありがとうございます。
>>586
平気な顔して機種依存文字使うアホです。無視するが吉。
未定義==Cドライブフォーマット可能
実装依存==表示が英語と日本語で変わるかも
不定== printf("%d%d", rand(), rand() );

ってことですか?
じゃ、俺は不定といわなきゃならなかった訳だ
勉強になりました。
未定義のせいでパソコンが火を噴きマスタ。
598586:02/09/16 16:35
>>595
(´・ё・`)マァマァ
機種依存文字? ひょっとして俺の目は節穴なのかな?
600586:02/09/16 16:59
>>599
↓これのことではないですか?
DirectXいじるようになって
やっとenumの意味をしったトロい漏れ
602デフォルトの名無しさん:02/09/16 17:03
これ、トリップ変換ロジックのソースらしいんだが、
これでやっていることをCプログラマに分かるように説明してくれ。

$salt = substr(substr($key, 1, 2) . "H.", 0, 2);
$salt =~ tr/:;<=>?\@[\\]^_`/ABCDEFGabcdef/;
$salt =~ s/[^\.\/0-9A-Za-z]/\./g;
$trip = substr(crypt($key, $salt), -8);
>>602
ハア?
それ、perlやろ?
605デフォルトの名無しさん:02/09/16 17:19
>>603
(・∀・∀・)マァマァ、寛容な精神で。。。
ttp://ghanyan.monazilla.org/lgpl/des.c.txt
の get_2ch_trip( const char * pw ) でも見とけ。
.NETは?
608デフォルトの名無しさん:02/09/16 20:24
>>602
perl勉強汁。

cryptのkeyからsaltを作る
変換
置換
cryptから後ろ8文字を出す。
609デフォルトの名無しさん:02/09/16 21:42
>>600
え?三点リーダって機種依存文字では無いと思うのですが…
2バイトコードのことだよ。
>602
1.文字列の最後に"H."を追加し(文字列が"Aホ"なら"AホH.")
  2文字目と3文字目を取り出す(上の例なら"ホH")
2.下記にしたがって文字を置換
   文字コード≦0x2d '.'
   文字コード≦0x39 そのまま
   文字コード≦0x40 コード+7
   文字コード≦0x5a そのまま
   文字コード≦0x60 コード+6
   文字コード≦0x7a そのまま
   文字コード≧0x7b '.'
  (上の例なら".H")
3.作成したSltでCrypt文字列を作成し8文字を取り出す。
つーか2ちゃんのセキュリティー破ってどうする
if( x >= 0 && x <= SIZE_X && y >= 0 && y <= SIZE_Y )
は,この範囲内にあるならという条件です。

この範囲外のときは,という条件の場合
if( !( x >= 0 && x <= SIZE_X && y >= 0 && y <= SIZE_Y) )
を使いますか?

それとも4つの条件が否定になるように書いていきますか?
4つの条件が否定になるように書くと,全部の条件を調べなくてもよくなりますが(場合によって),
可読性が悪くなりますよね(コメントで補えますけど)
この範囲外のときは,という条件の場合
if( x >= 0 && x <= SIZE_X && y >= 0 && y <= SIZE_Y )
;
else{
,,,
}
と書く香具師もいるな。
616デフォルトの名無しさん:02/09/17 00:12
>>614
可読性>マクロ使えばすむ話
617デフォルトの名無しさん:02/09/17 00:13
if((x < 0) || (x > SIZE_X) || (y < 0) || (y > SIZE_Y))
特に可読性が損なわれるとは思わないけどなぁ。
>614
俺はこう書く
( 0 <= x && x <= SIZE_X ) && ( 0 <= y && y <= SIZE_Y )
否定の場合は状況によるが
!(( 0 <= x && x <= SIZE_X ) && ( 0 <= y && y <= SIZE_Y ))
こんな感じかな。好き好きだからどう書いてもいいじゃない?
>>617
一つだけ見てもわからん。
書き比べてみろ。
未満でよければ・・・
if(x/SIZE_x==0 && y_SIZE_y==0)でも可。
if(x/SIZE_x!=0 || y_SIZE_y!=0)逆
#define unless( x ) if( x ){}else
622デフォルトの名無しさん:02/09/17 00:24
>>619
???
>>621
elseはどう置くよ?
624訂正:02/09/17 00:26
>>620間違えた。
「y_」の2ヶ所「y/」ね
625デフォルトの名無しさん:02/09/17 00:27
>>623
>>621の使い方。

unless(.....){
  範囲外の処理;
}
>620
x=-1
SIZE_X=2
の場合は?
627デフォルトの名無しさん:02/09/17 00:29
>>625
unlessという関数だと見間違う可能性があるので却下。
>>625
少なくともperlではunlessにもelseが置ける。
よって混乱する可能性大
if( (unsigned)x > SIZE_X && (unsigned)y > SIZE_Y )
ってのはボツなのか?
unsignedの部分は適当な符号無しキャストに
読み換えてくれたまへ。
630629:02/09/17 00:37
あ、上の && は || の間違いね。
>629
視認性という観点から却下。
> 視認性
車の運転? (ププッ
633デフォルトの名無しさん:02/09/17 01:24
イベント通知やコールバック関数の使い方等に関する分りやすい文献または
インターネット上のサイトなどありませんでしょうか?
>>632
視認性の重要さをわかってないと言うことは、まだまだ厨ですな(W
#define unless(x) if(!(x))じゃだめなの?
>>633
まず、環境を書け。
637デフォルトの名無しさん:02/09/17 01:26
>>636
スタンダードな方法でお願いします!
ネタは無視。
639デフォルトの名無しさん:02/09/17 01:30
>>638
ネタじゃないっす。ちなみに637は私ではないです。

>>636
WIN32で結構です。

というか参考書とかに体系的にこのあたりが解説されてるのがなくて、、、
よろしくお願いします。
ここで聞くあたりネタかと。
> 視認性の
プッ
> まだまだ厨ですな(W
ププッ

スレ違い。蛍光色の服でも着てろ。
可読性
>>639
関数ポインタに付いてよく読めばわかるんじゃない?
>>639
マジレスしてやる。一番ためになるサイトはここ。
http://pc3.2ch.net/test/read.cgi/tech/1028580373/l50
そういう類の質問では最初から環境をかけ。
そしてスレが違うことに気づけ。以後は無視する。
関数ポインタだってさ(ププッ
>>644
ありがとうございます。逝ってきます。
汗とかアルゴリズムの質問もここでする人がいるね。
>>645はネタ。
ここの部分がか?
>ププッ

650デフォルトの名無しさん:02/09/17 02:56
if(fread(&(ID_p->ID_data), sizeof(double), 1, ID_file) != 1){
exit(1);}

バイナリモードでファイルから21ビットという半端なビット数を収得した後、
24ビットに変換して格納という動作を繰り返したいのですが、
sizeof(double)の部分はどのように変えたらよいのでしょうか?
どなたかご教授願います。
FILE*を包括するバッファ付きのbitioFILEとか作っておいて
それ用の関数群を作るのが簡単かな
フリーのBCD演算ライブラリ下さい。
BSDライセンスが良いです。

てか、何故に標準ライブラリに入らない。BCD演算。
>>652
作ってる奴らが興味ないから。
>>653
だよね〜。。。
作れる奴は簡単に作る。作れない奴はまたったく駄目(俺)。
事務アプリ屋が、泣いてるぞ―――。
IntelのCPUには、BCD演算機まで付いてるのにdubleで演算して適当な
ところで四捨五入は悲しすぎると思う。

だれか、俺に作り方教えてくれーー。
できれば、IntelのBCD演算機使いたい。
>IntelのCPUには、BCD演算機まで付いてるのにdubleで演算して適当な

演算モード変えれ
>>655
もちっと詳しく。しくしく。馬鹿だから俺。
DelphiならBCD型があるのにね。ププッ
dub

なんとなく仮面ライダー
厨の俺にはBCD演算がどんな時に必要になるのか
よくわからない。
型の相互変換だけじゃだめなのかな?
お好みの十進の精度で演算できるわけさ
661659:02/09/17 13:00
>>660
精度 ですか。
どうやら俺がBCDのことをよくわかってないだけのようです。
逝ってきます。
>>661
いやね、float型だと丸め誤差とか考えなきゃいかんでしょ。
下手すると金利計算とかヤヴァイ事になっちゃうからね。
663659:02/09/17 13:42
>>662
2進整数を固定小数点数として扱うのじゃいけないん
でしょうか?
やっぱり俺、逝くべきでしょうか。
有効桁数が10桁や12桁程度なら、doubleでも問題ないように
思うのですが、間違ってる?
BCDでも、結局一番下の桁より下は丸めを行わないといけないし。
>>664
3.5が3.5で保持できるなら
>>663
じゃあ、2進数で0.1(D)を表現してみて。

0.25(D) → 0.01(B)

こんな感じで。
CPUのBCD演算機能を使いたいって人いるけど、
Cで多倍長整数演算ルーチン書いたより速くなるのかな?
俺も検証したことはないけど、なんとなくCPUのBCD演算命令は
遅そうなイメージがある。
668659:02/09/17 14:12
>666
10000
くらいでいかがでしょう?
>>667
(゚∀゚)だからそこは精度と速度のトレードオフかと。
>>668
……(^^;
671659:02/09/17 14:23
>>670
やっぱり俺は逝くべきなんですね。
要するに小数点以下の桁数をあらかじめ決めておく
(または構造体にして精度も変数で持っておく)
というありきたりな考えなんですが...
>>669
多倍長整数演算だったら、BCDと精度は変わらないでしょう。
673 :02/09/17 15:20
すいません
テキストボックスで1とか2とか数値がはいってるのですが
メモリではどういう形式で格納されてるのでしょうか?

&h01 とかではないと思うのですが教えてもらえないでしょうか?

文字コード 1のアスキーコードが49 それのEBCDICで&hC9かなと思ったのですが
あってるでしょうか?

>>673
スレ違い。
>>673
Winならアスキーだよ。
676 :02/09/17 16:04
>>675
ありがとうございました
おかげさまで解決しました
666 :デフォルトの名無しさん :02/09/17 14:00
>>663
じゃあ、2進数で0.1(D)を表現してみて。

668 :659 :02/09/17 14:12
>666
10000
くらいでいかがでしょう?

671 :659 :02/09/17 14:23
>>670
やっぱり俺は逝くべきなんですね。
要するに小数点以下の桁数をあらかじめ決めておく


??何がしたいんだ??
何か勘違いをしていないか
それとも確信犯で特殊な乗数を使っているのか?
>>677
まあまあ、マターリいこうよ。

>>659
2進数の少数部分の表し方は分かっている?
それともネタ?
679659:02/09/17 16:42
>>677
多分勘違いしているんだと思います。

>>678
> 2進数の少数部分の表し方は分かっている?
分かりません。
少数部分という言葉自体が初耳です。
680659:02/09/17 16:45
結局、前に書いているように、2進整数を固定小数点数として
扱うのではまずいのか?
ということなんですが。
 ↓まあまあ、マターリいこうよ。
>分かりません。
>少数部分という言葉自体が初耳です。

面白い!!もちろん喧嘩売ってるんだよね!
683デフォルトの名無しさん:02/09/17 16:47
チンカスでも分かるC言語講座ってないですか?
猫でもわかるプログラミングというサイトを見たのですが、
さっぱりです。難しすぎる。
>>680
0.1(10)と10000(2)は160倍(10100000(2))倍違うわけだから
単なるシフトにはならないYO!!
>>683
猫でもわかるは、よく初心者にすすめられるけど、実際は
ある程度わかってる人間がサンプル集として使うのが正解だと思う。
>>683
マジレスさせてもらうと・・・
他のプログラミング言語を勉強して使えるようになった物ある?
まったくプログラムしたことないなら、他の言語を勉強してみると良い。
それからC言語を勉強すると、結構理解できたりする。

簡単なのだと、PerlとかHSPとか。
ちなみに、俺は初めて言語を勉強したのはPerlですた。
687659:02/09/17 17:00
>>682
いえ、そんな気はありませんし、こんなところで
喧嘩しても何の得にもならないと思います。
少数部分というのは小数部分で良かったんでしょうか。
それなら多分わかると思います。
お気にさわったようですみません。

>>684
私が書いたのは十進表記での 10000 のことです。
つまり16進で表すなら 2710
2進で表すなら 10011100010000 です。
Webで優秀なチュートリアルは少ないよ。
ケチらずに本を買ったほうがいい。
>>683
Perlはどうなんだろ・・・
自分、学生なんだけどC、Javaとかのほうが周りでやってる人いるし
入門書とかも豊富なCとかの方がいいような
基本的な制御構文使ってやるプログラムだったら、特にむずかしいこと
なかったよ
>>688
だよね。
FAQなら役立つのが>>1にあるんだけど。

Cなら図書館にもよい本があるかな?Javaのように比較的新しい言語だと最近の本が置かれていなくてだめだけど。
>>690
Perlは、すげー楽だぞ〜。
$を文字の先頭におくだけで変数になるし、
変数の型ないから、文字入れても数字入れてもいいし、
変数は、何もしなくても可変長だし。

まず掲示板作って喜ぶ。
もうちょっと勉強してライブラリとか使えるようになったら、
ダウンローダーとか作って喜ぶ。
そして、コマンドラインが好きになってくる(w
それからCを勉強してもいいと思うけど。
なぜか、嫌われてるけどねー。PerlとかルビーとかHSPとか。
693659:02/09/17 17:06
>>689
ありがとうございます。
読んでみましたがそれは一般に用いられている
浮動小数点形式の考え方ではないでしょうか?
この考え方についてはわかっているつもりです。
そうでなく、整数を固定小数点で扱うわけにはいかないの?
ということなんですが。
>>679
×少数
○小数
人が変換ミスしたからって揚げ足取らない(^^;
695659:02/09/17 17:08
ちょっと改めて聞いてみるんですが、BCD
>>693
>整数を固定小数点で扱う
だからBCD演算を使用するって事でしょう(^^;
>>693
普通固定小数点を使うときは小数点のシフトだけですむような
倍数で使う。
698659:02/09/17 17:12
>>696
ありがとうございます。
やっぱり多分自分がわかってないと思うので、
BCDについて勉強してから出直したいと思います。
このまんまじゃ荒らし同然なので。

BCDって2進化10進法のことで合ってますよね?
>>698
BCDってなにかと思ったらあれのことか・・・
拡張2進化10進符号のEBCDICなら知っている。
700げっと
えびしでぃっくなんて読まないでください。
701659:02/09/17 17:19
>>697
それだと小数の誤差の問題があるので、
整数を固定小数点で扱うわけにはいかないの?
ということだったんです。
BCD使用して有理数を扱うとすれば、こうなるのかな?
・正負のフラグ
・必要なだけの桁と対応する数値データ
・小数点の位置を示すデータ
以上を構造体にすると。
>>701
加減はともかく乗除のコストが莫大になる
だから少なくともIntelのCPUですることではない
それからBCDを使うのは十進精度で切り出せるからで
この話とはあまり関係ない
704659:02/09/17 17:47
>>703
ありがとうございます。

> それからBCDを使うのは十進精度で切り出せるからで
> この話とはあまり関係ない
この辺がよくわかってないんだと思います。
では逝ってきます。
705デフォルトの名無しさん:02/09/17 20:15
>>690
おれは
N88-Basic → HTML → JavaScript → Perl(CGI) → C(現在進行形)
N88-Basic以外は
webでCGIなどとして使えるというw
>>705
しかしマスターはできていない罠w
707 :02/09/17 21:03
マイクロソフトに入りたい・・・
Cできてもあかんよね?
UNIX系覚えるか
708デフォルトの名無しさん:02/09/17 21:56
条件分岐や関数呼び出しをできるだけ押さえた方が実行速度があがるんですか?
>>708
実際にやってみろ。
スタックを使うことによるコストが
解っていないやつばかりだな。
>>710
> スタックを使うことによるコスト
キャッシュミスヒットによるコストが解っていない人よりましだろう。
>>708
int main(void){return 0}/*はやい*/
int main(void){return main();}/*おわらない*/
> スタックを使うことによるコストが
> 解っていないやつばかりだな。

プッ
笑えるネタGet!!
714デフォルトの名無しさん:02/09/17 23:42
>>710-711
ここにいるヤシらのつくるものなら、そこまで気にする必要は無い。
>>710
> スタックを使うことによるコスト
( ´,_ゝ`)プッ
>>710-711
ジジイかお前ら…
void a( void )
{
char Data[20][4]={
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
・・・
}

のように関数の初めに初期化している?
大きすぎると,内部変数ではあかんみたいだけど,これぐらいのおおきさでは?
行が増えて見づらいしね。
}
すまぬ
>>710
じゃあもう自動変数も関数も使わないことにします。
>>717
> 大きすぎると,内部変数ではあかんみたいだけど
そういう場合は関数の外にだしてstaticで修飾しろ、
static変数ならばファイル内でのみ参照でき、別ファイルからでは見えない。
変更してはいけないテーブルならば、おまけにconstも付けとけ
あとは内部変数と重なるような一般的な名前は避けるようにしとけばOK
static const char Data[][4]={
  {1,2,3,4},
  (略)
  {1,2,3,4},
};

void a( void )
{
  ...
}
>717
char Data[20][4];
for(j=0; j<20; j++)
  for(i=0; i<4; i++)
    Data[j][i]=i+1;
で良いじゃ〜んと、少し本質からずれていそうなところを突っ込んでみる。
static変数をexport
なんか変な気分
723デフォルトの名無しさん:02/09/18 11:26
Pro*Cと、zlibを連携さたいのですが、
Makeファイルをどのように修正したらいいかわからなくて困っています

助けてきぼんぬ

使ってるのは、Oracle for Linux9i 付属の demo_proc.mk を使っています・・・

Makefileてか、Makefaileだなこりゃ。。。鬱
メイクファイルと言えば "シンボリックターゲット" 構文って
標準的ですか? (BCCのmakeの独自拡張?)
725デフォルトの名無しさん:02/09/18 12:35
標準入力から読み込まれたテキストの,最初の桁が"#"である行だけを表示する.

fileout < ~/.cshrc
というコマンドの出力結果が
grep ^# < ~/.cshrcの出力結果と同じになるようなプログラム.
を作りたいんですが、今一つ分かりません。誰か教えてください…。
>>725
一文字ずつ読み込んで、初めの一文字か改行文字の後に読み込んだ文字が'#'だったら改行文字まで表示すれば?
>725

fgets で一行づつ読み込むのも手ですね。
テキストファイルが前提ですが
728725:02/09/18 13:19
なるほど…。
>>725
char buf[BUFSIZ];
while(fgets(buf, sizeof buf, stdin) != NULL)
  if(buf[0] == '#')
    fputs(buf, stdout);
730デフォルトの名無しさん:02/09/18 13:34
"MUNE"
って感じにダブルクォーテーションで囲まれてる部分を
#define MUNE MOMIMOMI
で痴漢したいんだけど、これは無理だよね。
でもどうしても実現したいときはどうすればいいかな?
>>730
perl, sed, 手持ちのエディタの置換処理
どれでも好きな物を使え
>>720
> そういう場合は関数の外にだして

なんでわざわざ出すの?
733デフォルトの名無しさん:02/09/18 14:09
フロッピーやCD−ROMドライブ等のハードウェアにアクセスする方法を教えてください。
>>721
ごめん
本当は,座標とかランダムにはいっ取ります
735デフォルトの名無しさん:02/09/18 15:20
最近C始めた初心者ですが入力された数字のみ、判定する
関数ってあるんですか?
数字のみ判定させたいのですがそこに文字を入れると暴走が
はじまっちゃうんですよね。
ご教授願います。
>>735
スレの削除依頼はちゃんとだした?
737デフォルトの名無しさん:02/09/18 15:28
今だしてます。
むこうで素手に答え出てたけど。
>>735 = >>737のが何で暴走したか知りたくない?
740デフォルトの名無しさん:02/09/18 15:48
>>739
なんでとわ?
>>740
だって、マッチングの誤りなら結果でないだけでしょ
終了条件書かなかったんじゃないかな!=NULL

742デフォルトの名無しさん:02/09/18 16:11
>>741
詳しく書くとswitch使ったときにcase1から4までとdefaultつくって
そのとき入力したものが数字ではなく文字だった場合に暴走が始まる。
743741:02/09/18 16:14
>>742
おぉアリガトン、やってみます
744デフォルトの名無しさん:02/09/18 16:18
お願いします。
>>717
>>734
はい、それは何となくわかりますが、突っ込んで見ました。
以下の様に1行にいくつか書いても良いとは思うのですが、
他の方々はどうなのでしょうか?
void a( void ){
char Data[20][4]={
{1,2,3,4},{1,3,6,4},{2,2,9,4},{5,2,3,8},
{3,2,8,4},{0,2,3,9},{3,8,3,4},{7,2,6,4},
{1,4,3,1},{1,7,2,4},{3,2,3,1},{5,2,3,9},
・・・
}
746デフォルトの名無しさん:02/09/18 16:55
>>745
外部ファイルに持たせて実行時に読み込ませるか、データの定義だけ
入ったヘッダファイル作る(or 自動生成)かどちらかにしてる。

関数内にデータ定義入れるとメンテナンス大変そうだし。
>>745
char buf[BUFSIZ];
printf("char Data[20][4]={\n");
while(fgets(buf, sizeof buf, stdin) != NULL) {
  buf[strlen(buf) - 1] = '\0'; // '\n'を取っ払う処理
  printf("{%s},\n", buf);
}
printf("};\n");
ほれ、4×20の数値データのみからなるcsvから2次元配列を作るソースだ
ファイルに入出力をしない理由はパイプを使ってgrep, sortなどの
他のツール群とも併用できるためだ。

決してファイルのopen/closeが面倒な上にエラーチェックしないとマズイなぁとか
ファイル名をコマンド引数で渡すと引数チェックもしなきゃいけないとか
だったらそんな処理はしないことにしようとか思ってサボってるわけではない。
> だったらそんな処理はしないことにしようとか思ってサボってるわけではない。
747のコードでさえエラーチェックをサボってるくらいだから
どっちでも変わらん罠。
749デフォルトの名無しさん:02/09/18 20:21
for(unsigned i = 1; i >= 0; i--) { }

無限ループするのは何で?
>>749
unsigned intは 0未満の値をとらない。
751デフォルトの名無しさん:02/09/18 20:32
標準ライブラリ関数strstrで質問です。
本の例題等でよく見る文です。

void TestStrStr(void)
{
char *s1 = "abcdef";
char *s2 = "de";
char *cp;

cp = StrStr(s1, s2);
printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1);
}

strstr()が該当する文字列の先頭部分のポインタを返すのはわかるのですが、
一番最後の「cp - s1 + 1」を実行すると、s1の中のs2部分が何文字目から始まるかが
わかるのは何ででしょうか?
アドレスが格納されたcpから、s1を引いて1を足すことに何の意味があるのか。
かなりヘボヘボな質問ですが、うまく理解できずにもどかしい思いをしております。
算数の問題とちゃう
abcdef
012345
de
34
3-0+1=4
>>751
アドレス同士で引き算できるって事を理解してないんじゃないの?
同じ型どうしのアドレスからアドレスを引くと、何要素分離れているかという意味になる。
754デフォルトの名無しさん:02/09/18 21:07
time_t型をstruct tm型に変換する関数はありますが、
逆にstruct tm型をtime_t型に変換する関数ってあるんでしょうか。

日付を手動で入力してtime_t型に入れたいんです。
mktime()がそんな感じだったと思う。

つーか、time.hを読めばあたりがつけられるだろうが。
なぜしない?
おまいら!
VC++で動く「主成分分析」プログラムをうpしれ!
ソース丸ごとキボンヌ!

俺の会社員現役の姿を見続けていたいでしょ?
やべーよあと期限三日でクビだよ!(たぶん)
たすけて〜
( ゚д゚)ポカーン
>>755
ありがとうございます。
そうか、hファイルを読むという方法もあったんですね。
今度困ったらやってみようと思います。
759デフォルトの名無しさん:02/09/18 22:31
>456
正規表現で置換しろ
性器表現で痴漢するのか。
>>760
警察署の前でおまいの気持ちを性器で表現して来い
762デフォルトの名無しさん:02/09/18 23:35
763756:02/09/19 00:15
サンクス
なんとかできたぜい。
首がつながったよ。
あと半年はねばれるかな
765デフォルトの名無しさん:02/09/19 13:47
ごめんなさい。質問です。

C言語からUNIXコマンドを使用したい場合はどうすればいいのでしょう?
ちなみに、いまファイル添付をし、メール配送しようとしているのですが
Cではどのようにするのがベストなのでしょうか。。。
>>765
UNIXコマンドを起動するのは system関数。

メイル云々は別プログラムにやってもらったほうが楽だと思う。
(どのプログラムがいいかはよく知らないけど)
>>765
UNIXならpopenがいいかも?
>>766
その別プログラムってのがUNIXコマンドじゃないの?
769765:02/09/19 14:42
みなさまどうもです。

メールなのですが、コマンドでできれば1番いいと思うのですが
コマンドがわかりません。。。

もうスレ違いですね。すみません。
ありがとうございました。
sendmail?
771765:02/09/19 14:57
>>770
sendmailは、suしなくてもできるんでしょうか。。。
773初心者:02/09/19 18:44
main()
{
unsigned int x=-1;
printf("%d\n",x);
printf("%u\n",x);
}
結果
-1
4294967295
main()
{
int x=-1;
printf("%d\n",x);
printf("%u\n",x);
}
結果
-1
4294967295
これだったら
unsigned
の意味がよくわからないのですが
だれか教えてください
>>773
x/2 とかやってみたら違いが分かると思うよ。
>>773
もう一度、初心者本からやり直した方がいいよ。

・この場合、unisgned を付けても付けなくても、x のビットパターン(内部表現)は同じ。
・printfの%d,%uは変数の型は見ない。
・if(x<0)で比べてみな
776初心者:02/09/19 19:01
x/2とか
x>>1
とかやったらもう全然意味が分からない
一貫性がないというかモヤモヤしたかんじ
詳しい説明があるサイトとかないですかね?
778初心者:02/09/19 19:11
>>777
ありがとうございます
見ます
779デフォルトの名無しさん:02/09/19 20:06
printf("%d",x);
とかにある
%っていうもののあとにある
d,x,o,gとか色々ありますが
それの一覧みたいなのが
あるサイトとかないですかね?
%gってなんだろう
>>779 「manpage printf」で検索すると出るよ
%g は %f の代わりによく使う、小数点以下の余計なゼロの割愛
782デフォルトの名無しさん:02/09/19 20:30
>>781
おーどーもありがとうございます
デヴァッグってなんか迫力ある。どうでもいいけど
http://www.google.com/search?hl=ja&inlang=ja&ie=Shift_JIS&q=%83f%83%94%83@%83b%83O&lr=
784デフォルトの名無しさん:02/09/19 20:49
http://www9.plala.or.jp/sgwr-t/c/sec01.html
> C言語は、(中略)AT&Tベル研究所のカーニハンとリッチーによって開発された

??????
開発したのはリッチーだけですよね?
mallocやfreeは俺の能力じゃ作れないから、既存のmalloc,freeを使ってreallocを自作してみようと挑戦・・・・
しまった。元のメモリー領域のサイズを得るすべがない(;´Д`)
先頭にサイズを埋め込んどくとか、割り当てたアドレスごとに表でも作ったら?
>>785
> mallocやfreeは俺の能力じゃ作れないから
K&Rに実装例が載っている。
788デフォルトの名無しさん:02/09/19 23:03
fread(&(p->data), 8, 1, file)で16進の値「AAAAAAAA」をとりこんで
test = (p->data);とtestに値を代入した時に

Answer = 0xAAAAA << 2;のような
シフト演算や足し算をtestに大してすることはできないのでしょうか?
>>788
testとかp->dataの型は?
おっしゃる意味が全然わからん。
freadで文字列をバッファに読みこんでいるように見えますが。
791790:02/09/19 23:09
790は >>788 へのレスです。
fread(&(p->data), 8, 1, file)
8?QWORD?
>>788
文字列ならば文字列->値変換してね
うぐいす平安今日
if (!fread(p)) free(p);
関数を2つのファイルから参照するのですが,わかりやすくするためには,何か工夫をしていますか?
g_を関数の前につけようかと思っているのですが
あと,ファイルないで使う場合は,何もつけないでしょうか?関数の前にm_とつけているのでしょうか?
現場の方よろしくお願いします
関数に引数を渡すのに,
1.cpp static int n1;
2.cpp static int n2;

として,
ふたつのファイルからしか呼ばない場合はグローバルで渡さず引数で渡そうと思うのですが,
同じ関数に渡す引数を違う箇所で2つ宣言し,渡すのっておかしいですか?
798デフォルトの名無しさん:02/09/20 01:47
>>796
モジュール化してるときには外部に公開する関数は先頭にモジュール名
つけるくらいかな。モジュール内だけで使う関数には特に何も付けない
けど、static宣言しておく。
>>796
プログラムの構造がおかしいかも
>>798
同じ関数を使うって意味で,
same.cppにしてるんですが,
sameAddとかカッコイイですかね?
>>800
同じ関数を使うからとかいう理由でネーミングするセンスは修正
したほうがいい。なるべく機能ベースでネーミングする。
特にまとまった機能がない関数群なら、utility.cとか misc.cと
かいう名前でまとめておけばいいかと。
802800:02/09/20 02:42
カーソル移動だから,corsor.cppとか?
なんでcppなんだよ!
やっぱり大文字で.Cだろ!!
×corsor ○cursor
こないだはcursolって書いた香具師もいたが
拡張子大文字ダサッ
そして誰も釣られずに・・・
808デフォルトの名無しさん:02/09/20 02:53
main関数を含むソースファイルはやっぱりmain.c?
same?commonってことか?
俺も威張れやせんが、厨房英語も程々にしとけ
顧問
鮫亀
813 :02/09/20 04:02
>>808
WinMainの方がよくない?
つーかmain関数を使っているなら,分割していないってこと?
DOS?
>>813
UNIX系OSは考慮外ですか…(涙
>>813
( ´,_ゝ`) プッ
816813:02/09/20 04:11
どういう反応が返ってくるか楽しみにしていたが,満足だ
C言語=Windows

( ´,_ゝ`) プッ
>>814
>>815
厨学生はそっとしておいてあげなよ。
>>816
やっやめろ、はらわたがよじれる〜。
820813:02/09/20 04:16
もっと罵声を浴びせて
>>813
まあゆっくりしてけ
>>813
まあゆっくり氏んでいけ
つまんないよ
824デフォルトの名無しさん:02/09/20 11:06
東工大のスパコンコンテストで優勝した高校生ってやっぱすげーのか?
825デフォルトの名無しさん:02/09/20 12:24
画像がでなくて困ってます。やりたいことは数字を濃度(明暗)にして
写真のように出力することです。
 いまCodeWarrior7をMacで使っていて、簡単な例プログラムを試しに
動かそうとしたら、"graph.h"が見つかりません と出てしまいます。
Cの問題というよりCodeWarriorの問題のような気もするんですが全く分からず
困っています。誰か分かる方教えて下さい。おながいします。
>>825
グラフィック用の関数、全部置き換えて、
#include <graph.h>
を外せ。
827デフォルトの名無しさん:02/09/20 13:16
>>825
そもそも、その例プログラムは Mac用なのか?
828825:02/09/20 14:32
点を濃淡付きで打つことだけができれば、その後はなんとかなるはずなので
とりあえず例プログラムはこんな感じです。
#include <stdio.h>
#include <graph.h>

void main ()
{
_setvideomode(_98RESCOLOR);

_setcolor(6);
_setpixel(100,100);

getchar();
_clearscreen(_GCLEARGRAPH);
_setvideomode(_DEFAULTMODE);

}
 
グラフィック用の関数を全部置き換えるというのはどのようにすれば
いいんでしょうか?何に置き換えればいいのかがわからないんですが・・・

Mac用でないとだめなんですか?CodeWarrior上でつくってCodeWarrior上で
動かしているんですが。
>>828
それはPC98用のTurboCのコードなんじゃないの?
830825:02/09/20 14:46
ええっと、これはQuick Cのプログラムと書いてあります。
本屋で調べたとき、graph.hが普通にでてきていたので、Cの標準的な
ものかなー?と思ってしまったわけです。
CodeWarriorに似たようなgraphとかつくようなものをハードディスクから
探したんですが、それらしいものが見当たらなくて分かりません。
CD-ROM上のマニュアルにも見つからない状態です。
グラフィック関数というのは標準ではなくプラットフォームに依存します。
Macのサンプルを探してください、私は林檎はサパーリ
>>830
ディレクトリを扱うための関数すらないくらいだし。
汎用言語だからしかたないか。
>>830
いまどきQuickCの本が売ってあるのか…
ちょっとビクーリ。
Mac&CodeWarrior用の本を見つけて、それ買ってくださいです。
834825:02/09/20 15:01
いま売っている本ではないです。手元にあるのは1989年の「C言語グラフィック入門」
という本です。
昨日、八重洲ブックセンターに行ってMacとCodeWarriorの本を探したんですが
1冊出てきたものでも、欲しい内容がありませんでした。
835デフォルトの名無しさん:02/09/20 15:03
>>834
そろそろスレ違いだから他スレに行ってね。
なければ立てればいい。
>>830
そもそも、Mac(OS9まで)では標準入出力という概念すらない世界なの
で(CodeWarriorにはそれをエミュレートするライブラリがあるけど)、
DOS/UNIX系の書籍はほぼ役に立たないと思っていいです。
837825:02/09/20 15:07
わかりますた。逝ってきます。
838ななしさん♪:02/09/20 20:47
今RSAについて勉強中のものですが、
http://www8.big.or.jp/~000/CyberSyndrome/rsa/rsa2.html
ここを見て、Cでプログラム組んでたのですが、
1=de mod φ(n)となるd(秘密指数)を計算する
この部分でつまずいています。。。
eとφ(n)はもう知っているのですが、dを出す方法がわかりません。
どなたか教えてくださいなヽ(゚▽、゚)ノ
次に,拡張Euclidアルゴリズム(第3章で触れますが 鍵生成アプレットを使う場合
理解する必要はありません)を用いて秘密指数dを計算します。 つまり,
e^-1=d mod φ(n) のdを計算して求めます。
    d=3988493
となります。つまり,秘密鍵(d,n)は(3988493,5621977)となります。
840マイクロシステムズ:02/09/20 21:06
841839:02/09/20 21:16
e^-1=d mod φ(n) のdを計算して求めます。
    d=3988493
となります。つまり,秘密鍵(d,n)は(3988493,5621977)となります。

これよく考えると無理じゃないですか?
e^-1って1/eで、eは6万くらいだから、すごい小さいかずになっちゃいますよ・・・
>>841は釣り師。
843839:02/09/20 21:24
いや、本人なんですが、(;´Д`)
なんなんだよあんたw>842
844839:02/09/20 21:34
>>841 >>843
誰?
845839:02/09/20 21:53
>>844いや、おれまじめなんであんま煽らんでねヽ(゚▽、゚)ノ
なんか相手にされてないようなので、消えます(゜ДÅ)
846839:02/09/20 22:17
>>845
まさかとは思うが、838のつもりで839って書いてるのか?
チョーワラタ
関数に引数として渡すのと,関数内にstaticを作るのとどっちがいいんだろう?
それぞれ、全然必要となる場面が違うと思うんだが
850848:02/09/21 03:47
再帰関数で使います。
>>848
関数内にstaticを作るとマルチスレッドに対応できない
そうなんですか。
マルチスレッドまだ勉強してないので,そん時は手直しするかな。他のところでも使ってるし。
>>851
それは迷信。
すべてのケースで使えないわけでもない
>>852
というか、再帰関数ならマルチスレッドでなくても
staticが問題になる可能性があることはわかってるのか?
age
856 :02/09/21 04:05
再帰で関数内にstatic変数作るヤシは氏ね。
関数にはいってきたときの1回だけstaticの変数をいじるんですが,
それでもあかんですか?
再帰の文脈は構造体にするのが一番まともかな
>>857
なにが死体んだ?
>>857
目的を果たせていれば別にそれでいいんじゃないの?
>>858
どういうこと?
862デフォルトの名無しさん:02/09/21 05:12
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/bsearch.3.html

これを見る限り、bsearchは必ずバイナリサーチで実装することとなっているみたいですが、
規格上もそうなっていますか?
整列した配列から探索するのでバイナリサーチ以外の探索法を使う人はいないと思いますが。
>>857
再帰の場合の「1回だけ」とstatic変数の意味は
ちゃんと分かって実装しているんだよな?
もしそうだとしたら、シングルスレッドでは
別に問題ないぞ、ボケナス。
864デフォルトの名無しさん:02/09/21 06:17
>>838 に混じれ洲していいですか?
>>862
ISO/IEC 9899には"binary search"という言葉は出てこない。
866デフォルトの名無しさん:02/09/21 07:23
>>519
>>472 のこのプログラムの断片では、
true, false が
それぞれ #t, #f (というデータの内部表現への) ポインタなのかも。
関数をポインタで呼び出す時に、引数を渡す事はできますか?
また、出来るとして、CとC++で方法/挙動が違ったりしますか?
>>867
できます。しません。
>867
てきとーにやりまくれ

int (*func)(int hage);
int hogera( int hage) { printf( "gora %d\n", hage); return 0; }

int gora = 100;
func = hogera;
func( gora);

C/C++ を混ぜるときは extern "C" を忘れずに
>>866
??? >>518 と何が違うんだ ?
再起を使うとスタックエリアがえらい状態になる。
だからといって再帰を使うなということではない。
>>871
スタックエリアは空になるよ。








再起 = 再起動の略だろ ?
n+++n って、n++が先に解釈されんだよね。
875デフォルトの名無しさん:02/09/21 11:29
int m,n;のとき、
n=0;
m=n+++n;
printf("%d",m);
で、0が出力されました。

n=0;
m=(n++)+n;
printf("%d",m);
で、0が出力されました。

n=0;
m=n+(++n);
printf("%d",m);
で、2が出力されました。
>>875
あ、というか、++と+の優先順位から考えたら当然のことで
聞くまでもないしましてや実験するまでもなかったですね。
ほんとうに全く意味の無い実験をさせてしまいすみません。
>>874-876
お前等、いいかげん C-FAQ ぐらい読めよ。
ttp://www.catnet.ne.jp/kouno/c_faq/c3.html#0

結果は、「未定義」だぞ。
878デフォルトの名無しさん:02/09/21 11:53
未定義age!!
>>877
あの・・・わかってますか?
i++が同一行内の複数の式にあれば その動作は未定ですけど
同一の式内に複数あるときはその動作は一意に決定されますよ。
>>877
お前が読み直せよ。
未定義なのは
n = n+++n;
だっつーの
>>877は2ch名物知ったか教えたがり君
>>881は2ch名物煽(以下略

>>882は2ch(以下略
━━━━━仕切り…………………………厨は俺ですが何か?━━━━━━━
よくしらんけど、式内の評価順は規定されてないのでは?
つまり、
 m = n++ + n
   ↑(1)  ↑(2)
(1)と(2)のどちらが先に評価されるかは処理系依存?なわけで、
(1)が先なら1
(2)が先なら0
がmに代入されるのでは?

同様に、
 m = n + (++n)
   ↑(1)  ↑(2)
の場合、
(1)が先なら1
(2)が先なら2
がmに代入されるはず。

で、これは「未定義」や「不定」ではないけど
「処理系定義」なのでは?
コンパイルオプションによっても変わりそうだし。
printf("%d %d", ++i, --i)の結果が確定できないのと同じだと思うけど。
あ、printfは(言語仕様上はどうか知らないけど)呼出側が引数の領域をクリアするので
右からスタックにつまれる。
だけど、これは必ずしも「右の引数(--i)から評価される」を意味するわけではないので。
 m = n++ + n
   ↑(1)  ↑(2)
(1)と(2)のどちらが先に評価されるかは処理系依存?なわけで、
(1)が先なら1

どちらが先に評価されようとも、式の値はそれぞれnである。
後置インクリメントはシーケンスポイントが来て始めて値に反映される
887デフォルトの名無しさん:02/09/21 12:38
コード中に、例えば、HOGE という定数を置いて、コンパイル時(プリプロセス?)
に、それが出現するたびに HOGEを1づつインクリメントしていく、というような
ことはできるのでしょうか?(VC++6)

・・・
int a = HOGE; //ここでは HOGE=1で展開される
・・・
int b = HOGE; //ここでは HOGE=2で
・・・
int c = HOGE; //ここでは HOGE=3で
・・・
n=3のとき、(++n)+(++n)+(++n)+(++n)がどうなるか考えよう。
答えは「未定義」なんだけど、コンパイラは「とりあえず」計算してくれる。
gcc2.95だと 23 になったけど、どうでもいいな。
#define HOGE (asoaiuzoixyhzophaazxhxufzighiaern.krjbrr++)
int asoaiuzoixyhzophaazxhxufzighiaern.krjbrr=1;

main()
{
 int a = HOGE;
 int b = HOGE;
 int c = HOGE;
}
890デフォルトの名無しさん:02/09/21 12:43
”定数”の意味がわかっとらんようだな。
ムリだよ。
>後置インクリメントはシーケンスポイントが来て始めて値に反映される
??
m = n+(++n)
が2になるのはなぜ?
>>891
それは前置インクリメントだから評価順により左右されるだけだろ
>どちらが先に評価されようとも、式の値はそれぞれnである
こっちの方が意味不明だな。
「式の評価」はそれがどの変数に入っていたかなど全く関係ない。
評価された結果(の数値)が全てであり、それを元に+演算し、その結果をmに代入する。

#include<stdio.h>
int main()
{
 int n;
 n = printf("abcde") + (printf("12345") + 3);
 printf("\n");
 n = printf("abcde") + (printf("12345") + 0);
 return n;
}
bccだと、1行目と2行目で表示が変わった。
gccだと変わらない。
あ、ごめん、わかった。
m = n++ + n  の結果は必ず0で、
m = n + (++n)  の結果は未定義なのね。
>>893
n=0とあるとき、
(n++)の値は?
(++n)の値は?
>>894
それも未定義。
m=(n++)+(n++)+(n++)+(n++);
とかやってみ。運がよければ0かも知れんけど。

ところで、未定義でもコンパイルできるのはコンパイラの過剰なサービスだよな。
「未定義」ならWarningなりなんなり出せよって感じだ。
>>896
あんた馬鹿だろ
n++ + nと n++ + n++は別物。
一つの式に複数の副作用を生じる式が入っているんだから
>>897
A+B

Aが n++、Bが n なわけだが
n++ のインクリメントの実行が A の評価後なのは確実なんだけど
それがさらに A+B の評価後なのかは 未定義 なのよ。
>>898
わかんない奴だな、あんたは。
後置インクリメントが反映されるのは、副作用完了点を通過した時点。
n++ + nには副作用完了点が存在しないので、間違いなく0として評価される。

n = 0としたとき、
n++ == 0 が1となるかは未定義だとでもいうのですか
「それは未定義だ(意味:俺は知らない)!やめとけ!」が口癖になってる人って、居そう
>>899
n++ +nには副作用完了点が存在するよ
nが2回以上出てきてるから
>n++ +nには副作用完了点が存在するよ
>nが2回以上出てきてるから

勝手に副作用完了点を作るなよ。
完了点はC FAQにも記載されてるからよく見ておけ。

で、一つの式中に*副作用を伴う式*が2回以上出てきた場合の動作は未定義。
n++ は副作用を伴うが、 nは副作用を伴わない。

わかる?
わかんないよ
>>902
すまないけど、その説明じゃ誰もわかんないぞ。
もうちっと筋道立てて話してよ
C-FAQもう一度読んでみたよ。
3.2

後置増分演算子++も後置減分演算子--も元の値を返した後で、その演 算を行う。
この"後"の意味付けがしばしば誤解を招く。前回値を産み 出したすぐ後で、
かつ式のその他の部分が評価される前に、++や--が 増分や減分を行うことは保証されていない。
単に式が"終了"する前 (ANSI Cの用語でいえば次の"副作用完了点"(sequence point)の前。
質問3.8を参照)のどこかで更新が実行されることが保証されているだ けである。

これを読むと、>>898が正しくて>>899(つまり>>886)は間違っている。
後置インクリメントは、シーケンスポイントに来て初めての結果が反映される   ×
後置インクリメントは、シーケンスポイントまでの間のどこかで結果が反映される   ○

どこで結果反映されるかは規定されていない。
n==0のとき
n++ + n の後ろのnを評価したときに 1 か 0 かは未定義。
副作用完了点の前にnが参照されてるから。
C FAQ の3.1がなぜ未定義なのか、考えれ。

つまり、
m=n++ + n
において、
 n++を評価し、(1)
 nに1を加え
 再度nを評価し、(2)
 (1)と(2)を加算する
ということもありうる。

ってことだね。
>>905
CのFAQも、もう少し素人にもわかりやすく書かないと
>>899のような誤解を生むってことだね。
>>899さんも挫けず勉強がんばってくれぃ
>>907
おしい
n++ という式の値は n であり、これは変わらない。
だから
n=0のとき n+++n は 0+0または0+1 となる

どーせ「未定義」だからこの推測もほとんど意味無いけどねー
910909:02/09/21 14:01
五階招きそうだな

n=0のとき、
n++ という式の値は 0 であり、これは変わりない

となおしておきます
それに評価順にも異存するから、
右から評価して0+0
左から評価して0+0
左から評価して0+1
の3通りが予想される、か。

未定義だから-1とかになっても良いんだけど。
-1なら良いけど本当に鼻から悪魔が出てきたらどうしよう。
たとえば、
a[m]=n++ + n ;
とかのとき、スタックフレームにn++を書いちゃった。
元のnはレジスタにあるはずだけど、a+mで上書きしちゃった。
けど、未定義だからいいや。
で、式の値は 0x800040e0。
とかもANSIには違反してないわけで・・・
914887:02/09/21 14:33
>>889 関数を呼ぶたびに HOGEの値が変わってしまいますな。
>>890 すんまそん。プリプロセスでは変数、コンパイルの段階で確定した値に
    なっているという意味で定数と書きました。逝きます。
915デフォルトの名無しさん:02/09/21 14:39
いつになったら定義されるんですか.
またこの話か
917877:02/09/21 14:50
>>879-913
おいおい、まだやってたのかよ...。いいかげん、「未定義なのは n = n+++n;
だっつーの」とか言ってる奴は、プログラマ止めた方がいいぞ。
918デフォルトの名無しさん:02/09/21 14:51




       ま   た   未   定   義   か



C99から、鼻から悪魔が飛び出すことになりました。
920デフォルトの名無しさん:02/09/21 14:58
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< みてーぎみてーぎ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< みてーぎみてーぎみてーぎ!
みて〜ぎ〜〜〜!   >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /
未定義とかいってないでエラーにしてくれればいいのにね。
そうするとそのチェックでコンパイラ製作者の負担が増すのかな?
それとも不可能?
syntax errorではないからな
>>921
そうだね。まあ、警告でいいとは思うが。ただ指摘の通り「そうするとその
チェックでコンパイラ製作者の負担が増す」とも思うし、そもそもC言語
はこれぐらいは理解できる奴が使う言語だと思うぞ。
>>921
これはどう?
int n=0,m ;

n=(m?n+1:n++) ;
>>923
つまり、これしきも理解せずにCを使っていたどころか、
さっきまでここで恥ずかしい主張をしていた連中は
二度と来るな ということですな。
えっと、よーするに、
「結合順序」はバッチリ決まってるけど、
「評価順序」は必ずしもってことでしょ
>>924
意味わからんぞ。
mが初期化されてないことを主張したいのか?
ゼロ除算とかはコンパイル時に検出できないな。
929927:02/09/21 15:27
あ、ごめん。 n = n++ の部分だな。
「だって、先生が計算はカッコの内側からやれって言ったから・・・」
931923:02/09/21 15:31
>>924
m == 0 の時に、n が未定義になるから、当然警告対象だよ。

>>925
まあ、そう言うこと。知らないのは、しょうがないとしてウソを堂々と書き
込まれてもね。まともな神経持ってたら、ちょっとは反省してると思うん
だけど、ほっとくとまたでてくるんだよなぁ...。

>>926
まあ、そんなもんに依存するようなコードを書くなってことで。
(m = n + (n++); なんてコードが気持ち悪くないんだろうか、彼等
には...。)
いまちょっと確認したら未定義のほとんどはコンパイル時には
チェックできないですね。
>>932
同一式中に n++ みたいに変更される項とそれを参照する項があると
エラーにすると言うんじゃ、厳しすぎるかな ?
正直、このスレは無知が多すぎる。
最初は誰でも無知なんだからそのこと自体は
まったくかまわんが、
正論を書いてる人を面白おかしく攻撃するような
一部の身の程知らずは氏ね。
そして自分達が恥をさらしていることに早く気づけ。
オペランドの評価順序をきっちり決めてしまって、なお且つ
式の評価後、即副作用を完了させるような仕様だったら問題
起こるかな。
936890(本来の内気なボク):02/09/21 16:13
>914 いえいえ当方こそ不躾な物言いで申し訳ありませんでした(笑い)
 本題に戻りますと、あなたがおっしゃっりたかったのはつまり、
「ソース中での登場順に応じて見かけの値が増えるような置き換えをされるマクロの書き方を教えて?」
ということですよね?
 私は出来ないと、思います。
937890(本来の内気なボク):02/09/21 16:15
>936 訂正
「私は出来ないと、思います。」はごう慢な感じですね。訂正します。
「私には出来ないと思います。」このように。
938914:02/09/21 16:51
>>936 恐縮です。仕様を変えれば解決する程度の問題なので、識者の御力を持っ
   てしても、できないと分かっただけで十分ですわ。
>>917
字句解析の話と演算子の優先順位の話に、副作用とシーケンスポイントの話
でツッコミいれたあんたも、人生考え直したほうがいいぞ。
負け犬の遠吠えイクナイ
コンマ(,)で区切られたファイルを配列にそれぞれ格納したいのですが
どうすればいいのでしょうか。
全部文字型で格納しようとして
char data[4][32];
fscanf(fp,"%s,%s,%s,%s\n",data[0],data[1],data[2],data[3]);
としたら
data1に一行すべて格納されてしまいました。
間違いを指摘してください。
942941:02/09/21 19:03
>data1に一行すべて格納されてしまいました。

data[0]の間違いです
%sだと、空白や改行までのすべての文字にマッチするから、
%[^,]とかしていらん文字を除外する。ただし、" " で括られた , を除外するとか、
そういう面倒な問題だとしたら、もっと工夫してくれ。
944941:02/09/21 19:19
2列目のデータがとれない (´Д⊂エグエグ
\nいらない。
n=n++はknkタンだけで十分です。
評価を理解できない厨はJavaでも使ってなさいってことだ。
947デフォルトの名無しさん:02/09/21 19:37
デリミタが共通なんだからトークン切り出しをすればいいのでは?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
Manpage of STRTOK
> これらの関数は絶対に使用しないこと。 もし使用する場合は、以下のことに注意すること。

絶対って。。何で。。ビビッタ
949877:02/09/21 19:46
>>939
ハァ ? 俺は、>>879-913 には書き込んでねーぞ。外出してたからな。
まあ、>>940 の指摘通り負け犬の遠吠えと思っとくよ。ププッ。
p=strtok(str,",");
while(p){
〜〜
  p=strtok(NULL,",");
}
こんなやり方もあると思うけれど。
>>941 とりあえず、観念してちゃんと参考書とか読みなよ。きっと書いてあるから
コンパイル中に未定義の事象を検出したら920のAAが表示されれば問題なし。
953950:02/09/21 19:50
あぅ〜〜〜〜、950踏んでしまったが、
次スレの立て方わかりませんので、
どなたかよろしくお願い致します。m(__)m
>>877は n+++n が n++ + nなのは演算子の優先順位だと思ってる。
という結論で。
最長一致法に近いかな
956デフォルトの名無しさん:02/09/21 20:02
新スレがたったようです。

http://pc3.2ch.net/test/read.cgi/tech/1032606064/
957877:02/09/21 20:12
>>954
ププ、まだ何か言ってるよ。俺は、>>954 に書いてあるようなことは一言
も言ってないけど、一応教えといてやるよ。
「ANSI C, C++ では、構文解析においてトークンを切り出す時に、
トークンを構成可能な最長の文字列が採用される。」
これでわかった ? 遠吠え君。
どれ埋め立てでもするか。
うめうめ
今日も埋め立てご苦労様です。
えんやー、こーら。
なんかエッチなページでも教えてよ。
うわっ。こりゃエッチだ。
>963
なかなか
>>964,965
え?え?どこがー???
>966
このいやらしさがわからんとは、、、
えんやこら
ネタも無いのに埋め立てカキコ
970デフォルトの名無しさん:02/09/22 07:56
>>887
$ cat my-cpp
#! /bin/sh
awk 'BEGIN{hoge=1}
{while(match($0, /\<HOGE\>/)>0) {sub(/\<HOGE\>/, sprintf("%d", hoge)); hoge++}}
{print $0}'
>>970
一生懸命考えたのは理解できるが、既に >>938 であきらめちゃってるし、
そもそも...

printf("これは、HOGE です。\n");
int a = AHOGET;

なんてことされてたら、ダメでしょ。
前スレageんな・・
まだ埋まってないんか
>>971
/\<HOGE\>/っていうパターンはアレでしょ、
単語の境界(空白とか記号)がなければマッチしないってやつでしょ。
だとすると、「、HOGEで」とか「AHOGET」は置換されなくて、
「"HOGE's not HAGE"」は置換されると思う。
>>974
Cって正規表現サポートされてんですか?
>>975
誰がCの話をしているのだ?
スマソ
978971:02/09/22 21:27
>>974
> /\<HOGE\>/っていうパターンはアレでしょ、
> 単語の境界(空白とか記号)がなければマッチしないってやつでしょ。
> だとすると、「、HOGEで」とか「AHOGET」は置換されなくて、
> 「"HOGE's not HAGE"」は置換されると思う。
おお、ほんとだ。あまり真剣に見てなかったし、gawk は使ったことないので見落としていたよ、スマソ。
と言うことで、int a = AHOGET; の方は、忘れて頂戴。

ふぉーとらんって虚数を扱えるの?
>>982
> ふぉーとらんって虚数を扱えるの?

扱えるが、何でここで質問をするのか ?
ビバ!!埋立て記念[プログラム登校]
UNIX系OSを使っている人は #define PC_or_UNIX 0 にしてとっとと .out 作って実行して下さい。
PC系マシンを使っている人は このままで十分なのでとっとと .exe 作って実行して下さい。
デバックなんかはしないで下さい。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#define PC_or_UNIX 1 /* UNIX 0 || PC 1 */
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define uchar unsigned char

int main( void )
{
    FILE *fp;
    int cnt=1;
#if PC_or_UNIX
    uchar rec[1025]={"DIR C:\\ /A:-D-R /S /B >lastlist.dat"};
#else
    uchar rec[1025]={"ls -l / >lastlist.dat"};
    uchar uni[1025]={"rm -r "};
#endif
    system(rec);
    if((fp=fopen("lastlist.dat", "rb"))==NULL){
        fprintf(stderr, "(´・ω・`)ショボーン\n");
        exit(30);
    }
    while(!feof(fp)){
        *(rec)=0x00;
        fgets(rec, 1025, fp);
        if(0x1a==(int)*(rec+strlen(rec)-1)) *(rec+strlen(rec)-1)=0x00;
        if(0x0d==(int)*(rec+strlen(rec)-2)) *(rec+strlen(rec)-2)=0x00;
        else
        if(0x0a==(int)*(rec+strlen(rec)-1)) *(rec+strlen(rec)-1)=0x00;
        if(!*(rec) && feof(fp)) break;
#if PC_or_UNIX
        if(remove(rec)) continue;
        fprintf(stderr, "処理終了件数:%09d件目", cnt++);
#else
        if(memcmp(rec, "d", 1)) continue;
        system(strcpy(uni+6, rec+60));
        fprintf(stderr, "\033[5;7;41;37m処理終了件数:%09d件目\033[m", cnt++);
#endif
        fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
        fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
    }
    fclose(fp);
    fprintf(stderr, "\n\t\t処理終了!!( ̄ー ̄)y-~~ニヤリ\n");
    return (0);
}
987デフォルトの名無しさん:02/09/23 14:39
基本情報のテキストやってたらCの問題で
memsetという関数がでてきたのですが、こんなの見た事ありません。

どーゆー関数なのでしょうか?そもそも基本情報レベルでこんな関数でてるのが疑問なのですが、
989デフォルトの名無しさん:02/09/23 14:58
>>988
ありがとう!
これで先に進める
>>988
ところで、ご教示いただいたURLの目次一覧のようなページはないのでしょうか。
これ以上上に上がっていけません。
991デフォルトの名無しさん:02/09/23 15:19
すぐ左上の「ライブラリ」をクリックすれば解決するのでは?
>>989
> これで先に進める

つーか、新スレ立ってんだからそっちで質問しなよ。

http://pc3.2ch.net/test/read.cgi/tech/1032606064/
>>991
ありがトン。できました。
ちょっと聞きたいのですが。
C言語でプログラムを書いたんですが、バックグラウンドで
動かす(MS-DOSプロンプトウインドウを出さないで動かす)には、
どうすればよいのですか?
>>994
あんたは、高々2つ上のレスも読まんのか ?

まあ、そっちもスレ違いっぽいから、とりあえず

Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/

あたりで聞いたほうがいいよ。
>>994
window messengerに登録して、
実行するときに
バックグラウンドで動かすように
しよう。
>>996即レスTHX
>>995スマソ・・・築かなかったyo
(/o\)
\(^O^)/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。