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


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

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132



1 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 13:10:57 ]
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
pc11.2ch.net/test/read.cgi/tech/1170338926/


GUIなどの標準Cではできない事の質問、ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.42【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1188748806/
C/C++の宿題を片付けます 95代目
pc11.2ch.net/test/read.cgi/tech/1187944110/


【このスレ住人としての心得】
ビットシフトはなんの役に立つのでしょうか でググれ

441 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:10:04 ]
>>439>>440
どうもです。
よくわからんかったんですけど、stdinのなかでも読んでるのかな?
いつもは書式("%d",a)見たいな感じで使ってるんですけど、
前問題で
scanf("%d",&a);
printf("あなたが入力したのは%dです");
があって、aの値が出力されたのでなんでだろうと思って聞いてみました。

442 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 01:39:09 ]
未定義動作なので、単なる偶然。
たぶんスタックが関係してるとおもうけど。


443 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:11:03 ]
> よくわからんかったんですけど、stdinのなかでも読んでるのかな?

違います。第2引数以降に順番に対応します。%d に限らずみんなそうです。
>>440 の例をよく吟味してみてください。

> 前問題で
> scanf("%d",&a);
> printf("あなたが入力したのは%dです");
> があって、aの値が出力されたのでなんでだろうと思って聞いてみました。

の答えが >>442 で、何かの問題としてそういうプログラムがあったのだったら、
それは誤植かバグ。

444 名前:デフォルトの名無しさん [2007/11/20(火) 12:26:52 ]
10から99までの10進数の数値を1の桁と10の桁に分けたい場合
どうすればいいでしょう?

例えば56を5と6に分けたい場合、どうすればいいのでしょう?

445 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:28:12 ]
56 / 10 → 5
56 % 10 → 6

446 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:36:56 ]
long型なんですが・・・

447 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:37:44 ]
あっ間違えました。ありがとうございました

448 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 12:48:28 ]
↑のような質問のスレではないので次の質問を書く人は注意

449 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 15:42:08 ]
>>448
これがゆとり世代と言うもの




450 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:20:32 ]
予約識別子について質問です。
今までは
・下線 _ で始まり英小文字 a-z が続く一般識別子は global namespace で予約済み
というルールから、
type_t function( type_t _parameter ){ return _parameter; };
のような仮引数名は予約識別子ではなかったはず(FAQでも同様の回答)なのですが、
「C99 では Reserved identifiers が『マクロ名を含む』になったから global namespace で #define _paramete されてたら仮引数名も上書きされない?」
と指摘されました。
恥ずかしながら、規格を読んでみても具体的に何が変わったのか私には分かりませんでした。

「今後は避けられるなら避けた方がよい」のは前提として、
既にある _parameter のような仮引数名は今でも安全なのでしょうか?

451 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:33:26 ]
処理系が _parameter というマクロを定義可能になったから、
処理系が _parameter というマクロを定義していた場合に
その引数の _parameter という部分が置き換えられるかもしれない、
という話じゃね。

C99 に対応してないだろう ANSI C/C++ 辞典を見ると、
下線で始まるマクロ名は全て予約識別子らしいから、
今でも問題があるかと。

下線を付ける場合は、普通後ろに1つだけ付ける。

452 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:06:34 ]
>>450
規格の範囲内で問題ないかといえば、問題ない。 >430 にあるように、タグ名を含む
ファイルスコープの識別子として予約されていて、マクロにも使える下線+英大文字とは
区別されている。

ただし、そういう指摘を受けて規格の詳細を見直さないと自信が持てないような
状況を避けるため、はじめから下線始まりの識別子を使わないようにしたほうがいい。

453 名前:デフォルトの名無しさん [2007/11/27(火) 15:48:32 ]
C言語ってさ、他のソースに定義してある関数とか引数ちがってmainの中で使ってもコンパイルエラーださないじゃん。

