スレを勃てるまでもな ..
[2ch|▼Menu]
39:デフォルトの名無しさん
09/03/03 02:23:35
>>36
scanfをあまり使わないほうがいいとは思うが、理由を知らないと意味が無い類のものなので
調べてください

40:デフォルトの名無しさん
09/03/03 04:05:36
>>36
case by case

41:デフォルトの名無しさん
09/03/03 06:13:07
>>36
参考書による違いは、参考書を読まないと判らない。
何故なら、getchar()でやる方法を練習のために示す本もあるから。
scanf()は万能ではないし問題点もあるから使わないに越したことはないが、
だからと言って取り敢えず使うためのプログラムにgetchar()で作るのは愚。
まぁ、余程のことがない限り、fgets()(+sscanf()かatoi()かstrtol()か)で事が足りる。
# そして、余程のときはやはりgetchar()では事が足りないので環境依存の方法が必要。

42:デフォルトの名無しさん
09/03/03 12:26:07
>>39-41
ありがとうございました

43:デフォルトの名無しさん
09/03/03 12:30:08
>>36
scanfにはちゃんとバッファオーバーフローさせない方法もあるから
その点を理解して正しく使う分には問題ないよ。
実際scanfは便利。

44:デフォルトの名無しさん
09/03/03 12:38:13
>>38=>>36 ?

45:デフォルトの名無しさん
09/03/03 21:21:53
おまいらscanfなんてどうでもいいから早く>>33を誰か答えろ
ここにはscanfしか語れない初心者しかいねぇのかYO

46:デフォルトの名無しさん
09/03/03 21:44:23
カレント要素って何?

47:デフォルトの名無しさん
09/03/03 21:46:48
33はC++よりも日本語をまず勉強すべきだと思う

48:デフォルトの名無しさん
09/03/03 22:07:53
エスパーすると

リストの内部イテレータが外部インターフェースに対してスタティックに成るけど
オレ様の用途に十分かどうか教えてくれ。

と 33 は問いかけてると読む。

49:33
09/03/03 22:37:54
>>48
その通り。君はプロだ。やっぱプロは違うなぁ

で見解は?

>>46>>47
チミたち、C++ならいたての学生には用はないのだよ
気安くレスしないでくれ

50:デフォルトの名無しさん
09/03/03 22:40:10
そのlistが最早更新されないのならiteratorで医院で内科医?

51:デフォルトの名無しさん
09/03/04 00:40:04
とある関数のソースで、
void test(char yui,...) とある場合、...の意味するものはなんでしょうか?

52:デフォルトの名無しさん
09/03/04 00:41:47
可変引数リスト

va_start、va_end、va_arg
URLリンク(www.geocities.co.jp)

53:デフォルトの名無しさん
09/03/04 05:28:00
char str[MAX_PATH];
memset(str, `\0`, MAX_PATH);
lstrcpy(str, ゙53゙);

if(str[0]==`5`)
{
MessageBox(hWnd,゙ウンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}
else
{
MessageBox(hWnd,゙チンコ―(・∀・)゙,゙今夜のメニュー゙,MB_OK|MB_ICONHAND);
}

今夜のメニューがウンコ―になるためには、
if(str[0]==0x52)のようにしなきゃ駄目ですか

54:デフォルトの名無しさん
09/03/04 07:11:26
lstrcpyをstrcpyにしてみては?

55:51
09/03/04 07:14:51
>>52
そのリンク先で、myfunc( "test" , 100 );とよびだされた場合、
"test"というのはどう扱われるのでしょうか?

56:デフォルトの名無しさん
09/03/04 07:23:32
>>55
URLリンク(www.geocities.jp)
なるたけ単純な具体例のあるページ


57:デフォルトの名無しさん
09/03/04 07:43:01
>>55
そこは引数の数があってないので参考にするな
ちなみに"test"は引数の開始位置を得るだけにしか使われていない


58:デフォルトの名無しさん
09/03/04 08:16:17
>>55
...の直前の引数(va_startの第2引数)に入る。

59:デフォルトの名無しさん
09/03/04 08:49:08
>>37
そんなことに、まともに答えられないお前もどうかと

60:デフォルトの名無しさん
09/03/04 11:01:27
指定したディレクトリ以下のファイル、ディレクトリをすべて
取得するような関数ないでしょうか?

61:デフォルトの名無しさん
09/03/04 11:02:42
opendir readdir

62:デフォルトの名無しさん
09/03/04 11:32:24
>>60
環境依存

63:デフォルトの名無しさん
09/03/04 12:02:15
>>62


64:デフォルトの名無しさん
09/03/04 12:10:11
多数の変数を単なるバイト列にその場でパックする方法で質問です。
通常なら

 uint8_t buff[1024]; memcpy(buff, var1, sizeof(var1); ...
 callfunc(buff);

などするか、

 struct { var1_t a; var2_t b; ... } buff = { var1, var2, ... };
 callfunc(&buff);

とすると思いますが、両者ともサイズ計算とか型情報をその場に
書く必要があり、長いこともあり簡潔にできないかなと考えています。

実はgcc拡張ですらない、環境依存な挙動レベルでは

 uint8_t *buff = (uint8_t *)&(struct {}){ var1, var2, ... };

というのが動いたりして、ソース記述としては一番気に入っているのですが、
当然使えません。そこで質問ですが、これくらい簡潔(冗長な情報を
書かずに済ませられる)に書け、さらにせめて実装別の拡張程度で済ませられる
バイト列へのパッキング方法ってないでしょうか?

65:デフォルトの名無しさん
09/03/04 12:25:13
struct buff{buff, ite};
テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))〜; buf.ite+sizeof(t); return &buf}

66:デフォルトの名無しさん
09/03/04 12:45:58
C++が使えるならテンプレート引数の類推かね
でもなんとなくCに見える

class Pack
{
char buff_[1024];
int size_;
public:
Pack() : size_(0) {}
operator char const *(){ return buff_; }
int size(){ return size_; }
template<class T> friend Pack &operator <<(Pack &pack, T t)
{
memcpy(pack.buff_ + pack.size_, &t, sizeof(T));
pack.size_ += sizeof(T);
}
};
// Pack p; p << val1 << val2 << val3;

67:デフォルトの名無しさん
09/03/04 12:57:41
struct<T, l> BI{ T &buff[l]; ite};
BI& <T>push(BI&, T&){ memcpy(if(BI.ite + sizeof(T) < sizeof(Bi.buff))BI.buff[ite], T, sizeof(T)); BI.ite += sizeof(T); return BI}

int buff[99];
BI<int, 99> b = { buff, 0};
b = push(b, Z) = push(b, Y) = push(b, X);

68:デフォルトの名無しさん
09/03/04 13:44:38
構造体のコンストラクタでは駄目なの?

69:64
09/03/04 20:18:52
すみません、言語はCなのでなかなかうまいのがないですね・・・

とりあえず

memcpy方式
-> オフセット計算が煩雑だし、エンディアン変換でさらに冗長になるので却下

struct方式
-> 型情報と構造定義と代入側の順序をメンテするのが面倒だが、
  型チェックもしてくれるだろうしこれが妥当か・・・

sprintf方式(mprintf(buf, "NVc", v1, v2, v3) みたいなのを自分で作る)
-> 一番見通しがいいけど、型チェックが不可になる

