[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 01/17 15:29 / Filesize : 215 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 54



1 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 20:41:54 ]
C言語の*入門者*向け解説スレッドです。
初心者、初級者の方は他の質問スレのほうが良いかもしれません。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 130代目
pc12.2ch.net/test/read.cgi/tech/1250204272/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 53
pc12.2ch.net/test/read.cgi/tech/1253110182/

過去スレ
makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

175 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 22:59:26 ]
いいじゃん。
こんな糞コミュニティの古参気取っても自慢にならないし。

176 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:07:01 ]
便所の壁が綺麗だったことなど一度もない!

177 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:12:02 ]
過大評価されてる情報を鵜呑みにしてるから、そうでもなかったよと
真相を伝えてるだけじゃないの?老いると教えたがるみたいだしなー

俺はそんなのどうでもいいし、2ch使えればそれでいいw

178 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 23:13:17 ]
古参がコピペにマジレスするとは

179 名前:デフォルトの名無しさん [2009/10/10(土) 01:05:22 ]
つい最近、C言語始めたものですが下記のような文章でコンパイルしても
65とか入力しても「×です。」って出るんですけどなぜでしょうか?


#include<stdio.h>
int main(void) {
int a ;
printf("数字を入力してください。 \n");
scanf("%d", &a);
if( 0 <= a <= 59 ){
printf(×です。\n");
}
return 0;
}

180 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:10:40 ]
>>179
if( 0 <= a && a <= 59 ){


181 名前:デフォルトの名無しさん [2009/10/10(土) 01:13:21 ]
ありがとうございます。

182 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 01:17:57 ]
>>179のコードもコンパイルできるのか
考えてみたらif(0<=a<=59)は
まず0<=aが評価されて、0<=65だからこの式が真(1)と評価されて
次に1<=59が評価されて真(1)になるから
if文の中のprintf文が実行されるってことか

183 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 16:40:33 ]
int main(void)
{
char buf[1024];
char *log[1000];
int line, printline;
FILE *fp = fopen("abc.txt", "r");

puts("これから読み込み\n");
for(line = 0; fgets(buf, sizeof buf, fp); line++){
log[line] = malloc(strlen(buf) + 1);
strcpy(log[line], buf);
}

puts("これから表示");
for(printline = 0; printline < line; printline++){
printf("%s", log[printline]);
free(log[printline]);
}

fclose(fp);
return 0;
}

for(line = 0; fgets(buf, sizeof buf, fp); line++) って部分のfgets(buf, sizeof buf, fp)は文字列を取り出してると思うんですが、
forの終わりの条件部分に当たる箇所になぜこれを指定してるんでしょうか?



184 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 16:44:23 ]
forの終わりじゃないから

185 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 16:49:25 ]
>>184
kwsk


186 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 17:03:44 ]
line = 0;
while(fgets(buf, sizeof buf, fp)
{
log[line] = malloc(strlen(buf) + 1);
strcpy(log[line], buf);
line++;
}

187 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 17:05:38 ]
>>183

>fgets
>戻り値
>ファイルの終わりかファイルエラーの場合は NULL を返します。

188 名前:デフォルトの名無しさん [2009/10/10(土) 17:59:35 ]
ポインタが理解できない理由を考えてみた。
ポインタは指し示すもの。値を参照したいときに利用するにとどめるべき。
unsgined char str[] = "123";
unsigned char *ptr;
ptr = str; //ここでptrはstrを指し示している。
*(++ptr) = 'A'; //*を使って値を書き換えようとする時点でポインタではない。

189 名前:デフォルトの名無しさん [2009/10/10(土) 18:18:14 ]
s/unsgined/unsigned/

190 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 18:53:04 ]
関数名に「$」を使ったら講師に怒られたのですが何故だめなんでしょう?
英数字とアンダーバーで無いとだめだって。
コンパイルは通るのですが何がだめなのかわかりません。

191 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:08:14 ]
>>190
コンパイルできるなら別にダメじゃないよ。
・講師が間違っている
・講師の頭が硬い
・これまでのCプログラマが築いた習慣を尊重している(でもダメだと頭ごなしに怒るのは間違い)
のいずれかだろう。

192 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:08:28 ]
>>190
C99からはユニバーサルアルファや処理系定義な文字が識別子に使えるので、
C89縛りがないなら使ってかまわない。

193 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:22:26 ]
より規格に準拠するなら \u0024 と書くべき



194 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:33:43 ]
>>186
これのほうが理解しやすいね。サンクス
>>187
把握した。

195 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:37:16 ]
> 講師に怒られたのですが何故だめなんでしょう?
なんにせよその場で質問しなきゃいかんよ

196 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:52:19 ]
改行したいのですがバックスラッシュが入力できません。
開発環境はVCです。
お願いします。

197 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:54:02 ]
>>195
頭の悪いやつに何を訊いても意味がない。
自分で調べた方がマシ

198 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:55:31 ]
\

コピペしる

199 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:56:12 ]
>>196
「¥」 = 「\」
Windowsの標準的なフォントではバックスラッシュと円記号が同じキャラクタコードに割り当てられていて
なおかつ、円記号しか表示されないようになっています。
エスケープシーケンス等を使用したければ、「¥」を使いましょう。

200 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:58:12 ]
>>196
ばか

201 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 20:12:44 ]
>>196
trigraph を使えばよい。
 ??/ ←このように3文字書けばバックスラッシュとして扱われる。



202 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:17:07 ]
まあ日本語環境での話だけどね。

203 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:21:22 ]
日本語環境ならJISコードにバックスラッシュが無いから、
本来はトライグラフを使わなければならないはずなんだよな。




204 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:28:51 ]
永遠にスラッシュ=円記号って仕様を引っ張ろうとしている
マイクロソフトの意思は理解できない。

205 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:32:19 ]
なんでマイクロソフトのせいになるんだ

206 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:35:57 ]
>>205
LinuxとかMacだとその仕様がもうとっくになくなってるんでしょう?
っていうか最初からなかったかもしれない

207 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:39:32 ]
は?

208 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:41:34 ]
英文フォントに変えてみろ

209 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:51:50 ]
MSではなくJISに文句を言うべきだろう

210 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 21:54:57 ]
コンソールアプリで何かキーを一つ押されたら(エンターキーが押されなくても)すぐに処理を進めるにはどうしたらいいですか

211 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:00:18 ]
何かキーが一つ押されるまで処理を進めないようにすればいい。


212 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:03:07 ]
kbhit()とか

213 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:23:25 ]
それは関係ない。



214 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 22:24:18 ]
conioのgetchでできましたありがとうございました。

215 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 00:24:50 ]
グローバル変数使いまくりのプログラムをマルチスレッド化しようと思って
まずグローバル変数を構造体に纏めて関数に構造体のポインタを渡して処理するよう改造したんですが
速度が約半分になってしまいました。
まだマルチスレッド化はしておらずシングルスレッドでの比較です。
何か改善する方法があれば教えてください。


216 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 00:47:41 ]
プロファイリングしてどの部分で時間食ってるのか調べる方法をググれ。

217 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 00:49:11 ]
ポインタ演算が増えたからだろ


218 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 09:56:42 ]
ポインタ演算で速度が半分に落ちるとは思えない。
おそらく、どこかが期待通りのコードになってないんだろう。
ポインタ渡しのつもりが、全部コピーになってるとか

219 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 10:08:14 ]
structを返す関数は仕様上遅い筈
逆に言えばCは言語仕様的に決して速度を最優先したものではない
こと示す例

220 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 10:20:21 ]
単純に聞くけど、欲しい?

GCとBlockをC1Xに提案
www.open-std.org/jtc1/sc22/WG14/www/docs/n1370.pdf

米Apple、「Grand Central Dispatch」をオープンソースに
sourceforge.jp/magazine/09/09/14/0627259
マルチコア時代の新機軸! Snow LeopardのGCD
tech.ascii.jp/elem/000/000/455/455786/

221 名前:デフォルトの名無しさん [2009/10/11(日) 11:33:25 ]
グローバルでは絶対番地だけでアクセスできていたのが、
構造体にした途端にベース+ディスプレースメント計算がいちいち必要になったんだろ
それと別な話、マルチスレッド化ってことはコンテキストスイッチも入るから更に遅くなるはず
速度を気にするならシングルスレッドのまま二足のわらじを履いたほうがいい

222 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 11:45:34 ]
はあ?

223 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 11:57:15 ]
>>221
理論だけで語るなら、コンパイラの最適化とかCPUのパイプライン処理とかあるから、
アドレスの計算量が2倍になったくらいで、全体の処理速度が半分になるとは信じがたい。



224 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:01:48 ]
マルチスレッド化しようと思って排他制御でも入れたんじゃね?

225 名前:デフォルトの名無しさん [2009/10/11(日) 12:18:28 ]
まあ、アドレス計算=全体の速度なわけはないな

>>215 は「ポインタを渡して」と言っているわけで引数に関しては無から有への変更だ
関数がインラインでない場合は分岐がパイプラインに影響しかねんし、仮にリンクレジスタ使ってもネストすれば結局メモリアクセスになる
最適化による自動 register 指定が逆効果(同時使用レジスタ数とメモリアクセスのジレンマ)ということも考えられる

226 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:41:18 ]
電話相談で簡単に答えてしまう医者はすくなくともモグリか薮

227 名前:デフォルトの名無しさん [2009/10/11(日) 12:54:08 ]
ご心配なく
一番肝心なことは言ってないし

228 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 12:55:01 ]
- 結果としてBASICが根幹にあるんですね。
  どうしてでしょうか。

簡単で手軽、誰にでも学習の機会があることでしょうね。
CやHSPだとこうはいきません。

CやHSPだとAPIのノウハウが必要になりますし、それは大きな障壁となります。

229 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:58:21 ]
>>226-228
何の話?

230 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:31:33 ]
1つの変数に複数の型の配列を入れたいんですが、
void **list = malloc(sizeof(void) * 2);
list[0] = malloc(sizeof(char) * 10);
list[1] = malloc(sizeof(int) * 10);

とした場合、list[0]はcharポインタを指し、list[1]はintポインタを指してるという認識であってますでしょうか。
list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。


231 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:31:43 ]
( * )ここ

232 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:39:45 ]
list[0]はvoid *だからchar *にキャストすれば、そのように捉えることもできるが
所詮メモリ上のバイト列だからどうとでも考えられる

>list[0]に10文字以上のcharを代入してもエラーが起きない
メモリチェックツール使えばエラーを捕えられるよ

あとsizeof(void)じゃなくてsizeof(void *)じゃないかな

233 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:43:06 ]
>>230
> list[0]はcharポインタを指し、list[1]はintポインタを指してるという認識であってますでしょうか。
あってません。

> list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。
10文字以上のcharを代入したいプログラマがいるかもしれないから、エラーにはしない主義。



234 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 16:45:53 ]
( * )ここ


235 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:00:38 ]
>>230
>list[0]に10文字以上のcharを代入してもエラーが起きないのがよくわかりません。
Cの基本的考えは自己責任。

小さな政府&自己責任。
市場原理主義派のプログラミング言語です。


236 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:14:15 ]
list[ * ]ここ

237 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:18:11 ]
C99ですね、わかります
オナニーは自分の部屋でやってください

238 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:19:03 ]
list[ * ]ここ


239 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 17:38:51 ]
何とC99が関係あるんだ

240 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 21:08:20 ]
C99はマルス券の万能取り消し符号

241 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 22:49:12 ]
そもそもsizeof(void)なんかコンパイラを通るの?
voidはサイズなどなかったような…

242 名前:デフォルトの名無しさん [2009/10/11(日) 22:58:03 ]
> void **list = malloc(sizeof(void) * 2);