あと、まったく未定義な関数つかっても他のソースにあるかもしれないからとかいう理由でコンパイルエラーだしてくれないじゃん。
とても不便だよね。

なんで、コンパイラはそれくらいのことをしてくれないのかな?別に面倒じゃないと思うんだけど。

454 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 15:57:06 ]
>>453
大抵のまともなコンパイラなら、(宣言が見つからないと言う理由で)警告を出してくれると思います。
尤も、中にはデフォルトではその警告を出さないコンパイラもありますが。

詳しいことは、それぞれのコンパイラのスレなどでどうぞ。

455 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:03:46 ]
>>453 のような話題のためのスレではないので次の質問を書く人は注意

456 名前:453 [2007/11/27(火) 16:14:35 ]
>>454 thx 俺のコンパイラがいけんのか。そうか。

やっぱ高いのじゃないとだめだね。なんでも。貧乏人は苦労するよ。

>>455 C言語のコンパイラ全部そうだとおもってたんだよ。俺はトウシロウだから。

457 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:24:38 ]
>>456
ここはコンパイラの使い方のスレではないので程々に。
今無料で利用できるコンパイラの多くが警告を出せると思うので、調べてみてください。

458 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 16:51:26 ]
gccなら-Wall つけとけ

459 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 20:47:25 ]
本当はリンカの仕事だからな



460 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 00:49:19 ]
リンカにその情報は渡らんだろ。渡せるように作れるが。

461 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 07:14:08 ]
>>460
Cの関数はデフォルトだと内部リンケージだったっけ?

462 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 10:45:04 ]
いいえ。

463 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:12:34 ]
strcpy と wcscpy のようにアルゴリズムが殆ど同じだが扱う型・定数が微妙に違う関数を同時に実装する必要があるとします。
実装しなければならない数は 2〜3 型 x 30〜40 関数ぐらいとします。

このような場合、

/* strcpy.cpp */
char *strcpy( char *dst_, const char *src_ ) {
char *head = dst_; while( '\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}
/* wcscpy.cpp */
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) {
wchar_t *head = dst_; while( L'\0' != (*dst_++ = *src_++) ){ /* nop */; } return head;
}

と一つづつ同じような関数を書いていくのと

/* fallthrough */

464 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:13:12 ]
アルゴリズムだけ書いた

/* template/strcpy.cpp */
#ifdef XCS_IS_CHAR
#define char_t char
#define xcscpy_ strcpy
#define text_( text ) text
#endif

#ifdef XCS_IS_WCHAR
#define char_t wchar_t
#define xcscpy_ wcscpy
#define text_( text ) L ## text
#endif

/* strcpy, wcscpy */
char_t *xcscpy_( char_t *dst_, const char_t *src_ ){
char_t *head = dst_; while( text_('\0') != (*dst_++ = *src_++) ){ /* nop */; } return head;
}

のようなテンプレートを用意して

/* strcpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>

/* wcscpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>

と読み込ませるので、どちらが良いと思いますか?
あるいは、もっと良い方法がありますか?

465 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:16:38 ]
ちなみに発想は VC++ の crt のソースからです。

>>464 の訂正 /* ファイル名が逆 */

/* strcpy.cpp */
#define XCS_IS_CHAR
#include <template/strcpy.cpp>

/* wcscpy.cpp */
#define XCS_IS_WCHAR
#include <template/strcpy.cpp>

466 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:16:53 ]
C++だったら、C++の関数テンプレート機能を使う方がいい

template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};

467 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:21:52 ]
>>466
でもここは残念ながらCのスレ

468 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:50:08 ]
同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが

469 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:52:18 ]
早速の回答ありがとうございます。
共有するヘッダには C++ を使えないことになってますが、私のコードの中だけでも許可が出れば

/* strcpy.cpp */
template<typename T> T *xcscpy( T *dst_, const T *src_ ){
T *head = dst_; while( 0 != (*dst_++ = *src_++) ){ /* nop */; } return head;
};
char *strcpy( char *dst_, const char *src_ ) { return xcscpy( dst_, src_ ); }
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ ) { return xcscpy( dst_, src_ ); }

