【初心者歓迎】C/C++室 Ver.50【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/02/28(木) 00:01:39ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.49【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1203478421/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/02/28(木) 00:02:130003デフォルトの名無しさん
2008/02/28(木) 00:05:35こっちのがかっこいいな
0004デフォルトの名無しさん
2008/02/28(木) 00:07:13こっちが遅いから、あっちが先だな。
0005デフォルトの名無しさん
2008/02/28(木) 00:08:28こっちもいいな〜
0006デフォルトの名無しさん
2008/02/28(木) 00:09:53#include <iostream>
#include <string>
using namespace std;
main(){
int n, sz=1024*100, step=8;
string c(sz,'\0'),x="", y(sz,'\0');
for(n=0;n<sz;n++)c[n]=rand();
for(n=0;n<sz;n+=step){
x+=c.substr(n,step);
memcpy(&y[n],&c[n],step);
}
if(x==y)cout<<"一致しました"; else cout<<"異なります";
}
0007デフォルトの名無しさん
2008/02/28(木) 00:20:29そうやってメモリをちゃんと確保してるなら問題は無い。
string は実は 0 を含むことができるしね。
(string += const char* としようとすると const char* の 0 が現れた時点で代入が止まるが)
現状の規格では string の内部バッファの連続性は保証されてないけど、
次期規格で保証されるようになる位一般的な実装だから心配は無いだろう。
0008前スレ963
2008/02/28(木) 01:06:23よくわかりました。自分が馬鹿でした。ありがとうございました。
0009デフォルトの名無しさん
2008/02/28(木) 01:28:45選択した画像ファイルのヘッダ情報?(フォーマット、カラースペース等)を
取得するにはどうすればいいのでしょうか
質問の意味が分からなければごめんなさい。
始めて右も左も分からないもので…
よろしくお願いします。
0010デフォルトの名無しさん
2008/02/28(木) 01:34:12ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1215014602
でもその前にこれ見てから。
ttp://blogs.yahoo.co.jp/downtown_sanma_1002
0011デフォルトの名無しさん
2008/02/28(木) 09:37:49画像フォーマットに応じてヘッダ解析処理を書く。
画像フォーマットの仕様書はネット探せばあるだろ。
0012デフォルトの名無しさん
2008/02/28(木) 12:01:38まあかっこいいからしょうがないか。
0013デフォルトの名無しさん
2008/02/28(木) 13:36:13実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか?
あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良いというのは本当なんでしょうか?
0014デフォルトの名無しさん
2008/02/28(木) 13:43:24>実際にメンバ関数や変数が使えるようになるタイミングというのは気にしなくて良いのでしょうか?
どういうときに気にする必要があるの?
>コンストラクタ内で仮想関数
ケースバイケースだが、派生クラスでオーバーライドされたものが呼ばれると思ってると痛い目に会う。
0015デフォルトの名無しさん
2008/02/28(木) 14:14:54>あと、派生クラスの時には仮想関数はコンストラクタ内で使用しない方が良い
>というのは本当なんでしょうか?
C++のオブジェクトモデルの観点から言えば、
少しおおざっぱだが(厳密さは省く)、コンストラクタにはコンパイラ
によってvptrが自クラスの仮想関数テーブルへのポインタにセットされる
タイミングがあって、コンストラクタボディでは既にセットされてしまって
いる。基底クラスのコンストラクタボディでは基底クラスの仮想関数テーブル
が参照される。どう頑張ってもポリモルフィズムは起こらない。
0016デフォルトの名無しさん
2008/02/28(木) 14:39:19基底クラスには存在しない関数を呼び出すことになるので
コンパイルエラーになるのかな?
0017デフォルトの名無しさん
2008/02/28(木) 14:47:24定義が無いとリンクエラーだろうな。
001816
2008/02/28(木) 14:54:58g++でテストしてみたよ
エラーになった…コンパイルエラーっぽいけどリンカエラーなのかな
詳細は不明ですが、エラーになると。まあ当然ではありますが…
>tes.cc: In constructor `A::A()':
>tes.cc:12: error: abstract virtual `virtual void A::func()' called from constructor
0019デフォルトの名無しさん
2008/02/28(木) 15:01:24認識合ってないかも。>>13からの流れのだよね?
class Widget {
public:
virtual void jyunsui() = 0;
Widget(){ jyunsui(); }
~Widget(){}
};
class Budget : public Widget {
public:
void jyunsui() {}
};
Budget b;
こういうことじゃない?
002016
2008/02/28(木) 15:13:34コンストラクタから仮想関数を呼び出すときに仮想関数テーブルにある
関数が呼び出されるという話を聞いて
仮想関数が純粋仮想の場合はどうかなと思った次第であります
あまり深い意味はありません、すみません…
テストしたコードは19さんのコードと同じです
コンパイルすると
>tes.cc: In constructor `Widget::Widget()':
>tes.cc:8: error: abstract virtual `virtual void Widget::jyunsui()' called from constructor
0021デフォルトの名無しさん
2008/02/28(木) 15:23:31へえ、コンパイルエラーなんだ。
Comeau C++ では警告は出たけどコンパイルできた。
VC++2008だとリンクエラーになったね。
定義すると警告無しでビルドできた。
0022デフォルトの名無しさん
2008/02/28(木) 15:30:550023デフォルトの名無しさん
2008/02/28(木) 17:05:21標準でそういった関数?はあるのでしょうか?
0024デフォルトの名無しさん
2008/02/28(木) 17:23:590025デフォルトの名無しさん
2008/02/28(木) 17:39:49g++ 4.0 では警告出たけどコンパイルできたよ。
もちろんリンクはできないけど。
定義するとリンクも通る。
0026デフォルトの名無しさん
2008/02/28(木) 17:45:11ありがと。
0027デフォルトの名無しさん
2008/02/28(木) 18:45:23passing `const cell' as `this' argument of
`double cell::cell_input(double)' discards qualifiers
というエラーが出ます。
問題の行は
IT->first.cell_input( OUTPUT*(IT->second) );
でITは
map<cell,double >::iterator IT;
です。
やりたいことはclass cellのオブジェクトA内のpublic関数から
別のオブジェクトB内のpublic関数にアクセスすることです。
0028デフォルトの名無しさん
2008/02/28(木) 18:53:14map<cell,double >
のcellはconstで修飾されてる。
IT->first.cell_input・・・・
cell::cell_input(double);が非constメンバー関数なんじゃないの?
0029デフォルトの名無しさん
2008/02/28(木) 19:02:46コンパイラはbccを使用しています。
別のcppファイルで定義した配列をexternしたいのですが、
"外部シンボルが未解決です"というリンクエラーがでます。
data.cpp
const char namber[5] = { 1, 2, 3, 4, 5 };
show.cpp
extern char namber[];
リンクエラーを解決する方法を教えて頂けないでしょうか?
よろしくお願いします。
0030デフォルトの名無しさん
2008/02/28(木) 19:05:53ありがとうございます!
非constメンバー関数、で検索かけて調べてみます!
003127
2008/02/28(木) 19:17:50調べましたがmapに放り込んだ時点でconst cellになってしまうから
もし非constメンバ関数からconstメンバ関数に変えられない場合
私がやりたいことは出来ないということでしょうか?
cell_ouputは非constメンバ関数でありデータメンバを書き換えます。
0032デフォルトの名無しさん
2008/02/28(木) 19:23:26残念ながらmapのキーはconstだからキーのオブジェクトは
変更できない。他の手段を考えたほうがいいかも。
とにかくcellはconstオブジェクトだから非constメンバー関数
は呼び出せない。
0033デフォルトの名無しさん
2008/02/28(木) 19:25:20変更する部分をまとめてpimplにするとかはどうよ?
003427
2008/02/28(木) 19:26:18まいった。ありがとうございます。
無理やりmap<mutable cell,double >::iterator IT;
とか書いてみたけど無理っぽかったです。
他の手段か・・重ねてありがとう。
0035デフォルトの名無しさん
2008/02/28(木) 19:29:49mutable使うならメンバーに
あまり好きではないけど
003627
2008/02/28(木) 19:35:30pimplちょっと調べてみたんですが難しくて・・覚えておきます、ありがとう。
>>35
メンバー関数の先頭にはmutable付けられなかったです。
変更されることになるデータメンバの先頭につけてみたけど変わらず・・。
0037デフォルトの名無しさん
2008/02/28(木) 19:40:31mutableデータメンバはconstメンバ関数から変更できる
0038デフォルトの名無しさん
2008/02/28(木) 19:41:02mutableを非staticなメンバーに指定すれば、constメンバー関数内で
変更できるはずだけど。
0039デフォルトの名無しさん
2008/02/28(木) 21:27:490040デフォルトの名無しさん
2008/02/28(木) 21:41:36すいません。前回ポインタの格納場所について質問したものですが
お礼を言うのを忘れていました。
ありがとうございます。
0041デフォルトの名無しさん
2008/02/28(木) 22:08:50キーがconstなのは、キーでソートされるからであって、
mapに格納したまま書き換えたら順序を守れなくなる。
一旦mapから削除して、書き換え後に再度insertすべきでは?
0042sage
2008/02/28(木) 22:21:56ポインタのポインタを使ってみたのですが。教えてくだされ。
#include <stdio.h>
#include <string.h>
const char* string;
const char** address;
char str[1024];
void inputadd(const char* stradd){
address=&stradd;
}
void inputstr(void){
char teststr[]="abcdefghijklmn";
strcpy(str,teststr);
*address=str;
}
void main(void){
string=NULL;
inputadd(string);
inputstr();
printf(string);
}
0043デフォルトの名無しさん
2008/02/28(木) 22:24:24address=&stradd; ←これがダメ
straddはinputadd内のローカル変数だ。
関数を抜けると無くなるので、addressはトンでもないところを指すことになる。
004429
2008/02/28(木) 22:30:58分割コンパイルを行わないといけないのですね。
記述にばかり目を奪われておりましたが、
やっと問題点に気がつきました。
レスが無いのも納得がいきます。
それでは。
0045デフォルトの名無しさん
2008/02/28(木) 22:31:03サンクス。ポインタは引数なら直でいけるという思い込みだったわ。
関数内で使っているものはポインタの値のコピーに過ぎないわけだな。
下みたいにして乗り切ったが正解でいいんだよな?
void inputadd(const char** stradd){
address=stradd;
}
0046デフォルトの名無しさん
2008/02/28(木) 22:39:56STL使えばすべて片付く
0047デフォルトの名無しさん
2008/02/28(木) 22:43:40練習コードなんだから、なんでもやってみればいい。
>>45 OK
0048デフォルトの名無しさん
2008/02/28(木) 23:03:04使うのは、速度やサイズの気になる場面だけだ
それまで気になるならアセンブラにする
0049デフォルトの名無しさん
2008/02/28(木) 23:04:100050デフォルトの名無しさん
2008/02/29(金) 00:19:170051デフォルトの名無しさん
2008/02/29(金) 00:47:12少なくとも考えなしに使うのは。
0052デフォルトの名無しさん
2008/02/29(金) 01:12:200053デフォルトの名無しさん
2008/02/29(金) 01:27:58実測もせずに new を避けるのも良くない。
0054デフォルトの名無しさん
2008/02/29(金) 03:16:430055デフォルトの名無しさん
2008/02/29(金) 06:28:300056デフォルトの名無しさん
2008/02/29(金) 10:16:31動的にオブジェクトの生成をしたらだめ?
0057デフォルトの名無しさん
2008/02/29(金) 11:02:47あえてだめっていう理由があるとしたらオーバーヘッドだろうか、ログ読んでないからなんともいえないが
005827
2008/02/29(金) 11:39:19昨日は急用で落ちてしまいました27です。
>mutableを非staticなメンバーに指定すれば、constメンバー関数内で
変更できるはずだけど。
を実践したところコンパイル通りました!
constとかややこしくて触らないようにしてたんですけど
これからちょこっと勉強してみようと思います
みなさんありがとうございました!!
0059デフォルトの名無しさん
2008/02/29(金) 12:10:15不安定になる
0060デフォルトの名無しさん
2008/02/29(金) 12:16:40動的確保が悪いんじゃない。正しく扱わないプログラマが悪いんだ。
C++ なら、 new したらすぐ auto_ptr なりに突っ込んどくとか、
new [] したくなったら標準コンテナを使うとか、そういう正しい対処をしとけば
ミスもほとんど防げる。
原因も把握せずに「不安定になる」とか言ってプログラムの手段を
制限するのは得策じゃないね。
0061デフォルトの名無しさん
2008/02/29(金) 12:24:44for(n=0;n<100000;n++)
str+="A";
などは解放確保を繰り返し良くない
0062デフォルトの名無しさん
2008/02/29(金) 12:29:330063デフォルトの名無しさん
2008/02/29(金) 13:45:50環境はVS2008、作ろうとしてるモノはMFC ActiveXです。
内部で文字列の暗号化処理(Blowfish)をしたいのですが、以下のソースを書いてコンパイルも
一応通ったものの、案の定うまく動きません。
LPSTR lpszPassword; //パスワード
LPTSTR lpszInputStr;//暗号前文字列
//↑に値を適当にセットした上で↓
UCHAR digest[16];
MD5String(lpszPassword, digest);
CBlowFish bf;
bf.Initialize(digest, sizeof(digest));
unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr));
// エンコード
bf.Encode((unsigned char*)lpszInputStr, outBuf, sizeof(lpszInputStr));
printf("%S", outBuf)
よくわからなくて、ググりつつ適当に書いたソースなのでめちゃくちゃだと思います。
最終的には暗号化されたMD5ハッシュ値のような感じの文字列が出力されることを期待
していたのですが、バケバケな上入力値を変えても同じ値が返ってきますw
若干お手上げなので、皆さんのお知恵を拝借ください
006463
2008/02/29(金) 13:49:43↓ここから持ってきました。
http://www.schneier.com/blowfish-download.html
0065デフォルトの名無しさん
2008/02/29(金) 13:56:07調べてみたのですが、
VC++2005
#include <mmsystem.h> // PlaySound()のため
#pragma comment(lib,"winmm")
#define FILENAME "Windows XP Startup.wav"
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN: //再生
PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
return 0;
case WM_RBUTTONDOWN: //停止
PlaySound(NULL,NULL,0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
このようなサンプルを見つけたのでコンパイルしてみたのですが、
error C2065: 'CALLBACK' : 定義されていない識別子です。
error C2065: 'DRIVERPROC' : 定義されていない識別子です。
error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
なぜでしょうか?
0066デフォルトの名無しさん
2008/02/29(金) 13:57:41#include <windows.h>
0067デフォルトの名無しさん
2008/02/29(金) 14:14:23ありがとうございます。ですが、まだエラーが出てしまいます><
VC++2005
#include <windows.h>
#include <mmsystem.h> // PlaySound()のため
#pragma comment(lib,"winmm")
#define FILENAME "Windows XP Startup.wav"
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_LBUTTONDOWN: //再生
PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
return 0;
case WM_RBUTTONDOWN: //停止
PlaySound(NULL,NULL,0);
return 0;
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [23]' から 'LPCWSTR' に変換できません
0068デフォルトの名無しさん
2008/02/29(金) 14:17:280069デフォルトの名無しさん
2008/02/29(金) 14:28:38ありがとうございます。&重ね重ねすいません。まだ駄目みたいです。
error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。
0070デフォルトの名無しさん
2008/02/29(金) 14:33:190071デフォルトの名無しさん
2008/02/29(金) 14:33:42#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
main(){
PlaySound("C:\\WINDOWS\\system32\\oobe\\images\\clickerx.wav",
NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);
Sleep(2000);
PlaySound(NULL,NULL,0);}
0072デフォルトの名無しさん
2008/02/29(金) 14:35:57main関数がないのに動くわけないだろう
0073デフォルトの名無しさん
2008/02/29(金) 14:38:11int main を追加する方法や システム>サブシステムをwindowにする方法
エントリポイントにMainを追加してみたりは試した上で質問はしました。。><
0074デフォルトの名無しさん
2008/02/29(金) 14:49:57int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev,
LPTSTR lpCmd, int nCmd)
{
...
}
あとWindowProcを呼ばせるにはちゃんとウィンドウを作って、
メッセージ処理しないとだめだと思うぞ。
0075デフォルトの名無しさん
2008/02/29(金) 14:59:41書き終わった直後に気付いて書いてみたのですが根本的な原因は別にあるようでした。
>>74
そうみたいです!。ありがとうございます。
>>71
これに、文字セットをマルチバイトにしてみたところ。うまくいったので、これをベースにして、考えているプログラムにしてみたいと思います。
みなさんお付き合い頂いてありがとうございました。
0076デフォルトの名無しさん
2008/02/29(金) 15:06:52>unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr));
俺unix屋だから windows のこと詳しくないけど
lpszInputStr は LPTSTR だからポインタだと思うよ。
上のコードのしていることは文字列の分ではなく
ポインタのサイズの分をmallocで確保している。多分4バイトくらい。
まず文字列のバイト数を正しく求めることから始めないといけないんじゃないかな。
size_t size_of_in = sizeof(TCHAR) * (lstrlen(lpszInputStr)+1); // NUL 文字に+1文字分
あと outBuf には暗号化されたバイナリが入るだろうから
printf("%S") ではうまく表示されないと思うよ。バイナリで扱わないと。
他にも暗号化単位やバイトオーダーなども問題になるかもしれないよ。
007763
2008/02/29(金) 16:02:41ども、ありがとうございます。
PHPやASPな人間なもんで、厳密な型変換やったことないんでさっぱりです。
バイナリを文字列(1-9,a-z.A-Z)に戻すのは、どうすればいいんでしょうか。
0078デフォルトの名無しさん
2008/02/29(金) 16:04:030079デフォルトの名無しさん
2008/02/29(金) 16:08:030080デフォルトの名無しさん
2008/02/29(金) 16:21:26趣味でLisp方言作ってたときは、operator new()を工夫しただけで全体の動作が3割速くなったし。
0081デフォルトの名無しさん
2008/02/29(金) 16:33:06boost::Poolのほうが断然速かった。
0082デフォルトの名無しさん
2008/02/29(金) 17:23:19メモリマネージャ次第じゃね?
Windowsに限ってもVCとBCBじゃnewでもメモリ確保の仕方違うし。
0083デフォルトの名無しさん
2008/02/29(金) 23:15:190084デフォルトの名無しさん
2008/03/01(土) 01:01:15vector<int> x={1,2,3};
vector<int> x(3,{1,2,3});
vector<int> x({1,2,3});
0085デフォルトの名無しさん
2008/03/01(土) 01:04:48static int const initial_x = {1,2,3};
vector<int> x(&initial_x[0], &initial_x[3]);
008685
2008/03/01(土) 01:05:36static int const initial_x[] = {1,2,3};
0087デフォルトの名無しさん
2008/03/01(土) 01:08:49すみません
0088デフォルトの名無しさん
2008/03/01(土) 01:16:29...
vector<int> v;
v += 3, 1, 4;
0089デフォルトの名無しさん
2008/03/01(土) 01:16:34009089
2008/03/01(土) 01:16:550091デフォルトの名無しさん
2008/03/01(土) 01:21:24x={1,2,3}の代入を可能にする関数です
0092デフォルトの名無しさん
2008/03/01(土) 01:23:37vectorやらmapやらを使いたいんですが、メモリ消費や処理速度的にどのようにしたらよいでしょうか?
ちなみに8000くらいあるほうは歯抜けで番号が記録されていてコール元から頻繁にアイテムを求めてきます。(ユニークキー)
4つくらいのアイテムの方は可変になってしまうのでそれぞれをvectorにしようかと思ったのですが、
消費メモリが大きくなりそうだったので悩んでいます。
0093デフォルトの名無しさん
2008/03/01(土) 01:23:45継承すれば
0094デフォルトの名無しさん
2008/03/01(土) 01:24:000095デフォルトの名無しさん
2008/03/01(土) 01:35:05「なりそう」で悩む前に素直に実装してみて、実際のメモリ消費量見てから考えるのがいいよ。
0096デフォルトの名無しさん
2008/03/01(土) 01:44:11で初期値0の3次配列を定義できるようにするには、どう書けばいいですか?
int 型限定でよいです 4次や5次もしたいです
0097デフォルトの名無しさん
2008/03/01(土) 01:45:17無理。C++0x を待て。
0098デフォルトの名無しさん
2008/03/01(土) 01:46:56ありがとうございます。
ちょっと試してみます。
業務で初めてC++使っているので勉強の毎日です。><
0099デフォルトの名無しさん
2008/03/01(土) 01:53:25コンストラクタ多重定義しとけば。
0100デフォルトの名無しさん
2008/03/01(土) 01:56:57どうすればいいですか?
class vec{
int x;
public:
vec(int n, ...){}
};
0101デフォルトの名無しさん
2008/03/01(土) 01:59:210102デフォルトの名無しさん
2008/03/01(土) 02:04:43いいと思いますがわかりません どう書けばいいですか
0103デフォルトの名無しさん
2008/03/01(土) 02:09:530104デフォルトの名無しさん
2008/03/01(土) 02:13:350105デフォルトの名無しさん
2008/03/01(土) 03:20:54printw("mojiretsu");
char buf[]="mojiretsu"
printw("%s",buf);
これで前者が表示され後者が表示されないのは何故なんでしょうか。
0106デフォルトの名無しさん
2008/03/01(土) 04:17:36環境くらい書いた方が。
どちらのコードも問題はないと思う。
refreshはしている?
前者が表示されているってことなので大丈夫だとは思うけど。
お試しコードみたいに短いのを書いていて、
printw→refreshのあと、すぐにendwinとかしてたら表示が見えていない可能性あり。
0107105
2008/03/01(土) 04:36:50int main()
{
initscr();
move(5,1);
printw("mojiretsu");
refresh();
char buf[]="mojiretsu";
move(8,1);
printw("%s",buf);
refresh();
getch();
getchで止まった時に上のmojiretsuは表示されているのに下はされないという状態です。
最初はcygwinでやろうかと頑張ったのですが、cursesライブラリがどうやってもリンクできずクノーピクスを使うに至っています。
0108デフォルトの名無しさん
2008/03/01(土) 05:28:37fedoracoreでは特に問題なく二つの行ともに表示された。
そのソースでcursesを使うプログラムとしては特に問題はないと思うけど、
くのーぴくすに入ってるライブラリのバグなのかな……
windows上でなら、cygwinのcursesでもいいと思うけど、
PDcursesを取ってきて自前でライブラリを自分の得意の環境でコンパイルする手もあるよ。
それならリンクのやりかたが分からないとかって問題もないと思う。
0109デフォルトの名無しさん
2008/03/01(土) 05:31:290110105
2008/03/01(土) 05:57:14どうやら環境が問題のようなので108さんが紹介してくださった方法等試してみます。
ありがとうございました。
0111デフォルトの名無しさん
2008/03/01(土) 06:18:590112デフォルトの名無しさん
2008/03/01(土) 09:03:27環境はWindowsXP VS2005EEです。
newしたポインタをdeleteすると、メモリの中身がfe ee fe eeとなります。
fe ee fe eeという値には何か意味があるのでしょうか?
0113デフォルトの名無しさん
2008/03/01(土) 10:36:51メモリ管理の都合やらデバッグの都合やらで値を書き換えているのかも
しれない。ともかく、delete後のメモリなんて参照しちゃダメ。ぜった
いダメ。
0114デフォルトの名無しさん
2008/03/01(土) 13:27:17もちろん、その値を何かに使ったりはしませんが
見るだけでも何かまずいことがおこるんですか?
0115デフォルトの名無しさん
2008/03/01(土) 14:00:51文字化けしてしまってまともに処理できないんですが、ecuに変換すればいいんでしょうか?
できたらやり方かサンプルソース公開してくれてるサイト教えて欲しいです
0116デフォルトの名無しさん
2008/03/01(土) 14:05:120117デフォルトの名無しさん
2008/03/01(土) 14:23:31GPLイヤンならIBMのICU
窓限定でいいのなら
ttp://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=613442&SiteID=7
0118デフォルトの名無しさん
2008/03/01(土) 14:42:32ありがとう。勘違いしてたEUC→SJISに変換だった
自力で関数作ってどうにかできました
0119デフォルトの名無しさん
2008/03/01(土) 14:43:11起こらないかもしれないが、起こるかもしれない
まだOSにメモリを返してなければ大丈夫かもしれないが、
返しちゃってた場合はアクセス違反で落ちるかも
処理系の実装と運次第
0120デフォルトの名無しさん
2008/03/01(土) 15:22:17動作未定義だから鼻から悪魔が出るかもしれんし、HDDが
フォーマットされるかもしれない。
0121デフォルトの名無しさん
2008/03/01(土) 16:32:42packじゃ出来なかったYO
0122デフォルトの名無しさん
2008/03/01(土) 16:47:33定数のアライメント に該当するページは見つかりませんでした。
0123デフォルトの名無しさん
2008/03/01(土) 17:32:52条件分岐をする際 if を良く使います。ifの中にifその中にif って普通でしょうか?
0124デフォルトの名無しさん
2008/03/01(土) 17:48:130125デフォルトの名無しさん
2008/03/01(土) 17:52:330126デフォルトの名無しさん
2008/03/01(土) 18:14:46void double(int a);
とかそんな感じ。今あるソースをみているんですが、コンパイルできなくて、
どうもそこでひっかかってるんじゃないかと。。できないとおもうんですが、
そう言いきってしまっていいですか?
0127デフォルトの名無しさん
2008/03/01(土) 18:25:210128デフォルトの名無しさん
2008/03/01(土) 18:32:13ありがとうございます。
0129デフォルトの名無しさん
2008/03/01(土) 18:49:02どうやら以下の条件を満たす識別子は使ってはいけないみたいですが
1 _で始まり、大文字が続く名前
2 __(アンダースコア2こ)を含む名前
3 グローバルスコープで _で始まる名前
ケースA int _Hoge;//ダメ(1に抵触)
ケースB int __hoge;//ダメ(2,3に抵触)
ケースC int hoge__hige;//ダメ(2に抵触)
ケースD int _hoge;//ダメ(3に抵触)
ケースE namespace foo{ _hoge;} //これはok?
ケースF class Hage{ int _hoge;} //これはok?
ケースEとFが合法なのかどうかわかりません
この辺を指摘(警告とか)してくれるコンパイラとかないんですかね
0130デフォルトの名無しさん
2008/03/01(土) 18:54:36しかし、初めてみたなそのルール。
_ __ が最初につく名前は駄目だというのは知ってたけど。
129 ルールでは E F は合法っぽいけどね自分の知っているルールでは非合法だ。
0131デフォルトの名無しさん
2008/03/01(土) 19:06:45_ に小文字が続く識別子に関しては、
グローバルネームスペースでのみしか禁止されていない。
でも、マクロでは禁止されてた気がする。
0132デフォルトの名無しさん
2008/03/01(土) 19:20:170133デフォルトの名無しさん
2008/03/01(土) 19:44:450134デフォルトの名無しさん
2008/03/01(土) 19:49:300135デフォルトの名無しさん
2008/03/01(土) 19:50:50正常系はどこから復帰になるのでしょうか?
0136デフォルトの名無しさん
2008/03/01(土) 19:52:050137デフォルトの名無しさん
2008/03/01(土) 19:53:51try{
A; //例外発生
B;
}catch( exception &e ){
C; //例外処理
}
D;
なら、正常は:A, B, D。
Aで例外時は:A, C, D。
もちろん、Cで例外が発生したり、throwしたりしたら別だけど。
0138デフォルトの名無しさん
2008/03/01(土) 19:58:13インストールしたのですが、corewin_express.vspropsのデータの修正が出来
なくて困っています。 どうしたら、修正する事が出来るようになるのでしょうか?
ちなみに、OSはvistです。
0139デフォルトの名無しさん
2008/03/01(土) 20:01:490140デフォルトの名無しさん
2008/03/01(土) 20:13:48ありがとうございます。
0141デフォルトの名無しさん
2008/03/01(土) 20:34:52ありがとうございます
tryブロックの範囲の選定も気をつけないといけないようですね
またまた質問なんですが
std::exceptionを継承してMyExceptionクラスを作ってそこに、例外発生時のログ取り機能を追加しました
不正な引数を取ってしまったときinvalid_argumentのような例外クラスを投げたいのですが
多重継承は色々ややこしいのでMyExceptionから派生させて相当の自作クラスを投げる
やっぱりMyExceptionとinvalid_argumentの多重継承を行う
どちらがよいのでしょうか?
0142デフォルトの名無しさん
2008/03/01(土) 20:39:400143デフォルトの名無しさん
2008/03/01(土) 20:41:52ExceptionLogクラスを作り、std::invalid_argumentと
派生した例外を投げる、みたいな。
0144デフォルトの名無しさん
2008/03/01(土) 22:02:07必要な標準例外クラスから派生したmy標準例外クラスを作って
そのクラスにログ取り機能クラスを保有させたほうがいい
ということですよね?
そのほうが系統だった例外クラスの構造になるのでしょうか?
0145138
2008/03/01(土) 22:11:41どこかの設定をいじると書き込み可能になったりとかないんでしょうか・・・。
0146デフォルトの名無しさん
2008/03/01(土) 22:12:050147デフォルトの名無しさん
2008/03/01(土) 22:23:16以降をどう実装するかは結構悩みどころだな。
個人的には throw をマクロ LOG_THROW みたいなので置き換えて、
その中で例外を投げる前にログを取るようにするのがいいと思う。
マクロは使わずに済むなら使わないのが一番いいんだけど、
デバッグ時に __FILE__, __LINE__ を利用したり、
文字列化演算子を使って移植性の高い方法でクラス名を表示したりできるから、
ログ取りには便利だと思う。
0148デフォルトの名無しさん
2008/03/01(土) 23:38:52ヘッダをインクルードせずに
class Cls* pCls;
と書くのはOKなんですけど
namespaceで括られた場合に
class Name::Cls* pCls;
と書くと'Namne' : 識別子がクラス名でも名前空間名でもありません。
とエラーが出ます。
インクルードせずに宣言する方法ってあります?
0149デフォルトの名無しさん
2008/03/01(土) 23:45:13こうかな
namespace Name{
class Cls;
}
Name::Cls *pCls;
0150デフォルトの名無しさん
2008/03/02(日) 00:06:390151デフォルトの名無しさん
2008/03/02(日) 00:12:35はどのようにかけばジツゲンできますでしょうか
0152デフォルトの名無しさん
2008/03/02(日) 00:14:580153デフォルトの名無しさん
2008/03/02(日) 00:26:06実装依存としか。
0154デフォルトの名無しさん
2008/03/02(日) 00:27:31要するにあれは構造体の初期化だよね。
コンストラクタが無ければクラスだろうが
あのタイプの初期化ができることを利用しているという。
0155デフォルトの名無しさん
2008/03/02(日) 00:44:180157デフォルトの名無しさん
2008/03/02(日) 01:11:03キー入力があればそれに対応した動きをさせたいのですがどうすれば良いでしょうか?
getch()だと入力待ちカーソルが邪魔になってしまい、困ってます
0158デフォルトの名無しさん
2008/03/02(日) 01:11:07いや、必要ではない。
0159デフォルトの名無しさん
2008/03/02(日) 01:13:39別スレで環境依存だといわれたろ?
なぜ環境を書かない
0160157
2008/03/02(日) 01:17:190161デフォルトの名無しさん
2008/03/02(日) 02:15:30実装方法ですか。
マクロを使うというとこういう感じになるのでしょうか?
ErrorLogger(char* filename, int linenumber, const char* errmsg)
のようなロガークラスを用意して、
コンストラクタ内でエラー内容を記録させてしまうようにしておいて
#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg);\
throw exeption_type\
というようなマクロを組めばよいのでしょうか?
というか、初めてマクロを組んだのであってるかどうかも判りませんorz
0162デフォルトの名無しさん
2008/03/02(日) 02:55:52自己レスながらマクロ修正してみた
#define THROW(msg , exception_type) ErrorLogger log(__FILE__ , __LINE__ , msg); \
exception_type e;\
throw e\
これでだいじょうぶですかね?
0163デフォルトの名無しさん
2008/03/02(日) 02:58:56ErrorLogger をクラスにする意味がわからない。関数でいいだろ。
例外オブジェクトにデフォルトコンストラクタしか使えないのは無駄な制限。
マクロ名は動作を表すように LOG_AND_THROW() とかにしたほうがよくない?
あと、最後の \ が余計。
0164デフォルトの名無しさん
2008/03/02(日) 03:00:120165デフォルトの名無しさん
2008/03/02(日) 03:03:37__FILE__, __LINE__ は inline 関数だとマズイだろ。
0166デフォルトの名無しさん
2008/03/02(日) 11:18:51do { \
:LogAndThrow(#type, __FILE__, __LINE__); \
throw type(); \
} while(false)
void LogAndThrow
0167デフォルトの名無しさん
2008/03/02(日) 11:19:130168デフォルトの名無しさん
2008/03/02(日) 11:26:43#define LOG_THROW(type) \
do { \
LogAndThrow(#type); \
throw type(); \
} while(false)
void LogAndThrow(const char* type_name)
{
ErrorLogger log;
// ここでログをとる
}
#else
#define LOG_THROW(type) \
do { \
LogAndThrow(#type, __FILE__, __LINE__); \
throw type(); \
} while(false)
void LogAndThrow(const char* type_name, const char* file_name, int line)
{
ErrorLogger log;
// ここでログをとる
}
#endif
こんな感じ。
実際には関数の実装は .cpp 側に書くわけだけど。
THROW という名前は何かと使われている恐れがあるので止めた方がいい。
LOG_THROW って名前も、実際には何か接頭辞を付けた方がいいと思う。
0169デフォルトの名無しさん
2008/03/02(日) 11:30:390170デフォルトの名無しさん
2008/03/02(日) 11:31:380171デフォルトの名無しさん
2008/03/02(日) 13:09:310172デフォルトの名無しさん
2008/03/02(日) 13:10:281行ずつ読み込みたければ getline が使える。
0173デフォルトの名無しさん
2008/03/02(日) 13:16:15int a;
ifs >> a;
みたいにやってるんですが、
> 読み込んだ内容が改行を含むかどうかチェック。
はどうやればいいですか
0174デフォルトの名無しさん
2008/03/02(日) 13:18:17それは無理じゃないかな。
0175デフォルトの名無しさん
2008/03/02(日) 13:20:54じゃあ、一行ずつ読みたいなら、getline()でやるしかないですか?
0176デフォルトの名無しさん
2008/03/02(日) 13:25:32子クラスのオブジェクトから、func(1)を実行すると、
func(const char* ch)を呼んでしまうのですが、
親クラスのfunc(int i)を呼ぶにはどうすればいいのでしょうか?
/*****こんな感じ*****/
class Parent{
public: void func(int i);
};
class Child : public Parent{
public: void func(const char* ch);
};
/*******************/
0177デフォルトの名無しさん
2008/03/02(日) 13:29:35そうなる。
getline した後 istringstream に渡してやるとか。
0178デフォルトの名無しさん
2008/03/02(日) 13:39:57Child ch;
ch.Parent::func(1);
0179デフォルトの名無しさん
2008/03/02(日) 13:47:37子クラス Child の func() によって親クラス Parent の func() が隠蔽されている。普通にオーバーロードしたいなら
class Child : public Parent {
public:
using Parent::func;
void func(const char* ch);
};
とすることで Parent での func() も見えるようになる。
0181デフォルトの名無しさん
2008/03/02(日) 14:27:55{
class Test
{
private:
std::ostringstream oss;
public :
~Test() {std::cout << oss.str();}
template <typename T>
friend Test &operator <<(Test &, T t);
};
}
template<typename T>
temp::Test &operator<< (temp::Test& test, T t)
{
test.oss << t;
return test;
}
を、temp::Test() << 2;
と使うと、「operator << が曖昧です」というコンパイルエラーになります。
名前空間を使わないとコンパイルできるのですが、何が問題なのでしょうか
Win2k、VC2005です
0182デフォルトの名無しさん
2008/03/02(日) 14:32:37temp::Test 内で宣言してる friend 関数は temp 名前空間内に入る。
だから、今は temp::operator<< と operator<< の2つがある状態。
0183デフォルトの名無しさん
2008/03/02(日) 14:37:08なるほど、ありがとうございました!
0184デフォルトの名無しさん
2008/03/02(日) 14:39:32temp 名前空間内に入れた方がいいと思う。
0185デフォルトの名無しさん
2008/03/02(日) 14:50:17goto文使うのって邪道かな?
いつも使ってるんだが。
0186デフォルトの名無しさん
2008/03/02(日) 14:50:540187デフォルトの名無しさん
2008/03/02(日) 15:17:28使いたい衝動に駆られたことはある。
0188デフォルトの名無しさん
2008/03/02(日) 15:19:020189デフォルトの名無しさん
2008/03/02(日) 15:23:442重ループから抜ける必要があること自体があまりないよね。
0190デフォルトの名無しさん
2008/03/02(日) 15:24:490191デフォルトの名無しさん
2008/03/02(日) 15:36:50NULLを入れると何が安全なのでしょうか?
0192デフォルトの名無しさん
2008/03/02(日) 15:38:350193デフォルトの名無しさん
2008/03/02(日) 15:39:180194デフォルトの名無しさん
2008/03/02(日) 15:40:13NULL じゃない場合は偶然アクセスできるかもしれないが、
メモリ領域を壊したり変な値を取得したりしてしまう。
0195デフォルトの名無しさん
2008/03/02(日) 15:41:420196デフォルトの名無しさん
2008/03/02(日) 15:49:10keybd_eventみたいに
プログラムからキーボードを押したことにするのは
gccだと何か方法がありますか・・・?
0197デフォルトの名無しさん
2008/03/02(日) 16:12:32keybd_event は Windows API。gcc はいろんな環境向けがあるコンパイラ。
例えば Windows 上で gcc を使っているなら keybd_event になるわけだしやりたいことをもっと正確に書こう。
0198デフォルトの名無しさん
2008/03/02(日) 17:26:18デフォルトコンストラクタっていうのは、
1.引数なしで呼ばれるコンストラクタ
2.なにも記述してなくてもデフォルトで呼ばれるコンストラクタ
のいったいどっちのことなのですか?
1と2の違いは、例えば、引数なしのコンストラクタを
自分で定義したときに、それをデフォルトコンストラクタと
いうかどうかという違いになると思うのですが、、、
1と2の説明ともWEB上で見かけますが、
どちらがより正確なのでしょうか?
0199デフォルトの名無しさん
2008/03/02(日) 17:29:15自分で定義しようがデフォルトコンストラクタ。
0200デフォルトの名無しさん
2008/03/02(日) 17:34:41引数なしで呼ばれるというよりは引数なしで呼ぶことが可能なと
いったほうがいいかもな。デフォルト引数もあるから。
class Widget {
public:
Widget(int i = 0) {}
};
//例えば
Widget w; //このsyntaxがデフォルトコンストラクタを要求する。
//Widget::Widget(0)が呼ばれる。
0203196
2008/03/02(日) 18:15:40すみませんでした
OSはDebianでPDFかパワポのようなものを
C言語で操作したいのです
具体的には下キーかEnterキーをC言語で押したことにして
スライドを進めることを行いたいです
0205デフォルトの名無しさん
2008/03/02(日) 21:56:29[email protected] までお願いします!
0206デフォルトの名無しさん
2008/03/02(日) 22:02:14C言語の個人講習をして欲しい訳だな?しかも無料で!
そんな奇特な人は少ないが候補として
C言語を覚えたてで自分のために他人に説明する人がいるが
そんな人を探すくらいなら良書を買ったほうがいくぶんかマシ
C言語をマスターしていながら教えてくれる人がいるとしたら
リタイヤした人くらいだろうな
0207デフォルトの名無しさん
2008/03/02(日) 22:08:50cin >> tmp;
としたとき、改行だけが押されたことを知るにはどうすればいいですか?
0208デフォルトの名無しさん
2008/03/02(日) 22:16:47フォーマット入力はデフォルトでは空白類記号は読み込まれない。
0209デフォルトの名無しさん
2008/03/02(日) 23:29:59分割コンパイルの仕方がわからないのですが
わかりやすく解説したページはないでしょうか?
0210デフォルトの名無しさん
2008/03/02(日) 23:33:01gcc -c hoge2.c
gcc -c hoge3.c
gcc -c hoge4.c
gcc -o hoge hoge1.o hoge2.o hoge3.o hoge4.o
0211デフォルトの名無しさん
2008/03/02(日) 23:55:20Makefileでググれば、良いと思う。
0212デフォルトの名無しさん
2008/03/03(月) 00:35:02{
class Cls;
}
0213デフォルトの名無しさん
2008/03/03(月) 00:48:480214デフォルトの名無しさん
2008/03/03(月) 00:52:06やっぱ標準であるmakeは一通りやっとくべきかな?
0215デフォルトの名無しさん
2008/03/03(月) 01:14:07ありがとうございます。一応自分で書いてみましたが、まだうまく動きません。
noskipwsをした後、おかしくなります。
どうかよろしくお願いします。
std::string filename = "default_file.txt";
while (1) {
std::string tmp;
cout << "Input file name : (hit return to default: " << filename << ") ";
cin >> std::noskipws >> tmp; // 下の(1)でY以外で答えたとき、ここで入力を受け付けてくれない。
if (tmp.empty()) {
// リターンキーだけが押された場合に、ここのIF文に入る
tmp = filename;
}
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cin >> std::skipws;
cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
cin >> ans; // (1)
if (ans == "Y") {
filename = tmp;
break;
}
}
0216デフォルトの名無しさん
2008/03/03(月) 02:22:41_CRT_DOUBLE_DECと_LDSUPPORTとこの2つに囲まれた構造体などは何のために用意してるんですか?
0217デフォルトの名無しさん
2008/03/03(月) 02:31:37改行は読み込まないからgetlineがいい。
std::string filename = "default_file.txt";
while (1) {
std::string tmp;
std::cout << "Input file name : (hit return to default: " << filename << ") ";
std::getline(std::cin, tmp);
if (tmp.empty()) {
tmp = filename;
}
std::cout << "filename : " << tmp << " OK (Y|N) ? ";
std::string ans;
std::getline(std::cin, ans);
if (ans == "Y") {
filename = tmp;
break;
}
}
0218デフォルトの名無しさん
2008/03/03(月) 02:43:47GUIでMFCやVCL、Qtさわるくらいはあるが、
ゲーム以外でフルスクラッチで書き上げる人たちって
どういう人?
0219デフォルトの名無しさん
2008/03/03(月) 02:44:130220デフォルトの名無しさん
2008/03/03(月) 03:24:20抽象化なんて考えてる暇あったら別の仕事が
飛んでくるもんね。
0221デフォルトの名無しさん
2008/03/03(月) 03:25:010222デフォルトの名無しさん
2008/03/03(月) 03:50:360223デフォルトの名無しさん
2008/03/03(月) 03:57:120224デフォルトの名無しさん
2008/03/03(月) 03:58:370225デフォルトの名無しさん
2008/03/03(月) 03:59:03matlabを使うとこも多いけど。
0226デフォルトの名無しさん
2008/03/03(月) 04:00:200227デフォルトの名無しさん
2008/03/03(月) 04:01:140228デフォルトの名無しさん
2008/03/03(月) 04:05:58COBOLとか使うと思うんだ、経験則
0229デフォルトの名無しさん
2008/03/03(月) 04:51:56色々分かってきたのですが、getlineとcinとの併用のときにどう書くべきかわかりません。
#include <iostream>
using namespace std;
int main()
{
int a;
string s;
cout << "int: ";
cin >> a;
// cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "string: ";
getline(cin, s);
cout << "int: ";
cin >> a;
return 0;
}
上記のソースでコメントアウトしている箇所がありますが、コメントアウトしたままだと、
真ん中のstringの入力が、1つめのintの入力の改行を拾ってしまうせいで、とばされてしまいます。
そこで質問なのですが、ここにコメントアウトされている行をいれるのは正しいですか?
0230デフォルトの名無しさん
2008/03/03(月) 05:00:45コメントアウトした行を入れてもだめ。
cin >> a; で改行文字がバッファに残るため、それが次のgetlineで
読み取られてしまう。Cで言う所のscanf()とgets()を混在させた問題と同じ。
解決策はgetline(cin, s); をもう一つ付け足して改行文字を読み飛ばす。
もしくはgetline()に統一する。
0231デフォルトの名無しさん
2008/03/03(月) 05:37:290232デフォルトの名無しさん
2008/03/03(月) 05:42:58金融っていってもmatlab使ってるようなところは
複雑な数値計算やってるだろうからちょっと特殊だな。
車でもカーナビのように限られたリソースでGUI作るようなところは
使ってるだろうが、間違っても制御には使わんと思うんだが。
0233デフォルトの名無しさん
2008/03/03(月) 05:53:38ありがとうございます。
getline()とcinを混在させないのが一番いいと。でも、cinが便利なので、
基本的にはcinを使いつつ、cinだと改行を扱うのが不便なのでその時だけgetline()を
使う、という風になりそうです。(自分としては)
すると、
(1)getline()する前にバッファに改行が残っているか確認して、残っていれば消す。
(2)cinした後には改行を消しておく。
のどっちかになると思うのですが、今回は(1)の方法が分からなかったので、(2)で実装しました。
どっちにしても、cin関係はなんか使いにくい感じ。
0234デフォルトの名無しさん
2008/03/03(月) 06:03:00mmap でファイルを仮想メモリにマッピングしたとき、OSがファイル上のデータを
ブロック転送する、アプリがその領域に書き込むとOSがファイルにそれを反映すると
書いてあった。
mmapでマップされた領域に上のあるアドレスに代入したとき、
OSは代入されたことを知っているの?
代入演算子で値を放り込むことと、read write のシステムコールを使うのは
根本的に違いますよね?
0235デフォルトの名無しさん
2008/03/03(月) 06:03:27GEANTは4からC++だよ!
0236デフォルトの名無しさん
2008/03/03(月) 06:09:53C/C++の問題じゃないと思う
多分OSがマッピングした領域は書き込み不可の属性が付いており
書き込んだらCPUに割り込みがかかってそれを利用してファイルに反映してるか
そんな所だと思う
0237デフォルトの名無しさん
2008/03/03(月) 06:14:44失礼しました。
環境に依存する内容は避けたほうがよいですね。
0238デフォルトの名無しさん
2008/03/03(月) 06:52:21環境依存OKのスレだから問題ないんだけどC/C++よりも
linuxの話になるね
ちなみにWindowsの仮想メモリとメモリマップトファイルも似たような
機構で実現している
0239デフォルトの名無しさん
2008/03/03(月) 07:59:34こんなのを考えてみたのですが、こういう2分木辞書ってなんて
名前になるんでしょうか?
サフィックスツリー?(これよりもっと複雑なようですが)
typedef std::map<char, Node> Tree;
//char に単語の1文字が入る
struct Node {
Node *pChild; //次の文字ノード
int No; //登録番号、兼、非末端(-1)
}
単語がab,ba,ac,abcとあるなら、子ノードの繋がりが下記のようになる。
先頭 <a,-1> <b,-1>
/ \ /
<b,0> <c,3> <a,1>
/
<c,3>
0240デフォルトの名無しさん
2008/03/03(月) 08:01:07struct Node {
Tree *pChild;
int No;
}
0241デフォルトの名無しさん
2008/03/03(月) 09:10:06って演算はいったい何を行っているのでしょうか?
最初オフセット値を得ているのかと思ったんですが、ためしに出力しても、1が出力
されるだけです。
元ソースでは、これを引数にしてメンバ変数のオフセット値を得ているようですが…
0242デフォルトの名無しさん
2008/03/03(月) 09:11:38メンバポインタでぐぐれ
0243デフォルトの名無しさん
2008/03/03(月) 09:27:45ありがとうございます。おかげで理解できました。
メンバポインタからオフセット値を得るには、
&( static_cast<A*>(0)->*memPtr )
で仕様上問題ないでしょうか?
0244デフォルトの名無しさん
2008/03/03(月) 09:35:430245デフォルトの名無しさん
2008/03/03(月) 11:13:30実際には動くだろうけど、仕様上は良くないような
ちゃんとインスタンスを用意した方がいいんじゃない
0246デフォルトの名無しさん
2008/03/03(月) 11:30:26オフセットは POD 型に対しての offsetof でしか取れないよ。
素直にメンバポインタ通して参照しちゃダメなの?
0247デフォルトの名無しさん
2008/03/03(月) 12:07:59仕様上正しい。
以下はJosuttis本の記述の要約。
istream& istream::ignore(streamsize count, int delim)
This form ignores up to count characters until delim is extracted and discarded.
(ストリームから改行まで抽出されて捨てられる。)
ちなみにg++ 4.0では無問題だった。
0248デフォルトの名無しさん
2008/03/03(月) 12:50:21トライ木じゃねえの
0249デフォルトの名無しさん
2008/03/03(月) 15:03:37割り込みなんかかからない。
ページング機構を備えるどんなプロセッサでも(俺の知る限り)
プロセッサ自体に、書き込まれたかどうかのフラグ
(いわゆる、dirty bit と呼ばれるもの)をセットする機構がある。
例えばx86ならば、ページテーブルの該当ページを示すエントリ内にこれがある。
で、ファイルから読み込んだときにOSがこのフラグをリセットしておき
OSは、ページが不要になった時やsync要求が来たときにこのフラグを確認して
書き戻すか破棄するかを決定する。
0250デフォルトの名無しさん
2008/03/03(月) 15:09:16それみたいですね。
すっきりしました、感謝。
0251デフォルトの名無しさん
2008/03/03(月) 16:48:21仕様上ダメですか…違う方法を模索することにします。
0252デフォルトの名無しさん
2008/03/03(月) 20:58:31すみません。
read write のようなシステムコールを実行するとOSデバイスドライバが
あとは処理してくれますよね?
代入演算子を使ってmmapした領域に書き込むとき、
そのフラグもセットするようにgccが実行ファイルを生成してくれるのでしょうか?
でもそれだと操作するアドレスがどこなのかをプログラムソースには書かなくても実行ファイルの中では
毎回見ているということでよろしいのでしょうか?
0253デフォルトの名無しさん
2008/03/03(月) 21:15:49特にコンパイラがすることはない。
0254デフォルトの名無しさん
2008/03/03(月) 21:47:570255デフォルトの名無しさん
2008/03/03(月) 21:51:42この複数からの同一ページへのアクセス時に
このフラグをうまく処理しなかったかららしい。
また、少し違うが
phenomのバグはキャッシュに対するdirty bitの反映が
高負荷時に滞るというものらしい。
0256デフォルトの名無しさん
2008/03/03(月) 22:03:13普通のページング可能なプロセッサは、
TLBと呼ばれる、ページテーブルのキャッシュを内部に持っている。
(x86以外では呼び方が違うかもしれない)
したがって、該当ページへの書き込みがある度に
毎回物理メモリ上のページテーブルに書き込んだりはしない。
(TLB内の情報と変更があった場合のみ、書き込む)
で、このTLBの内容を書き戻すときにまずキャッシュに書き込むわけだけど
これがうまくいかない場合がある、というのがphenomのバグらしい。
L1とL2の関係もあるとかどっかで読んだが詳しくは覚えてない。
0257デフォルトの名無しさん
2008/03/03(月) 22:37:050258デフォルトの名無しさん
2008/03/03(月) 22:41:160259デフォルトの名無しさん
2008/03/03(月) 22:41:58サンクスでちゅ。
0260デフォルトの名無しさん
2008/03/03(月) 22:51:12ありがとう。
CPUのやるとことまで押さえるのは難しいな。
もちろん仮想記憶で調べたりもしてるんですが、
なかなか自分の知りたいところのたどり着けない。
使い方はソースも含めて載ってたりするんだが。
0261デフォルトの名無しさん
2008/03/04(火) 00:31:23そういうCPUまわりのことを色々知りたいなら、
http://www.intel.co.jp/jp/download/index.htm
ここにあるIA-32なんとかなんとか下巻:システム・プログラミング・ガイドが参考になるかも
0262デフォルトの名無しさん
2008/03/04(火) 01:00:20stringクラスの関数でcompareというのがありますが、参考書によると
int compare(const string& str) const;
のように定義されているとあります。
この定義のconst string& の&ってどういう意味の&なんでしょうか?
最後のconstも、なぜここにconstがあるのか分かりません。
また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
0263デフォルトの名無しさん
2008/03/04(火) 01:15:09C++をもちっと勉強するといいよん。
&は参照。C++で導入された機能。参照についてはぐぐるよろし。
constは簡単に言うと「この関数はメンバ変数を変更しません」って宣言。
compare関数を呼ぶことで元の文字列を弄られちゃ話にならんだろ?
0264デフォルトの名無しさん
2008/03/04(火) 01:15:17入門書を読んだほうが早いと思う。
0265デフォルトの名無しさん
2008/03/04(火) 01:16:31string.hはCのヘッダーだからそりゃないだろうね。
0266デフォルトの名無しさん
2008/03/04(火) 01:19:45> ちょっとお聞きしたいのですが
> stringクラスの関数でcompareというのがありますが、参考書によると
>
> int compare(const string& str) const;
>
> のように定義されているとあります。
> この定義のconst string& の&ってどういう意味の&なんでしょうか?
> 最後のconstも、なぜここにconstがあるのか分かりません。
>
> また、上の定義が宣言されている場所を探してみたのですが、そもそもそれが見つかりません。string.hの中にはないのでしょうか??
> 質問ばかりで申し訳ないのですが、どなたか教えていただけると幸いです。
例えばcompare(const string str)だとすると引数にstd::string型のオブジェを入れると
std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
compare(const string& str) とする理由は引数に参照を取る事となり
コピーが働かないので無駄なメモリの消費がなくなる。
最後のconstはメンバ関数を呼び出したオブジェクトを修正できないようにすることです
0267252
2008/03/04(火) 01:45:56>std::stringのコピーコンストラクタがstrに働いて無駄なメモリ間のコピーが働く
>compare(const string& str) とする理由は引数に参照を取る事となり
>コピーが働かないので無駄なメモリの消費がなくなる。
なるほど!勉強になります。
あと、compareの宣言ですが、stringやcstringの中も見てみたのですが、みつからないんです。
0268デフォルトの名無しさん
2008/03/04(火) 01:54:48更にstringからインクルードしている先にあるんじゃないか?
例えばcygwinのgccだと/lib/gcc/i686-cygwin/3.4.4/include/c++/bits/basic_string.hにある。
0269デフォルトの名無しさん
2008/03/04(火) 02:19:09VSならソースコード中に#include <string>として
stringの所にカーソルあわせて右クリックでstringを開くを選択すれば
中身は見れるよ
0270デフォルトの名無しさん
2008/03/04(火) 04:14:400271デフォルトの名無しさん
2008/03/04(火) 04:15:020272デフォルトの名無しさん
2008/03/04(火) 04:30:570273デフォルトの名無しさん
2008/03/04(火) 08:34:190274デフォルトの名無しさん
2008/03/04(火) 08:37:410275デフォルトの名無しさん
2008/03/04(火) 08:46:550276デフォルトの名無しさん
2008/03/04(火) 09:40:08vector<int> num;
num[i*j]=a;
見たいなことしたいのですが
どうやるのでしょうか
0277デフォルトの名無しさん
2008/03/04(火) 09:48:22分岐なりする方法ってあるんでしょうか?
たとえば
template<class T>
class Hoge {
void Fuga(T &ref) {
//ここで渡された型を知りたい
};
}
C++だと無理?
0278デフォルトの名無しさん
2008/03/04(火) 10:01:47Aのポインタ*pがどちらの系統か判別する方法はありますか?
RTTIだとpの中身は分かるけどどういう系統までは追えないようですが良い方法はありますか?
0279デフォルトの名無しさん
2008/03/04(火) 10:04:160280デフォルトの名無しさん
2008/03/04(火) 10:07:13テンプレートの特殊化の話かな
0281デフォルトの名無しさん
2008/03/04(火) 10:08:10dynamic_cast
0282デフォルトの名無しさん
2008/03/04(火) 10:08:45デコレータパターンのConcreteComponentの型を判別する方法はないかな、ということです
0283デフォルトの名無しさん
2008/03/04(火) 10:10:30dynamic_castはダウンキャストに失敗すると0を返す。
0284デフォルトの名無しさん
2008/03/04(火) 10:14:25それ、パターンの使い方っていうか、設計ができてないんじゃないの?
http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87
0285デフォルトの名無しさん
2008/03/04(火) 10:19:42operator[](size_type)があるやん
0286デフォルトの名無しさん
2008/03/04(火) 10:20:04そうなんですけど
出来れば再帰的に
DecoratorA-DecoratorB-DecoratorC-ConcreteComponent
と順番に型情報をたどって行く必要ができてしまって・・・
最悪でも、根元の情報だけでも何とかならないかと
0287デフォルトの名無しさん
2008/03/04(火) 10:22:420288デフォルトの名無しさん
2008/03/04(火) 10:26:38なんですかそれ
0289デフォルトの名無しさん
2008/03/04(火) 10:31:02Decoratorの方はいくらでもいじれるのですが
ConcreateComponentの方はこちらの一存ではいじれないので識別子を埋め込むのは難しいかと
やはりcastの成否で判別していくのが無難か・・・
castに失敗するとNULLが返る?
bad_castがthrowされるのは参照のキャストの時だっけ・・・
0290デフォルトの名無しさん
2008/03/04(火) 10:38:55普通にnum[i * j] = aとすればいいということ。勿論、num.size()がi * jより大きいことが条件になるけど。
0291デフォルトの名無しさん
2008/03/04(火) 10:40:16テンプレートで先ず全ての型で失敗するコードを書いておいて、
特別な型だけ特殊化しておくとか。
0292デフォルトの名無しさん
2008/03/04(火) 10:56:49キャストとくにdynamic_castを使用する度に
クラス設計に問題があったんじゃないかと不安な気分になるのは自分だけか?
0293デフォルトの名無しさん
2008/03/04(火) 10:58:430294デフォルトの名無しさん
2008/03/04(火) 11:03:25(´・ω・`)
0295デフォルトの名無しさん
2008/03/04(火) 11:32:260296デフォルトの名無しさん
2008/03/04(火) 11:36:08すみません、説明がたりませんでした。
templateでtemplate型を受け取った時にも対応できる方法が
あるかが知りたかったんです。
例えばtempate関数でstd::vector<何でもOK>は受け取れるが
std::list<>はだめな場合など。
こういう場合、特殊化だとvector<int>、vector<float>〜という具合に
OKにしたい型を全て記述しないとダメなんじゃないですか?
0297291
2008/03/04(火) 11:45:15「特定の(少数の)型」だけ有効にしたいのかと思ったから特殊化を提示した。
そうでないんだったらtypeidで動的に型を調べることになるのかな?
templateスレ辺りの方が喰い付きがいいかも知らん。
0298デフォルトの名無しさん
2008/03/04(火) 11:52:37こんなの?
#include <vector>
template<typename T> void foo(T const& x);
template<typename E> void foo(std::vector<E> const& x) {}
int main()
{
std::vector<int> vi;
std::vector<float> vf;
foo(vi);
foo(vf);
return 0;
}
0299デフォルトの名無しさん
2008/03/04(火) 12:00:490300デフォルトの名無しさん
2008/03/04(火) 12:07:36mplを駆使すればできるだろ
0301267
2008/03/04(火) 13:06:56Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。
0302267
2008/03/04(火) 13:07:28Eclipse CDT 使ってるんですが同じようなことができました。
ありがとうございました。
0303デフォルトの名無しさん
2008/03/04(火) 13:18:460304デフォルトの名無しさん
2008/03/04(火) 13:21:32野郎近接ロボとなおんロボはOK。
0305デフォルトの名無しさん
2008/03/04(火) 13:34:47>template<typename E> void foo(std::vector<E> const& x) {}
あーこういう書き方でいいんですね。助かりました。
いつかさらに複雑な選別が必要になったら、mplやconcept checkも
調べてみます。どうもでした。
0306デフォルトの名無しさん
2008/03/04(火) 14:49:30void qsort(void* base, size_t n, size_t size, int(*fnc)(const void*, const void*));
という定義がありますが、const void* ってなんなのでしょうか?
voidってのは「空の型」ってことだと思うのですが、空のものをconst(固定)するってどういうことなのでしょうか?
何もないのだから固定しようがないと思うのですが・・
また、引数がvoid*になっているのもよく分かりません。void(何もない)のポインタを引数にするってどういうことなのでしょうか??
0307デフォルトの名無しさん
2008/03/04(火) 14:51:160308デフォルトの名無しさん
2008/03/04(火) 14:53:05Cでは「何かへのポインタ」をあらわずときに void* を使う。qsort()で
はソート対象の型が決まっていないので、何でも受け取れるように
void*を使っている。
const void* ってのは、「そのポインタが指している先は書き換えしま
せんよ」という意味。
0309デフォルトの名無しさん
2008/03/04(火) 14:56:06void型ポインタってのは「そのアドレスに何が入っているかを指定しないポインタ」という意味。
受け取った関数内で適切な型にキャストしてやって使うことになる。
qsortはintでもcharでも構造体でもソートできる汎用的な関数にするためそういう形になってる。
constってのは「そのポインタの場所に入ってる変数を変更してはいけません」って意味。
constつけた関数内でうっかり書き換えるとコンパイルエラーになるから、ミスを予防できる。
0310デフォルトの名無しさん
2008/03/04(火) 16:30:54bcc32 test.cpp
でコンパイルすると★の行で
エラー2423 存在しないテンプレート'show_array'の明示的な特化またはインスタンス化
*** 2 errors in Compail ***
が表示されなす。
存在しないって言われても直前に・・・・
テンプレートの定義が間違ってるのでしょうか?
0311310
2008/03/04(火) 16:31:43--- test.cpp ---
#include <iostream.h>
/*-------------------------------------------------------*/
/* 配列の表示テンプレート */
/*-------------------------------------------------------*/
template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
{
T2 index;
if( count == 0 ){ /* 表示しない ? (YES) */
return( 0 ); /* 非表示 */
}
/* 配列を表示 */
for( index = 0; index < count; index++ ){
cout << array[index] << ' ';
}
return( 1 ); /* 表示 */
}
0312310
2008/03/04(火) 16:32:59template int show_array( float *array, unsigned char count ); ★
/*-------------------------------------------------------*/
/* main関数 */
/*-------------------------------------------------------*/
void main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };
/* int型の配列 */
show_array( pages, 5 );
cout << '\n';
/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';
return;
}
0313デフォルトの名無しさん
2008/03/04(火) 16:53:01unsigned char KeyTable[11] = "0123456789";
char *id = "0";
int i;
for(i = 0; i < 8; i++)
String[i] ^= *id;
このプログラムの動作がよくわかりません
たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので
String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。
どうして99になるのでしょうか?
0314デフォルトの名無しさん
2008/03/04(火) 16:53:46>*** 2 errors in Compail ***
恥ずかしいからちゃんとコピペしようね。
0315デフォルトの名無しさん
2008/03/04(火) 16:56:05Cではハット(^)はビット毎の排他論理和演算子なので、83^48はちゃんと99になる。
0316デフォルトの名無しさん
2008/03/04(火) 16:58:0983^48
=1010011^0110000
=1100011
=99
0317デフォルトの名無しさん
2008/03/04(火) 17:01:12なるほど
ここしばらく他の言語しかやってなかったのですっかり忘れてました
すばやい回答ありがとうございます
0318デフォルトの名無しさん
2008/03/04(火) 17:01:17こんな感じじゃないかなたぶん
return( 1 ); /* 表示 */
}; <----- ここテンプレートの最後にセミコロンが必要
template char show_array..... → template<> char show_array.....
template int show_array..... → template<> int show_array.....
show_array( pages, 5 ); → show_array<char>( pages, 5 );
show_array( price, 3 ) → show_array<int>( price, 3 )
show_array( price, 0 ) → show_array<int>( price, 0 )
0319デフォルトの名無しさん
2008/03/04(火) 17:02:30そのテンプレート関数の目的が意味不明なんだが、取り敢えず「所謂」全角空白が見えるエディタを使おう。
0320デフォルトの名無しさん
2008/03/04(火) 17:05:25多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して勝手に修正してみた。
--
#include <iostream>
using namespace std;
template<class T> bool show_array(T array[], int N)
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
int main( void )
{
int pages[] = { 100, 200, 300, 400, 500 };
float price[] = { 10.05, 20.10, 30.15 };
/* int型の配列 */
show_array( pages, 5 );
cout << '\n';
/* float型の配列 */
cout << show_array( price, 3 ) << endl;
cout << show_array( price, 0 ) << endl;
cout << '\n';
return 0;
}
0321320
2008/03/04(火) 17:09:21ついでなんで、そのバージョンも貼っておこう。
--
template<class T, size_t N> bool show_array(T (& array)[N])
{
for (unsigned ic = 0; ic < N; ++ic) {
cout << array[ic] << ' ';
}
return N != 0;
}
--
これだと、show_array(price)で使える。でも戻り値の意味がないw
0322306
2008/03/04(火) 17:33:00レスくださった方々、わかりやすい説明ありがとうございましたm(_ _)m
0323310
2008/03/04(火) 17:34:28314 >> あ、aが余分でした (;ω;`)
318 >>
テンプレートの最後にセミコロン付加
templateの後に<>付加
show_arrayの後に<型>付加
をやってみましたが、エラー内容は変わりませんでした・・
319 >>
練習用に色々やってみた感じで作りました。
エディタはさくらエディタ使ってます。
320 >>
> 多分、テンプレート関数では配列の一部を出力してその有無を返すだけと判断して
させたい動作はその通りです。
320さんのソース読んできます。
0324310
2008/03/04(火) 17:36:390325デフォルトの名無しさん
2008/03/04(火) 17:47:39全角空白を見えるようにしろって言うのは、>320に全角空白が入っているからなんだが。
# 勿論、後から追加したであろう★印のところ以外にね。
0326325
2008/03/04(火) 17:48:150327310
2008/03/04(火) 17:57:39>>311-312
のソースの★の記述を削除し、
>>318さんの変更を加えたら、コンパイル通りました〜。
ソースの書き方がコテコテ素人なんで、
>>320さんのソース見て勉強します。
>>318さんの追加が無い場合はエラーが出るのですが、内容読んでも
show_array<char>( pages, 5 ); の<char>が何で必要か
わからんです、ヒントお願いできないでしょうか。
エラー内容は↓です。
エラー2285 show_array<T,T1,t2>(int *, int)に一致するものが見当たらない
0328デフォルトの名無しさん
2008/03/04(火) 18:00:40template<class T, class T1, class T2> T show_array( T1 *array, T2 count )
というテンプレートがあるので、show_array( pages, 5 ); は
show_array<char, int*, int> かもしれんし
show_array<int, int*, int> かもしれんし
show_array<long, int*, int> かもしれんし
T1とT2は引数見ればわかるけどTの型は決定できないので
0329310
2008/03/04(火) 18:03:50!? お
template<class T, class T1, class T2>と
T show_array( T1 *array, T2 count )
の間に全角空白が!!!!!!
コピペした後に入れちゃったみたいです。('A`)
ご指摘ありがとうございます。
0330310
2008/03/04(火) 18:13:08なるほど!
分かりやすいご説明ありがとうございます。
試しに
<char>show_array( pages, 5 );
してみたら、構文エラーでしまた。
show_array<char>( pages, 5 );
って書き方なんですね。
ご回答下さった皆様、ありがとうございました(。。)゛
0331デフォルトの名無しさん
2008/03/04(火) 19:37:21{ if (state&(badbit|failbit)) return 0; return (void *) this; }
のopratorはここではどういう意味で使われているのでしょうか?
この位置にあるのを初めて見まして、よくわからないんです。
0332デフォルトの名無しさん
2008/03/04(火) 19:41:08型変換の演算子。
0333デフォルトの名無しさん
2008/03/04(火) 20:00:13例えば
class Foo {
public:
operator int() { return 42; }
};
main() {
Foo foo;
int x = foo; // <-- ここ
cout << x;
}
というふうに、クラスを別の型に変換するときに呼ばれる。
0334デフォルトの名無しさん
2008/03/04(火) 21:54:20if (str)のように条件式で用いるために用意されている。
なぜoperator boolでないかというと、boolでは整数へ変換できてしまうから。
int x = str;のような想定外の変換を行わせないためである。
0335デフォルトの名無しさん
2008/03/04(火) 23:21:45[C#]
List<int[]> foo;
の書式が、C++.Netではどう直せばいいのかわかりません。
intの配列ではテンプレートを適応できないのでしょうか?
0336デフォルトの名無しさん
2008/03/04(火) 23:24:05List<array<int>^>^ foo;
0337デフォルトの名無しさん
2008/03/04(火) 23:24:19これ?
0338335
2008/03/04(火) 23:25:39ありがとうございます。私の4時間が返ってきた。
これで作業が続きます。
0340デフォルトの名無しさん
2008/03/04(火) 23:56:55笑ってるように見えて何かムズムズするw
0341デフォルトの名無しさん
2008/03/05(水) 00:36:110342デフォルトの名無しさん
2008/03/05(水) 00:37:461. コンパイル時に
2. リンク時に
3. 実行時に
a. 自動的に(コンパイラとかが自動変数の使用状況などを見て)
b. 固定的に
多分、どれかに当てはまると思うんですが。
0343デフォルトの名無しさん
2008/03/05(水) 00:40:000344デフォルトの名無しさん
2008/03/05(水) 00:48:12環境依存。
Windowsはリンク時に実行ファイルのヘッダにサイズが書かれるんだった
かな。子スレッドのスタックは実行時。
0345デフォルトの名無しさん
2008/03/05(水) 00:48:49Windowsではexeにスタックサイズが書かれるので、リンク時以前
組み込みなんかでリセットベクタもコンパイルする必要がある場合は、コンパイル時
と思う。
0346デフォルトの名無しさん
2008/03/05(水) 01:31:09どこまで上ってきてるか心配だったから。
あのときはコンパイル時だな。
0347デフォルトの名無しさん
2008/03/05(水) 01:34:24リンク時にスタックポインタの開始アドレスとかグローバル変数の確保領域アドレスとかの設定ファイルを使うから。
0348デフォルトの名無しさん
2008/03/05(水) 01:52:00そうだな。何とか形式のファイルのサマリーを
出してくれるツールがあったな。
0349デフォルトの名無しさん
2008/03/05(水) 02:57:13public かの差しかないって言うけど、本当?
class だと継承やらの情報を管理するための暗黙のメンバが最初にくっつかない?
class C {int a;}
struct S{int a;}
C c;
S s;
を実行してデバッガで c と s の中身見てみるとメンバ違わない?
0350デフォルトの名無しさん
2008/03/05(水) 03:10:19構造体の拡張だろう
0351デフォルトの名無しさん
2008/03/05(水) 03:14:17コンパイラレベルでは全く同一ですと書いてある。
0352デフォルトの名無しさん
2008/03/05(水) 03:16:08structも継承できるのに何でそこが違うとおもったんだ?
0353デフォルトの名無しさん
2008/03/05(水) 03:16:270354デフォルトの名無しさん
2008/03/05(水) 03:17:46大抵の実装では、仮想関数を持つクラス・構造体は、
仮想関数呼出のためのテーブル (vtbl)へのポインタを隠し持っているが、
これもクラス・構造体どちらでも同じ。
規格でも構造体とクラスは完全に同一視され、
構造体について何か独立した規定は存在しない。
全てクラスとしてまとめられている。
0355デフォルトの名無しさん
2008/03/05(水) 04:19:310356デフォルトの名無しさん
2008/03/05(水) 07:17:09仮想関数を持たないクラス・構造体は
vtbl へのポインタを持っていない。
0357デフォルトの名無しさん
2008/03/05(水) 07:38:19H8やSHでは#pragma stacksize XXX というのがあるので、
スタックサイズはコンパイル時、スタックアドレスはリンク時ということかな。
0358デフォルトの名無しさん
2008/03/05(水) 08:45:07として m_b に代入しようとして
void hoge(void *s){
int offset = sizeof(int);
unsgiend char * p = (unsgiend char *)s;
int * m_b = p[offset];
*m_b = 1234
}
みたいなコードが書いてあると位置がずれて死ぬ訳か
0359デフォルトの名無しさん
2008/03/05(水) 09:23:24いいえ、環境依存です。
0360デフォルトの名無しさん
2008/03/05(水) 09:30:41int a;
int b;
void clear() {
ZeroMemory(this, sizeof(*this));
};
}
こういうのもマズイ?
0361デフォルトの名無しさん
2008/03/05(水) 09:32:20いつか POD の規則から外れる変更を加えたときに忘れずに修正する覚悟が必要。
0362デフォルトの名無しさん
2008/03/05(水) 09:42:56上のほうで出てた、仮想関数を持つクラスを継承して
vtbl へのポインタを持ってる場合は>360で問題無しですか?
0363デフォルトの名無しさん
2008/03/05(水) 10:42:35仮想関数を持ったものも POD から外れる。
0364デフォルトの名無しさん
2008/03/05(水) 10:45:50HEWでそれやってたな。てかconfig入力画面でメモリセクションのカスタマイズできた。
0365デフォルトの名無しさん
2008/03/05(水) 10:47:58std::vector m_v;
} s;
で
ZeroMemory(&s, sizeof(S));
ってやって死んだ事がある
0366デフォルトの名無しさん
2008/03/05(水) 11:46:02class PPP{
public:
union{
struct{
int n;
struct{
enum Hoge hoge;
int x;
}aa[32][32];
LPCWSTR name[256];
}a;
struct{
int p;
char i;
float y;
Hoge *o;
}b;
struct{}c;
}data;
};
こんな共用体がクラス変数になってる時に
PPP ppp;
とするとそこでプログラムが例外も吐かずに落ちてしまいます。
しかし、PPPを他のクラスのクラス変数として宣言しておけば落ちません。
class Hoka{
PPP p;
};
分かる人おながいしまつ・・・。
0367デフォルトの名無しさん
2008/03/05(水) 11:47:000368デフォルトの名無しさん
2008/03/05(水) 12:21:180369デフォルトの名無しさん
2008/03/05(水) 14:39:59vector<int> num;
num[i*j]=a;
でnum.size()が不定のとき(i*jより小さいときもある)場合
先にnum[i*j]を確保して、num[i*j]=aを入れればよいのでしょうか
確保の仕方を教えてください
0370デフォルトの名無しさん
2008/03/05(水) 14:46:08num.resize(100) とかで好きなサイズに変更する
0371デフォルトの名無しさん
2008/03/05(水) 15:20:530372デフォルトの名無しさん
2008/03/05(水) 15:28:070373デフォルトの名無しさん
2008/03/05(水) 15:58:15可能だが resize(i*j) ではサイズが足りないと思うぞ
0374デフォルトの名無しさん
2008/03/05(水) 16:14:350375デフォルトの名無しさん
2008/03/05(水) 16:53:00せめてもうちょっと具体的に言わないとどうにもならないと思うよ
0376デフォルトの名無しさん
2008/03/05(水) 16:57:59JavaのLinkedHashMapみたいなやつ?
STLにそれはないから、mapとlistを組み合わせるのかな・・
0377デフォルトの名無しさん
2008/03/05(水) 18:39:44if( (int)texture.size() < ( temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1] ) )
texture.resize(temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]);
texture[temp[0] + temp[1]*maxValue[0] + temp[2]*maxValue[0]*maxValue[1]] = num;
こうしたら、格納されません。
現在の3次元配列の幅よりも、大きいのが出てきたら値を取り直して、入るべき所にぶち込む
ってことをやりたいだけなのですが
0378デフォルトの名無しさん
2008/03/05(水) 18:58:40サイズが 10 だったら、有効なインデックスは 0〜9 だ
サイズが temp[0] + .... *maxValue[1] だったら、
有効なインデックスは 0 〜 temp[0] + .... *maxValue[1] - 1 までだ
0379デフォルトの名無しさん
2008/03/05(水) 19:07:20ありがとうございます、それが抜けていました
ただ 0 0 0 があったときに格納できないというエラーが出てきて
後少しなのに
0380デフォルトの名無しさん
2008/03/05(水) 19:20:23throw new A;
のようにnewで生成して投げるのと
throw A();
と投げるのはどっちが良いのでしょうか?
0381デフォルトの名無しさん
2008/03/05(水) 19:25:040382デフォルトの名無しさん
2008/03/05(水) 19:25:10ソースがどこだったか覚えてないのですが、そのときの記憶があり3次元以上はなるたけ使わないようにしてる原状です
0383デフォルトの名無しさん
2008/03/05(水) 19:27:310384デフォルトの名無しさん
2008/03/05(水) 19:37:17Javaと一緒にすんな
0385デフォルトの名無しさん
2008/03/05(水) 19:57:35その配列が表すモノが本質的に3次元以上のモノなら3次元配列で良いけど
構造体やクラス等で表すべきモノを配列にしてしまうのは避けるべき
0386デフォルトの名無しさん
2008/03/05(水) 20:47:36まず必要になることはないと思うけどね。
0387デフォルトの名無しさん
2008/03/05(水) 20:52:58newするとどこかでdeleteせんといかんよ。
0388デフォルトの名無しさん
2008/03/05(水) 21:29:17new はしない。
0389デフォルトの名無しさん
2008/03/05(水) 22:04:19を定義して、
SAFE_DELETE(ptr);
とすると「構文エラー : ';' が〜の前にありません」のエラーになってしまいます。
delete ptr;なら普通にコンパイルできるのですが、
どこが悪いのでしょうか。
0390デフォルトの名無しさん
2008/03/05(水) 22:06:01VC2005、WinXP64で以下のようなプログラムを作ったのですが、うまく動いてくれません。
DWORD WINAPI ThreadPrc(LPVOID lpParameter)
{
while (!ThreadTerminated){
//要求があるまで待機
WaitForSingleObject(hEventHandle,INFINITE);
if (ThreadTerminated) break;
//共有オブジェクトの排他アクセス
WaitForSingleObject(hMutexHandle,INFINITE);
//適当に処理
ReleaseMutex(hMutexHandle);
//処理が終わると相手に通知
//ここがおかしい
SetEvent(hDoneEventHandle);
}
return 0;
}
普段はDelphiでやってますが、64ビットでビルドする必要があったので、Delphiで作ったものをC++に移植しました。
プロセス間通信でいろいろやってるわけなのですが、同じところでいつもタイムアウトしてしまいます。
もちろんINFINITEにするとそのまま固まってしまいます。
32ビットプロセスでSetEventして、64ビットプロセスでWaitForするのは成功するのですが、その逆がうまくいかないのです。
VC固有の問題なのか、64ビットの問題なのか、関係ありそうなのは調べましたが全く原因が分かりません。
この部分さえうまくいけば完成なのですが・・・。
どなたか分かる方いましたらアドバイスお願いします(o*。_。)o
0391デフォルトの名無しさん
2008/03/05(水) 22:09:05SAFE_DELETE(ptr);
は
{delete (p); (p)=NULL;};
に展開される。
} の後に ; があるのがポイント。
これで何か起こってんじゃね?
0392デフォルトの名無しさん
2008/03/05(水) 22:12:09問題の起こる最小のコードをplz!
0393デフォルトの名無しさん
2008/03/05(水) 22:17:54うちの環境だと普通に動いてしまったよー。
周りを疑ってみるべき
0394331
2008/03/05(水) 22:18:39分かりやすい説明ありがとうございましたm(_ _)m
0395389
2008/03/05(水) 22:20:21-----SystemMacro.h----------
#ifndef SYSTEMMACRO_H
#define SYSTEMMACRO_H
#define SAFE_DELETE(p) {delete (p); (p)=NULL;}
#endif
------List.h----------
#include <windows.h>
#include "../system/SystemMacro.h"
template <class T> class List {
public:
virtual ~List(){
if(!_tempFlg) {
WORD i;
for(i=0; i<_ct; i++) {
delete _arr[i];
}
}
SAFE_DELETE(_arr); //←ここをdelete _arr;にするとコンパイル通る
}
};
※Listのメンバ変数は省略してます。
0396デフォルトの名無しさん
2008/03/05(水) 22:21:28void SafeDelete(T *& p) { delete p; p = NULL; }
0397デフォルトの名無しさん
2008/03/05(水) 22:23:00_arrの型は?
0398デフォルトの名無しさん
2008/03/05(水) 22:24:06つけるなら後ろに。
0399389
2008/03/05(水) 22:25:12それが悪いのでしょうか。
0400デフォルトの名無しさん
2008/03/05(水) 22:29:21関数の説明で、この関数は
flags((flags() & ~mask) | (flag & mask));
のような処理をしている、と書いてあったのですが、
flags((flags() & ~mask) | flag);
でも同じではないでしょうか?
なぜわざわざ(flag & mask)と書いてあるのでしょうか。
0401389
2008/03/05(水) 22:37:45ありがとうございます。
>>397
template <class T>のT**型です。
>>398
とあるJavaのソースでクラスのメンバ変数の先頭に_をつけてたのを真似してます。
C言語はまだ初めたばかりな上、グーグルと2chで全て学んだので、
基礎がなってないのですが、先頭_はなんで不味いんでしょうか。
上のListクラスの機能は、たぶんstd::vectorとほぼ同じです。
標準ライブラリというのを知らなくて、作ってしまいました。
0402デフォルトの名無しさん
2008/03/05(水) 22:38:32> 同じではないでしょうか?
いや、同じじゃないから。
0403デフォルトの名無しさん
2008/03/05(水) 22:43:14>>401
「_」始まりの単語はシステム予約される可能性があるから。
0404デフォルトの名無しさん
2008/03/05(水) 22:45:19でいいのかな。
0406デフォルトの名無しさん
2008/03/05(水) 23:06:52fmtflags setf(ios::hex, ios::basefield);
で、
ios::hex が 0x0800
ios::bsaefield が0x0e00
とすると、
ios::hex & ios::basefield
で、
0000 1000 0000 0000
と
0000 1110 0000 0000
の論理積なので、
0000 1000 0000 0000
で、結局
ios::hex(0000 1000 0000 0000)
そのものと変わらないじゃんと思ったのですが、どこかで勘違いしているのでしょうか。
0407デフォルトの名無しさん
2008/03/05(水) 23:08:47> 論理積なので、
いや、違うから。
0408デフォルトの名無しさん
2008/03/05(水) 23:14:46SAFE_DELETE(_arr);
を
{delete (_arr); (_arr)=NULL;};
に置き換えてコンパイルが通るかどうか。
あと、コンパイラは何?
0409デフォルトの名無しさん
2008/03/05(水) 23:16:54flgは立てたいビット、maskはflgの属するフィールドを指定するが、
flgがmaskのフィールドに属さなかった場合に、
余計なフィールドのビットを立ててしまうのを防ぐため。
0410デフォルトの名無しさん
2008/03/05(水) 23:24:26このように宣言しましたが、
char a[] = "1234";
char b[] = "4567";
char* abc[2][255]={
a,
b
};
*abc[1]で値が取り出せません。
こういうやり方は無理でしょうか?
0411デフォルトの名無しさん
2008/03/05(水) 23:30:23abcはポインタが二次元に並んだ配列だが、それでいいのか?
やりたいのは、ポインタの一次元配列のように見えるが。
つまり、こう。
char* abc[2] = {a,b};
そうしたら、
*abc[0]は'1'
になる。
0412デフォルトの名無しさん
2008/03/05(水) 23:47:55>あ、_arrがテンプレートの、T**型なのですが
>395を見ると delete _arr[i]; とあるから、_attrは new[] で確保したアドレスを前提としていないか?
それなら delete ではなく delete[] とすべき。
コンパイルエラーの件とは無関係だが。
0413デフォルトの名無しさん
2008/03/05(水) 23:55:17おっしゃるとおり二次元配列のポインタですね。
全然気がつきませんでした。
ありがとうございます。
0414デフォルトの名無しさん
2008/03/06(木) 00:16:05とりあえず本論とは別だが、その手のマクロは
if(flag)
SAFE_DELETE(p);
else
do_something();
みたいにするとエラーになるのでしばしば
#define SAFE_DELETE(p) do { delete (p); (p) = NULL; } while(0)
のように定義されることが多い。
0415デフォルトの名無しさん
2008/03/06(木) 00:23:46#define SAFE_DELETE(p) ((void)(delete (p), (p) = NULL))
でもいいと思うけどね。
まあ、式中に書けるのが嫌だというのであれば、
do-while 使ったのでもいい。
0416デフォルトの名無しさん
2008/03/06(木) 00:50:58ああ10年前に学ぶのを止めてしまったんだなと分かる
自分自身がSAFE_DELETEされてしまったんだ
0417デフォルトの名無しさん
2008/03/06(木) 03:06:00ちなみにトレンドは?
0418デフォルトの名無しさん
2008/03/06(木) 03:32:560419デフォルトの名無しさん
2008/03/06(木) 03:44:420420417
2008/03/06(木) 04:10:270421デフォルトの名無しさん
2008/03/06(木) 06:12:17たとえばファイルに書き出すために複数のバッファを用意したとして
もう書き込みが発生しないだろうと予測されたら書き出してメモリを解放するというやつです
0422デフォルトの名無しさん
2008/03/06(木) 06:15:54それ以外は書き込みがないだろうと思って解放したいのですが、タイミングをいつにするか具体的に計算する方法は
ありますか
0423デフォルトの名無しさん
2008/03/06(木) 06:49:420424デフォルトの名無しさん
2008/03/06(木) 07:02:10たとえばバッファは10個なら、10個前が一番古いですが、11個目の後
1〜10番が続くかもしれないじゃないですか
もっとも利用されなかっただけではなく、バッファサイズを増したほうがいいかも調べたいんです
0425デフォルトの名無しさん
2008/03/06(木) 09:24:11とかでいいんじゃない?
0426デフォルトの名無しさん
2008/03/06(木) 14:33:28それって大問題なんじゃなかったっけ?
0427デフォルトの名無しさん
2008/03/06(木) 16:20:10int* A_PTR = new int[5];
として確保した領域の、たとえば、A_PTR[3]のような、
途中の領域だけ解放(delete)することは可能でしょうか?
0428デフォルトの名無しさん
2008/03/06(木) 16:45:33無理
0429427
2008/03/06(木) 16:59:15やはり無理なんですね。
別のポインタに入れてからdeleteなど、
いろいろ実験していて気が狂いそうでしたので
大変すっきりしました。
れす、ありがとうございました。
0430デフォルトの名無しさん
2008/03/06(木) 17:32:23unsigned char uc[sizeof(cstr)] = (unsigned char)(LPCSTR)cstr;
コンパイル通りません。要は、↓を動的にしたいです。
unsigned char uc[10]="0123456789";
よろしくおねがいします
0431デフォルトの名無しさん
2008/03/06(木) 17:39:19ヒープで取って良いのなら、
char* uc = new char[文字列の長さ+1];
strcpy(uc, コピーしたい文字列へのポインタ)
でもしてください。
0432デフォルトの名無しさん
2008/03/06(木) 17:41:23unsigned char* uc = (unsigned char*)(LPCSTR)cstr;
0433430
2008/03/06(木) 18:04:24やっぱり無理ですか。。
>>432
uc[0],uc[1]みたいに、ポインタではなく配列としてアクセスしたいんですよね。。
なんか根本的に駄目なソース書いてる気がしてきたので、発想を変えてみます。
どうもありがとうございました。
0434デフォルトの名無しさん
2008/03/06(木) 18:06:060435デフォルトの名無しさん
2008/03/06(木) 18:06:340436デフォルトの名無しさん
2008/03/06(木) 18:09:14添え字演算子はポインタでも使えるけど。
0437デフォルトの名無しさん
2008/03/06(木) 18:29:09E1[E2] は *((E1) + (E2)) の syntax sugar だ。
uc[0] → *(uc + 0)
uc[1] → *(uc + 1)
0438デフォルトの名無しさん
2008/03/06(木) 20:40:20uc[1] → *(uc + 1) → *(1 + uc) → 1[uc]
0439デフォルトの名無しさん
2008/03/06(木) 20:43:02さんざん既出
"0123456789ABCDEF"[i]
を大昔はやっていた。
0440デフォルトの名無しさん
2008/03/06(木) 20:44:58i["0123456789ABCDEF"] ならともかく。
0441デフォルトの名無しさん
2008/03/06(木) 20:48:59おんなじやんけ
0442デフォルトの名無しさん
2008/03/06(木) 20:49:410443389
2008/03/06(木) 22:58:20>>408
通ります。Visual Studio.NET 2003を使ってます。
>>412
_arr = new T*[_max];という感じで確保してます。
delete[] は使ったことないですが、やってみます。
>>414
それは思いつきませんでした。
>>415
その書き方は初めて見ました。
>>416
10年前というか、C言語始めてまだ1ヶ月半なんですが。。。
0444デフォルトの名無しさん
2008/03/06(木) 23:05:220445デフォルトの名無しさん
2008/03/06(木) 23:10:44書き換えようとしたんですが
全く何も代わりません
#include <stdio.h>
int main(void){
FILE *fp;
char cIn;
char cOut = 'X';
int cnt;
fp = fopen("test.txt", "rb+");
fread(&cIn, 1, 1, fp);
printf("%c\n", cIn);
cnt = fwrite(&cOut, 1, 1, fp);
printf("%d\n", cnt);
fclose(fp);
return 0;
}
<test.txtの内容↓>
ABCDEFG
<出力結果↓>
A
1
これはどう理解したらいいんでしょうか?
BCとVCで試してみました
0446デフォルトの名無しさん
2008/03/06(木) 23:20:59fwriteして次のBをXで上書きして、(test.txtの中身変化)
要素数の1が戻ってきて表示(出力2行目)
何が不思議なんだ?
0447デフォルトの名無しさん
2008/03/06(木) 23:21:31readからwriteに切り替える時、もしくはwriteからreadに切り替える時は
必ず間にfseek()を挟む事。
0448デフォルトの名無しさん
2008/03/06(木) 23:39:54コンパイル君のぼやき
「freadとfwriteに&使わないで下さいよ。あと、辞書ぐらい買ってくださいよ。
何でもかんでも私に聞かないで下さいよ。なんでもかんでもプリントにしないでくさいよ。
宣言するんだったらまともに宣言してくださいよ。main関数の引数ぐらい使ってくださいよ」
0449デフォルトの名無しさん
2008/03/06(木) 23:43:29分割コンパイルについていまいちよくわかりません。
main.ccp
ClassA.ccp
Def.h
ClassA.h
resource.h
と5つあって、
main.ccpではDef.hがインクルード、
ClassA.hでもDef.hがインクルードされ、Classの宣言と、インラインでのメンバの定義、
ClassA.ccpではClassA.hとDef.hがインクルードされています。
また、Def.hではresource.hがインクルードされているほか、#ifdnefを使って重複しないようにしています。
ビルドをすると、C2143構文エラーなど、ものすごい沢山のエラーが出てきてしまいます。
このようにヘッダとソースファイルを分割する場合、どのようにインクルード等をすればよいのでしょうか。
0450デフォルトの名無しさん
2008/03/06(木) 23:48:48とりあえずこのDef.hはインクルードしなくていいいような・・・
0451デフォルトの名無しさん
2008/03/06(木) 23:49:48その文面だけを見る限り、ファイル分割のしかたもインクルードの仕方
も問題ないよ。エラーが出るのはファイルの内容がどこか間違っている
とか、何かの定義が足りないとか。
0452デフォルトの名無しさん
2008/03/06(木) 23:51:02個人的には↓の方法でできるような気がするのですが、できるかどうか心配なので教えてください
char *func(){
char *buf = new char[1024];
//bufにデータを入れる
return buf;
}
int main(){
char *ptr = func()
//ptrであんな処理やこんな処理
delete [] ptr;
}
0453デフォルトの名無しさん
2008/03/06(木) 23:51:160454デフォルトの名無しさん
2008/03/06(木) 23:55:48解放する方法を間違えたり、しなかったりする
クラスならデストラクタがする
0455デフォルトの名無しさん
2008/03/06(木) 23:56:25どうでも話にはなるが、
メイン関数のファンクがカマを彫られたって泣いてるが、
わかっててほられたのかほられてないのか気になる。
0456デフォルトの名無しさん
2008/03/06(木) 23:56:44それで特に問題はないが、
void func(std::vector<char>& buf) {
buf.resize(1024);
// buf にデータを入れる
}
int main() {
std::vector<char> buf;
func(buf);
// buf であんな処理やこんな処理
}
とやった方が面倒がないし例外とかあっても確実にメモリが解放されるから安全で便利。
0457デフォルトの名無しさん
2008/03/06(木) 23:57:05それ・・・なんの冗談?
0458デフォルトの名無しさん
2008/03/06(木) 23:57:480459デフォルトの名無しさん
2008/03/06(木) 23:58:43buf.reserve(1024)
&buf[0]
でも良い
0460デフォルトの名無しさん
2008/03/06(木) 23:59:30length 変わらないじゃんか。
0461デフォルトの名無しさん
2008/03/06(木) 23:59:47あってますか…
1行目初っぱなから
Naive_Grid_Class.cpp(4): error C2143: 構文エラー : ';' が 'NaiveGridCtrl::ChkhCtrl' の前にありません。
などと出てきて(下のようなコード)
#include "DefHeader.h"
#include "Naive_Grid_Class.h"
BOOL NaiveGridCtrl::ChkhCtrl(){
return (BOOL)hCtrl;
}
もう何が何だかさっぱりなんですが…
0462デフォルトの名無しさん
2008/03/07(金) 00:01:05class ABC {
char *buf;
ABC(){確保}
~ABC(){解放}
};
main(){
ABC x;
}
とやれば簡単って事
0463デフォルトの名無しさん
2008/03/07(金) 00:03:170464デフォルトの名無しさん
2008/03/07(金) 00:04:43class NaiveGridCtrl の最後の ; を忘れているんじゃないか?
0465デフォルトの名無しさん
2008/03/07(金) 00:08:16前から思ってたんだけど、
メモリの解放以外にデストラクタって使い道あるの?
0466デフォルトの名無しさん
2008/03/07(金) 00:09:250467デフォルトの名無しさん
2008/03/07(金) 00:11:430468デフォルトの名無しさん
2008/03/07(金) 00:22:56C++で住所録を作っているのですがソートができません。
構造体に名前、住所、年齢、電話番号・・・など
項目ごとに入れるところまではできたのですが、
名前、住所、年齢、電話番号・・・など項目ごとに分かれているので、
名前なら名前だけがソートされてしまい他のはそのまま。
名前をソートしたらその順序で他の項目が付いてくるようにするには、
どうしたらいいのでしょうか。
0469デフォルトの名無しさん
2008/03/07(金) 00:24:16まず、どうやってソートしてるんだ?
そこのプログラムみせてみ
0470デフォルトの名無しさん
2008/03/07(金) 00:24:24え?なんでそうなるのさ?
ソートした順に構造体を並べ替えればいいだけじゃんw
0471デフォルトの名無しさん
2008/03/07(金) 00:25:220472デフォルトの名無しさん
2008/03/07(金) 00:26:520473デフォルトの名無しさん
2008/03/07(金) 00:27:370474デフォルトの名無しさん
2008/03/07(金) 00:33:47while(i <= 10){
fout[i].open("dat$i.dat");
fout[i] << i <<'\n';
i++;
}
てな感じでデータファイルを10個作りたいのですが、
""の内のiは変数と見てくれなくて困ってます。
何かいい方法ありませんか??
0475デフォルトの名無しさん
2008/03/07(金) 00:36:20あたりまえだろw
こうすればいい
char filename[100];
sprintf( filename, "dat$%d.dat", i );
fout[i].open( filename );
0476デフォルトの名無しさん
2008/03/07(金) 00:36:500477デフォルトの名無しさん
2008/03/07(金) 00:37:46#include <iostream>
#include <string>
#include <set>
using namespace std;
class memberlist{
public:
string name;
string tel;
string adress;
memberlist(string a, string b,string c){
name=a; tel=b; adress=c;}
bool operator<(const memberlist& a)const{
if(name<a.name)return 1;return 0;}
};
main(){
set<memberlist> x;
x.insert(memberlist("山田太一","030000000","東京都"));
x.insert(memberlist("明石家明","077777777","沖縄県"));
x.insert(memberlist("佐藤一郎","051111111","大阪府"));
set<memberlist>::iterator p;
for(p = x.begin(); p!=x.end(); p++){
cout<< p->name <<" "<< p->tel <<" "<< p->adress <<endl;
}}
0478デフォルトの名無しさん
2008/03/07(金) 00:41:10どちらにしろ管理クラスに入れとけば
デストラクタが勝手に delete してくれるだろ。
0479445
2008/03/07(金) 01:06:00>>447
それそれ。それです。
fseek(fp, 0, SEEK_CUR);
が必要みたいなんですが
これがわからない。
カレントポジションから0バイト進めるのは
何もしないのと同じなのではないのでしょうか?
OSのAPIなどの場合
readしてそのままwriteする事でファイル位置が
自然に進む事が多い気がする訳ですが
この仕様はよくわからないです
これはC(ライブラリ)の明示された仕様なのでしょうか?
0480445
2008/03/07(金) 01:12:39fwriteで1バイト書き込めたはずなのに
その1バイトはどこへ行ってしまったんでしょうか・・・
0481デフォルトの名無しさん
2008/03/07(金) 01:13:18APIと違って、バッファリングするのが前提だからfseek()などでバッファを同期を取ることに決められている。
0482デフォルトの名無しさん
2008/03/07(金) 01:16:55Naive_Grid_Class.h の最後に ; が足りないとか、
BOOLの定義がどこにもないとか。
0483デフォルトの名無しさん
2008/03/07(金) 01:17:54同期を取っても書き換わらない?
0485445
2008/03/07(金) 01:49:51なるほど。仕様ですか・・・
多分FILE構造体の内容とかから必然なのかな?
直感的には把握が難しかったです
>>483
fseekはさめば書き換わりますが、
はさんでなくてもfwriteの結果が1というのが
納得いかず・・・
試しにfread/fwrite/fseek(fp, 0, SEEK_END)
というのもやってはみたけれどやはり書き換わらず・・・
0486デフォルトの名無しさん
2008/03/07(金) 02:03:11fin.open("aaa...
fout.open("bbb...
function(....);
}
function(.....){
fout << "thanks" <<'\n';
}
のようにmain関数でデータファイルを開いて、
function関数の中に開いたファイル持ってきて、書き込みたいんですけど。
どうするのがいいのでしょうか?
0487デフォルトの名無しさん
2008/03/07(金) 02:11:36ストリームを引数にとればいいんじゃねーの?
0488デフォルトの名無しさん
2008/03/07(金) 02:23:55ストリームを大域変数にすればいいんじゃねーの?
0489デフォルトの名無しさん
2008/03/07(金) 02:48:25ストリームを参照で取る
constで取ったらあかんよ
0490デフォルトの名無しさん
2008/03/07(金) 03:42:36(ofstream& fout[], ifstream& fin[])
ってことですか??
参照型の配列は許されないとかなるんですが。。。
困り果てた。
0491デフォルトの名無しさん
2008/03/07(金) 03:47:08何故いきなり配列に? >486では一言もそんな話が……
0492デフォルトの名無しさん
2008/03/07(金) 03:50:43常考参照のポインタだろ
*&fout
0493デフォルトの名無しさん
2008/03/07(金) 04:00:42これで通る
#include <fstream>
void sub(std::fstream* f)
{
f[0];
}
int main()
{
std::fstream f[10];
sub(f);
}
0494デフォルトの名無しさん
2008/03/07(金) 04:17:54すいません、素人目からはさっぱりなんですが。。。
fout,fin???どうなったのでしょうか??
0495デフォルトの名無しさん
2008/03/07(金) 04:25:17配列だったらリファレンスではなくポインタで渡せばいいだけの話。
0496デフォルトの名無しさん
2008/03/07(金) 04:28:51あんた>486=>490? >489に答えがあるのに、それをどう曲解したのか>490になって、
>491の質問を無視して>494みたいなこと言われても最早誰も対処できないぞ。
0497デフォルトの名無しさん
2008/03/07(金) 07:12:46漢字読むのが面倒臭いからって、上の行↑を「もらったをすっばすのがわからんね」と読んで
「うーん、さっぱりわかりません」とか一人で勝手に困ってるようなものだろ。
0498デフォルトの名無しさん
2008/03/07(金) 08:49:37現在ゲームを作ってまして、敵の動きを実装するのですが、
C言語で関数のポインタを保持し、タイミングが来たら 保持していた関数を呼び出すのと
C++で、基本のクラスを用意し、それから派生してポリモーフィズムで呼び出すのと どちらが良いでしょうか
開発規模は個人なのでそれほど多くならないです、ですがまだ、仕様が決まってないのでなんともいえないのです。
なにが不満かというと
Cだと 関数だらけになってしまう
C++だと 開発に時間がかかったら保守が大変そうなことです
0499デフォルトの名無しさん
2008/03/07(金) 09:01:360500デフォルトの名無しさん
2008/03/07(金) 09:03:210501デフォルトの名無しさん
2008/03/07(金) 10:54:41Commandパターン or Callback by template
0502デフォルトの名無しさん
2008/03/07(金) 11:07:04namespace myname{
hogehogehoooge;
}; //←
namespace mymyname{
hagehagehaaage;
} //←
コンパイル自体はどっちでも通ったのですが、どっちが本来の文法的に正しいのでしょうか。
0503デフォルトの名無しさん
2008/03/07(金) 11:25:440504デフォルトの名無しさん
2008/03/07(金) 11:43:35なるほど、納得しました。
0505デフォルトの名無しさん
2008/03/07(金) 13:33:34double x=1.0; int y = 10000;
int z = y * x;
この場合z=yって成り立つのでしょうか?
0506デフォルトの名無しさん
2008/03/07(金) 13:36:02成り立つよ
浮動小数点の誤差がどうとか言う観点だよな?
0507デフォルトの名無しさん
2008/03/07(金) 13:57:06ありがとうございました
0508デフォルトの名無しさん
2008/03/07(金) 14:07:28それらのポインタをdynamic_castしたい場合、親クラスに
virtualな関数を無理やり入れておくしかないのでしょうか?
0509デフォルトの名無しさん
2008/03/07(金) 14:09:33dynamic_castの意味分かって言ってる?
0510デフォルトの名無しさん
2008/03/07(金) 14:10:34手っ取り早く済ませたいならそうだね。
手間がかかってもいいなら、たぶん dynamic_cast の必要性を
見直したほうがいいんだろうけど。
0511デフォルトの名無しさん
2008/03/07(金) 15:23:55関数テーブルで引数が違う関数をまとめる場合に、
引数型を全部派生にして親クラスのポインタを
受け取るようにしとくと、キャストミスも無くて便利かなと
思ったんですが。
多分設計見直したほうが良いパターンなんでしょうね。
0512デフォルトの名無しさん
2008/03/07(金) 15:49:54このパターンで自分もはまったな
引数に<list>をとるか可変長引数とか配列とか色々やり用はあるな
0513デフォルトの名無しさん
2008/03/07(金) 16:23:58つテンプレートの特殊化
0514468
2008/03/07(金) 16:44:37すみません。ド素人のプログラマですが、質問です。
なるべく上のファイルを利用してファイルソートを行いたいのですが、
これからどうすればいいのかわからず手が止まっております。
ソースではなく文章でいいので答えていただけますか?
filesortがファイルをソートする関数部分です。
つまりVectorとsortを使って何とかしたいわけですが、
この書き方であると要素ごとでしかソートできません。
もちろん要素だけのソートはできました。
なんかあとちょっと弄ればできそうな気がするんですが、
僕の脳ではどうしようもありません。
どなたかご指導ください。
私的にはsetさえ使えば100人力じゃぁみたいな感じになるので、
setを使いたくありません。その点も含めてよろしくお願いいたします。
あとこのソース見て「ここをこうした方がいいのでは?」と思う人はご指摘ください。
よろしくお願いいたします。勉強になります。
開発環境:CentOS 5
コンパイラ:g++
コンパイルエラー:無し
0515デフォルトの名無しさん
2008/03/07(金) 16:49:15クラスの公開メンバ関数のアドレスを外部に教えてあげて、
そこから直接クラスの関数にアクセスすることってできますか?
具体的に言うと、Wik32APIでの、ウィンドウプロシージャに、クラスのメンバ関数を使いたいのですが…
0516デフォルトの名無しさん
2008/03/07(金) 17:06:28filesortの中身をちらっと読んだだけ。
・カンマ区切りを取り出す常套手段は
1:スペース記号、タブ記号をすべて別の文字列で一旦置換
2:カンマ記号をすべてスペースに置換
3:stringstreamに流し込んで >> を使って読み込む
4:1:で入れ替えてたのを元にもどす
です。こうした方がいいです。
・名前を入れ替えたいだけじゃないんですよね?
今のあなたのファイルは「名前データを取り出して、それをベクターに格納。そのベクターをソート」
している「だけ」ですよ。
あきらめてsetを使うか、set相当のものを自分で書くか、
そうでなければsort相当のものを自分で書いてください。
・fin>>temp
この部分は、もし入力ファイル中にスペースがあると困るのではないかと。
nameに「Richard Feynman」って入ったら、Richardで切れますけど、いいんですか?
一行取り出したいならgetlineを使いましょう。
0517デフォルトの名無しさん
2008/03/07(金) 17:07:45普通の関数は仮想にするなよ
つEffective C++ 第38項
ダウンキャストはやめよう
つEffective C++ 第39項
というかEffective C++を購入して一読する事を強く勧める。
0518デフォルトの名無しさん
2008/03/07(金) 17:12:53メンバ関数の実装は、クラスのポインタを引き渡していることが多い。
(thisポインタが引数としてわたっている)。
よって、関数ポインタを取ってきたところで、メンバ以外からマトモに使えません。
0519デフォルトの名無しさん
2008/03/07(金) 17:31:14511じゃないが参考までにどういう形で実装するのか教えてくれませんか?
テンプレートを使った経験がないのでどういう風に使うのか見当がつきません
0520452
2008/03/07(金) 18:21:57亀ですがレスthx
Winsockと同時に使うから文字列をstd::stringじゃなくてchar*で使ってたんですが、
例外処理さえつければ>>452のコードで大丈夫ですよね
あと、>>455のカマを掘られたって言うのがどうことかちょっと気になるんですが・・・
0521デフォルトの名無しさん
2008/03/07(金) 19:07:56やっぱ駄目なんですか。
共通プロシージャ用意してmapしたのを検索する方向で考えてみます。
0522デフォルトの名無しさん
2008/03/07(金) 19:31:55http://web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/
0523デフォルトの名無しさん
2008/03/07(金) 19:42:31staticなメンバ関数なら問題ない
0524デフォルトの名無しさん
2008/03/07(金) 19:48:12staticメンバ関数はstaticなメンバしかイジれないじゃん。
0525デフォルトの名無しさん
2008/03/07(金) 20:31:15そうだよ。単にクラスという名前空間に閉じ込め、
protected/privateにできるという程度の意味しかない。
どっかからインスタンスへのポインタを得て、非静的なメンバ関数を呼ぶのが
静的メンバ関数のウィンドウプロシージャの仕事。
>>522
0526デフォルトの名無しさん
2008/03/07(金) 20:34:15オブジェクトを作らずに呼び出そうとしてるんだからメンバなんていじる必要ない気が
0527デフォルトの名無しさん
2008/03/07(金) 20:42:15サンクという手法でウィンドウプロシージャを書き換えて、ウィンドウハンドルの代わりにthisをスタックに積んでメンバ関数にジャンプさせれば?
0528デフォルトの名無しさん
2008/03/07(金) 20:47:140529デフォルトの名無しさん
2008/03/07(金) 21:35:51どうやってやるのさ
0530デフォルトの名無しさん
2008/03/07(金) 21:38:29あ、オブジェクトではなく、クラスにひも付けすればよいのですね。
有り難うございました!
0531デフォルトの名無しさん
2008/03/08(土) 01:39:03関数の引数が異なることになってしまいました
こういう場合はどうしたらよいでしょうかorz
0532デフォルトの名無しさん
2008/03/08(土) 01:51:310533デフォルトの名無しさん
2008/03/08(土) 01:52:10全クラスに引数増やすとか(そしてデフォルト引数をつけておくとか)、
その派生クラスだけ別のメンバ関数で余分の引数を設定しておくとか、
引数の集合を何かクラスにまとめて、上位の概念に置き換えることで引数を共通にするとか。
0534デフォルトの名無しさん
2008/03/08(土) 01:53:540535デフォルトの名無しさん
2008/03/08(土) 01:56:461. きっとやりたいことが間違ってるから考え直す。
2. boost::any とか boost::variant とかでぶちかます。
まぁもう少しやりたいことを詳細に説明するべきだろうね。
0536531
2008/03/08(土) 02:14:02今回のプロセスだけ表示させたいパラメータの数が増えてしまいました
監視プロセスが複数同時に走っていて、そのうち3つを同時に表示するようにするため
表示対象をユーザーが切り替えられるようにするため
表示クラスに監視クラスのポインタをつかって保持させています
監視クラスに
GetData(int OutputA, int dataB,int dataC)
という関数をよういしていたのですが
最新の計器が監視できるパラメータが増えてしまって・・・orz
0537デフォルトの名無しさん
2008/03/08(土) 02:22:28そのシグニチャでGetだと言うのなら、参照かポインタ渡しじゃないの?
まあそれはいいとして。
パラメータの種類を指定して、データを1種類だけGetする関数を作ったら?
0538デフォルトの名無しさん
2008/03/08(土) 02:38:59int main(void)
{
fstream fio[10];
char filename[10];
int m, steps;
steps = 7;
fio[0].open("calc0.dat");
m = 1;
while(m <= steps){
sprintf(filename, "calc%d.dat", m);
fio[m].open(filename, ios::in | ios::out);
m++;
}
m = 1;
while(m <= steps){
calc(m, fio);
m++;
}
return 0;
}
0539デフォルトの名無しさん
2008/03/08(土) 02:43:13{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?
0540デフォルトの名無しさん
2008/03/08(土) 02:43:52{
int i, j;
int a, d[100];
j = 1;
while(j <= 3){
fio[m-1] >> a;
d[j] = a;
j++;
}
j = 1;
while(j <= 3){
fio[m] << d[j] <<' '<< j <<'\n';
j++;
}
}
calc0.datの中身
5
16
77
基本的にすべてのデータファイルが同じになるようにプログラムを書いたのですが。
うまくいかないです。どこか間違っていますか?
0541デフォルトの名無しさん
2008/03/08(土) 09:11:50>どこか間違っていますか?
あんたの説明。
結果がどうなったのか、どうなるつもりだったのか(これは全てcalc0.datと同じになるということか)、
実行した環境と処理系は何か、位のことは書いても罰は当たらんよ。
0542511
2008/03/08(土) 11:33:07まとめた関数テーブルって、どう実装するのが
良いでしょうか?
>512のようにlistや可変長引数だと、個数が
違う場合には有効ですが、構造体を渡す場合には
無理があると思えます。
(構造体の要素をPOD型に分解してlist化するとか?)
>513で書かれた特殊化では、どう実装するのかが
全く閃きませんorz
キャストを使う以外で違った構造体やクラスを
スムーズに(できれば低コストで)渡す方法ってあるのでしょうか?
0543デフォルトの名無しさん
2008/03/08(土) 11:41:16昨日の続きと言われても状況を把握するために過去に遡って読むのは面倒なので目的を詳しく。
まぁ、よくあるGUIライブラリの実装などでは構造体を丸ごと渡すのではなく汎用ポインタを渡す形が多いけどね。
0544511
2008/03/08(土) 11:42:33class ArgBase { //引数親
public:
virtual ~ArgBase(){};
}
class Arg1 : public ArgBase {
public:
int arg;
}
//以下必要なだけArgBaseを引き継いだ構造体を作る
//関数テーブル
typedef bool(*pFunc)(ArgBase*) FUNCPTR;
FUNCPTR fuctable[10];
fnctable[0] = Func1;
//関数例
bool Func1(ArgBase *pArg) {
//これがArg1が必要な関数なら
Arg1 *ptr = dynamic_cast<Arg1*>(pArg);
if(ptr == NULL) return FALSE;
//処理
return TRUE;
}
0545デフォルトの名無しさん
2008/03/08(土) 15:49:36教えてください。昔
float a;
a=1.0
と1ではなく1.0にしなさいと教わったのですが、その詳しい理由を
忘れました。
どうしてなのでしょうか?
0546デフォルトの名無しさん
2008/03/08(土) 15:56:191.0も中途半端だな。1.0fと書け。
1と書くとそれはint型になる。
1.0と書くとdouble型になる。
1.0fと書くとfloat型になる。
intやdoubleからfloatへの変換は警告が出る可能性があるので、
代入先と同じ型にしておけということ。生成される機械語は同じだろうけど。
0547デフォルトの名無しさん
2008/03/08(土) 16:23:22やはり間違わないように気をつけてvoid*で渡してキャストするのが
常套手段なんですかね。
0548デフォルトの名無しさん
2008/03/08(土) 16:25:25typedef bool(*pFunc)(ArgBase*) FUNCPTR;
じゃなくて
typedef bool(*FUNCPTR)(ArgBase*);
でしたorz
0549デフォルトの名無しさん
2008/03/08(土) 17:09:29dynamic_castって良い機能ですねぇ
基本クラスに無意味に仮想関数を突っ込まなくても、派生クラスの機能が使えるなんて嬉しすぎる
0550デフォルトの名無しさん
2008/03/08(土) 17:12:080551デフォルトの名無しさん
2008/03/08(土) 17:12:190552デフォルトの名無しさん
2008/03/08(土) 17:12:460553デフォルトの名無しさん
2008/03/08(土) 17:24:08Window wnd("sample",MAIN_WINDOW);
vBox box(MAIN_WINODW);
Label sample_label("sample",MAIN_WINDOW);
Button ok_button("OK",MAIN_WINDOW);
CREATE(MAIN_WINDOW);
ok_button.clicked(func);
box << sample_label << ok_button;
wnd << box;
CONSTRUCT(MAIN_WINDOW);
みたいにmain関数の中で書いたらコンパイルが通るようになるやつ。
今マニピュレーター実装中。
0554デフォルトの名無しさん
2008/03/08(土) 17:26:540555デフォルトの名無しさん
2008/03/08(土) 17:49:29ごめんねごめんね(*‘ω‘ *)
void __fastcall TForm1::N1Click(TObject *Sender) {
TMenuItem* menu = dynamic_cast<TMenuItem*>(Sender);
switch(menu->GroupIndex) {
case 1:
switch(static_cast<TSortDirection>(menu->Tag)) {
case sortLarge:
break;
case sortSmall:
break;
}
break;
case 2:
switch(static_cast<TLogOutputMode>(menu->Tag)) {
case logList:
break;
case logSingleLine:
break;
}
break;
}
UpdateTitle();
}
0556デフォルトの名無しさん
2008/03/08(土) 18:05:190557デフォルトの名無しさん
2008/03/08(土) 18:05:550558デフォルトの名無しさん
2008/03/08(土) 18:08:500559デフォルトの名無しさん
2008/03/08(土) 18:17:40C++で「なんでもいいからキーを押すと続行」
というのはどうすれば実現できるのでしょうか?
文字列や数字を読み取らせる方法は知ってますし、
ググればいくらでも出てくるのですが、
「いったん入力待ちしていかなるキーを押しても構わず実行」
という風にしたいのです。
もちろん数字読み取らせて適当な数+ENTERという風に組めば
手間が増えるだけで大体同じことはできるます。
しかし、あるデータの異常値の原因を調べるため、
異常のたびにそのデータをグラフにして打ち出させたいんですが
たぶん三万回くらいやらなきゃならないんです・・・
0560デフォルトの名無しさん
2008/03/08(土) 18:25:400561デフォルトの名無しさん
2008/03/08(土) 18:26:010562デフォルトの名無しさん
2008/03/08(土) 18:27:060563560
2008/03/08(土) 18:33:280564デフォルトの名無しさん
2008/03/08(土) 18:33:56ありがとうございます。
元がfloatなのにいらないお節介しなくても良さそうなのに。
0565デフォルトの名無しさん
2008/03/08(土) 18:34:050566デフォルトの名無しさん
2008/03/08(土) 18:46:22要素の属性の取り方だけ分かりません。
どのように取り出せばいいのでしょうか?
0567デフォルトの名無しさん
2008/03/08(土) 18:48:37>元がfloatなのにいらないお節介しなくても良さそうなのに。
大きな勘違いをしている悪寒。
0568デフォルトの名無しさん
2008/03/08(土) 19:22:34昨日小一時間このミスに気づかなくてバグと死闘していたので…
int a,c,x;
unsigned int b;
x = max(-c, min(x, a - b));
としたとき、
(a-b)がunsigned intとして評価されてしまうのですが、
こういうとき、オペレーターの戻り値の語ってどうやって決まるんですか?
どこかの本では、大きい方に丸められるとか何とか書いてあった気がするんですが…
実際どのような規則になっているんでしょうか?
0569デフォルトの名無しさん
2008/03/08(土) 19:30:35算術型の標準変換、整数の格上げとか
そんなもんどの本にも載ってるだろ。
0570デフォルトの名無しさん
2008/03/08(土) 19:30:57>元がfloatなのにいらないお節介しなくても良さそうなのに。
もとがdoubleの値(1.0)をおまいが勝手にfloat型の変数に入れようとしているのを
コンパイラさんは(おせっかいかなと思いながらも)教えてくれようとしている。
レベルアップするためにも、人の忠告は素直に聞こうな。
0571デフォルトの名無しさん
2008/03/08(土) 19:35:44おまえはサル
0572デフォルトの名無しさん
2008/03/08(土) 19:37:000573デフォルトの名無しさん
2008/03/08(土) 19:43:39お前・・・なんという読解力のなさ・・
0574デフォルトの名無しさん
2008/03/08(土) 19:46:590575デフォルトの名無しさん
2008/03/08(土) 19:48:09オレも読解力がないのだろうか
0576デフォルトの名無しさん
2008/03/08(土) 19:53:380577デフォルトの名無しさん
2008/03/08(土) 19:54:05float a = 1;
のような気がする
0578デフォルトの名無しさん
2008/03/08(土) 19:59:33それだとfloat変数の初期化だよね。
もともとは以下のようにfloat←doubleの代入だったはず。
>float a;
>a=1.0
0579デフォルトの名無しさん
2008/03/08(土) 20:08:18持ってる本は2冊ともunsignedまでは書いてないんだが…
駄目なの使ってるのね…(一つは学校指定だけど)
算術型 標準変換 でググったら見つかりました、有り難う。
long double > double > float > unsigned long int > long int > unsigned int > int
int > unsigned int だとばっかり思ってた。
(表現力が大きい方に…ってかいてあるからマイナスが表現できる方が上なのかと…
よく考えてみたら、表現できる値の絶対値はunsignedの方が大きいけど。)
0580デフォルトの名無しさん
2008/03/08(土) 20:15:02DOMだったら、selectNodesとかselectSingleNodeとかを使えばいいよ。
0581デフォルトの名無しさん
2008/03/08(土) 21:20:47最初に書き込んだものです。
多分みなさんが思っているよりもっと初歩的なことが
分かっていないのだと思います。
正直doubleとfloatの違いが精度の違いでfloatがメモリ確保の
ためだけに使われるぐらいにしか考えていません。
情報落ちや桁落ちの問題でここまでするのでしょうか?
正しい解釈はこうですか?
int a;
float b;
double c;
a=1;
b=1.0f;
c=1.0;
0582デフォルトの名無しさん
2008/03/08(土) 21:23:45すいません。もう少し質問させてください。
何のためにここまでするのかと言う部分です。
情報落ち、桁落ち、丸め誤差、その他
このうちのどれですか?
0583デフォルトの名無しさん
2008/03/08(土) 21:31:40で、単純に、floatを準備したからにはfloatを突っ込む。と。
0584デフォルトの名無しさん
2008/03/08(土) 21:37:28何をどう解釈しているのか分からないが…。
1や1.0などの定数自身も型を持っていることは理解している?
その定数をどの型の変数に代入するかに無関係に、定数自身が型を持っている。
1 ← int型
1U ← unsigned int型
1.0 ← double型
のように。
>情報落ち、桁落ち、丸め誤差、その他
この場合は、その他。
実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現できる。
ここで指摘されているのは、定数の書式としてfloat型の定数を表現できるのだから
それを使用したほうが適切だろう、ということ。
精度の大きい型の値を精度の小さい型の変数に代入しても、桁落ちなどがなければ全く問題ない。
桁落ちなどがあるとしても、それを意図して書いているなら動作としては正しい。
でも意図したものかどうかプログラムを他人が読んでも分からないので、そのような場合は明示的なキャストをしたほうがいいこともある。
この場合はキャストなんかせず、定数を明示的にfloat型で書けばいい。
0585デフォルトの名無しさん
2008/03/08(土) 21:39:04int a = 1;
float b = 1;
double c = 1;
としてしまうなぁ。
# ただし、float b = 1.0としてしまうとdouble値からfloat値からのキャストになるのでコンパイラによっては巧くないね。
0586デフォルトの名無しさん
2008/03/08(土) 22:09:18早速のレスありがとうございます。
よく分かりました。
>この場合は、その他。
>実数の1.0という値は、double型でもfloat型でも桁落ちも丸め誤差もなく正しく表現で>きる。
そう思っていたのに何故そこまでこだわるのだろうと思っていたら、
定数の型のことを言っていたんですね。
0587デフォルトの名無しさん
2008/03/08(土) 22:20:53あと、_PTHREADSをdefineすれば使えるとも聞いたのですが、、、
googleしても、結構昔の情報が多くて実際のところはどうなのかよく分かりませんでした。
0588デフォルトの名無しさん
2008/03/08(土) 22:23:39作ろうとしているのですが、現実的ではないでしょうか?
またどの辺に気をつけて開発した方が良いでしょうか?
内容は不特定多数のPCとsocket通信でバイナリデータをやりとりし、
内部でPostgreSQLにアクセスする、いわゆるサーバアプリケーションです。
開発はほぼ全面的にWindows側(VisualC++.net2003)で行い、
1日2度程、Fedoraでも動作テストをする予定です。
0589デフォルトの名無しさん
2008/03/08(土) 22:56:48そういうときは、闇雲にググるのではなく、
自分の使っているライブラリのマニュアルを読め。
例えば、Visual C++もlibstdc++もスレッド安全性についての文書がある。
http://msdn2.microsoft.com/ja-jp/library/c9ceah3b(VS.80).aspx
http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch03s05.html#manual.intro.using.concurrency.thread_safety
0590デフォルトの名無しさん
2008/03/08(土) 22:58:300591デフォルトの名無しさん
2008/03/09(日) 03:48:11完全に.NET上に載せてしまってMONO使うとか。
俺は使ったことないけど
0592デフォルトの名無しさん
2008/03/09(日) 03:56:01てローカルに保存するプログラムを作りたいのですが,
どのようなライブラリを使えばいいのでしょうか?
ライブラリなどなく自分で作るしかないのでしょうか?
0593デフォルトの名無しさん
2008/03/09(日) 04:02:450594デフォルトの名無しさん
2008/03/09(日) 04:10:04アドレス入力は手動でやろうと思っています.
ダウンロードするライブラリはあるんですね.ありがとうございます
0595デフォルトの名無しさん
2008/03/09(日) 04:14:05ZIPやEXEやAVIやMP3を落とすのと同じ
場所がわからなければ無理
動画が見られるアドレスと違う
0596デフォルトの名無しさん
2008/03/09(日) 05:39:49【ひめはじめ】その7
http://venus.bbspink.com/test/read.cgi/megami/1204907313/
【ひめはじめ】その8
http://venus.bbspink.com/test/read.cgi/megami/1204919740/
0597デフォルトの名無しさん
2008/03/09(日) 09:17:25ソケット通信をどうにかする必要がある。
WindowsとPOSIXで似て非なるAPIを持っているから、
自分でラップするなり既存のライブラリを使うなりしないといけない。
0598デフォルトの名無しさん
2008/03/09(日) 09:51:30教えてもらったファイルとかを見てみたのですが、マルチスレッド環境で
std::cout に何かを書き出す時、いちいちロックをとらないとだめなようですが、
ロックの必要ないcout相当のものはないでしょうか?
自分でinline関数を作ってつかうようにはしたのですが、、
0599デフォルトの名無しさん
2008/03/09(日) 10:33:05boost::mutex mutex_io;
#define safe_cout(m) { \
boost::mutex::scoped_lock lock(mutex_io); \
m \
}
int main() {
safe_cout(
std::cout << "hello" << std::endl;
);
こんな感じ。
0600デフォルトの名無しさん
2008/03/09(日) 11:39:46クラスmyclassの大きさをnバイトとして、次のように定義すると、
myclass *A;
A = new myclass[x];
myclass B[x];
sizeof()の戻り値が
n ← sizeof(myclass),sizeof(*A),sizeof(*B)
4 ← sizeof(A)
x*n ← sizeof(B)
となるわけですが、AとBにはどういう違いがあるんでしょうか
0601デフォルトの名無しさん
2008/03/09(日) 11:45:03ちなみにsizeof (*B)は、Bが配列型→ポインタ型への変換を受けた後、
それに単項*演算子を適用しているので、B型のインスタンスをsizeofにかけていることになる。
0602デフォルトの名無しさん
2008/03/09(日) 11:56:08Bは配列型(値は配列の先頭を指すポインタ)
ってことでしょうか
両方A[0].xとかB[1].xでクラスのメンバ変数xにアクセスできるので、
イマイチ区別が付きませんでした
0603デフォルトの名無しさん
2008/03/09(日) 12:13:17(sizeof Bのように直接sizeofの演算対象にするのはその例外の1つ)
それで、[]演算子は常にポインタを対象にしている。
このページの中程にそういう話がある。
http://kmaebashi.com/programmer/pointer.html
0604デフォルトの名無しさん
2008/03/09(日) 12:32:06自動で変換されていたためでしたか
そのページを参考に基本的な部分を整理しようと思います
ありがとうございました
0605デフォルトの名無しさん
2008/03/09(日) 17:48:09コンパイル時にアットマークがついてしまいます
Error 42: Symbol Undefined _WSACleanup@0
0606デフォルトの名無しさん
2008/03/09(日) 17:58:46@がどうとか関係ないから、ws2_32.libか何かをリンクしろ。
0607デフォルトの名無しさん
2008/03/09(日) 18:03:440608デフォルトの名無しさん
2008/03/09(日) 18:04:430609デフォルトの名無しさん
2008/03/09(日) 19:12:41猫でも分かるC++言語プログラミング
0610デフォルトの名無しさん
2008/03/09(日) 21:05:34そ・れ・は・な・い
0611デフォルトの名無しさん
2008/03/09(日) 21:22:02え、そうなの?
>>608見てアマゾンに注文したばかりなんだけど。
0612デフォルトの名無しさん
2008/03/09(日) 21:29:54評判はとてもいいのですが
入門向きでは無いだろあれw
C++が初めてで、他になにかやってたってとかならまだいいんだろうけど
0613デフォルトの名無しさん
2008/03/09(日) 21:30:27読む価値は非常に高い良書。
ただ入門書を探してる人のレベルによっては
難しいと感じるかもしれないというだけのこと。
いずれ読むべきだから買っておけ。
0614デフォルトの名無しさん
2008/03/09(日) 21:42:41class IHogeの中に実装があってもいいのでしょうか?
0615デフォルトの名無しさん
2008/03/09(日) 21:48:020616デフォルトの名無しさん
2008/03/09(日) 21:57:550617デフォルトの名無しさん
2008/03/09(日) 22:06:06「真似る」のなら駄目
C++的にIHogeの中に実装があってもいいかどうかは別ね
0618デフォルトの名無しさん
2008/03/09(日) 22:25:570619デフォルトの名無しさん
2008/03/09(日) 22:30:020620デフォルトの名無しさん
2008/03/09(日) 23:17:51本屋でとりあえず立ち読みでもしてみれ。
ネットでポチっと買うと合わなかった時悲惨。
0621デフォルトの名無しさん
2008/03/09(日) 23:42:180622デフォルトの名無しさん
2008/03/09(日) 23:53:59猫でも分かるC++言語プログラミングだけだなw
>>607
「猫でも〜」は本買った方がいいけど(著者にとって)、webでも見れるよ。
http://www.kumei.ne.jp/c_lang/howto.htm
0623デフォルトの名無しさん
2008/03/10(月) 00:02:50これならわかるC++ ブルーバックス版
0624デフォルトの名無しさん
2008/03/10(月) 00:04:46それなんてCOM?
0625デフォルトの名無しさん
2008/03/10(月) 00:05:50本人なのか、信者なのか。
0626デフォルトの名無しさん
2008/03/10(月) 00:08:180627デフォルトの名無しさん
2008/03/10(月) 00:10:15じゃあ本人ではないなw
0628デフォルトの名無しさん
2008/03/10(月) 00:10:150629622
2008/03/10(月) 00:13:06推してるの一人じゃね?
俺はwebでも見れるよって言いたかったの。
"だけだな"って言ったのはacceleratedとかD&Eとか無茶やろって思ったからw
0630デフォルトの名無しさん
2008/03/10(月) 00:16:03あれって全部じゃなかったんだ・・・
0631デフォルトの名無しさん
2008/03/10(月) 00:18:100632デフォルトの名無しさん
2008/03/10(月) 00:21:07猫は素人でも知ってる場合があったぞw
素人メールに猫の話があった時には目を疑った。
Web主体の素人さんにはPG的に一番名度高いのかも知れんね。
0633デフォルトの名無しさん
2008/03/10(月) 00:23:37ごめん"立ち読みしてみれ"のあたりしか読んでなかった。
独習は良いかもね。
0634デフォルトの名無しさん
2008/03/10(月) 00:25:03入門書読んで、猫でもで遊んで、オブジェクト指向とか良いプログラミング作法でも学んでいけばいいんじゃね
0635デフォルトの名無しさん
2008/03/10(月) 01:34:18->
↑これはどういった意味の物なのでしょうか?
0636デフォルトの名無しさん
2008/03/10(月) 01:37:350637デフォルトの名無しさん
2008/03/10(月) 01:38:56A* a = new A();
//以下の2行は同じ
(*a).aaa();
a->aaa();
0638デフォルトの名無しさん
2008/03/10(月) 01:41:57ポインタptrが指す構造体のメンバmemである
(*ptr).mem を ->演算子を用いて
ptr->memと表す。
a -> b は、aが指す構造体のメンバbを表す。
0639デフォルトの名無しさん
2008/03/10(月) 01:45:26良く分かりました。ありがとうございます。
0640デフォルトの名無しさん
2008/03/10(月) 01:56:28同じ意味で a@ みたいな演算子が欲しかったよ・・・
[0]の構文糖衣として。
[email protected]();
a@ += 10;
a@++;
まぁ、提案するとしても20年くらい言うのが遅い(C言語宛てになるし)わけだけど。
0641デフォルトの名無しさん
2008/03/10(月) 02:03:400642デフォルトの名無しさん
2008/03/10(月) 02:22:490643デフォルトの名無しさん
2008/03/10(月) 02:26:360644デフォルトの名無しさん
2008/03/10(月) 02:53:11そもそも*(ついでに&も)が後置だったら良かったと俺は思う。
なんで前置にしたんだろう。
0645デフォルトの名無しさん
2008/03/10(月) 02:57:370646デフォルトの名無しさん
2008/03/10(月) 03:09:580647デフォルトの名無しさん
2008/03/10(月) 03:24:32たしかに。後置で良いよな。
>>646
void 635(){
640();
}
0648デフォルトの名無しさん
2008/03/10(月) 03:46:23C言語の設計者の方じゃないと意味無いことに気付いた
0649デフォルトの名無しさん
2008/03/10(月) 05:09:56いい本ないかと聞かれて猫でもわかる〜を薦めたら
馬鹿にするなと怒られた。
他意はなかったんだが、うかつだったわ。
0650デフォルトの名無しさん
2008/03/10(月) 06:44:560651デフォルトの名無しさん
2008/03/10(月) 07:25:43特別な理由をその時思いつかなければ
まず後置にはしないと思う。
0652デフォルトの名無しさん
2008/03/10(月) 09:54:49というか、マルチスレッドを利用する場面というのはどういうときなのでしょうか
0653デフォルトの名無しさん
2008/03/10(月) 10:01:090654デフォルトの名無しさん
2008/03/10(月) 11:21:28ウンコしながらオナニーとか
0655デフォルトの名無しさん
2008/03/10(月) 11:50:51GUIアプリなんかで通常の機能を提供しながら重い処理をバックグラウンドでやるとか
0656デフォルトの名無しさん
2008/03/10(月) 11:56:51流石にそれは難しいだろう。
>>652
トイレで出すもの出しながら飲食するとか。
0657デフォルトの名無しさん
2008/03/10(月) 12:20:13猫でもわかる〜のサイトは、中身はいいけど、体裁がなぁ...
プログラムの入門サイトなんだし、HTMLのタグぐらい、もうちょっと調べようよつとか思うよね...
0658デフォルトの名無しさん
2008/03/10(月) 12:24:130659デフォルトの名無しさん
2008/03/10(月) 12:32:210660デフォルトの名無しさん
2008/03/10(月) 12:34:240661デフォルトの名無しさん
2008/03/10(月) 13:33:18同じ働きをする関数って VC++ だとなんて関数?
0662デフォルトの名無しさん
2008/03/10(月) 13:37:420663デフォルトの名無しさん
2008/03/10(月) 13:44:38boost::filesystem::system_complete
0664デフォルトの名無しさん
2008/03/10(月) 13:45:59何故GetModuleFileName()?
あれはカレントからの相対パスを解決する関数なんだから、モジュールからの相対パスにしちゃダメだろう。
0665デフォルトの名無しさん
2008/03/10(月) 13:54:070666デフォルトの名無しさん
2008/03/10(月) 13:56:31具体的には、
class test {};
test a1;
a1.method();
としたとき、method内でa1という名前をしることは出来ますか?
0667デフォルトの名無しさん
2008/03/10(月) 14:05:01ムリ
0668デフォルトの名無しさん
2008/03/10(月) 14:07:08thisでよくね?
0669デフォルトの名無しさん
2008/03/10(月) 14:12:44自分で保持するってのは?
class test {
std::strung instance_name;
public:
test(const char *pName) {
instance_name = pName;
}
}
test a1("a1");
0670デフォルトの名無しさん
2008/03/10(月) 14:15:06どう使うの?
0671デフォルトの名無しさん
2008/03/10(月) 14:26:04ありがとうございます。
用途はデバッグです。あるクラスの中身を表示させているのですが、
どのインスタンスかがわかりやすいようにしたかったので、、
自動化したいので、コンストラクタの引数に書くのは避けたいです。
が、これが一番確実ですかね。
0672デフォルトの名無しさん
2008/03/10(月) 14:30:23Use the debugger, >671
0673デフォルトの名無しさん
2008/03/10(月) 14:32:570674デフォルトの名無しさん
2008/03/10(月) 14:44:44どういう環境かは知らんが>>672の言うようにデバッガ使ったらいいと思う
0675デフォルトの名無しさん
2008/03/10(月) 15:03:47何らかの制限で、デバッガが使えない場合
デバッグログが使えるのならば、
生成した側が、確保されたアドレスを出力(__FILE__と、__LINE__も一緒に出力するとわかりやすい)
クラスの中身を表示するところでthisを表示すればいいんじゃないかな?
>>674
なかなか面白い書き込み時間だ
0676デフォルトの名無しさん
2008/03/10(月) 16:52:05簡易ブラウザを作っているのですが、ソケット接続エラーがでます。
どこが原因か分かりません。教えていただけませんか?
0677デフォルトの名無しさん
2008/03/10(月) 18:03:29htonsとか?
0678デフォルトの名無しさん
2008/03/10(月) 18:06:29基礎からやり直せ。
0679デフォルトの名無しさん
2008/03/10(月) 19:01:42('(゚∀゚∩_ おいらをどこかのスレに送って!
/ヽ 〈/\ お別れの時にはお土産を持たせてね!
/| ̄ ̄ ̄|.\/
|dexiosu|/
 ̄ ̄ ̄
現在の所持品:たばこ・ライター・コーヒー・ブラックブラック・枕・ケータイ電話
睡眠薬・聖教新聞 ・ダッチワイフ・外付けSCSI340MHDD・ネットランナー4月号
TYG02・小嶋進社長・ペプシNEX・モツ煮・ヌルポ・伊予柑・寒いギャグ ・7年ものキムチ
・カビキラーストロング ・ハイスクール奇面組文庫版全13巻 ・(元)関内太郎 ・チャッカマン
・ぺヤングソースやきそば・魔法先生ネギま!14巻限定版 ・小田急3000形・PSP
・デスノート ・ファブリーズ ・ポーション ・SH902i ・Windows3.1
0680デフォルトの名無しさん
2008/03/10(月) 19:11:21生ソケットでHTTPをやるプログラム例はウェブにやまほど転がってるか
ら、それらを見て何が足りないか調べてみましょ。
gethostbyname()やsocket()のエラーチェックもしましょ。
それ以外にもツッコミ所が多いけど致命的じゃないので省略。
0681676
2008/03/10(月) 20:26:39役に立たない情報ありがとう。
0682デフォルトの名無しさん
2008/03/10(月) 20:37:07例えばnewしてdeleteしないのは、それが習慣化すると致命的だと思うぞ。
>>676
ということで、>678。
まさかとは思うが、そのレベルで外部に直接繋ぎに行くなよ。
接続先に迷惑掛けることになるからな。
0683676
2008/03/10(月) 20:44:42いまどきのパソコンは自動で解放するから別にデリートしなくていいし
(つーかdeleteしなかったのはこの程度のプログラムだったらいらんし面倒くさいからで)、
その機能的な面を考えておるんだったら、最初っから一気にメモリ確保しといて、
解放しますよ。あと、ポート80に設定してないとか言われてたが、
あれはポート80に設定しなかったら自動で80に設定してくれるからで、面倒くさいから。
socket()のエラーチェックしなかったのは、面倒くさかったからで。
0684デフォルトの名無しさん
2008/03/10(月) 20:48:29newしてdeleteしない習慣がついてます、サーセンwww。
vectorとかshared_ptrがないと生きていけません。
0685デフォルトの名無しさん
2008/03/10(月) 20:49:110686デフォルトの名無しさん
2008/03/10(月) 20:49:20iprt.sin_port=80;
は
iprt.sin_port=20480;
にするといいお
0688デフォルトの名無しさん
2008/03/10(月) 20:52:26STLのように自動開放する以外には使うべきでない
0690デフォルトの名無しさん
2008/03/10(月) 20:54:16悪くてもこの場合固定長配列でいいし、もっと言えばstringを使うべきところ。
全く意味のないnewじゃん。
newしてdeleteしないのが致命的にならないのはこのサイズのバイナリだからであって、
自動でやるからデリートしなくて良いって考え方は非常に危険。くせにするなって言う意見のがもっとも。
たとえば、photoshopみたいなソフトを作ってる人がnewしてdeleteしなかったらどうなるか。
0691デフォルトの名無しさん
2008/03/10(月) 20:54:400692676
2008/03/10(月) 20:59:43ありがとう。今度からできるだけ意味無いことは止める。
string型にすればいいだろうなぁとは思ってた。
最初mallocにしてたけど、知らん間にnewになった。
そもそもstringならnewはいらんはなしだったけど、そこまで頭回らんかった。
俺の脳裏にはC言語っぽいのをできるだけC++っぽくしようってのがあったんだと思う。
かえってそれが変に見えたのは認める。
勉強になりました。
0693デフォルトの名無しさん
2008/03/10(月) 21:01:47・getaddrinfo使えタコが
・面倒だからとエラー処理サボると、もっと面倒な事態に
の例
0694676
2008/03/10(月) 21:07:27ネットワーク系に触るの生まれて初めてなのよn
getaddrinfoか、メモメモ
/ ̄ ̄\/)
f ヾ
| ⊂(゚Д゚)|
ヽ _(◎)ノ ノつ
/ノ/ ハヽ二二ノ
( (||i) )ヽ\
ヽ)L人(_/(ノ`J
0695デフォルトの名無しさん
2008/03/10(月) 21:30:06触んないほうがいい。
0696676
2008/03/10(月) 21:42:16NEってCCNAとかのイメージが先行して配線を弄ってるイメージ強かったけど、
プログラム組ませると「間違えると危険なんだなぁ」とは思った。勉強になりました。
安全な下級PGに戻ります。
0697デフォルトの名無しさん
2008/03/10(月) 22:38:480698デフォルトの名無しさん
2008/03/10(月) 23:10:24int型へのポインタの宣言って
int *a;
int* a;
この二つで差がありますか?
0699デフォルトの名無しさん
2008/03/10(月) 23:13:060700デフォルトの名無しさん
2008/03/10(月) 23:13:52コンパイル時、2つのコンパイルオプションを指定したいのですが、どのように書けばいいのでしょうか。
例えば`wx-config --cppflags` と `pkg-config --cflags gtk+-2.0`
を同時に使いたいのです。
0701デフォルトの名無しさん
2008/03/10(月) 23:14:44違いはありません。
しかし、その二つはまれに戦争の火種となります。
0702デフォルトの名無しさん
2008/03/10(月) 23:19:40int *a, b;
int* a, b;
0703デフォルトの名無しさん
2008/03/10(月) 23:33:51ありがとうございます
intだとint型とint型へのポインタが同時に宣言でき、
int*だとint型へのポインタのみ宣言できるわけですか
>戦争の火種
(((( ;゚Д゚))))ガクガクブルブル
0704デフォルトの名無しさん
2008/03/10(月) 23:39:19いいえ、どちらも同じです
0705デフォルトの名無しさん
2008/03/10(月) 23:40:40戦争の火種って言っても空襲は来ないから安心しておじいちゃん。
0706デフォルトの名無しさん
2008/03/10(月) 23:47:02残念ながらそれは違う
0707デフォルトの名無しさん
2008/03/10(月) 23:59:24int* a, b;
二つとも
aがint型へのポインタ。int型の変数bでしょうか?
0708デフォルトの名無しさん
2008/03/11(火) 00:02:17int* a, b; と書こうが、b はポインタにはならない。
0709デフォルトの名無しさん
2008/03/11(火) 00:02:58その通り
0710デフォルトの名無しさん
2008/03/11(火) 00:05:390711デフォルトの名無しさん
2008/03/11(火) 00:07:17単に並べればいいよ。
gcc `wx-config --cppflags` `pkg-config --cflags gtk+-2.0` mycode.cc
0712デフォルトの名無しさん
2008/03/11(火) 00:08:060713デフォルトの名無しさん
2008/03/11(火) 00:09:310714デフォルトの名無しさん
2008/03/11(火) 00:10:33*
a
;
派
0715デフォルトの名無しさん
2008/03/11(火) 00:11:23ステップ数至上主義者ですね
0717デフォルトの名無しさん
2008/03/11(火) 00:34:27n\
t
*
a
;
派
0718デフォルトの名無しさん
2008/03/11(火) 00:37:590719デフォルトの名無しさん
2008/03/11(火) 01:21:53改行やバリナリはありますが 自作するしかないですか
0720デフォルトの名無しさん
2008/03/11(火) 01:24:21たとえば空きメモリを調べてバッファを使って出力するとか
そういうのを強化するライブラリ無いですか ビット単位の出力もないです
0721デフォルトの名無しさん
2008/03/11(火) 01:25:230722デフォルトの名無しさん
2008/03/11(火) 01:27:400723デフォルトの名無しさん
2008/03/11(火) 01:32:21書き込みがあまりなくなったらメモリを解放したいのですが、
一番最後の書き込み時に解放しなかった場合、
それ以降アクセスがなかったら無いことを知ってメモリ解放するにはどうしたらいいですか
0724デフォルトの名無しさん
2008/03/11(火) 01:33:050725デフォルトの名無しさん
2008/03/11(火) 01:34:41時間計測してシグナル出せば良さそうですね
0726デフォルトの名無しさん
2008/03/11(火) 01:37:56複数のファイルを同時に扱いたいです 1000個の書き込みがあれば
一つあたり100KB確保でも大きいです
単独でバッファ管理するより複数を調べた方が良さそうですが
0727デフォルトの名無しさん
2008/03/11(火) 01:43:50Fstream fp("out1"), fq("out2"); としたとします
クラスはfpの状態とfqの状態両方を知ることは出来ますか
0728デフォルトの名無しさん
2008/03/11(火) 01:51:550729デフォルトの名無しさん
2008/03/11(火) 01:57:24解放させるにはどうしたらいいですか?
最近参照された時間を保持していてもメンバ関数からでは
他のメンバ変数はわからないですよね
0730デフォルトの名無しさん
2008/03/11(火) 01:58:38728読んだ?
0731デフォルトの名無しさん
2008/03/11(火) 01:59:49個別の時間を保持しないと駄目ですが
0732デフォルトの名無しさん
2008/03/11(火) 02:01:300733デフォルトの名無しさん
2008/03/11(火) 02:02:00その貧相な知識で勝手に判断して人のレスを無視するんじゃねえよ
0734デフォルトの名無しさん
2008/03/11(火) 02:03:540735デフォルトの名無しさん
2008/03/11(火) 02:09:53コンストラクタに入れるとクラス生成ごとに呼びだれると思うのですが
これも共用するにはどうすればいいですか?
static fnc(){}などと書けば初めの一回だけになりますか
0736デフォルトの名無しさん
2008/03/11(火) 02:10:010737デフォルトの名無しさん
2008/03/11(火) 02:15:17>static fnc(){}などと書けば初めの一回だけになりますか
staticというキーワードを知っているのなら、それについての最低限の仕様くらいは
自分で調べたほうがいいよ。webを見るなり、まともな入門書を読むなりして。
凝ったことをやろうとする前に、もっと先に学ぶべきことが多そうだ。
0738デフォルトの名無しさん
2008/03/11(火) 02:28:02どうすればいいですか
class cls{
public:
static int n;
cls(){ n=0; }
};
main(){ cls x; }
0739デフォルトの名無しさん
2008/03/11(火) 02:32:52コンパイルエラーなのか
画面に何も表示されないのか
後者なら別におかしくないぞ
0740デフォルトの名無しさん
2008/03/11(火) 02:37:50とでます
0741デフォルトの名無しさん
2008/03/11(火) 02:39:42static int cls::n;
0742デフォルトの名無しさん
2008/03/11(火) 02:42:55あとクラスのメンバ関数も共用出来ますか? 初めに一度コンストラクタで起動するだけにしたいです
0743デフォルトの名無しさん
2008/03/11(火) 02:44:44staticをメンバ 関数につけたらどうなるか調べなおせ
0744デフォルトの名無しさん
2008/03/11(火) 02:56:22namespace std {
template <>
void swap(hoge &a)
みたいな記述があったのですが、templateのあとの<>の中が空白でも
コンパイル出来ているのですが、なんででしょうか?
0745デフォルトの名無しさん
2008/03/11(火) 02:57:240746デフォルトの名無しさん
2008/03/11(火) 03:01:30ありがとうございます。でも意味がないような、、、
どんな時につかうのですか?
0747デフォルトの名無しさん
2008/03/11(火) 03:06:020748デフォルトの名無しさん
2008/03/11(火) 03:11:47write(fq,x)
としたとき、読み込むファイルが1G以上だとメモリがたらなくなります
あらかじめ書き込むサイズが判明していたとしてマルチスレッド化して
read(fp, x)
write(fq, x, N, KAIHOUFLG)
としてメモリを解放しながら読み書きするにはどのように実装すればいいですか
0749デフォルトの名無しさん
2008/03/11(火) 03:15:09分割して読み書きすればいいだけだろうが
0750デフォルトの名無しさん
2008/03/11(火) 03:17:020751デフォルトの名無しさん
2008/03/11(火) 03:19:170752デフォルトの名無しさん
2008/03/11(火) 03:20:49ありがとうです。特殊化でぐぐったら、wikipediaのエントリが先頭に出てきて、それを
読んだらわかりました。(わかりやすく書いてあった)
templateのうち、コンパイラまかせじゃなくて自分で書いてしまいたいところを自分で
書くということですね。
0753デフォルトの名無しさん
2008/03/11(火) 03:21:11メモリを解放しながら書き込むという指定をすると
読み込まれた部分に対して先頭からメモリを解放しながら書き込みます
0754デフォルトの名無しさん
2008/03/11(火) 03:23:27メモリを解放させながら読み込むことも出来るという汎用の関数を作りたいんです
0755デフォルトの名無しさん
2008/03/11(火) 03:25:350756デフォルトの名無しさん
2008/03/11(火) 03:26:090757デフォルトの名無しさん
2008/03/11(火) 03:30:190758デフォルトの名無しさん
2008/03/11(火) 03:30:20現物を扱わずに売り買いだけを先にしてしまうようなものです
読み込みと書き込みの約束だけをしてしまい不要ならメモリを解放します
0759デフォルトの名無しさん
2008/03/11(火) 04:31:060760デフォルトの名無しさん
2008/03/11(火) 06:03:120761デフォルトの名無しさん
2008/03/11(火) 07:20:30まー、32bitアプリは仮想メモリ空間も
2Gあたりでリミットだからあんまし意味がないけど
0762デフォルトの名無しさん
2008/03/11(火) 07:20:530763デフォルトの名無しさん
2008/03/11(火) 07:23:38Windowsなら4つのAPIで実現できる。
APIの頭文字はそれぞれ、C、M、U、Cだ。
0764デフォルトの名無しさん
2008/03/11(火) 09:38:41それらを同時に動かして快適動作させたいわけです
コードを教えてもらえませんか?
読み書きのバッファを128KB単位にして管理すれば良さそうなんですが・・
x[n]のようにデータにアクセスできるが、前方が解放されていたとしてもそれ以外は同じアクセスが出来るようにしたいです
0765デフォルトの名無しさん
2008/03/11(火) 09:46:11ディスクを交換するほうが早い。
0766デフォルトの名無しさん
2008/03/11(火) 10:36:58脳ミソを交換ry
0767デフォルトの名無しさん
2008/03/11(火) 12:00:57したい事は >>748 なのか?
もしそうなら、標準関数は何もしなくてもそうなってる
一体何のために何がしたい?
0768デフォルトの名無しさん
2008/03/11(火) 13:46:23となら、組み込み環境でない限り、OSがそれぐらいはやっている。
0769デフォルトの名無しさん
2008/03/11(火) 13:57:28それだったらFFCやfast copyがOS標準のコピーを上回らないはずだよ
一つの巨大ファイルだけを扱うならば、速度差は出ないだろうけど
複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない
あと2Kずつ書き込みがあったとしたらそのつどAPIでそのまま書き込んでいたらとても鈍いよ
0770デフォルトの名無しさん
2008/03/11(火) 14:02:16上のファイルロードをスレッド化して読み込み中に不要なメモリを解放出来るようにすること
0771デフォルトの名無しさん
2008/03/11(火) 14:07:58Read( "inputfile", buf );
Write( "outputfile" , buf );
だけで扱えるようにしたい
しかしここで、バッファ管理やマルチスレッド化を導入しなければ
巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する
これらを解消して簡単なファイル入出力をしたい
0772デフォルトの名無しさん
2008/03/11(火) 14:10:0264ビットならアドレス空間も余裕だ
0773デフォルトの名無しさん
2008/03/11(火) 14:20:24FFCとかはFILE_FLAG_NO_BUFFERINGをつかって
システムキャッシュにのせないことで高速化してるんじゃなかったっけ?
0774デフォルトの名無しさん
2008/03/11(火) 14:28:10目指している方向はわからなくもないが、
ここで色々訊いているような人間が使い物になるものを作れるかどうか不安。
何事も、下手な自作よりOS標準など既存のものほうがずっとうまいと仮定すべき。
0775デフォルトの名無しさん
2008/03/11(火) 14:33:19巨大データをオンメモリでっていうこと自体に元々限界があるの。
分けなさい。
0776デフォルトの名無しさん
2008/03/11(火) 14:49:21#include <iostream>
#include <string>
using namespace std;
#define N 10000000
int main(){
unsigned int n,m,cn[256];
string x(N,'\0');
for(n=0;n<N;n++)x[n]=rand()&255;
for(n=0;n<256;n++){cn[n]=0;for(m=0;m<8;m++)cn[n]+=(n>>m)&1;}
unsigned int sum=0;
for(n=0;n<N;n++)sum+=cn[x[n]];
cout<<sum<<endl;
#define b(x,i) ((x>>i)&1)
sum=0;
for(n=0;n<N;n++){
int y=x[n];
sum+=b(y,0)+b(y,1)+b(y,2)+b(y,3)+b(y,4)+b(y,5)+b(y,6)+b(y,7);
}
cout<<sum<<endl;
}
0777デフォルトの名無しさん
2008/03/11(火) 14:52:58string x(N,'\0');
→
vector<unsigned char> x(N,0);
で一致しました
0778デフォルトの名無しさん
2008/03/11(火) 15:48:42コンパイル時
../source/memo.h:15: note: candidates are: MyFrame::MyFrame()
../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&)
のようなエラーが出たのですが、このエラーはどういう意味のエラーなのでしょうか??
0779デフォルトの名無しさん
2008/03/11(火) 16:52:43その直前のエラーについての補足説明で、
候補としてこういう関数がありますよってことじゃないかなたぶん?
0780デフォルトの名無しさん
2008/03/11(火) 20:31:11コンパイラ・ソース・エラー(省略せずに)を明記してくれ。
0781デフォルトの名無しさん
2008/03/11(火) 21:04:38noteって単語と、candidateって単語の意味くらい調べましょうね。
そうすればそれらの行がエラーじゃないことと、何を言わんとしているか位判るだろうから。
0782デフォルトの名無しさん
2008/03/11(火) 21:06:36>複数のファイル(1000以上同時など)を扱うと標準のはやつにたたない
 ̄ ̄
>巨大ファイルを読み込むときにメモリ不足が足らなくなったり、少数ファイルの書き込みで速度低下する
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
落ち着いて、日本語で書いてください。
0783デフォルトの名無しさん
2008/03/11(火) 21:07:04とすると、配列の中身を一気に定められますが、
int a[6]
と一度定義した配列に一気に中身を代入することは可能でしょうか
0784デフォルトの名無しさん
2008/03/11(火) 21:15:55int oneShotArray[] = {0, 1, 2, 3, 4, 5, 6};
int a[6];
std::copy(oneShotArray, oneShotArray + 6, a);
memcpy(a, oneShotArray, sizeof(* a) * 6);
0785デフォルトの名無しさん
2008/03/11(火) 21:43:13ifstreamで半角空白を含むファイル名や、日本語を含むパスで
ifstream ifile(フルパス名);で失敗してしまうのですが、これは仕様なのでしょうか?
仕様なのでしたら回避策はあるのでしょうか?
Visual Studio 2005SP1を使用しています。
よろしくおねがいします。
0786デフォルトの名無しさん
2008/03/11(火) 21:43:47フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。
#include <iostream>
#include <fstream>
#include <windows.h>
using namespace std;
int main(int argc, char **argv)
{
ifstream ifile("d:\\新規テキスト ドキュメント.txt");
if(ifile) {
MessageBox(NULL, "success", "info", MB_OK);
ifile.close();
} else {
MessageBox(NULL, "failed", "info", MB_OK);
}
return 0;
}
0787デフォルトの名無しさん
2008/03/11(火) 21:44:52向こうの誘導したレスの前半は無視ですか?
0788デフォルトの名無しさん
2008/03/11(火) 21:46:510789デフォルトの名無しさん
2008/03/11(火) 21:49:050790デフォルトの名無しさん
2008/03/11(火) 21:49:560791デフォルトの名無しさん
2008/03/11(火) 21:50:280792デフォルトの名無しさん
2008/03/11(火) 21:51:42ファイルはあります。
>>789
"d:\\test.txt"ではsuccessとなります。
0793デフォルトの名無しさん
2008/03/11(火) 21:52:330794デフォルトの名無しさん
2008/03/11(火) 21:53:40ソースコードに
// あいうえお
と入力して、テキストエディタでエンコードを確認しましたがシフトJISでした。
0795デフォルトの名無しさん
2008/03/11(火) 21:57:55setlocale(LC_ALL, "");
で出来ました!
ありがとうございました!
0796デフォルトの名無しさん
2008/03/11(火) 22:36:430797デフォルトの名無しさん
2008/03/11(火) 23:16:360798デフォルトの名無しさん
2008/03/11(火) 23:17:43segmentation faultになります。
baseclass::method();
と書いて目的は達成できたのですが、segmentation faultになる理由が分かりません。
#あと、このスレのタイトルが
#【初心者歓迎】C/C++室 Ver.50【環境依存OK】
# ってなってるけど、なんか何度かVer.50がくりかえされているような気がするのは自分だけ?
0799デフォルトの名無しさん
2008/03/11(火) 23:39:180800デフォルトの名無しさん
2008/03/11(火) 23:51:29環境依存OKということでここでお伺いします。
linuxThreadsでは、あるスレッドでsetpriority()を呼ぶと
親スレッドの優先度は変化しないと思いますが、
NPTLでは同一のPIDならすべて変化するのでしょうか?
0801デフォルトの名無しさん
2008/03/11(火) 23:52:56>親スレッドの優先度は変化しないと思いますが、
そうは思えないが。
0802778
2008/03/11(火) 23:54:27noteはなんとなく分かったのですが、candidatesは調べてもわかりませんでした。
candidatesは何のことなんでしょうか・・。
どなたかご教示頂けると幸いです。
0803デフォルトの名無しさん
2008/03/11(火) 23:57:010804デフォルトの名無しさん
2008/03/11(火) 23:57:11すいません。
class base {
public:
virtual void resize(){}
};
class deri : public base {
public:
virtual void resize() {
#if 1
base* tmp = this;
tmp->resize(); // ここでseg fault
#else
base::resize(); // 問題なし
#endif
}
};
です。
0805デフォルトの名無しさん
2008/03/11(火) 23:58:21無限再帰でスタックオーバーフローだな。
0806デフォルトの名無しさん
2008/03/11(火) 23:59:48・tmp->resize() 結局virtualたどってderi::resize()にくるから無限再帰
0807デフォルトの名無しさん
2008/03/12(水) 00:00:30即レスどうもです!!
そうなんですか?
manにはプロセスの優先度を設定すると書かれてありました。
linuxThreadsはPIDを共有しないので変化しないと思ってたのですが。
PIDは違うけどプロセスは同一ということでしょうか?
0808デフォルトの名無しさん
2008/03/12(水) 00:07:58ありがとうございます。tmp->resize()の前にログをいれて再帰していることを確認しました。
再帰というのは全然考えてなかったです。
助かりました。
0809デフォルトの名無しさん
2008/03/12(水) 00:21:21../source/memo.h:15: note: candidates are: MyFrame::MyFrame()
../source/memo.h:15: note: MyFrame::MyFrame(const MyFrame&)
俺も英語は苦手だがせっかくネット使えるんだから有効活用しようぜ。
「MyFrameが複数の候補がある」という内容。
コード上でどちらの処理を使うかがコンパイラに判断できないからだ。
0810デフォルトの名無しさん
2008/03/12(水) 00:23:45no matching function for call to 〜
とか云われたはず。コードで書いてある引数に
マッチする関数の宣言がなかったって話。
0811778
2008/03/12(水) 01:14:43レスありがとうございます。
なるほど、普通に「候補」でよかったんですね。
なんかプログラミングの専門用語でcandidatってのがあるのかと勘違いしてました。
ありがとうございましたm(_ _)m
0812デフォルトの名無しさん
2008/03/12(水) 01:16:150813デフォルトの名無しさん
2008/03/12(水) 01:24:27日本語でおkと言いたいが、
windowsなら スタート → すべてのプログラム → アクセサリ → システムツール → 文字コード表
を見てみては?
0814デフォルトの名無しさん
2008/03/12(水) 02:02:040815デフォルトの名無しさん
2008/03/12(水) 02:10:10下位のものは間違ったSJISの番号でしょうか?
26番15475回
30番17423回
22番18440回
127番18931回
25番19273回
上位
32番45338056回
130番93045087回
0816デフォルトの名無しさん
2008/03/12(水) 02:11:380817デフォルトの名無しさん
2008/03/12(水) 02:51:43例えば、40行目で
clsss aaa {
public:
void sample1 ();
}
と定義したクラスのデータメンバとメンバ関数を、
80行目で
class aaa {
public:
int xxx;
void sample2();
}
みたいな感じで、追加する感じです。
上のように書いたのをコンパイルしようとしたらエラーが出たのですが、
すでに定義したクラスの機能を拡張するにはやはり継承しなければいけないのでしょうか??
0818デフォルトの名無しさん
2008/03/12(水) 02:52:260819デフォルトの名無しさん
2008/03/12(水) 05:03:1640行目の定義を削除すればいいじゃん。
0820デフォルトの名無しさん
2008/03/12(水) 05:44:14HDD残量を取得したいのですがどのようにすればよいのでしょうか?
環境に関係なくとる方法はあるのでしょうか?
もしなければ,どのようにして取得すればよいか教えていただきたいです.
0821デフォルトの名無しさん
2008/03/12(水) 06:16:190822デフォルトの名無しさん
2008/03/12(水) 07:48:11だから、英単語の意味を調べたら単に「候補」って出てくると思うのだが……
0823デフォルトの名無しさん
2008/03/12(水) 07:49:31そもそも、どのディスクの残量を知りたいのかね。
0824デフォルトの名無しさん
2008/03/12(水) 07:55:39Amazonのほしい物リストで、個人情報(氏名等)がもれる場合があります。
ほしい物リスト(ウィッシュリスト)が未登録ならば、問題ありません。
しかし、自分のアカウントを調べた方が良いです。
http://1505953.blog76.fc2.com/blog-entry-340.html
祭り中?
【祭】Amazonウィッシュリストで個人情報ダダ漏れ中★6
http://namidame.2ch.net/test/read.cgi/news/1205262805/
0825817
2008/03/12(水) 11:28:26レスありがとうございます。
40行目のやつは、実際今作ってるプログラムだとincludeで読み込んでるライブラリで定義していまして、
消して下で書き直すのもライブラリ自体をいじるのもなんか好ましくないような気がしまして。
やはり継承するしかなさそうですね。というかむしろライブラリのクラスは継承してから使うものなんですかね。
ありがとうございましたm(_ _)m
0826デフォルトの名無しさん
2008/03/12(水) 13:36:09stlの使い方について質問です。今リストの中に1,2,4,8,16,32,64
と入っているんですが、"erase" を使って5番目の数字を削除して中身を表示し、
その後に3番目の数字を削除して表示。 そして、"insert"を使って3番目と4番目の
数字の間に7を入れて表示という感じにするにはどうしたらいいんですか?
osはubuntuでg++を使っています。
#include <iostream>
#include <iterator>
#include <list>
using namespace std;
int main(){
list<int> mylist;
for(int i=1; i<=64; i *= 2)
mylist.push_back(i);
cout<<endl;
list<int>::const_iterator itr1;
for(itr1 = mylist.begin(); itr1 != mylist.end(); itr1++)
cout<< *(itr1)<<" ";
return 0;
}
0827デフォルトの名無しさん
2008/03/12(水) 13:47:08引数つきコンストラクタから、デフォルトのコンストラクタを呼ぶことはできないでしょうか?
Javaではできたので、C++でもできないものかと思っているのですが
CHoge::CHoge()
{
// 共通の初期化がだらだらと
}
CHoge::CHoge(int type)
{
// CHoge()で共通の初期化を呼び出したあと、色々やりたい
}
CHoge::CHoge(const char *psz)
{
// CHoge()で共通の初期化を呼び出したあと、色々やりたい
}
0828デフォルトの名無しさん
2008/03/12(水) 13:56:340829デフォルトの名無しさん
2008/03/12(水) 13:58:35ないよ。
そんなことできたら初期化子が重複するから。
0830デフォルトの名無しさん
2008/03/12(水) 13:59:16ありがとうございます
初期化プライベート関数つくるとします
0831デフォルトの名無しさん
2008/03/12(水) 14:01:57>"erase" を使って5番目の数字を削除して中身を表示し
削除したら表示できないだろ。
削除するだけでいいなら、文字通りerase()を使えばいい。
# erase(), insert()は引き数にiteratorを必要とするが、
# advance()を使えば何番目を指すiteratorを作れる。
0832デフォルトの名無しさん
2008/03/12(水) 14:02:09C++でもコンストラクタからコンストラクタを呼び出すことは文法違反ではない。
CHoge::CHoge()
{
// 共通の初期化がだらだらと
}
CHoge::CHoge(int type)
{
CHoge(); //一時オブジェクトの生成!!!!!
//いろいろな固有の処理
}
しかし、こんなコードを書いたならば想像してるとおりにはならないだろう。
こういう場合C++では、共通化したい処理をまとめた
(恐らくはprivateな)メンバー関数を別に用意する。
void CHoge::init();
CHoge::CHoge(int type)
{
init(); //共通の処理
//いろいろな固有の処理
}
0833デフォルトの名無しさん
2008/03/12(水) 14:10:49HogeをMoeに変えてごらん
そうすれば世界も変わって見えるんだ
0834デフォルトの名無しさん
2008/03/12(水) 14:20:50"erase" を使って5番目の数字を削除して中身を表示
1,2,8,32,64
その後に3番目の数字を削除して表示
1,2,32,64
そして、"insert"を使って3番目と4番目の数字の間に7を入れて表示
1,2,32,7,64
というう感じにしたかったんです。
0835デフォルトの名無しさん
2008/03/12(水) 14:29:04その通りに書けばいいだろ。
http://www.wakhok.ac.jp/~sumi/stl/header/vector.html
0836デフォルトの名無しさん
2008/03/12(水) 15:13:26>831に書いた内容の何が気に入らないんだ?(:;
つーか、4はどこに消えたんだ?
0837デフォルトの名無しさん
2008/03/12(水) 15:27:12#define GENERATE_CLASS class X {...} // マクロを呼び出す側からXの部分を任意に指定できるようにしたい
0838デフォルトの名無しさん
2008/03/12(水) 15:30:49ではないの?
0839デフォルトの名無しさん
2008/03/12(水) 15:48:280840837
2008/03/12(水) 15:58:32その方法はGENERATE_CLASS(Hoge)と使った時、Hogeの部分でエラーが出た気がしたのですが、
今もう一度試してみたらできました。(別の部分で間違いがあったようです)
簡単すぎること聞いて申し訳ないです。
>>839
template引数のバインドができない関係で、マクロでクラスを書くことになってので、templateでは無理なのです。
0841デフォルトの名無しさん
2008/03/12(水) 16:04:21まさかとは思うが、業務上のプログラムを2ちゃんで質問しながら書くなよ。
0843デフォルトの名無しさん
2008/03/12(水) 17:21:29「main関数において、返却値の値によって表示の方法を変えよ」
とあるのですが“表示の方法を変える”とはどのようなことをすれば良いのでしょうか?
返却値は1、2、3の三つです。
0844デフォルトの名無しさん
2008/03/12(水) 17:32:050845デフォルトの名無しさん
2008/03/12(水) 17:33:570846デフォルトの名無しさん
2008/03/12(水) 17:43:04ありがとうございます
とりあえずその方向でやってみます
0847デフォルトの名無しさん
2008/03/12(水) 18:06:09もし問題文が
「main関数において、返却値の値によって表示の方法を変えよ」
だけなら、回答はこうだ
「日本語でおk」
0848デフォルトの名無しさん
2008/03/12(水) 18:12:25そして宿題は宿題スレへ。
0849デフォルトの名無しさん
2008/03/12(水) 18:12:32switch(henkyakuchi) {
case 1: printf("きたー"); break;
case 2: puts("きたー"); break;
case 3: cout << "きたー"; break;
}
0850デフォルトの名無しさん
2008/03/12(水) 18:18:14switch (henkyakuti) {
case 1:
printf("0"); break;
case 2:
fputs("0", stdout); break;
case 3:
putchar('0'); break;
}
0851850
2008/03/12(水) 18:18:480852デフォルトの名無しさん
2008/03/12(水) 18:35:01まあ全文じゃないけどな
>>848
スマン、ヒントが欲しかったんだ
>>849,850
そういうことなのか?
0853デフォルトの名無しさん
2008/03/12(水) 18:40:31載せるなら宿題スレ池だが
0854デフォルトの名無しさん
2008/03/12(水) 18:45:01お前>>843読んでないだろ
0855デフォルトの名無しさん
2008/03/12(水) 19:11:36これが分かっただけでもいいんじゃないか?
っつーか問題の意図は出題者に聞けよ
0856デフォルトの名無しさん
2008/03/12(水) 19:24:25問題文を他人に意味が伝わるように要約できない=テメーが問題文の意味を理解していない
0857デフォルトの名無しさん
2008/03/12(水) 22:00:24理解できてないから質問してるんじゃないか?
0858デフォルトの名無しさん
2008/03/12(水) 22:04:09>>852 みてイラっときた俺はたぶん短気なんだろう
0859デフォルトの名無しさん
2008/03/12(水) 22:04:200860デフォルトの名無しさん
2008/03/12(水) 22:19:52値のパターンがかなり多い場合、
switch〜case文とif〜elseif文ではどっちのほうが処理が早いでしょうか
ひとつの値に対しひとつの処理なので、どちらの文を使っても同じように処理できます
(switch〜caseの場合はbreakで抜けるので)
あんまり多い場合、関数の配列でも用いた方がいいのかもしれませんが……
0861デフォルトの名無しさん
2008/03/12(水) 22:23:18試せないならどっちを使っても一緒。気にするだけ無駄。
0862デフォルトの名無しさん
2008/03/12(水) 22:27:22その最適化が効けば
case ラベルの位置のアドレスの表を使ってジャンプするようになる。
0863デフォルトの名無しさん
2008/03/12(水) 22:33:39実測して比べるしかない
0864デフォルトの名無しさん
2008/03/12(水) 22:37:03それだけ if して、その他を switch にするとか?
0865デフォルトの名無しさん
2008/03/12(水) 22:37:40一般的にはswtichが効率的。
なぜならswitchはジャンプテーブルなり、各個比較なり、
コンパイラが最適なものを選択すると期待できるから。
0866デフォルトの名無しさん
2008/03/12(水) 23:13:05問題が理解できないのなら、問題の意味を教えてくれと問うべきだし、
問題が理解できているのなら、その解決策に関して問うべきだし、
解決策があるていど目星が付いてるが、ひっかかる所があるならば、その点を問うべきだろ。
自分が理解できない問題を一部だけ示して教えろなんて、どんなバカだ。
0867デフォルトの名無しさん
2008/03/12(水) 23:14:300868デフォルトの名無しさん
2008/03/12(水) 23:23:08いいかげんその話題は終われ
0869デフォルトの名無しさん
2008/03/12(水) 23:26:07bool z = a() && b() && c() && d() && e();
みたいな文があったとき、a()から順に、最悪e()まで調べていくと思う。(&&演算子は必ず左から調べるよね
ということは、e()が最も高確率でfalseを返す場合、e()を一番左に持って行った方が効率よくなりますよね?
あと↑が正しいとして、コードの見栄や保守を考えて順番を変えたくないって場合、どうしますか?
0870デフォルトの名無しさん
2008/03/12(水) 23:30:01書いた後に気づいた…
0871デフォルトの名無しさん
2008/03/12(水) 23:39:01「その話題」がどの話題かわからないけど、「顔真っ赤」とか刺激してる時点で
たぶん君も「終わらせない気満々」なんだよね。
終わらせようとしているのに同時に刺激してるなら、馬鹿丸出しだし。
0872デフォルトの名無しさん
2008/03/12(水) 23:39:13> 関数だから
なんでそう思うんだ?
0873デフォルトの名無しさん
2008/03/12(水) 23:39:48?
0874デフォルトの名無しさん
2008/03/12(水) 23:45:30関数が実行されるかされないかによって、プログラムの挙動が変わることがあるから、って思った。
よく考えてみれば、 if (ptr && ptr->func()) とか書きますね・・・
0875デフォルトの名無しさん
2008/03/12(水) 23:49:23これptrがNULLでも安全なの?
0876デフォルトの名無しさん
2008/03/12(水) 23:51:53これでも舐めておちつけ(´・ω・`)つ〔きゃらめる〕
0877デフォルトの名無しさん
2008/03/12(水) 23:55:45ptrがNULLなら&&を通らないから大丈夫じゃない?
0878デフォルトの名無しさん
2008/03/12(水) 23:56:26ptrがNULLの場合でも問題ない。
でも、ptrがNULLじゃなくても変なとこ指してる可能性は忘れるな。
それだけ見て本当の意味で安全かどうかはなんともいえない。
0879デフォルトの名無しさん
2008/03/12(水) 23:57:290880デフォルトの名無しさん
2008/03/13(木) 00:02:46前半部分が正しい。
効率が良くなるが順番を変えたくない場合は個人的にケースバイケース。
効率が求められる部分ならば変更かける。(実測して効果があるかも試して)
とはいえ、関数内に副作用があったり、今後そうなる可能性だってあるから
基本的に短絡評価をあてにした効率は求めないようにしている。
>>875
NULLなら短絡評価でptr->func()は評価されないため問題なし。
0881デフォルトの名無しさん
2008/03/13(木) 00:49:530882デフォルトの名無しさん
2008/03/13(木) 02:25:29割と適当に答えるけど、通常見かける && や || は短絡評価をあてにして
cond && (cond が非ゼロの時のみ可能な処理)
や
(非ぜロの確率が低い式) && (非ゼロの確率が高い式)
あるいは
(軽い処理) && (重い処理)
または
(先に必要な副作用のある式) && (その後にのみ評価されるべき式)
等、
すでに正しい順序で記述されているので、並べ替えは不可ということが多いように思う。
もしそうでない場合はコードの質を疑っちゃうから、もしちゃんと動いているならなるべく
触らない⇒やはり並べ替えないだろうなあ。
0883デフォルトの名無しさん
2008/03/13(木) 03:13:39int main(void)
{
puts("ローゼン「ローザmstcを入れて」");
puts("「次に、目玉を入れて」");
puts("真紅「ぎゃあああああああ」");
puts("ローゼン「あ、順番間違えた」");
return 0;
}
コンパイル通りません><
0884デフォルトの名無しさん
2008/03/13(木) 03:21:04そうですね。ではおやすみ。
0885デフォルトの名無しさん
2008/03/13(木) 03:39:10studio
0886デフォルトの名無しさん
2008/03/13(木) 05:08:18関数の再帰呼び出しというところで
#include<stdio.h>
int main()
{
static int i = 1;
if (i <= 10) {
printf("i = %d\n", i);
i++;
main();
}
return 0;
}
というのがあり、これを実行すると
i = 1
i = 2
・・・
i = 10
になるとなっていて、試してみたところ確かにそうなるのですが、
main内でmainをもう一度呼び出した際に
static int i = 1;
の部分でなぜ再度 i に1が代入されないのでしょうか?
初心者過ぎてバカかと思われるかと思いますが
ご教授願えるとありがたいです。
0887デフォルトの名無しさん
2008/03/13(木) 05:17:07static i; //宣言のみ
i=1; // 代入
初期化と代入は違うのです。
下のように書き換えてみるとどうなります?
0888デフォルトの名無しさん
2008/03/13(木) 05:20:28延々回り続けちゃう。
static int i=1;
static int j;
j=1;
if(i<10){
printf("%d %d",i,j);
i++;
j++
main();
}
return 0;
}
まわすならこっち。
0889デフォルトの名無しさん
2008/03/13(木) 05:23:47>main内でmainを
http://ml.tietew.jp/cppll/cppll_novice/article/1584
>static int i = 1; の部分でなぜ再度
ttp://d.hatena.ne.jp/unageanu/20070826
0890デフォルトの名無しさん
2008/03/13(木) 05:27:30わかった!ありがとう!
0891886
2008/03/13(木) 05:59:43ちゃんと理解できてなかったことがよく分かりました。
887さん、889さん、ありがとうございました。
0892デフォルトの名無しさん
2008/03/13(木) 16:35:10push_backの反対で、先頭に要素を追加するには
どのようにすればいいのでしょうか
0893デフォルトの名無しさん
2008/03/13(木) 16:37:34listとか使ってください。
0894デフォルトの名無しさん
2008/03/13(木) 16:42:01残念です。すごく
これが出来れば完成なのに
0895デフォルトの名無しさん
2008/03/13(木) 16:50:34Mainループ
{
�@の計算
whilie(永久にループ)
{
�Aの計算
}
}
このようなプログラムでは、�@の計算をし続け、かつ�Aの計算をし続けてもらえると思ったのですが
�@を一度計算したあとは�Aの実行をループします。
こういった処理をしたい場合はマルチスレッド処理?というのをしなければならないのでしょうか?
0896デフォルトの名無しさん
2008/03/13(木) 16:51:400897デフォルトの名無しさん
2008/03/13(木) 16:52:15vectorの先頭への挿入は効率が悪いからpush_frontは提供されていない。
どうしても必要ならinsert
0898デフォルトの名無しさん
2008/03/13(木) 16:55:000899デフォルトの名無しさん
2008/03/13(木) 16:57:24ありがとうございます。やっぱりそうゆうものですよね。
0900デフォルトの名無しさん
2008/03/13(木) 17:17:11vectorでpush_frontを使いたいって言われて、なんでlist薦めたり、insert薦めたりなんだよwww
deque教えてやれよちゃんとww
0901デフォルトの名無しさん
2008/03/13(木) 17:34:44http://ufcpp.net/study/stl/characteristics.html
http://www5c.biglobe.ne.jp/~ecb/cpp/07_04.html
のようなページを教えてあげること。
そして一番良いのは、今後同じ様な問題を自己解決出来るようにしてあげること。
「stl コンテナ」でググれ。
0902デフォルトの名無しさん
2008/03/13(木) 18:59:00>これが出来れば完成なのに
この言葉に心奪われたんだ。
0903デフォルトの名無しさん
2008/03/13(木) 18:59:58dequeにもvectorに劣る欠点はあるしなあ。なんともいえん。
0904デフォルトの名無しさん
2008/03/13(木) 20:04:030905デフォルトの名無しさん
2008/03/13(木) 20:39:410906デフォルトの名無しさん
2008/03/13(木) 21:08:38どうやら動くものが出来つつあるらしいな。
0907デフォルトの名無しさん
2008/03/14(金) 01:36:10ネットで検索してみると
柴田望洋『新装版 プログラミング講義C++』(ソフトバンククリエイティブ)
塚越一雄『はじめてのC++』(技術評論社)
日経ソフトウエア編『ゼロから学ぶC/C++』(日経BP社)
あたりがC言語の知識が無い初心者にとっての
C++ の入門書らしいのですが,
この3冊の中で特にお薦めなものとその理由を教えていただけませんか?
0908デフォルトの名無しさん
2008/03/14(金) 01:42:59書籍がいいというのであれば、大きめの本屋にいって立ち読みで少し目を通してわかりやすそうなのを選ぶ。
0909デフォルトの名無しさん
2008/03/14(金) 01:48:40出費したくないなら入門サイトでも探して勉強するのがいい
0910907
2008/03/14(金) 01:53:06では,この3刷のどれかを読んで感じた長所・短所を教えていただけませんか?
0911デフォルトの名無しさん
2008/03/14(金) 02:00:34つ http://pc11.2ch.net/test/read.cgi/tech/1202273631/
0912デフォルトの名無しさん
2008/03/14(金) 02:16:070913デフォルトの名無しさん
2008/03/14(金) 03:14:18独習は基礎知識と問題集
林はC言語で知識止まってる
0914デフォルトの名無しさん
2008/03/14(金) 08:03:070915デフォルトの名無しさん
2008/03/14(金) 09:12:16ロベールでぐぐれば一番上にくるよ
0916デフォルトの名無しさん
2008/03/14(金) 09:49:23値段は張るがまあいい本だ。
0917デフォルトの名無しさん
2008/03/14(金) 11:43:37vc6.0からC#に移って久しぶりにこの問題に直面
しました。
double d;
d=1.2-1.1;
が0.0999999になりますが循環小数でない数の
0.0999999とどうやって見分けをつけたらいいのでしょうか。
0.1だけだったら分かるかも知れませんが他にも循環小数が
いっぱいあるし自動的に調べられるようにしたいです。
丸めればいいとか1000000倍して必要なときだけ/10000000
すればいいとかいろいろ意見はあるでしょうが単に見分ける方法
とか聞きたいです。
0918デフォルトの名無しさん
2008/03/14(金) 11:50:05無限の値を保存できない
0919デフォルトの名無しさん
2008/03/14(金) 11:57:42double d1 = 1.2 - 1.1; //d1 == 0.099999999999999867
double d2 = 0.099999999999999867;
で、
d1 != d2ということが知りたいの?
0920デフォルトの名無しさん
2008/03/14(金) 12:03:20完全に一致したり不一致したりを確認することはできないから、
その計算で出る誤差の最大を取って±誤差に収まってるものを一致するとみなしたりする。
そういう誤差が許されない処理をしたいなら整数型でなんとかするしかない。
0921デフォルトの名無しさん
2008/03/14(金) 12:36:02一応C++で浮動小数点の比較をやりたいときは、
double a,b;//こいつらには適当な数値がはいってるとして
if (abs(a-b)<=std::numeric_limits<double>::min()) {
// a == b
}
else {
// a != b
}
おれはこんな書き方を習ったけど、これでもすべてのケースを正しく判定できるわけではないからなあ。
0922デフォルトの名無しさん
2008/03/14(金) 12:39:43そのクラスのメンバ関数にアクセスしたいのですが、
代入の仕方が分かりません
グローバル関数へのポインタなら問題なく出来るのですが
0923デフォルトの名無しさん
2008/03/14(金) 12:40:05int100個の配列を0で初期化したいとき、このコードは規格に沿ってますか?
手元のg++だと動くんですが、、、
0924デフォルトの名無しさん
2008/03/14(金) 12:41:29正しく判定ったって、何がどう正しいのやら
0925デフォルトの名無しさん
2008/03/14(金) 12:42:19メンバ関数ポインタでぐぐる
>>923
沿ってます
0926デフォルトの名無しさん
2008/03/14(金) 12:42:37沿ってない
ary[1]〜ary[99]は初期化されない
0927922
2008/03/14(金) 12:57:06ちょっと説明不足でした
インスタンスごとにポインタに代入するメンバ関数を変えたいんですよね
main関数内で宣言・代入する方法はいくらでも見つかるんですが、
コンストラクタのようなメンバ関数内で宣言・代入する方法が分からなくて
0928デフォルトの名無しさん
2008/03/14(金) 13:03:04class Foo {
public:
void (Foo::*func)();
Foo(int){ func = &Foo::bar; }
Foo(bool){ func = &Foo::hoge; }
void foo(){ (this->*func)(); }
void bar(){ cout << "bar"; }
void hoge(){ cout << "hoge"; }
};
int main() {
Foo a(1);
Foo b(true);
a.foo();
b.foo();
}
0929デフォルトの名無しさん
2008/03/14(金) 13:15:08C++なら規格に沿ってる
Cだと沿ってなかったような気がするが…
0930デフォルトの名無しさん
2008/03/14(金) 13:18:03それです!
>void (Foo::*func)();
ここが分かっていませんでした
ありがとうございました
0931デフォルトの名無しさん
2008/03/14(金) 13:49:37そうです。
>921
確かに整数値に直すしかなさそうですね。
丸める方法も0.00001の誤差を判定するときも
0.09999の次の9を丸めて0.1にしたらえらい違い
になりそうな気がするし。
確実に循環してると分かっているなら丸めてもいいと思うけど
そうでない場合は困るね。
>921
それでも確実じゃないと言われると絶望的?
VC6.0はどうやって判断していたんだろう。
0932デフォルトの名無しさん
2008/03/14(金) 13:50:09>main関数内で宣言・代入する方法はいくらでも見つかるんですが
これ嘘くせえな
おまえちゃんと読んでないだろ
0933デフォルトの名無しさん
2008/03/14(金) 14:08:50Cでも沿っている。
0934デフォルトの名無しさん
2008/03/14(金) 14:17:17int hoge [][3] = {
{0,0,0},
{1,1,1},
{0,1,0},
};
のような配列で
hoge[1];
とやると
hoge[1][0]のアドレスを返して来るでよろしいでしょうか?
0935デフォルトの名無しさん
2008/03/14(金) 14:19:14別に循環はしてないよ
これ実行してみ
int main()
{
printf("%.70f\n", 1.2);
printf("%.70f\n", 1.1);
printf("%.70f\n", 1.2 - 1.1);
}
0936デフォルトの名無しさん
2008/03/14(金) 14:24:19どうやって判別しているのかは、仮数部と指数部が完全一致だろう
0937デフォルトの名無しさん
2008/03/14(金) 14:28:56うん。
int a[3];でa==&a[0]なのと一緒だからね。
0938デフォルトの名無しさん
2008/03/14(金) 14:29:38100億と100億1くらいならば同一と見なすとか・・ 0.0001なら1の誤差は大きい
GOSA = 0.999と定義して、x = yであることを
x*GOSA < y < x/GOSA としたらどうか?
0939デフォルトの名無しさん
2008/03/14(金) 14:33:040940デフォルトの名無しさん
2008/03/14(金) 14:49:12すいません。VC6.0からC#間がないので、
stdio.hをインクルードする方法(できるの?)が分かりません。
代わりに次のようにしてみたら・・・、
static void Main(string[] args)
{
Console.WriteLine(1.2 - 1.1);
}
0.0999999999999999
となりました。
0941デフォルトの名無しさん
2008/03/14(金) 14:51:41なるほど。参考にしてみます。
0942デフォルトの名無しさん
2008/03/14(金) 15:01:040943デフォルトの名無しさん
2008/03/14(金) 15:03:12指数部が2以上ずれていれば駄目だろう
0944デフォルトの名無しさん
2008/03/14(金) 15:29:33C#ならdecimal型を使えば解決
static void Main(string[] args)
{
decimal d = 1.2m - 1.1m;
Console.WriteLine(d);
}
0945デフォルトの名無しさん
2008/03/14(金) 15:35:360946デフォルトの名無しさん
2008/03/14(金) 16:00:02#include <cstdlib>
using namespace std;
int main()
{
cout << rand() << endl;
cout << rand() << endl;
}
このようにプログラムをコンパイルし実行してみると何度やっても
0
1481765933
となります。乱数当てプログラムみたなのも全部0が生成されてしまいます。
コンパイラはcygwinのg++です。なぜなんでしょうか???
0947デフォルトの名無しさん
2008/03/14(金) 16:04:10しょせん擬似乱数だから
srandで異なるシード値を与えれば変わる
0948デフォルトの名無しさん
2008/03/14(金) 16:36:37public:
const int tbl[2];
};
非staticでconstの配列をメンバーに持たせることは可能ですか?
0949デフォルトの名無しさん
2008/03/14(金) 16:44:49こう?
class X {
public:
const int tbl[2];
};
int main() {
X x = {{96,43}};
cout<<x.tbl[0]<<x.tbl[1]<<endl;
}
0950デフォルトの名無しさん
2008/03/14(金) 16:54:23ここまでしないとだめ?
確かにそれだと指数部を見ただけで二つの値が違うかどうか
分かりそうだけど。
0951デフォルトの名無しさん
2008/03/14(金) 17:00:01いいですね。しかし128ビットも使うのは少し嫌ですね。
unsigned short decimal とか使いたい^^
0952デフォルトの名無しさん
2008/03/14(金) 17:05:54ちゃんとsrandにガンダムシードを与えないと。
0953デフォルトの名無しさん
2008/03/14(金) 17:24:35説明不足でした。
コンストラクタで初期化できるかどうかです。
もう少し込み入ったクラス
class X {
public:
int mi;
virtual void mf();
double md;
private:
const int tbl[2];
};
0954デフォルトの名無しさん
2008/03/14(金) 17:28:42むり
0955バラ
2008/03/14(金) 17:31:15”山田太郎”は0008バイトあります。
とmystrlenを使ってと表示させたいのですが
やり方教えてください。
お願いします。
0956デフォルトの名無しさん
2008/03/14(金) 17:34:160957デフォルトの名無しさん
2008/03/14(金) 17:47:22thx 規格でもそうなってる?
0958バラ
2008/03/14(金) 17:48:53mystrlen関数だけをを使いたいのですが。
strlenは使用禁止だそうせす。
詳しく教えてください。
0959デフォルトの名無しさん
2008/03/14(金) 17:53:040960デフォルトの名無しさん
2008/03/14(金) 17:53:19仕方がないな。
int mystrlen(const char*p){
return strchr(p,0) - p;
}
0961デフォルトの名無しさん
2008/03/14(金) 17:55:00皆さま、いろいろとありがとうございました。
0962バラ
2008/03/14(金) 17:57:35ありがとうございます。
0963デフォルトの名無しさん
2008/03/14(金) 18:26:550964デフォルトの名無しさん
2008/03/14(金) 18:42:37int mystrlen(const char *str) {
char buff[512];
return sprintf(buff, "%.500s", str);
}
0965デフォルトの名無しさん
2008/03/14(金) 18:43:43{
printf("\"山田太郎\"は0008バイトあります。");
}
一応質問文からだとこれでもあながち間違いじゃない
0966バラ
2008/03/14(金) 19:20:51#include <stdlib.h>
#define STRING "山田太郎"
int mystrlen(char *p)
{
/*i初期化*/
int i = 0;
/*\0ならば抜ける*/
while(*p != '\0')
{
/*pを増やす*/
p++;
/*iを増やす*/
i++;
}
/*iを返す*/
return i;
}
int main()
{
/*バイトを表示*/
printf("%s は %04d バイトです.\n", STRING, mystrlen(STRING));
/*0を返す*/
return 0;
}
できました。ありがとうございます
0967デフォルトの名無しさん
2008/03/14(金) 19:22:29っ BCD
0968デフォルトの名無しさん
2008/03/14(金) 19:31:190969デフォルトの名無しさん
2008/03/14(金) 19:34:100970パラ
2008/03/14(金) 19:38:27どうやったら8バイトにすることでができるんでしょうか…
0971教えてください><
2008/03/14(金) 19:39:080972デフォルトの名無しさん
2008/03/14(金) 19:39:310973デフォルトの名無しさん
2008/03/14(金) 19:40:07中学校からやり直してください
0974教えてください><
2008/03/14(金) 19:46:37c++における関数の定義が知りたいんです><
0975デフォルトの名無しさん
2008/03/14(金) 19:49:480976教えてください><
2008/03/14(金) 19:51:32今教えていただけませんか?><
0977デフォルトの名無しさん
2008/03/14(金) 19:52:30C++ の入門サイトがあるだろう。
0978デフォルトの名無しさん
2008/03/14(金) 19:53:140979デフォルトの名無しさん
2008/03/14(金) 19:55:350980教えてください><
2008/03/14(金) 19:56:18分かる人から分かりやすく聞いた方が理解しやすいと思って書き込んだのに!><
何のための掲示板ですか?!><
0981デフォルトの名無しさん
2008/03/14(金) 19:58:08こんな質問するなんて、お前のこの先が凄く心配だからな。
0982教えてください><
2008/03/14(金) 20:01:41説明してくれる人が現れるのを待つことにします。
このスレッドが1000行くまで待ちます><
0983デフォルトの名無しさん
2008/03/14(金) 20:03:21fが関数。中の構造は何でもいい。
0984教えてください><
2008/03/14(金) 20:04:170985デフォルトの名無しさん
2008/03/14(金) 20:04:40ほれ
ttp://ja.wikipedia.org/wiki/%E9%96%A2%E6%95%B0
0986教えてください><
2008/03/14(金) 20:05:080987デフォルトの名無しさん
2008/03/14(金) 20:06:100988教えてください><
2008/03/14(金) 20:08:50つまりc++の関数とはサブルーチン機能のことなんですね!><
ありがとうございました><
ラーメンおいしいです
0989デフォルトの名無しさん
2008/03/14(金) 20:39:560990デフォルトの名無しさん
2008/03/14(金) 20:40:570991デフォルトの名無しさん
2008/03/14(金) 20:48:48スレチだが
0992デフォルトの名無しさん
2008/03/14(金) 20:58:500993デフォルトの名無しさん
2008/03/14(金) 21:01:170994デフォルトの名無しさん
2008/03/14(金) 21:02:45【初心者歓迎】C/C++室 Ver.51【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1205496128/l50
0995デフォルトの名無しさん
2008/03/14(金) 21:08:15乙
>>989 発電機もいる
コイル+磁石 で電磁誘導がどうたら
発生する電流は交流だから整流してこうたら
蓄電池に充電する際には一定以上の電圧(蓄電池による)が必要になるからうんたら
で、スレチというより板違い
0996デフォルトの名無しさん
2008/03/14(金) 21:16:010997デフォルトの名無しさん
2008/03/14(金) 21:29:31無かった事にしておこうか…
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/
実はこのスレよりも古いようだ
【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124499/
0998デフォルトの名無しさん
2008/03/14(金) 21:29:38乙
0999デフォルトの名無しさん
2008/03/14(金) 21:41:19http://pc11.2ch.net/test/read.cgi/tech/1204124447/
こっちまだ残ってるけど使わないの?
1000デフォルトの名無しさん
2008/03/14(金) 21:54:54【初心者歓迎】C/C++室 Ver.50【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1204124447/
は超高速質疑応答で消費される
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。