トップページ⇒tech
1001コメント327KB

【初心者歓迎】C/C++室 Ver.20【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/18(月) 08:59:42
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※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
>>152
うーん、そうなんですか。
例えばvoid func(char* buffer, unsigned int length)
という関数を渡す場合だと、普通の関数ではそのままでOKで、
クラスメソッドにする場合は何かを付けないといけないのでしょうか?

よかったらそれを教えてもらえませんか?
0154デフォルトの名無しさん2005/07/30(土) 01:11:05
>>153
例えば、そのfuncがclass testのメンバ関数だとすると、funcへのポインタの型は
void (test::*)(char *, unsigned int)
になって、
void (*)(char *, unsigned int)
とは違うし、前者を後者に変換することはできない。
>>152がどういう意味で「型をあわせろ」と言ったのか知らんが。
0155デフォルトの名無しさん2005/07/30(土) 01:46:53
>>154
どうもです。
やっぱり出来ないんですか。
他の方法を検討してみます。
ありがとうございました。
0156デフォルトの名無しさん2005/07/30(土) 02:04:20
>>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;
}
0157デフォルトの名無しさん2005/07/30(土) 08:36:53
Linux/gccで親プロセスからforkした子プロセスの標準出力/標準エラー出力を
取ろうとしているのですが、親から読み出そうとするときに止まってしまう時があります。
ファイルディスクリプタをfdopenで開いてfgetsで読み出してるんですが、その部分
で止まっているのでeofまで読めていないのかな、とも思ってるんですが…。

こういう時って、どうするのでしょうか?。UNIX依存の話で申し訳ないのですが、
どなたかご教授ください。

下にテストに使ったの最小構成のプログラムを載せます。
0158デフォルトの名無しさん2005/07/30(土) 08:39:46
int main()
{
return 0;
}
01591572005/07/30(土) 08:52:31
…のせようと思ったのですが、投稿制限に引っかかったので
アップローダにupしました。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/819.c
01601572005/07/30(土) 08:54:51
う、たびたびすいません。上のソースのmain関数内でexecに対して
(標準出力/エラー出力を出すような)適当なコマンドを作って、実行用の
関数に与えています。
0161デフォルトの名無しさん2005/07/30(土) 10:41:25
なんか無駄に難しくしている気がする。
FILE * fp = fopen("/bin/sh 2>&1", "r");
じゃだめなんだろか。

それはそうと、Unixプログラミングスレに行った方がよさそうだね。
0162デフォルトの名無しさん2005/07/30(土) 10:51:14
>>156
ありがとうございます。
よく分かりました。
01631572005/07/30(土) 10:53:03
ID変わってますけど、別PCからの投稿です。

> 161さん
アドバイスありがとうございます。
UNIXプログラミングスレであらためて質問したいと思います。

ところで、これって何をやってるのか理解できない私なのですが、

> FILE * fp = fopen("/bin/sh 2>&1", "r");

shの標準出力とエラー出力を読むfpを確保しているのでしょうか。
01641572005/07/30(土) 10:53:46
・・・ってここID出なかったのか。

ハズカシイ
0165デフォルトの名無しさん2005/07/30(土) 10:59:05
ごめ、popen()だよ。
#いかんなぁ、頭がやられているらしいw
01661572005/07/30(土) 11:04:09
> 165さん
標準出力と標準エラー出力を別々に読み出したいのでpipeを使っています。
popenだとそれはできない、という認識です。

