スレを勃てるまでもないC/C++の質問はここで 8
1 :
デフォルトの名無しさん :
2009/03/02(月) 00:36:19
janeの隠し機能 1.書き込みウィンドウを出し半角入力に切り替える 2.Wキーを押しっぱなしにする 3.Wキを押しっぱなしにしながらsageのチェックするところをおもむろにクリック
36年間悩んでます。お力をお貸しください。
PSのアークザラッドUというタイトルのゲームの、ゲーム画像(歩行画像など)を抽出したいのですが、
かれこれ1年ほど経ちますが、なかなかうまくいきません。
*もちろん抽出した画像は個人範囲内で利用するつもりです。
◆試してダメだったこと
ネット上からダウンロードできる、ありとあらゆる抽出系ツールを試した。
(ちなみに他のゲームはほとんど抽出可能)
◆教わったこと
・アークザラッドUは独自の画像形式を使っているから抽出できない。
・PS上で表示されてるということは絶対に摘出はできるはず。
・
ttp://www.gradius2.com/index.php?UID=1174775153 ◆抽出は不可能ではないということを知ったとき
2ちゃんねるで質問したところ、
ある方が実際にキャラクターの歩行画像を抽出して
私が立てたスレにアップしてくださいました。
スクリーンショットじゃダメなんです。どうか皆さん、お力をお貸しください。お礼は絶対にします。
>前スレ997 お前はあんなことのために2^32バイトだか2^64バイトだかの配列を確保するのか? バカだろ?
テンプレートの使い方で分からないんだけど、 template <typename T> class Myclass { public: T mem; //他、Tを使ったメンバ関数・メンバ変数が多数 int foo(int x){std::cout << x << std::endl;return x;} double foo(double x){std::cout << x << std::endl;return x;}; unsigned long foo(unsigned long x){std::cout << x << std::endl;return x;}; }; のようなクラスがあって、呼び出すときは Myclass<char> hoge; hoge.foo((int)-1); hoge.foo((double)3.14); hoge.foo((unsigned long)42); のように使っている状況。 で、この3つのfooをテンプレートにしてまとめたいんだけど、どうすりゃいいかね?? template <typename T,typename U> class Myclass {//〜〜}; とは意味合いが違うじゃん。。。
>>1 乙彼。
あと
>>5 はかわいそうな人による釣りだから皆様 無視してくださってかまいません。
>>5 に対して複雑怪奇な提案したいけど思いつかない。。。
>>4 状況にもよるが全然ありだろ
大規模なNUMAマシンとかならおそらく最速だ
マルチスレッドにもしやすいしな
>>4 草ついてないとこを見ると……もしかして天然?
だとしたら痛いぞ。
メモリのことより比較する配列がある程度長くないと、素直にやるより遅くならない?
いや、まずその「素直」を提案せな。……というだけだとさみしいんで提案。 a1[0]を仮の共通要素とおく。 aM(Mは1-5)について仮値以上になるまで添え字インクリメント。 ->越えたらその値を仮値としてM=1からやりなおし。 ->同値なら次のMへ。M>5なら仮値を共通値として保持。保持した共通値を超えるまでa1の添え字をインクリメントし、その要素を仮値とする。 いずれかの添え字が範囲外になったら終了。 これよりはint分配列確保の方が、計算量は少ないな(終了条件が早期に成立した場合は別)。 a1-a4はインクリメントのみ。a5は比較のみ(インクリメントは不要)で済む。
14 :
12 :2009/03/02(月) 01:26:31
前スレでそもそもの質問者が出したやつのことな
>>13 変に凝ってばかみたいだね
最終的にサイズUNIT_MAXの配列をひと舐めするワケだしな
両方の最大最少値から if 条件を最適化する位しか思いつかんね
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
可変長引数のコンストラクタを持つクラスの継承を行いたいのですが、引数の受け渡しがうまくいきません。 class hoge{ hoge(int i,...); } class piyo:public hoge{ piyo(int i,...):hoge(ここが分からない){ 〜 } } 上記のような感じです、 hogeのコンストラクタを丸々コピーする以外に何か方法があればご教授お願いします。
>>12 素直なやり方を書いて実際に比較してみたら?
っていうか、あんたの言う素直なやり方ってどんなのか、ソースあげてみてよ。
22 :
デフォルトの名無しさん :2009/03/02(月) 08:26:06
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
23 :
デフォルトの名無しさん :2009/03/02(月) 08:42:05
>>18 そんな事してねーで孝三隊のポインタに氏たら?
>>18 piyoてなにおまえ? ふざけてんの? ヒヨコなの?
うん
ここはいつからこんなクソスレになった?
>>18 可変長の引数は止めたほうがいい。
オブジェクトを作って渡す様にしたほうがいい。
可変長の引数はやめたほうがいい…誰かがそんなこといってたな。
template<typename T, int len>class A{ T (&X)[len]; public: A(T(&x)[len]): X(x){}; }; int B[10]; A<int, 10> B(b); // error:b is not a type オレ何勘違いしてるか教えてくれ。
訂正。 A<int, 10> a(B); // error:b is not a type
32 :
デフォルトの名無しさん :2009/03/02(月) 20:22:50
33 :
デフォルトの名無しさん :2009/03/02(月) 20:33:06
あのぅ、 あるクラスがlistとそのlistのカレント要素をメンバでもつ場合、 カレント要素をiteratorにするのは好ましいでしょうか? 好ましくない場合どのようにカレント要素を 持つのが一般的でしょうか?
34 :
デフォルトの名無しさん :2009/03/02(月) 20:35:53
ちなみにそのlistは途中でaddやdeleteされる場合があります
35 :
30 :2009/03/02(月) 20:51:55
class C{ int B[10]; A<int, 10> a(B); // error:B is not a type }; ・・・ 当然ですな 疲れてるようだから寝ます。
36 :
デフォルトの名無しさん :2009/03/03(火) 01:22:51
キーボードから文字を入力する際、scanfはなるべく使わないほうが良いのですか? 参考書ごとに違いが有って、scanfを使用するものもありましたが中には int c c = getchar() で一文字ずつ入力させるプログラムがありましたがどちらの方が良いのでしょうか
そんなことも理解できないヤツがプログラムなんてやるな。自明だろ
答えることができない奴ほど自明なんて言うよな
>>36 scanfをあまり使わないほうがいいとは思うが、理由を知らないと意味が無い類のものなので
調べてください
>>36 参考書による違いは、参考書を読まないと判らない。
何故なら、getchar()でやる方法を練習のために示す本もあるから。
scanf()は万能ではないし問題点もあるから使わないに越したことはないが、
だからと言って取り敢えず使うためのプログラムにgetchar()で作るのは愚。
まぁ、余程のことがない限り、fgets()(+sscanf()かatoi()かstrtol()か)で事が足りる。
# そして、余程のときはやはりgetchar()では事が足りないので環境依存の方法が必要。
>>36 scanfにはちゃんとバッファオーバーフローさせない方法もあるから
その点を理解して正しく使う分には問題ないよ。
実際scanfは便利。
45 :
デフォルトの名無しさん :2009/03/03(火) 21:21:53
おまいらscanfなんてどうでもいいから早く
>>33 を誰か答えろ
ここにはscanfしか語れない初心者しかいねぇのかYO
46 :
デフォルトの名無しさん :2009/03/03(火) 21:44:23
カレント要素って何?
33はC++よりも日本語をまず勉強すべきだと思う
エスパーすると リストの内部イテレータが外部インターフェースに対してスタティックに成るけど オレ様の用途に十分かどうか教えてくれ。 と 33 は問いかけてると読む。
49 :
33 :2009/03/03(火) 22:37:54
>>48 その通り。君はプロだ。やっぱプロは違うなぁ
で見解は?
>>46 >>47 チミたち、C++ならいたての学生には用はないのだよ
気安くレスしないでくれ
そのlistが最早更新されないのならiteratorで医院で内科医?
とある関数のソースで、 void test(char yui,...) とある場合、...の意味するものはなんでしょうか?
52 :
デフォルトの名無しさん :2009/03/04(水) 00:41:47
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)のようにしなきゃ駄目ですか
lstrcpyをstrcpyにしてみては?
55 :
51 :2009/03/04(水) 07:14:51
>>52 そのリンク先で、myfunc( "test" , 100 );とよびだされた場合、
"test"というのはどう扱われるのでしょうか?
>>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
指定したディレクトリ以下のファイル、ディレクトリをすべて 取得するような関数ないでしょうか?
opendir readdir
63 :
デフォルトの名無しさん :2009/03/04(水) 12:02:15
多数の変数を単なるバイト列にその場でパックする方法で質問です。 通常なら 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, ... }; というのが動いたりして、ソース記述としては一番気に入っているのですが、 当然使えません。そこで質問ですが、これくらい簡潔(冗長な情報を 書かずに済ませられる)に書け、さらにせめて実装別の拡張程度で済ませられる バイト列へのパッキング方法ってないでしょうか?
struct buff{buff, ite}; テンプレート関数(&buff, T) {memcpy(buf, ite, sizeof(T))〜; buf.ite+sizeof(t); return &buf}
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;
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);
構造体のコンストラクタでは駄目なの?
69 :
64 :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); } する。
正規表現でどうとでもなるんじゃね?
>>69 扱う型の種類、パックする環境、アンパックする環境、を可能な限り詳しく教えて下さい。
特になぜエンディアンが問題になるのか解るように。
73 :
70 :2009/03/04(水) 20:58:04
変数の型を調べる必要があるので正規表現では無理なような気がします。 boolean a; if(a) { とか boolean c() { boolean r = 0; 略 return r; } の場合は修正の必要は無いです。
そもそもC標準にbooleanなんて型はない
>>72 char 配列 可変長要素 エンディアン とくれば UTF-8 系の処理だろうな
76 :
64 :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 :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でだけエンディアン変換が問題になるのでしょうか。
memcpy(buff, &hoge, 4);は*(uint32_t*)buff = hogeに機械的に書き換えられると思う。
80 :
64 :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 :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でも色々調べたんですが、解決方法は見つからず・・・どなたか助言下さい。
>>84 C++用の
<complex>
ならあるみたい
複素数は C99 からなので、手元のコンパイラが対応していなくても泣いちゃだめ。
printf("ロベール先生の第27章から忌み不明になってきた");
#include <iostream> using namespace std; #include <math.h> #define FNC void fnc(); FNC; int main() { fnc(); return 0; } FNC { cout<<"FOFOOFOF"<<endl; } どこが間違っているんでしょうか?
#define FNC void fnc() セミコロン入れたらダメじゃね? 知らんけど。
91 :
デフォルトの名無しさん :2009/03/05(木) 18:27:57
>>84 そんな事に手間取るくらいなら自前で作った方が早いだろ。
加減算、乗算は一瞬でしょ。
割り算は意味わからなくても公式で一発だし。
>>83 fputcの要領で、16ビットや32ビットなど必要なものを
(中身はエンディアン変換とfwriteを使い)自分で関数を作っていくのはどう?
と思ったが、VC++だとfmemopenがないから駄目だよな。
>>84 適当に探せば外部のライブラリがありそうじゃない?
それでしのいでいるうちに猛勉強してC++も使えるようになれればおk。…無茶か?
try catchをnew以外に使えてない素人なんだけど、try catchってほかにどんなときに使うの?
例外をキャッチするときに使う。キャッチしたい例外がないなら別に使わなくても良い。 「自分で書くコードが、どんなときに例外をスローすべきなのか」 となると別の話になるけど。そういうことが聞きたいの?
96 :
デフォルトの名無しさん :2009/03/05(木) 19:40:34
h = FindFirstFile( path, &data ); で FindFirstFile( )関数の失敗した値 INVALID_HANDLE_VALUE が返ってきた時 if( INVALID_HANDLE_VALUE == h ) { FindClose(h); } ってやるんだけど 失敗したときのハンドル値で FindClose() していいの? 失敗してるこの場合 FindClose() はいらないの?
ごめん。間違えた。 いらなかった。
ごめん。間違えた。 いらなかった。
ごめん。間違えた。 助かった。
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を足すしかないでしょうか?
tmp2 = Test_struct.test6[index].test3;
103 :
101 :2009/03/05(木) 22:54:33
>>102 おぉ・・・・・素早いレスありがとうございます。
確かにコンパイル出来るようですっ! 明日アセンブラで狙ったところに
アクセスしているか確認してみます。
この場合、test6 はポインタですが、Test_struct.test6[index] と書くと、Test_set2型の
RAM扱いになるんでしょうか?(ショボイ質問ですいません)
p[n]は*(p + (n))と同じ
RAMってw
Random Access Machomen
こんなのがわかってないうちからアセンブリやってるの? 順番ちがくね?
ハード屋なんじゃない?
int nFibo[16] = { 1, 1 }; これの = { 1, 1 }; って・・・・なんでしょうか・・? こんなの見たことありません・・! これはどういう意味なんですか・・?
nFibo[0] と nFibo[1] を1で初期化して残りは0で初期化。
わかりやすい説明サンクス!
ロベールのC++教室はC++と銘打っているが、ほとんどCの勉強という感じだ。 Effective C++などには配列はやめてvectorとstringを使おうと書かれているが、 ロベールでは徹底的に配列を使う(というより全編にわたってほぼ余すところなく登場する)。 配列はポインタと表裏一体なので、初心者は最初からCの一番の鬼門と真正面から向き合うことになる。 メモリ操作に関する知識は絶対に必要なのでこのスタンスもわからなくはないが初心者にはやや厳しくはないか? 他にも、ビット列の再解釈がしばしば登場したり、ハンガリアン記法が採用されていたり。 まぁ、いずれも必要な知識だけどさ。
C++の解説には、色々な入口から入る方法がある。 どの解説も同じでは面白くない、違う方が良い。 Cから順番に説明があったり、 いきなりクラスから説明したり、 それを読者が選ぶ事が出来る。良い時代です。 それぞれが、それぞれに良い
む。なるほどそういう考え方もあるか。確かに。 自分はCを学ぶにあたってポインタの習得にだいぶ苦労したので Accelerated C++でCを勉強したときは目からうろこだった。
>>113 その考え方ステキだな。
俺は途中でロベールを読んだが、たま〜に知らない事が出てきて面白かった程度の記憶しか残っていない。
(逆に言えば特につっかからなかったとも言える。慣れてたからだろうけど。)
最初に読んでいたらきっと感慨も違っただろうなぁ。
私の考え方は他人と違う。。同じかもしれない。 機械語を逆アセンブルするときは、逆順、後ろから読む。 そして、終わったら前から順次読む。 本を読む時も同じ。逆から読む。 変かもしれない 人それぞれです、その人に合ったものを選ぶ事が出来れば幸せになります。 自分自身を知って、マッチする方法を選ぶ能力を養う これが幸せへの法則かもしれません。
117 :
デフォルトの名無しさん :2009/03/06(金) 15:52:32
数値入力で1〜9999の範囲内で入力してくださいという プログラムで範囲外だとエラー文を表示するのですが、 long型のオーバーフローする値(4294967296)を打ち込むと 入力エラーにならず読み込んでしまいます。 どういった対策をすればよいのでしょうか? ちなみにint型で定義してあります。
コードは?
>117 入力部分と、保持する数値とを分離するとか。 >119 現実的にはともかく、理論的には変わんなくね? そうでもない?
string に読み込んで桁数判定した後数値変換するとか。
123 :
デフォルトの名無しさん :2009/03/06(金) 18:15:57
scanfを恥ずかしげもなく使う男の人って。。。
男女以前にプログラマとしてどうか
別に普通
int64整数の補数をint32|int16へ最大値切り詰めにしても余剰bit切り捨てにしても 1〜9999条件なら 4294967296 (0x1 0000 0000)は弾いてくれると思うが 如何か
strtol を使えば大きすぎるのを入れたときはLONG_MAXになるから弾けるよ
>>126 弾けるのは4294967296とか、一部じゃないかw
キャストの弊害や精度不足の問題なら対処のしようがあるが もしも 117 の不具合症状を含むライブラリや CPU が有るようなら大問題 概念的指摘ならば問題はないが数字を出して上手くいかないと主張するなら 実行環境を示して頂きたい。
バカは黙ってろw
>>117 >ちなみにint型で定義してあります。
といっているが、そもそもオーバフローする値が入力できるんだから元は
文字列とかint以外の値でしかありえない
それをintに変換した後ではじくのは不可能
面倒くさくても地道にやるしかない
1) 文字列のまま取得
2) 前後の空白とかとる
3) 数値以外のものがあったらエラー
4) 先頭の0を削除
5) 5桁以上ならエラー
6) 空文字列なら0
7) 整数変換
とか、まあがんばれ
まぁ、strtol()を使えば変換終了点が得られるからそこをチェックすれば事が足りるな。
ポインタは俺の理解を超えてやがる・・・・!!!
>>133 どうしたw突然何があった。
…まあ状況次第ではある意味大半の人の理解を超えているよ。
自分で組むだけなら、Cは良い言語だと心から言えるが、 他人のソースを読むと微妙な気分になる。 C++はまあまあ良い言語だが、他人のソースは くそったれと思う。 って事かな?
俺は自分のソース見てくそったれと思う もっときれいに書けないのかよ昔の俺
それはあなたの進化の証。
138 :
デフォルトの名無しさん :2009/03/07(土) 12:04:25
ソースなんて動けばいいよ。動くことが見た目に判ればそれでいい。
ポインタを解りやすく解説してくれるC++のサイト教えてください・・・ ロベール先生すいません あなたの説明は僕の理解を超えている
>>139 適当な本を買った方がいいよ。
サイトは限界があると思う。
…そしてアドレスとポインタが分からないならロベール先生のせいじゃなくてまだC++に入るほどの腕じゃないと言うことだからC言語の本が良いと思うよ。
アセンブラやればポインタはわかる。 なのでPCプログラミングより8bitマイコンでも触るのお勧め。 ポインタが判らないという事はメモリマップとかスタックイメージも 脳内に浮かんでいないのは確実な訳で、それは計算機の知識が決定的に 欠けてる訳で、ってことはC/HWに限らずJVMやCLRも理解できない訳だから 一番見通しのいい低レベルハードウェアを触って身に付けるといいと思う。
#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; } なぜこれで失敗するのかが理解できない・・あほでごめんなさい
ポインターは簡単、ポインターの解説が難しい。 上手に説明できたら天才。
つまり、なんだかんだでnYearの値が変更できないってこと・?
なんだかんだというかそのやり方だとnYearがこぴってわたされて そのこぴったのを変更しているだけ
150 :
142 :2009/03/07(土) 16:14:00
>>147 ポインターのような人間には解りづらく、そして機械に都合のいいように作られたものの使用を強制する言語はダメポ言語
普通は人間に合わせて言語が作られるべきだろ
ポインターは日本語に似合う。皆は知らぬうちに日本語会話の中でポインターを使っている。
>>151 の考える素晴らしい言語のソースも、
ポインターを駆使して記述されています。
154 :
デフォルトの名無しさん :2009/03/07(土) 18:47:53
ボイン太さいこー!
int **(*i[10])[4] int (*i())[6] int *(*(*i)())[4] 数秒以内にポインタiが何を指しているのか理解できないと Cの初歩にすら達してないと言われた お前らなら、一目瞭然で数秒どころか一瞬だろ
>>156 実際そんな使い方はまったくしない。
一目でわかりやすい宣言をするのが上級者。
実際は使わないが、錬度を試す訓練だよ
数秒でわかったらすごいわ 俺の場合、特に最後は()の解析で時間かかるぞ
そこに至るまでのコード次第 いきなり 156 が現れたら 書いた奴の精神状態を疑う。
>>159 俺、今でも数秒では無理だが、宣言をすらすらと解析できないとなると程度しれるよな
まだまだ初級のおれがちょっと前に新人にこのp何さしてるのって聞かれたのがこれ
int (CC::*(p[3]))(void);
これぐらいなら頻繁に使うだろうし、ム板連中なら一瞬だろ
ちなみに
>>156 は会社の新人PGのC言語コースの理解度試験
頻繁に使うか? 俺だったらまずtypedefするが…
爆釣
http://mist000.h18.ru/debug.cpp メンバーイニシャライザを使用したコンストラクタをクラス定義の外に分離したいんだが、
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
--------------------------------------------------------
分離すること自体考えてはいけないのだろうか...
メンバーイニシャライザ使わなければ分離できるのに。。
間違いがあればよろしくお願いします。
>>162 まさか typedef int (CC::*(p[3]))(void)
なんて言わないよな
int (CC::*(p[3]))(void)が何をあらわすのか、解りやすくするtypedef頼むよ
実はほとんど俺の自作自演
>>164 typedef int (CC::*ccpoint)(void);
ccpoint p[3];
こんな感じにするんじゃね?
2ちゃんねる株式会社ではよく使います。 実際はベテランほど保守性を考慮して単純に書く。 Cの設計者でさえシンプルに書けと言ってるのに、 何を勘違いしてるんだろね。
むずかしっすぎる!
int (CC::*(p[3]))(void); が頻繁に出てくるようでは駄目だと思うわ
Visual C++ 2008 Express Editionの使い方がよくわかりません。 講座サイトの解説で使ってるVisual C++はちょっと違って 現在編集中のプログラムを実行する方法がわかりません。 ご教授よろしくお願いします。
172 :
165 :2009/03/07(土) 21:01:49
お騒がせしました、自己解決しました。
int (CC::*(p[3]))(void)のpって何を指す 日本語で書いてくれ
pは、配列です。何の配列かと言うと・・・次の人、どうぞ
パス!
178 :
175 :2009/03/07(土) 21:26:55
あと、
>>156 の
int **(*i[10])[4]
int (*i())[6]
int *(*(*i)())[4]
のiも頼む
もしかして、voidさん入店されてはります?
全然わからんw
1番目は多次元配列っぽくて、
2番目と3番目は関数ポインタの配列っぽいれすか?
あと
>>161 はメンバ関数へのポインタっぽい?
答えをたのむぅ。
181 :
デフォルトの名無しさん :2009/03/07(土) 21:48:22
実際のコードで、こんなの使っちゃダメだが、 Cの文法の知識として、本当におまえら、読めないのか? javaばっかやってるから、バカになる
182 :
175 :2009/03/07(土) 21:52:00
>>180 俺と似たような,orzレベルだな
色々レスしてる人たちって解ってるんでしょ、なら教えてくださいなーーーー
int **(*i[10])[4]; ( ((int[10])へのポインタ)[4] )へのポインタ ×2 int (*i())[6]; (int f()のような関数へのポインタ)[4] int *(*(*i)())[4] ( (int *f()のような関数へのポインタ)[4] )へのポインタ ということでいいのか?
C言語パズルです、みたいなノリで出されるなら喜んでやるかも。
186 :
180 :2009/03/08(日) 00:09:44
1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数i。 2番目は二次元配列を戻り値とする関数i。 3番目は「関数ポインタを格納する二次元配列へのポインタ」へのポインタ。 わからーんw
187 :
180 :2009/03/08(日) 00:50:52
んー。一番目はいきなり間違いだな。 1番目は「二次元配列へのポインタ」のポインタのポインタとなる要素数10の変数iだとすると int *(**i[10])[4]; と書く必要があるようだ。わからん・・・。答えはまだか。
188 :
デフォルトの名無しさん :2009/03/08(日) 01:11:50
int **(*i[10])[4] intへのポインタのポインタの配列へのポインタの配列 int (*i())[6] intへの配列へのポインタを返す関数 int *(*(*i)())[4] intへのポインタの配列へのポインタを返す関数へのポインタ
189 :
180 :2009/03/08(日) 01:21:47
なるほど、int **(*i[10])[4]の最初のint **は納されている型になるのか。 んでもって、(*変数名)[4]が多次元配列へのポインタで、 変数名の後の[10]がその変数の要素数になる、と。 だんだんわかってきた。おもしろい。w
外側から一つずつ剥がしていく。最初と最後の両側から剥がせるときは、最初を先に剥がす。 剥がしたものが、それぞれ int(などの普通の型名)であれば…… 「int」 * であれば…… 「へのポインタ」 [N] であれば…… 「の配列」 (int,int) (など、カッコ内に型名)であれば…… 「が戻り値の型、(int,int)が引数の型である関数」 MyClass:: であれば…… 「で、MyClassのメンバであるもの」 をつけていく。これで読めるはずだ。英語圏の人は逆向きにやるらしいけど。
あと、これとは直接関係ない話だが、intへのポインタへのポインタは、intの2次元配列とは別物だからね。 「ポインタ⇔配列」の互換ができるのは、末尾の「〜へのポインタ」「〜の配列」の部分のみ。 だから、ポインタの配列はポインタへのポインタで受けることができるし、2次元配列は配列へのポインタで受けることができるが、 2次元配列をポインタへのポインタで受けるのは不正。
192 :
デフォルトの名無しさん :2009/03/08(日) 01:51:13
>>190 読めないよ。
int &a
int func<int>()
193 :
180 :2009/03/08(日) 01:52:14
大変よくわかりました。
167は正しいの?
正しいよ。
C言語の宣言の文法は、もうちょっとマシな文法にならんかったの? 標準化するとき、誰からも反対が出なかったのが不思議なくらいだ。 頭がいい人がいっぱい集まってやってるハズなのに。
これでいいんじゃない? っていうか、Quizみたいなみょうちくりんな宣言が必要になるプログラムは そもそもの設計が間違っている気も。
Cだと、ポインタ型を別に作って欲しかった
後は関数ポインタの宣言を何とかして欲しかったくらいか
>>156 をすらすら読み、161みたいなのを頻繁に使うプログラマにはなりたくない
161はtypedefしないらしいし…
>>199 もし
>>156 をtypedefを使って分りやすくしてくれと言われたらどのように
typedefする?有る意味typedefの練習になるんじゃないか
それらが何を意味するものとして使われているのか、それに基づいてtypedefすべきと思う。 例えばchar*をstringとしてtypedefしたり(C++ならstd::stringがあるけど)、単純に置き換えるんじゃなくて 意味が分かるようにしなければ、結局分かりやすくはならないんじゃないか。
>>201 普通はそうだが、練習なら良いんじゃないか
>>156 を見てこれならどうtypedefしたらいいんだろと疑問に思っただけ
>>156 は宣言構文解釈による頭の体操って感じかな
頭の体操なら現実では使わないものでも良いんじゃないか
>>201 つまり、windows.hを批判してるってことですね。
windows.h のそれは、int32_tとかwchar_tとかが無かった時代の産物としては存在意義があると思う。
205 :
202 :2009/03/08(日) 04:55:42
>>203 本人のポリシーだから良いんじゃないの
ま、windowする時は、気に入らんでもwindowsの流儀に従ったほうが無難だろな
windows.hの場合は囲い込んで、移植させにくくしただけだろ。 gcc+Qtでなんも困らん。
207 :
デフォルトの名無しさん :2009/03/08(日) 09:50:09
俺もstdio.hで十分だわ
っつか、この世は俺1人で十分だ
つかMSはさっさとstdint.h対応しろと。C99決まってから10年なのに 何をしているのかと。
#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 それコンパイラか頭のバグ
コンパイラ何? 頭は何?
>>211 ifだけじゃだめだろ
この場合if(x)かな?
他もひどすぎて、思ったとおりには実行されないと思うが
>>213 VIsual C++ 2008
頭・・?
>>214 これのどこがひどいと言うんだ・・・!!
シンプルで無駄のないプログラムじゃないか!!
>>215 じゃ、頭のバグだな。
int x = 1945;
void ChangeToShohwa(int& x)
if(x)
これで良いだろ
ていうか、xを改変する意味が分からない int返せよ
ワンパクでもいいタクマシク育ってほしい。
これ、ロベールからの引用じゃろ? まともに動かなくていいのよ。この後、参照の話が出てきて まともに動かない理由とちゃんと修正されたバージョンのコードが記載されてるから。 しかし、ロベールは2000年の記事じゃから古いぞ。 使っているコンパイラもVC++6で著者自身が 環境依存はいやだと書いているくらいだし。
>>221 Googleのプンソで採用されているコーディング標準では
参照パラメータはすべてconstにせよってあった。
まぁ、それはさすがに行き過ぎだと思うけど
関数の可読性という点ではなるほどとも思う。
プンソって何?と一瞬思ったがオプソか。
西暦と昭和を同じ変数で扱うのが気持ち悪いってことじゃねーの?
西暦形式で格納されてる変数がいつのまにか(ではないけど) 和暦形式に代わってるとか死ねとおもうね
年クラスを作って、get西暦とget和暦メソッドを用意するべきでしょうか。
231 :
デフォルトの名無しさん :2009/03/09(月) 00:07:37
時刻クラスを基本クラスとして、西暦クラスと和暦クラスを派生させるんだろ。
出来事 vector に年月変換機能を備えたイテレータが美しいと思うよ。
日単位で持っておいて、月以上に変換するときは暦クラス通すようにすれば。
「和暦表示じゃないと、絶対困る!」 って言われること、けっこう良くあるけど、 天皇が暗殺されたら、どうするのかね?
簡単に追加修正できるようにSQLite、CSV、XMLででも持っとけよ。 そんなの昭和64年からの常識だろ。
天皇が暗殺されても今までの和暦がなくなる訳じゃないしなぁ。
西暦だって、新宗教に宗旨替えして新西暦0年にリセットするかもしれないし、 イスラムが再び勃興してイスラム暦に切り替わるかもしれない。 UTCみたいな無色透明な基準年が必要だな。
UTCのどこが無色透明だって? 基準だったら皇紀でもいいわけだろ。
いやぁおまいらの講義はみてて勉強になります。 小生も美しいコード書けるようになりたいですハイ。 弟子入りさせて貰えませんか?
地球の誕生年を元年にすればいいじゃん。 俺が小学生の頃、46億年前に地球ができたって聞いたから今は46億18年だな。
地球の紀元は今後変動する可能性があるので基準にできません。
じゃあ宇宙で。 ビッグバン歴
同じ理由で却下
それにしても、1926年は殆ど昭和じゃないんだがなぁ。 同じように、1989年も殆ど昭和じゃないし。
VCでコンソールアプリを作成し起動します。その後外部のPGから、 SendKeysやPostmessage,標準入力などでキー送信を送ろうとしているのですが、 SendKeysの場合:通常のキーは受け付けるがファンクションキーは駄目 Postmessage、標準入力の場合:何も受け取らない となります。 ファンクションキーを送信したいのですがどうすればいいのでしょうか? アドバイスお願いいたします。 ・DOSプロンプトだと標準入力はちゃんと受け付けるが、コンソールアプリは受け付けない ->DOSプロンプトとコンソールアプリの仕組みは別物?
送れないこともないだろ? 今どうやってんの、C++/CLIなのか?
>>245 PostMessageやSendMessageがダメなのは知ってる。
他は知らない。
>>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プロンプトへはおくれるのに)
[1] 授業単元:趣味
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8957.txt [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]を表示させたいんですけれどもうまくいきません。
何故でしょう?
何となく原因はわかるのですが、漠然としていて手が出せないんです。
上のコードをみて、名人方のアドバイスをお聞かせ願いたい。
>>249 何をやりたいのかの説明がおかしいし、プログラムに至っては支離滅裂だ。
c[i]に文字を入れているのなら、1994なんて数値を入れちゃダメだろ。
初歩からやり直すことをお勧め。
>>240 位置エネルギーと一緒で無限遠を元年にすればいい
>>249 メモ帳べた書きでコンパイルしてない。好きにしろ。
#include <stdio.h>
#include <conio.h>
int main(){
const char* password = "1994"; int count = 0;
do{
int i; char input_password[4];
printf("パスワードを入力して下さい。(4文字): \n>");
for(i = 0; i < 4; ++i){input_password[i] = getch(); putchar('*');}
}while(!strcmp(password, input_password) && count++ < 3);
if(count >= 3){
puts("仏の顔も三度まで!\n正式なpasswordがないとシステムは使用できません!");
}else{
printf("password = %s\nシステムの使用を許可します。\n", password);
}
}
>>249 です。
>>251 氏
なるほど、確かにおっしゃるとおりだと思います。
説明不足で申し訳なく。
このプログラムは'1994'というPASSを定義して、c[i]に入力させてそのPASSを
入力させたら正解、それ以外なら間違いで再入力させるといった感じでつくりたかったんです。
そして、私はCを学び初めてほんの1ヶ月くらいの素人でありまして
現在進行形で勉強中の身であります。
初歩から学んでいるつもりなのですが、何分覚えることが沢山すぎて手探りな状況な次第。
もし、よければ勉強するポイントなど上げて貰えると助かるのですがお願いできますでしょうか?
伝統的なポイントな。 1) 初心者です、を免罪符にした発言を慎む。 2) 一歩目から他人に頼るな。努力の跡すら見えないのは相手にされない。
小心者です。 インポ目で他人を頼って(ry
>>254 一ヶ月もあれば、パスワード入力くらい書けるようになる。
それができていないのは、初歩からきちんと自分のものにしていないのではないだろうか。
まさかとは思うが、本を読んで理解した気になっただけで書けるようになるとは思っていないだろうな。
まぁ、先ずはもっと単純な文字入力からおさらいしてみようかw
宿題スレに張り付いて課題こなしてたら力量うp。
>>253 メモ帳だとその程度か
input_passwordが0終端してないぞ
宿題スレは単にバカな質問を受け流すためのハコだからな・・・
>>255 氏
肝に銘じます。
>>257 氏
言われてみれば、本を読んでたら出来るようになるとは少なからず思っていました。
でも、実際やってみて全然出来ないどころか、覚えることすら出来ていないことに
自己嫌悪に陥っています。
単純な文字入力から勉強し直してみます。
>>258 氏
宿題スレの名人方は、添削するより、ひたすら課題を自分でこなしていく
のが好ましいようなので、張り付いてだけじゃ私の力量うpには繋がりませんよね・・・。
参考にはなっていますけども。
>>261 本を読むだけでも相当な勉強になる。
…ただしただ読み流すだけではダメで、理解しながら読まないと、ただ字面を追っているだけになる。。
そして少しでも疑問に思ったら先へ進まないでコーディングしてみる。
この辺は中高生の数学と共通する物がある。
ってな感じが俺の認識。
実はここまで全て俺の自演
>>262 氏
>…ただしただ読み流すだけではダメで、理解しながら読まないと、
ただ字面を追っているだけになる。
はい、どうやら私は読んで理解したつもりだっただけで
字面を追っていることをこれまで繰り返していただけのようです。
「早くCの知識を身につけたい」という気持ちだけが先走っていたといいますか。
勉強しても早々簡単にはみにつかないものなのにおかしいですね。
>>264 氏
もし自分で回答なんかしちゃったりしたらら駄目だしされまくりで
精神的に辛すぎるような気もしますが・・・
>>266 ダメだしされて何が悪い。直せばいいじゃないか。
ダメだしも指摘もなければずっと悪いままだぞ。
268 :
デフォルトの名無しさん :2009/03/09(月) 15:43:56
昼間に2ちゃんねるに書き込んでる人間なんてスキルも無いロクでもない人間なんだから 講釈なんて聞いても無駄だよ。 自分ができない夢を語っているだけなんだから。
困りました・・・
文字入力の基礎からやり直そうと思って勉強し直してるんですけども
いつまでたっても目的のパスワードプログラムが出来そうもない・・・
何となく問題の原因はわかりかけてるんだけど、漠然としてて・・・
そっから全然前に進まない
ほんと使えないなぁ・・・私って・・・OTL
>>267 氏
確かにその通りかもしれません
すぐには無理でしょうが、いずれ力量うpしたら実践してみたいと思います。
文字コード、文字列、数値
ゆっくりいこう
272 :
デフォルトの名無しさん :2009/03/10(火) 01:04:54
あるバージョンのgccでは、複数のスタティックライブラリをリンクするとき liba.aがlibb.aの関数を使用し、libb.aがlibc.aの関数を使用しているとき gcc -o prog main.o liba.a libb.a libc.a の順番に書かないとundefinedなんとかというエラーが出る。 もしも、liba.aとlibb.aの双方が互いの関数を使用している場合、 これらのスタティックライブラリを上記のgccでリンクするにはどうすればよいのか。
gcc -o prog main.o liba.a libb.a libc.a liba.a
>>272 そうならないようにモジュールの配置を見直す。
>>272 そういうのを循環参照と言って、良くない設計の兆し。
gccって、あるバージョンとか噂とか、不確かではっきりしない事を よく書かれてるな。
>>272 昔のHP/UXにもそういうの(順序を人間が決めないといけない)があって
lorder | tsort で依存関係をトポロジカルソートして makefile に食わせた覚えが。
/* getchar.c */ # include <stdio.h> int c, cc; main(){ printf ("getcharの実験 Ctrl + Z で終了\n"); while ((c=getchar())!=-1) {putchar('*'); putchar(c);} printf ("getchの実験 スペースキーで終了\n"); while ((cc=getch())!=32) {putchar('*'); putchar(cc);} } このプログラムの「while ((c=getchar())!=-1)」の「!=-1」って 「Ctrl + Z」をあらわしてるんですかね? それと、「while ((cc=getch())!=32)」の「!=32」ってのは 「スペースキー入力」を意味してるんでしょうか? いま、入出力を勉強中なのですが、これがよくわからなくて。 教えて下さい、お願いします。
32はASCIIコードでスペース -1はEOFだろ。Ctrl-Zかどうかは環境による。
>>279 なるほど。
では、上のプログラムを数字の「1994」と入力したら終了するように
書き換えるにはどうすればいいのでしょうか?
自分では、「!=1994」と記述すれば問題ないだろうと思っていたのですが
実行してみると全く終了する気配がありません。
コンパイルも正常に通り、延々と入力させるプログラムに成り果ててしまいました。
数値の1994と比較したいなら atoi(str) != 1994 まあ普通は strcmp(str, "1994") != 0
そのマジックナンバーは「悪い例」として何かに載ってるのかな・・・
>>249 からの流れか。
ってMSC5.1?
MS-DOSの頃のじゃないのかそれw
>>281 なるほど、atoi関数使って整数文字列を整数値に変換してからでないと
いけなかったんですか
ということは文頭の#includeにstdlib.hを追加しないといけないのかな
ありがとうございます名人
私は名人のようなPGになりたいです!
>>283 はい、そうです。
調べてみたらPC9800シリーズに標準装備されてた頃のやつっぽいです。
まぁ、今のところ不自由はしていないので古くてもいいかなって思って
使っています。
あのーまたまたへたれ過ぎる質問で恐縮なのですが、 /* getchar.c */ # include <stdio.h> int c, cc; main(){ printf ("getcharの実験 Ctrl + Z で終了\n"); while ((c=getchar())!=-1) {putchar('*'); putchar(c);} printf ("getchの実験 スペースキーで終了\n"); while ((cc=getch())!=32) {putchar('*'); putchar(cc);} } この「while ((c=getchar())!=-1)」の「!=-1」の部分を「atoi(str) != 1994 」 に書き直すにはどうしたらいいんでしょうか? 自分でやってみたらえらい不細工な文になってしまってとても見てられたものじゃ なかったもので・・・ご教授願いたいのです
まずは1文字入力したら配列に追加していく仕組みを作ってみ 別関数にするのがいいけど
>>285 char str[1024] = {0};
int i = 0;
とか宣言して
str[ i++ ] = c;
を追加
「一文字入力したら配列に追加していく仕組み」は
>>249 のリンク先のコードの中にもう入ってるんだけどねー
・文字=数値(ASCIIコード)
・文字列=文字の配列
質問者が↑をまだ理解しきれてないんじゃないのか
あとatoi()をパスワード認証に使うのは同意できない
パスワードも入力も文字列なのに、なぜ数値に変換する?
例えばもしパスワードが"1994"でなく"0083"だったら、入力が
"0083"でも"083x"でも"83xx"でもOKになるんだけど、それが君の望む挙動なの?
自然に文字列どうし比較しようよ。「普通はstrcmp()」って書いてくれてるやん
『文字列は難しい』ってみんなが脅すから避けてるのかもしれないけど
『文字列(をうまく説明するの)は難しい』の意味だから気にせず勉強しろよ
理解できた後なら『俺どーしてこんな質問してたんだろ』ってなるよ、絶対
>>287 こんなERRがでちゃいました;;
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8960.txt gch2.C
gch2.C(8) : warning C4135: conversion between different integral types
gch2.C(11) : warning C4016: 'strcmp' : no function return type, using int as default
gch2.C(11) : warning C4071: 'strcmp' : no function prototype given
gch2.C(15) : warning C4016: 'getch' : no function return type, using int as default
gch2.C(15) : warning C4071: 'getch' : no function prototype given
gch2.C(18) : warning C4035: 'main' : no return value
初心者で、関数の勉強中です。 テキストがカーニハン&リッチーなんですけど、ここでのハロープログラムは #include<stdio.h> main() { printf("hello,world\n); } と、とてもシンプルなんですけど、ネットを見ると #include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; } になっています。要するに #include <stdio.h> int hello(void); main() { hello(); } int hello(void) { printf("Hello, World!\n"); return 0; } というのが合わさったものと考えていいのでしょうか? 今コンパイラがある環境のPCからじゃないので、 上のプログラムでコンパイルされるかすら分からないのですが・・・。
>>288 全然理解仕切れていないのでもう少し文字列について辺りを勉強し直そうと
思います
atoi()は、使っていて自分には荷が重い関数かもしれないと思ったので
「strcmp()」を使うことにしました。
まだ「strcmp()」も勉強不足で理解していないのでそこも勉強し直しの
範囲に入りますが。
今回、漸く自分の勉強課題が見えてきたような気がします。
>>288 さんの言葉を励みにして頑張りたいと思います。
C言語を始めようとかいうソフトでプログラミングしてコンパイルするじゃないですか そして完成したファイルがコマンドプロンプトで実行されるんですけど GUIってどうやって付けるんですかね、タダでやりたいんですけど
>>290 それでコンパイルは通る。けど、K&Rはそういう意図で書いてるわけではない。
本来mainの戻り値は必ずintなので、厳密に文法どおりなのはネットのほう。
(戻り値をintと明記し、引数をvoidと明示し、0を返す)
K&Rのほうは警告オプション付でコンパイルすると
「戻り値の型が書いてないから勝手にintにするぜ」とか
「returnがないぜ」とか警告が出るはず。
K&Rはおそらく「一番はじめの入門だから、できるだけ例は短いほうがいいに決まってる」
ぐらいの気持ちでそう書いたんじゃないのか。信者には別の言い分があるのかもしれんが
K&Rを最初の本として選択するのはやめれ。 あれは他の言語をばりばり使っている人のための 「C言語仕様確認書」みたいなものであって 戻り値も知らないような初心者には難しい。
一応、戻り値がないときはint, mainだけは戻り値を返さなくても良いと決まっていた…ような だから、間違ってはないはず… 記憶が曖昧なんであまり当てにしないでくれ 不親切なのには同意するが
そうだよ。 main は戻り値を返さなくてもいい。 なぜなら main が戻す値をどう扱うかが環境依存なので。
#include <conio.h> #include <stdio.h> int main() { int turn, i, ch; char pass[5]; for (turn = 0; turn < 3; turn++) { printf("パスワードを入力してください>"); for (i = 0; i < 4; i++) { ch = _getch(); if (ch == EOF) return 2; printf("*"); pass[i] = ch; } printf("\n"); pass[i] = '\0'; if (strcmp(pass, "1994") == 0) { printf("Ok\n"); return 0; } } printf("NG\n"); return 1; }
>>293-294 ありがとうございます。
学校で押し付けられたテキストがK&Rだったので・・・。
ネットを参考にしたら何か違うぞ?ってずっと思ってました。
main()は不可侵な関数だとてっきり・・・。
明日学校でガッツリと関数の勉強します。
K&R以外のテキストで・・・。
C言語って難しいっすね。
>>295-296 補足ありがとうございます。
戻り値とかもまだまだあやふやですが頑張ります。
大昔はK&Rが仕様だったらしいな(知らんけど その後に仕様ができたんで、「K&Rが仕様どおりでない!」 ってのはある意味あってるけどお門違いかもしらん
K&Rが終わって 僕等は生れた K&Rを知らずに 僕等は育った プログラマになって 歩き始める オブジェクト指向を くちずさみながら 僕等の名前を 覚えてほしい K&Rを知らない 子供たちさ
int main(void)とかいちいちやるようなヤツのプログラムなぞその一行見ただけで他見る気なくす
それはない… 「いちいち」もなにもmainは一個しかないだろうが… 暗黙の宣言やらなんやらで警告出まくりなのに コンパイル通ってるんだからよしとするヤツのほうがきついわ
int main ( void ) main() void main() int main()
この話題定期的に出るな。規格準拠スレでやれ。
ごめんなさい
石田晴久といえばK&R
しつこいようだが、ANSI、ISO準拠の標準スタイルでは main関数への引数がないのであれば、C言語では int main(void) C++では int main() voidを書かなくて良いとのこと。 また、main関数はint型の戻り値とのこと。あくまでも準拠。
さらに、プログラムの開始はmain関数とのこと。その条件も含めて標準スタイルとのこと。 個人スタイルの押し付けをしていたら、キリがない。そこんと、よろしくー
ポインタ天国3を、ようやく私は理解することができた・・
main関数への引数を使う場合、int argc , char *argv[] というのも ANSI、ISOでは標準スタイルとして提唱している。ただし、 main関数内でその変数を用いていない場合、警告が出るので 何事も必要に応じて適切に。以上。
>int argc , char *argv[] めんどいからint ac,char *av[]って書いてる。 あとchar **argvって書くべきって意見も昔聞いた。
4文字省略すると面倒じゃなくなるのか
> char **argvって書くべきって意見 覚えてる限りでいいからkwsk 俺も最初は**で書いてたけど、 mainの中で結局 for (i = 0; i < argc; i++) { argv[i]; } とかして[i]でアクセスするから、 *argv[]のほうが素直だと今は思ってる。
どっちでも同じ意味だからどっちでもいいと思うが。
データが連続していることを連想しやすいように[]を使うと言う意見もあるが、
argvのようにポインタの指す先が連続していて更にその中身のポインタが連続していることを表現できるわけじゃないし。
>>315 例えばstrcpy()のような関数を自分で実装するとしたら
char * strcpy(char dest[], char const src[]);と書くの?
私は素直にchar * strcpy(char * dest, char const * src);と書くが。
> データが連続していることを連想しやすいように[]を使うと言う意見もあるが、
それはよくわからんが、
char *p;なら *(p + i)などという操作をイメージし、
char a[];なら a[i]という操作をイメージするという程度。
配列やポインタを渡す関数のパラメータは、
ポインタで統一して書いてる。
ポインタであるのに配列であるかのような書き方は嫌だ。
そういう意味では、mainのargvだけ特別扱いしてることになる。
同様の例でもmainじゃないとchar **ppとしてる。
mainのときは用途が
>>315 に書いたように定型化してるというか、
argcを参考にargv[i]とするのを尊重してやりたいというか。
>>317 よく判らんのだが、まさかとは思うが*(p + i)なんて本当に書くの?
argv[i]と書くのと同様に、件のstrcpy()の例ならsrc[index]という書き方になると思うのだけれど。
# 細かい言い訳は兎も角、main()だけは別扱いと言うことなら未だ理解できるが。
>>318 p[ i ]は *(p + i)のシンタックスシュガーだし
[i]でアクセスしたいってことは、 範囲がargcでわかってるからしたいこと。 そうでないときゃ、for (p = src; *p != '\0'; p++)としたりするでしょ。 あくまで[i]でやりたいならstrlenで一回文字列を調べてから、 for (i = 0; i < len; i++)とするでしょ。 上記のstrcpyだって、 char *strcpy(char *d, char *s) { while ( *d++ = *s++); return d; } ていうのもある。 長さを先に測りたい人は[i]すればよろし。 長さをパラメータで与えたい人は(int len)でも渡せばよろし。 ポインタでどうこうやるときは、つねに*(p + i)しなくたっていい。
>>320 いやだから、for (int index = 0; src[index] != '\0'; ++index)とは書かないの?
なんで? >319の事実があるのに? 某組み込み系のガイダンスだとポインタ演算禁止なのに?
長さを先に測りたいなら[i]ってどんな理屈? 長さを先に測ってから*(p + i)しちゃいけないの?
つーか、オプション指定を避けるのにargv++することだって普通にあると思うがな。 >321もいい加減構うのやめとけ。
好きにしろってことで終了
そうやって個々に任せた結果が使えないプログラマばかりが跋扈する現状というわけだが
そうやって自分のやり方をおしつけるから
「前の会社ではこうやってたの!!」
誰も
>>320 のstrcpyに突っ込まないのはなぜ?
スレチだから
いちようMSDNでは↓のようになっとるの int main( ); または、次の引数も使えます。 int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );
windowsでVisual Studio 2005を使用しています。 過去に作ったコンソールアプリケーションを編集しようと思ったのですが 不幸なことに.hファイルと.cppファイルを消してしまったために 編集ができない状態です。現状ではobjファイルが残っており、 デバッグコマンドなどでプログラムを動かすことはできるものの、 どうしても元のソースファイルを手に入れる必要があるのですが objファイルからcppファイルに逆コンパイルする方法はありますでしょうか?
大体どのコーディング標準でも 重要なのは一貫性を保つことであって、些細なことは個人の自由としている。 他人のコードに手を入れるときは、その人の流儀に従うべきで、 自分の宗教を持ち込んで後の読み手のリズムを狂わせてはいけない、とある。
>>330 objも消しちゃえば諦めがつくぞ
すっきりしてまた一から出直そう
逆アセならぬ逆コンパイラってないのかな。 objファイルはリンク前のコンパイル済みファイルなので 逆アセでもできそうな気がするけど。
>>331 ,333
どうしても諦めがつかなくてorz
>>334 確かに、逆コンパイルというと語弊があったかもしれません…
なんとか逆アセンブル出来ませんかね?orz
>>335 逆アセンブルならできるよ、まぁお前に読めるとは思えないけどさw
いっぱいあるから探してみなよ
確実に1から書き直したほうが早いだろうが
自分が書いたコードなら関数名見れば大体流れが読めるはずだしな
>>332 あまりに酷いコードの時はそうも言ってられないw
339 :
デフォルトの名無しさん :2009/03/11(水) 19:45:07
>>335 逆アセンブラならvisual studioについてるよ。
寧ろディスクから消したのが最近ならサルベージしてみてもいいかも。 案外、オートバックアップのサーバ上に残っていたりしてw
Linux環境においてLL言語、シェルスクリプトなどでちょっとしたことをするのには、適切と言われていますが C言語では、そういったお手軽なライブリなどは、整備されていないのでしょうか? LL言語、シェルスクリブトが適している分野をCで書くのは、どうなんでしょうか? Cに偏った使い方をするなら、binコマンドなどのcoreutiltyのmanやソースを読んで、巧みに使うのがいいんでしょうか? 住めば都で慣れれば、C言語での保守も苦では、なくなるものなのでしょうか?
342 :
デフォルトの名無しさん :2009/03/12(木) 10:57:37
データのスムージングを行う処理を作りたいんですけど、 Savitzky-GolayアルゴリズムのCサンプルコードとかないですか?
初心者なのですが、ファイルからテキストを読み込んで一番大きい数字を発見したいです 43,2,21,23,みたいなテキストなのですが、質問があります ・テキスト中のスペースは無視されるのですか? ・メモリについてmallocとか全くわかってないのですが使わないとかなりヤバイですか?
>>344 ・無視されるように読めば無視される。
Ex.:scanf()系, atoi()
・使わなくてもできなくはないが、どっちみちポインタの扱いには慣れが必要なので、そういう意味ではやばい。
つーか、課題か何かでなければ言語の選択の段階で間違っている。
実際はC#でするつもりなんですが何でするべきですか?CとC#しか知りません
C/C++は他の言語に比べて文字列解析が簡単ではない C#なら正規表現が使えるからかなり楽になると思うが 一般にはこの手の作業にはスクリプト系の言語がより向いている まあ、CとC#の選択なら、最初からC#のスレで聞いとけって話だ
すみません Cでも正規表現使えると思ってますたw ありがとうございました
>>348 Cの場合、C#みたいに標準で用意されていないの。
何かインクルードしたら使えるとか?
>>348 今できたけど…「 ./a.out < ファイル名 」で使ってみて
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
int max = 0, num = 0;
while((c = getchar()) != EOF){
if(isdigit(c)) num = num * 10 + c - '0';
else {
max = (num > max) ? num : max;
num = 0;
}
}
max = (num > max) ? num : max;
printf("max = %d\n", max);
return 0;
}
できればC#に組み込めるようにして頂きたい^^; 適当にコピペしたらインクルードやgetcharが使えなかった
ここはC/C++スレだ 移植は手前の仕事
フヒヒw
wwwwwwwwwwwwwww
サーセン
ソースコード書くなんて、下っ端の仕事
ソースも書けない糞上司
ソースしか書けない専門学校卒
ソースも書けない落ちこぼれに言われてもなー
高卒の叩き上げが最強ってことで、ゆるして
就職||卒業出来ないからって荒らすなよ。
>>342 numerical recipes in CやC++に載ってる。C++もベタに書いてあるので、
++の意味はほとんど無いw あとはqtiplotだっけ? originのfree implementationの
ソース読むとか、MSDNにも解説があるな。しかし簡単な式だから、すぐ作れるだろ
携帯からなので、PCでググればもっと探せそう。
>>362 >343
携帯だとすぐ下のレスも見られないのか?
つーか、元質はCだと書いているのさえ見えてないのか。
>>364 >Foxit readerでさえ
「でさえ」?
そりゃ Adobe Reader で読めなかったときに使う言葉だろ。
>>365 >>363 は携帯で読めないのかって書いてるじゃん。
まあもちろん携帯のadobe readerでも読めない訳だが。
367 :
343 :2009/03/13(金) 19:21:33
>>364 普通にIE+AcrobatReaderで見えるけど。怪しげなクローンより本家の方がいいと思ったんだけどな。
# そして私は>363ではない。
PCのAcrobat Readerでも開かない。 なんか、変なプラグイン入れろって出る。 IEからでも。
暗号化してあるみたいだね。headerがどうたらって出た どうせnumeric recipiは信用できないからいいけど。
370 :
デフォルトの名無しさん :2009/03/14(土) 18:25:38
作ったソフトをオープンソースで公開しようかと考えているのですが、 ネット上のサンプルをコピペしたコードが多々あって、勝手にオープンソースにしていいのかわかりません。 ライセンス表記がされていないものも多いので確認のしようがないのです。 こういう場合でも勝手にBSDライセンスとか付けて配布してしまっていいのでしょうか? 出所はもちろん明記するつもりですが。
バレてトラブルになった時の対処ができるなら。
コピペでオープンソースですか、笑っちゃいます。 コードを書けないのなら無茶な事しない。 ネット公開されてれば、使ってよいの判断ですが、 それでも、自身でコードを書き直して公開するのが本当でしょう。 動けば良いだけのコードをオープンソースですか、違うでしょ
そうですよねぇ。 でも反面、せっかく既にあるコードまで自分で書き直さなきゃならないのか?とも思うのです。 しかもサンプルの書き方が一番スマートなのに、あえて別の書き方をするのも無意味に思えてなりません。 サンプルを利用して書くのは普通のことだと思いますが、皆どうしているのでしょうか。 とりあえず今回はクローズドでいきます。ありがとうございます。
374 :
デフォルトの名無しさん :2009/03/14(土) 21:54:26
>>370 もともとライセンス表記もせずパブリックドメイン同然で公開しているコードなら
コピペのままではなく、君がそのコードを理解して、作りなおせば問題ないだろ。
出所も明かす必要無し。
コードって作り直せないくらい長かったり何回だったりするの?
375 :
デフォルトの名無しさん :2009/03/14(土) 21:56:48
何回→難解
>>374 いや逆に、数十行程度のサンプルが多くて直しようがないんです。
そのまで洗練されているのでいじると無駄にこんがらがります。
変数名やカッコの書き方を変えるといったしみったれたことしかできず…。
モジュールを丸ごとじゃなくてサンプルコードか・・・ サンプルコードをかき集めた場合は、いろんな流儀で書かれているわけだから、自分の流儀に書き直したほうがメンテしやすくなるぞ。変数名や括弧を直すだけでも効果的だ。 そうすれば改良できるところが見えてくるぞ。
なるほど、書き方は自分流に統一した方がいいですね。ありがとうございます。 小さいところでも直していけばいいのですね。そういう方向でいってみます。
つーか、数十行程度ならサンプルを理解した上で、自分で書けばいいじゃん。 その程度だったら記憶を手繰りながら書けるべ。
その二度手間が無駄って話じゃねーの
Linuxなんかは、著作権回避のために書き直しとかしてるだろ?
コピペしただけでは解ったつもりで解ってないことがほとんど。自分の手でコードを書かないと理解できない。それは無駄ではない。
せっかく再利用を前提としてソースコードを書いても ほとんど再利用されることはない 参考にすることはあっても
それは再利用性の設計が不十分なんだよ。
再利用されることが無いのに再利用性の設計なんてそもそも不要だし
再利用なんて、幻想だよ。 結局、作り直して使ってるだろ
再利用性なんて、無駄なコード入れて行数増やすための方便になってるからなあ
まだ行数とか言ってんのかこの業界は
リファクタリングしたら負けかなと思ってる
わかりやすいコード記述を心掛け且つ 流用者が理解するのを諦める難解な操作を 程よく織り込むのがプロの仕事だ
チンケなプロだなぁ
自分で恰好良く書いたつもりが 「何それ?だっせーソース」 とか笑われたことがあるんだろ
libファイル配布
394 :
デフォルトの名無しさん :2009/03/16(月) 14:12:14
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める) 下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに セットするときに、現状のままだと余った桁に0が入ってしまいます。 データセット部 sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID); 余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
"%11d"
396 :
デフォルトの名無しさん :2009/03/16(月) 14:43:45
%11dで試しましたが0で埋められてしまいます。
397 :
デフォルトの名無しさん :2009/03/16(月) 14:46:47
失礼しました! 間違えて%11.11dで試しましたが、%11dだけにしたら できました。 ありがとうございました。
C++の書籍を買おうと思っているのですが、大体何円くらいなんでしょうか? 教えてください
そんくらいamazonで調べろよ
401 :
デフォルトの名無しさん :2009/03/17(火) 00:56:09
Cの書籍は何円ぐらいしたよ? だいたい相場はかわらんさ
402 :
デフォルトの名無しさん :2009/03/17(火) 01:00:51
>402 ただし、○冊セットの中の1冊のお値段、というオチが付くことも多そう。
C++のセット本なんかあったか? 見た事無いが
>>403 不味い本買ってんじゃねぇか?
週刊C++、創刊号は980円
それを言うなら、創刊号1800円で、二号から4500円だろ…
3号は9450円か?
まず創刊号の付録を教えてくれ
VC++EEとGCCの豪華セット
↑エラー起きた場所が分かりやすいように、AAに変換してしくれる機能搭載
411 :
403 :2009/03/17(火) 10:03:10
>404 あー、C++であったかどうかは分かんない。 でもVC++とかだと何シリーズか見かけた気がする。
毎週付録のモジュールをリンクしていくことでオリジナルIDEが完成
//////////////////////////////// a.h template<typename T> class test { public: test(); void _inc(T n); void _dec(T n); private: T m_n; }; //////////////////////////////// a.cpp #include "a.h" template<typename T> test<T>::test() : m_n(0) { } template<typename T> void test<T>::_inc(T n){ return m_n++; } template<typename T> void test<T>::_dec(T n){ return m_n--; } test<int> aaa;
//////////////////////////////// main.cpp extern test<int> aaa; #include <stdio.h> #include "a.h" void main(void){ aaa._dec(1); } externで宣言してるのにリンク時に未解決になります。 どこに誤りがあるのでしょうか?
テンプレートは実装もヘッダに入れろ そういうもんだと思っておけばいい 詳しく知りたければ export キーワードあたりで自分で調べな
>>415 ありがとうございます
無事解決しました
なんでexportなんてキーワードがワザワザ必要な文法になったの? なにもつけなくても実装が別ファイルにあるなら、それはそれで問題ないのじゃね?
この場合、明示的にインスタンス生成すれば済む気が。
C++0x に期待。
C++0a
>421 ありそうで困る
423 :
デフォルトの名無しさん :2009/03/17(火) 19:33:38
実装部分が別ファイルだと、コンパイル時にTが実際になんなのか分からないから、 実装部分は、コンパイルできなくない?リンク時に、改めてコンパイルし直すのか? exportって、どう言う仕組みで実現してるの?
16進にすると許容範囲内に見えるから怖い
>>423 > リンク時に、改めてコンパイルし直すのか?
そういうこと。
それやってというお願いするキーワードがexport。
まあg++とかVC++とかの有名どこが無視しているから、事実上死に設定だけど。
記述場所が関数内かグローバルか判るコンパイル定数無い? GCC 3 で
VS2008 C++について質問です。 構造体の配列に文字を格納したところ、デバッグでみると その場所+4つ先に格納されているのですがどういったことなのでしょうか。 以下は新規にプロジェクトを作成し、構造体とそれに代入しただけのソースの一部です。 struct TEST{ char testes[10]; }; struct TEST ttt; [STAThreadAttribute] int main(array<System::String ^> ^args) { ttt.testes[0]='A'; // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } 上記の例だと[0]にAが入るはずなのですが、ブレークポイントを 置いて、デバッグでみると[4]にAが入っているように見えます。 実際は[0]にAが入っているので、動作については問題なかったです。
まさかとは思うが、リリースビルドでデバッグしているとか、デバッグビルドに最適化を指定しているとか、 リビルドしてみてないとか言わないよな。
>>432 C++とC++/.CLIは名前が似てるだけで別言語。
>>434 でも質問の内容自体はVisual C++固有のことだから、
もし誘導するとしたら、Visual C++かVisual Studioスレがふさわしいと思う。
>>430 ありがとう。
でも、コンパイル"後"定数に成るみたいで微妙に目的と合致しませんでした。
BorlandC++Builderで以下のCプログラムを記述したところ 式の構文エラー(関数 main )と出ます。 #include<stdio.h> int main(void) { int english; printf("点数を入力してください\n"); scanf("%d",&english); printf("英語 %d点\n",english); if(english=>80) { printf("良くできました!"); } return 0; } if文を用いる場合は必ずelseでそれ以外の時の処理を書かなければならないのでしょうか?
>=
BASICでは>=でも=>でもOKだから、間違えちゃう人多いのかも。 他にも==を=と間違えたりべき乗に^を使っちゃったり。 BASICを習得してるといろいろ困るよねオマンコ
>>438 数学では
>=は
大なりイコール
って発音するじゃん。それで覚えれば大丈夫。
べき乗に^使ってしばらく悩む事あるな powとかすぐ出てこねーよw
/= を否定と間違えて使いそうになったりね
>>441-442 プログラムしばらくやってるやつは、悩むところじゃないだろ。
プログアム初心者は、悩む以前に分からない部分調べるか、誰かに聞くだろ。
>プログアム初心者は、悩む以前に分からない部分調べるか、誰かに聞くだろ。 そして>437にループ
PHPでは=>は矢印
>>440 数学に、そんな記号ない。縦に並べたのなら知ってる
じゃあやりなおし 数学では ≧は 大なりイコール って発音するじゃん。それで覚えれば大丈夫。
そもそも数学で子供の頃から慣れ親しんだ記号と 似ているようで違う表記をするために間違えるのだから、 それは意味ないのじゃね?
声に出して確認しろってことだろ
自分は>=と打つときに、心の中で「大なりイコール」と諳んじてるから まず間違えないな
俺もBASIC出身だから=>やったことあるわw
BASICやった後、Cに戻った直後は ==と書くべきところを=にして悩む 少しリハビリすると大丈夫だけど
というか、≧ を口に出して読んだ記憶がないな だから「大なりイコールって考えればわかりやすいでしょ」といわれても 頭の中でもそんな風に考えたことないし・・って感じ
>>453 は≧を大なりイコールって読むことを知らなかったってことか?
そりゃ問題だな。
greater or equal って読んでてごめんね
greater than or equal to と言うのが正しい
JISとかで読み方決まってないのかのう
gte
> gt < lt >= ge <= le == eq != ne
larger than or equal toって読んでた
普通は以上未満つかうだろ
以下<−>以上 未満<−>???
より小さい<−>より大きい
より大きい
超過
{○, ●}×{→、←}
○→) ●→]
同じ意味で使ってるなら間違い
どっちの推測も間違い
この議論に意味は無い
それ以外ネタが無い
年度末の一番忙しい時期に、仕事以外で頭を使いたくない
ここに言う意味が無い
おっとtestコマンドの悪口はそこまでだ。
『C++はCの完全な上位互換を失った』と見るのですが 具体的にC言語ファイルをそのまま.cppにしてエラーが起こる例ってどんなのあります? 例えばmain関数内でmain関数を使うとエラーになるようですが。(でも常用外だから普通は問題にならない) (1) C++ではエラーが出る (2) Cで稀に使われるが、C++で別の動きをする (想定外動作) 無理して作れば色々出てきそうですが・・・・
一番よく指摘されるのは void*をキャストする必要があるかどうかだろ。 char *p = malloc(...); が通るかどうか。
変数名にthrowとかusingとか使ってる場合など。 C++が作られていくときに、新たなキーワードの導入は常に強い反対があったと聞く。
複合リテラルとかは?
>>478 C99のことだと思うけど可変長配列とかC++に無い
あとintの省略もできないな
newとか多いよな。 oldとnewの両方を一時変数名にするとか。
>>478 extern のついてない const なグローバル変数を定義して
ほかのソースからextern宣言して見てるとき
でも俺としては例え過去のとかぶっても予約語はしっかり作って欲しい。 無理に予約語を増やさないようにするあまり、同じ予約語で少しずつ違った意味に使うの多くない? (例 static, template)
D言語でも使ってろよ
>>478 C++ の規格の付録 C にまとめられてるよ
char hoge[4] = "ABCD"; // これがエラーになるかどうか
構造体タグの名前空間が独立していない。 struct foo {int bar;} foo; // 例えばこれがエラーになる
>>489 char hoge[4] = "ABCD";
がC言語だとhoge[0]='A',hoge[1]='B',hoge[2]='C',hoge[3]='D'でC++だとエラーになるんだっけ?
char hoge[5] = "ABCD";
の場合はCでもC++でも同じhoge[0]='A',hoge[1]='B',hoge[2]='C',hoge[3]='D',hoge[4]='\0'だよね。
C++のお勧めの書籍教えてくだされ
Modern C++ Design 超お勧め。っていうか、一度読んでみると歯が全部抜け落ちる。
うむ、サンクスbb 早速見てくる
入門者向けの書籍教えてくだされ
入門者向けなら、C++ Coding Standards。 Effective C++とかExceptional C++の最新の要約が詰まってる。 わからない場所=自分の理解が足りていない場所 という今後の学習指針にもなる。 読むと腸内がすっきりする。
サンクス とても参考になります やはり値段が高いほうが内容も詰まってるんでしょうね
Effective C++ 原著第3版 amazonで感想を見てみたんですけど・・・・ 中級者以上を対象としているみたいな感じなのがありました 本当にこれで大丈夫でしょうか・・?
>>498 基本構文だとか継承だとかテンプレートの使い方だとか
そういう基礎的なのは習得してる人向けっていう程度
だが、そんなに難しくはないよ
コード付でかなり親切な説明がされてるし
Effective C++とかは中級者向けじゃないよ。 入門書の次に読まなければならないレベルの本だよ。 この本を読まずに「中級者」を名乗ること自体がおこがましいよ。 この本を読んだことのない人は 個人的なプログラムしか組む資格がないといってしまっていいくらいに 基本的な事柄について書かれた本だよ。
Effective C++か。わかるわかる。 でも初心者レベルではないと思う。 「中級者になりたい初心者なら必読」という意味では初心者向けだな。 入門者の場合は意味不明だと思うが、初心者なら説明が丁寧でたとえがすばらしく分かりやすいからオススメ。
10年間Cを書いてきたシニアエンジニアが独力で半年間C++を検討した結果が全て、 EffectiveC++に(より洗練された形で)書かれていたと言っていた。 要は、EffectiveC++を最初から読んでいれば半年間無駄にしなかったのにね、と。
Cのファイルアクセス程度までしか勉強していないようなヤツでもわかるものかしらね
中級者なら知ってて当然のことが書いてあるだけで、 読まなくても別に中級者になれるけどな
506 :
503 :2009/03/24(火) 21:59:39
>>504 >Cのファイルアクセス程度までしか勉強していないようなヤツでもわかるものかしら
C++の入門者だから無理じゃないかな?
クラスって何よ?継承って何だよ?テンプレートとは???
っていう感じになっちゃってまともに読み進められないと思う。
>>505 確かにそう言うことになるな。
別に全員が読んでるわけじゃないだろうし。
Effective C++はC++を真面目にやろうと思ったら必読書。 読んで理解できなければ、理解できるようになってからまた読めばいい。 よって常にお薦め。 いつまでも理解できないならそいつはC++に向いてない。
Effective C++は中級者なら知ってて当然の知識集だから、 この本自体は中級者向けじゃないよ。 この本に書かれている知識を習得していない人は 中級者じゃなくて単なるカスプログラマだから。 何度も書くけど、入門書を読んだあとに読むべき本だよ。
口悪いの多いな。
件のEffective C++自体、結構口の悪い文章だから。
2chだからだろ。 日常生活なら滅多に使わない侮蔑を含む日本語が飛び交う場所だからな。 むしろこのスレはまだマシな方じゃね?
512 :
504 :2009/03/25(水) 00:36:26
>>506 クラスとか継承はJavaのさわり程度ならやったので意味だけならなんとか
Effective C++はC++特有の仕様に触れることもあるから 少なくとも初心者向けのC++解説本は読んでることが前提。 ちゅか、Effective C++を読めば、C++のプログラムに Cのテクニックはあまり(ほとんど?)役に立たないことがわかる。 Cの知識は無用ともいえる。
>>513 Cで培った危険を予知する感覚というか知識は必要じゃね?
まあC++のソースを書いていてprintfなんて書こうものならもうそいつのソースは信用できないな。
515 :
デフォルトの名無しさん :2009/03/25(水) 00:46:23
>まあC++のソースを書いていてprintfなんて書こうものならもうそいつのソースは信用できないな。 なんてことを言う奴は信用しないことにしている。
coutなんか使わなくてもprintfで十分足る(キリッ
printfは型安全を無効化するっていうことを理解して使う分には問題ないんでないの? サッターは「安全装置のない車を運転するほうが楽なのといっしょだ」みたいな主旨のことを書いてた。
fgets()でstd::stringに読み込めないのは不便だな
シフト演算子オーバーライドして返り値への代入を繰り返す「どうだ凄いだろ」的な構文でなければ C++内の printf は早々に駆除されてたと思う。 初めて見たとき もうちょっとマトモナやり方があるだろう?と感じた。
でも吐き出すコードはそこそこまともじゃない?
CにないC++の機能 たとえばClassとかSTLとかは使わにゃ損々なんだが iostream系のようにCにもある機能は 別に置き換えなきゃならんわけじゃないし
まあiostreamは単なる多重継承の技術的デモンストレーションだという 極論まであるし遅いしだな 時と場合に応じて使い分ければ良い
可変引数のもたらす潜在的なセキュリティホールがむにゃむにゃ
>>524 ((std::cout << hoge) << moge)
代入じゃねえな。
他は
>>519 に同意。
特にシフト演算子のオーバーライドとか、やっちゃ駄目な部類。
初期のC++には、C++のライブラリは、ほとんどiostreamしか付いて無かった (stringや複素数はあった)。だからC++の基本機能や、言語概念の説明といった役割が大きかった。 その後、多重継承が追加されて、書式付き入力ストリームと出力ストリームを結合させるなど、 仮想基底クラスの用法を示している。そういう歴史的経緯が判らないと、 微妙に感じるかも知れないけど、自分定義の型拡張やコンパイル時のチェックも効くし、 長く使ってると愛着も湧いたりする。better Cとして使ってる人には不評みたいね。 カレー南蛮そばが来ないので、長文してしまった。
不評っつーか、わざわざ使うまでもない
わざわざも何も、それが標準的な出力手段なんだが?
オーバーライドとオーバーロード混ざってる悪い子はいねがー?
最初から可変長テンプレートを入れてれば、 std::cout(hoge, fuga, std::endl); とか書けたのにな。 だが、D言語では Stdout(hoge)(fuga).newline;
オレオレフィルタとか書くときはboost::iostreamsを使う
>>526 じゃあもう要らないですね。obsolete にしましょ。
OKです
いくら不要になったといえども 作ってしまった過去の資産()があるから削っちゃだめだろ iostream
負債というべき
536 :
デフォルトの名無しさん :2009/03/25(水) 20:09:12
浮上
ぶっちゃけ、iostreamは、C++の入門書で使われている以外で 使われてるのを見たことない。
C++ Coding Standards 第98項 「printf系の脆弱性は、本書執筆時点でも尚、深刻なセキュリティ問題である。」 (中略) 「vararg以外の方法で可変引数をサポートする型安全なライブラリを利用しよう。 例えば、[Boost]のformatライブラリがある。」 Boost C++ Libraries 第2版 p.69 「もしもプログラマが間違った書式指定をしてしまったら(中略)、 printf関数は(中略)、もう何がおきるかわからないトワイライトゾーンへ突入してしまいます」 などなど。
>>530 俺もDさわってみて、何でC++には可変長引数が配列で取れないのか非常に不思議になった。
すごい便利なんだよな。D1をバックポートしてほしいぞ。
型安全を無視するつもりなら、最初からC++を使う意味ないんだよ。 別の言語を使ったほうがいい。 目的ごとにぴったりあう言語というものは違うのだから。
>>538 間違ったプログラムであの世へ行くのはprintfに限らない
間違わなければいいだけ
>>541 君にはデスマーチとかアジャイルプラクティスとかを読む権利をあげますw
>>541 みたいな人はC++使う価値ないんだって。
C++は厄介ごとはコンパイラにまかすという方針なんだから。
プログラマがすべてを制御できる自身があるなら
Cの方がよっぽど単純で軽快だ。
C++を選択することが最初から間違っている。
Effective C++にも「FORTRANかよっ!」って書いてあるな。 自分はメイヤーズ先生やサッター先生の言うことに従うわ。 この板にそれ以上の能力の人間が来ているとはとても思えないから。
printfで出会った不具合といえば、 クラスが内部で規定してる構造体に型オーバーロードしたメソッド書いて、クラスの返り値としてその構造体をprintfに食わせたら、 オーバーロードが働かなくて構造体そのものを食いやがった事がある。アドレスぽいものが表示されんの。 表示系だから良かったけどいやなバグだった。 コンパイラはVC9EE。
printf系関数はtypedefされた型には無力なのがダメだね
Boost.Spirit.Karma.formatを使おうぜ
入出力先と書式化の癒着関係を美しく分離する術を思いつけなかった 可変長テンプレートマンセー君レベルが当時の最先端だったって事か
>>543 >
>>541 みたいな人はC++使う価値ないんだって。
間違いを犯す莫迦にこそ価値がないのでは?
>C++は厄介ごとはコンパイラにまかすという方針なんだから。
いいえ。
コンパイラが余計なことをしないか、常に心配しながら
コードを書き連ねることを
プログラマに強いる方針です。
間違ったプログラムを出来るだけコンパイルエラーにしようってのがC++の方向性なんじゃないの? プログラムの知的能力に関わらず、タイプミス等の軽微なミスは起こりうるものだと思うけど。
552 :
551 :2009/03/26(木) 14:37:29
プログラムの→プログラマーの
そうだよ。間違いを犯しやすい人ほど高級言語が必要になる。 コンピュータを完全にコントロールできる人間は高級言語に頼る必要はない。 高級言語は人間のミスを吸収するために余計なコードを山ほど作るからね。 C++はCよりも遅いしコードも大きいし規則も山ほどある。 その規則の多くはコードを早くしたり小さくしたりするためのものじゃない。 単に間違いをコンパイラが見つけやすくするため。 間違いを犯さないプログラマには無用のものばかり。
>>その規則の多くはコードを早くしたり小さくしたりするためのものじゃない。 >>単に間違いをコンパイラが見つけやすくするため。 そうか? コンパイラにとって正しいけど、プログラマの意図通りにならないことは C++の方が多いのでは?
えーと、どこから突っ込めばいいの?C++が目指したのは基本的に効率だよ。
それは速度とコーディング効率で、プログラマの能力と方針にあわせて、
どちら側を重視する事も出来る。充分に熟練していれば、他の言語よりも高い
バランスで、両立する事も可能。それは全ての言語の、全てのメリットを上回る
意味では無いけどね。現実には機能を散漫に付けすぎて、高いバランスどころの
騒ぎじゃないけど、目標としてはそんなところ。
>>554 どうも設計者が平均的プログラマの能力等を、考慮に入れなかったのでは無いかと予想。
自分で設計しといて、ベテランしか使えねーとか言ってるしねぇ。
「間違いを犯す莫迦にこそ価値がない」 という仮定が間違ってるんだよ。 なぜなら、間違いを犯す莫迦しかいないから。 間違いを犯さないプログラマなんて一人も存在しないから。
「オレの嗜好通りにソースを書かないやつはクズ」
C++標準化委員会に名前を列ねている連中だってbugを出すんだから、 ましてや昼間に書き込んでるネラーなんてなあ?w
>>556 全員一律に同じレベルの莫迦だということにしないと
自分を保てないというのなら
そういうことにしてもよい。
つまり、自分は間違いを犯さないプログラマであるといいたいわけね。 ちなみに、99点も0点もどちらも「間違いを犯す」ことに違いないよ。 100点満点だけが「間違いを犯さない」といえる。 さぁ、ベン図を描いて確認だ!w
>>559 は「莫迦」の程度の話に摩り替えてるな
「間違いを犯すか否か」の話なんだが。
まぁいいか。論理的精密さを求めるような話でもない。
所詮は小さなプライドにしがみついた煽りあいだ。
自分ひとりだけで完結する規模のものしかやらないのなら 将来メンテすることもないような使い捨てのものしか書かないならそれでいいじゃん
だな。それならいくら自分がバカで間違いだらけでも問題ない。
アンドリューハントによると、自分のプログラムにバグがないと思っているときには、バグは見つけられない。 言い換えれば、自分は間違いを犯さないと考えているプログラマは自分のプログラムからバグを見出せない。
このスレもム板化してきたな…技術の話しろよ、カスども。
>>561 すりかえてなんかいねぇよ。
程度問題だろっつってんだよ。
>>556 の「間違いを犯す莫迦」の前に「ひとつでも」てのが付くなら、
そんな頭のおかしい「仮定」なんざ誰がしてるってんだ。
いや、頭がおかしいのはあなたですよ^^
いかに「あいまいな」仕様書が危険か、これでわかりましたね。 では、次の話題どうぞ。
571 :
デフォルトの名無しさん :2009/03/27(金) 22:40:22
C++が危険なコーディングには警告を出すという方針なのだとしたら printfを使ってもC++コンパイラは全く警告を出さないからprintfを使うことはC++的に全く問題ないということだよ。
警告を出すかどうかはC++の仕様で定められてはいない。コンパイラの実装者の考え次第だ。 実際、Stroustrupはいろんなことについて「これに警告を出さないコンパイラが多いのはがっかりだ」とか言ってるな。 D&Eに書いてある。具体的な事例はあんまり覚えてないが。
574 :
デフォルトの名無しさん :2009/03/27(金) 23:10:50
C言語は上から順番に処理されるんだよね。 そうすると、割り込むみたいなことは許されないんだよね? 例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理? for( ) ・・・・・・・・・ if(getchar 見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、 その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
つ _kbhit()
577 :
574 :2009/03/27(金) 23:29:12
初心者板ってあるんですね。行って来ますすいませんでした。
UWSCというフリーソフトに [CHKIMG]という関数があります。 画像ファイルと一致する画像を発見すると、その座標を変数に格納するというものです。 これと同じ機能をC言語で実装するにはどのような関数を使えば良いのでしょうか?
>>578 Win32API に画面をキャプチャするのがあるから
それで画面を取り込んで指定画像と比較すればいいんじゃないかな
すまん質問させてくれ 今C++のtemplateで新しく設計・作成したクラスがあるんだが main.cpp temp.h temp.cpp のようにソースを分けたいと思ってる でも、templateだから.objにしてしまうとビルドエラーが発生 何とか分けたいのだが、良い方法ないでしょうか?
蛇足だと思うが、Templateはコンパイル時に計算されてしまうのでobjになった時点で定数になっている。 exportっていう仕様があるにはあるけど、各社ともに実装できなくて放置状態だ。いや、一個だけあったかもしれんが。。。 VC6でやってた記憶があるけど、もう忘れちゃったなぁ。 VC9使ってるが、ヘッダにベタ書きしてる。
>Templateはコンパイル時に計算されてしまうのでobjになった時点で定数になっている。 さっぱりワケが解ってないらしい。 (なんだ「計算」だの「定数」だのって)
そりゃ君の経験不足
584 :
581 :2009/03/30(月) 17:33:07
CTFE(だっけ)が何で高速っていわれるかしってんの?しらないの??魔法じゃないのよ。
多分
>>580 が望んでるのはジェネリックスのほうだと思う。
CTFEって何
>#include "TList.cpp" …分ける意味ねぇな、とか思わないのが不思議。
>>581 俺もヘッダにべた書きしてた事あるんだが
ヘッダに書くなんてありえないとか言われて、それ以来分けてる
template classを使ったのは速度を犠牲にしてでも、汎用性+αの目的の為
>>587 ありがとう。これは知らなかったからまた新しく知識が増えた
只、ヘッダ以外をインクルード…まあヘッダにベタ書きしたと思えばいいかな…
暫くはこれを使ってみます
レスくれた方々本当に有難うございました
>ヘッダに書くなんてありえないとか言われて、 「ありえねぇよな、STL」と言い返せ。
printfは素晴らしいよね。 coutより使いやすい
でもたとえば template<> hoge< int >( パラメータリスト ) みたいなテンプレート特化がしぽぽファイルに書き込まれていると これはテンプラータ関数ではなく一般の関数と同じ扱いだから 定義を頭ファイルに書き込めないのであって(淫乱は別として) 多重定義アラーがでるよって思うな。あっさらーむ。
あぁ、そうそう。ただテンプレート特化の注意点についてだけ言及しても
解決策はどうしたらいいのってことになるので、つまりそこはグーグルだよ。おにいさん。
以下の「-inl.hファイル」という項が参考になる。
http://www.textdrop.net/google-styleguide-ja/cppguide.xml 要するに、もう一個、てんぷらクラス/関数専用のサブのヘッダファイルを用意して
そこにてんぷらの実装コードだけを分離しつつ、
ヘッダファイルでそのサブヘッダファイルをインクルードしたらどうなの?って話。
これなら本来実装を書き込むしびびんファイルをいんこるどするよりも気持ち的に安全。
今の話題がよく分からないんだが。
特に理解出来ないのが#include "TList.cpp"とかやってるサンプルが出てきてからなのだが、
この会話はレベルが高い話なのか低い話なのか?
(このレベルってのはハードウェアに近いかどうかって意味じゃなくてね。)
>>580 が悩んでるのはExplicit instantiationで解決する類の話じゃなくて?
ヘッダに置きたくない理由がわからんのにレベルもくそもあるかいな
かます。>゚))))))<
グローバル変数って他のファイルからexternで参照できるよね。 グローバル変数にstaticを付けると、 他のファイルからexternで参照できなくなるの?
ぐぐれかす
603 :
600 :2009/03/31(火) 20:58:08
>>601 とっっくにググってあるよ。
ググった結果、
>>600 のように解釈したんだ。
何の実りもないレスすんなカス。
>>602 納得できた。
ありがとう。
ちょっと試せば1分で判るような質問も、何の実りもないけどね
>>604 動いたかどうかじゃなくて正式な仕様として聞きたかったとか?
だいたい2chで実りを求める方がおかしいよーな。
まあどうでも良いけど、これが火種になってスレが汚れないことを願う。
>>606 2chに一生をかけてる人が「2chで実りを求める方がおかしい」発言にキレた構図。
>>608 って言われてるのか。かわいそうだがお似合いなお方w
,.、 .,r.、 ,! ヽ ,:' ゙;. ! ゙, | } ゙; i_i ,/ ,r' `ヽ、 | ,.、 ,r.、 ,i" _, ._ ゙; うーん・・・・ | ,! ヽ,:' ゙;. !. ・ ・ ,! | ! ,! } ヽ、 x _,r'' 僕には何も言えない |二゙; i二二二(⌒ノ"''`''''''''''''"´`ヽ. | ,r' `ヽ、 ´ヾ、 l l ,i" _, _ ゙; ! i___| !. ・ ・,! | t,ノ |ゝ_ x _::' !、、、、、、、、、、! |,/"`''''''''''''''"´';, | | | (,;! !) | | | |゙''::r--、::--;r' |____|_____| |―゙'ー-‐゙ー-゙'―┐ (,,,__(,,,____)
普通の頭であれば検索だけで理解できるからな 検索先が信じられずに2ちゃんのレスのほうを信じるのもどうかと思うし
ここは検索のスレではありません。 検索に関する会話はご遠慮下さい。
staticをつけると内部的な名前が変わる
かどうかは知ったこっちゃないわな。
617 :
デフォルトの名無しさん :2009/04/01(水) 16:33:56
バイナリデータとテキストデータを結合してchar型配列に格納したいです。 例えば char STR[256] = {0}; unsigned long Value_A = 0x01234567; unsigned long Value_B = 0x89ABCDEF; char Str_A[] = "sample1"; char Str_B[] = "SAMPLE2"; というデータがあったとして、配列STRに以下のようにデータを格納するコードを教えて下さい。 < binary > < text > 0x01234567 0x89ABCDEF sample1|SAMPLE2 ちなみに、バイナリデータはテキストにはせず、BigEndianで格納したいです。 あとテキストには'|'文字を入れて区切りたいです。 よろしくお願いします。
#include <ctype.h>
#include <stdio.h>
#define swap(ul) ((ul)<<24)|(((ul)&0xFF00)<<8)|(((ul)&0xFF0000)
>>8 )|((ul)
>>24 )
void main()
{
unsigned char STR[256] = {0};
unsigned long Value_A = 0x01234567;
unsigned long Value_B = 0x89ABCDEF;
char Str_A[] = "sample1";
char Str_B[] = "SAMPLE2";
unsigned long ul;
int i;
ul = swap(Value_A);
memcpy(STR, &ul, 4);
ul = swap(Value_B);
memcpy(STR + 4, &ul, 4);
strcpy(STR + 8, Str_A);
strcat(STR + 8, "|");
strcat(STR + 8, Str_B);
for (i = 0; i < 8 || STR[i]; i++) {
printf("%d:%02X[%c] ", i, STR[i], isprint(STR[i]) ? STR[i] : '.');
}
}
0:01[.] 1:23[#] 2:45[E] 3:67[g] 4:89[.] 5:AB[.] 6:CD[.] 7:EF[.] 8:73[s] 9:61[a]
10:6D[m] 11:70[p] 12:6C[l] 13:65[e] 14:31[1] 15:7C[|] 16:53[S] 17:41[A] 18:4D[M]
19:50[P] 20:4C[L] 21:45[E] 22:32[2]
char * push_STR(char* d,char* e,char* s,int ln){ int i = 0; while(d < e && i < ln){*d++ = *s++; ++i} return d; } char *p = STR, *end = STR + sizeof(STR); if(p=push_STR(p,end,&Value_A,sizeof(Value_A)) >= e) abort(); if(p=push_STR(p,end,&Value_B,sizeof(Value_B)) >= e) abort(); if(p=push_STR(p,end,&Str_A,sizeof(Str_A)) >= e) abort(); if(p=push_STR(p,end,&Str_B,sizeof(Str_B)) >= e) abort();
620 :
デフォルトの名無しさん :2009/04/01(水) 17:50:34
もしかしたら上の方のコードが途中かもしれませんが よろしくおねがいします。 C言語の入門ページの動的配列などの部分を読んで mallocやreallocでメモリの再確保などができる事はわかりました。 しかし、結果的にははじめに変数に入力をうけてその結果にあわせて 配列の量を変更する事はできません。 例えば文字列の入力を受け付けるプログラムでたとえば書籍の タイトルを受け取る処理なのでせいぜいこのくらいだろうと見積もって 配列の大きさをとっていたとしてユーザーが予定以上の 非常に長いタイトルの書籍を入力したりしても残りの部分は切り捨てられるように なってしまうと思います。これを回避する方法は無いでしょうか?
ない、と言ってしまうのは簡単だが もし上限がなかったらどうなるかを考えてみよう
1文字ずつ受け取って、それらをリンクリストでつないでいくというのはどうだろう? メモリが許す限りどんどん大きくできるぞ。しごいね!
Stringクラスを使う
cstringでぐぐったら紐なしエロパンツサイトがヒットした
キー入力を都度処理してグルグル回せば出来ない事はないけど パイプ通しての洪水テキストや 例えばカナ漢字変換が驚くほど丈夫で数メガバイトの変換済文字列をイッキに送り込んでくるような状況 には対処しきれんよな
ありがとう御座います。 前もって入力を受け付けるときに文字数宣言が有る事を書いておきたいと思います。
そこでstream IOですよ
結局メモリ+HDD(外部記憶装置)以上のデータは扱えないので扱えるデータには制限がある
ネットがあるじゃないか
630 :
デフォルトの名無しさん :2009/04/01(水) 19:51:28
もうデバッグに一日以上費やしても理由がわからなかったので、ここで質問させてもらいます。 本当に理由が解明できなくてマジで困ってます…。 for (i=0; i < (Num_Points-1); i++) { distance_x = (gsd[i+1].x-cur_xpos) * (gsd[i+1].x-cur_xpos); distance_y = (gsd[i+1].y-cur_ypos) * (gsd[i+1].y-cur_ypos); distance = sqrt(distance_x + distance_y); } for (i=0; i < (Num_Points-1); i++) { a0 = atan2(cur_ypos-gsd[i].y, cur_xpos-gsd[i].x)-atan2(gsd[i+1].y-gsd[i].y, gsd[i+1].x-gsd[i].x); a1 = atan2(gsd[i+1].y-cur_ypos, gsd[i+1].x-cur_xpos)-atan2(gsd[i+1].y-gsd[i].y, gsd[i+1].x-gsd[i].x); } コンパイルエラーは出ないのですが、実行した際に途中で止まってしまいます。 何回か試したところ、上のループか下のループどちらか一方しか書いてない時は動きます。
一日以上費やしたってデバッガ使った?
どっか別のところでスタック破壊してんじゃねーの?
633 :
デフォルトの名無しさん :2009/04/01(水) 20:15:52
使いましたが、デバッガではよくわかりませんでした。 どちらのループも単体でしかコードに存在しない時は動くので、 printfで結果表示した場合、ちゃんと計算結果が出ます。 しかし、両方ともコードに書くと、なぜか止まってしまうんです。
>>633 for文の中でiを表示したらどこまで進むの?
本当に
>>630 の通りに書いてあるならループにする意味がねーよw
>>634 どちらかのループ単体のみの実行なら、Num_Points-2まで進んでいます。
なので、配列の範囲外から数を呼び出してるということはないみたいです。
>>635 エイプリル・フールは午前中までだってのにな
ソースアップすれば調べてもいいよ
>>635 distance, a0, a1 がクラスのインスタンスで、
= がオーバーロードされてるかもよ。
本人かデバッガ使って解らないものを、他人が不定な変数の多い 部分的ソースだけ見せられて判るとは思えない。
641 :
デフォルトの名無しさん :2009/04/02(木) 00:04:08
>>636 上のループで1からNum_Points-2まで進んで
下のループでも1からNum_Points-2まで進んだってこと?
それなら処理終わってるよね?
せっかく解決しようと聞いているんだから省略しないできっちり説明してほしいな。
>>641 上のループ、もしくは下のループどちらかしか書いてなければ正常に動きます。
だから、printfでiがどこまで進んでいるかも確認して、Num_Points-2まで進んでました。
このループを両方コードに書いてプログラム実行すると止まって、
printfで表示できてたものも表示されなくなってしまいます。
>>642 printfを具体的にどこにどのように入れてるのか知らないが、つまりループを両方書くと
実行時に最初のループに入ってすらいないということか?
もし可能であれば、実際にその問題が生じるような最小限のコード全部を書いてほしい。
つまり、俺らがそのままコピペして自分でコンパイルしてみると、同じ問題に遭遇できるようなコードってことね。
それが出来れば問題解決のための労力は少なくて済む。
まあ実際にはかなり長いコードになっちゃうのかもしれないけど。
あと、君が使ってるコンパイラに特有のトラブルだったりすると、助言できないかもしれない。
644 :
デフォルトの名無しさん :2009/04/02(木) 00:54:16
>>634 これ↓実行したら何が表示されるの?
Num_Points=1
fprintf(stderr, "start(1) Num_Points=%d\n", Num_Points);
for (i=0; i < (Num_Points-1); i++)
{
fprintf(stderr, "(1)[i=%d][Num_Points=%d]\n", i, Num_Points);
distance_x = (gsd[i+1].x-cur_xpos) * (gsd[i+1].x-cur_xpos);
distance_y = (gsd[i+1].y-cur_ypos) * (gsd[i+1].y-cur_ypos);
distance = sqrt(distance_x + distance_y);
}
fprintf(stderr, "end(1) Num_Points=%d\n", Num_Points);
fprintf(stderr, "start(2) Num_Points=%d\n", Num_Points);
for (i=0; i < (Num_Points-1); i++)
{
fprintf(stderr, "(2)[i=%d][Num_Points=%d]\n", i, Num_Points);
a0 = atan2(cur_ypos-gsd[i].y, cur_xpos-gsd[i].x)-atan2(gsd[i+1].y-gsd[i].y, gsd[i+1].x-gsd[i].x);
a1 = atan2(gsd[i+1].y-cur_ypos, gsd[i+1].x-cur_xpos)-atan2(gsd[i+1].y-gsd[i].y, gsd[i+1].x-gsd[i].x);
}
fprintf(stderr, "end(2) Num_Points=%d\n", Num_Points);
>>643 printfはどこに入れても実行されないです。
このループを二つ入れると、そのvoid関数の部分のprintfは全てダメになります。
結構変数値を他の部分から呼び出してて、
その部分に関しては別の人がやった部分なので最小限のコードを作るにも少々時間かかると思います。
他にも少しやらなくてはいけないことがあるので、もしそれができたら戻ってきます。
ここまで、あまり上手く説明できなくて御迷惑おかけしました。
レス下さった方々、ありがとうございます。
最小限のコードなんて作らなくていい。 とりあえず>>644をコピペすればいいだけだろ。
無駄骨
ステップ実行して、どこで爆死してるか見つけないとダメじゃね? どっかでメモリ、ぶっ壊してるのだろ、きっと
649 :
630 :2009/04/02(木) 01:30:25
>>644 何も表示されません…。自分が両方のループ入れた時の症状と同じです。
もう4月馬鹿は過ぎているんだから釣りは勘弁してくれ。
651 :
デフォルトの名無しさん :2009/04/02(木) 06:40:26
#include<stdio.h> int sum(int x,int y){ return x+y; } int max(int x,int y){ return x*200+y*300; } int main(void){ int x,y,i,am,pm; char cl; for(i=0;i<9;i++){ scanf("%s %d %d",&cl,&x,&y); am=sum(x,y); pm=max(x,y); printf("%s %d %d\n",cl,am,pm); } return 0; } と書いて実行するとき、%sの読み込みにc1と入れても 出力の%sではcだけとしか表示されないんです。 誰かこの謎の答えを教えてください。
>>651 char cl; → char cl[5000];
653 :
デフォルトの名無しさん :2009/04/02(木) 07:03:43
>>652 さん
ありがとうございます!!ありがとうございます!!
何でこんなことにも気づかなかったんでしょ(;'ω`)アホだ自分…
>>633 「デバッガでは良く分からない」んじゃあない
お前がデバッガを分かってないだけ
>>651 char cl[100];
if (scanf("%99s%d%d", cl, & x, & y) != 3) fprintf(stderr, "Illegal input.\n);
656 :
デフォルトの名無しさん :2009/04/02(木) 08:14:44
ここからユーザ定義関数で処理しなくてはならないんだが、 コレ以上の行動は俺の頭ではむりです…誰か助けて下さいorz #include<stdio.h> #define ROW 8 /*縦*/ #define COL 8 /*横*/ int main(void){ int i,j; int matrix[ROW][COL] ={ {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','#','#','#','#','#','#','#'}}; for(j=0;j<COL;j++){ for(i=ROW-1;i>=0;i--){ printf("%2c ",matrix[i][j]);} printf("\n");} printf("\n"); for(i=ROW-1;i>=0;i--){ for(j=COL-1;j>=0;j--){ printf("%2c ",matrix[i][j]);} printf("\n");} printf("\n"); for(j=COL-1;j>=0;j--){ for(i=0;i<ROW;i++){ printf("%2c ",matrix[i][j]);} printf("\n");} return 0; }
#include<stdio.h> #define ROW 8 /*縦*/ #define COL 8 /*横*/ void disp(int (*matrix)[ROW][COL], int revrow, int revcol) { int i,j,row,col; for (j = 0; j < COL; j++) { col = (revcol) ? COL - 1 - j : j; for (i = 0; i < ROW; i++) { row = (revrow) ? ROW - 1 - i : i; printf("%c ", (*matrix)[row][col]); } printf("\n"); } } int main(void){ int matrix[ROW][COL] ={ {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','*','*','*','*','*','*','*'}, {'#','#','#','#','#','#','#','#'}}; disp(&matrix, 1, 0); printf("\n"); disp(&matrix, 1, 1); printf("\n"); disp(&matrix, 0, 1); return 0; }
c初心者です。 以下の二つの関数はまったく同じように動きますか? int f1(int a) { if(a==3){ return 1;}; if(a>1){ return 2;}; return 3; } int f2(int a) { if (a==3) { return 1;} else if (a>1) { return 2;} else {return 3;}; }
実行してみればいいじゃん
春休みが終わりそうで、カツオ状態だから、このありさま?
あるよ
665 :
デフォルトの名無しさん :2009/04/02(木) 14:33:24
LinuxでC++で書いたクラスをまとめて、sharedライブラリ作ろうとおもってるんですが ヘッダファイルは、まとめたり、きれいにできませんか? 公開したいクラスは1つだけ(class A)です。実装はライブラリファイルひとつになります。 内部でたくさんのクラスを使ってるんですがこれらは外からは直接 使いません。 で、class Aのメンバにたくさんの他のクラスのオブジェクトがあったり、使ったり しているので、 class AのヘッダファイルA.hには内部のクラスたちを定義した たくさんの *.h がincludeされてます。 ライブラリを他人につかってもらうとき、ライブラリ1つと、ヘッダたっくさん になっちゃうんです。ひとつのヘッダファイルにまとめる方法ないです?
>>665 ひつの手だが、privateメンバにはダミー宣言を使う方法がある
例えば下の例(ヘッダ)で
LIBをビルドする時だけ _LIB_MAIN_ を定義する
こうすれば、LIB利用者には aaa.h は渡さなくて良い
#ifdef _LIB_MAIN_
#include "aaa.h"
aaa *a;
#else
void *a;
#endif
それをいかに容量上限を感じさせないようにプログラムさすのがプログラマの役割だろ、常識的に考えて
誤爆
669 :
665 :2009/04/02(木) 17:33:37
>> 666 なるほど。いただき。 ポインタじゃなきゃだめ?サイズが合えばよい?
どんなクラスなのか分からんが、そもそもポインタ型にするなら、ヘッダからヘッダをインクルードする必要はないよ。 前方宣言だけで済む。
672 :
665 :2009/04/02(木) 18:04:13
>>670 そか。
全部ポインタにして、前方宣言すればすればよいのね。
ポインタじゃないとやっぱりむり?
>>672 参照でも可能だけど、まあ同じ話だね。
普通の変数の形で持つなら、その変数の型の完全な定義が必要になる。ポインタや参照なら不要。
Aのポインタだけメンバに持つ公開用のクラスでも作ればいいんじゃ まぁ要するにpimplなんだが
pthreads関数を使用してその環境で一番処理が早いスレッド数に自動的にあわせるプログラムを作っているのですが、 すべてのスレッド内の一秒間にループした回数の和を取得することができません。 どうすればうまくできるでしょうか。
一番簡単なのはグローバル変数に格納する事。 2番目はクラスにしてメソッドで各スレッド内で足したものを返す。かなぁ??
>>675 pthread_joinで戻り値(第2引数)を合計すればいい。
#include<stdio.h> int main(void){ int a,s,i; int box[10]={0}; scanf("%d",&s); while(s!=0){ for(i=0;i<s;i++){ scanf("%d",&a); if(a<=9) box[0]+=1; else if(9<=a&&a<20) box[1]+=1; else if(29<a&&a<40) box[3]+=1; else if(19<a&&a<30) box[2]+=1; else if(39<a&&a<50) box[4]+=1; else if(49<a&&a<60) box[5]+=1; else box[6]+=1; } } printf("%d\n",box[0]); printf("%d\n",box[1]); printf("%d\n",box[2]); printf("%d\n",box[3]); printf("%d\n",box[4]); printf("%d\n",box[5]); printf("%d\n",box[6]); } return 0; } 上のソースをユーザ定義関数を使って書きたいときはどうしたらいいのでしょう?
mainの中身をそっくり自分の関数に移動して、mainでそいつを呼ぶ。
#include<stdio.h> int hantei(int i) { if (i < 0) { return 0; } if (60 <= i) { return 6; } return i / 10; } int main(void){ int a,s,i; int box[10]={0}; scanf("%d",&s); for(i=0;i<s;i++){ scanf("%d",&a); box[hantei(a)]++; } for(i=0;i<=6;i++){ printf("%d %d\n",i,box[i]); } return 0; }
他の板でこんな言葉を叩きつけられました プログラマになりたくてなるんじゃないなってしまう者がプログラマ 貧弱一般人がプログラマになろうとしても人工的に淘汰されるのが目に見えている この言葉にはすごく説得力があるような気がします やはり、プログラマになろうとしている僕に、プログラマなんて無理なんでしょうか?
向き不向きは有るかもしれないが、やりたい人は誰でもなれる。 向かない人はやりたいと思わない。
ブロントネタに真剣にならなくても
>>682 ありがとうございます。
頑張ってみようと思います
0b00000001とかしたらサフィックスが無効ですってエラーでるんだけど、何で?
サフィックスが無効だからです。
プログラマはがんばっちゃう人はダメなんだよ。 プログラマの三つの美徳 怠惰であれ、短気であれ、コーマン大好きであれ 海軍式の努力と根性がまかり通っている職場や そのような空気を当たり前とみなすSE/PGによるプロジェクトは 漏れなくデスマーチになる。
>>685 2進リテラルは無い。
8進数なのにbが入ってて不正じゃないかい?
0bはたしかgcc独自拡張で存在したと思う。 使わないほうが無難だな。
691 :
デフォルトの名無しさん :2009/04/04(土) 12:02:02
>>681 プログラマーに限った話じゃない。
全ての職業に言えること。
まぁ、私はプログラミングなら飯が食えると判断したからプログラマになったけどな。
すいません。 ポインタを使って、配列のそれぞれの要素に文字列を入れたんですけども、 こういう場合の配列のアドレスって一体どういう規則で並んでいるんでしょうか? #include <stdio.h> int main() { char test[] = "1234"; char *words[] = {"one","two","three","four"}; printf("%p %p %p %p\n",test[0],test[1],test[2],test[3]); printf("%x %x %x %x\n",words[0],words[1],words[2],words[3]); }
雑魚ぷろぐらまあは手配師(人材派遣会社)に喰わせてやる(=喰われてやる)のが仕事だかんなあ
>>693 %xではなく、%pを使うべきじゃないだろか。
で、質問は"one", "two", "three", "four"がどう配置されているかってこと?
だとしたら答えは「コンパイラのご機嫌次第」かな。
大抵は、その順番で8バイト境界に並べられるような気がするけど。
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
FFFF0000 o n e \0 FFFF0004 t w o \0 FFFF0008 t h r e FFFF000C e \0 X X FFFF0010 f o u r FFFF0014 \0 X X X ※ Xに何が入るか分からない words[0] = (char*)FFFF0000 words[1] = (char*)FFFF0004 words[2] = (char*)FFFF0008 words[3] = (char*)FFFF0010 こんなイメージ
そのコードの前にconst char * foo = "one and two";なんてコードがあったら面白いことになりそうだ。
700 :
デフォルトの名無しさん :2009/04/04(土) 14:20:39
VC++2008EE使用 これでエラーが出るんですが、どこが悪いんでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> main() { char str[100] ; int num ; gets_s(str) ; num = atoi(str) ; printf("%d",num*2) ; }
>>700 エラーの対処を人に聞く場合はエラーの詳細を書け
たぶん、get_s には2番目のパラメタとして長さが必要ではないかと思うけど
gets_s(str, sizeof(str)); だろうね mainの最後にreturn 0;も忘れずに
なあに、この程度のソースならエスパーでなくとも どんなエラーか想像がつくってもんさ
>>704 C/C++はコンパイル通っただけじゃまっっっっったく安心できない言語だから気をつけな。
むしろコンパイル通らない内が楽だよ。(コンパイラがミスを見つけてくれるから)
コンパイル通ってからのデバッグが大変なんだよねぇ。
それって言語として問題あるんじゃない?
アホは黙ってていいよ
>>706 何を今更。
そんな欠陥があっても、便利なとこがあることに変わりはないから使うというだけのこと。
インタプリタ言語なんてすべて実行時エラーだから もっと恐ろしいことに。
>>705 が言ってる事(>コンパイル通ってからのデバッグが大変なんだよねぇ。)は
別に言語の欠陥じゃないだろ。
プログラムを作る
→期待通りに動作していない
→何がいけないんだーー?
ってなるのはどの言語でも一緒だろ。
ロジックエラーってやつだな。
712 :
710 :2009/04/04(土) 19:07:42
>>711 俺の頭のエラーってことだな。ホント質わるい。
誰も頭の話なんてしてないが。。。
初心者が読むc++のお勧め教えてください お願いします。
>>714 入門者かな?これからC++始めたいって人?
入門者ならエクスメディアの『ビジュアルラーニングC++』って本が個人的なオススメだったけど、会社が倒産した。
コロッとだまされちゃうんだな。
718 :
715 :2009/04/04(土) 22:26:09
719 :
デフォルトの名無しさん :2009/04/05(日) 00:27:14
すんません。知り合いのフリーのPGがVBやVCのアカデミック版使って 作ったソフトを売ってるんだが、ソフト自体は差は無いのですか? やめたほうがいいんじゃって言っても「ばれねぇ」の一点張り。 実際どうなの?
720 :
デフォルトの名無しさん :2009/04/05(日) 00:30:31
何か問題あるの?
721 :
デフォルトの名無しさん :2009/04/05(日) 00:37:52
アカデミック版で作ったソフトって売っていいの?
722 :
デフォルトの名無しさん :2009/04/05(日) 00:38:20
売っちゃいけないの?
ライセンス読まないの?
>>719 ライセンスキーの情報が埋め込まれてるから
ばれる可能性はある
アカデミックとかImagineCupのは商用利用負荷だよ
Expressはできるけど
いやアカデミックは商用利用可能だよ
>>725 ほんとだ、ごめん
アカデミックは大丈夫ですね
テンプレートの明示的特殊化の際に「整数型全部」「浮動小数点型全部」といったことをしたいんですが、いい方法はありませんでしょうか。 template<typename T> class Hoge { void f() {} } template<t> class Hoge<整数>::f { void f() {整数専用処理}; } みたいな感じで。
728 :
デフォルトの名無しさん :2009/04/05(日) 01:00:39
じゃあ、学生のときに買ったアカデミックで作ったソフトは売っても全く問題ないわけね
もうひとつ。 テンプレートの明示的特殊化はヘッダファイルに書いておいてもいいものなのでしょうか。
>>730 ありがとうございました。boostの使用も考えてみます。
テンプレートの明示的特殊化を複数個所で使用する場合に、
実体を置くべき場所の解決がうまくできない問題は相変わらず……
externを使えば?とも思いましたが、BCCでもVCでも解決できませんでした。
732 :
730 :2009/04/05(日) 01:51:31
>>731 まあ正直俺だったらboost::enable_ifじゃなくて、
適当なprivateインライン関数テンプレートfoo_temp()を1つ別個に用意しておいて、
int, short, unsigned long, etc...
を全部考え得る限り特殊化し、それぞれから
foo_temp<int>, foo_temp<short>とかを呼び出すように定義しちゃうかもしれない。
733 :
730 :2009/04/05(日) 01:54:10
>>731 >>テンプレートの明示的特殊化を複数個所で使用する場合
そもそも明示的特殊化って何?
ふつーに特殊化だよね?
あと、メンバ関数テンプレートの話だよね?
実体をどこに書いてる?
特殊化してなければちゃんとコンパイル→リンクまで行くの?
>>733 「明示的特殊化」はIBM XL C/C++ ランゲージ・リファレンスの言葉に従っています。
中身は普通の特殊化でメンバ関数です。
やりたいことはクラステンプレート内部のメンバ関数のみの特殊化です。
(クラス内部のテンプレート関数の特殊化を指す名前はあるのでしょうか?)
現在は
hoge.h
hoge.cpp
a.cpp
b.cpp
があるとして、
// hoge.h
template<typename T> class Hoge { void f() {} }
// template<> class Hoge<int>::f() { int専用処理; } // cppでの記述を消しても多重定義、NG
// template<> class Hoge<int>::f(); // VCとBCCではじかれる。externを書いても同じ。
// hoge.cpp
template<> class Hoge<int>::f { void f() {int専用処理}; }
// a.cppとb.cpp
Hoge<int> hoge;
hoge.f();
とおいて試してみています。
735 :
デフォルトの名無しさん :2009/04/05(日) 02:56:13
>>728 学生じゃなくなってもアカデミックを使い続けて良いの?
課題やる→コンパイルエラー→シコシコ直す→コンパイル通る→やったー!これで終わりだー →./a.out→文字がうじゃうじゃうじゃうじゃうじゃうじゃうじゃうじゃorセグメンテーション・エラー云々 →( ゚д゚) →( ゚д) そうだね、今このときだね
おれはなんて遅レスをしていたんだ・・・・・・ 恥ずかしい・・・・・・っ、でも、
>// hoge.cpp >template<> class Hoge<int>::f { void f() {int専用処理}; } template どうこう以前に、すでに書き方間違ってるじゃろ、それ。 あと、特化したのはクラスであってメンバ関数じゃないんだから 特化のための宣言である template<> もいらない。
>>738 失礼しました。その部分はclass→voidですね。classだとそもそもコンパイルが通らないはず。
というわけで試してみました。
// hoge.h
template<typename T> class Hoge { void f() {} }
// なにも書かない→gcc3.4:リンカで多重定義 VC9:通るがcppでの実装は無視される BCC:cppのコンパイル時に多重定義扱い
// void Hoge<int>::f; //gcc3.4→too few template-parameter-list VC9:通るがcppでの実相は無視される BCC5.5:template<>宣言が必要
// hoge.cpp
void Hoge<int>::f { void f() {int専用処理}; }
といった感じです。
template<> class Hoge<int>::f(); テンプレートクラスの特化宣言をなぜ落とすw テンプレートクラスの特化はちゃんと宣言する必要がある。 それが目的なんだから。 特化宣言がいらないのはそのクラスのメンバ関数。 なぜなら特化したのはクラスであってメンバ関数じゃないから。 仕様書を読んだほうがいいかも。
>>740 メンバが多めのテンプレートクラスの一つの関数だけを再定義、といった場合に、
教科書通りにテンプレートクラスの特化で全メンバを再定義すればいけるというのは分かるのですが、
特化したテンプレートクラスのある特定の関数だけリンカで特殊な定義に差し替えられないかと考えたのですが、
冷静に考えるとそれをコンパイラに知らせるのはかなり酷な作業の気がしてきたので、
教科書通りに全部再定義してみます。
一足飛びに変な質問をしようとして、エスパーさせてしまってすみません。
4桁の2進数があったとします。0001←2進数表記 それを0001→0010→0100→1000→0001→…という感じでずっと1を移動させたいん ですがifやforなど条件分岐を使わず出来るだけ軽い処理でいい方法ありませんか? この関数が呼び出されるたびに上記のように1を移動させていくって感じです。 <<=1でシフトさせていけば軽いしいいかなと思ったんですがそれだと1000を処理したとき 0000になってしまいます。やっぱりif入れて8より大きくなったら1にとかしかない?
(x << 1 ) & (x >> 3)
初心者はポインタより多重ループのほうが躓きやすくない?
ポインタや多重ループより「躓き」の読み方の方が難しい
x = ((x & 7) << 1) & (x >> 3)
748 :
デフォルトの名無しさん :2009/04/05(日) 14:00:12
x = 0; x = (x << 1) & 16 || x = 1;
|| は副作用完了店だお
15じゃない?
#include <stdio.h> void main() { int i, x = 1; for (i = 0; i < 10; i++) { printf("%d:%X ", i, x); x = ((x & 7) << 1) | (x >> 3); } } 0:1 1:2 2:4 3:8 4:1 5:2 6:4 7:8 8:1 9:2
x = ((x + x) >> (x & 4))& 15
>>752 7とか中途半端だなどうせなら非環境依存にしとけよ
>>745 躓きの「書き」を問われたら俺失点するわ。
簡単な文字だから今覚えてしまえば、死ぬまで忘れないだろ
757 :
デフォルトの名無しさん :2009/04/05(日) 15:29:31
「躓き」覚えた 3日も経てば忘れるだろうけど
そもそも何で足偏に質なんだ? どの辺がつまづきなんだろう・・・。
x=^((x<<1)+1);
x = 1<<(((S++)%4)+1) ??
図書館でC++の本探そうかと考えてるんですが・・ 図書館にあると思いますか?(・∀・)
うちの近所の図書館にはある
そうですか!また行こうと思います(・∀・) ところで、誰かモリタポ別けてもらえないでしょうか(・∀・ ) ◆xb8eIST5.k
>>764 お前、厨房か?クレクレやろうは逝ってよしだ、ゴルァ
小学校の図書館とか、児童施設の図書コーナーとか、特定の分野に特化した図書館とかじゃなきゃ 数冊はあるんでねーの?
769 :
デフォルトの名無しさん :2009/04/06(月) 18:42:31
Dependency Walker(Depends.exe)のことか
771 :
デフォルトの名無しさん :2009/04/06(月) 18:53:32
Linuxでデバイスとのやりとり(シリアル通信)をラップするような ライブラリを提供したいです。C++。 ユーザにはどんなインターフェイスで公開するとよいですか? 受信スレッドでデバイスから読んで 受信バッファにデータ積んで、コールバック登録されたメソッドを 呼び出してあげる。でよいですか? ユーザアプリ側のコールバックルーチンが別スレッドで走るのが 気持ち悪い気がするのですが。
Windowsでプロセス間通信)をラップするような ライブラリを提供したいです。C++。 ユーザにはどんなインターフェイスで公開するとよいですか? 受信スレッドでプロセスから読んで 受信バッファにデータ積んで、コールバック登録されたメソッドを 呼び出してあげる。でよいですか? ユーザアプリ側のコールバックルーチンが別スレッドで走るのが 気持ち悪い気がするのですが。
773 :
771 :2009/04/06(月) 19:42:26
>>772 Windowsのプロセス間通信なら、
共有メモリと、Windows Messageを使うと、ユーザアプリに求めるのは
メッセージポンプだけになるし、ほぼ標準的なつくりになる気がするので、
好みなんですが。
Linuxではどうですか?
774 :
771 :2009/04/06(月) 19:45:43
Named pipeは、よく使われますか? ユーザアプリは、selectで待つようになるんですよね。
自作ソフトで使うマクロの文法を、拡張しようと思い、 lexやらyaccやらbisonやら調べ始めたのですが・・・ 難しい・・・ 例えば呼び出し前に新たなトークンを追加したり、関数定義みたいなことが 出来るようにするサンプルを探しているのですが、見つかりません。 ・自作ソフトはプラグインで拡張可能になっていて、マクロのプラグイン名 を自前で解析していますが、区切り文字の検出とか括弧の扱いとか、自力 では限界なので・・・プラグイン名を追加トークンにして、ライブラリお 任せ一発という形に出来ればと思っています。 ・マクロの中で関数マクロの定義が出来るようにといいのですが、 hoge(a, b, c) = { age; sage(a, b); uge(c); } hoge(1, 2, 3); こういうのを実現しているサンプルなどありましたら教えてください。
初歩的な質問で申し訳ないんですが みなさんは童貞でしょうか?
どっちか一方しか居ないとでも思ってんだろうか。
780 :
デフォルトの名無しさん :2009/04/07(火) 13:53:49
フォームの中にサブフォーム?を作ってメニューのボタンを押すたびにそのサブフォームの内容を変えるようにしたいのですが どうすればよろしいのでしょうか?
いきなりフォームとか言われても環境がわからんわ どのフォーム?
782 :
デフォルトの名無しさん :2009/04/07(火) 14:02:03
えっとWindowsフォームでしょうか・・VisualC++使っています
>いきなりフォーム
ヴビ厨特有の現象です。
>サブフォーム?
このオレ用語も。
…ほらね、俺に ESP 能力なんかないでしょ。
>>780 C++/CLI なら TabControl でも使っとけ。
784 :
デフォルトの名無しさん :2009/04/07(火) 14:17:05
すみませんでした。 ありがとうございました。
>>779 どちらでもない、あるいは両方ってあり得るの?
786 :
デフォルトの名無しさん :2009/04/07(火) 19:40:47
>>785 「みなさんは」という集合なんだから両方は余裕であるだろ
787 :
デフォルトの名無しさん :2009/04/07(火) 20:29:33
>>786 はい、残念。
「童貞」は個体の属性だから、
>>778 は集合に対する問いかけじゃない。
集合の元に対する問いかけだ。
日本語勉強してから出直しな。
>>787 数学できるのかっこいー
ってお世辞言ってもらえるとでも思っているのかな?
・・・恥さらしてないで出直しな。
789 :
デフォルトの名無しさん :2009/04/07(火) 21:08:12
できて当たり前のことをほめられてもうれしくないだろ 788が恥さらしだということだけは確実に真理だ
790 :
788 :2009/04/07(火) 21:54:35
>>789 >「確実に真理だ」
・・・顔 真っ赤にしちゃってかわいー
791 :
デフォルトの名無しさん :2009/04/07(火) 22:01:26
>>790 定番のレスしか返せないってほんとかっわいいいいwwwwww
792 :
790 :2009/04/07(火) 22:12:06
>>791 あきらめろ。
このありさまではもう、誰が見てもお前が○け犬
793 :
デフォルトの名無しさん :2009/04/07(火) 22:26:27
>>787 「童貞」は数学用語じゃないから勝手に元と認識してはいけません
795 :
デフォルトの名無しさん :2009/04/08(水) 00:39:57
796 :
デフォルトの名無しさん :2009/04/08(水) 01:02:41
童貞が煽りになると思う時点でガキすぎるw
798 :
デフォルトの名無しさん :2009/04/08(水) 07:07:20
本当に童貞の奴が必死ですw
>>787 >「童貞」は個体の属性
を不特定多数に対して問いかける間抜けさに気付けない頭の悪さを棚に上げて
>日本語勉強してから出直しな。
てのが、なんだかカッコイイですね。
元レスの奴と違う人間に煽られて反応したお前が負け犬だwwwww
>>800 違うか同じかは知らんが (よく解るなお前)、そんなことより
その「お前」ってのは誰?
オレオレ
いーや俺。
うんお前
初心者なんですが、質問させてください。 まず、BCCの無料版をDLして、メモ帳のソースをcファイルで保存しました。 それからコマンドプロンプトを使って実行しましたが、次の文章が出てexeファイルができませんでした。 'bcc32'は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして 認識されていません。 そして、ソースは以下のものです。 main() { }
パスが通ってない。通せ
パス通せよ
811 :
デフォルトの名無しさん :2009/04/08(水) 17:57:14
select関数の第一引数について TCP/IPのソケット通信処理を作成していて、select関数を使用するつもりです。 select関数の第一引数には「集合にある記述子の中の最大値に1を足したもの」 を設定するということですが、具体的に何を設定すればよいか分かりません。 以下の場合、第一引数"nSocket"には何を設定すればよいのか教えて下さい。 FD_ZERO(&rd); FD_SET(acceptSocket1, &rd); FD_SET(acceptSocket2, &rd); select(nSocket, &rd, NULL, NULL, 10); よろしくお願いします。
812 :
デフォルトの名無しさん :2009/04/08(水) 18:03:41
select()に登録するソケット(=socket()の戻り値)の中で一番大きい奴に+1した値 socket()の戻り値はint型だから比較したり+1したりできるでしょ?
>>812 そういう意味ですか。
ありがとうございました。
クラスの継承時にコンストラクタも継承するというか、 親クラスに定義されているコンストラクタをそのまま使う方法というのは、 再定義してデフォルト初期化子に渡す以外ないのでしょうか。
816 :
デフォルトの名無しさん :2009/04/08(水) 23:32:54
class A { int m_val; public: A(int a, int b){ m_val = a+b; } } class B : A {} B(1, 2); みたいにしたいってこと?再定義しかないね。
>>816 了解しました
テンプレートで
class A { int m_val; public: A(int a, int b){ m_val = a+b; } }
template<class X> class B : public A { ... }
のようにして、定型の追加機能を持たせるテンプレートを作ろうとしたのですが、
どうしてもそこで引っかかってしまいまして。
818 :
デフォルトの名無しさん :2009/04/09(木) 02:04:45
とりあえず 童貞乙 であります!
抽象クラスってなんのためにあるの?
まとめて楽するためにあるんだよ
確かに、まとめて楽だ罠。限定しないため関連するものを使うなら楽。
822 :
817 :2009/04/09(木) 22:47:55
強引にコンストラクタを、引数の数だけテンプレート関数化して再定義しました。 スマートに行かん……
glutIdleFuncのように処理するイベントが無いときある関数が 呼ばれ続けるようにするにはどうすればいいですか?
>>823 そう質問するということは、今はGLUTを使っていないのだろう。何使っているの?
825 :
デフォルトの名無しさん :2009/04/10(金) 21:49:42
peekmessageでなんもなかったら呼べばいいんじゃね
826 :
823 :2009/04/10(金) 22:10:44
>>824 http://irrlicht.sourceforge.net/ ↑Irrlicht Engine
3DエンジンのIrrlicht使ってます。
http://www.impulse-based.de/ ↑物理エンジンIBDS
この物理エンジンのCollisionModelというサンプルをIrrlichtに移植しようとしています
初期化の処理は同じように作ったつもりですが、
Simulation::getCurrent ()->timeStep ()
をメインループに入れて呼び出すと
なぜか速度が一定になりません・・・。
(IBDS::TimeManager::getCurrent ()->getTime()
すると1秒間に1秒進んでいないのがわかる)
元のと同じようにglutIdleFuncのような処理を
しないと思わないと重い質問しました。
int main( int argc, char **argv )
{
・・・
MiniGL::setClientIdleFunc(50, timeStep); //glutIdleFuncに相当する処理
}
void timeStep ()
{
for (int i=0; i < 8; i++)
Simulation::getCurrent ()->timeStep ();
}
http://iroiro.zapto.org/cmn/jb2/data2/jb4015.zip
WindowsAPIのDialogBoxParam( )でダイアログのプロシージャに初期値を渡すときなど、 本来意図してたものと違う型のポインタを渡していた場合の例外ってどう処理すればいいんでしょうか? 調べたのですが、良くわからないので現状……catch(...)……として、全部の例外を捕捉して処理してるんですが 何かいい方法ってあるでしょうか? 【例】 main() { TYPE_ONE * A; // TYPE_ONEクラスのポインタ TYPE_TWO * B; // TYPE_TWOクラスのポインタ DialogBoxParam(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)DialogProc, (LPARAM)&A); } LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static TYPE_TWO * B=NULL; switch(message) { case WM_INITDIALOG: // 本来TYPE_TWOクラスのポインタを渡すべきなのにTYPE_ONEクラスのポインタを渡している B=(TYPE_TWO *)lParam; // TYPE_ONEクラスにはないメンバ変数を使用したので例外が発生 B->TextOut(); } }
828 :
デフォルトの名無しさん :2009/04/10(金) 23:36:44
>>827 そのコードを実行して上がってきた例外をキャッチするようにすればいいんじゃないの?
違う型を渡せないようにうまくラップするようにしたほうがずっといい。
830 :
デフォルトの名無しさん :2009/04/11(土) 17:09:45
質問: コンストラクタで例外発生するようなことはしたくないが 設定値によっては例外が出てしまうようなオブジェクトを生成したい場合 コンストラクタは普通にすっからかん状態で生成しといて その後パラメタをセットしたほうがいいですか? class 複雑{ public: 複雑(param1, param2, param3,...){ ...えらー!...} オブジェクトのユーザが使う処理1(); オブジェクトのユーザが使う処理2(); }; ↓ class 複雑{ public: 複雑(){} 組み立て(param1, param2, param3...){ setParam1(param1);...setParam2(param2)...} ユーザが使う処理1(); private: setParam1(param1){} setParam2(param2){} setParam3(param3){} }; コンストラクタ読んだだけで組み立てずにユーザが使う処理呼ばれるかもしれないのは 使い方が悪いからダメってことで考慮しなくていい問題?
831 :
デフォルトの名無しさん :2009/04/11(土) 17:25:39
コンストラクタで例外発生させたくない理由は?
>>832 そんなこといったって、
>>830 では解決にならないじゃん。
設定値によってはまずいことが起こってしまうなら、例外でもそれ以外の手段でも、とにかく
「それはダメだよ」ってのを何らかの手段でユーザに伝えなきゃダメだし、
それをユーザに無視されたらどうしようもないのは同じこと。
冷静に考えたらそうですよねー。 なんか変なこと聞いてしまったようでごめんなさい
>>829 次のように、ダイアログプロシージャをクラスの静的メンバで持つ感じでしょうか?
【例】
class TYPE_X
{
public:
bool Input(HINSTANCE hInst, HWND hWnd, TYPE_TWO * InputObj)
{
if(DialogBoxParam(hInst, (LPCTSTR)IDD_DIALOG, hWnd, (DLGPROC)DialogProc, (LPARAM)InputObj) != IDOK) return false;
}
private:
static LRESULT CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
}
test
837 :
デフォルトの名無しさん :2009/04/12(日) 13:03:00
sinΘ,cosΘの話で -1 から 1 までの実数値が分かっている状態で たとえば 0.2222 の実数値から角度を求めたいのですが どのような計算をすればいいでしょうか?
838 :
デフォルトの名無しさん :2009/04/12(日) 13:04:27
arcsin
3.141592....の時が180° 3.141592x2 の時か360° なんですかね? ラジアン角度は習ってないので
842 :
841 :2009/04/12(日) 13:15:25
>>840 > 3.141592....の時が180°
> 3.141592x2 の時か360°
で、上の2つは正解。
要は一周分を360と見なすのが度数法、2πと見なすのが弧度法(radian)
843 :
デフォルトの名無しさん :2009/04/12(日) 13:16:00
360(度)=2π(ラジアン) リニアに対応
板違いだろ
>>844 どうせ閑散としてるからいいじゃん。
このスレのレベルにお似合いの程度の質問だし。
360(度)=2π(ラジアン)というのですね 初耳です 高校までは出たんですが習ってないですね・・・ 板違いはすいませんでした 実数値から 角度を戻り値として返す関数を作っていたもので 一度作ったのですが、ソースを紛失してしまい もう一度作ろうとして数学のところでつまづきました
教科書に書いてあるのに、習ってないとかありえんだろ。
基本的な質問ですみませんが、以下のプログラムはどうしてコンパイルエラーになりますか? VC++さん曰く、 「warning C4346: 'std::vector<t1<t>>::iterator' : 依存名は型ではありません。」 らしいのですが、よく分かりません。 template < typename t > struct t1{}; template < typename t > struct t2 { typedef vector< int >::iterator iterator; //OK typedef vector< t1< t > >::iterator iterator; //ERROR };
>>848 typedef typename vector< t1< t > >::iterator iterator;
かな?
850 :
デフォルトの名無しさん :2009/04/12(日) 13:50:07
>>848 > 依存名は型ではありません。
「いや型なんだよ!」
って言ってあげればいいんじゃない?
正解は
>>849 も言う通り
typedef typename vector< t1< t > >::iterator iterator;
です。
>>850 このサイト著作権侵害じゃね?
Scott Meyersから許可が出てるのか?
引用だろ。 出典も明確にしてるし、全く問題なし。
>>853 引用分と地の文の境目が明らかでないし、
地の文と引用文が主従の関係をなしていないから、
これは引用の要件を満たしていないと思う。
>>853 >全く問題なし
引用はその文脈からして許容されると考えられる最低限の量の場合だけ許されるんじゃない?
>>856 ありませんでした。
高校数学は、3年の夏休みまでに終わらせて、
あとはずっと受験対策でした。
858 :
848 :2009/04/12(日) 14:06:44
>>857 理系?文系?
数学3Cやった?
三角関数の微積分を習うなら度数法では実質的にはありえない。
30度だか60度だかの角度を見て、 頭の中で先にラジアンで出てきて、とっさに度数に変換できなかったことがあるw
Cまでヤッた、3Pヤッた
普通にオイラーの公式を扱うときはばりばり弧度法だけど 三角定規を見ると30度とか60度とかいわないと違和感を感じる不思議
オイラ孤独だよ(´・ω・`)
>>850 こんなことやられると本を書いてるやつはたまらんな。
>>864 な、ひどいだろ。
まあ名著だからこそ起こる現象だろうが、
こういうヤツはソースコードとか余裕で無断使用してそうで
信用できないやつだな。
>>866 たとえば文章が下手だとかっていうのに「じゃおまえが書いてみろよ」って言うのなら
わかるけど「丸ぱくりだろ」ってのに「じゃあおまえがやってみろよ」って言い返すのって
意味がわからん。
868 :
865 :2009/04/12(日) 16:24:48
熱い汚辱のリビドーを抑えきれないんだよ、きっと^^
866=870以上のカスなんて
>>850 のリンク先ぐらいだろ
872 :
865 :2009/04/12(日) 16:42:45
>>870 いつも言われていることなんですね。
皆から かわいそうな人を見る目で 見られているんですね。
>>873 あー、
>>866 >>870 は本人か。
そりゃまあファビョり出すわな。
>>850 のリンク先は
Effective C++のところ以外の記事をちょっと見てみたら
普通に面白そうな記事だった。
単にEffective C++の丸パクが悪いだけで他のは良いサイトだと思う。
877 :
デフォルトの名無しさん :2009/04/12(日) 17:21:32
1/2*2って0.25ですよねぇ?
いいえ、0です
(1/2)*2でも0 1/(2*2)でも0
>>877 /と*の優先順位を考えると、
1/2*2
は
(1/2)*2と解釈される。
そして(1/2)はint/intだから整数値に切り捨てられるので0
よって(1/2)*2は0*2となり0
意味がわからない
>>881 整数で演算すると少数が切り捨てられるってこと。
883 :
880 :2009/04/12(日) 18:10:42
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ しゃぶってくれ!! / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
885 :
880 :2009/04/12(日) 18:12:20
>>881 あとまあ強いて言葉足らずだとすれば
>/と*の優先順位を考えると、
を
>/と*の優先順位を考えると、
>これらは同じ優先順位であり
>また左方結合な演算子なので
に読み替えてみてくれ。
886 :
デフォルトの名無しさん :2009/04/12(日) 20:07:41
私も見てみましたが、大した批判コメントじゃないですね。 むしろあり難いアドバイスといった感じ。 ブログの内容がC言語の基本を全く理解していない状態で 「2週間アニメばかりみまくってます」 「3Dの勉強始めました」 「3Dの勉強やめました」 のような感じであれば辛口コメントも付いておかしくない。 ----さんが書かれている通り、自分が公の場に情報を発信しているからには、 何らかの刺激を受けるはず。それに耐えられないなら発信すべきではありません。 と出たんだけど ブログって公の場になるん? こんなブログにアクセスし、辛口コメントする方に問題があると思うんだが
887 :
デフォルトの名無しさん :2009/04/12(日) 20:58:35
スレ違いかも知れないですが、お願いします 学校の課題研究で、自分を含める6人で段幕ゲーム(シューティング)を作ることに決まりました。 友達はJAVAが多少できる(HelloWorld程度とか?)のでJAVAがいいらしいですが、自分はCは基本くらいならできるのでCでいきたいと思ってます。 実際、手間や難易度からしてどちらでやるべきでしょうか?
>>887 Javaみたいな糞言語使うな
脳が腐るぞ
俺ならCとDirectXで作るな サンプルも豊富だし
Javaもゲームの本とかよくあるだろ?
893 :
デフォルトの名無しさん :2009/04/12(日) 21:18:45
>>889 ー892
ありがとうございます
豊富とのことですので、C言語にします
弾幕か・・・・フレームレートが一桁になるんだろうなw
895 :
デフォルトの名無しさん :2009/04/12(日) 21:23:37
>JAVAが多少できる(HelloWorld程度とか?) 10分あればだれでも出来そうだな
期間はどのくらいだろう? 一年くらい? Hello Worldからはじめたら、どっちにしろ遠い道のりだな。
長い道のりでも歩く価値がある Javaなんかに足突っ込んだら近所のオバチャンレベルになってしまう
ま、両方やればいい話だけどな。
Cだとほぼ環境依存になるけど早い Javaだと高速化が厳しいけどプラットフォームが多様 いっそのことFlashで作れw
AIRでおk
期間は10ヶ月です。 C言語のレベルは配列程度なら完璧にマスターしてるくらいです
ずいぶん初歩レベルのマスターだな
903 :
sage :2009/04/12(日) 21:39:38
orz
今のPCなら配列とバカサーチしかしらなくても、そうとうたくさんの オブジェクトを動かせそう。
でも、K&Rで配列のすべてが語られるのって、 実に教科書も半分を過ぎたところなんだよね。 そして、その項目には恐るべきCの宣言構文の解析が含まれている。 前にこのスレ(じゃなかったっけ?)で話題になった int *(*i)()[3]; こんな宣言を理解できるようになってようやく配列を理解したといえる ということを意味しているのだった…あなおそろしや(アナ・コッポラは恐ろしくかわいいの意)。
>>905 >int *(*i)()[3];
>こんな宣言を理解できるようになってようやく配列を理解したといえる
えーと。。。
iは
int型へのポインタを3個格納する配列を返す関数を指すポインタ
かな?
正解です。まぁ、普通こんな宣言は使わない。w
関数は配列を返す事はできない
配列へのポインタなら返せる int **func(void) { static int *a[3]; static int b[3] = {1, 2, 3}; int i; for (i = 0; i < 3; i++) a[i] = &b[i]; return a; } int main(void) { int **(*i)(void) = func; int **a = i(); int j; for (j = 0; j < 3; j++) printf("%d\n", *a[j]); return 0; }
確かにありえないね。w 配列を直接引数に渡したり、戻り値にできないのは もともと配列名が定数だからだっけ? といよりも、できないから定数になってるのかな。
911 :
906 :2009/04/12(日) 22:42:47
ああホントだ、ごめん となるとより正確には iは int型へのポインタを3個格納する配列へのポインタを返す関数を指すポインタ かな。 こんなコードが出てきたら、理解するよか先に 作ったヤツを探して問い詰める時間に充てたい。
>>911 いやだからコンパイル通らないって
やってみろ
ポインタの配列を指すポインタを返す関数は こんなお馬鹿な書き方をしなければならない こんなプログラムをスラスラ何の苦もなく書ける奴がいたら 頭がどうかしてる int *(*func(void))[3] { static int *a[3]; static int b[3] = {1, 2, 3}; int i; for (i = 0; i < 3; i++) a[i] = &b[i]; return &a; } int main(void) { int *(*(*i)(void))[3] = func; int *(*a)[3] = i(); int j; for (j = 0; j < 3; j++) printf("%d\n", (**a)[j]); return 0; }
将来的にJavaとかの他言語に移植するかも …というような場合には、関数の引数は ポインタ渡しを使うより参照渡しで統一した方がいいんでしょうか?
>>914 その理由はポインタか参照かの選択要素にならんだろうな
ポインタ渡しも参照渡しもほとんど同じじゃん 値渡しなら全然違うけど Javaはプリミティブ型を除けば、全部参照(ポインタ)渡し
ちんこぷらんぷらん^h^h^h^h^h^h^h^h^hC++では、 参照は参照先を変更できないし(キャストしたらしらないけど)、 必ず初期化されるから、できることなら参照使ったほうが安全。 もちろん、ポインタにはポインタの利点があるけど。
>>913 まあ実際にやるとしたらtypedef使うわな。
>>910 アセンブリ言語で考えると配列を引数で戻すという実装が有り得ない
(結局、呼出元が戻り値を格納する配列を用意し、そこへのポインタを引数で渡すなどといった形になってしまう)
というのが根本的な理由だと思う。構造体の戻り値もANSIの前はできなかったみたいだし。
所詮、高級アセンブラなんだろうよ。
>>913 >int *(*func(void))[3]
これは初見だな
参考になるthx
まぁ使わないだろうけど
>>918 無理やり配列を返すように書いてみたけど、やはりコンパイルエラー
char func()[6]
関数は配列を返せません。
関数から、配列へのポインタを返すことはできますが、配列を返すことはできません。
void func(char buf[6])
こう書いたところでbufはchar*扱いだしな
でもそれはCの仕様であり、アセンブラとは関係ないと思うぞな
スタックに引数や戻り値の領域を確保しさえすれば
配列だろうが構造体だろうが渡し放題
#include <stdio.h> struct tag { char str[6]; }; struct tag func(struct tag aa) // 引数は値渡し { static struct tag ab; printf("func aa:%s\n", aa.str); aa = *(struct tag*)"world"; // aaはローカル変数 ab = *(struct tag*)"world"; return ab; } int main() { struct tag aa; struct tag ab; aa = *(struct tag*)"hello"; ab = func(aa); printf("main aa:%s\n", aa.str); printf("main ab:%s\n", ab.str); return 0; } 配列で渡せなくても構造体で包めば渡せる func aa:hello main aa:hello main ab:world
配列をもつオブジェクトを定義して、 そのポインタを渡すってのはだめ? んでもってアクセッサでガリガリに固めちゃう。
構造体を戻り値にする場合、どうせ構造体コピーされるんだから staticにする必要はないな
ダメ
>>905 Intのポインタを返す3個の関数ポインタだと思ったのだが違うのか。orz
int *(*f[3])(); 解析: intへのポインタ (*f[3])(); intへのポインタを戻り値とする引数なしの関数 (*f[3]) intへのポインタを戻り値とする引数なしの関数へのポインタ f[3] intへのポインタを戻り値とする引数なしの関数へのポインタの配列3個 f
配列3個というとおかしいな。要素数3の配列というべきだった
>>926 宣言・定義構文解析って入門レベルの基礎だろ。
つまり、int a,*b; すらも理解できてないってことだ。
これが理解できとけば、int *(*i)()[3]; も理解できる。
なんで int[3] a; int(*)[4] func(int, int); はだめなの?
C言語がそういう仕様だから。 K&Rにも「酷評される」って書いてある。 なんにせよ、K&Rには とてもわかりやすい解析の仕方が載せてあるので 入門レベルの話であることには違いない。
int[3] a; と書けちゃったら int a = 1, &b=a, *c = &a, d( int ), (*e)( int ) = d, f[1] = { a }; みたいな宣言ができなくなっちゃうじゃないか。ははは。
Javaだと int[3] a; int a[3]; 両方書けるけど、前者のがいいみたい
>>933 僕的には
>int a = 1, &b=a, *c = &a, d( int ), (*e)( int ) = d, f[1] = { a };
は近視なの。清く正しく美しく全てにintつけるの、うふふ
Microsoft Speech APIを使った音声認識プログラムのサンプルってどこにあるんですか? SpeechSDKにも付属していますが日本語のがほしいです・・
ありません。
938 :
926 :2009/04/14(火) 00:26:31
939 :
taguti :2009/04/14(火) 16:03:57
6個のreal型変数x1、y1、x2、y2、x3、y3を定義しそれぞれに実数つを読み込んで、xy平面上の3点 (x1、y1)(x2、y2)(x3、y3)を頂点に持つ三角形の面積を計算して、その値を表示するプログラムを作成してください。 ・公式:底辺x高さ÷2を使って計算してください。 お願いします!!
Turbo C++ 5.01J for Win32でAppExpertで作成したMDIテキストエディタのスケル トンコードを改修して、エディタ内の文字列の長さを取得しようとしても0になる。 何で。 TEditViewクラスを継承したクラスから取得するので、OWL APIリファレンスの ヘルプで調べると、そのTEditViewの基底クラスであるTStaticクラスの GetTextLimit()メンバ関数で取得できるはずなのに。 uint n1 = this->GetTextLimit(); で0が返される。 代わりにパブリックなデータメンバのTextLimitでもだめだ。 n1 = this->TextLmit; でも0が返される。 コンパイラ: Turbo C++ 5.01J for Win32 オペレーティングシステム: Windows XP Home Edition
942 :
デフォルトの名無しさん :2009/04/16(木) 20:34:41
C++で可変長配列が公式な仕様であるかを教えて下さい 具体的には、以下の様なものです。 unsigned int dof = m_q_cur_in.data.length(); double Pgain[dof]; Pgain[0] = m_gain_p_0; Pgain[1] = m_gain_p_1; g++では正常に動作するのですが、 移植性の問題が発生しないかわかりません。
943 :
デフォルトの名無しさん :2009/04/16(木) 20:42:57
それって可変長っていうの?
よくあるC言語の入門書に書いてあることは大体覚えたのですがその次に何に以降したらいいのかわかりません 最終的にはよくある形のソフト?(上に青いバーがあって右上に最小最大閉じるがあって項目にファイルだのヘルプだのがあるような奴) を作れるようになりたいと思っているのですが次はどのような参考書を買えばよいのでしょうか? WinAPIだの.NETだのが次のステップなのでしょうか?
すいません。 '\0' と '0'の具体的な違いって一体何なんでしょうか? 配列の最後に入っているのが前者だってことはわかるんですけども・・・・
後者は文字としての0
'\0' == 0 '0' == 32
948 :
デフォルトの名無しさん :2009/04/16(木) 20:58:04
>>944 その「よくある形のソフト」ならVC#expressで一瞬でできるよ。
違った '0' == 48
'0'の値は文字コードにより異なる
'\0' は '\000' の短縮形 unsigned char buf[256] = "\0000"; printf("%d %d %d\n", buf[0], buf[1], buf[2]); 0 48 0
EBCDICなら'0'は0xF0
>>943 定数じゃ無くて、変数で配列のサイズを決めたいと言うことです。
C99で出来るようになったようですが、
C++にも適応されているか分からないのです。
可変長じゃないだろ、それ。 そして、できません。 constat expression のみです。
>>954 >そして、できません。
>constat expression のみです。
g++の独自仕様なのかな…
>>942 C99では出来るようになったとかいう話は俺も聞いた。
そしてC++ではコンパイル時定数以外で配列の個数の指定は出来ない。
やりたければnewでヒープに動的確保するしかない。
俺:10進数の0は表現できない 0で始まる整数リテラルは8進数だから 0は何進数でも0だろバカ
>>956 Windowsに移植されるかもしれないので、
無難にnewを使います。
質問に答えてくれた方、有難うございました。
ちょっと待ったnew[]って全然無難ではないからstd::vector使っておけ。
>>959 vectorの事が、今頭に無かったです。
サンクス
961 :
デフォルトの名無しさん :2009/04/16(木) 21:56:21
C言語のsrand関数について質問です。 ランダム関数を説明している本の中に以下の一文がありました。 srand((unsigned int)time(NULL)); 初期化にsrandを使うというのは分かるのですが、 普通に srand(time(NULL)); ってやっても問題なく動きます。 ここで「unsigned int」に型キャストする意味はあるのでしょうか?
>>961 srandの唯一の引数の型はunsigned intだが、
timeの戻り値の型time_tはunsigned intとは限らないという理由。
ようするに警告を避けるため。
WNDPROC WndProcOld = (WNDPROC)(LONG_PTR)GetWindowLong(...); SetWindowLong(..., (LONG)(LONG_PTR)WndProc); というキャストをしないとウォーニングが消えないとかあるしw
964 :
956 :2009/04/16(木) 22:29:09
>>959 >>960 ああ、確かに俺もstd::vectorを
薦める一言を入れるべきだったな。
boost::scoped_arrayとか面白いけど、
普通に配列の代わりとして使うなら
やっぱstd::vectorだなぁ。
>>963 VC++のことなら/Wp64を使わなければいい。どうせ、VC++ 2005から非推奨になっていることだし。
その種のエラー・警告がほしければ実際に64ビット対象でコンパイルしてみろということらしい。
966 :
デフォルトの名無しさん :2009/04/16(木) 22:47:24
>>962 なるほど。
分かりやすくありがとうございます。
すいません。
ttp://xn--n9q36mh1hnxuksz7wt.jp/FE19b-pm/t06.html の「プログラム」で、/* 90度右回転 */というところがあるのですが、
なぜ、 printf("%c", in[CSZ - j - 1][i]);ということになるのかよくわからないのです。
もうちょっと上の方に、
先頭行: dat[0][0], dat[0][1], … , dat[0][4], dat[0][5]
↓ ↓ ↓ ↓
右端列: dat[0][7], dat[1][7], … , dat[4][7], dat[5][7]
と書かれているのですが、だったら
printf("%c", in[i][CSZ-j-1]); ということになりそうな気がしたんです。
jのループが内側だよ 7で固定だからjが変わったらだめだよね
>>968 ああ、言われてみればそうでした・・・
だけどこの*で表したFっていう文字を右回転させると配列が横長?になるじゃないですか。
そうすると in[6][8]になりそうなのに、in[8-j-1][i(6が最大)] なのが引っかかってしまうんです。
>>969 [a]のif文でrowとcolを替えるんでしょ
酷いプログラムだけど。。
こんなのコンパイラ通るの?? void invert(int, char[][]);
>>970 一応rowとcolを入れ替えてrow == CSZ(8), col == RSZ(6)
になってるみたいですけど、
forの中では i の値が 0 から 6 までの値で動いているじゃないですか。
んでもって j が 0 から 8 までの値じゃないですか。
in[][]に入っているのは[7から0までの値][0から5までの値]ってことになるじゃないですか。
そこら辺がやっぱりよくわかんないんです。
>>971 試してみたんですけど通りませんでした。
>>971 無理
void invert(int, char[][*]);
とか
void invert(int, char[][10]);
とかじゃないと
>>972 >forの中では i の値が 0 から 6 までの値で動いているじゃないですか。
>んでもって j が 0 から 8 までの値じゃないですか。
>in[][]に入っているのは[7から0までの値][0から5までの値]ってことになるじゃないですか。
case 1は、それでいいんじゃないの?
>>975 配列の中身はそのままで、配列から読みだして表示する順番を90度回転させてるだけだよ。
>>976 なるほど!ようやくわかりました。ありがとうございます。
978 :
デフォルトの名無しさん :2009/04/17(金) 09:23:34
VC2008で使えるプロファイラありませんか 内蔵のは測定したくないのも測定します 関数単位で測定したいです
979 :
デフォルトの名無しさん :2009/04/17(金) 11:02:32
日本語のアプリケーションのダイアログにコピーマークを使用したいのですが 表示のさせ方がわかりません、、、 VC++2005でマルチバイトビルドという環境です。 MS UI Gothicにはコピーライト文字がないため、今は(C)のようにせざるをえないのですが どのようにしたら表示可能でしょうか?
980 :
デフォルトの名無しさん :2009/04/17(金) 11:10:28
982 :
デフォルトの名無しさん :2009/04/17(金) 12:14:54
WM_SETFONTによってフォントをかえるべしということでしょうか? LOGFONT やCFontでそれはできるのですが、いかんせんコピーライトマークそれ自体が 取得できないのです、
983 :
デフォルトの名無しさん :2009/04/17(金) 12:25:37
copyright © は、半角カナのウ
984 :
デフォルトの名無しさん :2009/04/17(金) 12:40:00
>>981 申し訳ないです。
ユニコードにできない事情がありまして、、
部分的にユニコードを使用する方法はありますでしょうか?
半角カナのウを試してみましたが、ウとでました。。
985 :
デフォルトの名無しさん :2009/04/17(金) 12:45:42
おー、もしかして今思いついたのですが そのラベルだけDEFAULT_CHARSET使うのやめて、DEFAULT_ANSIにしてTAHOMAとかを 使うならばもしかしていけますかね
Cでブラックジャックゲームを作りました。 最初に構造体にカードの絵柄と数字を収め、その中からランダムに選んだカードを 自分の手札に加えていきます。また主な特徴として、最初から決まった領域を 確保するのではなく、カードを取る度にcallocでメモリ領域を確保していきます。 (カードを取る枚数によって確保する領域が変化するため。なお、mallocは使ってはいけないという指定があります。) コンパイルや実行も成功し、結果も考えていた通りの物が表示されました。 しかし、きちんと結果が表示されるのは30%程度で、残り70%はセグメントエラーになります。 色々な箇所にフラグを立てて判定していった結果、どうやらcallocが悪さをしているのではないかという結論に至りました 。 そこで、メモリ領域の確保に失敗した場合はエラー表示を行い、直ちにプログラムを終了するように書き換えたのですが、 エラー表示がされることなく、相変わらずセグメントエラーが出続けています。 エラー時に共通していることは、何れも1回目のループで弾かれていることです。 このように、同じコード、同じ実行ファイルで失敗したり成功したりというのはどのようなことが考えられるでしょうか? なお、callocで作られた領域はプログラム終了時にそれぞれfreeされています。
どーせcallocが確保した領域外にアクセスしてるとかだろ
988 :
デフォルトの名無しさん :2009/04/17(金) 14:45:32
>>986 「結果」とか「1回目のループ」とか
説明が足りないからよくわからないよ。
callocのせいにするなよw ポインタ関係のバグだろ
エスパーが集結しているみたいですね。
まてまて、ゲームウォッチみたいな組み込み向けかも知れんぞw あるいはコンパイラが未成熟の環境とか。 まあ、どのみちこういうのは真っ先にポインタが境界を侵していることを考えるべきだが
>>986 症状が再現する最小限のソースを
見いだして俺達に見せてくれないと
>>991 の言う通りエスパーじゃないと答えられない。
カードの管理にallocなんやらの大砲持ち出す時点で間違いだと思うがね。 uint64_tでも手札管理に十分すぎるじゃねーか
>>984 WM_SETTEXTなどをSendMessageWで送りつければいい。
ダイアログだからそれはないと思うけど、自前でWM_PAINTで描画しているならTextOutWなどを呼ぶ。
自分が大富豪作ってたときには デッキを二つ使ってとかいろいろ夢を見てた
>>986 その書き方だとcallocで確保した領域じゃなく
不定領域になっちゃうよ(;^ー^)
998 :
デフォルトの名無しさん :2009/04/17(金) 19:06:50
基本中の基本のプログラムを起動してみたら、プロンプトが一瞬だけ開いて閉じるんだけど、どういうことなんでしょう? コンパイラはGNU C Compiler ソースファイルは #include <stdio.h> int main (void) { printf("基本?"); return 0; } です。始めたばかりなのでなにがなんだか…。本の通りにやってるはずなのですが…。
a.exeをダブルクリックしたんじゃないの? で、窓が開いて、実行、窓閉じる、の流れで。 コマンドプロンプト等を開いてから、 実行ファイル名を指定しる。
1000 :
デフォルトの名無しさん :2009/04/17(金) 19:21:48
わかりました。やってみます。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。