[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/31 10:23 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1202141921/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

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

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

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

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

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

756 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:16:44 ]
>>752
理解できずに挫折したか。

757 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:16:59 ]
トオルさん帰れよ

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

759 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:28:27 ]
>>744
else if(count > 0)



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


761 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:30:58 ]
getline を知らんのか?

762 名前:744 [2008/02/25(月) 22:32:36 ]
>>761
K&Rにも載ってたんで知ってます。

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

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

764 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:33:42 ]
どこのK&Rだ、どこのw

765 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:35:10 ]
>>750
あと必要な物はやる気と根気ですかね?

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

766 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:36:48 ]
>>765
キモス

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

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

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


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

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

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

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



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

771 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:57:46 ]
>>770
>次に会社に出るのは3日後なんで

何でだ?

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

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

774 名前:デフォルトの名無しさん mailto:sage [2008/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 [2008/02/26(火) 00:36:44 ]
>>774
まぁ人には癖があるからね。
ありがとう。
人と自分のソースを比較するのが、
一番勉強になるよ。

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

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

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

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

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

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



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

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

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

782 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 07:25:27 ]
OK

783 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 11:37:48 ]
そういうもの。

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

786 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 12:06:04 ]
protectedじゃなくてもアクセス出来ちゃうの?

787 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 12:22:23 ]
protectedにすると、さらにtest2からも参照できるようになる

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

環境はVisualC++.net2003です。

789 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 13:07:03 ]
>>788
zlib



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

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

791 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 13:33:53 ]
789d

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

793 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 14:02:36 ]
>>782
すみません、寝てました。返答有難うございます。

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

794 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 14:24:18 ]
>>793
kmaebashi.com/programmer/pointer.html
これの応用。
ptrのほうからreference to pointer to HOGEと読める。

795 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 14:26:03 ]
>>793
typedef HOGE * HOGE_PTRしてみれば判る。

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

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

798 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 14:48:16 ]
EEを入れてみたか?

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



800 名前:デフォルトの名無しさん [2008/02/26(火) 14:56:40 ]
sp1にインストールできますか

801 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 15:02:40 ]
>>792
kwsk

according to standard

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

803 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 16:09:38 ]
>>802
それのどこがC/C++に関係があるの?

804 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 16:18:38 ]
>>802
つ printscreen

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

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

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

809 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:11:51 ]
>>805
support.microsoft.com/kb/190351/ja



810 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:15:43 ]
popenを使えたら楽だな
あればだけど

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



812 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:52:41 ]
関数オーバーロード、もしくはテンプレート関数でぐぐれ。

814 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 17:54:43 ]
>>812
typedef SAMPLE SAMPLE2;

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

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

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

818 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:28:13 ]
つ gcount

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



820 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:30:30 ]
>>818 と思ったらそんなメソッドがあったか。サンクス

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

822 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 18:55:55 ]
んなこたーない

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

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

825 名前:デフォルトの名無しさん [2008/02/26(火) 19:19:44 ]
stringはできる

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

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

828 名前:デフォルトの名無しさん [2008/02/26(火) 19:23:04 ]
Windowsのファイル入出力APIのことを指す

829 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 19:55:08 ]
>>824 strcmpしとけ



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

831 名前:デフォルトの名無しさん [2008/02/26(火) 21:22:25 ]
ググって解決しました

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

833 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:04:41 ]
問題ない。
ところで_beginthreadは使うなよ。_beginthreadexにしろよ。
msdn2.microsoft.com/ja-jp/library/kdzttdcb(VS.80).aspx

834 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:17:26 ]
declspecは関係ないだろ

836 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:19:03 ]
関係あるよ

837 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:19:32 ]
関数ポインタで悩んだら、typedef

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

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

間違い?


839 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:39:07 ]
なるべくシンプルにかくのを推奨されますからね



840 名前:デフォルトの名無しさん [2008/02/26(火) 22:43:09 ]
関数テーブル間違いです
鈍いです

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

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

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

843 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:50:41 ]
>>833
ありがとう。今度からそうする

844 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:54:19 ]
そこでBoost::functionとコールバックですよ。

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

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

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

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

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

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

まぁケースバイケース?



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

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

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


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

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

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

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

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

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

857 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:22:49 ]
>>855
んなこたーない

858 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 00:28:04 ]
>>856
どんな文字列を渡したとき?



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

861 名前:デフォルトの名無しさん [2008/02/27(水) 00:29:09 ]
string s;

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

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

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

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

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

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

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

867 名前:デフォルトの名無しさん [2008/02/27(水) 00:48:26 ]
Perlの文法が糞なのは間違いない。

868 名前:858 mailto:sage [2008/02/27(水) 01:12:38 ]
>861
レスありがとうございます。
が、、私ではうまいこと使えませんでした。ごめんなさい。。

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

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




870 名前:デフォルトの名無しさん [2008/02/27(水) 01:24:40 ]
memcpyが最速では

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

872 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:26:28 ]
>>869 std::copy()

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

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

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

876 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:31:59 ]
>>875 それはめずらしい。

877 名前:デフォルトの名無しさん [2008/02/27(水) 01:39:54 ]
memcpyより早いコードくれ

878 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:40:26 ]
SSE使ったんだけどね

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



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

881 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:28:28 ]
tarでいいじゃない

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

883 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:38:51 ]
tarは圧縮しないからね。

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

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

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

887 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 03:41:52 ]
std::string
のような STL クラスを前方宣言するにはどうしたらいいですか?
それともこういうクラスって前方宣言しないでヘッダーに直接 include
させても問題ないですか?

889 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 04:20:39 ]
×cout << "Hellow, World!" << endl;
○std::cout << "Hello World!" << std::endl;


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

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

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

まあがんばれ。



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

893 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 04:48:08 ]
>892
環境によっては

#include <iostream.h>

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

894 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 09:02:30 ]
>>895
ありがとー 出来ました。
コンパイルは出来てましたがNULLが表示されました。
getchar();しないと画面が速攻閉じてしまうので、画面確認用にです。

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

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


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



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

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

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

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

904 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:24:10 ]
SetEnvironmentVariable

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

906 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:51:44 ]
>>907
テラThanks

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



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

911 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:02:13 ]
次の改訂で標準になるけど、コンパイラの対応が普及するまで合わせると、
問題ないと言えるのは何年も先かなぁ。

912 名前:デフォルトの名無しさん [2008/02/27(水) 14:09:00 ]
http先のファイルのサイズやcrcを取得する方法教えてください
それみてデータが正常が判定したいです

913 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:23:32 ]
>>910
何をどこにエコーバックするんだ
ミスって何のだ

>>912
ファイルサイズは全部受信すればわかるだろう
CRCの計算方法はこれ↓
en.wikipedia.org/wiki/Computation_of_CRC

914 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:40:20 ]
>>912
サイズはレスポンスヘッダのContent-Length (ない場合もある)
CRC は無理かと

915 名前:907 mailto:sage [2008/02/27(水) 14:46:39 ]
もう一つ教えて下さい。

char str[100];

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

char str0[100];
char str1[] = "01061719d0";
char str2[] = "0106171f34";

if (strcmp(str, str1) == 0){
printf("この番号は登録されています@\n番号%s\n",str);
}
else if (strcmp(str, str2) == 0){
printf("この番号は登録されていますA\n番号%s\n",str);
}
else {
printf("この番号は登録されていません\n番号%s\n",str);
}
このようなif文にしたいのですが、登録したbuf[]を読み込んでも"この番号は登録されていません"
と表示されてしまいます。なぜでしょうか?

916 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:53:34 ]
std::vectorとCStringでは、empty() (とEmpty()) の意味違うのね〜

しばらく騙されてました。

917 名前:デフォルトの名無しさん [2008/02/27(水) 14:54:36 ]
stlのset使った方がいいんじゃない

918 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:03:58 ]
>>915
strを表示させてみるんだ

919 名前:デフォルトの名無しさん [2008/02/27(水) 15:06:37 ]
>>914
GETでして送られてくるヘッダをみるんですよね?
2chのスレURLいれるとサイズ書いてないです
できる限りなんとか取得する方法無いですか?



920 名前:デフォルトの名無しさん [2008/02/27(水) 15:08:28 ]
送受信のデータです

GET live27.2ch.net/test/read.cgi/livemarket2/1202634378/ HTTP/1.0

HTTP/1.1 200 OK
Date: Wed, 27 Feb 2008 06:07:25 GMT
Server: Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

921 名前:デフォルトの名無しさん [2008/02/27(水) 15:12:53 ]
動的に変化するから無理そうですね
通信切れで見られないHMLの取得を避けたいんですけどいい方法ありませんか

922 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:15:27 ]
最後に </html> が無かったら途中で切れたと判断するとか

923 名前:デフォルトの名無しさん [2008/02/27(水) 15:20:51 ]
普通のテキストならどうしたらいいですか?
もともと不完全なHTMLならどうしたらいいですか?
サーバーのファイルと一致していてもエラーになります

924 名前:915 mailto:sage [2008/02/27(水) 15:23:30 ]
>>918
str は 0106719d0 になっているようです><
なんでうまくいかないんだろう。。

925 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:25:54 ]
>>922
HTML4では </html> は省略可能なので万能じゃない

>>920
Connection: close
って書いてあるから接続断まで読めばそれで全部。

あと、なるべくHTTP/1.1使え
手元で確認した限り、HTTP/1.1でアクセスすると
chunked で送ってくるので末尾がちゃんと確認できる

926 名前:920 [2008/02/27(水) 15:28:36 ]
サンクス

927 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:34:26 ]
>>924
sprinf で \n を付けているのに str1, str2 には付いていないぞ

928 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:35:55 ]
HTMLパーサは↓程度はきちんと解析してくれないとねぇ‥‥

46 名前:デフォルトの名無しさん[sage] 投稿日:2008/01/27(日) 00:38:23
これだって正しいでっせ

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "www.w3.org/TR/html4/strict.dtd">
<title>テスト</>
<p><em/ほげほげ/
<p style=width:50px<strong>ふーばー</strong</p>

929 名前:デフォルトの名無しさん [2008/02/27(水) 15:42:57 ]
1.0から1.1にするとバットリクエストのエラーになります
書式が違うんでしょうか_

buf="GET " + path + " HTTP/1.1\r\n\r\n";
n=send(sock, buf.c_str(), buf.size(), 0);



930 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:44:16 ]
1.1はHostヘッダの送信が必須

931 名前:デフォルトの名無しさん [2008/02/27(水) 15:44:52 ]
1.1だと、ユーザー情報も送信しないと無理になるんですか

932 名前:デフォルトの名無しさん [2008/02/27(水) 15:54:08 ]
なおらないです どうすればいいですか?

GET /test/read.cgi/livemarket2/1202634378/ HTTP/1.1
Accept: */*
Referer: live27.2ch.net/
Accept-Language: ja
Host: live27.2ch.net
Connection: Keep-Alive

HTTP/1.1 400 Bad Request

ソース
buf="GET " + ko+ " HTTP/1.1\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept: */*\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Referer: http://"+sev+"/"+"\r\n\r\n";;
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Accept-Language: ja\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Host: "+sev+"\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);
buf="Connection: Keep-Alive\r\n\r\n";
cout<<buf; n=send(sock, buf.c_str(), buf.size(), 0);

933 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:58:54 ]
改行大杉

934 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 16:01:24 ]
2回改行するのは最後だけ

935 名前:915 mailto:sage [2008/02/27(水) 16:02:42 ]
>>927
盲点でした。
やっと次の作業に進めそうです。本当にありがとうございます。

936 名前:デフォルトの名無しさん [2008/02/27(水) 16:06:31 ]
サンクス 改行削って上手くいきました
あと受け取るバッファを多くすると返却値を間違えるようなんです
どうやれば直りますか?
n = recv(sock, &buf[0], 128000, 0);
としてnまで表示するとデータ入ってないときがあります

937 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:05:30 ]
めっちゃミジンコの質問させて下さい。
図書館で借りてきた本のページが抜けてて%cはどういう時に使うのか
わかりません;
%はぐぐれないみたいで困ってます。

938 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:08:24 ]
>>937
www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html

文字じゃね?

939 名前:937 mailto:sage [2008/02/27(水) 17:16:21 ]
>>938
まだ始めたばかりなのでこのサイトはちょっと厳しいです・・・。

文字ということで本を読みすすめてみます。
有難うございました。



940 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:49:40 ]
>>932,936
send も recv も、指定したサイズ未満しか送受信できないことがあるので、
その場合にも対応すること。
あと、エラー処理もちゃんと毎回やること。

941 名前:デフォルトの名無しさん [2008/02/27(水) 20:53:29 ]
HTTPで初めにサイズだけ取得したとして、読む位置をデータの始まりにシークできますか?
初期化からやり直した方がいいですか?
データ位置を自前で判別して方がネットワークの負荷は少なくなりますが

942 名前:デフォルトの名無しさん [2008/02/27(水) 20:55:33 ]
自己解決しました
いったん全部読み込んで、ヘッダとデータを分離してサイズが不一致なら再送にします

943 名前:デフォルトの名無しさん [2008/02/27(水) 20:56:50 ]
すいません。タイトルにふさわしく初歩的な質問ですが、
ポインタはメモリを格納しているアドレスの位置を指す
と言いますが、ではそのポインタの情報はどこに格納
されるのでしょうか?