・・・う、不安になってきたのでpopenについて調べてみます。
0167デフォルトの名無しさん2005/07/30(土) 13:56:30
漏れは >147 じゃないんだどさ。
「クラスメソッド」って言ったら C++ では static メンバ関数に相当するものじゃないの?
後、C の関数だと渡せるのに static メンバ関数にしたら渡せないなんてあり得るの?
ソース見せて欲しい。
0168デフォルトの名無しさん2005/07/30(土) 13:58:02
>>167
147の言うクラスメソッドは非メンバ関数のことだろ。
0169デフォルトの名無しさん2005/07/30(土) 14:15:12
>>168 いくらなんでもそれはありえない。
0170デフォルトの名無しさん2005/07/30(土) 17:36:03
組み込み型って何ですか?
0171デフォルトの名無しさん2005/07/30(土) 18:07:15
>>170
コンパイラ側で定義されてる型
char int short long float double等
0172デフォルトの名無しさん2005/07/31(日) 13:08:37
char* c;
c = "abc";
これは良いのに、
char* c;
c = 'a';
これがだめなのは何故ですか?
0173デフォルトの名無しさん2005/07/31(日) 13:09:55
任意型のポインタ 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は使えますか?
0174デフォルトの名無しさん2005/07/31(日) 13:16:49
>>172
'c'はただの定数。ポインタに代入してどうする。
"abc"なら領域が確保されてchar *cがそこを指すポインタって事になる。

>>173
void*で返せばよくね?
0175デフォルトの名無しさん2005/07/31(日) 13:39:03
>173
template による型の解決はコンパイル時の処理だから、実行時に型が変わる場合には対応できない。
動的に型が変わることがなく、インタフェースを統一したいだけなら
template<typename T>
T* DataClass::GetPointer(void);
で、GetPointer<int>() みたいにはできるだろうが。
本当に任意型が欲しいなら boost::any でも使えば?
0176デフォルトの名無しさん2005/07/31(日) 21:40:21
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と決まっています。
0177デフォルトの名無しさん2005/07/31(日) 21:49:03
>>176
>system()を使いたいんですがlinux上では"./"がいりますがwin上では"./"がいらないので
winって"./"あるとまずいんだっけ?

>>176
>main関数にバイナリデータを渡す方法はありませんか?
popen
0178デフォルトの名無しさん2005/07/31(日) 21:59:41
XPのプロンプトから
type ./hoge.txt
ってやったら構文エラーがでるようだ。
type .\hoge.txt
なら通るけどな。system()の場合はどうだろうなぁ。
0179デフォルトの名無しさん2005/07/31(日) 22:04:42
>winって"./"あるとまずいんだっけ?

>'.' は、内部コマンドまたは外部コマンド、
>操作可能なプログラムまたはバッチ ファイルとして認識されていません。

といわれてしまいます。

popen()の紹介ありがとうございました。
0180デフォルトの名無しさん2005/07/31(日) 22:10:55
system()でも"./"があると
>179のようなメッセージが表示されてしまいます。
0181デフォルトの名無しさん2005/07/31(日) 22:14:40
フルパスだと/で動く摩訶不思議
0182デフォルトの名無しさん2005/07/31(日) 22:27:01
#ifdef WINDOWS
 #define PASS
#elif defined UNIX
 #define PASS ./
#endif