/* strcpy.h */
char *strcpy( char *dst_, const char *src_ );
wchar_t *wcscpy( wchar_t *dst_, const wchar_t *src_ );

とは書けますね。
訊いてみます。

ただ、'\0' を 0 としなければならないのが少し気になります。
関数によっては既存の定数や関数を参照しなければならないところもあるので

#define INVALID_INPUTCHARS "*?\"<>|\a\b\t\n\v\f\r" /* 入力禁止文字群 */
#define t_( text ) L ## text
#define xt_( text ) t_( text )
strhoge(){ return strpbrk( test_, INVALID_INPUTCHARS ); }
wcshoge(){ return wcspbrk( test_, xt_( INVALID_INPUTCHARS ) ); }

のような変換も自動で出来ると嬉しいのですが。



470 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 20:59:13 ]
>>468
ファイルスコープにしてファイルを分ければ可能

471 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:03:42 ]
>>468
>同時に実装しなければならないならプリプロセッサでの切り分けはできないと思うが
できますよ、というか出来てます。#undef まで書けば同じファイルにすら実装できます。
下の 2 ファイルを用意して test.cpp をプリプロセッサにかけてみてください。

/* ./template/test.cpp */
#ifdef TYPE_A
#define type_ type_ar
#define name_ func_a
#endif

#ifdef TYPE_B
#define type_ type_b
#define name_ func_b
#endif

type_ *name_( type_ *param );

#undef type_
#undef name_

/* ./test.cpp */
#define TYPE_A
#include "./template/test.cpp"
#undef TYPE_A

#define TYPE_B
#include "./template/test.cpp"
#undef TYPE_B


472 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:10:02 ]
>>471
それでいいならこれでもいいんじゃない?
#include<stdio.h>

#define DEF_SWAP(type) void swap_ ## type(type *a, type *b){type c;c=*a;*a=*b;*b=c;}

DEF_SWAP(int)
DEF_SWAP(char)

int main(void)
{
char val_char[2]={'A', 'B'};
int val_int[2]={1234, 5678};

printf("%c %c\n", val_char[0], val_char[1]);
swap_char(&val_char[0], &val_char[1]);
printf("%c %c\n", val_char[0], val_char[1]);

printf("%d %d\n", val_int[0], val_int[1]);
swap_int(&val_int[0], &val_int[1]);
printf("%d %d\n", val_int[0], val_int[1]);

return 0;
}

473 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:15:40 ]
いつだったかム板のどこかで C 言語で STL ってのを見た記憶がある
もちろんマクロ全開で使いまくりだが、中身を見なければ幸せだった気がする

474 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:20:23 ]
昔こんなんなら書かされた記憶はある。やっつけで再現してみた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5351.zip


475 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 01:29:50 ]
>>473
これか?
sourceforge.jp/projects/cstl

476 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 06:41:15 ]
統合開発環境なににしようか迷っているんですが・・・orz

アドバイスください。。。

477 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 08:41:56 ]
>>1 読め

478 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 09:38:48 ]
こんなところにマルチしに来ててワロス

479 名前:デフォルトの名無しさん [2007/11/29(木) 11:50:29 ]
・半角アルファベットの文字列を引数をして、文字列に含まれる大文字を
すべて小文字に変換する関数tolower_strを作成せよ
・この関数を用い、入力した半角アルファベットの文字列に含まれる大文字を
すべて小文字に変換し表示するプログラムを作成せよ
コード
#include<stdio.h>

void tolower_str( char []);
int main(void){
char str[256];
printf("文字列を入力して下さい:");
scanf("%s",str);
tolower_str(str);
printf("%s",str);
return 0;
}