シムラ〜後ろ後ろ


> list[1] = malloc(sizeof(int) * 10);

本当にヤバいのは、むしろこっち

243 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 23:15:44 ]
void(無形)として宣言してるものにint(有形)の型を代入してるもんな。
逆(void→int等)はキャストで可能だし普通に使うけど。



244 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 23:33:08 ]
void*にint*を代入するのは全く問題ないだろう

245 名前:デフォルトの名無しさん [2009/10/11(日) 23:47:26 ]
malloc の戻りは常に void * なんだけどね
list[x] がホーキング放射みたいに特徴がなくなるんだよ

246 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:18:45 ]
複数の異なる型を保持したいなら配列じゃなくて構造体を使うべき。

247 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:19:27 ]
共用体だろ

248 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 00:25:22 ]
list[0]とlist[1]をまとめて1つの領域として扱いたがってるようには見えないが?

249 名前:230 [2009/10/12(月) 00:52:19 ]
mallocの質問した者です。
何故このようなことをしたいのかとうと、現在MySQL APIのラッパを作成しており、MySQLの仕様によると

select int_col1, int_col2, str_col3 from master;
のようなSQL結果を取得する場合、
int foo = int_col1;
int bar = int_col2;
char *baz = str_col3;

のようにテーブルの型に合ったCの型へ代入するべきとあるのです。
SQLはどのような型が渡されるか実行時でないと判別できないため、共用体ではなくmallocによる動的確保を考えました。
mallocの方法でもエラーは出ないのですが、より良い対応はありますでしょうか。


250 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:38:26 ]
> SQLはどのような型が渡されるか実行時でないと判別できない
普通SQLを実行する側がどのような型で取得すべきか知っているはず
なので取得したい型で準備するだけ

どんなラッパーを作ろうとしてるんだろ?

251 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 01:39:12 ]
>>249
発行するSQL文の種類だけ、ラッパーを個別に用意するのはダメなん?

>select int_col1, int_col2, str_col3 from master;

なら、MySQLにおけるテーブルの型が既知な訳で、SQL文も規定されている訳だから
代入すべき変数の型もプログラム作成時に決まるはずでない?

>SQLはどのような型が渡されるか実行時でないと判別できないため

というのがイマイチ理解不能。動的に変化する検索結果のレコード数を気にして
mallocするならともかく。変数の型を抽象化する必要があるってことは、つまり
動的なSQL文にも対応できる、汎用的なラッパーを作りたいってこと?

252 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 02:58:28 ]
>>251
説明不足ですいません、汎用的なフレームワークを作ろうとしてます。
そのため、どのようなクエリ(型)が送られてくるかは実行時まで不明です。

フレームワーク内で適切な型にオートマッピングさせておきたいのです。


253 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 03:06:33 ]
好きなようにすればいいんじゃね?
そこは C の問題じゃないだろ。




254 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:38:17 ]
特定の変数をマクロで無効にする方法ってないですか?

int 型の a という変数があって
a はプログラムの色んな所(数百箇所)で参照されています。
この変数を「Debug時には使う、
        Release時には使わない(変数自体無い)」という風にしたいんです。

一応、#ifdefで良さそうなんですが
結構、あちこちで参照されているので#ifdefで囲むと
手間がかかり、ソースも読みづらくなりそうです。

こんな時、あまりソースの変更をせずに変数を無効にすることって出来ますか?
(例えば、変数の宣言の所だけを変えるだけで
 変数の参照の部分も無効(コンパイルしない)にするなど・・・)

#ifdefで一つ一つ書いてくしかないんでしょうか?

255 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:54:05 ]
無効ってどういう意味だ


256 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:57:02 ]
>>254
int a;
もし仮にこれをRelease時だけ消えるようにしたとしたら
このaを使ってる部分がエラーになるんだが

257 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 10:59:43 ]
>254
どういう状況か今ひとつ把握できないのだが
aを評価している式や式文も同じように(「Debug時には使う、Release時には使わない」)しないといけないと思うのですが
式や式文自体をマクロで囲っておいてコンパイルフラグ一発とかやったりはする