sprintf(ss, #PASS "./main.exe");

とか安易に考えてみたけど無理?
0183デフォルトの名無しさん2005/07/31(日) 22:55:14
>>182
どうせやるなら

#ifdef WINDOWS 
#   define DIR "\\"
#elif defined UNIX 
#   define DIR "/"
#endif
    system("." DIR "main.exe");
で委員ジャマイカ?
0184デフォルトの名無しさん2005/07/31(日) 23:57:13
>>181
#include
だと/でいいんだよね
正直キモい
0185デフォルトの名無しさん2005/08/01(月) 00:03:16
つーかLinuxのログインシェルかどこかでPATHの末尾に.を入れておけばいいじゃん。
#という無法を言ってみるテスト。
0186デフォルトの名無しさん2005/08/01(月) 08:47:11
>>184
逆にURLを\にして動くのもきもい。
http:\\www.google.co.jp\
0187デフォルトの名無しさん2005/08/01(月) 09:15:51
もうぜんぶ「/」にしてほすぃ
0188デフォルトの名無しさん2005/08/01(月) 09:20:41
Apple-HFSはディレクトリ区切りが':'で'/'はファイルに使えるしなぁ。
0189デフォルトの名無しさん2005/08/01(月) 09:26:25
キモ木彡
0190デフォルトの名無しさん2005/08/01(月) 11:35:41
2バイト文字からマルチバイト文字に変換する標準関数(じゃないかも)
が有ったはずですが、関数名教えてください。
wtombみたいな。
0191デフォルトの名無しさん2005/08/01(月) 11:38:00
>>190
wctomb() / wcstombs()
「2バイト文字」じゃなくてwchar_tだけどな。
0192デフォルトの名無しさん2005/08/01(月) 12:29:44
Windows上の実行可能ファイルのウィンドウ名とクラス名は
バイナリエディタで書き換える事ができるのでしょうか?

実行可能ファイル中でウィンドウ名とクラス名の文字列そのものを
検索しても全くヒットしませんでした(´Д⊂
0193デフォルトの名無しさん2005/08/01(月) 14:02:25
>>192
文字列だからそれをどう持っているかはそのソフトによる。
究極的にはバイナリエディタでできるはずだけど、何らかの暗号化をしている可能性もあるし、
UPXなどで実行ファイルが圧縮されている可能性もある。
0194デフォルトの名無しさん2005/08/01(月) 21:27:56
Cで作れそうなものをC++で作ったら時間や負荷がかかるものなんでしょうか?
0195デフォルトの名無しさん2005/08/01(月) 21:30:24
作る人による
0196デフォルトの名無しさん2005/08/01(月) 21:31:14
>>194
仮想関数等の関係で多少増えるけど気にするレベルじゃない。
メンテや再利用等のメリットの方が遙かに大きい。
0197デフォルトの名無しさん2005/08/01(月) 21:33:05
>194
メモ帳でできる文書を Word で作ったら時間や負荷がかかるものなんでしょうか?
0198デフォルトの名無しさん2005/08/01(月) 21:37:30
>>183
その前にUNIXで.exeって気持ち悪いよ。
0199デフォルトの名無しさん2005/08/01(月) 22:29:31
>>194
俺は常に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
>>198
実行形式拡張子の規定など無いのにexeが気持ち悪いとか言う方が気持ち悪いよ
0201デフォルトの名無しさん2005/08/01(月) 23:50:37
>>200
規定があれば気持ち悪いなんて書かないよ。
どうしようも無いんだから。
0202デフォルトの名無しさん2005/08/01(月) 23:51:05
>>201
あきれるね
0203デフォルトの名無しさん2005/08/01(月) 23:54:06
borlandのbccをダウンロードしたのですが、
http://www.kumei.ne.jp/c_lang/bcc/bcc_02.htm
のサイトに書かれているようなファイルの作り方が分かりません。
0204デフォルトの名無しさん2005/08/01(月) 23:55:19
↑ウインドウズxp使用しています
0205デフォルトの名無しさん2005/08/01(月) 23:56:51
>>203
「メモ帳で次のように打ち込みます。」
って書いてあるけど。
メモ帳も扱えんのかお前は。

と、釣られてみるテスト。
0206デフォルトの名無しさん2005/08/02(火) 00:09:25
スタート→すべてのプログラム→アクセサリ→メモ帳
0207デフォルトの名無しさん2005/08/02(火) 00:13:45
メモ帳での設定完了しますた。
0208デフォルトの名無しさん2005/08/02(火) 00:16:31
「コマンドライン リファレンス」って・・・
ヘルプで検索してみたけど見つからない・・・orz
0209デフォルトの名無しさん2005/08/02(火) 00:18:37
ここはお前の日記帳じゃねえんだ
0210デフォルトの名無しさん2005/08/02(火) 00:19:52
そうだ。俺の日記帳だ。
0211デフォルトの名無しさん2005/08/02(火) 00:20:58
>>200
屁理屈いうな禿げ
0212デフォルトの名無しさん2005/08/02(火) 00:26:27
>>208
今時の若い者はコマンドプロンプトの使い方もわからないのか
わからない単語が出てきたら、まずは自分で調べろ。
説明書見るとか、ググってみるとか、いろいろ方法あるだろ。
それでもわからなかったらココに書け。
自分で調べもしないで人に質問するな。

というわけで>>208よ、まずは「コマンドプロンプト」でググれ。話はそれからだ。
02131922005/08/02(火) 00:28:51
>>193
アリガトウゴザイマシタ(´∀`)ノシ
0214デフォルトの名無しさん2005/08/02(火) 00:33:34
>>211
屁理屈も理屈なのであって、論破できない論理的弱者が使う言葉。
矛盾のない論理の世界に生きる人間であるプログラマが使う言葉では
ない。以後慎んだ方が自分の品位を保てるというもの。
0215デフォルトの名無しさん2005/08/02(火) 00:38:17
始めから相手にしない方が自分の品位を保てるというもの。
0216デフォルトの名無しさん2005/08/02(火) 00:43:45
品位なんて言葉を持ち出す事自体が品位の無い人間なのだよ
0217デフォルトの名無しさん2005/08/02(火) 01:01:55
>>214
屁理屈いうなハゲ
0218デフォルトの名無しさん2005/08/02(火) 01:06:34
屁理屈を信じろ!屁理屈は無限の力だ!それを信じろッ!
0219デフォルトの名無しさん2005/08/02(火) 02:16:55
お前のは屁理屈ですらない。
妄言。
0220デフォルトの名無しさん2005/08/02(火) 03:46:08
確かに屁理屈には無限の力が秘められている。イタチゴッコとも言うが。
0221デフォルトの名無しさん2005/08/02(火) 13:37:06
正確な理屈と不正確なTPO。
あるいは正確な理屈と、それとは実は何も関係ない個人の嗜好。
この組み合わせが屁理屈の肝だな。
>>200は後者。
0222デフォルトの名無しさん2005/08/02(火) 14:22:35
>>211
200の方が正しい。
0223デフォルトの名無しさん2005/08/02(火) 14:42:56
他にネタは無いのかね
0224デフォルトの名無しさん2005/08/02(火) 14:47:15
>>222
気分の問題に正しいもくそもあるか
おまえはUNIXで*.exeでもつかっとけ
0225デフォルトの名無しさん2005/08/02(火) 14:53:19
某所で見たプロセスはexexec.exeだったなぁ。
0226デフォルトの名無しさん2005/08/02(火) 15:08:04
>>224
ちゃんと*をつけてるあたりがかわいらしいなw
0227デフォルトの名無しさん2005/08/02(火) 15:40:56
「引数がUINTで戻り値がvoid」型の関数へのポインタをm_pFuncとし
クラスのメンバ変数にしたいので、↓のように書きました。
private:
void (*m_pFunc)(UINT);
これは一応コンパイルを通りました。
(一応動いてはいるようですがこの書き方で正しいのでしょうか?)
さらにこのポインタを別のクラスなどから取得する為に
Get〜みたいな関数を作りたいのですが、どうやって書けばよいのでしょうか?
0228デフォルトの名無しさん2005/08/02(火) 16:20:10
場違いでしたらすみません。
CからFORTRANのサブルーチンに生の数字を渡したいのです。
たとえば
--main.c---
main{
fsub_(12);
}
--fsub.f---
subroutine fsub(i)
write(*,*)i
return
end

みたいに12という数字を代入なしに渡したいのです。
どんなもんでしょか。
0229デフォルトの名無しさん2005/08/02(火) 16:27:45
>>228
あなたが使っているCとFortranの仕様はあなた以外に知らないのですから、
どんなコンパイラを使っているか、通常はどうやって渡しているか、などの情報無しには
何のアドバイスも得られないと思うのです。
#つーか、普通に渡せると思うんだけどねぇ。
0230デフォルトの名無しさん2005/08/02(火) 16:47:20
>>224
激しく使ってますが何か?w
02312282005/08/02(火) 16:52:48
すみません、環境はfedoraのf77でコンパイルしてます。
f77 main.c fsub.f
で出来たa.outを実行すると
セグメンテーション違反になります。
うーーん、i=12;とか代入したものを渡すとうまくいくんですけど。。
0232デフォルトの名無しさん2005/08/02(火) 16:52:54
>>227
typedefすれば使う側にとっても親切だしわかりやすい。
public:
typedef void (*Func)(UINT);
Func GetFunc() const throw() {return m_pFunc;}
private:
Func m_pFunc;
0233デフォルトの名無しさん2005/08/02(火) 17:04:50
>>231
もう少しソースを晒せないかな。
i = 12; fsub_(i); なら巧くいくってこと?
そのiの型は整数型?

最早忘れたけど、Fortranって参照渡しだったっけ?
だとしたら、値を格納する場所が必要になるから即値を渡すことは不可能だね。
0234デフォルトの名無しさん2005/08/02(火) 17:12:33
それだったらC++のconst参照を使えば即値を使えるんじゃないの?
02352282005/08/02(火) 17:13:33
ソースは実装前のお試し用ですので228のまんまです。
int i; i = 12; fsub_(i);
だとうまくいきます。
やっぱり代入必須っぽいですね・・。
0236デフォルトの名無しさん2005/08/02(火) 19:08:11
>>235
そのfsub_のプロトタイプはどこかに{作った|生成された}のかな?
普通のCコンパイラなら、仮令一旦代入しても値を積んじゃうと思うけど。
#だから環境はできるだけ晒してくれた方が早いのさ。
0237デフォルトの名無しさん2005/08/04(木) 05:17:23
>>232
ありがとうございました。
typedefしたら混乱しないで書けるようになりました。

ところでまた質問なのですが、
関数宣言の後のconst throw() っていうのが始めてみる書き方なんですが、
どういう意味があってどういう場合に用いるのでしょうか?
0238デフォルトの名無しさん2005/08/04(木) 08:12:45
>>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する。
02391942005/08/05(金) 13:15:01
返事遅れました、すみません。
最近C++を勉強し始めたのですが、Cのほうが速いのだったらC++は使わないほうがいいかなと思ってました。
あんまり差がないそうなのでC++を引き続き勉強します。
ありがとうございました。
0240デフォルトの名無しさん2005/08/05(金) 14:09:01
>>194
処理速度だけが問題ならC++どころかCも使わずにアセンブラでも使えばいい。
速度的に疑問の残るJavaやVBが実務に使われていることからも処理速度だけが問題でないことはわかるだろう。
寧ろ勉強中のレベルなのであれば、プログラミングを身につけるためには
処理速度云々で言語を選ぶべきではない。
0241デフォルトの名無しさん2005/08/05(金) 15:52:40
テキストファイルの最終行を読み込む方法を教えてください。
0242デフォルトの名無しさん2005/08/05(金) 16:01:30
テキストファイルの最終行を読み込めない方法を教えてください。
0243デフォルトの名無しさん2005/08/05(金) 16:05:57
FILE* f=fopen("txt.txt","r");
char buffer[1024];
while((fgets(buffer,1024,f)!=NULL);
fclose(f);
printf("%s\n",buffer);

0244デフォルトの名無しさん2005/08/05(金) 20:19:22
c++ の 1 つ目の + は何を表してますか?
また、2 つ目の + は何を表してますか?
c+ じゃいけなかったんですか?
0245デフォルトの名無しさん2005/08/05(金) 20:30:24
Cを++(インクリメント)してるからC++なんです
0246デフォルトの名無しさん2005/08/05(金) 21:29:51
cのバージョンが1上がりマスタ
0247デフォルトの名無しさん2005/08/05(金) 22:48:44
でも後置インクリメントだと評価の時点では元のCと等価な罠
0248デフォルトの名無しさん2005/08/05(金) 22:55:22
Cの性質も併せ持つ、という意味ではそのほうがいいカモ
0249デフォルトの名無しさん2005/08/05(金) 22:56:02
だからC++はCとの最大限の互換性の確保に懸命だった。
0250デフォルトの名無しさん2005/08/05(金) 23:00:58
++Cじゃなくて本当によかった
0251デフォルトの名無しさん2005/08/05(金) 23:03:49
もう~cでいきます
0252デフォルトの名無しさん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(なんちゃら));
みたいにやるのか?

どなたか丁寧にお教えください〜
■ このスレッドは過去ログ倉庫に格納されています