という感じに考えが行きつつあります。具体的なコードだと

 #define T(n) typeof(n) _ ## n /* require gcc */
 void myfunc(uint8_t a, uint32_t b) {
   typedef struct __attribute__((packed)) { T(a); T(b) } in_t;
   nextcall((uint8_t *)&(in_t){ a, htonl(b) });

みたいな感じです。が、やってみると型チェックしてくれないので、まだ悩み中。


70:デフォルトの名無しさん
09/03/04 20:23:15
C言語のソースをJavaなどへの移植性が向上するようにコードを修正してくれるツールは無いでしょうか?

たとえば以下のようなコードがあった場合
int a;
if(a){

int a;
if(a != 0){ //
と変更したり、
boolean c()
{
int r = 0;

return r;
}

boolean c()
{
int r = 0;

return (r != 0);
}

する。

71:デフォルトの名無しさん
09/03/04 20:27:21
正規表現でどうとでもなるんじゃね?

72:デフォルトの名無しさん
09/03/04 20:42:14
>>69
扱う型の種類、パックする環境、アンパックする環境、を可能な限り詳しく教えて下さい。

特になぜエンディアンが問題になるのか解るように。

73:70
09/03/04 20:58:04
変数の型を調べる必要があるので正規表現では無理なような気がします。
boolean a;
if(a)
{
とか
boolean c()
{
boolean r = 0;

 return r;
}
の場合は修正の必要は無いです。

74:デフォルトの名無しさん
09/03/04 21:04:05
そもそもC標準にbooleanなんて型はない

75:デフォルトの名無しさん
09/03/04 21:13:52
>>72
char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな

76:64
09/03/05 00:32:45
>>72
いまCodeWarriorっていうIDEのOSSなプラグインを改造して、WIN(VC++)+UNIX(gcc)で
使えるツールに仕立てようとしています。機能は組み込み開発用デバッグアダプタの
USB越しのコマンド制御で、レジスタ読んだりMCUステップ実行させたりします。

扱う型自体はu?int(8|16|32)_t(かそれをtypedefした/enumで結果的にいずれかに
落ちた)型だけです。パック・アンパックはホスト側でだけですが、ターゲットのエンディアンは
MCUで異なるのと、ホストもx86以外もあるのでhtonlなどの他、htoll(host-to-littelong)
なども用意して使っています。

memcpyだとエンディアン変換で面倒云々は

 myfunc(uint32_t hoge) {
    hoge = htoll(hoge);
    memcpy(buff, &hoge, 4)

などアドレス取るために行数が倍になるという話です。ここは一行にまとめて書けるstructや
パッキング関数に渡す方法のほうがすっきりします。

既に一度ざっと移植したのですが、元ソースが

 *(unsigned int *)(data + 2) = hogehoge;
 data[6] = hoge;
 *(unsigned char *)(data + 7) = fugafuga & 0xFF;

とかややぐちゃっとしてるので、もっとすっきりとUSBで流し込むバイト列の生成が
できないかなぁと質問してみました。まあせいぜいコマンド1つあたり5変数程度
パックするだけなんで、大問題というより途中から面白くなってきたのでやってるのですが。

77:64
09/03/05 00:42:26
>>69 で型チェックしてくれないというのは間違いで、gccではオプションが漏れてました。

 gcc -pedantic --std=(gnu|c)99 -Wall -Wextra -Werror -Wconversion

でいけた(-Wconversionがチェック用)ので、今のところstruct方式がエレガントかなぁと。

いまはVC++で使える方法を探してます。こっちはC++なんで、元のキャスト代入方式より
簡潔にはしたいですが、もっと色々とできそう。typeof/decltypeを見つけて小躍りしましたが、
これはVC++では使えないのですね・・・

78:デフォルトの名無しさん
09/03/05 00:58:00
>>76
ターゲットのMCUによってエンディアンが異なるなら、
memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか?

なぜmemcpyでだけエンディアン変換が問題になるのでしょうか。

79:デフォルトの名無しさん
09/03/05 01:01:42
memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。

80:64
09/03/05 01:22:25
>>78
もちろんそうですが、memcpyベースだと2つの文になります。
引数やstructの中なら横に{ htons(v1), htonl(v2), v3, ...} と}羅列できるので、
やや行数的にお得かなと気持ちが傾いてます。

>>79
はい、元コードがキャスト方式です。ただ、キャストとmemcpyは書き込み先バッファの
オフセット位置を明示的に調節する必要があるので、「とりあえず変数を並べると
よろしくパッキングされる」みたいにできないかなぁと。

まあベタに書いてく元コードでいいじゃん?てな気もする程度の問題ですが、
色々方法がありそうで面白いので深追いしてみようかなと。


81:デフォルトの名無しさん
09/03/05 07:36:42
>>80
重要なのはソースの行数だけですか?
(1)ソースの行数、(2)ソースの文字数、(3)ソースの可読性、(4)オブジェクトのサイズに優先順位を付けるとどうなりますか?

82:デフォルトの名無しさん
09/03/05 08:35:55
ドメストがおすすめ

83:64
09/03/05 09:18:13
>>81
各項目での自分的評価だと、こんな感じです(1が最も短い・速い・わかりやすい・etc):

cast: 3321
標準的な記法で、外部知識を要しない。オブジェクトサイズも最小。ただ、キャストの嵐が目に
やさしくない(マクロで対処は可能)のとオフセット計算が間違えやすい。パックされた構造の把握は
縦に読む必要がある。縦の行数はパック対象変数分程度。バッファコピーが必要になるとmemcpyが必要。

 例: *(uint32_t *)(dst + 4) = (uint32_t)htonl(src); <- これがN行続く

memcpy: 4211
標準関数なので、外部知識を要さず、サイズも呼び出しのみで小さい。キャストも不要。
オフセット計算は必要で、転送データ構造のイメージは縦に読んで把握する必要がある。
縦の行数は最大で対象変数の数+エンディアン変換数程度で最大。

 例: src = htonl(src); memcpy(dst + 4, &src, sizeof(src));  <- これがN行続く

struct: 2222
外部知識は要しないが、一般性で劣る。サイズはキャスト方式と同等か、スタック消費分劣る。
オフセット計算が不要で、構造イメージは横に並んだ順そのままで把握はしやすい。しかし、
構造定義が長くなりがちで、変数の使用位置から離れるとズレやすいかも。バッファコピーが必要に
なるとmemcpyが必要。

 例: struct { uint32_t _a; uint8_t _b, ... } buf = { htonl(src1), htonl(src2), ... }; <- スタック利用
  or typedef struct { uint32_t _a; uint8_t _b, ... } in_t;
    *(int_t *)(buf + 4) = { htonl(src1), htonl(src2), ... }; <- 既存バッファへの書き込み

mprintf: 1113
フォーマット表記の知識を得る必要があるが、処理部分のコードはかなり簡潔にデータ構造を
表現・理解できる。ただし、mprintfの実装分、メモリと処理速度で劣る。処理の中身はmemcpy。

 例: mprintf(buf + 4, "NN...", src1, src2, ...);

84:デフォルトの名無しさん
09/03/05 10:58:37
Cを勉強しているのですが
虚数を含んだ計算式を作る必要があるのですが
色々調べたところ、<complex.h>をインクルードすると
虚数iを大文字Iとしてプログラムを書くことで虚数を扱える、とあったのですが
下のようなビルドエラーが出てしまいます(complex.hが無い、という意味か?)。

fatal error C1083: include ファイルを開けません。'complex.h': No such file or directory

ちなみに、VC++2008を使って勉強していますが
ソース自体はCの文法で書いています。
webでも色々調べたんですが、解決方法は見つからず・・・どなたか助言下さい。

85:デフォルトの名無しさん
09/03/05 11:24:30
>>84
C++用の
<complex>
ならあるみたい


86:デフォルトの名無しさん
09/03/05 11:51:19
複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。

87:デフォルトの名無しさん
09/03/05 14:58:34
printf("ロベール先生の第27章から忌み不明になってきた");

88:デフォルトの名無しさん
09/03/05 15:58:16
#include <iostream>
using namespace std;
#include <math.h>

#define FNC void fnc();

FNC;
int main()
{
fnc();
return 0;
}

FNC
{
cout<<"FOFOOFOF"<<endl;
}


どこが間違っているんでしょうか?

89:デフォルトの名無しさん
09/03/05 16:01:21
#define FNC void fnc()

セミコロン入れたらダメじゃね? 知らんけど。

90:デフォルトの名無しさん
09/03/05 16:04:49
>>89
ハイパーサンクス

91:デフォルトの名無しさん
09/03/05 18:27:57
>>84
そんな事に手間取るくらいなら自前で作った方が早いだろ。

加減算、乗算は一瞬でしょ。
割り算は意味わからなくても公式で一発だし。

92:デフォルトの名無しさん
09/03/05 18:31:38
>>83
fputcの要領で、16ビットや32ビットなど必要なものを
(中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう?
と思ったが、VC++だとfmemopenがないから駄目だよな。

93:デフォルトの名無しさん
09/03/05 18:45:46
>>84
適当に探せば外部のライブラリがありそうじゃない?
それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?

94:デフォルトの名無しさん
09/03/05 19:15:15
try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?

95:デフォルトの名無しさん
09/03/05 19:31:37
例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。

「自分で書くコードが、どんなときに例外をスローすべきなのか」
となると別の話になるけど。そういうことが聞きたいの?

96:デフォルトの名無しさん
09/03/05 19:40:34
h = FindFirstFile( path, &data );
で FindFirstFile( )関数の失敗した値
INVALID_HANDLE_VALUE
が返ってきた時
if( INVALID_HANDLE_VALUE == h )
{
FindClose(h);
}
ってやるんだけど 失敗したときのハンドル値で FindClose() していいの?
失敗してるこの場合 FindClose() はいらないの?

97:デフォルトの名無しさん
09/03/05 19:47:00
>>96
していい。
URLリンク(msdn.microsoft.com)

98:デフォルトの名無しさん
09/03/05 19:48:43
ごめん。間違えた。
いらなかった。

99:デフォルトの名無しさん
09/03/05 19:49:18
ごめん。間違えた。
いらなかった。

100:デフォルトの名無しさん
09/03/05 20:00:59
ごめん。間違えた。
助かった。

101:デフォルトの名無しさん
09/03/05 22:29:35
構造体の中に、別の構造体のポインタがあるとして、そのポインタが
指し示すアドレスから、そのデータ型の構造体が連続して配置されている場合、
n番目のデータにアクセスしたい場合、どうしたら良いでしょうか。(下記サンプル参照)

typedef struct {
unsigned char test1;
unsigned char test2;
} Test_set1;

typedef struct {
unsigned short test3;
unsigned short test4;
} Test_set2;

typedef struct {
Test_set1* test5;
Test_set2* test6;
} Test_all;

volatile const Test_all Test_struct = {
(Test_set1*)0x3FFFFFA0,
(Test_set2*)0x3FFFFFB0 ←メモリ上では、Test_set2型がn個連なっている。
};

void Test_func(unsigned char index){
unsigned short tmp1, tmp2;
tmp1 = Test_struct.test6->test3;
tmp2 = Test_struct.test6[index]->test3; ←コレはダメぽい・・・
}

やっぱポインタを任意回数インクリメントか、indexを足すしかないでしょうか?

102:デフォルトの名無しさん
09/03/05 22:34:24
tmp2 = Test_struct.test6[index].test3;

103:101
09/03/05 22:54:33
>>102

おぉ・・・・・素早いレスありがとうございます。
確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに
アクセスしているか確認してみます。

この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の
RAM扱いになるんでしょうか?(ショボイ質問ですいません)

104:デフォルトの名無しさん
09/03/05 22:59:24
p[n]は*(p + (n))と同じ

105:デフォルトの名無しさん
09/03/05 22:59:54
RAMってw

106:デフォルトの名無しさん
09/03/05 23:23:12
Random Access Machomen

107:デフォルトの名無しさん
09/03/05 23:44:50
こんなのがわかってないうちからアセンブリやってるの?
順番ちがくね?

108:デフォルトの名無しさん
09/03/06 00:04:27
ハード屋なんじゃない?

109:デフォルトの名無しさん
09/03/06 00:08:36
int nFibo[16] = { 1, 1 };
これの = { 1, 1 };
って・・・・なんでしょうか・・?
こんなの見たことありません・・!
これはどういう意味なんですか・・?

110:デフォルトの名無しさん
09/03/06 00:23:18
nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。


111:デフォルトの名無しさん
09/03/06 00:28:44
わかりやすい説明サンクス!

112:デフォルトの名無しさん
09/03/06 00:54:22
ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。
Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、
ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。
配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。
メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか?
他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。
まぁ、いずれも必要な知識だけどさ。

113:デフォルトの名無しさん
09/03/06 01:11:00
C++の解説には、色々な入口から入る方法がある。
どの解説も同じでは面白くない、違う方が良い。
Cから順番に説明があったり、
いきなりクラスから説明したり、
それを読者が選ぶ事が出来る。良い時代です。
それぞれが、それぞれに良い




114:デフォルトの名無しさん
09/03/06 01:23:41
む。なるほどそういう考え方もあるか。確かに。
自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので
Accelerated C++でCを勉強したときは目からうろこだった。

115:デフォルトの名無しさん
09/03/06 01:41:15
>>113
その考え方ステキだな。
俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。
(逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。)
最初に読んでいたらきっと感慨も違っただろうなぁ。


116:デフォルトの名無しさん
09/03/06 01:58:46
私の考え方は他人と違う。。同じかもしれない。
機械語を逆アセンブルするときは、逆順、後ろから読む。
そして、終わったら前から順次読む。
本を読む時も同じ。逆から読む。
変かもしれない
人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。
自分自身を知って、マッチする方法を選ぶ能力を養う
これが幸せへの法則かもしれません。





117:デフォルトの名無しさん
09/03/06 15:52:32
数値入力で1〜9999の範囲内で入力してくださいという
プログラムで範囲外だとエラー文を表示するのですが、
long型のオーバーフローする値(4294967296)を打ち込むと
入力エラーにならず読み込んでしまいます。
どういった対策をすればよいのでしょうか?
ちなみにint型で定義してあります。

118:デフォルトの名無しさん
09/03/06 15:53:13
コードは?

119:デフォルトの名無しさん
09/03/06 15:53:40
>>117
doubleで読み込めば

120:デフォルトの名無しさん
09/03/06 16:41:16
>117
入力部分と、保持する数値とを分離するとか。

>119
現実的にはともかく、理論的には変わんなくね? そうでもない?

121:デフォルトの名無しさん
09/03/06 16:45:22
string に読み込んで桁数判定した後数値変換するとか。

122:デフォルトの名無しさん
09/03/06 16:53:07
>>117
そういう時のscanf

123:デフォルトの名無しさん
09/03/06 18:15:57
scanfを恥ずかしげもなく使う男の人って。。。

124:デフォルトの名無しさん
09/03/06 18:17:48
男女以前にプログラマとしてどうか

125:デフォルトの名無しさん
09/03/06 18:18:29
別に普通

126:デフォルトの名無しさん
09/03/06 18:45:28
int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても
1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが
如何か

127:デフォルトの名無しさん
09/03/06 19:27:15
strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ

128:デフォルトの名無しさん
09/03/06 19:35:05
>>126
弾けるのは4294967296とか、一部じゃないかw

129:デフォルトの名無しさん
09/03/06 21:33:28
キャストの弊害や精度不足の問題なら対処のしようがあるが
もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題
概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら
実行環境を示して頂きたい。

130:デフォルトの名無しさん
09/03/06 21:53:18
バカは黙ってろw

131:デフォルトの名無しさん
09/03/06 21:54:39
>>117
>ちなみにint型で定義してあります。
といっているが、そもそもオーバフローする値が入力できるんだから元は
文字列とかint以外の値でしかありえない
それをintに変換した後ではじくのは不可能

面倒くさくても地道にやるしかない

1) 文字列のまま取得
2) 前後の空白とかとる
3) 数値以外のものがあったらエラー
4) 先頭の0を削除
5) 5桁以上ならエラー
6) 空文字列なら0
7) 整数変換
とか、まあがんばれ