944 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:01:14 ]
実行時なら、それを格納しているのがポインタ変数。

コンパイル時、&xという記述からどうやってxのアドレスを知るかと言うことなら、
それはコンパイラの仕事、コンパイラが決めること。

945 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:08:38 ]
つまりint とか char とかと同じような感じでアドレスが入ってる変数があるってだけさ

946 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:09:38 ]
ごめん語弊がありますねすいません
(入ってるのアドレスだけじゃないですね)

947 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:11:45 ]
普通はアドレスだけだと思うが。
メンバポインタとかは別だが。

948 名前:デフォルトの名無しさん [2008/02/27(水) 21:12:50 ]
string x, y="*****"; となっていたとして、
xとyのデータを一致するようにできますか コピーではなくて

949 名前:デフォルトの名無しさん [2008/02/27(水) 21:14:24 ]
int a,b=10;
&a=&b;のような事はできないですよね?



950 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:14:35 ]
string x = "*****", y = x;

という話ではなくて?

951 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:16:08 ]
string だと共用体が使えないから
参照にするしかないな。

string y = "*****", &x = y;

952 名前:デフォルトの名無しさん [2008/02/27(水) 21:16:48 ]
同一アドレスの同一データにしたいのですが 無理ですよね

953 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:18:11 ]
x も xもポインタにして確保した同じとこさせばいいんじゃね?

954 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:19:46 ]
>>949
アドレス演算子の結果は右辺値だと思った。

955 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:21:38 ]
>>949
int *ap = &a;
int *bp = &b;

ap = bp;

956 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:25:39 ]
>>952
何でそう言う事がしたいの?

957 名前:デフォルトの名無しさん [2008/02/27(水) 21:36:28 ]
すでに確保された変数のアドレスを書き換えるテクがあるかなと思った

958 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:38:06 ]
アドレスはマシン語にそのまま組み込まれてるんだぜ?

959 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:40:37 ]
変数は極端な話レジスタに載ってるかも知れないわけで。

string x,y="...";
#define x y



960 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:43:17 ]
string y = "*****", &x = y;

とした場合、最適化で x と y が同一視される可能性はあるんじゃないかな。

961 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:47:24 ]
>>957
変数のアドレスは、変数が確保されたときに固定されるものだろ。
「すでに確保された変数のアドレスを書き換えるテク」を期待する目的がわからん。

962 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:50:29 ]
論理アドレスくらいなら書き換えることは可能かもしれない。

963 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:22:39 ]
class CSample2{};

class CSample
{
public:
  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2
private:
  CSample2 m_obj_s2;
};

main{
  CSample1 obj_s1;
  CSample2 *obj_s2 =NULL;
  obj_s1.get( obj_s2 );
}

これでmain内のobj_s2がobj_s1.m_obj_s2と同じ物を指すようにしたかったのですが、NULLを指したままかわりません。
参照戻しではできたのですが、これで出来ない理由がわからず気持ち悪いです。
どなたか原因のご教授お願いします。


964 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:23:37 ]
vectorに関数ポインタを格納するにはどうしたらいいでしょうか?

vector<bool (*func)(int)> EroeroFunction;
 ↑<>の中のカッコが悪戯してうまくコンパイルが通らなくて困ってます。

構造体に関数ポインタを入れればなんとかなるんですが、メンバが1つしかないのでなんとも。

965 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:27:29 ]
かなりのFAQ。引数経由でポインタを戻すなら、ポインタのポインタかポインタ参照か
どっちかつかえ。

<  void get( CSample2 *obj_s2 ){obj_s2 = &m_obj_s2

>  void get( CSample2 *&obj_s2 ){obj_s2 = &m_obj_s2;}

>  void get( CSample2 **obj_s2 ){*obj_s2 = &m_obj_s2;
}

966 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:27:58 ]
>>963
get関数内でobj_s2を書き換えても、呼び出し側のobj_s2は書き換わらない。
関数に引数を渡す際の基本だろ?
ポインタを書き換えたいなら、ポインタをアドレス渡しでもすればいい。
void get( CSample2** ppobj_s2 ) { *ppobj_s2 = &m_obj_s2; }
obj_s1.get( &obj_s2 );

967 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:29:45 ]
>>964
vector<bool (*)(int)> じゃないの?

968 名前:デフォルトの名無しさん [2008/02/27(水) 22:33:46 ]
vector<char>って後方に同じ型を連結できますか
そういう関数ありますか

969 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:34:45 ]
>>968
言ってる意味が分からない。



970 名前:デフォルトの名無しさん [2008/02/27(水) 22:35:22 ]
push_backでは一つしか増やせません 一度に増やすやつないですか

971 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:36:14 ]
>>968
std::copyとstd::back_inserterを組み合わせるんじゃねーの?

972 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:36:42 ]
>>968
こういうこと?
vector<char> v1, v2;
v1.insert(v1.end(), v2.begin(), v2.end()); // v1の末尾にv2の全要素を追加


973 名前:デフォルトの名無しさん [2008/02/27(水) 22:37:22 ]
vector<int> x,y;

x={1,2,3}
y={4,5,6}

x.push_back(y)={1,2,3,4,5,6}

こういうやつです

974 名前:デフォルトの名無しさん [2008/02/27(水) 22:39:20 ]
それでできますかサンクス

975 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:41:49 ]
まんまinsertでいいんじゃね?

976 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:42:56 ]
insertやね
operator+=を外部に定義しておくと便利かも

977 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:47:04 ]
要素の連結か、要素ごとの+=か曖昧なので、そんなのいらんかも

978 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:07:18 ]
C言語なんですが
配列でポインタ表現を使ってアクセスしてインクリメントようと思って
*(array+i)++としたら'++'には左辺値が必要です、とエラーが出てきました
これは配列で宣言したからだと思うんですが
ポインタで宣言した場合は値が飛び飛びになるので、*(array+i)みたいな表現できないでしょうし
どうすればいいでしょう?

979 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:09:43 ]
(*(array+i))++;
++*(array+i);

変なことになったらとりあえず優先順位を疑うのは基本。



980 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:10:19 ]
*((array++)+i) // arrayを増やす場合
*(array+i++) // iを増やす場合

981 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:11:35 ]
*(array+i) と array[i] は優先順位以外は等価。

982 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:12:23 ]
>>979
できました。ありがとうございます。
優先順位って今まで全然気にしてませんでしたので
今後注意して行こうと思いますorz

983 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:14:10 ]
>>979>>980 のどちらを意図してるんだろうか。

それはともかく、array[i]++; と書けばいいのに
何でそうしないのか本気で理解できない。

984 名前:デフォルトの名無しさん [2008/02/27(水) 23:27:31 ]
i++[array]と書くのが漢

985 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:30:03 ]
漢すぎるwwwwww

986 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:39:05 ]
(*(array + i))++; ←等価→ array[i]++; ←等価→ i[array]++;
array++[i]; ←等価→ *((array++)+i) ←等価→ i[array++];
i++[array]; ←等価→ array[i++]; ←等価→ *(array+i++);

987 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:40:43 ]
はじめて見た。
誰だよこんな書き方見つけた奴……

988 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:43:59 ]
*(E1+E2) と E1[E2] の挙動は等価だと規格に書いとるべ。
*(array+i) と *(i+array) が等価なのと同じく
array[i] と i[array] も等価だべ。

989 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:44:30 ]
array[i]を*(array+i)の糖衣構文とすることを発案した人が真っ先に見つけただろうな。
で、誰?



990 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:45:42 ]
(i % 16)["0123456789ABCDEF"]

991 名前:デフォルトの名無しさん [2008/02/27(水) 23:45:54 ]
string x,y; N=0; x.resize(0); に対して

x+=y;

memcpy(&x[N],&y[0], y.size()); N+=y.size;

は同じのはず
yがバイナリデータだと上が失敗することが多いです

992 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:47:15 ]
>>990
すげぇwwww感動したwwwwwww

993 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:49:12 ]
>>991
x のメモリ確保はどこ行った。

994 名前:デフォルトの名無しさん [2008/02/27(水) 23:50:05 ]
メモリ確保はあらかじめしておいてください あと最後にNでresizeも

995 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:50:49 ]
>>991
stringに文字列以外入れるなよ。
あと、x.capacity() >= y.size() でないとmemcpyがメモリ壊すぞ。

996 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:51:46 ]
>>994
同じというなら、同じになるコードを書けよ。

997 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:53:00 ]
変な入門書で配列のとこにすぐにその記法が説明してあったからできるのは知ってたけど、
できる理由は全然考えたことがなくて、今はじめて理解したw

998 名前:デフォルトの名無しさん [2008/02/27(水) 23:53:19 ]
zipファイルを少しずつyに入れてからxに足し込むんですけど
memcpyの方は書き出して復元できますが、+=はまれに正常でほとんど壊れます
原因はなんでしょう

999 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:55:24 ]
>>998
vectorを使わずstringを使ったから。



1000 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:55:32 ]
なんで文字列じゃないものをstringに入れるんだ。

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef