- 1 名前:デフォルトの名無しさん [2009/03/02(月) 00:36:19 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/ スレを勃てるまでもないC/C++の質問はここで 5 pc11.2ch.net/test/read.cgi/tech/1230516307/ スレを勃てるまでもないC/C++の質問はここで 6 pc11.2ch.net/test/read.cgi/tech/1231564903/ スレを勃てるまでもないC/C++の質問はここで 7 pc11.2ch.net/test/read.cgi/tech/1232983248/
- 52 名前:デフォルトの名無しさん [2009/03/04(水) 00:41:47 ]
- 可変引数リスト
va_start、va_end、va_arg www.geocities.co.jp/SiliconValley/6071/technic/17.html
- 53 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 07:11:26 ]
- lstrcpyをstrcpyにしてみては?
- 55 名前:51 mailto:sage [2009/03/04(水) 07:14:51 ]
- >>52
そのリンク先で、myfunc( "test" , 100 );とよびだされた場合、 "test"というのはどう扱われるのでしょうか?
- 56 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 07:23:32 ]
- >>55
ttp://www.geocities.jp/ky_webid/c/057.html なるたけ単純な具体例のあるページ
- 57 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 07:43:01 ]
- >>55
そこは引数の数があってないので参考にするな ちなみに"test"は引数の開始位置を得るだけにしか使われていない
- 58 名前:デフォルトの名無しさん [2009/03/04(水) 08:16:17 ]
- >>55
...の直前の引数(va_startの第2引数)に入る。
- 59 名前:デフォルトの名無しさん [2009/03/04(水) 08:49:08 ]
- >>37
そんなことに、まともに答えられないお前もどうかと
- 60 名前:デフォルトの名無しさん [2009/03/04(水) 11:01:27 ]
- 指定したディレクトリ以下のファイル、ディレクトリをすべて
取得するような関数ないでしょうか?
- 61 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:02:42 ]
- opendir readdir
- 62 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:32:24 ]
- >>60
環境依存
- 63 名前:デフォルトの名無しさん [2009/03/04(水) 12:02:15 ]
- >>62
- 64 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 12:25:13 ]
- struct buff{buff, ite};
テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))〜; buf.ite+sizeof(t); return &buf}
- 66 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:44:38 ]
- 構造体のコンストラクタでは駄目なの?
- 69 名前:64 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 20:27:21 ]
- 正規表現でどうとでもなるんじゃね?
- 72 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 20:42:14 ]
- >>69
扱う型の種類、パックする環境、アンパックする環境、を可能な限り詳しく教えて下さい。 特になぜエンディアンが問題になるのか解るように。
- 73 名前:70 [2009/03/04(水) 20:58:04 ]
- 変数の型を調べる必要があるので正規表現では無理なような気がします。
boolean a; if(a) { とか boolean c() { boolean r = 0; 略 return r; } の場合は修正の必要は無いです。
- 74 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 21:04:05 ]
- そもそもC標準にbooleanなんて型はない
- 75 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 21:13:52 ]
- >>72
char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな
- 76 名前:64 mailto:sage [2009/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 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/03/05(木) 00:58:00 ]
- >>76
ターゲットのMCUによってエンディアンが異なるなら、 memcpyだけではなく、structでも、自作sprintfでも、要素ごとにエンディアンの変換は必要ではないですか? なぜmemcpyでだけエンディアン変換が問題になるのでしょうか。
- 79 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 01:01:42 ]
- memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。
- 80 名前:64 mailto:sage [2009/03/05(木) 01:22:25 ]
- >>78
もちろんそうですが、memcpyベースだと2つの文になります。 引数やstructの中なら横に{ htons(v1), htonl(v2), v3, ...} と}羅列できるので、 やや行数的にお得かなと気持ちが傾いてます。 >>79 はい、元コードがキャスト方式です。ただ、キャストとmemcpyは書き込み先バッファの オフセット位置を明示的に調節する必要があるので、「とりあえず変数を並べると よろしくパッキングされる」みたいにできないかなぁと。 まあベタに書いてく元コードでいいじゃん?てな気もする程度の問題ですが、 色々方法がありそうで面白いので深追いしてみようかなと。
- 81 名前:デフォルトの名無しさん [2009/03/05(木) 07:36:42 ]
- >>80
重要なのはソースの行数だけですか? (1)ソースの行数、(2)ソースの文字数、(3)ソースの可読性、(4)オブジェクトのサイズに優先順位を付けるとどうなりますか?
- 82 名前:デフォルトの名無しさん [2009/03/05(木) 08:35:55 ]
- ドメストがおすすめ
- 83 名前:64 mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 11:24:30 ]
- >>84
C++用の <complex> ならあるみたい
- 86 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 11:51:19 ]
- 複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。
- 87 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 14:58:34 ]
- printf("ロベール先生の第27章から忌み不明になってきた");
- 88 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 16:01:21 ]
- #define FNC void fnc()
セミコロン入れたらダメじゃね? 知らんけど。
- 90 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 16:04:49 ]
- >>89
ハイパーサンクス
- 91 名前:デフォルトの名無しさん [2009/03/05(木) 18:27:57 ]
- >>84
そんな事に手間取るくらいなら自前で作った方が早いだろ。 加減算、乗算は一瞬でしょ。 割り算は意味わからなくても公式で一発だし。
- 92 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:31:38 ]
- >>83
fputcの要領で、16ビットや32ビットなど必要なものを (中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう? と思ったが、VC++だとfmemopenがないから駄目だよな。
- 93 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 18:45:46 ]
- >>84
適当に探せば外部のライブラリがありそうじゃない? それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?
- 94 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:15:15 ]
- try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?
- 95 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:31:37 ]
- 例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。
「自分で書くコードが、どんなときに例外をスローすべきなのか」 となると別の話になるけど。そういうことが聞きたいの?
- 96 名前:デフォルトの名無しさん [2009/03/05(木) 19:40:34 ]
- h = FindFirstFile( path, &data );
で FindFirstFile( )関数の失敗した値 INVALID_HANDLE_VALUE が返ってきた時 if( INVALID_HANDLE_VALUE == h ) { FindClose(h); } ってやるんだけど 失敗したときのハンドル値で FindClose() していいの? 失敗してるこの場合 FindClose() はいらないの?
- 97 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:47:00 ]
- >>96
していい。 ttp://msdn.microsoft.com/ja-jp/library/cc429233.aspx
- 98 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:48:43 ]
- ごめん。間違えた。
いらなかった。
- 99 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 19:49:18 ]
- ごめん。間違えた。
いらなかった。
- 100 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:00:59 ]
- ごめん。間違えた。
助かった。
- 101 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:34:24 ]
- tmp2 = Test_struct.test6[index].test3;
- 103 名前:101 mailto:sage [2009/03/05(木) 22:54:33 ]
- >>102
おぉ・・・・・素早いレスありがとうございます。 確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに アクセスしているか確認してみます。 この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の RAM扱いになるんでしょうか?(ショボイ質問ですいません)
- 104 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:59:24 ]
- p[n]は*(p + (n))と同じ
- 105 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 22:59:54 ]
- RAMってw
- 106 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:23:12 ]
- Random Access Machomen
- 107 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:44:50 ]
- こんなのがわかってないうちからアセンブリやってるの?
順番ちがくね?
- 108 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:04:27 ]
- ハード屋なんじゃない?
- 109 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:08:36 ]
- int nFibo[16] = { 1, 1 };
これの = { 1, 1 }; って・・・・なんでしょうか・・? こんなの見たことありません・・! これはどういう意味なんですか・・?
- 110 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:23:18 ]
- nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。
- 111 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:28:44 ]
- わかりやすい説明サンクス!
- 112 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 00:54:22 ]
- ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。
Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、 ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。 配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。 メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか? 他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。 まぁ、いずれも必要な知識だけどさ。
- 113 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:11:00 ]
- C++の解説には、色々な入口から入る方法がある。
どの解説も同じでは面白くない、違う方が良い。 Cから順番に説明があったり、 いきなりクラスから説明したり、 それを読者が選ぶ事が出来る。良い時代です。 それぞれが、それぞれに良い
- 114 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:23:41 ]
- む。なるほどそういう考え方もあるか。確かに。
自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので Accelerated C++でCを勉強したときは目からうろこだった。
- 115 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:41:15 ]
- >>113
その考え方ステキだな。 俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。 (逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。) 最初に読んでいたらきっと感慨も違っただろうなぁ。
- 116 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 01:58:46 ]
- 私の考え方は他人と違う。。同じかもしれない。
機械語を逆アセンブルするときは、逆順、後ろから読む。 そして、終わったら前から順次読む。 本を読む時も同じ。逆から読む。 変かもしれない 人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。 自分自身を知って、マッチする方法を選ぶ能力を養う これが幸せへの法則かもしれません。
- 117 名前:デフォルトの名無しさん [2009/03/06(金) 15:52:32 ]
- 数値入力で1〜9999の範囲内で入力してくださいという
プログラムで範囲外だとエラー文を表示するのですが、 long型のオーバーフローする値(4294967296)を打ち込むと 入力エラーにならず読み込んでしまいます。 どういった対策をすればよいのでしょうか? ちなみにint型で定義してあります。
- 118 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 15:53:13 ]
- コードは?
- 119 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 15:53:40 ]
- >>117
doubleで読み込めば
- 120 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 16:41:16 ]
- >117
入力部分と、保持する数値とを分離するとか。 >119 現実的にはともかく、理論的には変わんなくね? そうでもない?
- 121 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 16:45:22 ]
- string に読み込んで桁数判定した後数値変換するとか。
- 122 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 16:53:07 ]
- >>117
そういう時のscanf
- 123 名前:デフォルトの名無しさん [2009/03/06(金) 18:15:57 ]
- scanfを恥ずかしげもなく使う男の人って。。。
- 124 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 18:17:48 ]
- 男女以前にプログラマとしてどうか
- 125 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 18:18:29 ]
- 別に普通
- 126 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 18:45:28 ]
- int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても
1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが 如何か
- 127 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 19:27:15 ]
- strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ
- 128 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 19:35:05 ]
- >>126
弾けるのは4294967296とか、一部じゃないかw
- 129 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 21:33:28 ]
- キャストの弊害や精度不足の問題なら対処のしようがあるが
もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題 概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら 実行環境を示して頂きたい。
- 130 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 21:53:18 ]
- バカは黙ってろw
- 131 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 21:54:39 ]
- >>117
>ちなみにint型で定義してあります。 といっているが、そもそもオーバフローする値が入力できるんだから元は 文字列とかint以外の値でしかありえない それをintに変換した後ではじくのは不可能 面倒くさくても地道にやるしかない 1) 文字列のまま取得 2) 前後の空白とかとる 3) 数値以外のものがあったらエラー 4) 先頭の0を削除 5) 5桁以上ならエラー 6) 空文字列なら0 7) 整数変換 とか、まあがんばれ
- 132 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:31:45 ]
- まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。
- 133 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 01:18:09 ]
- ポインタは俺の理解を超えてやがる・・・・!!!
- 134 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 07:38:06 ]
- >>133
どうしたw突然何があった。 …まあ状況次第ではある意味大半の人の理解を超えているよ。
- 135 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 07:48:07 ]
- 自分で組むだけなら、Cは良い言語だと心から言えるが、
他人のソースを読むと微妙な気分になる。 C++はまあまあ良い言語だが、他人のソースは くそったれと思う。 って事かな?
- 136 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 08:22:39 ]
- 俺は自分のソース見てくそったれと思う
もっときれいに書けないのかよ昔の俺
- 137 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 08:26:16 ]
- それはあなたの進化の証。
- 138 名前:デフォルトの名無しさん [2009/03/07(土) 12:04:25 ]
- ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。
- 139 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 13:45:17 ]
- ポインタを解りやすく解説してくれるC++のサイト教えてください・・・
ロベール先生すいません あなたの説明は僕の理解を超えている
- 140 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 13:47:43 ]
- >>139
適当な本を買った方がいいよ。 サイトは限界があると思う。 …そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。
- 141 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 14:02:08 ]
- アセンブラやればポインタはわかる。
なのでPCプログラミングより8bitマイコンでも触るのお勧め。 ポインタが判らないという事はメモリマップとかスタックイメージも 脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に 欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから 一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。
- 142 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 14:39:23 ]
- >>141
あっそ。
- 143 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:07:32 ]
- >>143
www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01034.html > 普通に理由が書かれてるじゃん。
- 145 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:08:00 ]
- >>144
手滑った www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01034.html >引数は、新たに変数が作られ、それに値が代入されるという仕組みになっているからです。
- 146 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:17:51 ]
- >>142 何か気に障るようなこと言ったか?
- 147 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:20:35 ]
- ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。
- 148 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:33:45 ]
- つまり、なんだかんだでnYearの値が変更できないってこと・?
- 149 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 15:46:37 ]
- なんだかんだというかそのやり方だとnYearがこぴってわたされて
そのこぴったのを変更しているだけ
- 150 名前:142 mailto:sage [2009/03/07(土) 16:14:00 ]
- >>146
…俺の深読み誤解か。 スマン。
- 151 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:55:04 ]
- >>147
ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語 普通は人間に合わせて言語が作られるべきだろ
- 152 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 18:16:59 ]
- ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。
|

|