void tolower_str(char t[]){
int k;
for (k=0;k!='\0';k++){
if(k>='a' && k<='z'){
k=k+'A'-'a';
}else if (k>='A' && k<='Z'){
k=k+'a'-'A';
}
}
}
実行結果
文字列を入力して下さい:TEST
TEST
変換できないのですtt教えて下さいlol



480 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:07:03 ]
>>479
小文字を変換しようとしてるのはどうして?
まあそれは置いといて、
for (k=0;k!='\0';k++){
ここでkを0に初期化してる(k=0)のに、0だったら抜ける(k!='\0')判定してるから

481 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:08:32 ]
もっと言うと、文字はkじゃなくてt[k]だろ。

482 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 12:12:48 ]
つーか、宿題スレか初心者スレへどうぞ。

483 名前:ニャン [2007/11/30(金) 18:15:48 ]
いくつか聞きたいことがあります


友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?

それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません

それから乱数の関数の使い方教えて下さい

あと
画像の表示方も教えて下さい

484 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:18:08 ]
次の患者さんどうぞ

485 名前:ニャン [2007/11/30(金) 18:21:03 ]
友達が検索エンジンに一括登録するソフトを作ったそうなんですが
ネット上のボタンをクリックしたり コメント枠に書き込んだりするのはどうやってプログラムするのですか?

それから初歩的なんですが
2文字以上の文字を保管するのはどうすればいいのですか?
char だと1文字しか保管できません

それから乱数の関数の使い方教えて下さい

あと
画像の表示方も教えて下さい

486 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:24:22 ]
関連が無いものを複数いっぺんに聞くなよ・・・
あと環境依存のやつはそれなりのスレで。

487 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:28:15 ]
>>483
> ネット上のボタンをクリックしたり コメント枠に書き込んだり
> するのはどうやってプログラムするのですか?

ブラウザがどういう仕組みで動いているのかを調べれば、どうやってプ
ログラムするかもわかるようになるよ。HTTP とか HTML とかね。



488 名前:ニャン [2007/11/30(金) 18:28:18 ]
すみません
いろいろ困ってたんで
せめて1番上だけでも答えてください
お願いします
ところで 環境依存ってなんですか?

489 名前:ニャン [2007/11/30(金) 18:30:40 ]
ブラウザってどうやって見るのですか?



490 名前:ニャン [2007/11/30(金) 18:36:20 ]
俺 コマンドプロンプト内で文字を表示させるくらいまでしか プログラムできないんで
もっと詳しく教えて下さい

491 名前:ニャン [2007/11/30(金) 18:45:33 ]
その友達に訊けばいいんじゃないですか。

492 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 18:48:52 ]
まず >>1 を読め
読み終わったら >>1 を読め

一回休んで、もう一度 >>1 を読め
ついでに >>2 も読んでおけ

493 名前:ニャン [2007/11/30(金) 18:49:23 ]
教えてくれないんです

494 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 19:36:43 ]
これはひどい

495 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:01:15 ]
9,6,4,7,12,14,1,11,10,15,3,5,8,13,2を小さいものから順に並び替える関数です。

0 #include<stdio.h>
1 void quicksort(int x[],int n){
2 int m;
3 int *pa=x+2. *pz=x+n
4 if(n==2){
5 if(x[1]>x[2])m=x[1],x[1]x[2],x[2]=m;
6 return;
7 }
8 while(pa<pz){
9 while(pa<=x+n && *pa<x[1])pa++;
10 while(pz>=x+2 && *pz>=x[1])pz--;
11 if(pa<pz)m=*pa, *pa++=*pz, *pz--=m;
12 }
13 if(pa>x+2)m=x[1],x[1]=*(--pa),:pa=m;
14 if(pa-x>2)quicksort(x,pa-1-x);
15 if(x+n-pz>1)quicksort(pz.x+n-pz);
16 }

これの8〜12行目の部分は、9行目で前から数列の6,4,7,12まで進み、
10行目で後ろから2まで進み、12と2を交換するという意味であってますか?





496 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:04:18 ]
>>495ですが、もしかしてスレ違いですか?

497 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 20:15:03 ]
そうです
次の患者さんどうぞ

498 名前:デフォルトの名無しさん [2007/11/30(金) 22:40:30 ]
Cで動的初期化というか、やりたいのは以下のような感じなんだが、
いいアイディアない?

あるヘッダファイルに以下のような定義がある。
typedef const struct ID_ {
  uint32_t a;
  uint8_t bc[2]
} * ID;
extern const ID ID_HOGE;

んで、実体は以下のような感じ。ちなみにID_HOGE_は公開されていない。
static const struct ID_ ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
const ID ID_HOGE = &ID_HOGE_;

んで、このIDと名前みたいなヤツの対応を静的に書いておきたい。
struct {
  ID id;
  char *name;
} MAP;
static struct MAP map[]={
  {ID_HOGE,"hoge"},
  ...
};

だが、動的な初期化が出来ないってコンパイラにはじかれてしまう。
どうしたらいい?ボスケテ天才プログラマー。

499 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 22:47:26 ]
static struct MAP map[]={
  {&ID_HOGE_,"hoge"},
  ...
};



500 名前:デフォルトの名無しさん [2007/11/30(金) 22:52:31 ]
>>499
いや、上にも書いたとおり、ID_HOGE_は公開されていなくて、
実体があるソースコードも書き換え不可なんですよ・・・。

501 名前:デフォルトの名無しさん [2007/11/30(金) 23:23:44 ]
今日からC言語の勉強を開始しようと思っていますが、初心者でも使いやすい
コンパイラーあれば、教えて頂けないでしょうか?
ちなみにVisual C++ 2005 Express Edition持ってます、使えますでしょうか?

502 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:28:12 ]
つ『14歳からはじめるC言語わくわくゲームプログラミング教室』
www.amazon.co.jp/gp/product/4899771517/

Borland C++使ってる。

503 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:29:45 ]
>>500
やりたいこと、よくわかんねけどさ。
こうじゃあかんの?

struct MAP{
const ID *id; // <ポインタに
char *name;
};
static struct MAP map[]={
{&ID_HOGE,"hoge"},
};

// 使用例?
int main()
{
printf("%x\r\n", (*map[0].id)->a);
return 0;
}


504 名前:デフォルトの名無しさん [2007/11/30(金) 23:39:05 ]
>>502 まだまだ軍資金がないもんで、フリーでできるものを願いします

505 名前:デフォルトの名無しさん [2007/11/30(金) 23:42:27 ]
最長共通部分列(LCS)問題について教えてください。

ある座標系が2つ(x1,y1),(x2,y2)が存在して、その座標系に
それぞれ10個の要素があったとします。各要素のx1,もしくはx2座標
とy1,y2座標に重複はないものとします。
要素          1 2 3 10
ex 座標系1・・・(x1,y1)={(4,3),(2,6),(5,9),,,,(10,1)}
座標系2・・・(x2,y2)={(1,5),(7,5),(9,8),,,,(3,4)}

この2つの座標系において要素間の位置関係が等しくなっている全ての要素の
のなかで一番要素数が多いものを割り出す。プログラミングは
どのように組めばいいのでしょうか?よろしく願いします。

506 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 23:48:20 ]
>>501
>>1-2

>>505
>>1-2

507 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 01:34:09 ]
>>498
そのやりかたではできない。
どうせmapは変更しないのだろうから、ID構造体を隠蔽してそのポインタを提供するのではなく
MAP構造体を隠蔽してそのポインタを提供する方式にするんだ。

// id.h
typedef struct{
  uint32_t a;
  uint8_t bc[2]
}ID;
typedef struct{
  const ID *id;
  const char *name;
}MAP_;
typedef const MAP_ * const MAP;
extern MAP map;

// id.c
static ID ID_HOGE_ = {0xaaaa, {0xbb, 0xcc}};
static MAP_ map_[]={
  {&ID_HOGE_,"hoge"},
  ...
};
MAP map=map_;

これでいけるはず

508 名前:デフォルトの名無しさん [2007/12/01(土) 02:04:09 ]
>>507
どこがMAPを隠蔽してるんですか?

509 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 03:12:18 ]
>507
hogeの実体部分のソースは変更不可だってんだからそれは駄目だろ
静的な初期化はあきらめて、mainの頭で初期化するか
map要素を返す関数を用意してそれが最初に呼ばれたときに初期化するかしかないな



510 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:01:43 ]
/* map.h */
ID map_ID(int);
const chat * map_name(int);

/* map.c */
struct {
  ID *id;
  char *name;
} MAP;
static struct MAP map[]={
  {&ID_HOGE,"hoge"},
  ...
};
ID map_ID(int n)
{
const chat * map_name(int n);


511 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:03:25 ]
途中送信しちった

/* map.c */
struct {
  ID *id;
  char *name;
} MAP;
static struct MAP map[]={
  {&ID_HOGE,"hoge"},
  ...
};
ID map_ID(int n)
{
  return *map[n].ID;
}
const chat * map_name(int n)
{
  return map[n].name;
}

これでいいんじゃ?

512 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 16:10:51 ]
>505
もうちょい正確にやりたいことを書かないと無理だと思うんだな。
何がしたいか正確には分からないけど多分 LCS とは別物だと思う。

>重複はない
座標系1の点 { (x10, y10), ... , (x19,y19) }
座標系2の点 { (x20, y20), ... , (x29,y29) }
で、どう重複がないのよ?i ≠ j なら x1i ≠ x1j って言ってるの?

>要素間の位置関係が等しくなっている全ての要素ののなかで一番要素数が多いもの
座標系1 に対して並行および回転移動を行った際、座標系1の点と座標系2の点とが一致する数が最大となる移動時での
一致する点の組みを選び出せばいいの?

513 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 17:47:56 ]
スレの趣旨から外れた質問は流せって

514 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 22:41:50 ]
プリプロセッサってたいがい
#define hoge
って書いてあるけど、インデントやスペースを挟んだ
  # define hoge
みたいな書き方も規格的にOKですか?


515 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 22:42:09 ]
うん

516 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 23:16:53 ]
字下げするときはそうすることが多いよNE

517 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 23:54:57 ]
ありがとうございます。
自信を持ってインデントします。

518 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 01:45:27 ]
>>511
ポインタのポインタをコンパイラ制限のために、さらにポインタに
するなど受け入れがたいため却下。

IDの比較はどうする?ポインタのポインタのポインタだから、
値を比較するには、ポインタのポインタn・・・とか、
ポインタのポインタが静的に定義されているから、
ポインタのポインタのアドレスで比較すればいいとか、
コピーするにはうんぬんとか。

ヤッテラレッカボケ!

519 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 01:52:34 ]
可能なら、動的初期化できるC++としてコンパイルすればほぼ498のコードで通る。
これだけのためにそうするのは少々無駄遣いという気もするけど。



520 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 03:07:50 ]
>518
IDはポインタだからID *はポインタのポインタどまりだろうが
お前はまず教科書読み直せ

521 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 03:11:31 ]
>>520
アゲアシとってナニが楽しいのかね。そうやって
見下すことでオノレの存在価値を認識する作業を繰り返す
人生なんてオワリにしたほうがいいよ。

522 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 03:18:59 ]
>>521
こんなところで見下されてる人生なんてオワリにした方がいいよ

523 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 03:36:44 ]
このあいだ関数プロトタイプ使いたくないとぬかしてたボケと同じ臭いがする

524 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 10:12:37 ]
>>518
その程度で受け入れ難いなら、まず「C言語を使う」という選択肢を捨てるべき。
C言語しか使えないならC言語の制限は受け入れるしか無いだろ。jk

525 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 10:34:24 ]
>>524
同意。言語の制限が枷になるなら言語選択からやり直すべき。

526 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 11:21:12 ]
Dおすすめだにょ!

527 名前:デフォルトの名無しさん [2007/12/07(金) 12:25:18 ]
整数型のオーバーフローについて質問です。符合無し型ではラップすると規定されていて、
符号付き型では未定義動作になると理解しました。

その場合、以下のようなコードは「ラップする」と「未定義動作」のどっちになるんでしょうか?

unsigned char c = 1;
c += INT_MAX;

期待する動作としては符号無しのルールに従ってラップした結果が c に残って
欲しいんですが、 c = c + INT_MAX の右辺の c は int (符号付き)に格上げされて
しまうので、未定義動作という解釈もできるように思います。

後者の場合、未定義動作を避けるためには明示的に
c = (unsigned int)c + INT_MAX と書く必要があることになってしまいそうですけど、
ちょっと意味不明なコードになってしまいます。

528 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 12:38:32 ]
c += (unsigned int)INT_MAX;

529 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 21:00:23 ]
c = (unsigned char)((unsigned int)c + INT_MAX)

無理して規格の解釈ギリギリのコード書く必要もあるまい。




530 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 09:39:13 ]
もしかして下線1文字 _ って予約識別子ではない?


531 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 10:45:41 ]
予約識別子は __func__ だけじゃないかな。
予約マクロにも下線二文字か下線+英字と最低二文字を想定しているっぽいし、
下線一文字は処理系で特別に解釈されるようなことはないと思う。
普通に変数名としても使えるし。

532 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 11:51:47 ]
下線1文字 _ は
・二重下線を含む
・下線 _ で始まり英数文が続く
どちらのルールにも当てはまらない。
だから「予約識別子ではない」だろうね。

>予約識別子は __func__ だけじゃないかな。
>
>下線一文字は処理系で特別に解釈されるようなことはないと思う。
>普通に変数名としても使えるし。
たとえ予約識別子だろうと "普通に変数名として使える" よ。
"処理系で特別に解釈される" のではなく "処理系が既に使っている可能性がある" 名前。

533 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:06:58 ]
何を以って普通と言うかはわからないが、未定義の動作が伴うことは"普通に変数名として使える"と言えるのか?
処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
処理系依存としか言えない。

534 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 12:52:31 ]
C99しか見て無いけど。

>>530
ファイルスコープは予約されてるっぽい。

>>531
マクロ名も識別子らしい。

自分から進んで規格見ないから勉強になるわぁ。

C89はシラネ。
どっかで見れないかね?
お取り寄せメンドイ。

535 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 13:17:21 ]
>>530
_ はC89の頃から大域名前空間では予約済み。

>処理系が予約している識別子を他の予約されていない識別子と同様に扱えたとして
というか、処理系は予約識別子も予約されていない識別子も同様に扱う。
名前の上書きが問題になるのは識別子が予約されているかどうかとは別の問題。
例えば

char hoge[]="hoge";
…………
hoge[10] = '\0';

ってコードは言うまでもなく未定義で正しくないコードだが、
それでも "普通に書ける" コードではあろう。


536 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 13:19:43 ]
"普通"の定義によるんじゃない?
コンパイルが通るだけで普通なのかってことになるだろ

537 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 13:37:38 ]
そこはコンパイラの説明書を読めとしか。

538 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:50:48 ]
イマサラだけど「普通」って文化の問題だから、
規格と比べて云々しても答え出ないっしょ。

肯定も否定もでけまへん。

539 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 15:36:42 ]
根本的に間違ってる。
コンパイルできるかどうかも処理系依存だということを忘れてる。

よって処理系に依存しない書き方が普通。



540 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 16:06:01 ]
C89のコードが普通のところもあれば
C99のコードが普通のところもあれば
gcc依存のコードが普通なところもあれば

言えばキリが無いよ。
何が普通かなんて、語るだけナンセンス。

541 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 16:30:37 ]
このスレでは普通についての議論はしません






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

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

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