#ifdef NDEBUG
# define foo(expression) /* foo bar comment */
#else
# define foo(expression) expression
#endif /* NDEBUG */

int bar(int x) { x += 128; foo(fprintf(stderr, "x : %d\n", x)); return x; }
みたいなのか

258 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 11:49:43 ]
>>254
assert

259 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 12:05:45 ]
>>252
どういうフレームワークを作ろうとしているのかいまいちわからんが、
とりあえず全部文字列にして取得しとけばいいんじゃないの?

260 名前:デフォルトの名無しさん [2009/10/12(月) 12:39:17 ]
int *p;
p = &p;
*p = 3;
printf("%p = %d\n",p,*p);
ポインタ変数にもアドレスがあるのでそこを利用してpに&pを代入することで通常のローカル変数のように扱うことができる。
動かしてないのでわからんが、うちの脳内ではそれがうまくいくと信じてる。

261 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 12:44:06 ]
>260
それはない

262 名前:デフォルトの名無しさん [2009/10/12(月) 13:10:49 ]
お前にはいってない

263 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:17:03 ]
お前にはいりたい



264 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:18:09 ]
お前に入れたい

265 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:22:21 ]
お前にいれた

266 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:40:43 ]
お前らいらね

267 名前:デフォルトの名無しさん [2009/10/12(月) 13:41:23 ]
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

2ちゃんねるの有志の皆様へ

ただいまVIPで例のサイバーテロ集団の本拠地VANKに攻撃をしかける作戦を立てています

ただいま人数不足、不利な戦況となっております。

現在技術者部門の方も募集しています。よろしくお願いします。

下記日時に間に合うように準備し、作戦に参加してくれたら幸いです

作戦決行日時:10月12日 18時00分

現行スレ→【yutori7.2ch.net/test/read.cgi/news4vip/1255316576/
まとめwiki(要編集)www20.atwiki.jp/vipvsvank/pages/1.html

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■



268 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:46:49 ]
コピペ君って馬鹿だな、まで読んだ。

269 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 13:49:50 ]
"無効にしたい"って考えるから難しくなる。
"必要なときだけ有効にしたい"と考えればいい。

270 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 14:48:37 ]
>>260
*p = 3 によって pがpのアドレスから3に書き換わるため、
*pでそこを参照しようとするのは危険。

271 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 14:59:14 ]
0点 p = 3 と *p = 3 の違いからやりなおし

272 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 15:02:15 ]
Or2=3;

273 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 15:16:10 ]
>271
一般的なセマンティクスはそうだろうけど、>260ではint *にint **を代入している
暗黙の型変換でint **はint *に変換されて問題なく代入できる
しかし、実際にはint **であるので、int *を間接参照してもそれはintではなくint *である
正確に言えば、シンタックス上はintであるが、>260のセマンティクス上はint *であるのだ
よって、>270は正しいことを言っていると僕は考える

あくまでセマンティクス上の話だからね、実行した場合は未定義動作だな



274 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 16:14:01 ]
int** とint*暗黙的型変換が出来ることを好んでいるか否かは
CPUによるから、一般的にはあんまりしないほうが良いだろな
たとえ出来た場合でも、そのソースをその環境から出さないとい
うのならともかくよそで使われることを想定するのなら
本質的に処理系依存であることを明示する為に
キャスト演算子の直書きは避け
例えば
int **pint2ppint_80x86(int *)
int **pint2ppint_PowerPC_G5(int *)
とか使うべきだろうな(マクロでも良いが)

C++でクラスの場合は、直系クラス間でのポインタの相互運用性
は保証されている(できなければC++コンパイラと名乗る資格は
無い)からルールに沿って行うべきだが

275 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 18:48:40 ]
BCCのフリー版では getopt() がつかえないみたいなんですが、
コマンドライン引数は一般的にどのように処理しているのでしょうか?







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<215KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef