【◆QZaw55cn4c 隔離】C/C++の問題を片付けますat TECH
【◆QZaw55cn4c 隔離】C/C++の問題を片付けます - 暇つぶし2ch258:デフォルトの名無しさん
10/12/01 14:55:17
>>257
役立たずの池沼のお前は宿題スレに来るな、キモイから

259:デフォルトの名無しさん
10/12/01 15:35:30
>>258
役立たずで荒らすしか能がない◆QZaw55cn4cは悔しいでちゅねー

260:デフォルトの名無しさん
10/12/01 15:53:55
>>259
宿題スレで答えもせずにギャーギャー騒いでいた池沼のガキ
早く死ねよ

261:デフォルトの名無しさん
10/12/01 15:54:34
>>260
ガタガタ言わずにお前が死ね

262:デフォルトの名無しさん
10/12/01 17:28:25
>>259
宿題に関係のない争いで荒らしていたのはお前だろ、自覚症状のない痴呆症

263:デフォルトの名無しさん
10/12/01 17:30:22
>>262
自分の事を言っているわけですね、わかります
つーかいちいちageんなカス

264:デフォルトの名無しさん
10/12/02 08:50:00
URLリンク(codepad.org)

265:デフォルトの名無しさん
10/12/02 09:13:36
>>263
荒らしてたのはお前だろ!何しらばっくれてんだ。
>自分の事を
お前の事だよ、ageられて都合が悪いのは池沼のお前だろ!

266:デフォルトの名無しさん
10/12/02 09:22:12
>>263
宿題に答える気も無く個人攻撃の為だけに宿題スレを荒らしやがって!
お前の書き込みは運営、管理者にバレてんだよ。通報しておくぞ。

267:デフォルトの名無しさん
10/12/02 18:56:34
>>265>>266
荒らしの当事者が必死です

