【初心者歓迎】C/C++室 Ver.49【環境依存OK】 at TECH
[2ch|▼Menu]
[前50を表示]
700:デフォルトの名無しさん
08/02/25 14:51:46
>>692
2番の方向で行こうとしているところだったんです 
定数なら書き換え可能な領域を確保しようとしたら、その判別がコンパイラでできないのでここで質問していたんです

701:デフォルトの名無しさん
08/02/25 14:51:46
>>699
new char[]せずに最初からstringの中にデータを作ればコピーを減らせる

int N=300*1024*1024;
string str2;
str2.resize(N);
for(int n=0;n<N;n++)str2[n]=n; //巨大なバイナリ配列
replace(str2, "geho", "(^_^)");

702:デフォルトの名無しさん
08/02/25 14:57:26
わかりました 
stringに直接挿入する方向で行こうと思います
巨大な入力があるのはファイルからなので、自作して直接stringに入れるようにします

703:デフォルトの名無しさん
08/02/25 15:00:35
>>699
>コピー無しなら2倍ですみます 300メガとかだと動作に支障出ないですかね・・
stringの操作云々よりも、その情報量をどう扱うかと言うアルゴリズムの方が問題になりそうな希ガス。
少なくとも、GiBオーダ未満のメモリくらい今時普通に扱えるよ。

>>696
どう、機能していないのさ。

704:デフォルトの名無しさん
08/02/25 15:01:19
ちゃんと目的を説明すれば、妥当な回答が手早く得られると言う好例だな。

705:692
08/02/25 15:03:09
>>700
俺の場合、その判別は自分でやる。
必要なら自分でメモリ確保してmemcpyか何かでコピーしてから置換する関数へ渡すと言うこと。
メモリ確保その他をstringに任せているという点が違うけど、695案と同系統のアイデア。

706:デフォルトの名無しさん
08/02/25 15:04:31
>>696
関数突入を探すwhileの条件がcount != 1だから、関数突入後に中括弧を見つけるとcountが2になって脱出できなくなる罠。

707:デフォルトの名無しさん
08/02/25 15:10:50
>>696
>706に加えて、内側のwhileは両方ともifでいいだろよ。
つまり、最初のwhileは if (count == 0)で、次のwhileはif (count > 0)。
んで、fin >> bufferだと単語単位でしか入力できないから工夫が必要。
# 行単位入力すればいいのかな? 仕様がわからんからなんとも言えんが。

708:デフォルトの名無しさん
08/02/25 15:13:01
初めはC言語のみで、作成しようとして最後まで作ったのですが
ポインタのポインタとかやっているうちに動かない場合があることに気づき修復不可能になりました
そしてC++で参照や型判定して作ろうとしたらこれも上手くいきませんでした
簡明なプログラムが大事ですね

709:デフォルトの名無しさん
08/02/25 15:20:04
ここできいたのを参考に変換関数を作ってたのですが、そしたら全体がややこしくなり回復無理になりました

#define strconv(q, p) _memconv(&q, &p, strlen(p))
#define memconv(q, p, n) _memconv(&q, &p, n)
#define strconstconv(q, p) _strconstconv(&q, p)

_memconv(strdata *q, char **p, int n){
char **chend =(char **)malloc(sizeof(char **));
q->start=p; *chend=&(*p)[n]; q->end = &(*chend);}

710:デフォルトの名無しさん
08/02/25 15:52:07
>>708,709
無理して難しく書いても、あとあとメンテナンスやデバッグのことを考えると、シンプルに書いた方がいい場合が多い
メモリを何MBか余計に使ったり、実行時間が何分か伸びたところで、なんだというんだ
ややこしいコードは書くのもデバッグも何日もかかる
それだけの価値があればやってもいいが、たいていは割に合わない

711:デフォルトの名無しさん
08/02/25 17:21:33
やさしいC++買って来た。
一日でマスターするのは無理なのかなぁ・・・

712:デフォルトの名無しさん
08/02/25 17:26:04
一週間くらいは覚悟しないといかんね

713:デフォルトの名無しさん
08/02/25 17:39:36
一年ぐらいは(ry
とか言いたいけど最低10年とかいう意見もあるし
やね某が何年か前に提唱した半年ぐらいで勘弁しておいてやろう

714:デフォルトの名無しさん
08/02/25 18:04:09
質問ですが、stringの+は、\0を特別視しませんよね?

"aa\0aa" + "bbbbb"はどのコンパイラでも、
"aa\0aabbbbb"ですよね?

715:デフォルトの名無しさん
08/02/25 18:38:41
いつからCは+演算子で文字連結できるようになったんだ

716:デフォルトの名無しさん
08/02/25 18:39:19
stringと書いてあるだろうがアホ

717:デフォルトの名無しさん
08/02/25 18:43:10
>>716
>>714はC++でもNGだろ。C文字列同士だぞ。

718:デフォルトの名無しさん
08/02/25 18:45:36
そこは中身がそうなっているstringインスタンスだと解釈してやろうぜ。

719:デフォルトの名無しさん
08/02/25 18:48:48
質問者はそういう中身のstringを造ろうとしてそこでつまりそうだが

720:デフォルトの名無しさん
08/02/25 19:21:16
>>718
アイアイ

721:デフォルトの名無しさん
08/02/25 19:30:23
std::auto_ptrって、ブロックを出ると自動的に開放されるポインタですよね?
これって、AUTO変数と比べてより便利な点ってあるのでしょうか?


722:デフォルトの名無しさん
08/02/25 19:36:53
×ブロックを出ると自動的に開放
○std::auto_ptrが破棄されたときインスタンスも自動的に開放

723:デフォルトの名無しさん
08/02/25 19:37:01
>>721
・スタックに置くには適さない巨大なデータも置ける
・最初はNULLにしておいて必要になってからnewできる
・ブロックを出るまで待たなくても好きなタイミングで削除できる
・releaseで手放せばブロックを出ても削除しないことも出来る

724:デフォルトの名無しさん
08/02/25 19:39:10
関数の戻り値にも使えるはず。

725:デフォルトの名無しさん
08/02/25 19:41:51
using namespace std;
string func1() {
string s = "Hello";
return s;
}
void func2(string s) {
cout << s << endl;
}
int main() {
func2(func1());
}

この渡し方って解放されなかったり破壊されたりしますか?
処理系によりけりですか?

726:デフォルトの名無しさん
08/02/25 19:43:39
>>725
しません。
どの処理系でも平気。

727:デフォルトの名無しさん
08/02/25 19:59:12
>>722-724
ありがとうです。

ところで、testは適当なクラスとして、
int main()
{
std::auto_ptr<test> tp(new test);
tp.release();
return 0;
}
とすると、メモリリークが検出されてしまうのですが、tp.release()をしないようにすると
大丈夫でした。これってrelease()の使い方が間違ってますか?
あと、最初にauto_ptr<test>だけ宣言しておいて、途中でnew testする方法もわかりません。
もうちょっとだけ教えてくださいな。

728:デフォルトの名無しさん
08/02/25 20:05:08
releaseは、以後、自分でメモリ管理するからauto_ptrはdeleteするなというもの。

729:デフォルトの名無しさん
08/02/25 20:14:08
>>728
最初は、
std::auto_ptr<test> tp(new test);
tp.release();
test* tp2 = tp.get();
delete tp2;
としていたのですが、以下のようにしなければならないということですね。
std::auto_ptr<test> tp(new test);
delete tp.release();
ありがとうございました。

730:デフォルトの名無しさん
08/02/25 20:27:13
>>729
tp.reset();

731:デフォルトの名無しさん
08/02/25 20:44:23
resetはVC6のauto_ptrには無いとか言い出すぜきっと。

732:デフォルトの名無しさん
08/02/25 20:52:38
resetもしないでデストラクタに任せればいい場面にまで
729のようなことをしていないか不安。

733:デフォルトの名無しさん
08/02/25 20:58:49
設計について色々調べていると(デザインパターン等々)これ無駄じゃね?みたいな部分に多々遭遇します

例えばコンストラクタとデストラクタで確保&解放を行う為に全体をそれに合わせたり
それの為にメソッドやクラスを用意したり等々

確かに見通しもよくなりますし、わかりやすくなるとは思うのですが、
それらを犠牲にすれば短く出来たりオーバーヘッドを減らせたり出来るんじゃないか?と考えてしまいます

つまりコード全体の見易さ、転じてメンテナンスが容易になるなどのメリットと
速度を犠牲にするというデメリットがあると思います
とはいえ後者は今時気にするほどでもなく、詳しくないのですがここを気にするのは組み込み系と呼ばれる分野くらいなのかなとも思います

実際はやはり見易さ等を気にした手法(なんていうんだろう?)を用いて設計を行うべきなんでしょうか?
うまく表現できなく、長くなってしまってすみません

734:デフォルトの名無しさん
08/02/25 21:01:16
Visual Studioって 何処にヘッダファイル置けば

735:デフォルトの名無しさん
08/02/25 21:04:18
Visual Studioって 何処にヘッダファイル置けば
フルパス指定しなくて読み込めるんですか?
C:\Program Files\Microsoft Visual Studio 8\VC\include
でOK?

736:デフォルトの名無しさん
08/02/25 21:06:29
>>735
ソースファイルと同じ場所なら
#include"hoge.h"
でおk

737:デフォルトの名無しさん
08/02/25 21:09:06
>>733
大丈夫
君よりコンパイラのほうが賢いから

738:デフォルトの名無しさん
08/02/25 21:09:18
速度犠牲とか偉そうに言うやつほど、ダメなプログラマ

739:デフォルトの名無しさん
08/02/25 21:10:01
普通の初心者質問には答えないんだなぁ

740:デフォルトの名無しさん
08/02/25 21:11:48
本当に遅くなることばかりじゃないしな。
std::sort が qsort より概して速くなる、というみたいに、
インライン化されると問題ないことも多い。

741:デフォルトの名無しさん
08/02/25 21:14:36
>>738
色んな分野があるって前提で考えてるんだろう?
お前は組み込み系とビジネスソフト開発が同じだと思っているのか?
それにプログラミングしてればみんなプログラマって思考が気持ち悪い
お前見たいのは答える側に回るな

742:デフォルトの名無しさん
08/02/25 21:14:59
プログラマではないです、ただいろんな分野があってそれに合ったプログラミングがあることくらいはわかっています

でもやっぱり速度は気にしちゃいけないところですか、無駄だと思ってしまうところから直す必要がありそうですね
コンパイラの最適化というのも知らない分野ですし、当分は見通しの良いプログラムを目指してみようと思います

743:デフォルトの名無しさん
08/02/25 21:18:54
まず動くプログラムを書く。
そして遅ければ改善する。
この順だな。

744:696
08/02/25 21:19:34
696です。
先ほどのプログラムを訂正したら、
一行ほどしか出力されませんでした。
どこが間違っているのでしょうか。

URLリンク(www.borujoa.org)

745:デフォルトの名無しさん
08/02/25 21:26:58
これをちょっと弄って横長から縦長にしたいのですが、
いまいち組み方がわかりません。環境はLinuxでコンパイラはgccです。
#includeは省略
#define max 50
using namespace std;
class hist{
private:
string buffer;
int count;
int mat[max],i,j;
public:
int func(char *argv[]);};
int hist::func(char *argv[]){
ifstream fin(argv[1]);
if(!fin)return 0;
for(i=0;i<max;i++)mat[i]=0;
while(fin>>buffer){
count=strlen(buffer.c_str());
for(i=1;i<max;i++){
if(i==count)mat[i]=mat[i]+1; }
}
for(i=1;i<max;i++){
cout<<i;
for(j=0;j<mat[i];j++)cout<<"*";
cout<<'\n'; }
return 0;}
int main(int argc,char *argv[]){
hist hoge;
hoge.func(argv);
return 0;
}


746:696
08/02/25 21:28:43
すみません、あげるの忘れてました。
どなたか教えてください。

747:デフォルトの名無しさん
08/02/25 21:32:49
GNU global使えていう話じゃなくて?

748:744
08/02/25 21:37:58
>>747
そんなソフトがあったんですかw
ありがとうございます。
しかしそれではコーディングトレーニングにならないので、
ソースコードでよろしくお願いいたします。
どう考えてもイメージがわかないもので質問した次第です。

749:デフォルトの名無しさん
08/02/25 21:44:30
はじめまして

C++でプログラミングをしようと思っているのですが
開発環境等をどうしようか迷っています
将来的には

■ゲームを動かすプログラム(同人やエロゲのアプリ程度)
■補助ソフトやパッチ
■データを暗号化して格納するプログラム

等を作りたいと思っています
何かアドバイスがあればお願いします

750:デフォルトの名無しさん
08/02/25 21:45:47
VC++ でいいっしょ
タダだし

751:744
08/02/25 21:48:04
>>749
「C++の勉強したいんだがどの本買って勉強したらいいんですか?」
って聞いてるのと一緒だべ?

752:デフォルトの名無しさん
08/02/25 21:50:19
デザインパターン信者
私にもそんな時期がありました(マジで)

753:デフォルトの名無しさん
08/02/25 21:51:50
80:20の原則があるしな。経験つめばどこがホットスポットなのかが見当つくから、
プロファイルとってそこだけしぼって最適化すればいい。
最初から保守性犠牲にしてまでパフォーマンスチューニングが必要な分野って
限られてると思うよ。

754:デフォルトの名無しさん
08/02/25 21:55:02
>>749
今からC++勉強するよりもおまいは吉里吉里勉強したほうが幸せになれると思う

755:744
08/02/25 22:06:01
マイヘッドがクラッシュしてしまいそうなんですが、
エニバディー、ティーチ ミーしてくれませんか?

756:デフォルトの名無しさん
08/02/25 22:16:44
>>752
理解できずに挫折したか。

757:デフォルトの名無しさん
08/02/25 22:16:59
トオルさん帰れよ

758:デフォルトの名無しさん
08/02/25 22:18:58
>>744
関係はないが、とりあえずバッファを buffer_size しか確保してないのに
fgets で filesize 読もうとしてるのはヤバい。

759:デフォルトの名無しさん
08/02/25 22:28:27
>>744
else if(count > 0)

760:744
08/02/25 22:29:05
>>758
bufferはstring型でいこうとおもったんですが、
fin>>buffer;でやると、単語読み込みで一行読み込みにはならないし、
fgets(buffer.c_str(),filesize,fin);はコンパイラに怒られるし、
どうしようもないんで駆け込み寺としてここにきました。
たぶんこれも慣れた人なら簡単に直せるんだとは思いますが、
いままでC言語ばっかりやってたもんで、変な癖ついてるんです。


761:デフォルトの名無しさん
08/02/25 22:30:58
getline を知らんのか?

762:744
08/02/25 22:32:36
>>761
K&Rにも載ってたんで知ってます。

763:デフォルトの名無しさん
08/02/25 22:32:53
>744
よくわからんが、
一行よむなら、std::.getline( fin, buffer );だが。むろん、finはifstream辺りの必要はある。

初めて"{"が存在する行をみつけたとき、上のifでcount++になって、
下のifも成立してでcount++で2になるんだが、そういうものなのかね?

764:デフォルトの名無しさん
08/02/25 22:33:42
どこのK&Rだ、どこのw

765:デフォルトの名無しさん
08/02/25 22:35:10
>>750
あと必要な物はやる気と根気ですかね?

>>751
"だべ"ってどういう意味ですか?
マルチリンガーじゃないので日本語以外わからないんです、本当にごめんなさい。

766:デフォルトの名無しさん
08/02/25 22:36:48
>>765
キモス

767:744
08/02/25 22:43:14
>>759
else ifですか。基本的なところ躓きました。
ありがとうございます。勉強になりました。

>>763
そんな関数があったんですか。
ちょっとgetlineの中をのぞいて使わせてもらいます。

>>764
Cアンサーブックのほうです。
バイブル本とか釣られてやってみたけど、
糞面白んないんで解くのやめました。


768:デフォルトの名無しさん
08/02/25 22:44:52
可変のchar *のバッファ用意したいとき

string buf (n, '\0' );
&buf0]; ← これはchar*のところへ入れられる

と使うと便利だ 自動で消滅するし

769:744
08/02/25 23:06:24
>>768
下のほうhtmlのタグみたいですね。
奥の手っぽいんでどうしようもないときに使ってみます。
ありがとうございました。

770:デフォルトの名無しさん
08/02/25 23:48:16
>>744
さっき、恐らくは想定したと思われる仕様を完璧に満たすソースを書いたんだが、
反応がなかったから会社に置いてきちゃった。次に会社に出るのは3日後なんで、
後で寝ちゃわなければ軽く再現してみるよ。

771:デフォルトの名無しさん
08/02/25 23:57:46
>>770
>次に会社に出るのは3日後なんで

何でだ?

772:デフォルトの名無しさん
08/02/26 00:01:47
なんか、「それを記すにはあまりにも2chの投稿制限は厳しい」みたいに
続きそうな文章だなw

773:デフォルトの名無しさん
08/02/26 00:08:58
>>749
本体 > VC++
開発用ユーティリティ > TurboC++ Exploer (BCB)
でいいんでないの?
VC++はGUIアプリの構築はそれなりに手間かかるし、BCBは紙芝居の開発じゃ全然VCLの長所が生かせない。

774:デフォルトの名無しさん
08/02/26 00:16:21
>>771
単に、明日明後日は客先直行直帰だから。
>>744
手直ししながら、「クラスにする必要ないじゃん」とか
「変数は極力局在化しろよな」とか「マクロシンボルは大文字だろ」とか
「入力にfgets()を使うなら出力はfputs()じゃないか」なんて乗りで
修正してたらこうなった。
#include <cstdio> #include <cstring>
#define BUFFER_SIZE 1000
int func(char *argv[]) {
FILE * fin = fopen(argv[1],"r");
if (fin == NULL) return 1;
unsigned count = 0;
char buffer[BUFFER_SIZE];
while(fgets(buffer, sizeof(buffer), fin)!=NULL) {
if (count == 0) {
if (strchr(buffer,'{') != NULL) {
fputs(buffer, stdout);
count++;
}
} else if (count > 0) {
if (strchr(buffer,'{') != NULL) count++;
if (strchr(buffer,'}') != NULL) count--;
fputs(buffer, stdout);
}
}
fclose(fin);
return 0;
}
int main(int argc,char *argv[]) {
return func(argv);
}

775:744
08/02/26 00:36:44
>>774
まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。

776:デフォルトの名無しさん
08/02/26 00:45:12
>>775
>774は常套句の宝庫だと思うよ。fgets(buffer, sizeof(buffer), fin)とか。
>744のクラスは、変数をばら撒くだけでクラスとしては何もしない無意味な設計だったし。
後はあれだな、関数に渡すのはconst char *にしてmain()で予めargcのチェックと
argv[1]の抽出位しておくのが常套手段か。

777:744
08/02/26 00:57:36
>>776
途中で配列にしたら楽だろうなぁとかは思ったが、
配列だと途中でサイズの変更が利かないから。
ポインタだと動的メモリの割り当てで適当なサイズに
割り当てできるし、と思っただけです。
別に機能さえあってればどのやりかたでもいいんだけど、
個人的には

stdoutの使い方がいまいちわかんなかったから、
そこが勉強になったのと、マクロの名前が大文字ね。
それ完全に忘れてたから勉強になった。
ありがとうってのは主にそこかなぁ・・・。
クラスは再利用に機能を発揮するから今の段階では必要としていないけど、
あとあと拡張していくにあたって必要になってくるから残しておきました。
確かにこの辺は言わんとわからんかったかもしれない。
突っ込まれたんで補足しておきました。

778:デフォルトの名無しさん
08/02/26 05:08:28
>726
ありがとう、ちょっと不安だったんだ。
名前も無いまま渡されるオブジェクトってどうなるんだろ、って。

779:デフォルトの名無しさん
08/02/26 05:56:26
ある関数に引数として構造体のポインタを渡し、そこにアドレスをセットして
返してもらうにはどう書けばよいのでしょう?

BOOL hoge( HOGE *ptr )
{
 …略
 ptr = address;
 return TRUE;
}
としても上手く動かないようです。

780:デフォルトの名無しさん
08/02/26 06:00:17
>>779
整数を受け取るには整数のポインタを渡す必要がある。
構造体を受け取るには構造体のポインタを渡す必要がある。
構造体のポインタを受け取るには構造体のポインタのポインタを渡す必要がある。

781:デフォルトの名無しさん
08/02/26 06:03:19
あ!なるほど。こんな感じでしょうか?
BOOL hoge( HOGE **ptr )

ちなみにC++なのですが、参照渡しを使ってこれは良いのでしょうか?
BOOL hoge( HOGE *&ptr )
一応コンパイルは通るのですが…

782:デフォルトの名無しさん
08/02/26 07:25:27
OK

783:デフォルトの名無しさん
08/02/26 11:34:24
同じクラスなら、別のインスタンスのprivateなデータも参照出来ますよね。継承関係が
ある場合には、親オブジェクトから子オブジェクトを通して親オブジェクトのprivateデータを
参照できたのですが、これってこういうもの?
#include <iostream>
using namespace std;
class test2;
class test {
public:
void func(const test2 &a);
private:
int p;
};
class test2 : public test {
public:
void func2(const test2 &a);
};
void test::func(const test2 &a) {
cout << a.p << endl;
}
test2 T2;
int main()
{
test t;
t.func(T2);
return 0;
}


784:デフォルトの名無しさん
08/02/26 11:37:48
そういうもの。

785:デフォルトの名無しさん
08/02/26 11:40:09
>>783
というか出来ないとまずいだろ。
コピーコンストラクタとか代入演算子の定義が出来なくなってしまうよ。

786:デフォルトの名無しさん
08/02/26 12:06:04
protectedじゃなくてもアクセス出来ちゃうの?

787:デフォルトの名無しさん
08/02/26 12:22:23
protectedにすると、さらにtest2からも参照できるようになる

788:デフォルトの名無しさん
08/02/26 13:01:03
プログラムにZIPを解凍する機能を盛り込みたいのですが、そのような
機能のスタティックリンクできるライブラリをご存じないでしょうか?

環境はVisualC++.net2003です。

789:デフォルトの名無しさん
08/02/26 13:07:03
>>788
zlib

790:デフォルトの名無しさん
08/02/26 13:30:25
>>783じゃないが試してみたけど
同じクラスのインスタンスへの参照やポインタを持つとアクセス権限ブッチぎれちゃうのか

なんかカプセル化とかそういう面で考えると気持ち悪いというかなんというか
仕様上出来ないと仕方ないと言うのも分かるのだが・・・

791:デフォルトの名無しさん
08/02/26 13:33:53
789d

792:デフォルトの名無しさん
08/02/26 13:34:46
C++のprivateはクラスプライベートであってインスタンスプライベートの意味ではない

793:デフォルトの名無しさん
08/02/26 14:02:36
>>782
すみません、寝てました。返答有難うございます。

ちなみに「ポインタ変数を参照で渡す」と言う意味ならむしろ
BOOL hoge( HOGE &*ptr )
のような気がするのですが、なんで*&ptrなのでしょう?
それが仕様と言われればそこまでですが。

794:デフォルトの名無しさん
08/02/26 14:24:18
>>793
URLリンク(kmaebashi.com)
これの応用。
ptrのほうからreference to pointer to HOGEと読める。

795:デフォルトの名無しさん
08/02/26 14:26:03
>>793
typedef HOGE * HOGE_PTRしてみれば判る。

796:デフォルトの名無しさん
08/02/26 14:37:54
>>794>>795
なるほど。正直きちんと理解できたかは自信ないですが、ちゃんと法則が
あってそうなっているのは分かりました。
どうも有難うございましたm(__)m

797:デフォルトの名無しさん
08/02/26 14:46:05
vc2008のコマンドラインコンパイラだけ手に入りますか
vc6でコンパイルしたいです
sp1で鈍いパソコンです 

798:デフォルトの名無しさん
08/02/26 14:48:16
EEを入れてみたか?

799:デフォルトの名無しさん
08/02/26 14:49:23
>>797
コンパイラだけ手に入れるのは無理だが
コマンドラインでの利用はできるよ

800:デフォルトの名無しさん
08/02/26 14:56:40
sp1にインストールできますか

801:デフォルトの名無しさん
08/02/26 15:02:40
>>792
kwsk

according to standard

802:デフォルトの名無しさん
08/02/26 15:49:24
すみません
DOSの実行ファイルで、標準出力へは書き出されないメッセージを取得する方法ありませんか?
hoge.exe > log.txt
として取得できないやつです 画面には出ます
標準出力、標準エラーの取り方はわかります

803:デフォルトの名無しさん
08/02/26 16:09:38
>>802
それのどこがC/C++に関係があるの?

804:デフォルトの名無しさん
08/02/26 16:18:38
>>802
つ printscreen

805:デフォルトの名無しさん
08/02/26 16:34:10
>>803
標準出力はこれで受け取れますが、exeが返す実行結果がとれません

#include <windows.h>

main(){
HANDLE hFile = CreateFile("log.txt",GENERIC_WRITE,FILE_SHARE_WRITE, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
SetStdHandle(STD_OUTPUT_HANDLE , hFile);

STARTUPINFO si; PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
si.hStdOutput =hFile ;
si.hStdError =hFile ;
si.wShowWindow = SW_HIDE;

CreateProcess(NULL, "HtoX32c.exe e:\\0.htm ", NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hFile);
}

806:デフォルトの名無しさん
08/02/26 16:51:04
HtoX32とやらが標準エラー出力に出している可能性は無い?
そもそも、まさかHtoX32はWindowを持っているアプリケーションなのか?
だとしたら、メッセージフックなどの手段が必要になるよ。
つーか、HtoX32とやらが何ものかにも依るけど同等のプログラムを自分で書いた方が手っ取り早かったりしてね。

807:デフォルトの名無しさん
08/02/26 16:59:39
HTMLをテキストに変換するプログラムです
ソースが公開されていたり定番のライブラリとかありませんか?

808:デフォルトの名無しさん
08/02/26 17:03:03
正規表現での消し方のサンプルみながら自分でやってみます

809:デフォルトの名無しさん
08/02/26 17:11:51
>>805
URLリンク(support.microsoft.com)

810:デフォルトの名無しさん
08/02/26 17:15:43
popenを使えたら楽だな
あればだけど

811:デフォルトの名無しさん
08/02/26 17:44:11
>>805
そのコードだと、自プロセスの標準出力が hFile になるけど、子プロセ
スの HtoX32c.exe の標準出力はコンソールのままでは?



812:デフォルトの名無しさん
08/02/26 17:44:15
1つの関数に複数の構造体を渡すことって可能でしょうか?

suruct typedef{
int x,y;
}SAMPLE;
SAMPLE sample;

suruct typedef{
int x,y;
}SAMPLE2;
SAMPLE2 sample2;

void AA(??? *s){
int a = s->x;
int a = s->y;
}

void main(){
AA(&sample);
AA(&sample2);
}
こんな処理をしたいのですが、???の所がわかりません。
良い方法を教えていただきたいです。

仮の構造体を1つ作って、その変数に代入→渡すってやり方だとできましたが
激しく面倒くさい。

813:デフォルトの名無しさん
08/02/26 17:52:41
関数オーバーロード、もしくはテンプレート関数でぐぐれ。

814:デフォルトの名無しさん
08/02/26 17:54:43
>>812
typedef SAMPLE SAMPLE2;

815:デフォルトの名無しさん
08/02/26 18:02:57
>>813
>>814
情報ありがとうございます。
テンプレート関数が一番やりたかった事を解決してくれそうでした。
ありがとうございました。

816:デフォルトの名無しさん
08/02/26 18:10:58
構造体のメンバを決め打ちするようなテンプレート関数は感心しないな。
テンプレートを使うということはC++で良いので、それならメンバ関数にしてしまった方が良い。

817:デフォルトの名無しさん
08/02/26 18:22:32
ifstream::readって実際に何バイト読めたか検出できないんですか?
freadみたいにふつうに戻り値が来るのかと思いきや違うみたいですし…。

818:デフォルトの名無しさん
08/02/26 18:28:13
つ gcount

819:デフォルトの名無しさん
08/02/26 18:29:13
>>817
自己レス。failで少なくとも期待通りの
バイト数読めたかどうかは取得できるのね。

820:デフォルトの名無しさん
08/02/26 18:30:30
>>818 と思ったらそんなメソッドがあったか。サンクス

821:デフォルトの名無しさん
08/02/26 18:31:39
fstreamは重要なところでは使うべきではない
APIのほうがよい

822:デフォルトの名無しさん
08/02/26 18:55:55
んなこたーない

823:デフォルトの名無しさん
08/02/26 19:18:08
fstreamは一社の開発ではないがAPIはMS一社
どのコンパイラでも同じ動作になる
あと3000個とか開けない

824:デフォルトの名無しさん
08/02/26 19:18:50
if文って 文字列と文字列を比べることって出来ないですよね?
1 = あいうえお
2 = かきくけこ
3 = さしすせそ
4 = あいうえお
if (a = 1){
}
みたいなことをやりたいのですがどうしたら良いでしょうか?

825:デフォルトの名無しさん
08/02/26 19:19:44
stringはできる

826:デフォルトの名無しさん
08/02/26 19:20:33
> どのコンパイラでも同じ動作になる
コンパイラで差はないかもしれないが・・・

827:デフォルトの名無しさん
08/02/26 19:21:41
>>823
んなばかな
APIがMS一社で規定されてるなんて初めて知った
MSはついに世界を征服したのか

828:デフォルトの名無しさん
08/02/26 19:23:04
Windowsのファイル入出力APIのことを指す

829:デフォルトの名無しさん
08/02/26 19:55:08
>>824 strcmpしとけ

830:デフォルトの名無しさん
08/02/26 21:19:23
CreateProcessしたときに止まらなくなったら停止させたいんですけど
どうやったらいいですか?

831:デフォルトの名無しさん
08/02/26 21:22:25
ググって解決しました

832:デフォルトの名無しさん
08/02/26 21:58:13
マルチスレッドで動かしてる関数って_endthread()書かなくてもreturn;書いてたら
問題ない?

833:デフォルトの名無しさん
08/02/26 22:04:41
問題ない。
ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
URLリンク(msdn2.microsoft.com)(VS.80).aspx

834:デフォルトの名無しさん
08/02/26 22:15:49
VC6.0です。

__declspec(dllimport) int __stdcall hoge( LPWORD, LPWORD, LPWORD );

という形の関数のアドレスが入る関数ポインタhageを作りたいのですが、
うまく宣言できません。

__declspec(dllimport) int __stdcall (*hage)(LPWORD, LPWORD, LPWORD );
などとやるとコンパイルエラーになってしまいます。

どうすれば宣言できるのでしょうか?

835:デフォルトの名無しさん
08/02/26 22:17:26
declspecは関係ないだろ

836:デフォルトの名無しさん
08/02/26 22:19:03
関係あるよ

837:デフォルトの名無しさん
08/02/26 22:19:32
関数ポインタで悩んだら、typedef

typedef __declspec(dllimport) int __stdcall hogetype( LPWORD, LPWORD, LPWORD );
hogetype hoge;

838:デフォルトの名無しさん
08/02/26 22:36:15
関数ポインタの便利さになれすぎてしまって
最近 if を見るたびにすぐ関数テーブル化してしまう。

間違い?


839:デフォルトの名無しさん
08/02/26 22:39:07
なるべくシンプルにかくのを推奨されますからね

840:デフォルトの名無しさん
08/02/26 22:43:09
関数テーブル間違いです
鈍いです

841:デフォルトの名無しさん
08/02/26 22:47:58
なんかCreateProcessすると不安定になる スレッドでsystemで実行してみる
CreateProcessを短期間に20回以上使うと動かなくなるエラーってありますか?
実行する側のexeのせいかもしれないですが

842:デフォルトの名無しさん
08/02/26 22:50:02
テーブルだめなのか・・
if の中にさらに if があるともうその地点でうわ・・って思ってしまう。

ちょっとソース見直してみます

843:デフォルトの名無しさん
08/02/26 22:50:41
>>833
ありがとう。今度からそうする

844:デフォルトの名無しさん
08/02/26 22:54:19
そこでBoost::functionとコールバックですよ。

845:デフォルトの名無しさん
08/02/26 22:59:28
>>842
無理して避けることもないよ。何事も程々が1番。

846:デフォルトの名無しさん
08/02/26 23:02:18
グローバル変数って絶対使わない方がいいんですかねえ
例えばゲームプログラムを作っていて、状態を管理するグローバル変数を使っているとする。
その変数には、ゲームの進行に合わせて、例えば
定数(TITLE=0, STAGE1, STAGE2, STAGE3, STAGE_CLEAR, GAME_OVER, ENDING)が入るとする。
処理は上の状態それぞれでモジュール化されているとすると、
どうしても状態管理変数はグローバル変数化してどの状態からでも
参照・設定できるようにせざるを得ないと思うのですが、何かいい手があるのでしょうか。
状態管理変数をファイル内static変数にしてセッターを使って書き換えるようにしたり、
状態管理変数とセッターをクラスにしてそのオブジェクトのスコープをグローバルにするもしくは状態管理変数とセッターを
staticにしてどのクラスからでも書き換えられるようにするくらいなら最初から状態管理変数をグローバルにしといた方が
シンプルだと思うのですがどうでしょうか。

847:デフォルトの名無しさん
08/02/26 23:03:57
数が多くなければOK、重要ならOK

848:デフォルトの名無しさん
08/02/26 23:05:38
>>846
静的なシングルトンもグローバル変数も似たようなもんだ
グローバル変数でいいんじゃね?

ただ、関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
ずいぶんと楽になる*かもしれない*

849:デフォルトの名無しさん
08/02/26 23:30:59
>>846
シングルタスクなら良いけど。
GUIでスレッド使って随時処理しながら入力待ちして、
入力はコールバックで処理、みたいのだと、
ゲッタやセッタ作った方が排他処理し易いかなぁ。

まぁケースバイケース?

850:デフォルトの名無しさん
08/02/26 23:32:07
ゲーム状態のインスタンスが1つだけなら、グローバル変数でいいと思う。

インスタンスが複数なら、
状態ごとの処理に、状態管理変数をクラス化したものを渡すとか、
もしくはstateパターンなんてのもいいかもしれない。

851:デフォルトの名無しさん
08/02/26 23:33:35
どうせグローバル変数的に使うとはいえ、
それゆえにどこから変更されてるかを追跡するためにも
>関数経由にしておけばデバッグするときに setter で引っ掛ければいいだけだから
というのは地味に大事


852:デフォルトの名無しさん
08/02/26 23:38:31
ゲーム状態も例えば、プレイヤキャラの他にAIキャラが裏で進行中なんてことになると、
グローバルだと破綻するよね。そんな場合はゲーム状態はキャラクタに依存する情報になるわけだけど。

853:デフォルトの名無しさん
08/02/26 23:46:14
シングルトンとグローバル変数は違う。
グローバル変数として使ってる間違ってる例が多いのが勘違いの原因かもしれない。

自分だったら>>846の場合、シーンマネージャクラスを作ってそいつに振る舞いを管理させる。
極力グローバル変数は使わない。

854:デフォルトの名無しさん
08/02/27 00:01:10
シングルトンは初期化のタイミングを選べるからグローバルとは大きく違う。

855:デフォルトの名無しさん
08/02/27 00:20:00
結局オブジェクト指向の導入でCにおけるグローバル変数使用の問題は解決できてないんじゃねえの
Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの結局クラスとか
オブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね

856:デフォルトの名無しさん
08/02/27 00:21:36
system は空白が改行のように扱われてしまいます
パラメータは渡せませんか?

857:デフォルトの名無しさん
08/02/27 00:22:49
>>855
んなこたーない

858:デフォルトの名無しさん
08/02/27 00:26:23
ファイルの読み込みについての質問です。

 ----
 2008/02/20,01:00:00
 2008/02/21,02:00:00
 2008/02/26,03:00:00
 …
 ----

と書かれたファイルを、

 tmp[0] = 2008;
 tmp[1] = 2;
 tmp[2] = 20;
 tmp[3] = 01;

といったように取り込みたいです。
スラッシュとカンマとコロンを区切りにしてうまく取り込む方法を教えてください。
もし、スラッシュしかなければstrtokとatoiでできたのですが、3種類あるので困っています。
よろしくお願いします。


859:デフォルトの名無しさん
08/02/27 00:28:04
>>856
どんな文字列を渡したとき?

860:デフォルトの名無しさん
08/02/27 00:28:08
見た感じフォーマットは固まってるだろうから
単純に先頭からパースするだけじゃね

861:デフォルトの名無しさん
08/02/27 00:29:09
string s;

s.substr(0,4);
s.substr(5,2);
s.substr(7,2);
とかでいいのでは?

862:デフォルトの名無しさん
08/02/27 00:31:49
>>858
fscanf(fp, "%d/%d/%d,%d:*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);

863:デフォルトの名無しさん
08/02/27 00:31:50
>>859
自己解決しました 同名のexeがありそれが動いていたようです

864:デフォルトの名無しさん
08/02/27 00:34:11
862の訂正 *の前に%
fscanf(fp, "%d/%d/%d,%d:%*[^\n]", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);

865:デフォルトの名無しさん
08/02/27 00:34:23
>>855
>Cを極めればオブジェクト指向言語を使わなくても良いコードが書けるんじゃねえの
これは当たり前なんだが、(といってもオブジェクト指向を使わないって意味じゃない、
Cでもオブジェクト指向は昔から存在する)

>結局クラスとかオブジェクトとかデザインパターンとか複雑で分かりにくくするなだけじゃね
何が複雑なんだ?
デザインパターンなんか当たり前の設計パターンに名前付けただけじゃないか。

866:デフォルトの名無しさん
08/02/27 00:36:27
変数へのアクセスを制限することで単純になるんだけどなぁ。
無制限に変数にアクセスできたほうが複雑だって、わかんないかなぁ。

867:デフォルトの名無しさん
08/02/27 00:48:26
Perlの文法が糞なのは間違いない。

868:858
08/02/27 01:12:38
>861
レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。

>860, 864
fscanfでできました。
どうもありがとうございました。

869:デフォルトの名無しさん
08/02/27 01:23:50
C++で配列のコピーってどうやりますか?
for()文で代入を回す?


870:デフォルトの名無しさん
08/02/27 01:24:40
memcpyが最速では

871:デフォルトの名無しさん
08/02/27 01:26:15
>866
何を以て「単純」とするかに依るんだろうな。
多分 >855 は言語の構造として単純であること、習得の容易さなどを見て言っているんだろうが
大きなコードを、そのまま扱うと中身はかなり複雑化する。
クラスや名前空間などを使って、大きなコードを小さな部品の集合体として考えて
それぞれの部品単位で扱うことで、ひとつひとつの部分は単純になる。

872:デフォルトの名無しさん
08/02/27 01:26:28
>>869 std::copy()

873:デフォルトの名無しさん
08/02/27 01:27:43
>>870 C++ で memcpy() は使わない。禿との約束だよ。

874:デフォルトの名無しさん
08/02/27 01:30:02
推奨されていなくても確保の仕方から
vectorでもstringで有効でしょう memcpy

875:デフォルトの名無しさん
08/02/27 01:31:12
memcpyより自分でアセンブラ書いた方がはやかったんだけど、そんなもん?

876:デフォルトの名無しさん
08/02/27 01:31:59
>>875 それはめずらしい。

877:デフォルトの名無しさん
08/02/27 01:39:54
memcpyより早いコードくれ

878:デフォルトの名無しさん
08/02/27 01:40:26
SSE使ったんだけどね

879:デフォルトの名無しさん
08/02/27 02:17:49
マイクロソフトのCHMファイルはなかなかいいんだけど
SJISしかコンパイルできなくて、サイズが20Mとかになるとコンパイルに失敗する
CHMをパクってWindowsの標準ヘルプ形式を作りたい 
参加者募集中
圧縮接尾辞配列がいいと思う
ブロックーソーティングしたデータはそのまま全文検索できるとおもうがどうか?

880:デフォルトの名無しさん
08/02/27 02:27:20
複数のテキスト文書を圧縮できてかつ高速に全文検索できて
CHMのような普及率を目指したい
デスクトップサーチとは目的が違う 元のファイルが復元できてまとめられる点が大事

881:デフォルトの名無しさん
08/02/27 02:28:28
tarでいいじゃない

882:デフォルトの名無しさん
08/02/27 02:33:30
tarは全文検索できるように設計されてるの?

883:デフォルトの名無しさん
08/02/27 02:38:51
tarは圧縮しないからね。

884:デフォルトの名無しさん
08/02/27 02:40:51
>>875
アラインメントに縛りを入れれば早くはできると思う

885:デフォルトの名無しさん
08/02/27 02:46:44
半分にはならないとだめだな chmは全文検索できて元の半分になるよ

886:デフォルトの名無しさん
08/02/27 02:51:09
>>880
専ブラのログをまとめるのに便利そうだ
あてにせず期待してるよ

887:デフォルトの名無しさん
08/02/27 03:29:32
badc$の巡回データは
adc$b
dc$ba
c$bad
$badc

ソートすると
$badc
adc$b
badc$
c$bad
dc$ba
ブロックソートではcb$daというデータのみが与えられる
復元しようとするとここまでは直ぐわかる
$***c
a***b
b***$
c***d
d***a
c$、ba、、$b、dc、adと繋がっていることがわかる
たとえばdcというデータは何番目に出現するか求めるとすると末尾のcから調べていけば良さそうだが

888:デフォルトの名無しさん
08/02/27 03:41:52
std::string
のような STL クラスを前方宣言するにはどうしたらいいですか?
それともこういうクラスって前方宣言しないでヘッダーに直接 include
させても問題ないですか?

889:デフォルトの名無しさん
08/02/27 04:17:01
Visual C++ Express Edition を入手したので、簡単なプログラムを作ってみようと思ったのですが、
なぜかコンパイルできません。
コマンドラインで、 cl c:\source.cpp としても、
'cout' : 定義されていない識別子です。
'endl' : 定義されていない識別子です。
等とエラーが返ってきます。
ちなみに、ソースは以下のようなものです。

#include <iostream>

int main(void)
{
cout << "Hellow, World!" << endl;
return 0;
}

なぜエラーになるのか分かりません。お暇な方いましたら、どうかお知恵をお貸しください。

890:デフォルトの名無しさん
08/02/27 04:20:39
×cout << "Hellow, World!" << endl;
○std::cout << "Hello World!" << std::endl;


891:デフォルトの名無しさん
08/02/27 04:21:19
あんたが外国にいるんじゃなかったら、本を買って勉強しる。

とりあえず、
std::cout << "Hellow, World!" << std::endl;
としてやってみ。

もしくは、
using namespace std:
をinclude 文の下に書いておくとか。

まあがんばれ。



892:デフォルトの名無しさん
08/02/27 04:24:33
>>890
ありがとうございます。
using namespace std; を追加したらコンパイルできました・・・ ^ ^;
最初、#include <iostream.h> としていて、コンパイル時にそんなファイルは無いと言われ、
#include <iostream> に直したら今度は cout が定義されて無いと言われ・・・
完全に勉強不足ですね・・・・

893:デフォルトの名無しさん
08/02/27 04:48:08
>892
環境によっては

#include <iostream.h>

と書くと、using namespace std; を勝手にやってくれるんだわ。
多分、そういう環境を前提にしたコードだったんだろう。

894:デフォルトの名無しさん
08/02/27 08:20:07
ついでに勉強不足の俺に教えてください
#include <string.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string a = "0908a89";

printf("%s\n", a);
getchar();
return 0;
}

aに0908a89が代入されて無いみたいなのですが、何処がまずいのでしょうか?

895:デフォルトの名無しさん
08/02/27 08:37:47
いろいろまずい。
というか、それVCならコンパイルとおるの?gcc 2.96だと少なくとも通らない。

・string.hってCの奴じゃないかな。#include <string>と書くべし
・その場合aってのはstring型なので、printfに%sで受けるのはよろしくない。
 書くならprintf("%s\n",a.c_str());
・でも、せっかく#include <iostream>してるんだから
 cout << a << endl;でいいじゃん。
・ところで最後のgetcharは何のために?

以上直すと、こっちでは代入されるよ。

896:デフォルトの名無しさん
08/02/27 09:02:30
>>895
ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。

897:デフォルトの名無しさん
08/02/27 09:06:36
>>896
修正したソースを張ってみないと有効な回答は得られないと思うよ。

898:デフォルトの名無しさん
08/02/27 09:09:57
int* random_array(int n);
shared_ptr<int> p(random_array(100));
というように書けないのですが、shared_ptrの作成時って、必ずnew[100]とかって
やらないとだめなのですか?


899:デフォルトの名無しさん
08/02/27 09:30:04
>>898
arrayの共有にはshared_arrayな。
それとエラーメッセージ書かないとエスパーしか解答できない。

900:デフォルトの名無しさん
08/02/27 11:36:18
system("path %PATH%; C:\\hofe;");
が有効になりません・・・
なぜでしょう

901:デフォルトの名無しさん
08/02/27 11:59:17
>>900
環境変数はプロセスごとに別々だから
子プロセスを起動してPATHを設定させても自プロセスには影響しない

902:デフォルトの名無しさん
08/02/27 12:07:43
改行しても無理でした パスを直うちするか、そこへ移動するしかないですか?
APIでPath設定できるか調べてみます
system("path C:\\hofe; \n abc.exe");

903:デフォルトの名無しさん
08/02/27 12:20:15
pathを追加する方法教えてください わかりませんでした

904:デフォルトの名無しさん
08/02/27 12:24:10
SetEnvironmentVariable

905:デフォルトの名無しさん
08/02/27 12:30:25
サンクス
長い実行パスと、長いパラメータパスで困ってました
これで解決しそうです

906:デフォルトの名無しさん
08/02/27 13:29:07
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>

using namespace std;

略)

string x;

sprintf(x, "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これで、buf[0], buf[1], buf[2], buf[3], buf[4]の値をstring型 でx代入したいんですけど
xが定義されていないと怒られてしまいます。どうしたら良いのでしょうか?

907:デフォルトの名無しさん
08/02/27 13:39:20
string x(11,'\0');

sprintf(&x[0], "%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);

これは無理?

908:デフォルトの名無しさん
08/02/27 13:51:44
>>907
テラThanks

909:デフォルトの名無しさん
08/02/27 13:57:03
まず間違いなく大丈夫ではあるものの一応標準外の仕様だと心にとどめておくといい

910:デフォルトの名無しさん
08/02/27 14:02:11
winsockを使うときエコーバックするのは普通ですか?
それとも負荷を下げるためにしませんか?
少量ずつデータ受け取ればミスしにくくなると思うんですけど
少しずつ受け取って確認無しでいいですか


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4987日前に更新/243 KB
担当:undef