08/09/15 12:43:24
>>2
それをその速さで貼れるってことは
お前それをコピってずっと待機してたんだろ?
リロードしまくって。誰かスレ立てるの待って。
まじきめーな。氏ねよハゲ。z
3:デフォルトの名無しさん
08/09/15 14:45:56
i=i++; は未定義だけど
i=++i; も未定義なの?
4:デフォルトの名無しさん
08/09/15 14:53:15
はい
5:デフォルトの名無しさん
08/09/15 16:21:12
>>3
二つの副作用完了点の間で同じ値(この場合i)を二度変更しようとする試みは全て未定義とされている
6:デフォルトの名無しさん
08/09/15 16:34:28
>>5
ってことはa = i + i++はおk?
7:デフォルトの名無しさん
08/09/15 17:24:29
>>6
あんたは、一つの法律で禁止されていないことは全て合法だとでも言い出すのか?
8:デフォルトの名無しさん
08/09/15 17:49:15
授業で幾つかプログラムを作成しているときにa++;とa=a+1;があったのですが、両方同じ意味ですよね?
使うときはどちらが便利なのでしょうか?
9:デフォルトの名無しさん
08/09/15 17:53:17
++a;
10:デフォルトの名無しさん
08/09/15 18:11:58
>>8
Cで、a=a+1はありえない。
11:デフォルトの名無しさん
08/09/15 19:39:58
>>8
ループなんかでカウンタとして使ってるなら++を使え。
あとで足す数が変わる可能性があるなら+を使え。
12:デフォルトの名無しさん
08/09/15 19:46:39
+=ですね。a=a+1はぜんぜんダメ。
13:デフォルトの名無しさん
08/09/15 19:51:35
わかればどれどもいいよw
14:デフォルトの名無しさん
08/09/15 19:57:45
いや、さすがにa=a+1はないだろ。
15:13
08/09/15 20:01:32
a=a+1
書き方をするやつにあれこれCの記述を伝授するのが面倒。
動くんだしいいよ。
+=とかおしてて「なんでなんで?」で時間食うのがもったいない。
16:デフォルトの名無しさん
08/09/15 20:01:50
どれでもいい。
17:デフォルトの名無しさん
08/09/15 21:44:30
まったく同感。どれでもいい。
18:デフォルトの名無しさん
08/09/15 21:57:19
文法に違反していない以上、どれを使うかは習慣の問題だね
仮に識別子の数が問題だとしても、算出元と変更先を両方同じものに書き換えるときに便利なのか、
片方だけないしそれぞれ別のものに書き換えるとき便利なのかの違いでしかない
まあ俺は++使うけど
19:デフォルトの名無しさん
08/09/15 22:06:09
まあ、でも、a=a+1はダメだな。
++か+=かってのは、状況にもよるけど。
20:デフォルトの名無しさん
08/09/15 22:23:45
C++で演算子のオーバーロードも考えてコードを組むとなるとまた厄介な話になる。
21:デフォルトの名無しさん
08/09/15 22:33:25
C++ くさい C も、Verilog-HDL くさい C も、きんもー
22:デフォルトの名無しさん
08/09/15 22:57:08
文脈による。
確定的にaに1加える場所なら++を使う。
aに何か加えることが確定的で現在その値が1なら+=を使う。
単に現在aの新しい値が元のaから算出されるだけなら= +を使う。
23:デフォルトの名無しさん
08/09/15 23:10:46
C++ とか言うけど、オーバーロード的に考えて ++C の方が効率いい場合が多いんだよな。
イテレータとか。
24:デフォルトの名無しさん
08/09/15 23:20:27
a=a+1 はなぜ駄目なのでしょうか?
25:デフォルトの名無しさん
08/09/15 23:29:50
気分的にです
26:デフォルトの名無しさん
08/09/15 23:30:48
オーバーロードされていた際にコスト高だな。→ a=a+1
27:デフォルトの名無しさん
08/09/15 23:38:57
スレ違いだし。
28:デフォルトの名無しさん
08/09/15 23:49:36
>>24
より良い書き方とされるa += 1、さらに良い書き方とされるa++と++aが存在するから。
29:デフォルトの名無しさん
08/09/16 00:02:03
>>24
別にダメではない
嫌う人間が多いだけ
30:デフォルトの名無しさん
08/09/16 00:08:49
一目見てaに1を足してるって分からないから
まぁ同じ意味だし、好みの問題とは言うけど、読みやすさとか考えるとやっぱり a+=1, a++, ++a の方がいいと思う
31:デフォルトの名無しさん
08/09/16 00:12:47
タイプ数的に++aが楽でいい
それくらいの違いしか無い
32:デフォルトの名無しさん
08/09/16 00:23:31
a=a+a, a+= 1, a++の好みなんかよりもっと重要なものがある。
33:デフォルトの名無しさん
08/09/16 00:55:28
セミコロンか。
34:24
08/09/16 01:29:45
たくさんレスいただきありがとうございます。
ソースレベルでのわかりやすさ・なじみやすさ・効率が
主な理由だと理解しました。
>>26 さんの回答は、実行ファイルになった段階でも
場合によっては違いが出てくるとおっしゃっているようにも思えますが、
正直いまの私には十分には理解しきれませんでした。
35:デフォルトの名無しさん
08/09/16 01:52:25
おまえらほんとどうでもいい事だとスレ伸びるよな
36:デフォルトの名無しさん
08/09/16 02:15:26
26さんの回答はC言語の範囲じゃないから気にするな
37:デフォルトの名無しさん
08/09/16 03:42:47
> a=a+1
ソースコードに何回も同じことが重複して登場するのは悪
だから a+=1 か a++ にしる!
38:デフォルトの名無しさん
08/09/16 15:02:53
memcpyはどうしてあんなに速いの?
39:デフォルトの名無しさん
08/09/16 15:11:49
>>38
そう作られているから。memcpy()と言う関数の振りをしているが、
その実体がCの関数かどうかは実装依存。
逆に言えば、コンパイラベンダが鎬を削るポイントでもある。
40:デフォルトの名無しさん
08/09/16 15:21:04
>>38
CPUは一発でデータをブロック転送できるから。
古いCPUだとブロック転送するよりスタックにいれられるだけいれて並べてくほうが速かったりすることもあるけど、
いまどきブロック転送の方が速い。
41:デフォルトの名無しさん
08/09/16 20:04:20
>>24
1) lpMetSect->lpSharedInfo->lAvailableCount--;
2) lpMetSect->lpSharedInfo->lAvailableCount -= 1;
3) lpMetSect->lpSharedInfo->lAvailableCount = lpMetSect->lpSharedInfo->lAvailableCount - 1;
(3)は左辺と右辺を見比べて、同じ変数かどうか確認しなきゃならないだろ。
42:デフォルトの名無しさん
08/09/16 20:06:54
>>39
実装依存って言えばそうかもしれんけど、それ言ったら、標準関数全部そうだろ。
43:デフォルトの名無しさん
08/09/16 20:07:53
>>41
そんなもん間違うようなやつはそもそも1個でも間違うよ
44:デフォルトの名無しさん
08/09/16 20:16:24
>>43
読みやすさだよ。
45:デフォルトの名無しさん
08/09/16 23:49:55
私が今作っている関数popは通常intを返すが、返すべき値が見つからない場合NULLを返します
しかし私の使っているコンパイラではNULL == 0は真になるので
popの返り値がNULLであるか、0であるかを判別することができません
エラーチェックのために新たに変数を設ける以外の解決法があったらぜひご教示願います
それにしてもなぜこのコンパイラにはNULL == 0が真になるなどという奇怪な仕様が採用されたのでしょうか?
まったくもって不愉快で、理解に苦しむ仕様です
46:デフォルトの名無しさん
08/09/16 23:56:54
引数の一つを書き換える関数にして
戻り値のほうはリターンコードだけにすれば?
47:デフォルトの名無しさん
08/09/17 00:12:44
>>45
NULLはポインタが無効である(いかなるオブジェクトも指示していない)ことを表すために使うものだから、
そもそもintなどポインタ型と併用することを考慮されていない。コンパイルエラーになる処理系も存在する。
一般的には、>>46のいうように引数で返すか、
あるいは本来の戻り値と可否の2つを構造体でまとめるなどという方法を取るしかない。
よその言語では、こういう用途にもNULL(あるいはそれに相当するもの)が使えるものあるんだけどね。
48:デフォルトの名無しさん
08/09/17 00:21:42
>>45 NULL == 0が偽になったら、それこそ大変
49:デフォルトの名無しさん
08/09/17 00:24:43
可変個引数の引数リストってメモリ上にならんではいってるの?
ポインタで移動できるみたいだから、そう思うんだけど。
50:デフォルトの名無しさん
08/09/17 00:28:32
void push(int val);
int pop(void);
のほうが体裁がいいんだろうな。
それだったら
int isempty(void); /* 0以外: スタックが空 0:スタックが空でない */
を作ってそれでチェックするというのもあり。
if (!isempty()) {
val = pop();
}
51:デフォルトの名無しさん
08/09/17 00:33:36
>>49
そうでないといけないという決まりはないが、そうなっていることが多い。
というかそういうやつでは、可変個でないやつも同じように置かれていて、
その配置を応用しているという作りになっている。
52:デフォルトの名無しさん
08/09/17 00:37:32
あるいはintより大きな整数を返す関数にして、エラー値としてintに収まらない数を返す
53:デフォルトの名無しさん
08/09/17 01:12:51
>>52 ???
54:デフォルトの名無しさん
08/09/17 01:22:17
>>53
「charより大きな整数を返す関数にして、エラー値としてcharに収まらない数を返す」
と同じ。
55:デフォルトの名無しさん
08/09/17 01:28:16
charはint幅でやりとりするけど、それと一緒にしてはいかんよ
56:デフォルトの名無しさん
08/09/17 01:30:43
>>46でいいだろ。
57:デフォルトの名無しさん
08/09/17 01:33:11
>>41
4) --lpMetSect->lpSharedInfo->lAvailableCount;
これも追加しておいてくれお
58:デフォルトの名無しさん
08/09/17 02:19:06
lpMetSect->lpSharedInfo->lAvailableCount += -1;
59:デフォルトの名無しさん
08/09/17 03:00:01
>>50
スタックを構造体で定義して、push, pop, isemptyの引数として渡したいな。
同時に複数のスタックが使えるようになるし。
60:デフォルトの名無しさん
08/09/17 10:47:38
そこまでいくと、C++でやれって感じになるが。
61:デフォルトの名無しさん
08/09/17 11:46:15
すみません、どうしても解らなくて><
#include <stdio.h>
int main(void)
{
int c;
while(c = (getchar() != EOF)) {
printf("%d", c);
}
printf("%d", c);
}
このプログラムで、EOF以外を打つと「11」と、「1」二回繰り返されているようなんですが、
なんで繰り替えすのですかね?
c = (getchar() != EOF)←のような条件自体初めての形ですので動きが解らなくて><
62:デフォルトの名無しさん
08/09/17 11:52:33
改行文字だな
63:デフォルトの名無しさん
08/09/17 11:53:08
while(c = (getchar() != EOF)) {
printf("ループ内 %d", c);
}
printf("ループ外 %d", c);
}
64:デフォルトの名無しさん
08/09/17 11:54:20
ごめん違うわ
cに名に入れたか考えてみろ
65:デフォルトの名無しさん
08/09/17 11:58:48
>>63
いや、ループは抜け出してないから、ループ内のprinftが繰り返されてるみたいなんですよ。
>>64
getcharでaを入力したとしたら、cには1が入りますよね?
ってことは1を一回表示したら、またgetcharで入力待ちになると思うんですが……二回繰り返した後に入力待ちになってるんです><
66:デフォルトの名無しさん
08/09/17 12:04:22
自分で書いた汚いCコードを読み込んで綺麗に整形して出力してくれるアプリってないの?
67:デフォルトの名無しさん
08/09/17 12:06:26
>>65
改行も1文字分
68:デフォルトの名無しさん
08/09/17 12:12:08
インデント+α程度の整形ツールならあるけど
69:デフォルトの名無しさん
08/09/17 12:13:37
>>62
>>65
なるほど、やっと理解できました!
でもgetcharは一文字入力なんですよね?
なんというか根本が解ってない感じだw
んー、まずaでループに入り1を出力、次に改行文字でループに入り1を出力……ってことですかね?
70:デフォルトの名無しさん
08/09/17 13:02:33
まぁ、そんなとこだね。
「次に改行文字でループに入り」というよりは、
「次に得るのが改行文字なのでループから脱出せずに」だけれど。
71:デフォルトの名無しさん
08/09/17 13:13:40
入力が行単位でバッファリングされてるとわかりにくいかも
打った文字はEnterを打つまで入力されない
Enterを打つと打った文字+改行が入力されて、getcharでそれを1文字ずつ取り出せる
72:デフォルトの名無しさん
08/09/17 13:25:23
'a'と'\n'の値が両方1ってどんな処理系だよ
73:デフォルトの名無しさん
08/09/17 13:27:06
>>72
74:デフォルトの名無しさん
08/09/17 13:28:03
>>72
75:デフォルトの名無しさん
08/09/17 13:29:13
>>72
ちゃんと元のコード読め
76:デフォルトの名無しさん
08/09/17 13:29:21
畜生見間違えた
そこに括弧ついてんのかよ!
77:デフォルトの名無しさん
08/09/17 13:34:13
……カッコ悪い
78:デフォルトの名無しさん
08/09/17 13:34:39
>>76
ドンマイ!
79:デフォルトの名無しさん
08/09/18 01:15:59
>>8
微妙に意味がちがう。
a = 1;
b = ++a;
b = a++;
では結果がちがう。
func ( a++, a+1, ++a)
のとき、funcの引数がどんなになるか挙動不明。
80:デフォルトの名無しさん
08/09/18 01:23:59
>>79
単体で使った場合を聞いてたのにいまさらなにをw
しかも後半は引数がどうなるか不明つーより未定義動作じゃねーか
81:デフォルトの名無しさん
08/09/18 07:41:19
バイナリファイルを直接数字に変換する方法はどうすればいいのでしょうか?
rubyではunpack("s*")を使うのはしってるんですけど。
82:デフォルトの名無しさん
08/09/18 07:52:47
>>81
rubyのunpackは変換が目的だから、Cの場合はその必要が無い。
例えば、(今ぐぐって見つけた)リファレンスマニュアルの例だとこうなる。
unsigned char foo[] = {1, 2, 0376, 0375};
unsigned short * bar = (unsigned short *) foo;
printf("%u, %u\n", bar[0], bar[1]);
83:デフォルトの名無しさん
08/09/18 14:27:04
URLリンク(www.vipper.org)
すみません、なんでこのプログラムはEOFを入力すれば終了するのでしょうか?><
84:デフォルトの名無しさん
08/09/18 14:35:22
>>83
!= EOF が偽になって getline が 0 を返すから > 0 が偽になって main を抜けるのでは?
85:デフォルトの名無しさん
08/09/18 17:36:33
Cでは0xffのように16進数を使用できますが、2進数は使えますか?
86:デフォルトの名無しさん
08/09/18 17:44:22
>>85
使えません
87:デフォルトの名無しさん
08/09/18 17:46:51
あたかも2進数記述しているようにみえるマクロならある
88:デフォルトの名無しさん
08/09/18 17:48:51
>>86-87
ありがとうございました
89:デフォルトの名無しさん
08/09/18 19:09:38
インクルードについて教えてください。
あるサンプルソースコードを入手して、
~~.slnを実行して、デバッグしたら動きました。
ファイル入出力をしようと思って、
メイン関数が書いてある.cファイルで#include <iostream>とすると、
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(35) : error C2059: 構文エラー : ':'
1>c:\program files\microsoft visual studio 8\vc\include\cstdio(36) : error C2143: 構文エラー : '{' が ':' の前にありません。
が大量に出てきてしまいました。
インクルードしただけです。
何がいけなかったのでしょうか?
90:デフォルトの名無しさん
08/09/18 19:11:44
すみません、上のものです。
C++なので、スレ違いでした。
去ります。すみません。
91:デフォルトの名無しさん
08/09/18 20:27:31
.cファイルで#include <iostream>
そりゃダメだろ
92:デフォルトの名無しさん
08/09/19 02:10:43
C++でコンパイルするオプション付けりゃいいんじゃん。
93:デフォルトの名無しさん
08/09/19 16:34:15
C言語のコンパイラで質問があります。
WindowsXPで、BCC DevelopperとBorland C++ Compiler 5.5.1を使用しています。
プロジェクトを一つ作り、そのプロジェクト内で複数のC言語ファイルを作成しているのですが、
一番最初に作成したC言語のファイルしか、コンパイル、メイク、実行ができません。
どうすれば他のC言語のファイルをコンパイル、メイク、実行する事が出来るのでしょうか?
94:デフォルトの名無しさん
08/09/19 16:36:57
bcc32 main.c foo.c bar.c
95:デフォルトの名無しさん
08/09/19 16:42:27
それを言うならメイクじゃなくてリンクでは
96:デフォルトの名無しさん
08/09/19 16:45:33
それはC言語の問題でもコンパイラの問題でもなくて、
BCC Developerのプロジェクト管理機能の使い方に関する問題だよな?
97:デフォルトの名無しさん
08/09/19 16:49:56
質問です。
…
int a
if(a)
…
この場合のifの条件aとはどういう意味ですか?
98:デフォルトの名無しさん
08/09/19 16:51:44
if(a!=0)
とまったく同じ意味
99:デフォルトの名無しさん
08/09/19 17:02:27
えー
100:デフォルトの名無しさん
08/09/19 17:06:59
えーといわれても
何が不満なんだ?
101:97
08/09/19 17:16:27
>>98
ありがとうございました。
>>99は僕じゃないですが、ダジャレですかね?w
102:デフォルトの名無しさん
08/09/19 20:22:19
スレが凍りついた
103:デフォルトの名無しさん
08/09/19 23:18:37
ローグってCで書かれてるの?
104:デフォルトの名無しさん
08/09/19 23:25:16
>>103
だよ。
105:デフォルトの名無しさん
08/09/19 23:32:50
そうか、じゃあ俺もCで書いてみようかな
106:デフォルトの名無しさん
08/09/20 02:58:12
int i;
char buf="cjd";
for(i=0;i<buf[i];i++);
上記for文の境界条件はマイナーですか?
107:デフォルトの名無しさん
08/09/20 03:07:02
何をしないのかわからない>>106
108:デフォルトの名無しさん
08/09/20 03:08:48
>>106
文字列の長さだけまわしてるつもりなら、それはおかしいだろ。
109:デフォルトの名無しさん
08/09/20 03:19:36
(・∀・)ニヤニヤ
110:デフォルトの名無しさん
08/09/20 03:40:45
仮に
char *buf = "cjd";
だったしても、そんな書き方するヤツはプログラムやめたほうがいい。
111:デフォルトの名無しさん
08/09/20 04:37:52
Windowsの場合
#ifdef WIN32
#endif
で処理を分岐するんですが
MACは、何を指定すればいいでしょうか?
112:デフォルトの名無しさん
08/09/20 04:45:32
MACの場合に#defineされるシンボル
決まってなければ、自由に
113:デフォルトの名無しさん
08/09/20 05:01:24
知らないなら黙っててください
邪魔です
114:デフォルトの名無しさん
08/09/20 05:02:35
>>113は>>111?
115:デフォルトの名無しさん
08/09/20 05:03:10
禿同
116:デフォルトの名無しさん
08/09/20 05:05:27
>>112みたいな無知ほど書き込みたがる
知らないならすっこんでろっつーの
117:デフォルトの名無しさん
08/09/20 05:12:30
知らないならすっこんでろつうか知っている人いないと思う
そんなもの決め事だから
118:デフォルトの名無しさん
08/09/20 05:13:41
cc -D MACOS 。。。。。
#ifdef MACOS
#endif
119:デフォルトの名無しさん
08/09/20 09:49:46
>>110
K&R、つまりC言語を設計した人にC言語を辞めろと申すか?
120:デフォルトの名無しさん
08/09/20 10:09:36
>>119
いいから見直せ
121:デフォルトの名無しさん
08/09/20 10:09:56
俺には i<buf[i] の意味がわからん。
比較することにどんな意味があるんだ?
122:デフォルトの名無しさん
08/09/20 10:19:19
bufに入っている文字の
(使用中の処理系での)コードとそれが何文字目かということに、
何らかの関係があるんだよ。
123:デフォルトの名無しさん
08/09/20 11:00:24
>>120
すまん早とちりしてた
>>106のおかしなプログラムに対するレスだったのか
124:デフォルトの名無しさん
08/09/20 12:34:34
printf("foo")
は関数で末尾にセミコロンが付くと正確には文になるのですか?
そういった場合printf文というのが適切なのですか?
125:デフォルトの名無しさん
08/09/20 12:39:44
>>124
その通り
正確には単文
Pascalはセミコロンが文と文の区切りに使われるが
C言語はセミコロンは文の終了を表す
126:デフォルトの名無しさん
08/09/20 15:46:13
×単文
○式文
pascal 厨が下手に口を出すからボロが出る
文と複合文はあっても単文はない
127:デフォルトの名無しさん
08/09/20 15:47:28
>>126
馬鹿ですか?
{}で囲まれたのが複文
そうでないのが単文
128:デフォルトの名無しさん
08/09/20 16:00:49
つっこみをよく読めアフォ
129:デフォルトの名無しさん
08/09/20 16:03:28
126==128
お前がアフォ
130:デフォルトの名無しさん
08/09/20 16:05:35
(・∀・)クスクス
131:デフォルトの名無しさん
08/09/20 16:20:47
もう一度言う、「単」文という用語はCにはない
132:デフォルトの名無しさん
08/09/20 16:25:48
C言語 単文 複文 の検索結果 約 619 件中 1 - 30 件目 (0.26 秒)
C言語 式文 複合文 の検索結果 約 162 件中 1 - 30 件目 (0.32 秒)
133:デフォルトの名無しさん
08/09/20 16:27:27
お前らくだらん事でもめないでISO/IEC9899:1999もしくは
JIS X3010:2003の何ページのどこここにあります、ってやってくれ
無駄にスレを伸ばすな
134:デフォルトの名無しさん
08/09/20 16:39:25
>>132
おまえの情報源はそんなものか
お里が知れるな
135:デフォルトの名無しさん
08/09/20 16:41:20
(・∀・)クスクス
136:デフォルトの名無しさん
08/09/20 16:43:07
>>134
お前も煽ってばかりいないで>>133のアドバイスのように
ちゃんと答えてやれ
答えられないと証拠も無いのに、と言われるだけだぞ
137:デフォルトの名無しさん
08/09/20 16:52:58
>>136==125
俺だって、ちゃんと「式文」と教えただろうが無礼者め
138:デフォルトの名無しさん
08/09/20 16:55:05
>>137
それは証拠にならない
規格書のどこに書いてあるか言ってみろ
139:デフォルトの名無しさん
08/09/20 16:56:52
その答えがわかったら、バグが減るの?
140:デフォルトの名無しさん
08/09/20 16:57:54
話を逸らすな馬鹿者
141:デフォルトの名無しさん
08/09/20 16:58:45
(・∀・)クスクス
142:デフォルトの名無しさん
08/09/20 16:59:30
a = 10, b = 10 , c++;
ってあったら文はa = 10, b = 10 , c++でおk?
143:デフォルトの名無しさん
08/09/20 17:00:46
式≠文
式文って式+セミコロンのこと?
144:デフォルトの名無しさん
08/09/20 17:06:44
>>142
厳密には「;」まで含む。
145:デフォルトの名無しさん
08/09/20 17:08:15
規格書にも書いてない造語を勝手に作って人を欺いている
バカがいると聞いて来ますた
146:デフォルトの名無しさん
08/09/20 17:09:50
↑ずっと見てたくせに(プ
147:デフォルトの名無しさん
08/09/20 17:12:07
メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
例えば、以下のようにしても勝手に開放されているように思えるのですが、
これはOSが面倒みてくれている、という解釈で正しいですか?
char *c;
c = (char *)malloc(1000000);
return 0; //開放せずに終了
char *c;
c = (char *)malloc(1000000);
c[1000000] = 'a'; //ここで異常終了
148:デフォルトの名無しさん
08/09/20 17:14:55
>>147
OSによる
これこそ環境依存
149:デフォルトの名無しさん
08/09/20 17:15:32
>>147
大丈夫OSが何とかしてくれる
と思ってて問題ないよ
150:デフォルトの名無しさん
08/09/20 17:17:37
>メモリリークって自プログラムの範囲外まで影響が及ぶことはありますか?
はい
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
いいえ
>これはOSが面倒みてくれている、という解釈で正しいですか?
OSによる
151:デフォルトの名無しさん
08/09/20 17:18:00
おいおいmutex持ったまま強制終了したらOSは面倒見てくれないぞ
152:デフォルトの名無しさん
08/09/20 17:20:34
>メモリリークとは、各プログラムが確保した領域が開放されないままプログラムが終了したときに、
>確保されたまま他のプログラムが使えない領域が残ることだと思い込んでいたのですが違うのでしょうか?
はい
153:デフォルトの名無しさん
08/09/20 17:37:53
このスレは池沼の集まりか
154:デフォルトの名無しさん
08/09/20 17:38:58
そう、お前がその筆頭。
155:デフォルトの名無しさん
08/09/20 17:39:48
winとかunix系とかDOSとか、そのあたりのOSはfree()し忘れても、プロセスが終了するとメモリは開放される。
156:デフォルトの名無しさん
08/09/20 17:45:07
INT 21H, AH=31H
157:デフォルトの名無しさん
08/09/20 18:00:35
まとめると
>>147
にある状況はwindows、unix系ではOSが何とかしてくれる
でもプログラムのやりようによっては解放されないこともある(mutexとかなんとかで)
ってことで大丈夫でしょうか
158:デフォルトの名無しさん
08/09/20 18:00:56
>>148-152,155
ありがとうございます。
常駐するようなもの以外は、それほど過敏になることはないんですかね。
159:デフォルトの名無しさん
08/09/20 18:01:13
>>151
そいつはメモリリークというより、リソースリークじゃね?
閑話休題
mallocだと大体のPC環境だと後始末してくれる処理系になってるけど、
共有メモリとかでリークすると、プロセスが終了しても残ったりすることもある。
160:デフォルトの名無しさん
08/09/20 18:32:09
>>138
Cに規格書はない
もしかして規格票って言いたかったのか?
161:デフォルトの名無しさん
08/09/20 18:34:53
↑馬鹿
162:デフォルトの名無しさん
08/09/20 18:44:55
JISでは規格票が正式名称だが、ISOやANSIのものは規格書と呼んでなんら問題ない。
163:デフォルトの名無しさん
08/09/20 19:04:02
ISO や ANSI のどこに「規格書」って書いてあるんだよ? 確か英語だったはずだが・・・
164:デフォルトの名無しさん
08/09/20 19:08:24
>>121
某エディタのソースコードにあって、
文字列か文字の幅を返す関数にそのfor文が使われていました。
165:デフォルトの名無しさん
08/09/20 19:11:06
>>163
単なる和訳だろ。
166:デフォルトの名無しさん
08/09/20 19:20:07
>>164
それはない
167:デフォルトの名無しさん
08/09/20 19:20:40
>>163
英語のものを日本語で呼んではいけないのか。
168:デフォルトの名無しさん
08/09/20 19:26:05
>>167
非標準の邦訳が通じなければ説明責任はそれを言った者にある
ただし別にわかってやれたからって、こちらに利益はないので説明がしたければどうぞご勝手に
169:デフォルトの名無しさん
08/09/20 19:27:28
>>166
ちなみに
DWORD CMyEdit::GetTextWidth(LPCWSTR pstr)
{
DWORD i,n;
for(i=n=0;i<pstr[i];i++){
if(IsMB(pstr + i))n+=2;
else n++;
}
return n;
}
170:デフォルトの名無しさん
08/09/20 19:28:14
以上、馬鹿の負け惜しみでした。
171:デフォルトの名無しさん
08/09/20 19:31:09
「単」純バカのな
172:デフォルトの名無しさん
08/09/20 19:32:22
>>169
「文字列か文字の幅を返す関数」ではないな
173:デフォルトの名無しさん
08/09/20 19:37:49
>>169
i<pstr[i] じゃなくて pstr[i] になってない?
174:デフォルトの名無しさん
08/09/20 19:40:40
>>169
誰がそんな糞コード撒き散らしてんだよ
175:デフォルトの名無しさん
08/09/20 19:42:26
>>173
なってないです。
MyEditというソフトウェアのソースコードMyEditUtil.cppの493行目を見ればわかります。
176:デフォルトの名無しさん
08/09/20 19:45:03
URLリンク(sky_dreamer.at.infoseek.co.jp)
177:デフォルトの名無しさん
08/09/20 19:52:37
>>169
バグだろ。
178:デフォルトの名無しさん
08/09/20 19:54:48
ライセンスがとてつもない矛盾を呈してる件
179:デフォルトの名無しさん
08/09/20 20:06:01
エディタをダウソしてreadmeを見たら、MyEdit.chm の『使用許諾契約書』を読めって書いてあったけど、MyEdit.chmが入ってないな。
フルパッケージのほうもダウソしてみたら、やっぱりMyEdit.chm の『使用許諾契約書』を読めって書いてあるけど、使用許諾のページが開けないじゃん。
180:デフォルトの名無しさん
08/09/20 20:10:37
?
181:デフォルトの名無しさん
08/09/20 20:14:56
>>179
アーカイブ壊れてるんじゃね?
myedit_v116_full.zip md5 c514e4e1d2680235ab7c61bfd8aed4c0
MyEdit.chm md5 1b63a35be248d1921acd47eb06d50ef1
182:デフォルトの名無しさん
08/09/20 20:20:24
>>181
MyEdit.chmを入れ忘れてるだけじゃね?
183:デフォルトの名無しさん
08/09/20 20:21:25
>>169
grepしたら、そのメソッド、どこからも呼ばれてないみたいだから、やっぱバグだろな。
184:デフォルトの名無しさん
08/09/20 20:28:32
そろそろスレ違いな気もしてきたが。
>>183
エディタのexeの方のソースってどっかにあった?
dllの方だけだと、多分クラスライブラリのインターフェースな関数だと思うから、
grepしても引っかからないのは当たり前っぽいんだけど。
あのエディタでGetTextWidth()が使われてないかはどうにも。
が、まぁ、バグっぽいってのは同意だがねー。
185:デフォルトの名無しさん
08/09/20 20:31:52
MyMemo.exeが本体みたい。
186:デフォルトの名無しさん
08/09/20 20:34:00
>>184
本体のソースは入ってなかったのか。
そんなまじめに見てなかったよ。
187:デフォルトの名無しさん
08/09/20 23:06:15
Cでtemplate的なものをなんとか実装できませんかね?
188:デフォルトの名無しさん
08/09/20 23:07:11
>>187
マクロ
CSTL あたりを参考にどうぞ
189:デフォルトの名無しさん
08/09/21 00:30:45
すいません、初歩的な質問なのですが・・・
割り算で
7÷32 の余りは 0 なんですか?
てっきり、余りは7だと思ってたんですが・・・
190:デフォルトの名無しさん
08/09/21 00:32:32
7 / 32
7 % 32
191:デフォルトの名無しさん
08/09/21 00:33:37
商が0で余りが7
192:デフォルトの名無しさん
08/09/21 00:33:41
>>189
数学の質問(算数か?)は専門スレへ
C言語の話なら割り算とあまりの計算のそれぞれで使う記号は何を使ってます?
193:デフォルトの名無しさん
08/09/21 00:50:01
C言語です。
商なら7/32、余りなら7%32 でプログラム組んでみたのですが…
プログラム
printf("i=%dのとき i/32=%d…%d 余り/8=%d \n",i,i/32,i%32,(i%32)/8);
これを出力すると
i=0のとき i/32=0…0 余り/8=0
i=1のとき i/32=0…1 余り/8=0
i=2のとき i/32=0…2 余り/8=0
i=3のとき i/32=0…3 余り/8=0
i=4のとき i/32=0…4 余り/8=0
i=5のとき i/32=0…5 余り/8=0
i=6のとき i/32=0…6 余り/8=0
i=7のとき i/32=0…7 余り/8=0
i=8のとき i/32=0…8 余り/8=1
i=9のとき i/32=0…9 余り/8=1
i=10のとき i/32=0…10 余り/8=1
i=11のとき i/32=0…11 余り/8=1
i=12のとき i/32=0…12 余り/8=1
i=13のとき i/32=0…13 余り/8=1
i=14のとき i/32=0…14 余り/8=1
i=15のとき i/32=0…15 余り/8=1
i=16のとき i/32=0…16 余り/8=2
となってしまいまして…(@@;
194:デフォルトの名無しさん
08/09/21 00:54:51
>>193
算数はできますか?
195:デフォルトの名無しさん
08/09/21 00:59:20
>>193
それでいいと思うけど、どうなるはずだと思ってるの?
196:デフォルトの名無しさん
08/09/21 01:00:10
算数についての認識が間違ってるなw
その処理はなんらおかしくないw
197:デフォルトの名無しさん
08/09/21 01:06:25
余りを8で割って何がしたいんだ?
198:193
08/09/21 01:08:43
ごめんなさい!あほでした
普通に合っていますね…。
商/ と 余% をごっちゃにしていました…。
しょうもない質問してすいませんでした!(*_*)
199:デフォルトの名無しさん
08/09/21 01:15:51
夜は冷えるね。
200:デフォルトの名無しさん
08/09/21 01:30:36
>>198
配列までしか知らない俺も心配になる。大丈夫か?
201:デフォルトの名無しさん
08/09/21 01:35:20
あんまり馬鹿にするなよ
勘違いなんて誰にでもあるだろう
202:デフォルトの名無しさん
08/09/21 01:38:04
>>201
まーな
|| と && と != を使った条件判断ってあまりくまないから
時々テストの段階で思ったように動かなくて後で気がつくってことはある。
203:デフォルトの名無しさん
08/09/21 01:43:56
条件分岐で&&はかなり使うな
&と混ぜて使うと少し紛らわしい
204:デフォルトの名無しさん
08/09/21 03:06:33
C++!C++!C++!C++ぅぅうううわぁああああああああああああああああああああああん!!!
あぁああああ…ああ…あっあっー!あぁああああああ!!!C++C++C++ぅううぁわぁああああ!!!
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん
んはぁっ!C++様の桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!
小説12巻のC++様かわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!
アニメ2期放送されて良かったねC++様!あぁあああああ!かわいい!C++様!かわいい!あっああぁああ!
コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!
ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…
C + + 様 は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!
そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ベル研究所ぉおおおお!!
この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のC++様が僕を見てる?
表紙絵のC++様が僕を見てるぞ!C++様が僕を見てるぞ!挿絵のC++様が僕を見てるぞ!!
アニメのC++様が僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!
いやっほぉおおおおおおお!!!僕にはC++様がいる!!やったよケティ!!ひとりでできるもん!!!
あ、コミックのC++様ああああああああああああああん!!いやぁあああああああああああああああ!!!!
あっあんああっああんあAda様ぁあ!!シ、Cー!!C#ぅうううううう!!!C++0xぅううう!!
ううっうぅうう!!俺の想いよC++へ届け!!ベル研究所のC++へ届け!
205:デフォルトの名無しさん
08/09/21 10:44:56
C++のアニメ2期って興味あるなwww
206:デフォルトの名無しさん
08/09/21 12:28:44
↓これは、何をする関数ですか?
#include <string.h>
void manko( unsigned long la ,char* str )
{
unsigned long msk = 0x80000000;
for( int i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
msk >>= 1;
}
*(str + 32) = '\0';
}
207:デフォルトの名無しさん
08/09/21 12:40:30
>>206
関数の名前を見た瞬間に読む気をなくした
208:デフォルトの名無しさん
08/09/21 13:02:47
la に 1, 2, 3, …って入れていって実行してみればいいんじゃないかな
209:デフォルトの名無しさん
08/09/21 13:19:14
#include <stdio.h>
#include <string.h>
void main( void )
{
unsigned long msk = 0x80000000;
unsigned long la = 0x84218421;
unsigned char strings[33];
unsigned char* str;
int i,j;
str = &strings;
j = 0;
for( i = 31; i >= 0; --i )
{
*(str + 31 - i) = ( msk & la ) ? '1' : '0';
printf("%c", *(str + 31 - i) );
msk >>= 1;
if( j >= 3 )
{
printf(" ");
j = 0;
} else {
j++;
}
}
*(str + 32) = '\0';
}
210:209
08/09/21 13:19:57
受け取るデータを関数内でダミー定義するとかして実行すべし。
メモリ見れる環境なら直接見る、見れないならprintfで出してみる。
ま、結論いっちゃうと、"la"で貰った値をビット毎に評価して、真なら"1"を、偽なら"0"を
"str" に書き込んでる。
実行してみるとわかるが、"la" のどのビットが立ってるかがわかる、ということ。
211:デフォルトの名無しさん
08/09/21 15:28:03
実行してみなきゃわからんのか
212:デフォルトの名無しさん
08/09/21 15:56:26
int x;
のようなローカル変数があったとして
そのような変数の宣言は定義を兼ねますので、
口頭で説明する場合はどちらの用語を使用するのが適切でしょうか?
あと上記のような宣言(定義)は初期値が不明ですので、このような宣言(定義)の
特別な呼び方などありましたら教えてください。
213:デフォルトの名無しさん
08/09/21 16:14:56
ローカル変数の宣言と定義が分離することはありえないのでどう呼んでも誤解はないはずだが
強いて言えば宣言だと思う
あとは単に「初期化されていない」で十分
214:デフォルトの名無しさん
08/09/21 16:54:19
>>212
C言語なら、定義の場合は定義と言っとけば大体問題ない。
あと、宣言が定義を兼ねてるのではなく、
ある種の宣言を特別に定義と呼ぶだけなので、
宣言と言ったところで別に問題ないと思う。
ていうか、どっちが適切かなんか文脈次第だろがよ。
漠然と聞かれても「どっちでも良い」としか言いようない。
215:デフォルトの名無しさん
08/09/21 17:42:40
つまり、宣言と定義は混同してよいのだな?
216:デフォルトの名無しさん
08/09/21 17:57:46
>>215
帰れよ
217:デフォルトの名無しさん
08/09/21 18:05:17
答えられない低脳はすっこんでろ
218:デフォルトの名無しさん
08/09/21 18:08:15
sageずに煽るのはいつもの俺言語な変な子
みんな知ってるね
219:デフォルトの名無しさん
08/09/21 18:08:58
>>217
C言語どころか日本語の通じないかたはお帰りください
220:デフォルトの名無しさん
08/09/21 18:14:23
>>219
どの日本語が通じなかったんだ?
221:デフォルトの名無しさん
08/09/21 18:22:32
>220
日本語を理解できることは、このスレで議論する論客として最低限の資格だ
質問する気にしても、人にものを尋ねるときの態度がまるでなっておらず、質問者として最低限の資格もおまえは備えていない
繰り返すがチンパンジーには無理な問題だ
あきらめて帰れ
222:デフォルトの名無しさん
08/09/21 18:23:02
>>221
自己分析がよくできてるね
223:デフォルトの名無しさん
08/09/21 18:24:21
>>221
そんなに悔しかったのか、よかったな
224:デフォルトの名無しさん
08/09/21 18:32:47
結構熱いな、ここw
225:デフォルトの名無しさん
08/09/21 18:45:10
>>215>>220
>どの日本語が通じなかったんだ?
どの、というより全体的に意味の取り方がおかしいと思われる。
どこをどう取ったら「宣言と定義は混同してよい」という結論になるんだ?
日本語が理解出来て無いとしか思えない。
226:デフォルトの名無しさん
08/09/21 19:21:16
すみません。C言語の文法書2冊とWinAPIの本を2冊読みました。そこで
以前から私が作りたかった、ショートカット作成プログラムをぜひとも作りたいのです。
でも、やり方とかMSDNを調べてもわかりません。具体的に手順を書かせていただきますと。
1.コンソールアプリから2つフォルダのフルパスを入力する。
2.WindowsAPIで書いたショートカット作成関数を呼び出してお互いのフォルダにお互いのフォルダの
ショートカットを作成する。
そこで、ショートカット作成のWindows32APIのMSDNの調べ方もしくは
関数そのものを教えて欲しいのです。すみませんが、教えてください。よろしくお願いします。
227:デフォルトの名無しさん
08/09/21 19:23:11
win32APIはここで聞けば?
スレリンク(tech板)
228:226
08/09/21 19:27:27
>>227
どうもありがとうございます。そちらに移動させていただきます。
229:デフォルトの名無しさん
08/09/21 21:28:19
>>225
で、定義と宣言は混同しても文脈次第でどっちでも良いのか、悪いのか?
230:デフォルトの名無しさん
08/09/21 21:29:07
>>226
せっかくだからジャンクションを作ってみてはどうだ?
231:デフォルトの名無しさん
08/09/21 23:14:08
>>229
混同はしてはいけないけど、定義も宣言であるから、
文脈によってはどちらを使っても正しい表現になる場合もある。
どちらを使っても良い場合があるという事から、すなわち混同してよいと解釈したわけ?
やっぱり日本語が理解出来て無いようだね。
232:デフォルトの名無しさん
08/09/21 23:26:46
/*
* A function is only defined if its body is given
* so this is a declaration but not a definition
*/
int func_dec(void);
/*
* Because this function has a body, it is also
* a definition.
* Any variables declared inside will be definitions,
* unless the keyword 'extern' is used.
* Don't use 'extern' until you understand it!
*/
int def_func(void){
float f_var; /* a definition */
int counter; /* another definition */
int rand_num(void); /* declare (but not define) another function */
return(0);
}
233:232
08/09/21 23:42:20
宣言(declaration)は使用を宣言(declare)すること
定義(definition)は変数やマクロや関数のボディを定義(define)すること
ではあるまいか?
234:デフォルトの名無しさん
08/09/21 23:43:45
だから場合によってはひとつで両方兼ねてたりするだろ?
235:デフォルトの名無しさん
08/09/22 00:13:30
Cの用語としては、もうちょっとちゃんと記述されていて、
JISより抜粋。
>識別子の定義(definition)とは、宣言のうち次のものをいう。
>・オブジェクトに対しては、そのオブジェクトの領域を確保する宣言
>・関数に対しては、関数本体を含む宣言
>・列挙定数または型定義名に対しては、その識別子の(唯一の)宣言
余談だけど、C++だとまたもうちょっと違う。
236:デフォルトの名無しさん
08/09/22 08:50:57
(func1) register キーワードのついた別々の変数を用いる
(func2) a, b を array[0], array[1] に置き換えた以外は func1 と同じ
このような時,func1 と func2 の振る舞いは変わりますか?
int func1(void)
{
register int a, b;
何か a, b をたくさん使う処理
}
int func2(void)
{
register int array[2];
何か array[0], array[1] をたくさん使う処理
}
237:デフォルトの名無しさん
08/09/22 10:37:59
>>236
振舞いは変わらない。それで変わったら困るでしょ。
func2の方は最適化が阻害されて遅くなるコンパイラとかあるかもね。
238:デフォルトの名無しさん
08/09/22 16:16:39
>>231
やっと少しお勉強してきたようだな
たったそれだけのために何時間かかってるんだよ ぼけ
文脈によってはなんて逃げてないで、どういう場合かはっきりしろ
現状、その逃げによって意味をなしていない
>ある種の宣言を特別に定義と呼ぶだけなので、
>宣言と言ったところで別に問題ないと思う。
239:デフォルトの名無しさん
08/09/22 16:38:50 BE:417694526-2BP(0)
× はっきりしろ
○ 教えてくださいお願いします
240:デフォルトの名無しさん
08/09/22 16:52:09
>238
お帰りください
241:デフォルトの名無しさん
08/09/22 16:53:00
>>240
お前が帰れカス
242:デフォルトの名無しさん
08/09/22 16:56:21
>たったそれだけのために何時間かかってるんだよ
これはひどい
>>238
お前さんこそそんな支離滅裂なレスを考えるのに17時間もかけたのかい
てなことになるな
243:デフォルトの名無しさん
08/09/22 17:09:28
>>236
registerストレージクラスをどう解釈するかは処理系依存なのでなんともいえません。
244:デフォルトの名無しさん
08/09/22 17:45:22
>>243
くわしく
245:デフォルトの名無しさん
08/09/22 17:58:35
疑問に思ったら、自分の使ってるコンパイラでアセンブラ出力してみるのがいいよ。
246:デフォルトの名無しさん
08/09/22 18:20:18
foo bar[row][col];
bar[r][c] = hoge;
↑これって
foo bar[row * col];
bar[r * col + c] = hoge;
に等しいのか、それとも
foo (bar[col])[row];
(bar[row])[col] = hoge;
なのか、どっちなんでしょう?
あと下のbarにsizeofするとsizeof(foo) * row * colに等しくなります
下のやつはbar[col]へのポインタの配列だから sizeof(foo*) * rowになると思うのですがなぜこうならないんでしょうか?
247:デフォルトの名無しさん
08/09/22 18:22:03
>>244
詳しくも何も、規格票には「アクセスを可能な限り高速にすることを示唆する」とかなんかしか書いてなくて、
レジスタに割り当てろとも、アクセスを高速にしろとも要求されていない。
248:デフォルトの名無しさん
08/09/22 18:26:58
>>242
即レスがトレードマークな常駐野郎にしては遅かったから変だと思ったんだよ
249:デフォルトの名無しさん
08/09/22 18:28:54
>>246
配列はポインタではない。キミは何かを勘違いしてる。
次の3つは等しい:
foo bar[row][col];
int (bar[row])[col];
typedef foo foos[col];
foos bar[row];
これは縦と横が反対になっている:
foo (bar[col])[row];
これは明らかに違う:
foo bar[row * col];
250:249
08/09/22 18:30:23
>>249
書き間違えた
× int (bar[row])[col];
○ foo (bar[row])[col];
251:デフォルトの名無しさん
08/09/22 18:35:30
>>246
>下のやつはbar[col]へのポインタの配列だから
違うよ
foo (bar[col])[row] は foo[row] が col 個の配列
つまり foo bar[col][row] と同じ
foo[col] へのポインタ row 個の配列が欲しければ
foo (*bar[row])[col]
と書くけど、普通使わないと思うよ
foo へのポインタを row 個持つ配列
foo *bar[row]
の方がよく使う
252:デフォルトの名無しさん
08/09/22 18:40:17
>>247
今はregister付けても大体無視されるよな
253:デフォルトの名無しさん
08/09/22 20:02:14
>>247
いやそうじゃなくて、それで函数の振る舞いまで変わるの?
254:デフォルトの名無しさん
08/09/22 20:06:25
>>252
「無視されます」とかドキュメントに明記してあったりな。
それでも C ではまだ & 付けれないという差があるが、
C++ では & 付けれるようになったんだよな。
255:デフォルトの名無しさん
08/09/22 20:12:51
>>253
変わるわけない
>>243が質問の内容を勘違いしてるだけ
256:デフォルトの名無しさん
08/09/22 20:25:01
そもそも「振る舞い」って何なの?
関数の結果ことなのか、CPUが演算する内容なのか。
257:デフォルトの名無しさん
08/09/22 20:55:38
>>253
未定義動作だから何が起こっても不思議じゃないだろ。
258:デフォルトの名無しさん
08/09/22 21:00:28
>>257
処理系定義と未定義動作は別です。
register変数がどう解釈されるかは処理系定義です。
259:デフォルトの名無しさん
08/09/22 21:06:07
>>257
register付けたら未定義動作ってどんな罠だよww
260:デフォルトの名無しさん
08/09/22 21:13:54
>>258
register付きの配列にsizeof以外の演算子が使えることは保証されていない。
261:デフォルトの名無しさん
08/09/22 21:34:53
C99なら(ry
262:デフォルトの名無しさん
08/09/22 22:00:47
>>260
なるほどね
でもそれだったら「処理系依存なのでなんともいえない」じゃなくて
「未定義だから結果は予想できない」が正しい答えだね
263:デフォルトの名無しさん
08/09/22 22:02:12
何がなんでもケチつけたいんだね
264:デフォルトの名無しさん
08/09/22 22:05:31
要するにコンパイラの解釈うんぬんは関係なくて「配列にregisterつけんなボケェ」でFA?
265:デフォルトの名無しさん
08/09/22 22:07:08
こまかいことにこだわるのがプログラマー
266:デフォルトの名無しさん
08/09/22 22:08:51
>>264
「入門篇で聞くなボケェ」だと思われ
267:デフォルトの名無しさん
08/09/22 22:13:08
入門じゃ無い方のCスレ、どっか行っちゃったからなぁ
268:デフォルトの名無しさん
08/09/22 22:22:07
【初心者お断り】ガチ規格準拠C専用スレ Part133
スレリンク(tech板)
269:デフォルトの名無しさん
08/09/22 22:22:24
>>260
そうなんですか!知りませんでした
どうもありがとうぐございます
270:デフォルトの名無しさん
08/09/22 22:37:22
コンパイラで最適化してくれるから、registerは使わなくてもいい
271:デフォルトの名無しさん
08/09/22 22:51:15
>>270
馬鹿は黙ってろ
272:デフォルトの名無しさん
08/09/22 23:02:44
registerは最適化が進んでいなかった大昔のコンパイラの名残だよ
人間の体でいったら盲腸のようなもの
組み込み系用のマイナーなコンパイラを使っているんなら別だが
273:デフォルトの名無しさん
08/09/22 23:14:46
( ・∀・) (´・ω・ ≡ ・ω・`) (・∀・ )
274:デフォルトの名無しさん
08/09/22 23:33:46
いざ、それを使う期に及んではマイナーかメジャーかって問題じゃあんめえ
275:デフォルトの名無しさん
08/09/23 01:31:14
入門者が使う必要は無い
でいいでしょ
276:デフォルトの名無しさん
08/09/23 05:59:28
知識が昭和世代の古い人がいるみたいだね。
277:デフォルトの名無しさん
08/09/23 06:49:20
入門者が使う必要のない機能はない
そいつが入門者を卒業するためにはできることからやってみるのみ
278:デフォルトの名無しさん
08/09/23 07:17:40
C99における可変引数マクロの、##の文字列連結についてお伺いします。
環境はGCCです。
#define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__)
#define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__)
a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、
fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、
a("x")と、引数を1つだけしか書かなかった場合には、
fprintf(stderr, "%s()::" "x", __func__, );
とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。
そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。
##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、
隣接するトークンが連結され、新しいトークンが形成される」、と
K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか?
それとも、これはGCCで通じる特別なものなのでしょうか?
長くなりましたが、よろしくおねがいします。
279:デフォルトの名無しさん
08/09/23 13:30:25
__VA_ARGS__でぐぐれ
280:デフォルトの名無しさん
08/09/23 15:41:46
intなどの値をcharのような1byte区切りの配列として扱うには
キャストを使うことができるでしょうか?
実際にやりたいのは
色々なデータのサイズをネットワークバイトオーダーに変えてから
0のバイトを省略して送りたいのです
例えば
00 ab 00 cd
ならば
ab 00 cd
としたいのです
宜しくお願いします
281:デフォルトの名無しさん
08/09/23 15:45:03
int a
に対して
((char *)&a)[1]
とかやればいい
282:デフォルトの名無しさん
08/09/23 15:56:09
char a = (char)(x >> 24)
char b = (char)(x >> 16)
char c = (char)(x >> 8)
char d = (char)x
283:デフォルトの名無しさん
08/09/23 15:57:39
シフトするならシフト幅はCHAR_BITから計算したほうがいい。
284:デフォルトの名無しさん
08/09/23 15:59:04
つhtonl
285:デフォルトの名無しさん
08/09/23 16:15:15
>>278
GCCの拡張です。
URLリンク(gcc.gnu.org)
286:デフォルトの名無しさん
08/09/23 16:35:06
>>280
>>281のようにポインタ使うのでもいいし何度も宣言するようなら共用体使うとか
287:デフォルトの名無しさん
08/09/23 17:08:55
宿題臭がする
288:デフォルトの名無しさん
08/09/23 17:13:39
00を取ったら可変長になるわけだけど、プロトコルとかどうなってるんだろう。
1バイトに縮めば、長さを別に持っていても節約にはなるか。
289:デフォルトの名無しさん
08/09/23 18:14:15
>>280
それだとデータの内容が変わってるけど問題は無いの?
送信時に 03 ab 00 cd みたいに長さ情報を付加するの?
かなり高い確率で、受信側で次に送る送信データと連結されてしまうよ
290:デフォルトの名無しさん
08/09/23 18:45:30
>>281>>282>>283>>286
みなさんありがとうございます
共用体も初めて聞くので調べてみます
>>284
htonlの後出力する段階でどうしたらいいのかわからなくて
>>287
宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので
>>288>>289
00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます
291:デフォルトの名無しさん
08/09/23 20:25:25
他の既存のプロトコルがどうやってるのか勉強したほうがいい
292:デフォルトの名無しさん
08/09/23 20:45:45
>>291
具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので
293:デフォルトの名無しさん
08/09/23 21:26:07
>>290
頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。
294:デフォルトの名無しさん
08/09/23 21:26:11
UTF-8形式っていう手もあるよ可変長
負の値が送れないけど
295:デフォルトの名無しさん
08/09/23 21:28:40
バイナリのプロトコルでしょ?
296:デフォルトの名無しさん
08/09/23 21:33:14
可変長で任意のビット数送るのにも使えるということを言ってるのでは
297:デフォルトの名無しさん
08/09/23 21:36:59
>>296
ああ、なるほど。
298:デフォルトの名無しさん
08/09/23 21:40:58
>>290
元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd
長くなってるよ
299:デフォルトの名無しさん
08/09/23 21:49:01
まぁ別にその辺はプロトコルの話で、
C言語とは関係無いじゃん
300:デフォルトの名無しさん
08/09/23 22:43:23
見た目の圧縮が目的ではないので長くなって構いません
理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです
>>294>>296
ありがとうございます
UTF-8調べてみます
>>293
初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです
301:デフォルトの名無しさん
08/09/23 22:45:07
>>299
すみません
話し逸れてました
他で相談します
302:デフォルトの名無しさん
08/09/24 04:35:53
ヘッダにある構造体を定義して、何個かint型の変数を定義しました
でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?
303:デフォルトの名無しさん
08/09/24 04:39:32
>>302
その構造体を晒してみて
あと、環境とかも
304:デフォルトの名無しさん
08/09/24 04:54:50
BCC DeveloperでDXライブラリ使ってます
構造体は
struct STATUS_D{
int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます
305:デフォルトの名無しさん
08/09/24 05:13:31
>>304
構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。
306:デフォルトの名無しさん
08/09/24 05:45:18
メモリ破壊してる所見つけるコツみたいなのあります?
全然わかんないです・・・
307:デフォルトの名無しさん
08/09/24 05:48:35
>>306
前後に文字配列を定義してないですか?
308:デフォルトの名無しさん
08/09/24 05:51:55
>>307
それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。
たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。
309:デフォルトの名無しさん
08/09/24 05:55:22
目視デバッグ
310:デフォルトの名無しさん
08/09/24 06:08:33
デバッガーでトレース
構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる
311:デフォルトの名無しさん
08/09/24 10:38:33
その構造体すでにfreeしてしまっているとか
312:マジレスチュウ ◆MaJi/01g.w
08/09/24 12:54:50 BE:1465733467-2BP(0)
char型の配列周りが基本的に怪しいよね。
ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら>>310の方法で探すのが早いかな
313:デフォルトの名無しさん
08/09/24 19:34:37
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif
_DEBUGってなんですか?
314:デフォルトの名無しさん
08/09/24 19:39:57
URLリンク(www.wakhok.ac.jp)
315:デフォルトの名無しさん
08/09/24 20:47:47
>>313
VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。
316:デフォルトの名無しさん
08/09/25 00:48:54
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}
whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><
317:デフォルトの名無しさん
08/09/25 00:53:57
>>316
モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?
318:デフォルトの名無しさん
08/09/25 00:54:24
サイズをオーバーしたとき
でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする
319:デフォルトの名無しさん
08/09/25 00:55:02
316のはよくない例だな
320:デフォルトの名無しさん
08/09/25 01:01:28
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;
while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);
}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><
321:デフォルトの名無しさん
08/09/25 01:04:18
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。
322:デフォルトの名無しさん
08/09/25 01:11:01
continueがあるから違うだろ。
while(getchar()!='\n')で十分な気はするが。
323:デフォルトの名無しさん
08/09/25 01:17:36
>>322
そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><
324:デフォルトの名無しさん
08/09/25 01:21:37
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる
325:デフォルトの名無しさん
08/09/25 01:26:05
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw
326:デフォルトの名無しさん
08/09/25 01:28:40
>>324
ありがとうございます、なんとなく解りました。
327:デフォルトの名無しさん
08/09/25 01:32:44
>>325
ちゃんとみろ、それは的外れだ
328:デフォルトの名無しさん
08/09/25 01:35:20
>>327
if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?
329:デフォルトの名無しさん
08/09/25 01:42:13
>>328
お前continueが見えてないの?
330:デフォルトの名無しさん
08/09/25 01:43:26
>>329
この話にcontinue関係ないw
331:デフォルトの名無しさん
08/09/25 01:48:29
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?
332:デフォルトの名無しさん
08/09/25 01:52:17
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}
333:デフォルトの名無しさん
08/09/25 02:30:55
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?
334:デフォルトの名無しさん
08/09/25 02:33:02
上司になっていいように使う。
335:デフォルトの名無しさん
08/09/25 04:16:05
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。
超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。
よろしく。
336:デフォルトの名無しさん
08/09/25 07:39:47
別に好きなとこで代入とかして初期化すればいいだろう
それとも初期化子の使用のことか?それなら、宣言時にしか使えないな
337:デフォルトの名無しさん
08/09/25 08:34:04
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)
338:デフォルトの名無しさん
08/09/25 08:36:50
>>337
sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。
339:デフォルトの名無しさん
08/09/25 10:27:10
>>337
_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。
340:デフォルトの名無しさん
08/09/25 11:48:17
CのスレでC++の話をする奴って何なの?
341:335
08/09/25 13:37:47
>>336
そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;
宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。
Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;
342:デフォルトの名無しさん
08/09/25 13:42:52
Cも一応高級言語なんですけぉ
343:マジレスチュウ ◆MaJi/01g.w
08/09/25 22:29:03 BE:488578627-2BP(100)
>>337
バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk
344:デフォルトの名無しさん
08/09/26 07:51:18
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要
345:デフォルトの名無しさん
08/09/26 08:08:07
おれ=くさかべ先生
346:デフォルトの名無しさん
08/09/26 08:11:17
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。
人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない
君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。
347:デフォルトの名無しさん
08/09/26 12:39:51
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理
どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成
348:デフォルトの名無しさん
08/09/26 13:17:35
サイバーノーガード戦法?
349:デフォルトの名無しさん
08/09/27 13:38:21
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/
350:デフォルトの名無しさん
08/09/27 13:38:57
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
} else {
処理3;
}
} else {
処理3;
}
処理4;
処理3を1箇所にする書き方を教えてください。
351:デフォルトの名無しさん
08/09/27 14:01:43
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
} else {
goto label;
}
} else {
label:
処理3;
}
処理4;
352:デフォルトの名無しさん
08/09/27 14:02:33
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;
353:デフォルトの名無しさん
08/09/27 14:04:29
>>351
それはアウトだろボケ
354:デフォルトの名無しさん
08/09/27 14:10:57
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;
355:デフォルトの名無しさん
08/09/27 14:12:03
>>351
goto使うならこうだな。
if ( 条件1 ) {
処理1;
if ( 条件2 ) {
処理2;
goto label;
}
}
処理3;
label:
処理4;
356:デフォルトの名無しさん
08/09/27 14:18:15
>>355
goto入れる場所違わね?
357:デフォルトの名無しさん
08/09/27 14:24:28
正しいと思う場所に入れてみたら?
358:350
08/09/27 14:38:05
勉強になりました。ありがとうございます。
359:デフォルトの名無しさん
08/09/27 14:44:27
>>349
そのていどwebで十分
360:デフォルトの名無しさん
08/09/27 15:46:20
>>355-357
goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。
361:デフォルトの名無しさん
08/09/27 17:27:47
皮肉もわからないのかお前は
362:デフォルトの名無しさん
08/09/27 20:19:29
か・・皮肉?
363:デフォルトの名無しさん
08/09/27 21:35:05
kuma-
364:デフォルトの名無しさん
08/09/27 21:44:46
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり
365:デフォルトの名無しさん
08/09/27 22:12:52
switch( !条件1 ){
case 0:
処理1;
if( 条件2 ){
処理2;
break;
}
case 1:
処理3;
}
366:デフォルトの名無しさん
08/09/27 22:17:12
しつこい
367:デフォルトの名無しさん
08/09/27 22:57:13
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?
368:デフォルトの名無しさん
08/09/27 22:59:09
見た目が分かりやすくなるという人も居る
369:デフォルトの名無しさん
08/09/27 22:59:50
>>367
イメージとして数直線があるとき
370:デフォルトの名無しさん
08/09/27 23:01:03
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る
371:デフォルトの名無しさん
08/09/27 23:08:13
もう何年も>演算子を使っていない
372:デフォルトの名無しさん
08/09/27 23:09:49
>>370
0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。
373:デフォルトの名無しさん
08/09/27 23:10:10
>>371
よう俺
374:デフォルトの名無しさん
08/09/27 23:12:44
>>368
自分は代入演算子と間違えないためかと思ってました
>>369
なるほど~
数直線なんて単語すっかり忘れてました
>>370
そういう使い方もあるのですね
とても参考になりました
ありがとうございます
375:デフォルトの名無しさん
08/09/28 02:25:39
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?
376:デフォルトの名無しさん
08/09/28 02:27:34
>>375
1234と連結させたint型とはなんですか?
10進数の1234ですか。
377:デフォルトの名無しさん
08/09/28 02:28:14
ごめんなさい、そうです
378:デフォルトの名無しさん
08/09/28 02:34:06
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];
379:デフォルトの名無しさん
08/09/28 08:17:06
標準ライブラリの関数ってどのぐらい早いの?
380:デフォルトの名無しさん
08/09/28 08:47:23
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?
381:デフォルトの名無しさん
08/09/28 08:50:53
もしくは、test.exeが利用可能か調べる方法でも良いです。
382:デフォルトの名無しさん
08/09/28 08:58:32
>>380
つmain
383:デフォルトの名無しさん
08/09/28 09:01:41
>>379
例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い
384:デフォルトの名無しさん
08/09/28 09:02:59
>>382
もうちょい教えてください。やり方判りません
385:デフォルトの名無しさん
08/09/28 09:40:52
>>382じゃないけどargc、argvを貰えと言ってるんだと思う
386:デフォルトの名無しさん
08/09/28 09:43:21
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。
void func(int array[][2]); //関数宣言
void mainf(){
int array[2][2]={1,2,
3,4};
func(array)
}
void func(int array[][2]){
}
387:デフォルトの名無しさん
08/09/28 10:01:23
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし
388:デフォルトの名無しさん
08/09/28 10:05:12
>>387
配列は
最初のアドレスとデータ型さえわかれば
次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?
2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?
日本語でちゃんと説明できませんが
なんとなくわかりました。
389:デフォルトの名無しさん
08/09/28 10:11:02
>>388
ただし、範囲のチェックはやってない。
390:マジレスチュウ ◆MaJi/01g.w
08/09/28 11:49:54 BE:418780962-2BP(100)
>>380
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。
391:デフォルトの名無しさん
08/09/28 11:57:31
>>390
カレントディレクトリは一番最初でしょう。
392:マジレスチュウ ◆MaJi/01g.w
08/09/28 12:34:20 BE:1710022177-2BP(100)
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><
393:デフォルトの名無しさん
08/09/28 12:42:25
違うだろ
394:デフォルトの名無しさん
08/09/28 13:19:25
環境による
395:デフォルトの名無しさん
08/09/28 13:21:16
windowsの話してるんだろ
396:デフォルトの名無しさん
08/09/28 13:44:40
というかC関係ないね
397:デフォルトの名無しさん
08/09/28 15:12:09
だよな
398:くさかべ様
08/09/28 16:44:19
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。
399:デフォルトの名無しさん
08/09/28 16:48:57
豆でも食ってろ
400:デフォルトの名無しさん
08/09/28 18:18:09
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?
以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。
もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。
401:デフォルトの名無しさん
08/09/28 18:21:46
Eclipseはコンパイラじゃないよ
402:デフォルトの名無しさん
08/09/28 18:23:06
>>400
なにも設定したくないならvisualstudioおすすめ
403:デフォルトの名無しさん
08/09/28 18:26:45
PCの基礎知識が無いのにプログラミングは早すぎる
404:デフォルトの名無しさん
08/09/28 18:38:19
パスも通せないでプログラムですか
405:400
08/09/28 18:40:10
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。
406:デフォルトの名無しさん
08/09/28 19:24:39
>>405
がんがれノシ
407:デフォルトの名無しさん
08/09/28 19:31:03
>>405
まあ、これで覚えろ
きっかけが無いと覚えれないしな。
408:デフォルトの名無しさん
08/09/28 22:19:16
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?
教えてエロイ人。
409:408
08/09/28 22:20:06
まちがえた。
ぽちんた変数配列argvっていう意味
↓
ぽちんた変数の配列argvっていう意味
410:デフォルトの名無しさん
08/09/28 22:25:00
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる
でも実際はchar **argvだけど
411:デフォルトの名無しさん
08/09/28 22:26:37
ぽちんた変数と呼ぶのが今の流行りなのか?
412:デフォルトの名無しさん
08/09/28 22:34:33
幼稚な奴にあわせる必要は無い
413:408
08/09/28 22:56:14
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。
細かいところがむずかしいね。ありがとう。よくわかったよ。
414:デフォルトの名無しさん
08/09/28 23:05:44
ぽちんた言いたいだけやろ
415:デフォルトの名無しさん
08/09/28 23:26:54
fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、
改行文字をなくしたいです。どうすればいいですか?
416:デフォルトの名無しさん
08/09/28 23:28:23
>>415
最後の改行文字をヌル文字に書き換える
417:416
08/09/28 23:39:06
なるほど、感涙。ありがとうございました。>>416
418:デフォルトの名無しさん
08/09/29 01:29:14
ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で
*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。
最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?
なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。
すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。
419:デフォルトの名無しさん
08/09/29 01:38:11
結論から言うと全然違う
おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど
420:デフォルトの名無しさん
08/09/29 01:39:30
結論だけ言うと、配列で宣言しなくちゃいけない
421:デフォルトの名無しさん
08/09/29 04:15:22
ファイルから13バイトのデータを読むために
struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。
422:デフォルトの名無しさん
08/09/29 04:42:34
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。
423:デフォルトの名無しさん
08/09/29 04:45:07
そのコンパイラでは以下のようなアラインメントになっている
*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]
424:デフォルトの名無しさん
08/09/29 04:47:51
1バイト読む->boolenに格納
4バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納
とすればおk
425:デフォルトの名無しさん
08/09/29 05:35:56
1バイト読んでから再度freadで12バイト読まないとダメ
426:デフォルトの名無しさん
08/09/29 06:15:10
#pragma pack()とかパディングを無くす抜け道はある
しかし>>424,425さんのように手間を惜しまない方が賢明
427:デフォルトの名無しさん
08/09/29 08:37:49
>>418
とりあえず、本は買って隅から隅まで読め
428:421
08/09/29 09:50:01
>>422-426
ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。
429:デフォルトの名無しさん
08/09/29 09:59:04
まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。
書くときにも同じことやりそうだし。
430:デフォルトの名無しさん
08/09/29 14:05:10
>>421
union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。
431:デフォルトの名無しさん
08/09/29 14:21:47
>>430
うそつくな
432:デフォルトの名無しさん
08/09/29 14:50:48 BE:556925928-2BP(40)
>>430
>>429
433:デフォルトの名無しさん
08/09/29 20:02:24
>>418
> でも今の本はたいてい char str[80] = "abcde"ってかいてある。
そんなことねーだろ。
434:430
08/09/29 22:28:12
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^
435:デフォルトの名無しさん
08/09/29 22:31:16
>>434
せめてやりとりぐらいは呼んでからレスしてね
436:デフォルトの名無しさん
08/09/29 22:53:58
カタカナ表記のユニオンがいいな
ユニックス的でいかすぜ
437:418
08/09/30 00:56:23
>>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は
必ず、配列で宣言するようにします><;ありがとうございました。
438:デフォルトの名無しさん
08/09/30 00:57:38
すみません。グローバル変数とローカル変数を同じ名前にしてしまい、
printfで出力しようとおもったら、困りました。出力できませんかね?
439:デフォルトの名無しさん
08/09/30 00:58:06
片方の名前を変えればおk
440:438
08/09/30 01:29:39
>>439
やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。
441:デフォルトの名無しさん
08/09/30 01:36:52
>>438
影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";
printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());
return 0;
}
442:デフォルトの名無しさん
08/09/30 08:42:43
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど
443:デフォルトの名無しさん
08/09/30 08:46:38
>>442
そのグローバル領域の使い方次第じゃないの?
アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。
あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。
444:デフォルトの名無しさん
08/09/30 10:25:57
Insufficient memory(out of memory)
in function cvalloc
というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。
445:デフォルトの名無しさん
08/09/30 10:31:17
>>444
メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり
446:デフォルトの名無しさん
08/09/30 17:25:04
>>442
そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと
447:デフォルトの名無しさん
08/09/30 17:50:35
void ChangeWtoM(char *malt, char *wide, int len_wide)
{
int i, j;
for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}
malt[j] = '\0';
}
int main()
{
TCHAR wide[64] = L"testテストですtest";
char malt[64];
ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);
return 0;
}
ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。
448:デフォルトの名無しさん
08/09/30 18:04:05
そもそもTCHAR型がなんなのか理解しているか
449:デフォルトの名無しさん
08/09/30 18:08:39
突っ込みどころが多すぎる。
環境は?汎用的に作ると長くなるから特定したほうがいいかも。
450:447
08/09/30 18:10:13
1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる
だと思っているんですけど
451:447
08/09/30 18:11:59
>>449
OSはWindowsXP、コンパイラはVisualC++2008です。
452:デフォルトの名無しさん
08/09/30 18:12:55
>>450
実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}
453:デフォルトの名無しさん
08/09/30 18:13:35
>>450
文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,
454:453
08/09/30 18:14:21
途中になった
EUC,UTF系との相互変換とかくらいだろうし
455:デフォルトの名無しさん
08/09/30 18:17:02
Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、
VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。
456:デフォルトの名無しさん
08/09/30 18:21:52
>>452-455
ありがとうございます
アドバイスを元にいろいろ調べてみます
457:デフォルトの名無しさん
08/09/30 20:00:21
関数ポインタの配列を使って、色々と作成してるんだけど、
たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m
458:デフォルトの名無しさん
08/09/30 20:19:38
ヒント:可変長引数
459:デフォルトの名無しさん
08/09/30 20:21:15
可変長引数って配列にしてポインタ渡せばいいじゃんって思うんだけどなんでそんな機能があるの?
460:デフォルトの名無しさん
08/09/30 20:21:44
>>457
0 <= n && n < 5 として
int r = (*p[n])(ここを); どう書きたいんでい?
461:デフォルトの名無しさん
08/09/30 20:25:22
>>459
ヒント:printf()
462:デフォルトの名無しさん
08/09/30 20:35:11
入出力以外になんか使い道あるの?
463:デフォルトの名無しさん
08/09/30 20:39:23
関数ポインタで分岐させる関数それぞれが引数の形や戻りが違うようにしたいのであれば
構造体を連絡用にしてその構造体のポインタ1個だけを引数にする関数にしてしまえばいい。
あとは構造体全体を共用体にでもして引数が変わる関数分用意すればいい。
464:デフォルトの名無しさん
08/09/30 20:40:47
printfは第二引数が可変長になってるから
printf("a=%d b=%d",a,b);
って使い方ができるだろ
465:デフォルトの名無しさん
08/09/30 21:02:50
>457
ちなみに戻り値も引数もバラバラな関数群へのポインタを
配列に格納したいというのは、どういったシチュエーション?
>460 が指摘しているように call するときの手間を考えたら
メリットなさげ
466:デフォルトの名無しさん
08/09/30 21:34:52
すいません。どこで聞いたらよいか分かりませんので、ここで質問させて頂きます。
*エンディアン、MSB/LSBファースト、インテル、モトローラ, 送信値の関係
Big Endian = Motorola = メモリ番地0にMSB = MSBファースト
Little Endian = Intel = メモリ番地0にLSB=LSBファースト
とまでは分かっています。
仮に、10進数60000を0- 1byte(2byte)使い、送信するとします。
60000(10進)=>EA60(16進)
MSB = 0 byte LSB=7byteで定義し、ビッグエンディアンで送信するとき、
バイトの並びはどちらが正しいでしょうか?
① EA 60 00 00 00 00 00 00
② 60 EA 00 00 00 00 00 00
byte 0 1 2 3 4 5 6 7
MSB LSB
あほですいません。ご教授お願い致します。
467:デフォルトの名無しさん
08/09/30 21:40:33
32bit レジスタ上で
00 00 60 EA
ビッグエンディアンだと
00 00 60 EA
リトルエンディアンだと
EA 60 00 00
468:きもい
08/09/30 21:45:36
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
469:デフォルトの名無しさん
08/09/30 21:46:16
>>466
意味が分からんよ
long x=0x12345678;
short y[2]={0x1234,0x5678};
ビッグエンディアン
x : 12 34 56 78
y : 12 34 56 78
リトルエンディアン
x : 78 56 34 12
y : 34 12 78 56
こうなる
MSB = 0 byte LSB=7byteで定義したら
>>466 の数値をビッグエンディアンで表現すると
00 00 00 00 00 00 EA 60
じゃないかな?
> 0- 1byte(2byte)使い、
これでは定義と両立できない気がする
470:デフォルトの名無しさん
08/09/30 22:03:17
>>467
>>469
ご回答ありがとうございます。
Endianの問題はハードウェアに依存し、
MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
MSB=0byteのLittle Endian方式とMSB=7byteのBig Endianは結果的に
同じと理解してもよろしいでしょうか?
471:デフォルトの名無しさん
08/09/30 22:04:04
>>466 ソケット通信ならhtol関数、htolh関数を使えばいい。
472:デフォルトの名無しさん
08/09/30 22:07:13
>>471
すいません。プログラミングの素養は0なんです。
473:デフォルトの名無しさん
08/09/30 22:10:27
>>470
>MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
バイトオーダと型の大きさによる
474:デフォルトの名無しさん
08/09/30 22:13:12
>>470
言ってることが理解できん。
MSB=0byteってどういう意味なんだ。
475:デフォルトの名無しさん
08/09/30 22:15:09
bit?
476:デフォルトの名無しさん
08/09/30 22:16:10
>>474
0バイト目って意味じゃないかな
勿論マのいう 0 番目は一般人の 1 番目相当だがw
477:デフォルトの名無しさん
08/09/30 22:18:54
>>474
通常なら、32bit系の場合、
LSB=0 byte目、MSB=4byte目
なんでしょうけど、
これの定義が逆になっている製品があるんです。
スレ違いかもしれませんが、車載LAN (CAN)の話です。
基本的には、シリアル通信なので、この問題は同じかなと思ったのですが・・・
478:デフォルトの名無しさん
08/09/30 22:20:20
↑
訂正です。0ベースで書いてるので、MSB=3byte目ですね。
479:デフォルトの名無しさん
08/09/30 22:45:29
速度的に問題が無ければテキストで送るという手もある。
480:デフォルトの名無しさん
08/09/30 23:06:24
>>477
ビッグエンディアンなら常に
MSB=0byte目
LSB=(型のサイズ)-1byte目
リトルエンディアンなら常に
LSB=0byte目
MSB=(型のサイズ)-1byte目
481:デフォルトの名無しさん
08/09/30 23:43:09
>>480 ご回答ありがとうございます。
実際に送信する順番という意味では、
ビッグエンディアン、リトルエンディアンにかかわりなく、
LSBが一番先という事になるのでしょうか?
60000(10進)、EA60は、ビッグエンディアン送信で
00 00 EA 60
--------> t
つまりLSBファーストとなり
受信側ビッグエンディアンで読み出し(計算)はそのまま
0000EA60
として扱うという認識でよろしいでしょうか?