132:デフォルトの名無しさん
09/03/06 22:31:45
まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。

133:デフォルトの名無しさん
09/03/07 01:18:09
ポインタは俺の理解を超えてやがる・・・・!!!

134:デフォルトの名無しさん
09/03/07 07:38:06
>>133
どうしたw突然何があった。
…まあ状況次第ではある意味大半の人の理解を超えているよ。

135:デフォルトの名無しさん
09/03/07 07:48:07
自分で組むだけなら、Cは良い言語だと心から言えるが、
他人のソースを読むと微妙な気分になる。
C++はまあまあ良い言語だが、他人のソースは
くそったれと思う。

って事かな?

136:デフォルトの名無しさん
09/03/07 08:22:39
俺は自分のソース見てくそったれと思う
もっときれいに書けないのかよ昔の俺

137:デフォルトの名無しさん
09/03/07 08:26:16
それはあなたの進化の証。

138:デフォルトの名無しさん
09/03/07 12:04:25
ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。

139:デフォルトの名無しさん
09/03/07 13:45:17
ポインタを解りやすく解説してくれるC++のサイト教えてください・・・
ロベール先生すいません
あなたの説明は僕の理解を超えている

140:デフォルトの名無しさん
09/03/07 13:47:43
>>139
適当な本を買った方がいいよ。
サイトは限界があると思う。
…そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。

141:デフォルトの名無しさん
09/03/07 14:02:08
アセンブラやればポインタはわかる。
なのでPCプログラミングより8bitマイコンでも触るのお勧め。

ポインタが判らないという事はメモリマップとかスタックイメージも
脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に
欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから
一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。

142:デフォルトの名無しさん
09/03/07 14:39:23
>>141
あっそ。

143:デフォルトの名無しさん
09/03/07 14:53:10
#include <iostream.h>/*ロベール教室より*/

void ChangeToShohwa(int x)
{
if(1926 < x && x < 1989)
x -= 1925;
else
x = 0;
}

void Shohwa()
{
int nYear;

cout << "西暦を入力して下さい > ";
cin >> nYear;

ChangeToShohwa(nYear);
if(nYear)
cout << "その年は昭和 " << nYear
<< " 年です。" << endl;
else
cout << "その年は昭和ではありません。" << endl;
}

int main()
{
Shohwa();
Shohwa();
return 0;
}
なぜこれで失敗するのかが理解できない・・あほでごめんなさい

144:デフォルトの名無しさん
09/03/07 15:07:32
>>143
URLリンク(www7b.biglobe.ne.jp)
>

普通に理由が書かれてるじゃん。

145:デフォルトの名無しさん
09/03/07 15:08:00
>>144
手滑った

URLリンク(www7b.biglobe.ne.jp)
>引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。

146:デフォルトの名無しさん
09/03/07 15:17:51
>>142 何か気に障るようなこと言ったか?

147:デフォルトの名無しさん
09/03/07 15:20:35
ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。

148:デフォルトの名無しさん
09/03/07 15:33:45
つまり、なんだかんだでnYearの値が変更できないってこと・?

149:デフォルトの名無しさん
09/03/07 15:46:37
なんだかんだというかそのやり方だとnYearがこぴってわたされて
そのこぴったのを変更しているだけ

150:142
09/03/07 16:14:00
>>146
…俺の深読み誤解か。
スマン。

151:デフォルトの名無しさん
09/03/07 17:55:04
>>147
ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語
普通は人間に合わせて言語が作られるべきだろ

152:デフォルトの名無しさん
09/03/07 18:16:59
ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。

153:デフォルトの名無しさん
09/03/07 18:33:00
>>151の考える素晴らしい言語のソースも、
ポインターを駆使して記述されています。

154:デフォルトの名無しさん
09/03/07 18:47:53
ボイン太さいこー!

155:デフォルトの名無しさん
09/03/07 19:01:39
>>152
This is it.

156:デフォルトの名無しさん
09/03/07 19:11:01
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
数秒以内にポインタiが何を指しているのか理解できないと
Cの初歩にすら達してないと言われた
お前らなら、一目瞭然で数秒どころか一瞬だろ

157:デフォルトの名無しさん
09/03/07 19:19:29
>>156
実際そんな使い方はまったくしない。
一目でわかりやすい宣言をするのが上級者。

158:デフォルトの名無しさん
09/03/07 19:25:03
実際は使わないが、錬度を試す訓練だよ

159:デフォルトの名無しさん
09/03/07 19:30:04
数秒でわかったらすごいわ
俺の場合、特に最後は()の解析で時間かかるぞ

160:デフォルトの名無しさん
09/03/07 19:33:59
そこに至るまでのコード次第
いきなり 156 が現れたら 書いた奴の精神状態を疑う。

161:デフォルトの名無しさん
09/03/07 19:59:17
>>159
俺、今でも数秒では無理だが、宣言をすらすらと解析できないとなると程度しれるよな
まだまだ初級のおれがちょっと前に新人にこのp何さしてるのって聞かれたのがこれ
int (CC::*(p[3]))(void);
これぐらいなら頻繁に使うだろうし、ム板連中なら一瞬だろ
ちなみに>>156は会社の新人PGのC言語コースの理解度試験

162:デフォルトの名無しさん
09/03/07 20:12:25
頻繁に使うか?
俺だったらまずtypedefするが…

163:デフォルトの名無しさん
09/03/07 20:24:13
爆釣

164:デフォルトの名無しさん
09/03/07 20:24:22
>>162
どういう風にtypedefするんだ?

165:デフォルトの名無しさん
09/03/07 20:28:02
URLリンク(mist000.h18.ru)
メンバーイニシャライザを使用したコンストラクタをクラス定義の外に分離したいんだが、
g++でコンパイルするとこのようなエラーが出る。
--------------------------------------------------------
uha@seven:~/dev/uhaww$ g++ -Wall -o debug debug.cpp
debug.cpp: In constructor ‘TestException::TestException(std::string&)’:
debug.cpp:8: error: ‘sCause’ was not declared in this scope
debug.cpp:8: error: expected `{' at end of input
debug.cpp: At global scope:
debug.cpp:10: error: redefinition of ‘TestException::TestException(std::string&)’
debug.cpp:8: error: ‘TestException::TestException(std::string&)’ previously defined here
--------------------------------------------------------
分離すること自体考えてはいけないのだろうか...
メンバーイニシャライザ使わなければ分離できるのに。。

間違いがあればよろしくお願いします。


166:デフォルトの名無しさん
09/03/07 20:28:56
>>162
まさか typedef int (CC::*(p[3]))(void)
なんて言わないよな
int (CC::*(p[3]))(void)が何をあらわすのか、解りやすくするtypedef頼むよ

167:デフォルトの名無しさん
09/03/07 20:29:28
実はほとんど俺の自作自演

>>164
typedef int (CC::*ccpoint)(void);
ccpoint p[3];
こんな感じにするんじゃね?

168:デフォルトの名無しさん
09/03/07 20:34:07
2ちゃんねる株式会社ではよく使います。

実際はベテランほど保守性を考慮して単純に書く。
Cの設計者でさえシンプルに書けと言ってるのに、
何を勘違いしてるんだろね。

169:デフォルトの名無しさん
09/03/07 20:38:15
むずかしっすぎる!

170:デフォルトの名無しさん
09/03/07 20:46:27
int (CC::*(p[3]))(void);
が頻繁に出てくるようでは駄目だと思うわ

171:デフォルトの名無しさん
09/03/07 20:57:19
Visual C++ 2008 Express Editionの使い方がよくわかりません。

講座サイトの解説で使ってるVisual C++はちょっと違って
現在編集中のプログラムを実行する方法がわかりません。

ご教授よろしくお願いします。

172:165
09/03/07 21:01:49
お騒がせしました、自己解決しました。

173:デフォルトの名無しさん
09/03/07 21:13:57
>>171
F1を押してヘルプを読め

174:デフォルトの名無しさん
09/03/07 21:18:57
>>171
スレ違いだろ

175:デフォルトの名無しさん
09/03/07 21:19:31
int (CC::*(p[3]))(void)のpって何を指す
日本語で書いてくれ

176:デフォルトの名無しさん
09/03/07 21:21:16
pは、配列です。何の配列かと言うと・・・次の人、どうぞ

177:デフォルトの名無しさん
09/03/07 21:22:20
パス!

178:175
09/03/07 21:26:55
あと、>>156
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
のiも頼む

179:デフォルトの名無しさん
09/03/07 21:34:36
もしかして、voidさん入店されてはります?

180:デフォルトの名無しさん
09/03/07 21:40:12
全然わからんw
1番目は多次元配列っぽくて、
2番目と3番目は関数ポインタの配列っぽいれすか?
あと>>161はメンバ関数へのポインタっぽい?

答えをたのむぅ。

181:デフォルトの名無しさん
09/03/07 21:48:22
実際のコードで、こんなの使っちゃダメだが、
Cの文法の知識として、本当におまえら、読めないのか?

javaばっかやってるから、バカになる

182:175
09/03/07 21:52:00
>>180
俺と似たような,orzレベルだな

色々レスしてる人たちって解ってるんでしょ、なら教えてくださいなーーーー

183:デフォルトの名無しさん
09/03/07 22:02:29
>>181
本当に読めないので、ぜひ、答えを

184:デフォルトの名無しさん
09/03/07 22:51:56
int **(*i[10])[4];
( ((int[10])へのポインタ)[4] )へのポインタ ×2

int (*i())[6];
(int f()のような関数へのポインタ)[4]

int *(*(*i)())[4]
( (int *f()のような関数へのポインタ)[4] )へのポインタ

ということでいいのか?

185:デフォルトの名無しさん
09/03/08 00:00:32
C言語パズルです、みたいなノリで出されるなら喜んでやるかも。

186:180
09/03/08 00:09:44
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数i。
2番目は二次元配列を戻り値とする関数i。
3番目は「関数ポインタを格納する二次元配列へのポインタ」へのポインタ。

わからーんw

187:180
09/03/08 00:50:52
んー。一番目はいきなり間違いだな。
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数iだとすると
int *(**i[10])[4]; と書く必要があるようだ。わからん・・・。答えはまだか。

188:デフォルトの名無しさん
09/03/08 01:11:50
int **(*i[10])[4]
intへのポインタのポインタの配列へのポインタの配列

int (*i())[6]
intへの配列へのポインタを返す関数

int *(*(*i)())[4]
intへのポインタの配列へのポインタを返す関数へのポインタ

189:180
09/03/08 01:21:47
なるほど、int **(*i[10])[4]の最初のint **は納されている型になるのか。
んでもって、(*変数名)[4]が多次元配列へのポインタで、
変数名の後の[10]がその変数の要素数になる、と。

だんだんわかってきた。おもしろい。w

190:デフォルトの名無しさん
09/03/08 01:39:49
外側から一つずつ剥がしていく。最初と最後の両側から剥がせるときは、最初を先に剥がす。
剥がしたものが、それぞれ
 int(などの普通の型名)であれば…… 「int」
 * であれば…… 「へのポインタ」
 [N] であれば…… 「の配列」
 (int,int) (など、カッコ内に型名)であれば…… 「が戻り値の型、(int,int)が引数の型である関数」
 MyClass:: であれば…… 「で、MyClassのメンバであるもの」
をつけていく。これで読めるはずだ。英語圏の人は逆向きにやるらしいけど。

191:デフォルトの名無しさん
09/03/08 01:45:13
あと、これとは直接関係ない話だが、intへのポインタへのポインタは、intの2次元配列とは別物だからね。
「ポインタ⇔配列」の互換ができるのは、末尾の「〜へのポインタ」「〜の配列」の部分のみ。

だから、ポインタの配列はポインタへのポインタで受けることができるし、2次元配列は配列へのポインタで受けることができるが、
2次元配列をポインタへのポインタで受けるのは不正。

192:デフォルトの名無しさん
09/03/08 01:51:13
>>190
読めないよ。

int &a
int func<int>()

193:180
09/03/08 01:52:14
大変よくわかりました。

194:デフォルトの名無しさん
09/03/08 01:56:42
167は正しいの?

195:デフォルトの名無しさん
09/03/08 02:07:28
正しいよ。

196:デフォルトの名無しさん
09/03/08 02:07:55
>>194 うん

197:デフォルトの名無しさん
09/03/08 02:26:30
C言語の宣言の文法は、もうちょっとマシな文法にならんかったの?
標準化するとき、誰からも反対が出なかったのが不思議なくらいだ。
頭がいい人がいっぱい集まってやってるハズなのに。

198:デフォルトの名無しさん
09/03/08 03:13:06
これでいいんじゃない?
っていうか、Quizみたいなみょうちくりんな宣言が必要になるプログラムは
そもそもの設計が間違っている気も。

199:デフォルトの名無しさん
09/03/08 03:21:05
Cだと、ポインタ型を別に作って欲しかった
後は関数ポインタの宣言を何とかして欲しかったくらいか

>>156をすらすら読み、161みたいなのを頻繁に使うプログラマにはなりたくない
161はtypedefしないらしいし…

200:デフォルトの名無しさん
09/03/08 04:01:48
>>199
もし>>156をtypedefを使って分りやすくしてくれと言われたらどのように
typedefする?有る意味typedefの練習になるんじゃないか


201:デフォルトの名無しさん
09/03/08 04:15:48
それらが何を意味するものとして使われているのか、それに基づいてtypedefすべきと思う。
例えばchar*をstringとしてtypedefしたり(C++ならstd::stringがあるけど)、単純に置き換えるんじゃなくて
意味が分かるようにしなければ、結局分かりやすくはならないんじゃないか。

202:デフォルトの名無しさん
09/03/08 04:37:26
>>201
普通はそうだが、練習なら良いんじゃないか
>>156を見てこれならどうtypedefしたらいいんだろと疑問に思っただけ
>>156は宣言構文解釈による頭の体操って感じかな
頭の体操なら現実では使わないものでも良いんじゃないか

203:デフォルトの名無しさん
09/03/08 04:42:15
>>201
つまり、windows.hを批判してるってことですね。

204:デフォルトの名無しさん
09/03/08 04:48:18
windows.h のそれは、int32_tとかwchar_tとかが無かった時代の産物としては存在意義があると思う。

205:202
09/03/08 04:55:42
>>203
本人のポリシーだから良いんじゃないの
ま、windowする時は、気に入らんでもwindowsの流儀に従ったほうが無難だろな

206:デフォルトの名無しさん
09/03/08 05:54:53
windows.hの場合は囲い込んで、移植させにくくしただけだろ。
gcc+Qtでなんも困らん。

207:デフォルトの名無しさん
09/03/08 09:50:09
俺もstdio.hで十分だわ

208:デフォルトの名無しさん
09/03/08 10:16:15
っつか、この世は俺1人で十分だ

209:デフォルトの名無しさん
09/03/08 10:29:48
>>208
さっさとジュース買って来い

210:デフォルトの名無しさん
09/03/08 11:34:40
つかMSはさっさとstdint.h対応しろと。C99決まってから10年なのに
何をしているのかと。

211:デフォルトの名無しさん
09/03/08 20:47:58
#include <iostream>
using namespace std;
#include <math.h>
#include <stdio.h>

void ChangeToShohwa(int x)
{
if(1926 < x && x <1989)
x -=1925;
else
x = 0;
}
int main()
{
int x;
ChangeToShohwa(x);
if
printf("昭和%d年ですよ",x);
else
cout<<"昭和じゃないです"<<endl;
}
: error C2061: 構文エラー : 識別子 'printf'
: error C2181: else 文が if と一致しません。

212:デフォルトの名無しさん
09/03/08 20:51:56
教えてください。
お師匠

213:デフォルトの名無しさん
09/03/08 21:03:52
>>212
それコンパイラか頭のバグ
コンパイラ何? 頭は何?

214:デフォルトの名無しさん
09/03/08 21:06:59
>>211
ifだけじゃだめだろ
この場合if(x)かな?
他もひどすぎて、思ったとおりには実行されないと思うが

215:デフォルトの名無しさん
09/03/08 21:08:52
>>213
VIsual C++ 2008

頭・・?

216:デフォルトの名無しさん
09/03/08 21:10:55
>>214
これのどこがひどいと言うんだ・・・!!
シンプルで無駄のないプログラムじゃないか!!

217:デフォルトの名無しさん
09/03/08 21:11:45
>>216
バカは失せろ

218:デフォルトの名無しさん
09/03/08 21:14:25
>>217
すいませんでした
出直してきます

219:デフォルトの名無しさん
09/03/08 21:18:15
>>215 じゃ、頭のバグだな。
int x = 1945;
void ChangeToShohwa(int& x)
if(x)
これで良いだろ

220:デフォルトの名無しさん
09/03/08 21:19:12
>>211から星の煌めきを感じる

221:デフォルトの名無しさん
09/03/08 21:20:14
ていうか、xを改変する意味が分からない
int返せよ

222:デフォルトの名無しさん
09/03/08 21:23:40
>>221
そう言うならおまえがそれやれよ

223:デフォルトの名無しさん
09/03/08 21:36:00
ワンパクでもいいタクマシク育ってほしい。

224:デフォルトの名無しさん
09/03/08 21:50:09
これ、ロベールからの引用じゃろ?
まともに動かなくていいのよ。この後、参照の話が出てきて
まともに動かない理由とちゃんと修正されたバージョンのコードが記載されてるから。

しかし、ロベールは2000年の記事じゃから古いぞ。
使っているコンパイラもVC++6で著者自身が
環境依存はいやだと書いているくらいだし。

225:デフォルトの名無しさん
09/03/08 21:58:42
>>221
Googleのプンソで採用されているコーディング標準では
参照パラメータはすべてconstにせよってあった。

まぁ、それはさすがに行き過ぎだと思うけど
関数の可読性という点ではなるほどとも思う。

226:デフォルトの名無しさん
09/03/08 22:31:38
プンソって何?と一瞬思ったがオプソか。

227:デフォルトの名無しさん
09/03/08 22:58:21
>>221
>>145


228:デフォルトの名無しさん
09/03/08 23:02:07
西暦と昭和を同じ変数で扱うのが気持ち悪いってことじゃねーの?

229:デフォルトの名無しさん
09/03/08 23:22:01
西暦形式で格納されてる変数がいつのまにか(ではないけど)
和暦形式に代わってるとか死ねとおもうね

230:デフォルトの名無しさん
09/03/09 00:05:10
年クラスを作って、get西暦とget和暦メソッドを用意するべきでしょうか。

231:デフォルトの名無しさん
09/03/09 00:07:37
時刻クラスを基本クラスとして、西暦クラスと和暦クラスを派生させるんだろ。

232:デフォルトの名無しさん
09/03/09 00:12:49
出来事 vector に年月変換機能を備えたイテレータが美しいと思うよ。

233:デフォルトの名無しさん
09/03/09 01:07:34
日単位で持っておいて、月以上に変換するときは暦クラス通すようにすれば。

234:デフォルトの名無しさん
09/03/09 03:14:07
「和暦表示じゃないと、絶対困る!」
って言われること、けっこう良くあるけど、
天皇が暗殺されたら、どうするのかね?

235:デフォルトの名無しさん
09/03/09 03:48:14
簡単に追加修正できるようにSQLite、CSV、XMLででも持っとけよ。
そんなの昭和64年からの常識だろ。

236:デフォルトの名無しさん
09/03/09 08:07:31
天皇が暗殺されても今までの和暦がなくなる訳じゃないしなぁ。

237:デフォルトの名無しさん
09/03/09 08:37:29
西暦だって、新宗教に宗旨替えして新西暦0年にリセットするかもしれないし、
イスラムが再び勃興してイスラム暦に切り替わるかもしれない。

UTCみたいな無色透明な基準年が必要だな。

238:デフォルトの名無しさん
09/03/09 09:31:35
UTCのどこが無色透明だって?

基準だったら皇紀でもいいわけだろ。

239:デフォルトの名無しさん
09/03/09 09:50:40
いやぁおまいらの講義はみてて勉強になります。
小生も美しいコード書けるようになりたいですハイ。

弟子入りさせて貰えませんか?

240:デフォルトの名無しさん
09/03/09 09:55:34
地球の誕生年を元年にすればいいじゃん。
俺が小学生の頃、46億年前に地球ができたって聞いたから今は46億18年だな。

241:デフォルトの名無しさん
09/03/09 09:59:49
地球の紀元は今後変動する可能性があるので基準にできません。

242:デフォルトの名無しさん
09/03/09 10:04:54
じゃあ宇宙で。
ビッグバン歴

243:デフォルトの名無しさん
09/03/09 10:07:09
同じ理由で却下

244:デフォルトの名無しさん
09/03/09 10:44:56
それにしても、1926年は殆ど昭和じゃないんだがなぁ。
同じように、1989年も殆ど昭和じゃないし。

245:デフォルトの名無しさん
09/03/09 10:51:46
VCでコンソールアプリを作成し起動します。その後外部のPGから、
SendKeysやPostmessage,標準入力などでキー送信を送ろうとしているのですが、
SendKeysの場合:通常のキーは受け付けるがファンクションキーは駄目
Postmessage、標準入力の場合:何も受け取らない
となります。
ファンクションキーを送信したいのですがどうすればいいのでしょうか?
アドバイスお願いいたします。

・DOSプロンプトだと標準入力はちゃんと受け付けるが、コンソールアプリは受け付けない
->DOSプロンプトとコンソールアプリの仕組みは別物?


246:デフォルトの名無しさん
09/03/09 11:31:49
送れないこともないだろ?
今どうやってんの、C++/CLIなのか?

247:デフォルトの名無しさん
09/03/09 11:35:00
>>245
PostMessageやSendMessageがダメなのは知ってる。
他は知らない。

248:デフォルトの名無しさん
09/03/09 11:54:27
>>246
> 送れないこともないだろ?
> 今どうやってんの、C++/CLIなのか?

VC++6.0MFCコンソールアプリ で作りました。送る方はVB.NET2005です。
PostMessageはWM_CLOSEは送れたようです。その他は
SendKes.Send(chr(0))
SendKes.Send(chr(62))
とするとchr(62)は送れるんですが、chr(0)は無視されますっていうか
SendKes.Send(chr(0)) っていうのはVBでは無謀なのかな、でもvbNullStringでも
駄目でした。

それに標準入力で送れないのはなぜなんでしょう?(DOSプロンプトへはおくれるのに)



249:デフォルトの名無しさん
09/03/09 11:54:41
[1] 授業単元:趣味
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS: XP
 [3.2] コンパイラ名とバージョン: MSC ver.5.1
 [3.3] 言語:C

パスワードの入出力プログラムをつくりたい。
PASSは4文字とし、1文字入力される毎に'*'を1個表示し、
4文字入力後パスワードをチェック。
PASSが正しければ「システムの使用を許可します」と表示し、
間違っていれば3回再入力させて、3回を超えたらエラーを表示。
(パスワードは予めプログラム内部で定義されているという前提で)

こういうプログラムを書いてみたのですが、main以下「*password=1994」を
正解として宣言し、else文の部分でc[i]と*passwordを認識させてprintfで
c[i]を表示させたいんですけれどもうまくいきません。

何故でしょう?
何となく原因はわかるのですが、漠然としていて手が出せないんです。

上のコードをみて、名人方のアドバイスをお聞かせ願いたい。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5379日前に更新/124 KB
担当:undef