【初心者歓迎】C/C++室 Ver.20【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/07/18(月) 08:59:42ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0153デフォルトの名無しさん
2005/07/30(土) 01:04:24うーん、そうなんですか。
例えばvoid func(char* buffer, unsigned int length)
という関数を渡す場合だと、普通の関数ではそのままでOKで、
クラスメソッドにする場合は何かを付けないといけないのでしょうか?
よかったらそれを教えてもらえませんか?
0154デフォルトの名無しさん
2005/07/30(土) 01:11:05例えば、そのfuncがclass testのメンバ関数だとすると、funcへのポインタの型は
void (test::*)(char *, unsigned int)
になって、
void (*)(char *, unsigned int)
とは違うし、前者を後者に変換することはできない。
>>152がどういう意味で「型をあわせろ」と言ったのか知らんが。
0155デフォルトの名無しさん
2005/07/30(土) 01:46:53どうもです。
やっぱり出来ないんですか。
他の方法を検討してみます。
ありがとうございました。
0156デフォルトの名無しさん
2005/07/30(土) 02:04:20こんな感じ
#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;
}
0157デフォルトの名無しさん
2005/07/30(土) 08:36:53取ろうとしているのですが、親から読み出そうとするときに止まってしまう時があります。
ファイルディスクリプタをfdopenで開いてfgetsで読み出してるんですが、その部分
で止まっているのでeofまで読めていないのかな、とも思ってるんですが…。
こういう時って、どうするのでしょうか?。UNIX依存の話で申し訳ないのですが、
どなたかご教授ください。
下にテストに使ったの最小構成のプログラムを載せます。
0158デフォルトの名無しさん
2005/07/30(土) 08:39:46{
return 0;
}
0159157
2005/07/30(土) 08:52:31アップローダにupしました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/819.c
0160157
2005/07/30(土) 08:54:51(標準出力/エラー出力を出すような)適当なコマンドを作って、実行用の
関数に与えています。
0161デフォルトの名無しさん
2005/07/30(土) 10:41:25FILE * fp = fopen("/bin/sh 2>&1", "r");
じゃだめなんだろか。
それはそうと、Unixプログラミングスレに行った方がよさそうだね。
0162デフォルトの名無しさん
2005/07/30(土) 10:51:14ありがとうございます。
よく分かりました。
0163157
2005/07/30(土) 10:53:03> 161さん
アドバイスありがとうございます。
UNIXプログラミングスレであらためて質問したいと思います。
ところで、これって何をやってるのか理解できない私なのですが、
> FILE * fp = fopen("/bin/sh 2>&1", "r");
shの標準出力とエラー出力を読むfpを確保しているのでしょうか。
0164157
2005/07/30(土) 10:53:46ハズカシイ
0165デフォルトの名無しさん
2005/07/30(土) 10:59:05#いかんなぁ、頭がやられているらしいw
0166157
2005/07/30(土) 11:04:09標準出力と標準エラー出力を別々に読み出したいのでpipeを使っています。
popenだとそれはできない、という認識です。
・・・う、不安になってきたのでpopenについて調べてみます。
0167デフォルトの名無しさん
2005/07/30(土) 13:56:30「クラスメソッド」って言ったら C++ では static メンバ関数に相当するものじゃないの?
後、C の関数だと渡せるのに static メンバ関数にしたら渡せないなんてあり得るの?
ソース見せて欲しい。
0168デフォルトの名無しさん
2005/07/30(土) 13:58:02147の言うクラスメソッドは非メンバ関数のことだろ。
0169デフォルトの名無しさん
2005/07/30(土) 14:15:120170デフォルトの名無しさん
2005/07/30(土) 17:36:030171デフォルトの名無しさん
2005/07/30(土) 18:07:15コンパイラ側で定義されてる型
char int short long float double等
0172デフォルトの名無しさん
2005/07/31(日) 13:08:37c = "abc";
これは良いのに、
char* c;
c = 'a';
これがだめなのは何故ですか?
0173デフォルトの名無しさん
2005/07/31(日) 13:09:55{
switch(iWhat) {
case WHAT_INT: return &m_int;
case WHAT_CHAR: return &m_char;
case WHAT_INTERFACE: return &m_interface;
}
}
のような任意型を返す場合、templateは使えますか?
0174デフォルトの名無しさん
2005/07/31(日) 13:16:49'c'はただの定数。ポインタに代入してどうする。
"abc"なら領域が確保されてchar *cがそこを指すポインタって事になる。
>>173
void*で返せばよくね?
0175デフォルトの名無しさん
2005/07/31(日) 13:39:03template による型の解決はコンパイル時の処理だから、実行時に型が変わる場合には対応できない。
動的に型が変わることがなく、インタフェースを統一したいだけなら
template<typename T>
T* DataClass::GetPointer(void);
で、GetPointer<int>() みたいにはできるだろうが。
本当に任意型が欲しいなら boost::any でも使えば?
0176デフォルトの名無しさん
2005/07/31(日) 21:40:21system()を使いたいんですが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と決まっています。
0177デフォルトの名無しさん
2005/07/31(日) 21:49:03>system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
winって"./"あるとまずいんだっけ?
>>176
>main関数にバイナリデータを渡す方法はありませんか?
popen
0178デフォルトの名無しさん
2005/07/31(日) 21:59:41type ./hoge.txt
ってやったら構文エラーがでるようだ。
type .\hoge.txt
なら通るけどな。system()の場合はどうだろうなぁ。
0179デフォルトの名無しさん
2005/07/31(日) 22:04:42>'.' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。
といわれてしまいます。
popen()の紹介ありがとうございました。
0180デフォルトの名無しさん
2005/07/31(日) 22:10:55>179のようなメッセージが表示されてしまいます。
0181デフォルトの名無しさん
2005/07/31(日) 22:14:400182デフォルトの名無しさん
2005/07/31(日) 22:27:01#define PASS
#elif defined UNIX
#define PASS ./
#endif
sprintf(ss, #PASS "./main.exe");
とか安易に考えてみたけど無理?
0183デフォルトの名無しさん
2005/07/31(日) 22:55:14どうせやるなら
#ifdef WINDOWS
# define DIR "\\"
#elif defined UNIX
# define DIR "/"
#endif
system("." DIR "main.exe");
で委員ジャマイカ?
0184デフォルトの名無しさん
2005/07/31(日) 23:57:13#include
だと/でいいんだよね
正直キモい
0185デフォルトの名無しさん
2005/08/01(月) 00:03:16#という無法を言ってみるテスト。
0186デフォルトの名無しさん
2005/08/01(月) 08:47:11逆にURLを\にして動くのもきもい。
http:\\www.google.co.jp\
0187デフォルトの名無しさん
2005/08/01(月) 09:15:510188デフォルトの名無しさん
2005/08/01(月) 09:20:410189デフォルトの名無しさん
2005/08/01(月) 09:26:250190デフォルトの名無しさん
2005/08/01(月) 11:35:41が有ったはずですが、関数名教えてください。
wtombみたいな。
0191デフォルトの名無しさん
2005/08/01(月) 11:38:00wctomb() / wcstombs()
「2バイト文字」じゃなくてwchar_tだけどな。
0192デフォルトの名無しさん
2005/08/01(月) 12:29:44バイナリエディタで書き換える事ができるのでしょうか?
実行可能ファイル中でウィンドウ名とクラス名の文字列そのものを
検索しても全くヒットしませんでした(´Д⊂
0193デフォルトの名無しさん
2005/08/01(月) 14:02:25文字列だからそれをどう持っているかはそのソフトによる。
究極的にはバイナリエディタでできるはずだけど、何らかの暗号化をしている可能性もあるし、
UPXなどで実行ファイルが圧縮されている可能性もある。
0194デフォルトの名無しさん
2005/08/01(月) 21:27:560195デフォルトの名無しさん
2005/08/01(月) 21:30:240196デフォルトの名無しさん
2005/08/01(月) 21:31:14仮想関数等の関係で多少増えるけど気にするレベルじゃない。
メンテや再利用等のメリットの方が遙かに大きい。
0197デフォルトの名無しさん
2005/08/01(月) 21:33:05メモ帳でできる文書を Word で作ったら時間や負荷がかかるものなんでしょうか?
0198デフォルトの名無しさん
2005/08/01(月) 21:37:30その前にUNIXで.exeって気持ち悪いよ。
0199デフォルトの名無しさん
2005/08/01(月) 22:29:31俺は常にC++だ。Better Cだ。C99相当の機能もある。
CにできてC++にできないことなどない。STLやiostream/basic_stringはかなり便利だ。
もちろんこんなときにはオブジェクト指向なんて使わない。
>>197
CとC++(OO抜き)の違いはメモ帳とテキストエディタ程度でしかない。
JavaやC#のほうがWordに近い、って言うとJavaやC#の人に怒られそうだ。せいぜいワードパッドくらいか。
やはりC++こそプログラミング言語のWordか。
0200デフォルトの名無しさん
2005/08/01(月) 23:46:20実行形式拡張子の規定など無いのにexeが気持ち悪いとか言う方が気持ち悪いよ
0201デフォルトの名無しさん
2005/08/01(月) 23:50:37規定があれば気持ち悪いなんて書かないよ。
どうしようも無いんだから。
0202デフォルトの名無しさん
2005/08/01(月) 23:51:05あきれるね
0203デフォルトの名無しさん
2005/08/01(月) 23:54:06http://www.kumei.ne.jp/c_lang/bcc/bcc_02.htm
のサイトに書かれているようなファイルの作り方が分かりません。
0204デフォルトの名無しさん
2005/08/01(月) 23:55:190205デフォルトの名無しさん
2005/08/01(月) 23:56:51「メモ帳で次のように打ち込みます。」
って書いてあるけど。
メモ帳も扱えんのかお前は。
と、釣られてみるテスト。
0206デフォルトの名無しさん
2005/08/02(火) 00:09:250207デフォルトの名無しさん
2005/08/02(火) 00:13:450208デフォルトの名無しさん
2005/08/02(火) 00:16:31ヘルプで検索してみたけど見つからない・・・orz
0209デフォルトの名無しさん
2005/08/02(火) 00:18:370210デフォルトの名無しさん
2005/08/02(火) 00:19:520211デフォルトの名無しさん
2005/08/02(火) 00:20:58屁理屈いうな禿げ
0212デフォルトの名無しさん
2005/08/02(火) 00:26:27今時の若い者はコマンドプロンプトの使い方もわからないのか
わからない単語が出てきたら、まずは自分で調べろ。
説明書見るとか、ググってみるとか、いろいろ方法あるだろ。
それでもわからなかったらココに書け。
自分で調べもしないで人に質問するな。
というわけで>>208よ、まずは「コマンドプロンプト」でググれ。話はそれからだ。
0214デフォルトの名無しさん
2005/08/02(火) 00:33:34屁理屈も理屈なのであって、論破できない論理的弱者が使う言葉。
矛盾のない論理の世界に生きる人間であるプログラマが使う言葉では
ない。以後慎んだ方が自分の品位を保てるというもの。
0215デフォルトの名無しさん
2005/08/02(火) 00:38:170216デフォルトの名無しさん
2005/08/02(火) 00:43:450217デフォルトの名無しさん
2005/08/02(火) 01:01:55屁理屈いうなハゲ
0218デフォルトの名無しさん
2005/08/02(火) 01:06:340219デフォルトの名無しさん
2005/08/02(火) 02:16:55妄言。
0220デフォルトの名無しさん
2005/08/02(火) 03:46:080221デフォルトの名無しさん
2005/08/02(火) 13:37:06あるいは正確な理屈と、それとは実は何も関係ない個人の嗜好。
この組み合わせが屁理屈の肝だな。
>>200は後者。
0222デフォルトの名無しさん
2005/08/02(火) 14:22:35200の方が正しい。
0223デフォルトの名無しさん
2005/08/02(火) 14:42:560224デフォルトの名無しさん
2005/08/02(火) 14:47:15気分の問題に正しいもくそもあるか
おまえはUNIXで*.exeでもつかっとけ
0225デフォルトの名無しさん
2005/08/02(火) 14:53:190226デフォルトの名無しさん
2005/08/02(火) 15:08:04ちゃんと*をつけてるあたりがかわいらしいなw
0227デフォルトの名無しさん
2005/08/02(火) 15:40:56クラスのメンバ変数にしたいので、↓のように書きました。
private:
void (*m_pFunc)(UINT);
これは一応コンパイルを通りました。
(一応動いてはいるようですがこの書き方で正しいのでしょうか?)
さらにこのポインタを別のクラスなどから取得する為に
Get〜みたいな関数を作りたいのですが、どうやって書けばよいのでしょうか?
0228デフォルトの名無しさん
2005/08/02(火) 16:20:10CからFORTRANのサブルーチンに生の数字を渡したいのです。
たとえば
--main.c---
main{
fsub_(12);
}
--fsub.f---
subroutine fsub(i)
write(*,*)i
return
end
みたいに12という数字を代入なしに渡したいのです。
どんなもんでしょか。
0229デフォルトの名無しさん
2005/08/02(火) 16:27:45あなたが使っているCとFortranの仕様はあなた以外に知らないのですから、
どんなコンパイラを使っているか、通常はどうやって渡しているか、などの情報無しには
何のアドバイスも得られないと思うのです。
#つーか、普通に渡せると思うんだけどねぇ。
0230デフォルトの名無しさん
2005/08/02(火) 16:47:20激しく使ってますが何か?w
0231228
2005/08/02(火) 16:52:48f77 main.c fsub.f
で出来たa.outを実行すると
セグメンテーション違反になります。
うーーん、i=12;とか代入したものを渡すとうまくいくんですけど。。
0232デフォルトの名無しさん
2005/08/02(火) 16:52:54typedefすれば使う側にとっても親切だしわかりやすい。
public:
typedef void (*Func)(UINT);
Func GetFunc() const throw() {return m_pFunc;}
private:
Func m_pFunc;
0233デフォルトの名無しさん
2005/08/02(火) 17:04:50もう少しソースを晒せないかな。
i = 12; fsub_(i); なら巧くいくってこと?
そのiの型は整数型?
最早忘れたけど、Fortranって参照渡しだったっけ?
だとしたら、値を格納する場所が必要になるから即値を渡すことは不可能だね。
0234デフォルトの名無しさん
2005/08/02(火) 17:12:330235228
2005/08/02(火) 17:13:33int i; i = 12; fsub_(i);
だとうまくいきます。
やっぱり代入必須っぽいですね・・。
0236デフォルトの名無しさん
2005/08/02(火) 19:08:11そのfsub_のプロトタイプはどこかに{作った|生成された}のかな?
普通のCコンパイラなら、仮令一旦代入しても値を積んじゃうと思うけど。
#だから環境はできるだけ晒してくれた方が早いのさ。
0237デフォルトの名無しさん
2005/08/04(木) 05:17:23ありがとうございました。
typedefしたら混乱しないで書けるようになりました。
ところでまた質問なのですが、
関数宣言の後のconst throw() っていうのが始めてみる書き方なんですが、
どういう意味があってどういう場合に用いるのでしょうか?
0238デフォルトの名無しさん
2005/08/04(木) 08:12:45constと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する。
0239194
2005/08/05(金) 13:15:01最近C++を勉強し始めたのですが、Cのほうが速いのだったらC++は使わないほうがいいかなと思ってました。
あんまり差がないそうなのでC++を引き続き勉強します。
ありがとうございました。
0240デフォルトの名無しさん
2005/08/05(金) 14:09:01処理速度だけが問題ならC++どころかCも使わずにアセンブラでも使えばいい。
速度的に疑問の残るJavaやVBが実務に使われていることからも処理速度だけが問題でないことはわかるだろう。
寧ろ勉強中のレベルなのであれば、プログラミングを身につけるためには
処理速度云々で言語を選ぶべきではない。
0241デフォルトの名無しさん
2005/08/05(金) 15:52:400242デフォルトの名無しさん
2005/08/05(金) 16:01:300243デフォルトの名無しさん
2005/08/05(金) 16:05:57char buffer[1024];
while((fgets(buffer,1024,f)!=NULL);
fclose(f);
printf("%s\n",buffer);
0244デフォルトの名無しさん
2005/08/05(金) 20:19:22また、2 つ目の + は何を表してますか?
c+ じゃいけなかったんですか?
0245デフォルトの名無しさん
2005/08/05(金) 20:30:240246デフォルトの名無しさん
2005/08/05(金) 21:29:510247デフォルトの名無しさん
2005/08/05(金) 22:48:440248デフォルトの名無しさん
2005/08/05(金) 22:55:220249デフォルトの名無しさん
2005/08/05(金) 22:56:020250デフォルトの名無しさん
2005/08/05(金) 23:00:580251デフォルトの名無しさん
2005/08/05(金) 23:03:490252デフォルトの名無しさん
2005/08/05(金) 23:33:29行列の積を求めるプログラムを書こうとしたが、コンパイルエラーが出てしまいます。
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(なんちゃら));
みたいにやるのか?
どなたか丁寧にお教えください〜
■ このスレッドは過去ログ倉庫に格納されています