268:デフォルトの名無しさん
10/12/02 19:09:05
( ´,_ゝ`)プッ

269: ◆QZaw55cn4c
10/12/02 21:47:27
スレリンク(tech板:829番)
URLリンク(codepad.org)

270:デフォルトの名無しさん
10/12/02 22:10:16
>>269
なんだが"void*のサイズが未知です"ってエラーが一杯出るんですが・・・

271: ◆QZaw55cn4c
10/12/02 22:25:17
>>270
ご指摘ありがとうございます。gcc では OK でも、bcc32 ではダメなことがわかりました。
今、C89/C99 を確認しています。
動くものが必要でしたら、とりあえずの解決方法に思いいたっておりますので、ご連絡いただければすぐに書き直します。

それにしても stdlib.h の qsort() などは、C で実装するとなると、どうすればいいのでしょうか。

272:デフォルトの名無しさん
10/12/02 22:58:35
int * にキャストすれば済む話だと思うんだが

273:デフォルトの名無しさん
10/12/02 23:23:20
>>269
やっぱりよく分からんなクイックソート。
シンプルに作ってくれてるようなので、
しばらく追いかけて遊んでみるわ。
モリタポはやれんが、宿題どうもありがとう。

274: ◆QZaw55cn4c
10/12/02 23:23:31
>>272
いや、キャストするなら char * でしょう。sizeof(char) == 1 ですから。

void myqsort(void *base, int n, int size, int (*comp)())
にたいして、
double a[N];
myqsort(a, N, sizeof(a[0]), cmp);
と呼び出した場合、内部で、&a[i] をもとめるのに、
base + i * size
としているのが問題になっています。
void *base なので、sizeof(void) がわからないというエラーのため、base + i * size が計算できないのです。

275:デフォルトの名無しさん
10/12/02 23:50:23
1つ目はこうしたらもっとよくなるという内容です。
Bsort関数中
 n--;
 } while (flag > 0);
こうしたほうが、効率かなり上がります。
まぁQsortとは比較になりませんが。

もう一つは質問で、
cmpで型不問にしたいのなら
 #define cmp(a,b) ((a) == (b)) ? 0 : ((a) > (b)) ? 1 : -1)
見たいにマクロにしちゃうのはだめでしょうか?

276:デフォルトの名無しさん
10/12/03 00:02:08
>>274
gccでは通るということは void* が char* に暗黙キャストされてるって事なのかい?
それって規約的にはどうなんだろう?

277: ◆QZaw55cn4c
10/12/03 00:08:55
>>275
バブルソートの改良案は理解できます。
>>269 に沿って記述すれば、一回のループで値が大きいものから順に配列の引数の大きい側に寄せられていきますから、
i 回ループをまわれば配列の大きい側から i 個までは比較交換する必要はない、というわけですね。
ただ、以前よりバブルソートのお題は、URLリンク(en.wikipedia.org) に沿ってかくようにしています。
改良しても計算オーダーは、やはりΟ(n^2) で変わりがない、ということもあります。
(改良前:n^2, 改良後:1/2 * n * (n + 1))

>マクロにしちゃうのは?
構造体の配列があって、その構造体独自の大小関係を自前で定義して、ソートをかけることを想定しています。
struct c { double r, i; } a[100];
cmp(struct c *a, struct c *b) { return (a->r * a->r + a->i * a->i) - (b->r * b->r + b->i * b->i); }
myqsort(a, 100, sizeof(struct c), cmp);

stdlib.h の qsort() を一度自分で実装したくなって、この問題に着手した次第です。

278:デフォルトの名無しさん
10/12/03 01:26:01
>>276
こいつ多分 -ansi オプションを付けないでコンパイルしてるんだろう

279:デフォルトの名無しさん
10/12/03 01:27:30
今見たら>269はひどい
void *に対して演算子ちゃだめでしょ、たまたまsizeof(void) == sizeof(char)だったわけで
普通はchar const*にキャストして演算する

cmp()についても関数ポインタのキャストは可能であるんだけど、
JISX3010(C言語)の6.3.2.3ポインタ
型変換されたポインタを関数呼び出しに用い、関数の型がポインタの指すものの型と適合しない場合、その動作は未定義とする。
らしいんでint(*)(const int*,const int*)な関数をqsortに渡すのは動作が未定義となる。

280:デフォルトの名無しさん
10/12/03 01:33:14
◆QZaw55cn4cって
宿題スレの他回答者のコードを良く理解しないままパクる事多いよね

281:デフォルトの名無しさん
10/12/03 01:59:12
>>277
オーダー同じなら改良しなくていいとか思ってるなら、プログラムやめろ

282:デフォルトの名無しさん
10/12/03 10:15:43
>>279
C99の規格票で済まないがこんな項目がある

26 A pointer to void shall have the same representation and alignment requirements as a
pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of
compatible types shall have the same representation and alignment requirements. All
pointers to structure types shall have the same representation and alignment requirements
as each other. All pointers to union types shall have the same representation and
alignment requirements as each other. Pointers to other types need not have the same
representation or alignment requirements.

この規格票から見れば、void * に対する演算は、char * に対する演算と等価だと言っている。
だからBCCがおかしいと言えない事もない。

ちなみにgcc 4.5.1に-ansiを付けてコンパイルしてもコンパイルは通る
gccが正しいのなら、BCCが規格通りではない(C89はどうだが知らないが)という事になる

283:デフォルトの名無しさん
10/12/03 10:19:52
あ、言うのを忘れた

gccでは>>269はコンパイルは通るし、「正しく動く」つまり規格票通りなわけだ

284:デフォルトの名無しさん
10/12/03 10:22:17
mingwらしいから多分gcc3.4ぐらいを想定すべきだよな

285:デフォルトの名無しさん
10/12/03 12:22:35
>>282
なんか shall って弱くねぇか?「としても良い」くらいにしか読めないんだけど
別に bcc に限らず void* に対して加減算するのは変だってのは一般的感覚に思えるんだけどねぇ
実際にそんなコード書いたらレビューで叩かれるし....

286:デフォルトの名無しさん
10/12/03 12:39:35
>>285
JIS-X3010には同じ箇所は

voidへのポインタは、文字列型への表現及び同じ境界調整要求を「持たなければならない」。

とあるね。
「としても良い」とは訳してないようだ。

287:デフォルトの名無しさん
10/12/03 13:03:34
>>286
単に >>282 を見ての意見だから JIS がどう訳したなんて知らんよ、この業界は誤訳も多いしね

少なくとも void* に加減算なんてタココードは普通の現場では許されないって話は確かだよ
bcc がその規約から外れてるのはこれを一般的と解釈しての結果だろうな

288:デフォルトの名無しさん
10/12/03 13:37:26
>282
C89でもそうなっていったわ
3.1.2.5 Types
A pointer to void shall have the same representation and alignment
requirements as a pointer to a character type. Other pointer types
need not have the same representation or alignment requirements.
まさかのキャラポ、まぁ感覚的には気持ち悪いが規格が正義だからいいや

C99ではさらに、引数、戻り値、共用体のメンバにおいてそれが暗に行われるっぽいね
これ以上はガチスレ行った方が良さそうだ

char*と同じ表現(?)と境界を満たすのはvoid*が無かったころの関数と互換性を保つためなのだろうか

289:デフォルトの名無しさん
10/12/03 13:41:59
まあ、1バイトの型の代表だからじゃね? memsetも、

 void *memset(void *s, int c, size_t n);
 sは、unsigned char *型にキャストされ、cは、unsigned char型にキャストされる。

とある。

290:デフォルトの名無しさん
10/12/03 14:02:22
>288
なんか書いてないかなぁと思ってRationale読んだら書いてあった
3.1.2.5 Types
A pointer to void must have the same represen-
tation and alignment as a pointer to character; the intent of this rule is to allow
existing programs which call library functions (such as memcpy and free) to con-
tinue to work.
やっぱりそうだったか

291:デフォルトの名無しさん
10/12/03 15:08:09
ちなみにC++では規則はかなり異なっていて

§3.9.2
4 Objects of cv-qualified (3.9.3) or cv-unqualified type void* (pointer to void),
can be used to point to objects of unknown type. A void* shall be able to hold
any object pointer. A cv-qualified or cvunqualified (3.9.3) void* shall have the same
representation and alignment requirements as a cv-qualified or cv-unqualified char*.

はいいのだが

§C.1.2.4.10
Change: Converting void* to a pointer-to-object type requires casting
char a[10];
void *b=a;
void foo() {
char *c=b;
}
ISO C will accept this usage of pointer to void being assigned to a pointer to object type.
C + + will not.
Rationale: C + + tries harder than C to enforce compile-time type safety.
Effect on original feature: Deletion of semantically well-defined feature.
Difficulty of converting: Could be automated. Violations will be diagnosed by the
C++ translator. The fix is to add a cast For example:
char *c = (char *) b;
How widely used: This is fairly widely used but it is good programming practice to add
the cast when assigning pointer-to-void to pointer-to-object. Some ISO C translators
will give a warning if the cast is not used.

などなどいろいろ制限が強くなっている

292:デフォルトの名無しさん
10/12/03 15:30:29
sizeof(void)ってw

293:デフォルトの名無しさん
10/12/03 15:58:55
個人的な主観で説明する人も増えて、アスペルガーっぽい融通の利かない人も
目立ちますね。最終的には「お前がそう思うんならそうなんだろう、お前ん中ではな」
って言われて一蹴されますよ。

294:デフォルトの名無しさん
10/12/03 16:14:57
>>293
規格の話をしてるんだが、なぜそこでアスペルガーの話が出てくるんだ?馬鹿かお前?
規格は規格だ
それ以上でもそれ以下でもない
主観が入る余地もない

295:デフォルトの名無しさん
10/12/03 16:59:19
話についていけないけど、とにかく他人を煽りたい

296:デフォルトの名無しさん
10/12/03 17:24:40
>>295
とにかく他人を煽りたい奴は自己愛性人格障害と考えられます
現在の精神医学では不治の病です
最も人に嫌われる精神障害です

297:デフォルトの名無しさん
10/12/03 19:57:26
printf("%d\n",sizeof(void));
してみたら
 gcc(v3.2.2 , v3.4.5 , v4.3.4)実行結果 1
 cl(Version 12.00.8804)実行結果 0
 bcc32 コンパイルエラー
 CC38H コンパイルエラー (H8用Cコンパイラ)
となった。まともに動くのは gcc のみかな。

298:void* = void* + size_t
10/12/03 19:59:33
linux-2.6.37-rc4
/include/linux/relay.h の30行目

/*
* Per-cpu relay channel buffer
*/
struct rchan_buf
{
    void *start;          /* start of channel buffer */


linux-2.6.37-rc4
/karnel/relay.c の1090行目

/*
*   subbuf_read_actor - read up to one subbuf's worth of data
*/
static int subbuf_read_actor(size_t read_start,
               struct rchan_buf *buf,
               size_t avail,
               read_descriptor_t *desc,
               read_actor_t actor)
{
    void *from;
    int ret = 0;

    from = buf->start + read_start;



299:デフォルトの名無しさん
10/12/05 22:30:17
テスト

300:デフォルトの名無しさん
10/12/05 22:33:57
テスト

301:デフォルトの名無しさん
10/12/05 23:48:48
テスト
Σ(☉◇☉)

302:デフォルトの名無しさん
10/12/05 23:51:19
学期末テストですか?

303:デフォルトの名無しさん
10/12/06 00:19:59
test

304:デフォルトの名無しさん
10/12/06 09:38:05
ポスト


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch