【初心者歓迎】C/C++室 Ver.20【環境依存OK】
1 :
デフォルトの名無しさん :
2005/07/18(月) 08:59:42
2 get
ほ、ほーっ、ホアアーッ!! ホアーッ!!
STLつかうと一気に実行ファイルサイズが10倍に?!
>>5 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後氏ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
>>6 ,7
おもわず・・・・・プッ。
ここまで毎回でるとあっぱれだな。
息が合ってません
----------------------------------- ここまでテンプレ
12 :
デフォルトの名無しさん :2005/07/19(火) 02:54:08
VisualC++プロジェクトの.NETでWindowsフォームアプリケーションを製作しているときの アプリケーションの左上のアイコンと実行exeのアイコンの設定の仕方を教えてください VS付随のアイコンエディタではしょぼすぎで絵がかけないらしいのでオネガイシマス
つーか、ICONファイルを扱える好きなエディタで描くとか、 好きなエディタで描いたbmpかなにかをIrfanViewかなにかでICONファイルに変換するとか。
15 :
デフォルトの名無しさん :2005/07/19(火) 03:57:22
そうですね〜アイコンは用意できたんですが this->Icon = (__try_cast<System::Drawing::Icon * >(resources->GetObject(S"$this.Icon"))); の部分でerror C2039: 'GetObjectA' : 'System::Resources::ResourceManager' のメンバではありません。 ってエラーを返すようになってしまいました 確かこの部分はVC++が勝手に記述するところだったはずですが・・・ 原因はあまり良くわかりませんがForm1.hとrcとアイコンファイルを適当に触ったのに問題があったんでしょうか 良い解決法があったらご教授願います
>>12 プロジェクト作ったときに出来るアイコンのIDを
おまいがプロジェクトに追加したアイコンに割り当てる
17 :
デフォルトの名無しさん :2005/07/19(火) 09:38:23
一部のViewにFlashを使用したアプリケーションを作成しようと思っています。 配布時にはFlash.ocxに依存しない、スタンドアローンのアプリケーションにしたいと 考えているのですが、exeにFlash.ocxを埋め込む方法が分かりません。 ZINC v2や、SWF Studioといった数種類のswf to exeアプリケーションがあるので、 exeにFlash.ocxを埋め込む何らかの方法はあるようです。 (ZINCの説明では、advanced OCX handling Techniquesを使用したとあります。) exeにFlash.ocxを埋め込むにはどのような方法が考えられますでしょうか? アドバイスよろしくお願いいたします。 開発環境は、VC++.netです。
-O2とか使うと実行が遅くなりうることを できるだけ細かく書いたサイトないですか?
>>18 何よ-O2って。メニコンO2か?
情報が不足杉。もう少し詳細に書け。
clのコンパイラオプションだろ
>>18 の質問もナンセンスだが
頭の悪い質問が 頭の悪い別人を焙り出す例だな
なにその逆に相手の主張を裏付ける反撃
「構文エラー : ';' が '<クラスヘッド>' の前にありません。」 と出る場合、どのような間違いをしていることが考えられますでしょうか? どこかのcppファイルで';'が抜けてるだけだと思って 現在探しているのですが中々見つからず・・・ #ifndef __HOGE_H_ #define __HOGE_H_ ; ←これでエラーがなくなる class HOGE
>>25 他のヘッダファイルで行われているクラス定義を見直せ。
28 :
デフォルトの名無しさん :2005/07/20(水) 20:42:26
小数点以下切り捨てってどうやるんだっけ?
>>28 負の値のときにも 0 へ近づけるのなら (-1.2 ⇒ -1.0)
>>29 負の値のときに -∞ へ近づけるのなら (-1.3 ⇒ -2.0) floor()
こんにちは。いつもお世話になってます。 クラスの内容とかは置いといて、構文のことなんですが、 下のCMaxSizeTask() の後の :〜 がわかりません。こんなやり方 独習C++には書いてないと思うんですが。どういう意味なんでしょうか? class CMaxSizeTask : public CTask { protected: char Work[WORK_SIZE]; public: CMaxSizeTask() : CTask(TASK_NONE, 0, 0, 0, 0, 0, 0) {} };
>>31 初期化。
もし「独習C++」に書いてないとしたら、よほど古い本かゴミなのだろう。
33 :
31 :2005/07/20(水) 21:59:41
ありがとうございました。 おかげで解決しました。 ただ自分が見落としてるだけで 「独習C++」には書いてあるかもしれません。 自分が深く確認してないだけです。ごめんなさい。
ウインドウズに挑戦してる超初心者なんだけど、おまいら教えてください。 wprintfをつかったら出力はどこに表示されるの?
>>34 マイクロソフトを相手に戦うとは・・・すごいヤシもいたもんだ。
戦いが酷く低レベルに見えるのは気のせいか?
>>34 wprintf の w は wide の w だよ…
printfと同じ場所に出力される。
ウィンドウ上に出力したければ TextOut とかを調べるべし。
>>35-36 つまんないよ
38 :
デフォルトの名無しさん :2005/07/22(金) 00:51:29
マジレスみめぇwwwっうぇwっうぇwwwwwwwww
>>38 それ、そろそろみっともないから、やめた方がいいよ。
40 :
34 :2005/07/22(金) 02:03:18
>>37 あ、そうですか。てっきりw =Windowsかと。TextOutだと、文字を出すまで
結構手間がかかるから、デバッグ用に簡単に文字出力してくれるのは無いの
かと思って。
Javaだと、System.out.printlnとかで、デバッグ用のコンソール画面にデバイス
コンテキストとか考えずに出してくれるから、そういうものかと勘違いしました。
失礼。
42 :
34 :2005/07/22(金) 02:32:31
>>41 おおお、そういうものがちゃんとあったんですね。MSDNでちょっと調べてみます。
どうもです。
vcだったらデバッガつかったほうが楽だよ javaのデバッガよりつかいやすいよ。 eclipseも進化したのかな?
超初心者ですがお願いします。 I/Oに読み書きするのに、まずポートを開く関数を作って、そのなかで HANDLE hIOport = CreateFile(); とかやってハンドルを取り出しますよね。 このハンドルを今度、書き込みとか読み込みとかする関数に受け渡すのは どうやるのが定石なんですか? なんか、WinProcとかに受け渡すのがよくわからなくて、結局グローバルで 宣言して使ってしまってるんですが、それでも動くからいいんですかね? そこら辺が分かるようなコーディングの例とかあったら教えてください。
>>44 WinProcの中でstatic変数にしとく。
あまり凝ったことしても面倒なだけ。
46 :
デフォルトの名無しさん :2005/07/23(土) 10:08:44
PSPSDKを使ってPSP用のプログラムを作ろうと思っているのですが、
http://d.hatena.ne.jp/yaneurao/20050714 ↑ここにある
http://yaneu.com/yaneurao/hatena/hellocpp050710.zip これをmakeすると
リンク時に
psp-gcc -I. -I/usr/local/pspdev/psp/sdk/include -O2 -G0 -Wall -L. -L/usr/local/
pspdev/psp/sdk/lib src/cpptest.o yaneSDK/draw.o -lpsplibc -lstdc++ -lpspdebug
-lpsplibc -lpspkernel -o testme.elf
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/crt0.o: In function `__e
ntrytable':
crt0.S:(.rodata.sceResident+0xc): undefined reference to `module_info'
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:69: undefined reference to `_
impure_ptr'
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:70: undefined reference to `_
impure_ptr'
中略
/usr/local/pspdev/lib/gcc/psp/4.0.0/../../../../psp/lib/libstdc++.a(vterminate.o
):../../../../libstdc++-v3/libsupc++/vterminate.cc:51: more undefined references
to `_impure_ptr' follow
というエラーが出てしまいます。
module_infoや_impure_ptrというのはどういった役割を持ったものなのでしょうか?
47 :
デフォルトの名無しさん :2005/07/23(土) 22:50:30
spawn関数が使えない環境で、spawnlpと等価な機能を実装するにはどうすれば いいのでしょうか?
環境による
>>46 シンボルは libc のものだと思う。少なくとも _impure_ptr はそう。
最初の -lpsplibc が余計なんじゃないか?
元々が環境依存じゃね?
51 :
デフォルトの名無しさん :2005/07/24(日) 03:29:57
int *p, a=2; p=&a; これで*pでaを参照できるけど 関数のとき void fly(&a,&b) で呼び出して 呼び出された関数がvoid fly(int *a,int *b) になるけど前に書いた*pで値だからアドレスを渡すなら void fly(int a,int b)だと思ったんですけどなんで(int *a,int *b)に なるか教えてください
>>51 > *pで値だからアドレスを渡すなら void fly(int a,int b)
意味不明。なんで void fly(int a,int b) になるのかわからん。
とりあえずポインタの意味、宣言、使い方を勉強しなおせ。
あと日本語下手すぎ。
書き込む前に読み直して、自分以外の人でも理解できるかどうかよく考えろ。
句読点を使って、適当なところで文を切るように気をつけると良いよ。
>>51 変数宣言は式の中で*aするとintになるからint *aというように覚えるが吉。
54 :
デフォルトの名無しさん :2005/07/24(日) 09:15:10
二次元配列にアクセスする際、 例えば、 for(int i = 0; i < SIZE; i++) { for(int j = 0; j < SIZE; j++) { sum += array[i][j]; } } とするほうが、 sum += array[j][i]; とするよりも速い気がするんですが、これはなぜですか? それとも気のせいでしょうか。
>>54 メモリの位置関係を見れ
キャッシュがあるCPUなら(ry
指定したファイルを実行する関数みたいのってない?
ある
>>56 C++なら<cstdlib>のstd::system()
>>54 [0][0],[0][1],[0][2],……[1][0],[1][1],[1][2],…
って感じに並んでるからさ。まぁイメージだけど。
諸事情により、C言語でクラス構造を実現したいのですが、 どこかにまとめページのような物はないでしょうか?
>>61 内容をざっと見ると、かなり面倒なやり方ですね…。
とりあえず、熟読してみます。
ありがとうございました。
まぁ面倒なのはしょうがねぇさね そのための言語じゃないんだからな
しかしCのコードを吐くC++コンパイラを探したほうが楽かもしれん。
66 :
60 :2005/07/24(日) 17:45:01
>>61 を参考にして、自分なりに考えてみました。
・メンバ関数 → 構造体内部に関数ポインタ(コンストラクタで指定)
(instance->method() みたいに書ける)
・private → ソース内でstatic定義
・public → ヘッダor構造体内に記述
・継承 → 構造体をネスト(ベースクラスを一番上に)
・オーバーライド → 継承クラスで関数ポインタ差し替え
って、結局面倒な方法になってますがorz
もう少し検討してみます…。
>>64 素直にCライクな書き方でガシガシ書いた方がすっきりするのかもしれませんね…。
>>65 そのやり方もひとつの手ではありますが、デバッグが大変な気がします。
>>66 構造体に直接関数ポインタってのはオーバーヘッドが大きい。
C++そっくりの記法にこだわる必要はないだろうと思う。
非仮想関数は構造体名を付けて構造体へのポインタを第一引数にとる関数にし、
仮想関数も直接メンバに持たせず、メンバにはvtbl構造体へのポインタだけを持たせて、
vtblのメンバに関数ポインタを持たせ、vtblの実体はクラスに1つだけというようにすれば、
C++の実装と大体同じような感じになる。
って書いてからCOOLを読んだら同じことが書いてあった。
鬱ダ(ry
>>66 // T.h
struct T;
T* new_T(...);
void delete_T(T* this);
void T_dosomething(struct T* this);
// T.c
#include "T.h"
struct T
{
...
};
T* new_T(...) { T* this = (T*)malloc(sizeof(T)); ...; return this; }
void delete_T(T* this) { if(this) { ...; free(this); } }
void T_dosomething(struct T* this) { ... }
こうすると、Tのメンバを変更しても使用側の再コンパイルがかからなくてウマー。
ほぼ完全な private を実現できる。
仮想関数も T.c の都合で決めればいい。
ただしデメリットもある。
・生成にはほぼメモリの動的確保が必須、
・T.c にすべての実装をまとめなくてはならない
>>68 それもCOOLに同じようなことが書いてある。
>>69 サンプルコードでヘッダに定義が書いてあったんだけど、
文面でヘッダでの定義が不要なことが書いてあるね。ゴメン
71 :
66 :2005/07/24(日) 20:31:42
みなさんレスありがとうございました。 結局のところ、COOLでそのままコードを書くのが一番だということですね。 私の理解不足でした。 そういうわけで、COOLで少しコード書いてみます。
CでOOをまともに取り組んでるプロジェクトってあるのかね。 COOL見たいな物を考えるのは面白いけど、激しく生産性悪いよな。
73 :
72 :2005/07/24(日) 20:55:20
というか、多態か。Cでやる場合の一番の問題点は。
>>72 Subversion とか、似たような感じ。
保守性優先ってこともあるだろうが、生産性が悪いとも思わない。
C++に慣れてから、Cしか使えない環境に逝った時は自然にこうなる。
75 :
62 :2005/07/24(日) 21:17:29
マルチスレッド用のスレ見つけたのでそちらへ移動します。 失礼しました。
>>60-74 CのFILE *とかまさにこんな感じだろ。
こいつには仮想関数がない分すっきりしているけど。
77 :
デフォルトの名無しさん :2005/07/24(日) 22:23:50
CのプラグラムからJavaのプログラムを起動するにはどうしたら良いですか?
>>77 system("start java");
80 :
デフォルトの名無しさん :2005/07/25(月) 00:20:44
UNIXのCプログラム内でshellを起動して、そのリターンコードを 参照したいのですが、実現する方法ってありますでしょうか?
>>80 藻前はすぐ目と鼻の先にあるものも見えないのか?
82 :
偽80 :2005/07/25(月) 01:37:17
見えてたら質問しません。 んなこともわからないんですか?
お前は正直者なのか
>>80 環境依存の方法しかないぞ。
* systemの戻り値は 実 装 依 存 * ですから。
UNIXならexecとかspawnとかその辺だったと思う。
偽80
try { throw "error" ; } catch (string str) { } のように catch で string を受けるようにすると、コンパイルは通るのですが、実行時に落ちてしまいます。 BCC だと Abnormal program termination、VC だとランタイムエラー どの様にすればいいのでしょうか。ポインタや参照で受けても同様でした。
>>86 catch のマッチングには、派生クラスから基底クラス以外の暗黙の型変換は効かない。
その例だと throw string("error") または catch(char const* str) とすれば捕まえられる。
>>86 クラスを例外で受けるなら参照にするが吉。
関数の引数同様、いちいちコピーコンストラクタが発動してしまう。
89 :
86 :2005/07/25(月) 12:16:51
>>87-88 元コードを見直すとミスと勘違いが混じった質問でしたが理解が深まりました。
ありがとうございました。
90 :
デフォルトの名無しさん :2005/07/25(月) 15:57:17
入力されたコードから一致するデータを"c:\例題.txt"から取得する。 ※0が入力されるまで処理を繰り返す。できれば一度目の0入力に対応していただけると ありがたいです。 ---------c:\例題.txtの内容------- 1,あああああああ 2,いいいいいいい 65,ううううう うううううう 89,えええ えええ ええ 99,お願いします。 -------------------------- ↓↓↓↓実行結果↓↓↓↓ コード?65 ううううう うううううう コード? ↑↑↑↑↑↑↑↑↑↑↑↑ OS:Windows コンパイラ:gcc 言語:C
すれ違いです。 宿題スレへ。
つーかそんなこともできんようなヤツがプログラムしようなんぞ百億年早い
95 :
80 :2005/07/25(月) 21:38:15
>>84 返信ありがとうございます。
ただ、前述のsystem関数もexec関数もshellの呼び出しに成功すると制御が
戻ってこないため悩んでいます。
spawn関数というのは使ったことが無いのですが、/usr/include内見てもそれらしき
記述?が無いのでダメかもしれません。
>>95 その戻ってこないコードを晒して
あと環境も
>>80 これじゃダメ??
int main(){
int ret=0;
ret = system( "/home/hoge/test.sh" );
printf( "%d\n" , WEXITSTATUS( ret ) );
return 0;
}
98 :
デフォルトの名無しさん :2005/07/26(火) 09:21:45
JavaとC++ではどのくらい違いますか? そろそろネイティブ系も使ってみようと思っているのですが
主語も書けない奴がプログラムをするな
「プログラムをする」なんて表現する香具師が(ry
101 :
偽80 :2005/07/26(火) 10:57:28
はい、私インターネットできます。
お茶する?
ごまする
ユウジローの「するーズ」を思い出したのは 俺だけでいい
>>98 悪いことは言わん、そのままJavaやっとけ。
おれもVBスクリプトハッカーだからそろそろネイティブ系も使ってみるかな
漏れもHSPスクリプトハッカーだから(ry
HTMLとC++ではどのくらい違いますか? そろそろネイティブ系も使ってみようと思っているのですが
月とすっぽんくらい違います
112 :
デフォルトの名無しさん :2005/07/28(木) 07:45:29
銀河系とミトコンドリアぐらい違います。
ホットボンドと半田ごてくらい違います。
そもそもそれぞれ別世界です。
くだらないネタでスレを浪費するな
質問させていただきます。 C++にて p = new int [5][8]; と動的に多次元配列をnewできないかなと考えていたのですが、もちろんデフォではダメでした。 new のオーバーロードに手をつけようと思ったのですが、どうやら newは返り値がvoid* と決まっているようです。 JAVAのようなお手軽な多次元配列は作れないものでしょうか?
>>116 newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
で、どうするかというと、
int n = 8;
int *p = new[5 * n];
としてp[y * n + x]などと手動で指定したり、std::vector<std::vector<> >やboost::multi_arrayを使ったりする。
operator newの返り値がvoid *なのは、まだただのメモリの塊に過ぎないから。
そこへコンパイラがコンストラクタを動かして初めて何らかの型へのポインタになる。
(たとえintなどの組み込み型でも概念としてはそうなる)
寧ろ、配列に拘らずにクラス化しちゃえばいいんでない? class intArray2 { unsigned mx, my; int * ma; public: intArray2() : ma(0) {} intArray2(unsigned x, unsigned y) { mx = x; my = y; ma = new int[x * y]; } ~intArray2() {delete int[] ma;} int at(unsigned x, unsigned y) const {return ma[x + mx * y];} int & at(unsigned x, unsigned y) {return ma[x + mx * y];} }; #だったらmulti_array使えって言われそうな気がしてきた。
>>117 なるほど。ありがとうございます。
ついでといっては何なのですが、
>newだと最上位の要素数以外はコンパイル時に決まっている必要がある。
これでの記述の仕方はどのような形なのでしょうか。
想像するに
int *p[5] = new int [n][5];
とかかなと思ったのですが、うまく行きませんでした。
>>119 int (*p)[5] = new int [n][5]; //「int[5]」の配列[要素数n]
int *p[5] = new int *[n]; //「intへのポインタ」の配列[要素数n]
>>120-121 ありがとうございます。
int (*p)[5] = new int [n][5];
がうまくいきました。
int *p[5] = new int *[n];
のほうはダメみたいです。
私の書き方だと
*(p[5])だと判断されてしまうのですね。
>>118 それもおもしろいアイデアですね。
.lengthなども使えて便利になりそうです。
int **p = new int*[m]; for(int i=0;i<m;i++) { p[i] = new int[n]; } 面倒だけどこれでもいいんじゃなかったっけ?
アクセスにノウハウが必要なんてCじゃないんだから…… C++ならそういうどさ回りの仕事は隠蔽しようよ。
126 :
120 :2005/07/28(木) 10:52:56
>>122 スマソ
int *p[5]はint *の配列だった。使うとしたらこうだな。
for (int i = 0; i < 5; i++)
p[i] = new int[n];
俺みたいに最近の奴は Cを飛ばしてC++が普通だから この手の話題が苦手の奴が多いはずだ! int *p[5] ←なんだよコレ、つかわねーよこんなの
typedef int *PINT; PINT p[5];とint *p[5];は等価。
main(int argc,char *argv[])
>>129 そこは仮引数だからargvはchar **と等価。
>>124 それだと普通の二次元配列と同じレイアウトにはならない
まあC++ならvector<vector<int> >を使うかclass Matrixでも
定義するかだろ
>>132 それでも普通の二次元配列と同じレイアウトにはならない
そこでboost::multi_arrayですよ。
javaってこんなんできたっけ? p = new int [5][8]; cでいう int** p しか作れんのじゃなかったっけ
2次元目のサイズがばらばらってことね
#include <iostream> int main() { __int64 i64 = 1 ; for (int i = 0; i < 63; ++i) i64 <<= 1 ; std::cout << i64 ; return 0 ; } ↑これの出力結果が BCC 5.6.4 -'..--).0-*(+,))+(0( vctk -9223372036854775808 になります。BCC のバグでしょうか?
>>137 その for ループでは i64 は最終的に 0x8000000000000000 になる。
十進数に直すと -9223372036854775808。
何が不満なの?
>>139 読んでもわからんから、何が不満なのか訊いているんだが。
vctkでは正常に表示されるのに、BCCでは変な文字が表示されるのは何故か ってことだろ?
>>141 ああ、そういうことか。
・・・再現できねえ。
>>137 std::coutの実装が違うとしか答えられんな。
STLport導入しても同様の結果か?
VC6.0 + STLportならvctkと同じ結果だったが。
>>137 std::coutが__int64扱えてないっぽい (bcc5.6.4(BCB6) (5.6.0以降はSTLportが標準))
てかヘルプ見たらbasic_ostream::operator<<(__int64)自体が定義されてないもより
#include <iostream>
#include <vcl.h>
#pragma link "vcl.lib"
#pragma link "rtl.lib"
int main() {
__int64 i64 = 1 ;
for (int i = 0; i < 63; ++i)
i64 <<= 1 ;
std::cout << i64 << std::endl;
std::cout << IntToStr(i64) << std::endl;
std::cout << AnsiString().sprintf("%Ld", i64) << std::endl;
return 0 ;
}
結果:
-'..--).0-*(+,))+(0(
-9223372036854775808
-9223372036854775808
※IntToStrはint型/__int64型をBCB標準のDelphi互換文字列型(AnsiString)に変換するVCL関数
>>137 うちでもBCC5.6.4では同じ結果が出る。
>>143 BCC5.6.4のSTLはSTLport4.5.3のカスタマイズ版で、おそらく
_int64に対する ostream& operator<< のオーバーロードに
不具合があるのだろう。
じゃ自前でoperator <<を書いてみたらどうなるだろう?
147 :
デフォルトの名無しさん :2005/07/30(土) 00:36:09
C++でCのライブラリを使ってます。 ライブラリの1関数にCの関数を引数として渡す物があるのですが、 それにC++のクラスメソッドを渡すにはどう指定すればいいんでしょうか? そのまま渡すとコンバート出来ないとコンパイルでエラーになってしまいます。
>>147 無理。
そのコールバックに追加の引数を渡せる仕組みがあるなら、似たようなことは出来る。
>>147 型変換できないってエラーが出たんだから、型をあわせてやると良いよ。
>>147 staticなメンバ関数なら渡せるんで内科医?
>>148 え、無理なんですか?
>>149 型を合わせてもダメなんです。
関数でコンパイル通るものをそのままクラスのメソッドにしてます。
>>150 それはやってみましたが、ダメみたいです。
>>151 > 型を合わせてもダメなんです。
型を合わせたんなら「コンバートできない」なんて言われるわけ無いだろ。
非staticメンバ関数の型は見た目と違うから気をつけろ。
>>152 うーん、そうなんですか。
例えばvoid func(char* buffer, unsigned int length)
という関数を渡す場合だと、普通の関数ではそのままでOKで、
クラスメソッドにする場合は何かを付けないといけないのでしょうか?
よかったらそれを教えてもらえませんか?
>>153 例えば、そのfuncがclass testのメンバ関数だとすると、funcへのポインタの型は
void (test::*)(char *, unsigned int)
になって、
void (*)(char *, unsigned int)
とは違うし、前者を後者に変換することはできない。
>>152 がどういう意味で「型をあわせろ」と言ったのか知らんが。
>>154 どうもです。
やっぱり出来ないんですか。
他の方法を検討してみます。
ありがとうございました。
>>155 こんな感じ
#include <iostream>
using namespace std;
class A {
public:
void funcm(char* buffer, unsigned int length) {
cout << "A::funcm" << endl;
}
static void funcs(char* buffer, unsigned int length) {
cout << "A::funcs" << endl;
}
};
void func(char* buffer, unsigned int length) {
cout << "func" << endl;
}
void exec (void (*func)(char*, unsigned int)) {
char* buffer; unsigned int length;
(*func) (buffer, length);
}
A *ap (0);
void call_funcm(char* buffer, unsigned int length) {
if (ap) ap->funcm (buffer, length);
}
int main () {
exec (&func);
exec (&A::funcs);
A a; ap = &a;
exec (&call_funcm);
return 0;
}
157 :
デフォルトの名無しさん :2005/07/30(土) 08:36:53
Linux/gccで親プロセスからforkした子プロセスの標準出力/標準エラー出力を 取ろうとしているのですが、親から読み出そうとするときに止まってしまう時があります。 ファイルディスクリプタをfdopenで開いてfgetsで読み出してるんですが、その部分 で止まっているのでeofまで読めていないのかな、とも思ってるんですが…。 こういう時って、どうするのでしょうか?。UNIX依存の話で申し訳ないのですが、 どなたかご教授ください。 下にテストに使ったの最小構成のプログラムを載せます。
int main() { return 0; }
159 :
157 :2005/07/30(土) 08:52:31
160 :
157 :2005/07/30(土) 08:54:51
う、たびたびすいません。上のソースのmain関数内でexecに対して (標準出力/エラー出力を出すような)適当なコマンドを作って、実行用の 関数に与えています。
なんか無駄に難しくしている気がする。 FILE * fp = fopen("/bin/sh 2>&1", "r"); じゃだめなんだろか。 それはそうと、Unixプログラミングスレに行った方がよさそうだね。
>>156 ありがとうございます。
よく分かりました。
163 :
157 :2005/07/30(土) 10:53:03
ID変わってますけど、別PCからの投稿です。 > 161さん アドバイスありがとうございます。 UNIXプログラミングスレであらためて質問したいと思います。 ところで、これって何をやってるのか理解できない私なのですが、 > FILE * fp = fopen("/bin/sh 2>&1", "r"); shの標準出力とエラー出力を読むfpを確保しているのでしょうか。
164 :
157 :2005/07/30(土) 10:53:46
・・・ってここID出なかったのか。 ハズカシイ
ごめ、popen()だよ。 #いかんなぁ、頭がやられているらしいw
166 :
157 :2005/07/30(土) 11:04:09
> 165さん 標準出力と標準エラー出力を別々に読み出したいのでpipeを使っています。 popenだとそれはできない、という認識です。 ・・・う、不安になってきたのでpopenについて調べてみます。
漏れは >147 じゃないんだどさ。 「クラスメソッド」って言ったら C++ では static メンバ関数に相当するものじゃないの? 後、C の関数だと渡せるのに static メンバ関数にしたら渡せないなんてあり得るの? ソース見せて欲しい。
>>167 147の言うクラスメソッドは非メンバ関数のことだろ。
組み込み型って何ですか?
>>170 コンパイラ側で定義されてる型
char int short long float double等
char* c; c = "abc"; これは良いのに、 char* c; c = 'a'; これがだめなのは何故ですか?
任意型のポインタ DataClass::GetPointer(int iWhat) { switch(iWhat) { case WHAT_INT: return &m_int; case WHAT_CHAR: return &m_char; case WHAT_INTERFACE: return &m_interface; } } のような任意型を返す場合、templateは使えますか?
>>172 'c'はただの定数。ポインタに代入してどうする。
"abc"なら領域が確保されてchar *cがそこを指すポインタって事になる。
>>173 void*で返せばよくね?
>173 template による型の解決はコンパイル時の処理だから、実行時に型が変わる場合には対応できない。 動的に型が変わることがなく、インタフェースを統一したいだけなら template<typename T> T* DataClass::GetPointer(void); で、GetPointer<int>() みたいにはできるだろうが。 本当に任意型が欲しいなら boost::any でも使えば?
C言語での質問です。 system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので どう対応させたらいいのかで困っています。 一番素直なのは #ifdef WINDOWS sprintf(ss, "main.exe"); #elif defined UNIX sprintf("ss, "./main.exe"); #endif system(ss); なんですが#ifdef, #endifをいちいち入力するのは面倒です。 なにかいい方法はありませんか? すいません別件でもう一つあります。 system()をつかってあるプログラムを実行したいんですが、 そのときにバイナリデータを渡したいと思っています。 その方法として、ファイルにfwrite()でバイナリを一気に書いておいて 引数としてファイル名を渡そうかとも思ったんですが main関数にバイナリデータを渡す方法はありませんか? ファイルを通過させるとどうしてもIO時間がかかるのであまり使いたくありません。 渡したいデータは256バイト×2と決まっています。
>>176 >system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
winって"./"あるとまずいんだっけ?
>>176 >main関数にバイナリデータを渡す方法はありませんか?
popen
XPのプロンプトから type ./hoge.txt ってやったら構文エラーがでるようだ。 type .\hoge.txt なら通るけどな。system()の場合はどうだろうなぁ。
>winって"./"あるとまずいんだっけ? >'.' は、内部コマンドまたは外部コマンド、 >操作可能なプログラムまたはバッチ ファイルとして認識されていません。 といわれてしまいます。 popen()の紹介ありがとうございました。
system()でも"./"があると >179のようなメッセージが表示されてしまいます。
フルパスだと/で動く摩訶不思議
#ifdef WINDOWS #define PASS #elif defined UNIX #define PASS ./ #endif sprintf(ss, #PASS "./main.exe"); とか安易に考えてみたけど無理?
>>182 どうせやるなら
#ifdef WINDOWS
# define DIR "\\"
#elif defined UNIX
# define DIR "/"
#endif
system("." DIR "main.exe");
で委員ジャマイカ?
>>181 #include
だと/でいいんだよね
正直キモい
つーかLinuxのログインシェルかどこかでPATHの末尾に.を入れておけばいいじゃん。 #という無法を言ってみるテスト。
もうぜんぶ「/」にしてほすぃ
Apple-HFSはディレクトリ区切りが':'で'/'はファイルに使えるしなぁ。
キモ木彡
2バイト文字からマルチバイト文字に変換する標準関数(じゃないかも) が有ったはずですが、関数名教えてください。 wtombみたいな。
>>190 wctomb() / wcstombs()
「2バイト文字」じゃなくてwchar_tだけどな。
Windows上の実行可能ファイルのウィンドウ名とクラス名は バイナリエディタで書き換える事ができるのでしょうか? 実行可能ファイル中でウィンドウ名とクラス名の文字列そのものを 検索しても全くヒットしませんでした(´Д⊂
>>192 文字列だからそれをどう持っているかはそのソフトによる。
究極的にはバイナリエディタでできるはずだけど、何らかの暗号化をしている可能性もあるし、
UPXなどで実行ファイルが圧縮されている可能性もある。
194 :
デフォルトの名無しさん :2005/08/01(月) 21:27:56
Cで作れそうなものをC++で作ったら時間や負荷がかかるものなんでしょうか?
作る人による
>>194 仮想関数等の関係で多少増えるけど気にするレベルじゃない。
メンテや再利用等のメリットの方が遙かに大きい。
>194 メモ帳でできる文書を Word で作ったら時間や負荷がかかるものなんでしょうか?
>>183 その前にUNIXで.exeって気持ち悪いよ。
>>194 俺は常にC++だ。Better Cだ。C99相当の機能もある。
CにできてC++にできないことなどない。STLやiostream/basic_stringはかなり便利だ。
もちろんこんなときにはオブジェクト指向なんて使わない。
>>197 CとC++(OO抜き)の違いはメモ帳とテキストエディタ程度でしかない。
JavaやC#のほうがWordに近い、って言うとJavaやC#の人に怒られそうだ。せいぜいワードパッドくらいか。
やはりC++こそプログラミング言語のWordか。
>>198 実行形式拡張子の規定など無いのにexeが気持ち悪いとか言う方が気持ち悪いよ
>>200 規定があれば気持ち悪いなんて書かないよ。
どうしようも無いんだから。
203 :
デフォルトの名無しさん :2005/08/01(月) 23:54:06
204 :
デフォルトの名無しさん :2005/08/01(月) 23:55:19
↑ウインドウズxp使用しています
>>203 「メモ帳で次のように打ち込みます。」
って書いてあるけど。
メモ帳も扱えんのかお前は。
と、釣られてみるテスト。
スタート→すべてのプログラム→アクセサリ→メモ帳
207 :
デフォルトの名無しさん :2005/08/02(火) 00:13:45
メモ帳での設定完了しますた。
208 :
デフォルトの名無しさん :2005/08/02(火) 00:16:31
「コマンドライン リファレンス」って・・・ ヘルプで検索してみたけど見つからない・・・orz
ここはお前の日記帳じゃねえんだ
そうだ。俺の日記帳だ。
>>208 今時の若い者はコマンドプロンプトの使い方もわからないのか
わからない単語が出てきたら、まずは自分で調べろ。
説明書見るとか、ググってみるとか、いろいろ方法あるだろ。
それでもわからなかったらココに書け。
自分で調べもしないで人に質問するな。
というわけで
>>208 よ、まずは「コマンドプロンプト」でググれ。話はそれからだ。
213 :
192 :2005/08/02(火) 00:28:51
>>193 アリガトウゴザイマシタ(´∀`)ノシ
>>211 屁理屈も理屈なのであって、論破できない論理的弱者が使う言葉。
矛盾のない論理の世界に生きる人間であるプログラマが使う言葉では
ない。以後慎んだ方が自分の品位を保てるというもの。
始めから相手にしない方が自分の品位を保てるというもの。
品位なんて言葉を持ち出す事自体が品位の無い人間なのだよ
屁理屈を信じろ!屁理屈は無限の力だ!それを信じろッ!
お前のは屁理屈ですらない。 妄言。
確かに屁理屈には無限の力が秘められている。イタチゴッコとも言うが。
正確な理屈と不正確なTPO。
あるいは正確な理屈と、それとは実は何も関係ない個人の嗜好。
この組み合わせが屁理屈の肝だな。
>>200 は後者。
他にネタは無いのかね
>>222 気分の問題に正しいもくそもあるか
おまえはUNIXで*.exeでもつかっとけ
某所で見たプロセスはexexec.exeだったなぁ。
>>224 ちゃんと*をつけてるあたりがかわいらしいなw
227 :
デフォルトの名無しさん :2005/08/02(火) 15:40:56
「引数がUINTで戻り値がvoid」型の関数へのポインタをm_pFuncとし クラスのメンバ変数にしたいので、↓のように書きました。 private: void (*m_pFunc)(UINT); これは一応コンパイルを通りました。 (一応動いてはいるようですがこの書き方で正しいのでしょうか?) さらにこのポインタを別のクラスなどから取得する為に Get〜みたいな関数を作りたいのですが、どうやって書けばよいのでしょうか?
場違いでしたらすみません。 CからFORTRANのサブルーチンに生の数字を渡したいのです。 たとえば --main.c--- main{ fsub_(12); } --fsub.f--- subroutine fsub(i) write(*,*)i return end みたいに12という数字を代入なしに渡したいのです。 どんなもんでしょか。
>>228 あなたが使っているCとFortranの仕様はあなた以外に知らないのですから、
どんなコンパイラを使っているか、通常はどうやって渡しているか、などの情報無しには
何のアドバイスも得られないと思うのです。
#つーか、普通に渡せると思うんだけどねぇ。
231 :
228 :2005/08/02(火) 16:52:48
すみません、環境はfedoraのf77でコンパイルしてます。 f77 main.c fsub.f で出来たa.outを実行すると セグメンテーション違反になります。 うーーん、i=12;とか代入したものを渡すとうまくいくんですけど。。
>>227 typedefすれば使う側にとっても親切だしわかりやすい。
public:
typedef void (*Func)(UINT);
Func GetFunc() const throw() {return m_pFunc;}
private:
Func m_pFunc;
>>231 もう少しソースを晒せないかな。
i = 12; fsub_(i); なら巧くいくってこと?
そのiの型は整数型?
最早忘れたけど、Fortranって参照渡しだったっけ?
だとしたら、値を格納する場所が必要になるから即値を渡すことは不可能だね。
それだったらC++のconst参照を使えば即値を使えるんじゃないの?
235 :
228 :2005/08/02(火) 17:13:33
ソースは実装前のお試し用ですので228のまんまです。 int i; i = 12; fsub_(i); だとうまくいきます。 やっぱり代入必須っぽいですね・・。
>>235 そのfsub_のプロトタイプはどこかに{作った|生成された}のかな?
普通のCコンパイラなら、仮令一旦代入しても値を積んじゃうと思うけど。
#だから環境はできるだけ晒してくれた方が早いのさ。
237 :
デフォルトの名無しさん :2005/08/04(木) 05:17:23
>>232 ありがとうございました。
typedefしたら混乱しないで書けるようになりました。
ところでまた質問なのですが、
関数宣言の後のconst throw() っていうのが始めてみる書き方なんですが、
どういう意味があってどういう場合に用いるのでしょうか?
>>237 constとthrow()は別の意味を持つ。
constは、そのメンバ関数がconstなオブジェクトに対して使用できることを表す。
例えばgetterはオブジェクトを変更しないのでconstをつけるべき。こうしないと、
class foo {
int mFoo;
public:
int getter() {return mFoo;}
};
const foo bar;
bar.getter();
でこのgetter()が失敗する。
throw(リスト)はこの関数が投げる例外のリストを示す。
中身がないこの例ではgetterが例外を投げることがないことを保証している。
実際、getter内で例外を投げようとすると上でtryを張っていてもいきなりabortする。
239 :
194 :2005/08/05(金) 13:15:01
返事遅れました、すみません。 最近C++を勉強し始めたのですが、Cのほうが速いのだったらC++は使わないほうがいいかなと思ってました。 あんまり差がないそうなのでC++を引き続き勉強します。 ありがとうございました。
>>194 処理速度だけが問題ならC++どころかCも使わずにアセンブラでも使えばいい。
速度的に疑問の残るJavaやVBが実務に使われていることからも処理速度だけが問題でないことはわかるだろう。
寧ろ勉強中のレベルなのであれば、プログラミングを身につけるためには
処理速度云々で言語を選ぶべきではない。
241 :
デフォルトの名無しさん :2005/08/05(金) 15:52:40
テキストファイルの最終行を読み込む方法を教えてください。
テキストファイルの最終行を読み込めない方法を教えてください。
FILE* f=fopen("txt.txt","r"); char buffer[1024]; while((fgets(buffer,1024,f)!=NULL); fclose(f); printf("%s\n",buffer);
c++ の 1 つ目の + は何を表してますか? また、2 つ目の + は何を表してますか? c+ じゃいけなかったんですか?
Cを++(インクリメント)してるからC++なんです
cのバージョンが1上がりマスタ
でも後置インクリメントだと評価の時点では元のCと等価な罠
Cの性質も併せ持つ、という意味ではそのほうがいいカモ
だからC++はCとの最大限の互換性の確保に懸命だった。
++Cじゃなくて本当によかった
もう~cでいきます
誘導されてきました
行列の積を求めるプログラムを書こうとしたが、コンパイルエラーが出てしまいます。
46行目で変数宣言できないと言われ、かつ定数式が必要と6つも出てきた…
OS:XP
言語:C
コンパイラ:BCC です。
タダのコンパイラではやはり無理なのでしょうか?
アルゴリズムについてはせめないで。。
ソースはこちら:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/843.txt 『C言語なら俺に聞け! Part111』 の
>>817-830 あたりの質問:
825 名前: デフォルトの名無しさん [sage] 投稿日: 2005/08/05(金) 23:20:24
>>818 malloc でビープ領域に作られた領域のアドレスが帰ってきて、
それをどうやって後で取得する l と m と n に関連付けるのか、実際の運用方法が分からない。。
malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?
Parray=malloc(sizeof(なんちゃら));
みたいにやるのか?
どなたか丁寧にお教えください〜
>252
向こうで答えてくれてる人がいるぞ。
あと、FAQ 嫁。
ttp://www.kouno.jp/home/c_faq/c6.html#16 ×タダのコンパイラではやはり無理なのでしょうか?
○C99非対応のコンパイラでは無理
向こうで gcc 使えって言われなかったか?gcc はタダだぞ?
>malloc の引数は領域のバイトサイズだけど、配列の大きさが決まらないうちは使いようがないのでは?
配列の大きさが決まった後に malloc すればいいんじゃないかな?ないかな?
つーか
>int a[l][m],b[m][n],p[l][n];/* ここが46行目 */
の時点で配列の大きさ決まってるだろうが、ぼけが。
あと while(1) の意味の無さっぷりに感動したことは付け加えておく。
>>253 マルチしてる奴に答えるな
あっちこっちに書けばいっぱい答えが返ってくると勘違いするだろ
自演乙。
(´ー`)┌
>>259 すみませんコンパイルの仕方がわかりません…
でもヘタにスコープネストしまくるよりgotoのほうがスマートな時もあるお><
VIPPERはgotoがお好き☆
しまった名前消し忘れた
>>260 コンパイルも分からんとよく書いてるな・・・
class Vector { private: union { __m128 v; struct { float x; float y; float z; float w; }; }; public: ・・・ }; error C2146: 構文エラー : ';' が、識別子 'v' の前に必要です。 error C2501: 'Vector::__unnamed::__m128' : 識別名を宣言するのに、型が指定されていません。 error C2501: 'Vector::__unnamed::v' : 識別名を宣言するのに、型が指定されていません。 __m128 v;をfloat v[4];にするとなぜか通るんです。 どうしてでしょうか?
エラーメッセージすら読めない池沼には 何を言っても分かるまい
>>267 ごめんなさい。忘れてました。
VC2003です。
__m128の定義をおしえてくれー 答えようがない
ググったら速攻で出てきたというのに、まさに
>>268 だな
>>268 >>270 読んでますよ。
要は、コンパイラは__m128が定義されていないと思ってるってことですよね。
でもVC2003において__m128は基本データ型と同様に使用可能なはずですよね。
ためしにクラス定義の直前に適当な構造体を定義して__m128 v;と置き換えても
ちゃんと通りました。
>>271 __m128はSSEで使用する128bitのデータ型です。
>>273 #include <xmmintrin.h>
ところでfloat x にはどうやってアクセスするんだ?
277 :
276 :2005/08/06(土) 21:42:06
あ、いけるんだ。しらんかった。
>>277 どうやら無名共有体と同じように普通に外からアクセスできるようです。
ヘッダでの定義を書いて欲しいよー と思っているうちに自分で探してきた // data_types__m128.cpp typedef struct __declspec(intrin_type) __declspec(align(16)) __m128 { float m128_f32[4]; } __m128; よくわからんがきちんと定義ファイルをインクルードしてるか? あとさあ、struct {}のタグ名ってかかないのか?
>>279 Cでは不要。C++では必要になる場合もある
親切な人(=できる人[俺定義])はタグ名を書く
ぶっちゃけ自分で見てて気持ち悪いから書いてる
>279 >あとさあ、struct {}のタグ名ってかかないのか? え? 書いてあるじゃん。
タグ名に怪しい名前( _tag〜 とか)を使う悪習をひきずってるやつも多いが、やめて欲しいな。
285 :
デフォルトの名無しさん :2005/08/07(日) 00:50:52
cでの質問ですが たとえばヘッダファイルで struct foo{ char name[64]; int data; } baa; struct foo{}を定義しているヘッダファイルをインクルードしておいて struct foo baa; size_t tmp; tmp = sizeof(baa.name); 上と同じような事を関数にstruct foo型の構造体を引数として渡さずに、 関数内でもstruct foo型の構造体を宣言せずにbaa.nameのサイズを取得する方法はありませんか?
まったく使わないのは無理だな。 単にメモリを無駄に使いたくないというなら、 struct foo *p_foo; size\t size = sizeof(foo->name); でいけるんじゃねーかな。ポインタ分のメモリは必要だが。
>>285 関数ってどんな関数だよ。
想像で
要するに
文字列に対して何らかの処理を行う関数を作りたい。
サイズを得る必要があるらしいから、書き込みの操作。
えっとね、素直に関数の引数にchar配列のサイズを渡してやりなさい。
呼び出し側でsizeof使ってやればよし。
#define N 64 struct foo{ char name[N]; で我慢
一応これでサイズ取れるけど。 int size = sizeof(((struct foo*)0)->name); 処理系によってはアクセス違反で落ちるか? VC7は平気だった。
ヘッダ非依存のコード書きたいって言ってるんだから構造体に依存しない汎用の文字列操作関数を作りたいんだろ。 そのへん意味茄子。
つか普通は void func( void ) { struct foo a; printf( "%d\n", sizeof(a.name) ); } としてもaはpushされないよ。 気に入らないと言われたらそれまでだが。
構造体に依存しないのではなく、構造体の実体を使わずにとも読める。
>>289 通常sizeofでサイズ取るだけなら実際にヌルポインタに対して読み書きの操作は発生しないから平気だわな。
>>285 compound literalが使えるなら使えばいいし、そうでない場合、
static struct f func(void); /* 架空の関数 */
printf("%d\n", sizeof func().name);
処理系によってはリンクエラーになるかも。
difftime関数は秒単位までしか計算しませんが、ミリ秒単位までの精度を出したい場合どうすればよいのでしょうか? 出来るだけ、OS依存にはしたくないのですが。
clock まあ、できるならOS依存とか難いこといわずにマクロで切り分けてQueryPerformanceCounterつかっとき。
486ユーザーですg(ry
>>285 の件だが、
今までずっと
>>289 の方法しかないかと思っていた
(コンストラクタつきclassだと、
>>291 が使いにくい/使えない)が
どうやら
>>295 の変形で
extern struct foo bar;
printf("%d", sizeof(bar.name));
だと大丈夫っぽい。
VC,bcc,gccだと定数をpushしてるし、リンクエラーもでなかった。
300 :
デフォルトの名無しさん :2005/08/07(日) 14:06:29
今までLinuxのgccでしかプログラムをコンパイルしたことがなかったのですが、 急遽VisulStudioを使わなければいけなくなってしまいました。 そこで今一番悩んでいることがどうやって引数を渡せばよいのかということです。 試しに以下のプログラムを「開始」というのを選んで実行しているのですが、 もちろん引数を渡していないのでnullが返ってきます。 include <stdio.h> int main(int argc, char* argv[]) { printf("%s\n",argv[1]); return 0; } なんかアフォみたいな質問ですがマジでどうすればよいのか分かりません。 よろしくお願いします。
>>300 IDEのことなら「実行時引数の指定」とかそんなのがメニューにないか?BCBはあるけど
>>300 2003ならメニューバーのプロジェクトか、ソリューションエクスプローラからプロジェクトののプロパティを開いて、
構成プロパティのデバッグのところにある動作グループのコマンド引数から設定できる。
303 :
デフォルトの名無しさん :2005/08/07(日) 14:26:16
MSのコマンドラインから普通に使えるでしょうに カレントディレクトリまで移動しておけばいいじゃない
>>301-303 お蔭様でなんとか引数を渡す事ができるようになりました。
実行時に渡すのではなくて、事前に決めておくということですね。
勉強になりました。
305 :
デフォルトの名無しさん :2005/08/07(日) 14:36:08
ってかみんな凄すぎだな。 俺はさっぱりわからん。 独学で情報系でもないから 情報処理試験でも前期はのりこえても後期試験があと少しでおちちゃう。
ポインタ使うことの利点教えてくださいな 普通に変数使うのとどう違うんですか?
コマンドラインプログラムの出力を直接プログラムに取り込む方法はありませんか?
>>307 Windowsなら↓あたり
ms-help://MS.PSDK.1033/dllproc/base/creating_a_child_process_with_redirected_input_and_output.htm
>>306 関数にサイズの大きい構造体とか渡す時にポインタわたしの方が
サイズを小さく出来るので高速。例えばサイズが20バイト(sizeof(A)=20)の構造帯を
わたそうとしてもポインタなら整数と同じサイズで澄んでしまう。
但し、最適化を考えると、ポインタの多用は良くない。
コードを書く時の効率とか考えて適材適所で対応すべし。
popenのサンプルか何かはありませんか?
>>313 FILE * fp = popen("ls", "r");
char buf[200];
while (fgets(buf, sizeof(buf), fp)) {
fputs(buf, stdout);
}
fclose(fp);
>>315 便乗ですまんけどそれってWin32 GUIアプリでも利用可?
CreatePipe使ったいいサンプル探してるが見つからないorz
_popen()かもしれず。
_popenで見つかった(´ω`)
規制のため代理レスしてもらっています。 VC++.net2002でのtemplateについての質問です。 以下のようなクラスを書いて使おうとしたらリンカエラーがでます。 template使うのは初めてなので参考書を見てもどこが違うのか全くわかりません。 そもそもこの環境でtemplateが使えるのかすらわからない状態です。 どこをどう直せばよいのでしょうか? #pragma once template <typename T> class Hoge{ public: Hoge(void); virtual ~Hoge(void); void Test(void); }; #include "StdAfx.h" #include "hoge.h" template <typename T> Hoge<T>::Hoge(void){} template <typename T> Hoge<T>::~Hoge(void){} template <typename T> void Hoge<T>::Test(void){} _tWinMainの最初に以下のように書いたらリンクエラーがでます。 Hoge<int> hoge; hoge.Test(0); Test error LNK2019: 未解決の外部シンボル "public: __thiscall Hoge<int>::Hoge<int>(void)" (??0?$Hoge@H@@QAE@XZ) が関数 _WinMain@16 で参照されました。 Test error LNK2019: 未解決の外部シンボル "public: virtual __thiscall Hoge<int>::~Hoge<int>(void)" (??1?$Hoge@H@@UAE@XZ) が関数 _WinMain@16 で参照されました。 Test error LNK2019: 未解決の外部シンボル "public: void __thiscall Hoge<int>::Test(void)" (?Test@?$Hoge@H@@QAEXXZ) が関数 _WinMain@16 で参照されました。 Test fatal error LNK1120: 外部参照 3 が未解決です。
Hogeのメンバ関数等は全てヘッダに記述しる
>>321 ありがとうございます
おかげさまでできました
調査不足てした
>>320 お前のコンパイラはexport templateをサポートしているのかと小一時間
識別子が既にtypedefされたか調べる方法はありませんか。 #ifndef A_LABELみたいな。
C/C++ 標準内では無理なんじゃないかな。 1. 該当 typedef を行うヘッダでマクロを定義しておいて #ifdef 2. 1. でヘッダのインクルードガード用マクロで代用 3. Autoconf とか使って外部で判定してマクロ定義で切り替え 思いつくのはこんなもんだけど。
326 :
デフォルトの名無しさん :2005/08/08(月) 00:09:58
わざとその識別子で新しくtypedefしてみたら? すでにtypedefされてればエラーを出すと思うけど typedef int foo; typedef char foo; とかってしてみればいいと思うよ、多分だけど 結果教えてね
327 :
デフォルトの名無しさん :2005/08/08(月) 00:14:32
次の選挙で落選させなければならない議員のリスト1 自民党 河野洋平 神奈川17区 - 売国奴。中国の飼い犬。日朝友好議連所属。 自民党 野田毅 比例九州 ----- 売国奴。中国の飼い犬。外国人参政権推進。日朝友好議連所属。 自民党 加藤紘一 山形3区 ---- 売国奴。中国の飼い犬。 自民党 古賀誠 福岡7区 ------ 野中の子分。人権擁護法案推進。 自民党 野田聖子 岐阜1区 ---- 古賀の子分。人権擁護法案推進。 自民党 二階俊博 和歌山3区 -- 売国奴。中国の飼い犬。人権擁護法案推進。江沢民の石碑建立。
はいはいわろすわろす( ^ω^)
32ビットマシンではintは常に32ビットですか?
lsic86試食版は、32bit環境でもintは16bitです。
再帰呼び出しする関数を実行したいのですけど、とても時間がかかる事が分かっています。 そこで、日にちを分けて実行しょうと思いましたが、スタックを復元する方法が分かりません。 知っている方がいれば教えてくさださい。環境は Linux/gcc です。
>>331 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
どうしても24時間運転できない、サスペンドできない、などの理由があるなら、
計算過程を保存するようなアルゴリズムに変更すべきかと。
> 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。 もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが とりあえず待ってみます。
334 :
デフォルトの名無しさん :2005/08/08(月) 10:11:49
クイックソート スタック 位で検索すれば自前のスタックの作り方が載ってるでしょう。 がんがれ
335 :
デフォルトの名無しさん :2005/08/08(月) 10:17:18
一番簡単なのは 再起関数に与える引数を全部構造体でまとめておいて ファイルなりにfwrite(), fread()で書き込み、読み出しする方法じゃないかな
コアダンプさせてデバッガで再開とか。つまりがんばればできるんじゃないの?
>>331 ,333
>> 一般的に、OSが動的に管理するものを一アプリケーションに云々はできません。
>もちろん環境依存は承知です。絶対に無理というならアルゴリズム変更も考えますが
つうか、332は別に「環境依存どうこう」という以前の話をしているはず。
だいたい「スタックを復元する方法」がわかっただけで解決できるつもりなのか?
いわゆる core imageを取るのことや解析は簡単だが、
そこから実行を再開させるような能力を自分が持ってるつもりなのか?
「絶対に無理」とは言わないが、洗練された方法があるわけでなし、まず、
こういう質問の仕方程度の人には、まず無理だと思うが。
まあ、条件のつけかたやら何やら思いつきの域を出ない、
問題の立て方自体を間違えている。
TCP/IPを使った通信の勉強してるんですが、
acceptで10038のエラーコードが返ってきます。
参考にしているのは
ttp://www.geekpage.jp/programming/winsock/ なんですが、ここの通りにやっても10038が返ってきてしまいます。
クライアントではサーバーからのメッセージを受信できているので、
ソケットがうまく作れているものだと思っていたのですが、
10038がエラールックアップで
「ソケット以外のものに対して操作を実行しようとしました。 」
と出るので、わけがわかりません。
どうしてこうなってしまうのかどなたか教えてください。
よろしくお願いします。
ネットワークプログラミングを専門に扱っているスレッドを探して、そこで聞いた方がいいんじゃない?
あと、そもそも
>>338 が提示している情報が少なすぎる。
もっと具体的に、どうやってどうやった場合に10038が返ってくるのか書いて。
もしくはその部分のソースを提示するとよい。
>>331 スワップを十分にとって(Linuxだとスワップファイルが便利)
kill -STOP hoge
すると中断できる
使用頻度が低ければスワップアウトされる
再開は
kill -CONT hoge
ctrl+Zとfgで。(w
struct hoge { int x ; int y ; int z ; } という構造体をvectorにいれてソートしたいのですが、 vector<hoge> v ; //いずれかのメンバで、降順か昇順かで、ソートしたい sort(v.begin(), v,end(), ・・・) ; メンバの数だけ関数オブジェクトを作るのがあまりにもあほらしいと思うのです。 もっとスマートな方法はありませんか?
>>346 メンバへのポインタを関数オブジェクトに渡したらどう?
348 :
346 :2005/08/10(水) 08:58:32
>>348 class foo
{
int hoge::*mem;
public:
foo(int hoge::*mp) : mem(mp) {}
bool operator ()(const hoge& x, const hoge& y)
{
return x.*mem < y.*mem;
}
};
sort(v.begin(), v.end(), foo(&hoge::y));
350 :
346 :2005/08/10(水) 09:32:44
>>349 おお、すごい。
こんなことができたんですか。
でも、ひとつ分からないのですが、
//hoge構造体の中のint型へのポインタ
int hoge::*mem ;
ですよね?
.* これはどういう意味でしょうか?
>>350 メンバへのポインタでアクセスするための1つの演算子。
352 :
346 :2005/08/10(水) 11:03:39
>>351 なるほど、->*なんて演算子もあるんですか。
降順か昇順かの切り替えも、コンストラクタの引数で指定できました。
C++を覚えるために、いろんなことを試しているのですが、なんだかC++は、とても複雑すぎるような……。
struct hoge
{
int x; int y; int z;
double d ;
char str[32] ;
} ;
何度もすみませんが、
>>346 の構造体をこのように拡張して、これを各メンバでソートするために、
>>349 のfooクラスをテンプレート化してみたのですが、
hoge::strはどうすればいいのでしょうか。
ちょっと考えてみて、こんな風に特殊化してみたのですが
//
>>349 のfooクラスのテンプレート化
template<typename T>
class foo
{
//比較演算子を使った比較
} ;
//特殊化
template<>
class foo<char (hoge:: *)[32]>
{
//自分で定義した文字配列の比較をする、たとえばstrcmp()とか
} ;
sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::x)
もっとスマートな方法はありますか?
353 :
346 :2005/08/10(水) 11:04:41
×sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::x) ○sort(v.begin(), v.end(), foo<char (hoge:: *)[32]>(&hoge::str) ;
>>352 コンパイルできるかどうか試していないけどこんなのは?
template <typename T>
foo<T> create_foo(T mem_ptr)
{
return foo<T>(mem_ptr);
}
こうしたらsort()を呼ぶときに型を意識する必要がなくなる。
sort(v.begin(), v.end(), create_foo(&hoge::x));
356 :
355 :2005/08/10(水) 11:25:22
std::make_pairに合わせてcreate_fooからmake_fooにしたほうがいいな。
357 :
346 :2005/08/10(水) 11:51:07
>>355 VC7.1でコンパイル通りました。
これは使うときに楽ですね。
templateがらみのこういうテクニックはどうやって覚えればいいのでしょうか?
何かいい本とかありますか?
>>357 つ[C++ Templates(英文)]
応用してみた。 template<class T, typename V>struct hoge_equal : public std::binary_function<T, V, bool> { V hoge::*mem; hoge_equal(V hoge::*mp) : mem(mp) {} bool operator()(const T & x, const V & y) const {return x.*mem == y;} }; template<class T, typename V>inline hoge_equal<T, V> make_hoge_equal(V hoge::*mem) { return hoge_equal<T, V>(mem); } //hogeにはhoge(int,int,int);とprint(const hoge&)const;を追加済み bar.push_back(hoge(1, 2, 3)); bar.push_back(hoge(2, 3, 1)); bar.push_back(hoge(3, 1, 2)); hoge::print(*std::find_if(baz.begin(), baz.end(), std::bind2nd(make_hoge_equal<hoge>(& hoge::z), 3)));
360 :
359 :2005/08/10(水) 15:08:32
汎用にする過程の激しく半端なの載せちった。 template<class T, typename V>struct equal_to : public std::binary_function<T, V, bool> { V T::*mem; equal_to(V T::*mp) : mem(mp) {} bool operator()(const T & x, const V & y) const {return x.*mem == y;} }; template<class T, typename V>inline equal_to<T, V> make_equal(V T::*mem) {return equal_to<T, V>(mem);} って、make_equalもequal_to専用である必要ないなぁ……
>>346 素直にboost使えば?
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
using namespace boost::lambda;
std::sort(v.begin(), v.end(), bind(&hoge::x, _1) < bind(&hoge::x, _2));
362 :
346 :2005/08/10(水) 16:53:12
>>361 boostも面白そうですね。
いままでtemplateをほとんど理解していなかったから、
boostも理解できなかったんです。
でもこれ……本当にC++のコードなのか疑問に思えてしまいますけど。
>bind(&hoge::x, _1) < bind(&hoge::x, _2)
文法上は正しい。 演算子が再定義されてはいるが。 boost::assignのサンプルも最初見たときなんじゃこりゃと思った #include <boost/assign/std/vector.hpp> #include <vector> using namespace boost::assign; using std::vector; vector<int> v; v += 1, 2, 3, 4, 5, 6, 7, 8, 9;
mallocがメモリを取ってくる「ヒープ」領域と ヒープソートの「ヒープ」ってなんか関係あるんですか?
>>364 同じ単語だけど、とくに関係はない。
前者は、「メモリのかたまり」という感じ。
後者は、「データが山の形になっている」という感じ。
>>365 ありがとうございます。
追加で聞きたいんですが、mallocがヒープからメモリを取ってくる過程ってどうなってるんですか?
メモリがフラグメント化していた場合、どうやって大きな領域を確保するのかとか...
もちろんシステムによって違うんでしょうが、一般的な場合が知りたいんです。
このネット上のドキュメントとかあの本を参照しろ、でもいいのでお願いします。
>>364 ヒープってのは辞書引くと積み重ねたものとかそういう意味が出る。
>>366 単純な構造で実現しようとするなら、デフラグは出来ない。
なぜなら、デフラグを行うと使用中のメモリ内容が移動してしまい、それに合わせて
プログラム内のすべてのポインタ変数を新しい正しい値に書き換えなければならない。
当然これは無理。せいぜい隣り合った空きエリアをくっつけるだけしかできない。
いまどきのOSは仮想メモリシステムを採用している。OSだけじゃなくチップレベルで
サポートしていたりする。ということは我々がプログラムで使っているポインタ(アドレス)
は仮想のものであり、物理的なメモリ番地とは直結しておらず、対応表を使って対応付
けられているだけ。ということは、物理メモリ上のデータを移動したとしても、それを追随
するように仮想アドレスと物理アドレスの対応表を書き換えるれば、あたかもデータの
移動は発生していないかのように見える。仮想メモリシステムの上でならメモリのデフラ
グも可能になる。
具体的には仮想メモリシステムの実装を調べてくれ。簡単な話じゃないよ。
仮想記憶を有効に使うために ライブラリ内でのヒープをページ単位でしか取得できないようにするスレはここですか?
>>369 物理メモリをデフラグできても、仮想アドレスに連続した空きがないと確保できないという罠。
英語じゃん 分かりにくいってレベルじゃない 分からないレベルだ
むー、今PSDKのmallocのソースみたら、本当にHeadAllocをただ呼び出してるだけなんだね。 HeadAllocは大きなメモリブロックの確保に使ってるだけかと思ってた。 ちなみにBCBでは独自管理してる(大きさ別に処理を分けている)。 メモリ確保のアルゴリズムにも ファーストフィットとかベストフィットとかがあるので どうやっているかは、まさしく実装依存。 で、実際にはmallocのソースを読むのが早い。 サンプル程度なら、 ・K&R ・Cプログラマのためのアルゴリズムとデータ構造 ・EffectiveC++(moreかも) で読んだ覚えがある。 ちなみに、OS(カーネル)がどう管理しているかとかページ単位がどうというのは CRTが管理しているヒープのフラグメントとはあまり関係ない話だから。
1度なら打ち間違えと見逃すが2度もHeadAllocと打つのは何か意図してのものなのか、とつついてみるテスト
なぜこんなタコな間違いをしたのか、俺にもわからん。 頭の中ではHeapAllocのつもりだったのだが。
HipAlloc
HeadLock
Rock54 さくらが咲いてますよ
381 :
366 :2005/08/13(土) 10:44:35
基本的にはフラグメント化しても、単に十分な空きを探すんですね。 で、仮想メモリはコンパクションしたりしてそれを助ける、という感じですか。
どの処理系を言っているのか知らんが、 x86のWindowsだと仮想メモリのコンパクションはできないと思うんだが……。 フラグメント化というか、仮想メモリさえ連続していればいいわけで。
ページングを使っているから、そもそもデフラグメントも糞もないと思うんだが。
384 :
366 :2005/08/13(土) 14:25:39
仮想メモリを使っているOSなら、mallocしたときにファーストフィットとかベストフィット
といった空き場所探索はしない。
仮想メモリを使って対応付けているなら、物理メモリがフラグメント化していても問題ない。
大きな領域を確保する時でも、物理メモリ上で連続しているとは限らない。
これであってますか?
>>373 のリンクは難しすぎます...これは、ここでの話を理解するのに必須なんですか?
>>384 そう。あと物理メモリが確保されるのは、実際に使われるとき。
ヒープだけど、Windowsでメモリの確保は常にページ単位(x86なら4KB)で行われる。
でも、実際のプログラミングの際には、4KB単位でしか確保できないなんて面倒でしょ?
1バイトのメモリを確保しようとすると、もれなく4095バイトものおまけメモリがついてくる。
もちろん、そのまま使うこともできるけど、かなり無駄。
しかし、現実には、数十バイト、数百バイト単位で、なるべく無駄なくメモリを確保したい。
じゃあどうすればいいかというと、
メモリを確保するときは4KB単位で確保しておいて、
実際に使うときに、欲しいサイズ分だけ小分けにして使えばいい。
で、VC++のmallocが呼び出しているHeapAllocはこれを自動でやってくれる。
某ランドのCコンパイラは自前で実装しているんだったかな。
386 :
385 :2005/08/13(土) 15:25:44
>mallocしたときにファーストフィットとかベストフィットといった空き場所探索はしない。 見落としてた。 VC++のmallocは、「多分」している。 ページ単位で確保したバッファの中から、要求された長さのあいている空間を返すわけだから。 実際にはMSはヒープの実装を公開していないから、これは明言できない。 メモリの使用用途はどんどん変化していくから、OSごとに違った実装になる。 95の時代だと、一般的なPCの物理メモリは数十MBだったけど、 いまだとGB単位も珍しくないからね。
いま言ってるのって alloc数回の結果ページが10単位取られたけど freeの結果各ページ1バイトしか使ってないような状態になっちゃって そこに新しいalloc(ページ9単位)の要求がきた時どうすんねんって話じゃないのけ?
うん、フラグメントの結果、(今現在管理しているメモリでは)充分な連続した空き領域が確保できない場合のことだよね。
なんか勘違いして仮想記憶とかその辺の話にしようとしている人がいるけど
その方面の話はちょっと方向違い。
この、「フラグメントが起きた状態」からは、アルゴリズムも糞もない。
単に確保できないだけだから。
で、連続して確保できない場合は、結局、OSから新たにメモリブロックをもらって
そこから切り出すしかないわけ。
もちろん、OSがくれなかったら、NULLを返すなりbad_allocを投げるなりするんだけど。
ベストフィットやファーストフィットというのは、「いかにしてフラグメントを起きにくくするか」を、速度との兼ね合いでどうするかという、ポリシーの問題ね。
たとえばWindowsXPのHeapAllocは、このポリシーをユーザーから設定できるらしい。
http://www.geocities.jp/i96815/windows/win11.html
sftpを扱いたいのですが、何か良いライブラリはありませんか?
>>389 その前にネットワークプログラミングがちゃんと理解できる?
関数1-2個でポンという訳にはいかないよ
C++Builderで組んでいるので、Indyの様な物があれば一番良いのですが
392 :
366 :2005/08/14(日) 10:22:29
>>385-388 物理アドレスは解放後再利用する必要がありますが、仮想アドレスは解放しても再利用の必要はありませんよね。
それはHeapAlloc、HeapFreeの場合でも同じに思えたのですが。
だから
>>366 では「仮想メモリ上でフラグメントが起きても、わざわざ仮想アドレス上で隙間を探す必要はなく、
まだ手を付けていない仮想メモリ空間を使用すれば良いだけだ」と考えたんですが、それでは駄目なんでしょうか?
「メモリアドレスの型の制限で1プロセス仮想で4GBまでしか使えない」ってところがネックになっているんでしょうか。
えーと、もしかして HeapAllocの呼び出しの度に、カーネルモードに移行して ページテーブルを設定して、CR4を読み直してTLBをフラッシュして・・・ ということが行われていると思っていますか? HeapAllocはもちろん、普通のmallocも、 実際に自身が管理しているメモリで足りないという事態が起きない限り OSに対してメモリブロックは要求しないし、だからカーネルモードへの移行も起きないし、当然ページテーブルも仮想記憶も何の関係もないのですよ。 OSからのメモリの獲得は重い処理なので、それを軽くするためにユーザー空間で malloc等がメモリブロックを管理しているんですよ。 この辺はわざわざOSの本を読むまでもなく、K&R等にも書いてありますが。
>>391 無い、RFCとにらめっこするしかない
素直にソケット使いなさい
クラスAの中からクラスBのメンバ関数をよびだしたい。 また、クラスBの中から、クラスAのメンバ関数を呼び出したい。 こういうときはどうすればいいんでしょうか。 class A { B *b_ptr ; } ; class B { A *a_ptr ; } ; これは無理ですよね。 どうすればいいんだろう。
いや、出来るでしょ。
先行宣言
>>396 これでいい。
class B;
class A
{
B *b_ptr ;
} ;
class B
{
A *a_ptr ;
} ;
この質問は未来永劫続くのかね。
401 :
396 :2005/08/14(日) 12:58:01
402 :
331 :2005/08/14(日) 15:11:02
お願いします。linuxです。 typedef struct{ short a; short b; }test_str int main() { test_str g; int k; g.a = 0x1234; g.b = 0x5678; memcpy(&k,(int*)&g,sizeof(int)); printf("=>%x\n",k) } 実行 =>56781234 本来は12345678を期待しています。 構造体のメンバの順番が入れ替わってしまうのはどういう現象なんでしょうか? ググルにも現象名がわかりません。 教えてください。
404 :
デフォルトの名無しさん :2005/08/16(火) 16:27:17
ディレクトリがすでに存在するかどうかを調べるにはどのようにしたらよいのでしょうか?
>>405 ありがとうございます。
リトルエンディアンはデータ通信時だけ発生するものと思い込んでいました。
ハァ? リトルエンディアンって・・・
?
>>407 現在のPCなら普通リトルエンディアンだぞ
リトルエンディアンって上位バイトと下位バイトの格納方式でしょ? typedef struct{ short b; short a; }test_str; で>403の望む結果にならない?
ダウンロードしたソースに int TextInfo(char *file, int flag, const char *format,...) って関数があったんですがchar* formatの次の.....ってなんですか? はじめて見るんですが、引数になるんですかこれ?
>>412 可変長引数。
printfの関数宣言見てみ。
printf("=>%x\n",htonl(k)); 結果 =>34127856 リトルエンディアン様様だね
>413 レスありがとうございます さっそく調べてみます
>411 それで?
>>415 ついでに
va_start、va_arg、va_endも調べておくと吉
421 :
403 :2005/08/16(火) 18:50:18
混乱しています。 test_str g:のデータはメモリ上 78563412の順で配置されているんですよね。 それが何故 56781234になるのですか?
>>421 違うね。
メモリ上は 0x34 0x12 0x78 0x56 だ。
だから下から順に 0x56781234 となる。
>78563412の順で配置されているんですよね。 ノン。56781234。
424 :
423 :2005/08/16(火) 18:55:57
425 :
403 :2005/08/16(火) 19:03:29
>>422 さん、423さん
メモリ上は 0x34 0x12 0x78 0x56なんですね。
TPつくって確認しました。
もしもint a=0x12345678をメモリに格納する場合は
0x78,0x56,0x34,0x12となるんですね。
typedef struct{ uint16_t a; uint16_t b; } test_str = {0x1234, 0x5678}; と uint32_t test32 = 0x12345678; ではメモリ上のデータ並びが違うぞ。 エンディアンは組み込み型にのみ適用される。 構造体のメンバがひっくり返ることはない。
428 :
403 :2005/08/16(火) 19:22:14
>427さん なんとなく理解できたので、復習して完璧にします。 ありがとうございました。
>>428 ,403
今更だが、もともと安易に人に聞くより、自分でdebuggerや次程度の
サンプルでちゃんと確認できるし確実なだけの話のはずだ。あほらし。
void dump2(void *v, int sz)
{
unsigned char *x = v;
printf("#%0x:\t", x);
while (--sz >= 0) printf(" %02x", *(x++));
printf("\n");
}
inta = 0x12345678;
intb = 0x78563412;
main()
{
printf("= 0x%0x\n", a);
dump2(&a, sizeof(a));
printf("= 0x%0x\n", b);
dump2(&b, sizeof(b));
}
430 :
403 :2005/08/16(火) 19:58:38
>>429 さん
口は悪いが、すごい親切です。かこいいです。
ありがとうございます。
検索キーワードは「バイトオーダー」な。
構造体へのアクセス演算は実行時の負担になりますか? インスタンスが1つなら、 the_cat.age = 4; the_cat.sex = MALE; とせずに、 int the_cat_age, the_cat_sex; と宣言してから the_cat_age = 4 the_cat_sex = MALE; とした方が速いのでしょうか?
433 :
デフォルトの名無しさん :2005/08/16(火) 21:45:43
バイナリファイル内に 「1234567890」 のような数字が入っていて、これを特定のテキストファイル上に 「123,4567,890」 のようにCSV処理して出力するコマンドを作りたいです。 コマンドの引数として、定数名のようなものを指定することで 別のファイルの定数一覧からカンマを挟む箇所の文字数(上の例だと「3,4,3」)を受け取って 処理するようにしたいと思っていますが、どう作っていけばいいのか分かりません。 どんな感じで作る物なのか、ヒントかもしくは 参考にしやすいサンプルソースを見れるサイトがあったら教えていただきたいです。
>>433 あっちこっちに書き散らす前に、自分がみんなのレスの何を判っていないのかきちんと整理しよう。
あんたの言うバイナリファイルがどういったものなのか、だれも理解できていないのだが
それはあんたがバイナリファイルとはどういうものなのか判っていないからだとは思わんのかね。
>>432 気にするな。
どうしても気になるならアセンブリ出力を見よ。
436 :
デフォルトの名無しさん :2005/08/16(火) 22:29:08
>>434 その通りです。
バイナリというのは、「コンピュータが扱うためのデータ」だと思っていました。
上の質問だと、「数字を表すコードが入っている」
というわけではないんでしょうか?
C言語なら俺に聞け!スレから
「初心者向けのスレに行った方が良い」ということでこちらに来ました。
向こうのスレの話では「バイナリダンプ」と言うらしいですが、
どういう物の事なのか、よく分かりません。
>>433 次のソースをコンパイルして出来た実行ファイルに、君の言う「バイナリファイル」
とやらを指定して実行して出力を見せてくれ。
#include <stdio.h>
int main(int argc, char *argv[]) {
int c;
FILE* fp = fopen(argv[1], "rb");
while ((c = fgetc(fp)) != EOF) printf("%02X", c & 0xFF);
return 0;
}
>>436 誘導されたら黙って移動するのではなく、ちゃんと挨拶しとけと。
あっちにもレスがついてるぞ。
439 :
デフォルトの名無しさん :2005/08/16(火) 22:52:00
>>437 すみません、元になるファイルは会社にあって、
今実行することが出来ません。
元になるファイルにどういうコードが入っているのかを確認できるプログラムなのでしょうか?
>>438 むこうの>400で挨拶はしたつもりだったのですが・・・
若干名、質問者がテキスト形式で数字の文字列が入っているファイルを バイナリファイルだと勘違いしている、筈だと、思い込みたい人がいるみたい なので余計話が混乱している。 つうか、曲解されるかどうかはともかく、 >バイナリファイル内に >「1234567890」 >のような数字が入っていて、 なんて書き方ではあなたの理解程度が怪しいとしか思えなくて、 設問の意味が曖昧にしか伝わらないのよ。コミュニケーション不能。 >どう作っていけばいいのか分かりません。 だいいち、こんないいかげんな質問だと、まともにプログラム経験あるのか不安。
441 :
437 :2005/08/16(火) 22:56:24
>>439 そう。手元にないならどうしようもない。会社が始まるまで待ちな。
>>435 アセンブリで見てみました。といってもよくわからないのですが。
構造体にアクセスするとポインタ演算が余計に入っちゃうみたいです。
正確な計測法がわからない(unixコマンドのtimeで計測)上、
一度キャッシュに載ると馬鹿速くなるのでますますよくわからないのですが、
構造体を使うとかなり遅くなってるみたいです。
この辺、正確なところがわかる方がいたら教えてほしいです。
構造体のグローバルなインスタンスを使って状態管理したいと思っているんですが、
その際かなりアクセスが頻繁になるのでオーバーヘッドがあると思うと不安です。
>>442 アセンブリを見て「よくわかからない」とか言う奴にその辺りを教えるのは無理(或いは無駄)。
前後の処理によってかわるからなんともいえない。 ただ処理が重くなるような文脈なら、多分最適化がかかるし、 重くもない処理なら気にするだけ無駄な差にしかならないだろう。
×わかからない ○わからない
>>443 一般的に言ってオーバーヘッドがあるのか、ないのかということが知りたいんです。
できればじっくり学習したいので、アセンブリがわかったとしてどういうことなのか
示していただければ幸いなのですが(わからなければそれを頼りに自分で調べます)、
説明が無理なのならせめて結果だけでも教えて欲しいです。
>>446 一般的には、最適化を考慮すると周りの状況に大きく左右されるので、
オーバーヘッドがあるのか、ないのかという答えにはならない。
>>432 のコードなら、よーいドンで実行すると構造体アクセスのほうは
メンバ変数のオフセット計算があるので変数単体より遅くなる
そんなに速度が気になってグローバル変数でもよいなら
変数単体にすればいいだけの話
>>446 実際にオーバーヘッドが問題になってるの?
「あると思うと」っていう、のがすごく気になるんだけど。
アクセスが頻繁になる部分だけ、ポインタで置き換えるなりなんなりしてみれば?
毎度インデックス計算するアホコードよりはいいが、最適化されれば同じことだ。
451 :
450 :2005/08/16(火) 23:45:06
>単純な例を書いたから見てくれ。 >処理が複雑になれば、ほんとにゴミにすらならない差だ。 ってかいたつもりが抜けてたので、付け足しておきます。
ま、Pentiumはアドレッシングは強力だから、 先のは1クロックの差も無いわけだが。
>>450 ありがとうございます。
これ、まったく差はないんじゃないんですか?
インストラクション数は同じだし、
_x+4というのは変数?の名前であって実行時に4バイト増やしてるわけじゃないですよね?
でも結局、関数に渡す際にスタックに積んだら毎回ポインタ演算するんじゃないかと心配です。
ちょっと、色々吐かせて調べてみます。
>>450 みたいな吐かせ方がわからないんですが、
どうやるんですか?単に-Sだともっとごちゃごちゃしてるんですが...
じゃあ、構造体使うのやめろ。
関数渡しのスタック積むから云々なんて関係ないだろ。 データ取るときはいつも movl _x+4 だ
そんなにコードジェネレータのお仕事が気に入らないならアセンブラで組めば良いことさ
てか、構造体はグローバルっていってなかったっけ? 最初。
>>453 基礎教養無いくせにやたら耳年増的な心配しても、まったく無駄だ。
せめてきちんと筋道だった勉強と理解ができるようにならなきゃ。
gcc -S ...と
>>450 の x.sを対応付けられないんじゃ救いようが無いかな…
とりあえず、あなたの理解レベルでは、構造体に限らず、
オーバーヘッド云々以前にきちんと読めるプログラムを書くので手一杯のはず。
速度チューニングは、きちんと差を計測できたり、 *.sを解釈できるだけの
能力が無ければ、考えても無駄。
まさか最適化していない落ち?
俺も最初の頃はこういう微々たる速度UPにこだわってたけど 今になって読み返してみると可読性・保守性最悪だし アルゴリズム見直した方がずっと速かったりでいいこと何も無かった。
templateの特殊化って、クラスのあるメンバ関数だけに使うことはできますか? template<typename T> class hoge { public : void foo(T t) ; void bar(T t) ; //...... } ; //ここでhoge::fooだけを特殊化したい、あとのメンバ関数はテンプレートに任せたい。
>>462 template<typename T>
class hoge
{
public :
void foo(int i) {}
void foo(T t) ;
void bar(T t) ;
//......
} ;
とかでいいんじゃない?
464 :
デフォルトの名無しさん :2005/08/17(水) 12:14:40
>>462 template<>
void Hoge<int>::foo(int i) { /* ... */ }
465 :
デフォルトの名無しさん :2005/08/17(水) 12:52:54
>>463 それはTがint以外のときに、intからTへの暗黙の変換が使えなくなって
場合によっては、バグの温床になるのではあるまいか
466 :
462 :2005/08/17(水) 14:02:41
>>464 どうも。
たぶんできると思っていたんですが、
どう書けばいいのか分からなかったので。
467 :
デフォルトの名無しさん :2005/08/17(水) 15:12:18
connect確立後サーバのポート番号をサーバに送信したいんですけど、 sendでよろしいんでしょうか? いまいち分からないので知恵を貸していただきませんでしょうか。
468 :
デフォルトの名無しさん :2005/08/17(水) 15:20:26
469 :
デフォルトの名無しさん :2005/08/17(水) 15:30:19
失敬だけど、ひと大杉ってやつではいれません。
470 :
デフォルトの名無しさん :2005/08/17(水) 15:35:05
以下のようなプログラムで構造体配列を動的に取得したいのですが、mallocでエラーになるようです。これはsizeofでサイズが取得できていないからでしょうか? struct infile{ char filename[129]; int filesize; char filetime[20];} struct infile *f1; f1 = malloc(sizeof(struct infile) * 3 );
まさかとは思うが…… struct infile{ char filename[129]; int filesize; char filetime[20];};//<-ここにセミコロン struct infile *f1; f1 = malloc(sizeof(struct infile) * 3 ); なわけないよな。 単なるコピペミスだよなw C++なら、void *を適切な型にキャストしないといけないが、 f1 = reinterpret_cast<infile *> ( malloc(sizeof(infile) * 3) ) ; わざわざstruct つけているからそれもないよなぁ……。 なんだろw
473 :
デフォルトの名無しさん :2005/08/17(水) 16:05:50
struct infile{ char filename[129]; int filesize; char filetime[20]; };//>471の呪い f1 = (struct infile *)malloc(sizeof(struct infile)*3); こんな風に変更してもエラーが出てきたら エラー内容をコピペしてみろ
参照を返す関数があるのですが、エラーが起こったときはヌルポインタのようなものを返したいのですが、 return 0; とやってもコンパイルが通りません。 参照を返す関数ではエラーは発生しないように作るしかないのでしょうか?
>>474 例外を投げるとか、引き数で結果を返すようにするとか。
異常を示す値を代入しておくとか。
>>474 エラー情報と受け渡したい参照を持つヘルパークラスを返す。
480 :
デフォルトの名無しさん :2005/08/17(水) 16:55:13
return NULL; とか return (関数の戻り値のポインタの型に合わせて)0; とか
return static_cast<FooType *>( 0 );
よく嫁
そもそもポインタの型変換はreinterpret_castだしな・・・ウツダシノウ
すまん、staticでいいのか。今確認
>>485 戻り値型がFooType*なら return 0; だけでいい。
static_castはいらない。
むしろ return null; だろ
(゚Д゚)ポカーン
>>487 何nullって。JavaかC#と勘違いしてんじゃねーの?
490 :
デフォルトの名無しさん :2005/08/17(水) 23:03:32
>>474 つ[ boost.optional ]
>>474 エラーがあるなら例外を使えばいいじゃない
参照を返す関数だと言うに……
>>494 コンパイルが通るか確かめてから書けヴォケ
497 :
デフォルトの名無しさん :2005/08/18(木) 09:45:34
while (!done) これってどういう処理が行われるんでしょうか?
498 :
デフォルトの名無しさん :2005/08/18(木) 10:05:10
>>497 doneという変数の値が0の間、継続する文を実行する。
>>497 マジレスすると
これは while 構文といって、カッコ内に書かれた式(この場合は、!done)が
0 と等しくなるまで、この直後に書かれたステートメントを、繰り返し処理する
詳しくは、まともな本読め
while (!done) while (0 == done)
while (´・ω・`)
std::vector<丶`∀´> nida;
2バイト文字が識別子として許容されるC++コンパイラとか……
ネタニマジレススンスンスーン
>>507 もともとの質問はこれ。
>>474 もとの質問をろくに読まないか、読んでも「参照」をしらない夏厨がわいている。
>>507 最初の質問の事を言ってるとオモワレ
脱線しすぎだな
linuxなのですがお願いします。 #include<stdio.h> typedef struct{ unsigned char a; }test_st; int main() { unsigned char b; test_st *point = (test_st*)&b; b=10; printf("=>%d",*point); return(0); } =>58890 回答として10を期待しているのですが、このプログラムを動かすたびに 58890等のおかしな値が出てしまいます。 HP_UXの場合は10が返却されていたんですが。 よろしくお願いいたします。
理由説明すんの面倒だから test_st *point = (test_st*)&b; printf("=>%d",*point); をきちんと書き直しなさい
>>510 >printf("=>%d",*point);
だとtest_stのサイズの1byte分しかスタックに積まないが
printfは%dなので4byteスタックから拾ってる。残り3byteにはゴミが入ってる。
printf("=>%d", point->a);
とすれば4byteに拡張されて積まれるから問題ない。
513 :
510 :2005/08/18(木) 16:14:52
charサイズの構造体きったら1ワード分メモリが取られ、char以外の部分にごみが入ってしまう からおかしな値が表示されるんですね。 第一、構造体をprintfで表示しようとしていること自体おかしいですね。
514 :
510 :2005/08/18(木) 16:16:45
>511さん,512さん ありがとうございました。 勉強して出直してきます。
linuxのviでCソースファイルを見ていて、わからない構造体がでてきたとき その構造体にカーソルを合わせて何らかのキーを押すとヘッダファイル のその構造体定義にジャンプしてくれるような機能って何ですか? ->以前、使っている人がいたんですが聞きそびれました。 googleりたいのですが、検索キーワードを教えていただけませんか。
517 :
516 :2005/08/18(木) 19:22:10
>516 ctags
自演乙
久々に見たんだがなんか構造体についての質問多いな。
>>403 の話で時間たってて悪いんだが
sizeof(g) == sizeof(k)
である保証はないっていう指摘は誰もしないのか?
誰もアラインメントに関して知らないってことはないはずなんだが。
最初の発言からアライメントは問題になってないってわかるじゃん。 話を無理に発散させるのはやめろ
この場合はアライメントは問題になってないけど、エンディアン以前の問題という事ですな。
>>519 アライメントに限らず、あのコードの非現実性(非実用性?)自体をあの時点で
説明しても意味が無いのを感づいているから。
(好意的に解釈すれば環境依存の単なる実験コードと承知の可能性もあるし。
なにより時節柄、(今みたく)本筋外す厨がわいて出てきかねないのがウザイ)
523 :
デフォルトの名無しさん :2005/08/18(木) 23:34:39
WM_CHARのWPARAMでながれてきた文字コード(TCHAR)を wstringにinsertできるように型変換したいのですが どうしたらよいでしょうか。
524 :
デフォルトの名無しさん :2005/08/19(金) 00:26:07
下のようにしたらとりあえずできました。 WPARAMそのままだとinsertできなかったので質問させていただいたのですが、 なぜ一度tmpを経由すると成功するのでしょうか。 WPARAMはtmpに代入できるのだからwstringと同じではないのでしょうか。 だとしたらそのままinsertできるように思えるのですが、 できない理由を教えてください。 wstring tmp;//とりあえず空のwstringを作って tmp=wp;//WM_CHARのWPARAMの値をそのまま代入 wstr.insert(pos,tmp);//wstring文字列に挿入
525 :
デフォルトの名無しさん :2005/08/19(金) 00:38:29
ちょっとホントに困ってるんですけど、教えてくれませんか。。。 TCP/IPでバイナリデータを送信する前に送信データの全体サイズを 測りたいんですけど、送信の全体が6バイト+可変のサイズなんですけど、 ソースで書くとどのようになるんでしょうか?よろしくお願いします。 環境 win2000 VC++6.0
>>525 >送信の全体が6バイト+可変のサイズなんですけど
その、「可変のサイズ」とやらは既知ではないのか?
既知でないとしたら、どうやって送信するつもりなのかね。
>>524 wstringへの代入が、castの代わりになっているんだろ。
527 :
524 :2005/08/19(金) 00:49:59
>>526 もしきちんとした方法でcastするとしたらどういう書き方をすればよいのでしょうか?
ATL と MFC の文字列変換マクロ
530 :
デフォルトの名無しさん :2005/08/19(金) 01:28:17
>>526 6バイトのうち2バイトを読むと可変のサイズがわかるようになっています。
531 :
524 :2005/08/19(金) 01:43:31
>>528 型を変換しないといけないのはわかるのですが具体的にどうすればよいのかがわからないです。
最終的にinsertするにはwstringの文字列でないといけないのでWPARAMをその型に変換したいです。
wchar_t wtmp[]=L"";
printf((char*)wtmp,(char*)wp);
strcpy((char*)wtmp,"\0");
wstr.insert(pos,wtmp);
とかやってみてコンパイルは通りましたが動かしたら落ちました。
どうやれば意味的に正しくきれいに書けるでしょうか。
534 :
デフォルトの名無しさん :2005/08/19(金) 01:56:06
>>533 ソースでどう書くのでしょうか?よろしくお願いします。。。
>>534 まずはオマエが書いて、問題があればそれを相談しろ。
536 :
524 :2005/08/19(金) 02:00:41
W2AとかA2Wマクロ使えばいいじゃん。ワイド文字からアスキーへ またはその逆に変換してくれるぞ。ついでにソースを追えば 何やっているか分かる。 キャストじゃ駄目だよ。。。
539 :
デフォルトの名無しさん :2005/08/19(金) 02:14:55
>>535 どう書いていいのかわからないです。無理ならせめてヒントください!
>>539 全部書き上げるまで粘着されそうで、正直出て行って欲しい感じだ。
わからないことがピンポイントじゃないので、ヒントも無理。
541 :
524 :2005/08/19(金) 02:32:50
>>538 度々すいません。ありがとうございます。これ↓使えってことでしょうか?
--------------------------------------------------------
// 文字cをpos文字目にn文字挿入
basic_string& insert(size_type pos, size_type n, charT c);
--------------------------------------------------------
だとしたら、、、
wstr.insert(pos,1,(char)wp);
と、やってみたらできました。
ところでこのcharTの「T」ってのはなんでしょうか?
あてずっぽうで(char)をつけたらうまくいってしまいましたが。。。
あと一応、
>>531 みたいな感じの型変換の方法も聞いておきたいのですが、
どなたか教えて頂けないでしょうか。
(WPARAMの文字コード(TCHAR)をwstringの文字列にする方法)お願いします。
>>541 charT についてはリンク先の「テンプレート」を見ろ。
あてずっぽうでキャストすんなボケ。
wstring には wchar_t が格納できる。 TCHAR は char または wchar_t に typedef されてる。
よって TCHAR が wchar_t なら変換は要らない。
TCHAR が char ならマルチバイトシーケンスの判定やバッファリングが必要。
543 :
524 :2005/08/19(金) 05:40:34
ですからその方法を教えて欲しいのですが、なぜそんなに小出し小出しで説明するのですか? お互いに時間の無駄じゃないですかね。これまでの分はお礼を言いますが 別に教えたくないなら無理して教えていただかなくていいですし こっちも別にボケとか言われてまで聞きたくないんでもう結構です。 ありがとうございました。
545 :
526 :2005/08/19(金) 08:17:55
>>539 ・上げるな。
・その6バイトの仕様を提示せよ。
546 :
デフォルトの名無しさん :2005/08/19(金) 09:53:28
質問の仕方スレッドってム板になかったか? どっかのスレで、質問の仕方スレの使い方の質問・・・ とかわけのわからん状態になっていたのを見たことがある。
>>539 ここは赤子に這い這いを教えるようなとこじゃ無いんだよ
548 :
デフォルトの名無しさん :2005/08/19(金) 10:33:06
>>545 要求/返信コード 2バイト(unsigned short)
結果コード 2バイト(unsigned short)返信値のみ有効
データ部サイズ 2バイト(unsigned short)
データ部 データ部サイズにより可変
*データ部の内容は要求/返信コートにより決定する
550 :
デフォルトの名無しさん :2005/08/19(金) 10:47:45
uchar sixbytes[6]; ushort net_datasize; ushort host_datasize;//正しい値がすでに入っていると仮定 ushort *p; memset(sixbytes, 0, sizeof(sixbytes)); net_datasize = htons(host_datasize); p = (ushort *)&sixbytes[4]; *p = net_datasize; send(sock, sixbytes, sizeof(sixbytes), 0); こんな感じでどう? 受けて側では逆の処理をして適切なhost_datasizeを取得してね。 逆の処理の仕方とかは聞かないでね。
551 :
デフォルトの名無しさん :2005/08/19(金) 11:12:16
>>550 教えてくれてありがとうございます。
早速試したいと思います。
552 :
デフォルトの名無しさん :2005/08/19(金) 13:19:03
uchar sixbytes[6]; //送信するポインタ?
ushort net_datasize; //結果コード?
ushort host_datasize;//正しい値がすでに入っていると仮定 //データ部サイズ?
ushort *p; //要求コード?
ってことでしょうか?
>>550
553 :
デフォルトの名無しさん :2005/08/19(金) 13:23:51
要求/返信コード 2バイト(unsigned short) 結果コード 2バイト(unsigned short)返信値のみ有効 データ部サイズ 2バイト(unsigned short) の6バイトを送るだけだよ。 []で1バイト [要求・送信コード][要求・送信コード][結果コード][結果コード][データ部サイズ][データ部サイズ] の順でね。
554 :
デフォルトの名無しさん :2005/08/19(金) 13:35:16
なるほど!ありがとうございます。 受信のは逆っていいますと net_datasize = htons(host_datasize); p = (ushort *)&sixbytes[4]; *p = net_datasize; が逆に行うってことですか? 頭悪すぎてすみません!!
半透明化ってどうやるのでしょう 背景色が a その上に表示する画像の 色が b とした場合の 計算式はどうなりますか? a+b/2 とかいう単純な計算ではむりでした
>>555 透明・不透明度tが 0〜1 として
a*(1-t) + b*t
>>556 ありがとうございます
でもそれだと何故か出来ないんですよね
int だから だめとかですかね
>>557 透明度0.5なら(a+b)/2で、この場合は整数演算でもOK。
RGB各要素を別に計算する必要があるのは理解している?
>>559 なるほど RGB別になんですね
白 が 0x7FFF という 形式なんですけど
まず分解しないといけないんですね
いやおまえ、白が7FFFってどういう計算だよ・・・
RGBが5bitずつってことだろ? なんかYSっぽいな。
563 :
デフォルトの名無しさん :2005/08/19(金) 14:46:48
>554 っていうかお前にはネットワークプログラム無理だよ。 諦めるのが最善の策だ。 自分でも頭悪すぎるってわかってるっぽいし。
>>560 自分の使っているシステムの色の定義を調べるほうが先だな
>>563 ネットワークプログラム以前にプログラム自体が駄目だと思うよ。
思考能力が小学校低学年並。
そもそも、
>>554 は
プログラムの処理を理解してるのか?
受信側でコードをそのままコピペしたら絶対バグ出るぞ。
>>544 出て行ってもらって結構って、ここはお前のスレでもなんでもないんだが。
教える気がないならお前が最初から黙ってればいいだろ。
お前みたいに中途半端にレスされると質問者としても迷惑なんだよ。
質問者には過不足なく質問しろとかいうんだったら回答者も過不足なく最後まで面倒みろよ。
途中で投げ出すなら最初から教えてくれなくていい。
ここはバカにしあって遊ぶスレではありません。
>>567 お前にとって迷惑なレスなんてひとつも無かったはずなんだけどな。
さらに、キーワードから自分で調べることさえすれば
面倒を見てくれるとも言っている(ように見える)。
投げ出された結果になったのは、お前がそれをしなかったからだとわからないのか?
はいはい。 まともに回答できない人が偉そうに書き込むのはやめましょう。 「知識は無いけど説教はしたい」、そんなくだらない願望はチラシの裏へどうぞ。
はいはい。 まともに検索できない人が偉そうに書き込むのはやめましょう。 「技術は無いけどプログラムはしたい」、そんなくだらない願望はチラシの裏へどうぞ。
574 :
デフォルトの名無しさん :2005/08/20(土) 22:31:05
>質問者には過不足なく質問しろとかいうんだったら >回答者も過不足なく最後まで面倒みろよ。 過不足なく質問できたやつには過不足なく面倒を見ている。 過不足なく面倒を見てもらえない君は、とどのつまり過不足なく質問できていないのだ。
575 :
574 :2005/08/20(土) 22:32:52
それと質問者側を擁護しているやつは >554なのか? 答えた側としては泣きたくなるぞ。
おまえら、何がしたいの?
>チラシの裏へどうぞ。 このスレですネ!
頭にきたらスルーすればいいのに。 何年ネットやってんだか。( ´,_ゝ`)プッ
キィーッ!
ムキャ────( `д´)─────ッ!!
( ^ω^)テラワロス
583 :
デフォルトの名無しさん :2005/08/21(日) 12:10:12
>>574 > 過不足なく質問できたやつには過不足なく面倒を見ている。
こういうのは自己申告するものではなく、相手が評価するのが筋では? ;-)
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
ですか? それが通るなら、そりゃあいつだって自分は正しく相手のみ非がありますよね :-P
はいはいワロスワロス
↓次の質問どうぞ
586 :
デフォルトの名無しさん :2005/08/21(日) 13:18:00
587 :
デフォルトの名無しさん :2005/08/21(日) 13:54:32
>>586 意味不明です。
リンク先のスレと俺の
>>583 はまったく関係ありませんので :-P
>>583 に対して有効なレスは、
「質問者が過不足なく質問できているかは回答者である俺が決める。
俺が過不足なく回答できているかどうかも俺が決める」
↑これがいかに正しいのか、ということをちゃんと説明しているレスだけですね。
(
>>583 がやっているのはこのことへの突っ込みなので、それ以外はすべて話題そらし)
589 :
デフォルトの名無しさん :2005/08/21(日) 14:00:40
>>583 574 をちょっと修正して
× 過不足なく面倒を見ている
○ 過不足なく面倒を見ているつもりだ
これでいいですね?
急速にスレの質が低下してまいりました
596 :
デフォルトの名無しさん :2005/08/21(日) 17:34:14
597 :
デフォルトの名無しさん :2005/08/21(日) 17:35:57
ちょっと釣られすぎじゃね?お茶でも飲んで落ち着こうぜ
int gethostname( char FAR *name, int namelen ); これのFARってなんですか?
>>599 遠いポインタにつけられる修飾子を隠すためのマクロです。
過去との互換性のために残されているだけでしょうから、無視していいかと。
htmlファイルを読み込んで、ある部分から先を削除したいんですけど どのように考えればいいのでしょうか?
602 :
デフォルトの名無しさん :2005/08/22(月) 14:17:17
>>599 それはおそらく8086のCPU用プログラムで使われたものです。
たしか far と near がありました。far のポインタは 32
ビットで、near は 16 ビットです。far も near も付けない
場合はコンパイル時にコンパイラに対してオプションで指定
していたと思いました。
603 :
デフォルトの名無しさん :2005/08/22(月) 14:19:35
>>601 HTMLファイルは fopen() 使って "r" で開き、作業用ファイルを "w" で開く。
で、HTMLファイルから読んで作業用ファイルに書く。終わりの所に来たら
両方とも fclose() して、HTML ファイルを .bak 付きのファイル名に
リネームし、作業用ファイルのファイル名を元の HTML ファイルのファイル名に
変更する。
Windowsで自分自身のアップデートプログラムをweb上から取ってきて、更新する方法を考えています。 プログラムを取ってくるところまでは出来たのですが、自分自身を削除してそれを新しい物に置き換える方法が分かりません。 自分自身が起動している場合、上書きできないのですが、このような場合どのようにすればよいのでしょうか?
書き換えるためのプログラムを別に用意すれば良いだけじゃね?
606 :
デフォルトの名無しさん :2005/08/22(月) 15:16:59
バイナリファイルに浮動小数2.5を保存 。値は"00 00 20 40" で、読み込もうとすると、どうしても1075838976という値になってしまいます。 (float型に入れたので実際は指数表示だった) 0x40200000が示す整数がそれなのでそれも分かるのですが、 元の2.5という小数としてfloatに入れたい時はどうすればいいのでしょうか?
>>606 int i = 0x40200000;
float f = *reinterpret_cast<float*>(&i);
>>599 FARポインタについては
>>600 や
>>602 で書かれてるとおり
16it環境でポインタを扱う場合に付けるもの。
typedef FAR BYTE * LPBYTE
typedef FAR char * LPSTR
って感じで使われてた(LPはLong Pointerの略)
さらに補足すると(いらないだろうが)、
モジュールをまたぐ場合のポインタ渡しや、
メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う。
Win3.1や95、または98/Meのデバイスドライバ限定でしか使わない代物なので
今は無視してもOK
昔はFARポインタやセグメントやらで散々悩まされたよorz
609 :
608 :2005/08/22(月) 15:41:54
>>608 の
>メモリアクセスで現在位置から64Kbyte以上離れた場所を指す場合に使う
間違い。こっちはhugeポインタだった。
時代遅れのおっさんはそろそろ消えるよノシ
>>607 うひょー、できました。
ありがとうございます。
float f = *(reinterpret_cast<float*>(&i));
はよくて
float f = reinterpret_cast<float>(i) ;
じゃダメなんだ…。つかコンパイル通らない。
奥がふかいなぁ
_beginthread()とか_endthread()ってなんで_がついてるんですか?
つけたかったから
UNIXとかではbeginthread()とかが使われているからってことですか?
標準関数や自分で作る関数と区別がつくように 環境依存とか、ベンダー独自の関数とかはアンダーバーをつけるって聞いたことがあるけど。 ごめんなさい、あとは詳しい人に任せます。
じゃあそれでいいじゃん
>>616 2箇所の
*timer_proc
を
__stdcall *timer_proc
に。
単なるラッパークラスとしてだったら、
>>616 でほとんど完成してるね。
個人的にはコンストラクタ、デストラクタとは別に
Start()とStop()メソッドが欲しいところ。
>>610 reinterpret_cast<float&>(i);だとどうだろう?
>>619 veryさん9!
ありがとうございました
そして感謝されない>618
623 :
偽616 :2005/08/22(月) 21:13:36
>618さん ありがとうございました。
そしてveryさんって誰だよって本気で思った俺
<丶`∀´>
626 :
601 :2005/08/23(火) 01:36:00
627 :
デフォルトの名無しさん :2005/08/23(火) 15:46:34
キャストとforを使って1から10までの値を0.1刻みで順に表示するプログラムを作れという 練習問題の解答が以下として載っていたのですが… #include <stdio.h> int main(void) { float f; for(f=1.0; (int) f<= 9; f=f + 0.1) printf("%f ", f); return 0; } これを実行すると、 1.000000 1.100000 1.200000 1.300000 1.400000 1.500000 1.600000 1.700000 1.800000 1.900000 2.000000 2.100000 2.200000 2.300000 2.400000 2.500000 2.600000 2.700000 2.799999 2.899999 2.999999 3.099999 3.199999 3.299999 3.399999 3.499999 3.599999 3.699999 3.799999 3.899998 3.999998 4.099998 4.199998 4.299998 4.399998 4.499998 4.599998 4.699998 4.799998 4.899998 4.999998 5.099998 5.199997 5.299997 5.399997 5.499997 5.599997 5.699997 5.799997 5.899997 5.999997 6.099997 6.199996 6.299996 6.399996 6.499996 6.599996 6.699996 6.799996 6.899996 6.999996 7.099996 7.199996 7.299995 7.399995 7.499995 7.599995 7.699995 7.799995 7.899995 7.999995 8.099995 8.199995 8.299995 8.399996 8.499996 8.599997 8.699997 8.799997 8.899998 8.999998 9.099998 9.199999 9.299999 9.400000 9.500000 9.600000 9.700001 9.800001 9.900002 と、なんか途中から誤差が出てくるんですが、どうしてでしょうか?
>>627 不動小数点数とはそういうもの。
有効桁数は有限でしかない上に、0.1は二進法では無限小数で、誤差が出やすい。
>>628 0.1が無限になるのは固定小数だけじゃなかったっけ?
うろ覚えなので間違ってたらスマソ…
タスクバーのツールチップを強制的にバルーンにしたいんですが
Shell_TrayWndを親にもつtooltips_class32を探して、
そのウインドウスタイルにTTS_BALLOONをSetWindowLongAしました。
(WS_BORDERも消しました。)
バルーンにはなるんですがなぜか場所がかなり上によってしまいます。
http://sakots.pekori.jp/cgi/sn/src/up32253.png ちなみにstartbuttonerというアプリでは、新しいtooltips_class32の
インスタンスを作っているようですが、VisualStyleの適用されている
XPではスタートボタンだけしかバルーンにできないみたいです。
うまい方法を御存知の方いらっしゃいませんか?
対象OSはXPでVisualStyleが適用されています。
>>630 向こうで回答がないからってマルチすなや。
>>627 floatの精度は10進7桁分もない。
従って、%fで表示したら誤差が出るのは自明。
%gを使うとか小数点以下の桁数を制限して誤魔化すか、
doubleで計算するようにするか、
そもそも誤差が累積しないような対策をするべき。
つーか、その練習問題を読む限り、回答としては間違いだね。
>>627 #include <stdio.h>
int main()
{
int i;
for(i = 10; i <= 100; ++i)
printf("%2d.%d%c", i / 10, i % 10, i % 10 == 9 ? '\n':' ');
return 0;
}
ごめん、キャスト使うとこなかった。
横槍スマソ。キャスト使うとしたら
>>634 が書いてくれてる奴のprintfの引数を↓に変更
%2d.%d→%f
i/10, i%10→(double)i / 10
636 :
デフォルトの名無しさん :2005/08/23(火) 19:50:37
>>629 小数点が固定だろうが浮動だろうが十進数の 0.1 は二進数では循環小数であることには代わりはない。
637 :
627 :2005/08/23(火) 22:10:29
なるほど、勉強になりました。皆さんどうもありがとう。 ちなみに問題の出典は独習C 第3版。
638 :
デフォルトの名無しさん :2005/08/23(火) 23:58:02
構造体についての質問です。 struct kouzoutai{ int a; char b; }test; ここで const struct kouzoutai test[] = {{1,a},{2,b},{3,c}} という定数宣言はできるのでしょうか? あと、上記のようにtest[]を宣言しておいて コマンドライン引数で「test」を与えた時に、構造体の値を参照するには どうすればいいのでしょうか? for(i=0;i<10;i++){ sum=(argv[1])[i].a ・ ・ ・ とか書いても当然ダメですよね
>>638 その最初のコードでtestが既に定義されているんだが、どうしたらいい?
>>638 {1,a}って? 'a'なら分かるけど。で、当然最後はセミコロンだよね?
for文の中は「とか書く」以前に何をしたいのかも表せていないし、
そもそもCになっていない。
exeファイルになったときには構造体名とか変数名はなくなってるよ。
642 :
638 :2005/08/24(水) 01:02:55
>>639 最初似宣言しておかなければconstを付けられるということでしょうか?
>>640 {{1,'x'},{2,'y'},{3,'z'}};
こうでした。すみません。
見直したら自分めちゃくちゃなこと書いてましたね。失礼しました。
やりたいことを挙げますと、
struct kouzoutai{
int a;
char b;
};
struct kouzoutai test[] ={{1,'x'},{2,'y'},{3,'z'}};
のような構造体が複数あって、
コマンドライン引数から指定した特定の構造体にfor文でループさせて
sum+=test[i].a
で数値の合計を出そうとしていました。
643 :
638 :2005/08/24(水) 01:05:07
途中で送信しちゃいました。 この sum+=test[i].a; のtestの部分をコマンドライン引数で指定したいわけです。
正直、何のためにコマンドラインから指定できるようにしたいのか分からん。
>>642 「構造体が複数」?「配列が複数」の間違いじゃないのか?
>>642 こういうことか?
if( strcmp(argv[1], "test") == 0 )
sum += test[i].a;
else if( strcmp(argv[1], "hoge") == 0 )
sum += hoge[i].a;
配列の識別名を、外部から文字定数で与えて、その配列を使うってことだろうな。
一般いは無理だ。
>>642 のように、文字列と配列の対応関係をどっかにつくって置かなければな。
>>638 のやりたいことはPerlなら出来るが、Cじゃむり。
648 :
647 :2005/08/24(水) 01:28:26
×一般いは無理だ ○一般的には無理だ
配列の配列を作って、番号(index)指定して目的の配列を使うのがC流かな。
650 :
638 :2005/08/24(水) 01:49:47
>>645 おっしゃるとおりで。
>>646 ,647
どこか別に判断基準を用意しないとダメってことなんですね。
たしかに、最初に思ったのは
構造体の配列を、更に配列に入れて処理・・・って物だったんですが、
入り組みすぎると後々汎用性が下がるし分かりにくいから
別の方法でやるようにと言われてしまったので、
他にどんな方法があるのか悩んでいたのです。
お勉強になりました。
ありがとうございました。
struct kouzoutai test[10], hoge[10] ; struct kouzoutai *target ; /* argc check 必須 */ target= ( !strcmp(argv[1], "test") )? test : ( !strcmp(argv[1], "hoge") )? hoge : NULL ; if ( target != NULL ) { for ( i=0; i<10; i++ ) sum += target[i].a ; }
>>650 > 入り組みすぎると後々汎用性が下がるし分かりにくいから
> 別の方法でやるようにと言われてしまったので、
そいつ、信用ならないな。
653 :
351 :2005/08/24(水) 02:00:45
typedef map<string, kouzotai> kouzoutai_map_t; でええやん。
654 :
1/2 :2005/08/24(水) 02:02:24
本質的にはif で比較するのと代わらないが。 #include <stdio.h> #include <string.h> /****** 目的のTABLE群 *****/ struct kouzoutai { int a; char b;}; /* 型 */ /* table */ struct kouzoutai test[] = {{1,'1'}, {2,'2'}, {3,'3'}}; struct kouzoutai foo[] = {{10,'a'}, {20,'b'}, {30,'c'}}; struct kouzoutai bar[] = {{100,'X'}, {101,'Y'}}; struct kouzoutai hoge[] = {{500,'G'}, {600,'H'}, {700,'I'}, {800,'J'}}; /***** マッピングTable ****/ /* マッピングTable レコード型 */ struct map_kouzoutai{ const char *name; struct kouzoutai *table; int table_size; }; /* マッピングテーブル */ #define MAP(name) { #name , name, sizeof(name)/sizeof(name[0])} struct map_kouzoutai map_kzt[] = { MAP(test), MAP(foo), MAP(bar), };
655 :
2/2 :2005/08/24(水) 02:03:11
/* テーブル取得関数 */ struct map_kouzoutai *get_map_kzt(const char *name) { int i; for(i = 0; i < sizeof(map_kzt)/sizeof(map_kzt[0]); ++i) if( strcmp(map_kzt[i].name, name) == 0 ) return &map_kzt[i]; return NULL; } /* テストメイン */ int main(int argc, char **argv) { struct map_kouzoutai *p_mk = get_map_kzt(argv[1]); if( p_mk ) { int i; printf("table : %s\n", p_mk->name); for(i = 0; i < p_mk->table_size; ++i) printf("[%d] %d , %c\n", i, p_mk->table[i].a, p_mk->table[i].b); } else { printf("table not found [ %s ]\n", argv[1]); } return 0; }
あ、hoge 登録し忘れた。 マッピングテーブルに MAP(hoge), 追加してくれ。
あ、ちょうどマップの話になってるようなのでついでに質問させていただきます。 typedef std::map <char* , int> HOGE; HOGE hoge; hoge["test"] = 1; とした場合に、 hoge[argv[1]] みたいなアクセスの仕方って出来ないんですか? strcmp(argv[1], "test") == 0 が真でも 違う値とみなされているのか上手くデータを取得できないのですが。
文字列を添字にするのはどうかと
>>657 そりゃ、文字列の内容が同じでも、同じアドレスにあるとは限らん。
リテラルと変数だったら、まず一致しないだろう。
こうしたらどうよ。
typedef std::map <std::string , int> HOGE;
HOGE hoge;
hoge[std::string("test")] = 1;
hoge[std::string(argv[1])] ;でアクセスね。
661 :
658 :2005/08/24(水) 02:27:24
CとC++まちがえた あーはずかし
>659-660 暗黙の変換が効くから hoge["test"] hoge[argv[1]] でいいんじゃないの。
>>659 おお、出来ました。ありがとうございます!
実は今日一日ずっとこれをどうにかできないか色々試してましたw
お陰様で気持ちよく眠れそうです。
664 :
638 :2005/08/24(水) 03:52:21
お風呂入ってました。
>>651 ~656
追加お返事どうもでした。
ざっと眺めただけじゃ理解しきれないので、ひとまず今日は寝て
明日じっくり解読させていただきます。
665 :
デフォルトの名無しさん :2005/08/24(水) 09:42:27
あのーちょっと演算子のオーバーロードについて質問させてください。 オーバーロードした演算子の引数って複数取れないんでしょうか? 下のように書いてコンパイルすると、 `Point Point::operator+(int, int)' must take either zero or one argument ってエラーが出るんです。 data2 = data1 + (1,1)の部分は実現できないんでしょうか #include <iostream> class Point{ private : int x; int y; public : void echo(void){ std::cout << x <<" "<< y << std::endl; }; Point operator+ ( int a, int b ){ this ->x = a; this ->y = b; return *this; }; }; main(){ Point data1,data2; data2 = data1 + (1,1); data2.echo(); }
>>665 君がやりたいことは多分こういうことだと思う。
#include <iostream>
class Point
{
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y) {}
Point() : x(0), y(0) {}
void echo() {
std::cout << x << " " << y << std::endl;
};
Point& operator +=(Point pt) {
x += pt.x;
y += pt.y;
return *this;
};
Point operator +(Point pt) {
return Point(*this) += pt;
}
};
main() {
Point data1(10, 20), data2;
data2 = data1 + Point(1, 1);
data2.echo(); //11 21と出力される。
}
書き忘れたけどoperator <<()をオーバーロードすれば、std::cout << data2 << std::endl;と書けるようにもできる。
>operator <<()をオーバーロードすれば 横から追記すると、 std::ostream& operator<<(std::ostream& ost, Point pt){ return ost; }
ごめん途中で送信した std::ostream& operator<<(std::ostream& ost, Point pt){ (ここに標準出力等に流す処理を書く) return ost; } とかやんないとマニピュレータが動いてくれないんで注意。
670 :
665 :2005/08/24(水) 10:38:00
ご教示ありがとうございます。 演算子<<のオーバーロード、よくわかりました。 さっそく使ってみたいと思います。 ところで >data2 = data1 + Point(1, 1); の行なんですが、 data2 = data1 +(1, 1); と書けるように演算子をオーバーロードできないものでしょうか?
>>670 その下の行、コンパイラはどう解釈したらいいの?
その(1, 1)が何者かのヒントがないとコンパイラはなんともできないわけよ。
つーことで、大人しく一時オブジェクトを生成するか、2引き数の(operator+()でない)加算関数を用意するしか。
672 :
665 :2005/08/24(水) 10:52:07
なるほど。確かにおっしゃるとおりですね。 勉強になりました。 教えてくださって本当にありがとうございました。
>>670 >>666 ちゃんと理解してるか?
data2 = daat1 + Point(1, 1);
だろ
>>673 あんたこそ日本語を理解できてませんから。
ありゃん、最後以外読み飛ばしてたわ。
676 :
665 :2005/08/24(水) 14:36:03
なるほどよくわかりました。 演算子のオーバーロードがメンバ関数と同じものだと考えてたのがいけないみたいですね。 どうもありがとうございました。
同じものだろ。どこを読んだんだ?
>677 operatorなんちゃらはグローバルでも定義できるが。
ああそういう意味か
Linuxでのファイルのロックの方法を教えてください。 phpやperlではやり方が分かるのですが、Cの場合はどのようにすればよいのでしょうか?
683 :
デフォルトの名無しさん :2005/08/24(水) 17:34:09
>>681 fcntl() でも出来るよ。
ロックを掛けるファイルがNFSにある場合はfcntl()でないとロック掛からない
ので、fcntl()で書いておけば安心。(しかしちょっと複雑)
寧ろその辺に多くを期待するよりファイルのパーミッションを落としてしまうとか。
Windowsプログラミングで #define WM_MESSAGEA (WM_APP+1) のように定義したメッセージはどのような時に送られるのでしょうか? これらのメッセージをどう判断して良いものなのかがよくわかりません。
>>685 WM_APP以降はアプリケーション独自に定義されたメッセージ。
Windows側が送信することはない。 アプリケーション自身が投げるか関連プログラムが投げるかしかないかと。
>>685 システムへコールバックメッセージとして渡すとかね。
ex. Shell_NotifyIcon
スレにあってるかどうかわからんのですが、 C/C++でHDDのディスクイメージを取るプログラムを作ってみようと思ってますが、 そんなこと可能ですか? なんか参考になる書籍かURLあったらおしえてください。
>>689 少なくとも標準では不可能だな。
環境依存。
>>691 環境依存OKならばこそ、環境も示さずに環境依存の何を教えろと?
どうせ689のような質問をする奴はWindowsに違いないと思った。
意外とBeOSかもよ。
696 :
689 :2005/08/24(水) 23:50:18
皆さんありがとうです。 お察しのとおりWindows(NT系、9x系どちらも)なんですが、 MBRやブートセクタの領域もイメージとして取得できたらと思っています。 (Linuxのddのクローンのようなものです)
>>696 だからCreateFile()でデバイス指定すればdd相当のこともできるってば。
Visual C++ .net 2003の最適化コンパイルオプションについて 教えてください ノートパソコンのCPUに最適化したいのですが Pentium(R) M プロセッサ 735(1.70GHz とかいうCPUに最適化するには プロセッサ別の最適化のところで Pentium4以上 /G7 ってすればいいんでしょうか?
>>698 PentiumMはバスを高速化したP6系CPUだったような気が‥‥
PentiumII/IIIで最適化した方がいい希ガス。
気になるなら両方でビルドしてみて速度計ってみ。
MFCスレのほうにも書いたのですが反応なかったのでこっちにも書きます 同じコードなのにCPrintDialogで表示されるダイアログが2つのプロジェクトで異なるのですが、 どこの設定を変えればいいのでしょうか? 開発/実行ともに同じ環境です(VC++ 6.0 + Windows2000 SP4) プロジェクトA = プリンタ選択(コンボボックス)/印刷範囲/部数 プロジェクトB = プリンタ選択(アイコン選択)/印刷範囲/部数/タブがいっぱい
702 :
デフォルトの名無しさん :2005/08/25(木) 14:16:37
質問なのにsageちゃったのでageます
703 :
デフォルトの名無しさん :2005/08/25(木) 14:56:57
statでファイルの所有者(uid)を取得したのですが、これをユーザ名に変換する関数uid2uname が使えません。以下のようなエラーがでています。 invalid initializer UIDをユーザ名に変換するにはどうすれば酔いでしょうか。 #この関数は検索してもほとんどヒットしないのでメジャーではないのか。
>>701 MFCのリンクが共有DLLかスタティックリンクかで変わった気がする。
705 :
デフォルトの名無しさん :2005/08/25(木) 16:27:15
>>703 普通 getpwuid() を使うのでは?
ていうか、オマエの使っているOSはなんだ?
>>698 PenIIIで動かす場合、Intel C++ではPenM用(/QaxB)に最適化したコードにすると
PenIII用(/QaxK)に最適化したコードよりもなぜか速い。
707 :
701 :2005/08/25(木) 16:42:34
MFCのリンクの設定を両方変更してみたけど外観変わらず orz... EXEじゃなくてOCXだからっていうのは関係ないですよね?
>>701 CPrintDialogのコンストラクタの引数は同じ?
あと、OnFilePrintSetup()で何かそれっぽい処理とかはしてない?
709 :
デフォルトの名無しさん :2005/08/25(木) 17:26:27
OnFilePrintSetup()に処理はありません。 片方作った後にコピペで貼り付けたのでコードは同じのはずです。 CPrintDialog dlg(FALSE); dlg.m_pd.Flags = PD_DISABLEPRINTTOFILE | PD_NOSELECTION | PD_RETURNDC; dlg.DoModal(): 何か決定的な間違いがあるんでしょか?
710 :
デフォルトの名無しさん :2005/08/25(木) 17:49:14
MFCでダイアログを作ってます。 MessageBoxを使って変数と文字列を一緒に表示させたいのですが int xとしてxだけ表示するメッセージボックスは int x; CString str; str.Format("%d",str); MessageBox(str); で出来たのですが、たとえば「数値=x」と表示させた場合は どのようにしたらいいのでしょうか?お知恵を貸してください。
711 :
710 :2005/08/25(木) 17:50:24
訂正します。 str.Format("%d",str); ⇒str.Format("%d",i); でした。
printfと同じだが?
713 :
デフォルトの名無しさん :2005/08/25(木) 17:58:49
堀江貴文 語録 「選挙にはほとんど行ったことがありません。面倒くさいからです」 「ちょっと頭のいい人は、やっぱり政治家なんか、やりたくないでしょう。損だから。面倒くさいし。少なくとも僕は絶対やらない」 「女は金にもれなくついてくる」 「人の心は金で買えます」 「カネがあれば何でもできる」 「俺は死なない」 「サラリーマンは現代の奴隷階級」 「起業家は現代の貴族階級」 「女は25歳超えたら無価値で有害なだけの産業廃棄物」 「大衆の7割はバカで無能」 「世論には意味がない」 「世の中、金だ、愛情だって金で買える」 「年寄りは合法的に社会的に抹殺するしかない」 「人間はお金を見ると豹変します。豹変する瞬間が面白いのです」 「人間を動かすのはお金です」 「世の中にカネで買えないものなんて、あるわけないじゃないですか」 「なんでも金で買えるなんていってない」 「一度言っただけで言ったことにされちゃあたまりません」
714 :
デフォルトの名無しさん :2005/08/25(木) 18:15:15
>>705 OSはLinuxです。passwd 構造体を作ってgetpwuid を使うことにしました。ありがとうございます。
「決定版 はじめてのC++」をそろそろ読み終わりそうなのですが 次に読んだほうがいい本や、やってみたら良い事等があったら ご教授いただけませんでしょうか、よろしくお願いします。
読むだけなら辞めちまいな
>>716 本ばっかり読んで良いコードが書けるなら誰も苦労してないぞ
基礎が出来たら後は実践で学べ
>>716 何か作りたいものを見つける。後は何をするかが自ずと見えてきますよ。
>716は何のためにプログラミングのお勉強してるんだろう
>>716 「プログラミング言語C++第3版」を買ってくる
→読んでみる
→さっぱり分からない
→「入門書一冊読んだだけで分かったつもりになったらいかんなぁ」と反省する
→自分なりに色々なコードを書きつつ勉強を続ける
→「プログラミング言語C++第3版」をちゃんと読んで理解する
>716 「C++ Primer」を買ってくる →本棚の肥やし #俺は持ってないけど
作りたいものが見付からなければ C++コンパイラを書くというのも一興
>>722 まさに肥やしになってます。
ごつい割りには、きちっとした説明がほとんどされてない。
template周りだけは結構まともな内容なので、これのためにだけ8000円払った。
>>716 実践経験を積みたいならサーバー立ててソケットを動かしてみる
/*10個の英字を読み取り、その中からアルファベット順に並べたとき 一番最初にくる文字を表示するプログラム*/ #include <stdio.h> int main(void) { int i; char ch1, ch2; printf("英字を10個入力してください\n"); ch1 = getchar(); for(i = 1; i < 10; i++){ printf("%d", i); /*動作確認のため*/ ch2 = getchar(); if(ch1 > ch2){ch1 = ch2;} } printf("%c", ch1); return 0; } ループの中で1つ文字を読み込むときにi++が2回行われているようなんですが どうしてでしょうか?
>>726 あんたは英字キーしか押さなかったのか?
改行キーも押しただろう?
つまり、改行キーを押したことで改行コードも入力されるんだよ。
>>726 誘導元で改行コードが入力されてるからって教えてもらってたでしょ?
それを踏まえて、どうすればいいですか?って内容ならともかく
同じ質問をそのまま書いちゃダメよ。
>>726 abcdefghij[Enter]と入力すればお前の望むとおりの入力が得られる。
a[Enter]
b[Enter]
こう入力していくと[Enter]こと改行文字もgetchar()で読み込まれる。
それをお前はi++が2回実行されていると表現した。
731 :
726 :2005/08/26(金) 12:47:43
ありがとうございます!おかげで解りました。 質問の仕方は以後気をつけます。すみません
>>726 >>728 で言ってるのはこんな感じね。
printf("英字を10個入力してください\n");
ch1 = getchar();
i = 1;
while(i<10)
{
ch2 = getchar();
if(ch2 != '\n')
{
printf("%d\n", i); /*動作確認のため*/
i++;
if(ch1 > ch2){ch1 = ch2;}
}
}
>>732 なるほど。こっちのプログラムのほうが良いね
ありがとう(^ω^)
普通にForループ内でgetchar呼んだ後に if (ch2 == '\n') ch2 = getchar(); でもいい
>>734 それだと2回目も改行コードの時にカウントされるんじゃない?
736 :
誘導者 :2005/08/26(金) 13:14:57
>>729 同じ質問そのままだったから誘導だけして何もヒント書かなかったと思っちゃったよw
>>735 そのこと忘れてた・・・ それなら↓でどう?
while ((ch2 = getchar()) == '\n');
メモリ確保すべきかどうか、についての質問ですが class Hoge { int a; public: void SetData( int data ); int GetData(); }; を vector<Hoge> g_Array; void Piyo() { Hoge tmpH; g_Array.push_back( tmpH ); とするのと vetor<Hoge*> g_Array; void Piyo() { Hoge* ptmpH; ptmpH = new Hoge; g_Array.push_back( ptmpH ); とするのとは どちらがいいんでしょうか。
>>739 それだけの目的だと、push_back()の後にdeleteするわけだよね。
わざわざnew/deleteするまでもないと思う。
つーか、g_Array.push_back(Hoge());でいい気が。
更に余談だが、vector(vetorじゃないよな)をグローバルに置くのは如何な最中と。
742 :
739 :2005/08/26(金) 17:22:04
レスどもです。 コードは簡潔に書いてますが あちらこちらの関数で g_Arrayを使いまくる といった予定です。 で、最終的には (newした場合) #define SAFE_DELETE { if(p) { delete (p); (p) = NULL; } } void Clear() { for( int i = 0; i < g_Array.size(); i++ ) SAFE_DELETE( g_Array ); g_Array.clear(); } を呼び出しちゃったりなんかしてみたりしようかと。 目的によってnewは必要ではなかったりするのですね 参考資料でよく、newを見かけるもので。 で、<vetor> 拙僧慌てておりました。
743 :
739 :2005/08/26(金) 17:25:15
なるほど サイズですか structやらいっぱい抱え込んだ classになると newの必要性が出てくるのでしょうか。
744 :
739 :2005/08/26(金) 17:27:54
おおおお 間違えてる SAFE_DELETE( g_Array[i] ); でも、合っているのだろうか。
せめてシングルトン。
>>743 要素に触るたびに毎回コピーされるから、大量のメンバーを抱えたclassなら
直接コンテナに放り込むのはやめた方がいい。
>>739 思いっきり勘違いしていそうなんだが、vector<Hoge> g_Arrayに
g_Array.push_back(?)したら放り込まれるのはHogeの実体のコピーだぞ。
つまり、あんたのコードで言えば
Hoge tmpH;
g_Array.push_back(tmpH);
でも
Hoge*ptmpH;
g_Array.push_back(*ptmpH);
delete ptmpH;
でも
g_Arrayの中身をdeleteしちゃいかん。
Hogeの実体ではなくポインタを放り込みたいなら
vector<Hoge*> g_Array;
Hoge*ptmpH=new Hoge;
g_Array.push_back(ptmpH);
でいい。
#勿論、後でdeleteするとして。
748 :
739 :2005/08/26(金) 18:05:27
>>745 シングルトン? ジョン・シングルトンさんですか?
というのは冗談で、昔調べましたが意味わからんでした。
シングルトンパターンってなんぞや とw
>>746 実際に扱うclassはいろいろ数値を入れ込みますので
newしておきます。 vector 要素 コピー でググルと興味深い話が
>>747 大丈夫です 昔deleteして、苦しめられましたから。
>>748 つ[オブジェクト指向における再利用のためのデザインパターン]
>>748 インスタンスは常に1つであると保証されるデザインパターンのこと。
class Foo{
private:
static Foo* foo;
Foo(){ ... };
public:
Foo* GetFoo()
{
if(!foo)
foo = new Foo();
return foo;
}
void DeleteFoo()
{
if(foo)
delete foo;
foo = NULL;
}
void Func(){ ... }
};
Foo* Foo::foo = NULL;
こんな感じでコンストラクタをprivateにし、
別途、インスタンス取得/解放用の関数を用意する。
こうすることで、ソースのどこからでもインスタンスを参照できる
ただし、最後にインスタンスを解放するのを忘れてはならない。
Modern C++ Designにもひとくさりsingleton周りの話が載っていたな。
ふと思ったんだけど文字を入力するのに char ch;として scanf("%c", &ch); ってやるのと ch = getchar(); ってやるのってどうちがうの?
scanf("%c", &ch); は、文字以外の入力で暴走する。 ch = getchar() は、ファイル終端コードが判定できずに暴走する。
>>753 getcharってちゃんとEOF返すようになってなかったっけ?
man見る限りじゃそう書いてあるが
>753 「文字以外の入力」って何? 何を入力したら暴走するの?
>>753 暴走しません。君の使い方がおかしいだけです。
>>754 >>752 はchをchar型にしてるからEOFをうまく認識しない(またはEOFでない文字をEOFと判定してしまう)
つまり、 getche()を使えと、そういうことですね?
759 :
739 :2005/08/26(金) 22:38:34
>755 まあ、フォーマットに沿わない文字列を渡すと嫌なことにはなる。 #include <stdio.h> int main(){ int i; do{ printf("数字を入力してください:"); scanf("%d", &i); // ここで'a'を渡すと・・・・・・ printf("[ %d ]\n", i); } while(1); return 0; } >758 getchar()はintで受けろという話。
761 :
デフォルトの名無しさん :2005/08/26(金) 22:42:24
>760 そんなことは聞いていない。 >scanf("%c", &ch); は、文字以外の入力で暴走する。 「文字以外の入力」って何? 何を入力したら暴走するの?
いや、俺に言われても困る。753に聞いてくれ。 ID表示無いのって不便な・・・
763 :
デフォルトの名無しさん :2005/08/26(金) 22:48:05
>>752 戻り値が違うので、EOFの判定の仕方が違う。
C++の基本的な部分と思われるところで疑問点が。 classObjectのポインタから実体にアクセスする方法なんですが、 classの配列をnewで宣言した場合に、 配列の一つのObjectのメソッドにアクセスするときには _obj[i].init(); と書かないといけなくて、 配列ではなく単体でnew宣言したObjectの場合は、 _obj->init(); と書かないといけない理由がわかりません。 上のように書けばコンパイル通って動作も問題ないんですが、 どうにも納得いきません。 どこかこのへんの事を詳しく書いてあるサイトとか無いでしょうか? コンパイル環境:bcc32 v5.5.1
単独オブジェクト Object x = Object(); 単独オブジェクトのメンバのアクセス x.init(); 単独オブジェクトへのポインタ Object x = new Object(); 単独オブジェクトのメンバのアクセス x.init(); オブジェクト配列 Object x[] = { Object(), Object(), Object() }; オブジェクト配列のメンバのアクセス x[i].init(); オブジェクトポインタの配列 Object* x[] = { new Object(), new Object(), new Object() }; オブジェクトポインタの配列のメンバのアクセス x[i]->init();
>>764 そりゃC++以前の問題。Cの構造体と配列とポインタから勉強し直してくれ。
767 :
765 :2005/08/26(金) 23:10:04
訂正 誤>単独オブジェクトへのポインタ Object x = new Object(); 正>単独オブジェクトへのポインタ Object* x = new Object();
>>764 型を意識しろ。
classObject a[10];
classOjbect* p = new classObject;
a[0] はclassObject。メンバアクセスには . を使う。
p はclassObject*でポインタなので、メンバにアクセスするには -> を使う。 p->Init()
*p とすればclassObjectになるので . が使える。ただし演算子の優先順位があるので (*p).Init() と書く。
00,01,02,03,04,05,06,07,08,09 10,11,12,13,14,15,16,17,18,19 C言語でこのようなファイルの中身をfgetcで一文字ずつとりだし、20の一次配列に格納したいのですが どのようにすればよいのでしょうか。 whileで一文字づつ取っていくので00だったら0と1がそろってから配列にいれカンマはj除きたいのですが swith文で可能でしょうか? 初心者で解りづらいかもしれませんがアドバイスをお願いします。 while((c=fgetc(fp)) != EOF){ swith(c){ case ',': case ' ': default: for (i = 0; i < 20; i++){ array[i] = d; } } }
>769 fgetcを使うのは既定事項なの? もっと他にやりやすい方法があると思うんだが。
771 :
764 :2005/08/26(金) 23:22:37
>>765-768 ありがとうございます。
_obj* p0 = new _obj();
p0->init();
_obj* p1 = new _obj[10];
p1[2].init();
↑
これが通る(こうしないと通らない)のは、
_obj[i] ってやった時点で、もう実体を指してるってことですか…。
>766
痛いです。
やっぱCの基礎をちゃんと押さえておく必要がありますよね…w
int array[20]; int i = 0; int d = 0; while ((c = fgetc(fp) != EOF) { if (isdigit(c)) { d = d * 10 + c - '0'; } else if (c == ',' || c == '\n') { array[i++] = d; d = 0; } } fgetc より getc じゃないか?
>>764 _obj[i] は *(_obj + i) と同じなので、_objがclassObject*型なら*(_obj + i)はclassObject型になる。
だからメンバアクセスには . を使う。
>>769 int array[20];
int i = 0, n = 0, ch;
while(i < 20 && (ch=fgetc(fp)) != EOF)
{
if( isdigit(ch) ) n = (n * 10) + ch - '0';
else {array[i++] = n; n = 0;}
}
775 :
774 :2005/08/26(金) 23:27:20
あ、ちょっとまずいけど、題意は満たすか。
>>770 >>772 ありがとうございます。
strtokを使って分割した方がやりやすそうなんですが、今回はこれで。
getcとfgetcはほとんど同じだとあったのでfgetcにしてみたんですがだめですか。
>>774 すいません、更新してなかったのでアンカー入れ忘れました。
試してみます、ありがとうございました。
778 :
764 :2005/08/26(金) 23:41:55
>>773 あー、なるほど。納得です。
ついでにCの構造体と配列周辺を見直してきます…w
>776 getchar の代わりに fgetchar を使うやつってほとんどいないだろう? getc の代わりに fgetc を使うのは、それと同じ。
>>771 (_obj+i)->int();
とでもやってろ
そんなとこでw使うなキモイ
笑うとこじゃねぇだろ能無しが
笑わせておけばいいじゃねぇか ハイ次ドゾ
>779 getsとfgetsなら後者を使うのが推奨されるのでそういう説明は良くないと思うが。
>>779 fgetcharが使われないのは標準でないということもある。
今となっては、fgetcだって盲腸みたいなもんだろ? getcに関数版とマクロの両方を用意しなければならないんだし。
素数求めたいんですけど、どこが悪いんでしょうか? 答えとにらめっこしてもさっぱりorz int s,x,y; scanf("%d",&s); for(x=1;s>x;x++) { y=0; for(y=1;x>y;y++) { if (0==x%y) { printf("%d\n",x); break; /*これでfor文抜け出せますか?*/ } } } return 0; }
>785 1で割ったあまりは0
>786 >break; /*これでfor文抜け出せますか?*/ 内側のforは抜けられるけど、外側のforは抜けられない。
これはgotoの出番ですね!
適当にエラトステネスのふるい #include <stdio.h> #include <stdlib.h> int main(){ int num; char str[10]; fgets(str, sizeof(str), stdin); if(!sscanf(str, "%d\n", &num)) exit(EXIT_FAILURE); /* ここから本題 */ int *array = (int *)calloc(num+1, sizeof(int)); for(int i=2; i<=num/2; i++){ /* マーク済みならスキップ */ if(array[i] == 1) continue; /* 倍数にマーク付け */ for(int j=2; i*j<=num; j++) array[i*j] = 1; } /* 表示 */ for(int i=2; i<=num; i++){ if(array[i] == 0) printf("%d ", i); } /* ここまで本題 */ free(array); return EXIT_SUCCESS; }
はじめまして。 C++ではなくて、Cです。(C++とCの違いがあまりわかりませんが) いきなり質問なのですが、コンパイルで、 「invalid operands to binary+」というエラーがでてしまうんですが、これはどのようなエラーなのでしょうか? いくつか自分で気づいた点を修正したのですがいくらやっても直りませんでした。 できればこちらのソースを貼ってマズイところを教えていただきたいのですがよろしいですか?
>>791 ソース貼れ。コンパイラの種類とバージョンも書け。
>>791 "invalid operands to binary+" というそのままじゃないか。
「二項演算子 + のオペランド(項)が無効」とでも訳せばいいだけかと。
なに足し算すりゃこうなるんだと思ったら、gcc なら 10.0 + "10" とか?
無効、より、不正、のほうが通じるか。
>>791 だから画像処理スレと同じ聞き方したら同じ答しか帰ってこないに決まっているだろう。
問題のソースを貼れよ、この低濃。
fedora core4 gcc4.0.1の環境で、ファイルの削除方法を教えてください
ソースです。 コンパイラは・・・GCC on Cygwin?かな?バージョンはちょっとわかりません。怒られて3つになってしまいました #include<stdio.h> #include<string.h> #include<math.h> #define X_SIZE 512 #define Y_SIZE 512 main(){ int i,j,m,n,p,q,rsc,rsr,dsc,dsr,mp,mq,RN,DN; double min,dif; unsigned char pic[X_SIZE][Y_SIZE]; char fnamein[100],fnameout[100]; FILE *fin,*fout; RN=4; DN=2; //レンジとドメインの分割数 rsc=X_SIZE/RN; rsr=Y_SIZE/RN; dsc=X_SIZE/DN; dsr=Y_SIZE/DN; int fr[RN][RN], fc[RN][RN]; //各レンジに対し、どのドメインを持ってくるか
800 :
791 :2005/08/27(土) 12:02:41
printf("ファイル名:"); scanf("%s",fnamein); printf("圧縮後ファイル名:"); scanf("%s",fnameout); if((fin = fopen(fnamein,"r"))==NULL){ printf("%sファイルを開けません\n",fnamein); exit(0); } for(i=0;i<X_SIZE;i++){ for(j=0;j<Y_SIZE;j++){ pic[i][j] = fgetc(fin); //pic[][]に全ピクセルを読み込む } } fclose(fin); //1つのレンジブロック for(m=0;m<RN;m++){ for(n=0;m<RN;n++){ min=1.0e10; //各レンジに対して最も良いドメインを探す for(p=0;p<DN;p++){ for(q=0;q<DN;q++){
801 :
791 :2005/08/27(土) 12:03:36
dif=0;
for(i=m*rsr;i<(m+1)*rsr;i++){
for(j=n*rsc;j<(n+1)*rsc;j++){
◎ dif+=fabs(pic[i,j]-(pic[2*i,2*j]+pic[2*i,2*j+1]+pic[2*i+1,2*q]+pic[2*i+1,2*j+1])/4.0); //ドメイン(p,q)とレンジ(m,n)の誤差を計算
}
}
if(min>dif){min=dif; mp=p; mq=q;} //更に近似するドメインがあれば、前のものと取り替えて記憶
}
}
fr[m][n]=mp; fc[m][n]=mq; //レンジ(m,n)に対する最適なドメイン(mp,mq)を記憶
}
}
fout=fopen(fnameout, "w");
for(i=0;i<X_SIZE;i++){
for(j=0;j<Y_SIZE;j++){
fprintf(fout,"%d",pic[i][j]);
}
}
fclose(fout);
}
フラクタル画像圧縮をするプログラムのつもりなんですが、エラーがでるのは◎のついた行です。
他にマズイとこがあったら指摘してほしいです。スキルに見合わぬことやってるので、ほんとわけわかめです。
宜しくお願いします
>>799 =
>>791 です。
> int i,j,m,n,p,q,rsc,rsr,dsc,dsr,mp,mq,RN,DN; この時点で読む気がなくなる俺がいる。 変数宣言は利用する最も狭いスコープでしろ。
ソース貼れとか言っておいて いざ貼ったら読む気しないってw 馬鹿じゃねーのwww
言ってないもん。馬鹿ジャねーの?www
>>800 Cの2次元配列の使い方が間違っとる。
× pic[i,j]
○ pic[i][j]
806 :
805 :2005/08/27(土) 12:13:30
そのせいで、 pic[2*i,2*j]などの型が unsigned char[] に なってしまっているので、 + 演算ができない。 unsigned char x[10]; unsigned char y[10]; で、 x + y の計算をしようとしているようなもの。
そのx+yはできるだろ・・・ BYTEはなんのtypedefですかと・・・
>>805 コンパイルできました!ありがとうございます!
と思い実行したら・・・core dump・・・
>>808 ・コアを吐く原因の一点目
コピペばかりでプログラムを組むのはやめた方がいいよ。
forの条件をよく見てご覧。
>>808 ・コアを吐く原因の二点目
問題の絶対値を計算している行。座標値を確認しよう。
ここで、i、jの値はそれぞれXSIZE-1、YSIZE-1になるが、それを2倍したら当然領域外になる。
>>810 ありがとうございます!
よく確認してみます。
自分の力でできるかわからないですけどね・・・_| ̄|○
>>807 おまえんとこは "aaa"+"bbb" や char *x,*y; x+y; が計算できるのかと(ry
>>812 Cを知らないのは致命的だが、今から習えば、来年の夏ごろまでには…
まあ、誘導されてこのていたらくなら、それ以前に見込み無さそうだが…
>>813 ポインタ同士の足し算はどうだかわからんケド、引き算は使うことないか?
void foo(char* pTop) {
char* pFoo = strchr(pTop, '/');
int iLen = 0;
if (pFoo) iLen = pFoo - pTop;
……
}
>>814 なあ、ボクちゃん、足し算わかってからでなおそうな。ヴォケ。
当然、自明の話をしてるだけなんだが、これまた厨は……
まぁホットケよ
相手にすんな
ポインタ同士の減算はできるな。その結果は要素数でsize_tになるが。
急速にスレの質が(ry
>>819 そうだった。うん。知らなかったわけじゃないよ!?
>>819 うちにあるやつでは ptrdiff_t だなあ。
頭痛すぎなんで釣られておくsigh. ってもうやめろ。
たいていは、size_t が unsigned int で、ptr_diff は int
初心者大歓迎って書いてあるからおそるおそる聞いてみる false ってなんて読むの? ふぁるす? ふぇいるす?
ふぁるす
英語教室は有料サービスとなっております
>>828 ありがとう。ふぉーすって聴こえるね。
まぁ、無難に「ふぉーるす」って読むことにするよ
ありがと
おまいら巻き舌の聞き分けもできないのかと
>>830 false のどこに巻き舌(r)の発音があるのかと
つうか、いい加減板違い
プログラマって簡単な英語も読めないヤツが多くて困るな。 Acceptをアセプトだの、しまいにゃResultをレサルトだの、呆れて物も言えんわ
違うのか!?
何に対して違うのかといってるのだw
ノンノン!ルィザィアルトゥ
なんか字の感じがジョジョっぽい
>ザィ 無理.
むりどっと
ム・リゾット
idle→アブドゥル
ポインタ演算についての質問です。 int Function(char** text);な形の関数内で一文字づつスキャンしているのですが、次の文字へ移動する際に (textは文字列へのポインタのポインタ) *str += 1; or *str = *str+1; //正常に動作 *str++; //アクセス違反発生 となるのですが上と下では動作がどのように異なるのでしょうか?
(*a)++ と *(a++) の違い
>>841 *や++は結合則が右から左
*str++は(*str)++じゃなくて*(str++)になる
ポインタの中身を足してるのと、 ポインタ自体のインクリメントの違い
unsigned x=0xFFFFFFFF;
x=x
>>32 ;
とした時、x=0にはならないんですか?
847 :
846 :2005/08/29(月) 16:34:57
解決しました。 結果は未定義になるということがCの仕様に出ていたので 0になるわけではないようですね。
>>841 おまえさん、わざわざ間違えやすいことしてないか?
文字列を受け取ってそれを一文字ずつスキャンしたいなら、
int Function(char *text); にして、text[i]で見ればいいじゃないか
>>848 こんな感じで使うのでchar*渡しだとダメなのです。
char hoge[] = "C5D5D5#";
char *ichiji = hoge;
char note;
while(0 <= (note = Function(&ichiji)) ) //NULL文字が出現すると-1返す
printf("%d\n", note);
60
61
62
char**の必要ねぇじゃん・・・
たぶんポインタの意味や使いどころを誤解していると思う。
852 :
デフォルトの名無しさん :2005/08/29(月) 20:40:04
BYTE* b=(BYTE*)"い"; printf("%x\n",*b); これだと出力は82なのに、 char* c="い"; printf("%x\n",*c); これだと出力はffffff82になります。 char型は1バイト変数だと思っていたのですが、0xffffff82は4バイトですよね。 どうしてこんなことになるんですか? メモリの1アドレスのビット長って1バイトなんですか?4バイトなんですか? BYTE変数やchar変数って4バイト中の1バイトしか使わない変数ってことになるんですか? dosVでインテルのペンティアム4 ハイパースレッドのCPUです。 頭こんがらがってます。助けてください。
>>852 >BYTE* b=(BYTE*)"い";
>char* c="い";
バカかオマエは・・・
整数の格上げと符号拡張
ポインタだから。
unsigned char a = 0x80; char b = 0x80; printf("%x %x\n",a,b);
オマケ printf("%d %d\n",a,b);
>>852 まぁ、あれだ。
ポインタについて勉強しなおせ。
>>852 printfが変数のバイトサイズを認識する手段は書式にしかない。
%x と書けば、全部 int 型 と扱われる。
char 型の引数はすべてint 型に拡張されて引数渡しされている。 printfの処理の中では char 型で処理されることはない。 %cの処理でも、いったんintにされたものをchar型にキャストしている。
ポインタ以前にいろいろ駄目だろ。謙虚にはじめからやり直しできなきゃ…
ポインタは無関係だから無視していいぞ。
>>852 お前んとこではcharがsignedになっているんだろう。
だから*cは-126になる。
printfなどの可変個引数では必ず格上げしてint/unsigned int以上の型へ変換して引数を渡すことになる。
-126をintへ変換した値を16進法であらわすとffffff82になる。(intが32ビットとして)
864 :
861 :2005/08/29(月) 21:58:19
>>862 おお、それさえはっきり言わんと駄目そうだったんだ。
とりあえずは
>>856 をきちんと理解できるまでになるかだよなあ。
>>865 unsignedの場合もある。つーか、オプションで切り替えることさえできる場合が多い。
867 :
デフォルトの名無しさん :2005/08/30(火) 09:58:42
質問させてください 下のソースは VRAMに10×10のドット画を表示するソースなんですけど この画像を20×20に拡大したいんです どうすればいいでしょうか? 出来れば 後々また質問に来なくていいように注釈付だとありがたいです vr vram アドレス pt ??? fnt 画像データアドレス col カラー vr = (unsigned short *)0x4000000+(y*512+x); for(y1=0;y1<10;y1++) { pt = *fnt++; for(x1=0;x1<10;x1++) { if (pt & 1) *vr = col; vr++; pt = pt >> 1; } }
>>867 転送元を走査する速度を1/n倍にすれば、転送先ではn倍になる。
そのソースで10*10の表示ってできるの? これって転送先が100*1になっているようにみえるけど気のせい?
というか、「pt ???」ってなんだよ 質問するならちゃんとした情報を書いてくれ。 そういや、この場合って拡大時の画素間の補完はしなくていいの?
>>868 for分の 増加分を 0.5にしてみましたけど駄目でした
>>869 はい フォント表示なんですけど10×10の文字が表示されます
>>870 fnt = (unsigned short *)&zenkaku_font10[n*10];
pt = *fnt++;
pt がフォントデータのアドレスなのかも
872 :
852 :2005/08/30(火) 10:52:03
>>853-866 printfで%xはバイナリデータがそのまま渡されるのかと思い込んでました。
charはsigned intにされて、byteはunsigned intにされて渡されていたからだったのですね。
よくわかりました。
ありがとうございました。
873 :
デフォルトの名無しさん :2005/08/30(火) 10:57:49
本文を書いて「書き込む」をクリックした後に何か色々出てきて「全てをしょう
>>871 >for分の 増加分を 0.5にしてみましたけど駄目でした
おまえ何も理解して無いだろ。
875 :
デフォルトの名無しさん :2005/08/30(火) 11:03:02
本文を書いて「書き込む」をクリックした後に何か色々出てきて「全てを承諾 して書き込む」ってでてくんですよ。そしたら、一番下にクッキーを設定すれ ばこの表示はなくなりますって書いてあって。意味不なんですけど。教えて下 さい。そもそもクッキーっていう意味がわからんし。
>>875 鼬害。人に聞く前に自分で調べる習慣を身につけましょう。
>>867 vrの初期値を見る限り、vramは横512画素分あるように見える。
翻ってその後のvrの振る舞いを見る限り、縦方向には増やされていないから
>869の言うように10x10にはならないと思うのだが。
#つーか、先ずはきちんと動いているものを貼れよ。
>>875 > クッキーっていう意味がわからんし
お菓子だ。
>>879 ならばソースを晒せ
vramの表示に関係するところも含めて
申し訳ない ソースが欠落してたorz #defineLINESIZE512 fnt = (unsigned short *)&zenkaku_font10[n*10]; vr = (unsigned short *)0x4000000+(y*512+x); for(y1=0;y1<10;y1++) { pt = *fnt++; for(x1=0;x1<10;x1++) { if (pt & 1) *vr = col; vr++; pt = pt >> 1; } vr += LINESIZE-10; }
882 :
デフォルトの名無しさん :2005/08/30(火) 11:16:22
>>876 お言葉ですが、あなたのように即そういう風に決め付けてしまうのもどうかと 思います。私は何度も2ちゃんのガイドラインを読みました。しかし、クッキ ーという単語はかいてありましたがその意味はかいてありませんでした。なの でこの掲示板にきて質問してみたのです。私も初心者ですがそのような最低限 なことは心得てるつもりです。 あ、取り乱してしまいましたね、すいません 。ちょっと話がそれてしまったので改めて聴きます。>>875について誰か 教えて下さい。
>>881 それだけじゃちゃんと動いてるのか確認できないだろ
>>883 基地外は放置しとけ、後2日の辛抱だ
>>883 スレタイの【初心者歓迎】だけを読んだんだろ、きっと。
長すぎて 書き込めない・・・ ちなみにpspのプログラムなので パソコン環境では試せないかも?
脳内コンパイル。正しく動くかは知らん #define LINESIZE 512 fnt = (unsigned short *)&zenkaku_font10[n*10]; vr = (unsigned short *)0x4000000+(y*512+x); for(y1=0;y1<20;y1++) { pt = fnt[y1/2]; for(x1=0;x1<20;x1++) { if (pt & 1<<(x1/2)) *vr = col; vr++; } vr += LINESIZE-20; }
>>888 ありがとうございます
それでいけそうな気配です
あとは行間等の数値も倍にするだけです
いっぱいレス使っちゃって申し訳ありませんでした
>>888 しかし、汚いプログラムだなぁ。元が汚いからしょうがないっちゃしょうがないが。
891 :
デフォルトの名無しさん :2005/08/30(火) 23:33:01
本を読んでも、よく分からないので確認させてください。 「ローカル変数の寿命は、スコープを抜けた所まで」、という事がどの初心者本にも書いてありますが、 setter(参照渡し)でクラスのメンバ変数に格納した場合、スコープを抜けてもそのまま使えるようです。 これは、こういう使い方をしても良いものでしょうか? それとも、偶然動いているだけですか? void Hoge() { //このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える CHoge hoge; //Class::SetHoge(CHoge& hoge) m_pClass->SetHoge(hoge); }
>>891 Class::SetHogeの中で何やってるかわからんから推測になるが
中でhogeのコピーを取ってるならOK。
まずはm_pClassとやらの正体を教えてくれんか
>>891 スコープを抜けてもすぐに使えなくなるわけではない。
その変数のメモリ領域が新たに使われるまでは、元のデータがそのままになっている。
だから一見するとそういうことをしても動くように見える。
895 :
偽616 :2005/08/30(火) 23:43:33
void Hoge() { //このhogeがスコープを抜けた後も、m_pClass->GetHoge()で拾える CHoge hoge; //Class::SetHoge(CHoge& hoge) m_pClass->SetHoge(hoge); } ローカル変数は { } の中で有効と覚えておけばよろし。
>>892-895 ああ、なるほど。
よく考えたら、無意識にコピーしてました。
Class::SetHoge(CHoge& hoge){
m_hoge = hoge;
}
RGB15bitの0〜31の値をRGB24bitの0〜255の値に拡張する場合、 n<<3 と n*255/31 ではどちらが良いでしょうか。
>>897 その二つの結果が違うことは理解しているよね?
>>899 人のソース見ると速度優先なのか大抵、<<3で済ませてますが、
31が255でなくなるので、*255/31にしたのですが、これはこれで、
中間色が中途の様な気がして。
それで、(n+1)<<5 -1 なんてのも考えましたが、これだと中間色は
良くとても0が0で無くなるし、と悩んでます。
>>900 その変換の目的をよく考えて、適切な方法を採るしかないっしょ。
速度優先なのか、画質優先なのか。
画質優先の場合、白は255/255/255でなければならないかどうか。
中間色の場合も要求の如何によるし。
どちらの場合もテーブル参照なら比較的高速で融通が利くんじゃない?
#私の場合は4→8ビットだったから迷わず17倍したけどね。
(n << 3) + (n >> 2)
>>900 sbb命令使って、0のときだけ0にすればよろし。
905 :
デフォルトの名無しさん :2005/08/31(水) 13:02:04
コンストラクタをオーバーロードした際、 他のコンストラクタを呼び出すためには、どう書けばいいですか? Javaでいう、this();のような記述です。
>>905 placement new を使えば実行はできるが、
おそらく望んだ結果ではないからやめたほうがいい。
共通処理を static メンバ関数にするか、
もしくは共通の初期化を行うクラスを用意して
今作成しているクラスはそれを派生するかメンバに持つと良い。
char ctmp[4] = {0x10, 0x20, 0x30, 0x40}; int iResult; 現在4バイトのchar型配列ctmpと int型変数iResultがあります。 配列ctmpの頭から10, 20, 30, 40を使い iResultに数字10203040を入れたいのですが うまくいきません。ヒントをいただけないでしょうか。 16進数の数字をそのまま10進数にする という部分でどうやればいいのか今イメージできていません。 環境はwinxp, VC++6.0です。
>>905 オーバーロードしたんなら、普通に呼び出したいコンストラクタを呼び出せばいい
class Hoge {
Hoge() { return; }
Hoge(int i);
}
Hoge::Hoge(int i) {
Hoge();
return;
}
オーバーライドしたんなら、ParentClass::ParentClass()として呼べばいい
>>908 #include <stdio.h>
int main(void) {
char ctmp[4] = {0x10, 0x20, 0x30, 0x40};
int iResult = 0, i;
for (i = 0; i < 4; i++)
(iResult <<= 8) += ctmp[i];
printf("%X", iResult);
}
>>910 ありがとうございます、iResultの変化は
00000000
00000010
00001000
00001020
00102000
00102030
10203000
10203040
となり、シフトしてから足すのですね、
シフトでできるという発想が出てこずに苦しんでおりました、
ありがとうございます、精進します。
>>908 いやさ、(どうせ非現実的な処理だし)表示の問題だけですむならいいけど、
>>配列ctmpの頭から10, 20, 30, 40を使い
ここは初期化の部分どおり 0x10, .... だとしても、
>>iResultに数字10203040を入れたいのですが
>>16 進数の数字をそのまま10進数にする
>>という部分でどうやればいいのか今イメージできていません。
この 10203000 が 16進か 10進か曖昧すぎるのだが…
>>となり、シフトしてから足すのですね、
>>シフトでできるという発想が出てこずに苦しんでおりました、
シフトというよりは、(シフトか掛け算で)必要なだけの桁の繰り上げを
行う、というだけのことだよね。(プログラムじゃなく算数)
>>909 よくねーよ。
初心者も多く見てるスレなんだから、ネタならネタと分かるように書いてくれ。
916 :
881 :2005/09/01(木) 09:38:46
以前 グラフィック拡大の質問をしたものです 拡大できたのはいいのですが元のグラフィック(フォントデータ)が 荒いため 拡大すると荒さが目立ってしまいます そこで最初から大きなフォントを実装したいのですが やり方がわかりません pspの開発環境ではまだ 内蔵フォントは使えないので自作するしかありません 出来れば16×16くらいのフォントを実装したいです C言語で やるとしたらどうやりますか?
他所から持ってくる GBAだと第二水準まで全部もってきても余裕があった PSPは知らないが大丈夫だろう その時はhoge[]=みたいな形に変換するツールを作った ソースファイルがS-JISだと不都合があった事を付け加えておく フリーフォントを使いたいならみかちゃんフォントを推薦する
はじめまして。 今、自分で使えるプログラムランチャーを作成しています。 ウィンドウ部分のボタンのフォントを変更しようと思うのですが、 どうするかがわかりません。 どなたか教えていただけないでしょうか
919 :
デフォルトの名無しさん :2005/09/01(木) 10:22:02
後置と前置の差異をオーバーロードで あらわす時はこれでいいのかな。意見求む class CHoge{ public: CHoge& operator++(); CHoge& operator++(int){ static CHoge tmp; tmp = *this; operator++(); return tmp; } }
>>919 後置++は値を返すべきだと思う。
CHoge operator++(int)
CHoge tmp(*this);
++*this;
return tmp;
}
921 :
919 :2005/09/01(木) 10:48:03
922 :
デフォルトの名無しさん :2005/09/01(木) 11:31:36
初めまして。すみません教えてください。 コンソールアプリを作っているのですが パスワード入力のところで、エコーバック無しで文字を入力させたいのですが どのようにすれば良いのでしょうか? SetConsoleModeとか?いろいろやってみたのですがダメです。
923 :
881 :2005/09/01(木) 11:48:12
>>917 pspだとほとんど10×10の ナガフォントで
これ以上の大きさのフォントを使ってるソースが見つかりません
というわけでGBAの方をしらべてみましたが
font.c とかのファイルにテキストデータとして吐き出すツールが
無いようで 行き詰まってしまいました
>>923 プログラムは探すものじゃない。書くものだ。
925 :
922 :2005/09/01(木) 12:05:12
すいません誤爆しました。 Win32API質問箱に投げるつもりでした。忘れてください。
>>920 分かってるとは思うけど一応書いておくと、
CHoge hoge;
hoge++++;
を防止するために返値はconstにすべき
>>923 JISに16x16のドットパターンなかったっけ?
昔使った記憶があるのだけれど。
#但し、JIS1973だったかも知れず。
928 :
デフォルトの名無しさん :2005/09/01(木) 12:29:34
Red Hat Linuxのgcc3.0にて CTestcls::temp(int ifd) { ifstream test(ifd); というようなifstreamをファイルディスクリプタで 扱うことをやっていたのですが gccのバージョンがあがったら ifstream(int fd) : fstreambase(fd) の定義が無くなっちゃいました。 これどうしたらよいんでしょうか?
>>926 意味のない操作だからといって禁止する必要があるとは思えないんだが。
どちらかというとインターフェースを標準ライブラリに合わせる方が重要じゃないか?
>>929 int i;
i++++;
と同じくエラーするってことだろ。
malloc使って領域確保するのとnew演算子で確保するのって どっち使ったほうがいいですか? それぞれ特徴があったら教えていただけませんか?
malloc: 失敗したらNULL返す new: 失敗したらbad_alloc例外投げる 構造体ならコンストラクタが呼べる
newは領域確保するだけじゃないので、同列に扱うのはどうかと。
malloc ・指定したサイズの領域を確保し、そのポインタを返す ・型を気にせず(キャストして)領域を使える ・コンストラクタは呼ばない new ・指定した型の変数を作り、そのポインタを返す ・コンストラクタを呼ぶ(クラス/構造体の場合) (※deleteの場合はデストラクタ) ・配列で確保する場合は[]を付けなければならない ・オーバーロード可能
OpenDialogで開いたRAWデータ(16bitグレースケール)をFileReadを使って読み込み、 long型配列databoxに書き込みたいんですがさっぱり分かりません。ご助力お願いします。 if(OpenDialog2->Execute() == false) return; // ファイルを開く int theFile = FileOpen(OpenDialog2->FileName, fmOpenRead); FileSeek (theFile,0,0); buf=new char[3]; for(int j=0; j<Image1->Picture->Bitmap->Height;j++){ for(int i=0; i<Image1->Picture->Bitmap->Width; i++){ FileRead(theFile,buf,2); databox[i][j]=strtol(buf,&emdptr,10); } } FileClose(theFile);
例外投げないでNULL返すnewもあるだろ。
nothrow指定すりゃな。
>>935 OpenDialog()云々とファイル取り扱いは問題を分けるべきだし、コードも分けるべきだ。
後者は、RAWデータはバイナリなのではないのかな?
だとすればdatabox[i][j] = buf[0] | buf[1] << 8;でいいと思うのだが。
エンディアンが逆ならば、buf[0] << 8 | buf[1]でいい。
#つーか、文字列とバイト列の違いがわかっていない悪寒。
皆さんこんにちは。プログラマーではなく、私的な仕事ツールとしてスクリプトや簡単なC++を 使っている者です。 環境はVisual Studio .NET、MinGW on WIndowsXP、RHEL上のg++といったところです。 文字列処理は昔からstrstreamを使っていたのですが、そろそろ「古い機能使うなや」warning がウザくなってきたのでstringクラスかなにかにシフトしようと考えています。 今まで、こんなふうに書いていました。 string a = "taskfile_"; int b = 10; // 番号変えて別ファイルを作ったりするため string c = ".txt"; char fnbuf[255]; ostrstream ostr(fnbuf, sizeof fnbuf); ostr << a << b << c << ends; ofstream fout(fnbuf, ios::trunc); .... で、こいつをstringで書こうとすると、int bを文字列に変換するのにsprintf使う方法しか 思いつかない自分がいました。 itoa関数はVC++とMinGWにはあるけどgccにはありません。 みなさんはこういう場合、どうコーディングされてます?
stringstream、あるいはboost::lexical_cast。
strstreamの代わりにstringstreamを使え。以上
C言語でcsvファイルから要素をint型で読み込みたいのですが、なかなか難しいです。 strtokを使えばなんとかなるらしいのですが、正しいでしょうか? ほかにもっと良い方法などあればお教えください。
>>942 strtokで可能
後はscanfで読み込むとか、getcで読んでいってカンマが出た時点で区切るとか
>>942 strlen関数を自作してみればやり方が分かると思うお
分割した文字列からの変換はatoiでやれば済む話だし
>>939 プログラマのプロはプロフェッショナルのプロじゃないから、
カテゴリとしては君もプログラマだと思う。
プロテイン・グラマー
>>943-944 ありがとうございます。何とかなりそうです。
strtokとatoiを使ってやってみようと思います。
948 :
偽616 :2005/09/01(木) 21:43:04
>942 こんなんでよければどうぞ void csvread(int intList[], char *str) { int i; char *p, *pp; char tmp; p = str; for(i=0;;i++){ pp = p; while(isdigit((int)*p))p++; if(*p == ','){ tmp = *p; *p = '\0'; intLlist[i] = atoi(pp); *p = tmp; }else{ break; } } }
949 :
偽616 :2005/09/01(木) 21:45:37
*p = tmp; の下に p++; を追加しておいて
950 :
デフォルトの名無しさん :2005/09/01(木) 22:01:04
カエレ
953 :
950 :2005/09/01(木) 22:16:48
私は何かのマナー違反したのでしょうか? 直したいので教えてください。 レスはリンク先って書いておけばマルチじゃないと思っていましたが・・・ リンク先を読んでる人がいないのでは?と思いここにレスしたのですが。
955 :
950 :2005/09/01(木) 22:26:56
>>954 ごめんなさい。
「レスはリンク先に」でもマルチになるんですね。
スレ汚しは重ね重ねごめんなさい。
>>953 ・動作チェックしてくれと言うだけで、どこがどうおかしいかも書かない。
・他人にモノを頼んでおいてレスはリンク先へと我が儘放題。
・どんなクラスかどんな関数なのか一切情報がない。
・コードが最低最悪。
これだけ揃ってれば>952も当然だな。
>>953 自分が作ったプログラムのデバッグを
他人にやらせるのはどうかってことでしょ。
仕様が良く分からないプログラムを動かしたら
何が起きるかわからないわけだし。
最低限、簡単な機能仕様を提示して
ソースに処理の内容がわかる程度にコメントが付いてれば
添削してくれる人はいるかもね。
手抜きで書いたソースなぞ見たくもないがな。
958 :
950 :2005/09/01(木) 22:27:41
sage忘れてしまいました。ごめんなさい。
959 :
957 :2005/09/01(木) 22:28:22
960 :
偽616 :2005/09/01(木) 22:39:32
三度目の正直だったらバイト先の好きな子に日曜日告白 バグはないよね・・・ void csvread(int intList[], char *str) { int i; char *p, *pp; char tmp; p = str; for(i=0;;i++){ pp = p; while(isdigit((int)*p))p++; tmp = *p; *p = '\0'; intLlist[i] = atoi(pp); *p = tmp; if(*p == ','){ p++; }else{ break; } } } 南無三
961 :
偽616 :2005/09/01(木) 22:41:48
intLlist[i] = atoi(pp); ~ intList[i] = atoi(pp); 三度目の正直じゃなかったけど、告白
962 :
デフォルトの名無しさん :2005/09/01(木) 22:43:48
質問です。 signed→unsigned変換、unsigned→signed変換をするために こんな感じで書きました。 変換の過程でデータが誤変換することは考えられますか? またもっと良い変換方法はありますか? signed char sc_before[5] = {0,-1,2,-3,4}; signed char sc_after[5]; unsigned char uc_after[5]; int i; for(i=0; i<5;i++) { uc[i] = sc_before[i]; } /* ucを処理 */ for(i=0; i<5;i++) { sc_after[i] = uc[i]; }
isdigit()の定義域は 0..255 と EOF(-1) char が signed char の環境では、 isidigit((int)*p) は間違い。
964 :
偽616 :2005/09/01(木) 22:52:40
memcpy(uc, (unsigned char *)sc_before, 5); /* ucを処理 */ memcpy(unsigned char *)sc_after, uc, 5); memcpy()については自分で調べてちょ >963 ありがとうございます。 こんなの見つけてきました。 str[i]が数字でないのにisdigitが真になってしまうバグがありました。 str[i]が負になっていたことが原因でした。 isdigitなどctype.hのマクロの引数は-1〜255でなければならないそうです (man isdigit)。この引数の型がcharの場合、-128〜127の値になるので、誤動 作を起こすことがあります。 isalnum, isalpha, isascii, isblank, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, isupper, isxdigit これらのマクロを使う場合は isdigit((unsigned char)c) のようにunsigned charにキャストする必要がありそうです。 。・゚・(ノД`)ヽ
>>962 元を残しておく必要がなければ、こうできる。
unsigned char *uc_after = reinterpret_cast<unsigned char *>(sc_before);
/* ucを処理 */
後はsc_beforeが元のコードのsc_afterとして使える。
ただ規格では負の値をunsignedへ変換するのは問題ないが、その逆は未定義か何かだったはず。
966 :
939 :2005/09/01(木) 22:57:37
ありです。コンテナには結局ないんですねえ。明日会社行ったら試してみます。
>>945 Σ('A`) なぬ
それじゃグラマーなだけの営業屋だと思っていた俺は
>>966 は
∩
_( ⌒) ∩__
//,. ノ ̄\ / .)E)
/i"/ /|_|i_トil_| / / / ̄ ̄ ̄ ̄ ̄
|ii.l/ /┃ ┃{. / / < ぱいぱい ボイン!ボイン!ボイン!
|i|i_/''' ヮ''丿i_/ \_____
i|/ ,ク ム"/ /
|( ヽ _,.-===、j、
ゞヽ‐イ/´ ヽ ヽ、
\! ::c:: ! :p
}ヽ __ ノ、_ノ
/ ノ ノ´
なのか?
968 :
デフォルトの名無しさん :2005/09/02(金) 00:19:53
>>965 ありがとうございます。
>ただ規格では負の値をunsignedへ変換するのは問題ないが、
>その逆は未定義か何かだったはず。
ということは私のコードでも965さんのコードでも
問題ありということですよね。
そこを解決できないでしょうか?
signedのデータをある製品の関数に渡さなければいけないのですが、
製品の関数の入力と出力がunsignedで、出力されたunsignedを
元のsignedに変換する必要があるのです。
969 :
966 :2005/09/02(金) 00:26:02
>>967 違います。そんなAA貼って楽しいですか?
char* a=(char*)malloc(100)と char* b=(char*)calloc(100,1)と char* c=(char*)calloc(1,100)とでは 確保されるメモリ領域のサイズは同じ?
972 :
デフォルトの名無しさん :2005/09/02(金) 07:05:34
fwrite,freadの2、3番目の引数って一つで十分なんじゃ ないですか? エンディアンもこれは関係なさそうな気が
>>966 std::stringstreamは入出力両用で、ostrstreamに対応するのはstd::ostringstreamだ。
>>968 すまん。規格見たら「処理系定義の値になる」だった。
>>972 例えばintが16ビットの環境で64K以上アクセスするときに便利。