【初心者歓迎】C/C++室 Ver.57【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/07/16(水) 22:39:18ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.56【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1215278693/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0002デフォルトの名無しさん
2008/07/16(水) 22:40:18正しくはこうだな。
◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
0003デフォルトの名無しさん
2008/07/16(水) 22:58:040004デフォルトの名無しさん
2008/07/16(水) 23:58:32{
FILE *fp;
if(fopen_s(&fp, "hoge.txt", "w")) exit(1);
fwrite("hoge", 4, 1, fp);
fclose(fp);
return 0;
}
これを普通に実行するとちゃんとファイルが作成されるのですが、アイコンにファイルをドロップして始めるとファイルが作成されません。
なにか制約でもあるのでしょうか?
0005デフォルトの名無しさん
2008/07/17(木) 00:03:13どこか、あなたの知らないところに作られています。
フルパスでファイルを作るか、カレントディレクトリを指定すると宜しいかと。
0006デフォルトの名無しさん
2008/07/17(木) 00:09:10ありがとうございます。わけの分からないところに作られていました。
デフォルトでカレントディレクトリに作られると勘違いしていました。
0007デフォルトの名無しさん
2008/07/17(木) 05:42:31{
Hoge() { Init(); }
~Hoge();
Init();
}
このようにコンストラクタ時に
初期化用のメンバ関数を用意して使うことはokなのでしょうか。
0008デフォルトの名無しさん
2008/07/17(木) 05:48:510009デフォルトの名無しさん
2008/07/17(木) 05:57:10これで長々と書かずに済みます。
0010デフォルトの名無しさん
2008/07/17(木) 08:00:28Initはvirtualにしないことだけ気をつけて。
0011デフォルトの名無しさん
2008/07/17(木) 08:19:59いや、カレントディレクトリに作られているはずだよ。
カレントディレクトリが予想外な場所になっているだけで。
0012デフォルトの名無しさん
2008/07/17(木) 08:43:07自分でコンパイルする時
デバッグモードでやるのとリリースモードでやるのでは
どういった違いがでるのでしょうか?
0013デフォルトの名無しさん
2008/07/17(木) 09:09:55最適化
0014デフォルトの名無しさん
2008/07/17(木) 09:23:44001512
2008/07/17(木) 09:34:570016デフォルトの名無しさん
2008/07/17(木) 09:40:29gdbとか使ってると、Segmentation Falutなんかが出たときに、
その場所をソースコードの行番号で教えてくれる。
0017デフォルトの名無しさん
2008/07/17(木) 10:37:12そうでないと、アセンブラのインストラクション単位になってしまう。
0018デフォルトの名無しさん
2008/07/17(木) 14:23:26long lTemp = timeStamp.ulSeconds;
char* pszTemp = ::ctime( &lTemp );
のところで
error C2664: 'ctime' : 1 番目の引数を 'long *' から 'const time_t *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
とでてしまいました。
それで
char* pszTemp = ::ctime((time_t *) &lTemp );
と書き替えたらビルドは通ったのですが、これで問題ないのでしょうか?
0019デフォルトの名無しさん
2008/07/17(木) 14:28:200020デフォルトの名無しさん
2008/07/17(木) 14:54:24virtualにしてもコンストラクタ内からだと無視されなかったっけ?
0021デフォルトの名無しさん
2008/07/17(木) 14:59:10time_t の大きさ確認してみ。最悪変なところ書き換えるかも。
VC2005から、時間関係がデフォで64bitになってる。
32bitにするのはなんかマクロがあった。
0022デフォルトの名無しさん
2008/07/17(木) 15:24:47要は、lTempをtime_tにしておけってこった。但し、tieStamp.ulSecondsの仕様に注意な。
>21はどうやらconstが目に入らなかったらしいが。
0023デフォルトの名無しさん
2008/07/17(木) 16:21:55やはり無理でしょうか?
002423
2008/07/17(木) 16:25:59スレ汚し失礼しました。
0025デフォルトの名無しさん
2008/07/17(木) 18:15:38構文にチェックをする。その段階でメタレベル構文にデバッグ情報が埋め込まれ、メモリリーク
や例外のときに情報がセットされる。
君が使うのはまだ難しいと思うよ。
怪しい変数をprintfで表示させるところから初めてはどうだろう?
0026デフォルトの名無しさん
2008/07/17(木) 18:38:120027デフォルトの名無しさん
2008/07/17(木) 20:05:54RELEASE以外でビルドしてない
出来上がるのは別のプログラムだからDEBUGでDEBUGしても何の意味もないよ
アホらしいけど
0028デフォルトの名無しさん
2008/07/17(木) 20:11:50直接関与はしてないけど
大学の研究室にそういうコードは存在した
なんかコード領域を実行時に書き換えてる風な挙動だった
初期化してないポインタでも使ってるような感じ
初代が作ったものを毎年手を入れていくものだから
何年目でそういうことになったのか不明
初代のコードはすっきりしてたのに、最新版は複雑怪奇w
0029デフォルトの名無しさん
2008/07/17(木) 20:48:11たまたまreleaseビルドで動いてるだけだったりしてな。
VSのバージョン上げてプロジェクト変換したら止まったり、
別のPCでexe動かしたら止まったりw
0030デフォルトの名無しさん
2008/07/17(木) 21:03:000031デフォルトの名無しさん
2008/07/17(木) 21:36:18memset(hoge,0.0,sizeof(hoge));
これをするとdoubleからintへの変換っておこられるんですが、何がいけないんですか
0032デフォルトの名無しさん
2008/07/17(木) 21:47:120033デフォルトの名無しさん
2008/07/17(木) 21:49:320034デフォルトの名無しさん
2008/07/17(木) 21:58:58これで全部0.0が入るんじゃね?
0035デフォルトの名無しさん
2008/07/17(木) 22:13:30第二パラメータを0にすればコンパイル自体はできますが、0.0で埋めたことになる保証はありません。
大人しく>34の手を使うかC++のstd::fill()を使うか自分でループを回しましょう。
003631
2008/07/17(木) 22:44:270037デフォルトの名無しさん
2008/07/17(木) 23:19:18それ[0]は0.0だけど、[1]以降は0で埋めたことになるんじゃないか?
まぁ0.0も0も同じことだと思うけど
0038デフォルトの名無しさん
2008/07/17(木) 23:23:45public継承する場合は親クラスのデストラクタは
virtualにしないとまずい?
class Base
{
public:
Base(int a, int b);
~Base();
private:
int m_a;
int m_b;
};
class A : public Base
{
public:
A(int a);
};
これはまずい?
やりたいことは、
「親クラスのコンストラクタを制限したバージョン」
を作りたいんだが。
0039デフォルトの名無しさん
2008/07/17(木) 23:26:03どうせ誰も得しないんだろうからコンパイルエラーにしちゃえばいいのに。
0040デフォルトの名無しさん
2008/07/17(木) 23:26:40呼べるようにしたほうが設計的に美しいんじゃね?
0041デフォルトの名無しさん
2008/07/17(木) 23:46:44>「親クラスのコンストラクタを制限したバージョン」
>を作りたいんだが。
それの理由を書いた方が良いかと。
0042デフォルトの名無しさん
2008/07/17(木) 23:53:25SOCKET sd = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
closesocket(sd);
WSACleanup();
それぞれ関数の後ろでGetProcessHandleCount()で
プロセスが開いているハンドル数を調べると、
WSASocket()で10個ハンドルが開き、closesocketしても減りません。
この10個のハンドルを閉じる方法はないんでしょうか?
WindowsXP Pro SP2、VisualStudio 2008 ExpressEditionです。
スレ違い?
0043デフォルトの名無しさん
2008/07/17(木) 23:59:56いや、これ自体に特に意味はないんだが。
環境依存のメモリリークとか発生しないかと思って。
0044デフォルトの名無しさん
2008/07/18(金) 00:00:34WSACleanup()でも消えない?
0045デフォルトの名無しさん
2008/07/18(金) 00:01:09基底クラスのデストラクタを virtual にする必要があるのは、派生クラスの
インスタンスを基底クラスのポインタ経由で delete する場合。基底クラスの
デストラクタが virtual でないと、派生クラスのデストラクタが呼ばれない。
Base* b = new Derived();
...
delete b; // Derived::~Derived を呼ぶために、Base::~Base を virtual に!!!
RAII でインスタンスを破棄するなら、virtual である必要はない。
0046デフォルトの名無しさん
2008/07/18(金) 00:02:02WSASocket(); closesocket(); を交互に繰り返したら増えつづける?
0047デフォルトの名無しさん
2008/07/18(金) 00:03:28それはわかるんだが、
「子クラスにメンバ変数もデストラクタもない場合」
にどうなるのかってのが知りたかった。
0049デフォルトの名無しさん
2008/07/18(金) 00:06:32ExpressEditionならタダで手に入る…
ってか会社でExpressEdition!
0050デフォルトの名無しさん
2008/07/18(金) 00:10:50Aからさらに継承しない限り問題無し
0051デフォルトの名無しさん
2008/07/18(金) 00:15:40会社でExpressEditionは別にいいだろ
商用利用可だし、IDEはともかくコンパイラが無料なのが重要なわけだから
0052デフォルトの名無しさん
2008/07/18(金) 00:19:200053デフォルトの名無しさん
2008/07/18(金) 00:21:11それなら FactoryMethod でも使えば。
Base* CreateBase(int a);
005449
2008/07/18(金) 00:21:25読んできた
http://www.microsoft.com/japan/msdn/vstudio/express/feature/2008/#visualc
勘違いしていたようだ
0055デフォルトの名無しさん
2008/07/18(金) 00:23:00「ループカウンタがunsignedです」って警告される。
ループカウンタってsigned使うのが普通なの?
vectorとかsize_typeは大体unsignedだと思うんだけど。
0056デフォルトの名無しさん
2008/07/18(金) 00:24:57ありがと!
0057デフォルトの名無しさん
2008/07/18(金) 00:35:03実装上の都合だとでも思ってください。
0スタートのループを、逆条件にしても大丈夫なようにってことかもね。
0058デフォルトの名無しさん
2008/07/18(金) 00:54:320059デフォルトの名無しさん
2008/07/18(金) 00:56:35通常は size_type (unsigned) に合わせないとコンパイラが警告してくれちゃう
0060デフォルトの名無しさん
2008/07/18(金) 00:57:510061デフォルトの名無しさん
2008/07/18(金) 00:58:50const char [2]' から 'charへの変換とかでます。どうしたらよいですか?
char abc(int number){
switch( number )
{
case 0:
return "A";
break;
case 1:
return "B";
break;
・
・
・
0062デフォルトの名無しさん
2008/07/18(金) 01:03:120063デフォルトの名無しさん
2008/07/18(金) 01:04:500064デフォルトの名無しさん
2008/07/18(金) 01:05:090065デフォルトの名無しさん
2008/07/18(金) 01:05:53const char* abc(int number){}
か
0066デフォルトの名無しさん
2008/07/18(金) 01:08:520067デフォルトの名無しさん
2008/07/18(金) 01:22:43constを付けて防禦を計っておくべき、みたいな
0068デフォルトの名無しさん
2008/07/18(金) 01:23:05#include <stdio.h>
#include <stdlib.h>
char * abc(int number){
int rank = 1;
int num = number;
char *numarray;
while(num){
num /= 10;
rank++;
};
numarray = (char *)malloc(sizeof(char)*(rank+1));
sprintf(numarray,"%d",number);
return numarray;
}
int main()
{
char * ans = abc(123);
printf("%s \n",ans);
free(ans);
return 0;
}
0069デフォルトの名無しさん
2008/07/18(金) 01:42:33int size = static_cast<int>(instance_of_vector.size());
for (int i = 0; i < size; ++i) ...;
ってやればいいの?
0070デフォルトの名無しさん
2008/07/18(金) 01:45:15いやまぁ2億を超える要素なんてないだろうけどw
0071デフォルトの名無しさん
2008/07/18(金) 01:49:37要はさ
for(unsigned int i = 10; i > 0; i -= 2)
みたいなことやっちゃったら無限ループになるから
ちゃんと解ってるならunsignedでも良いでしょう
0072デフォルトの名無しさん
2008/07/18(金) 01:51:58だから、OpenMPで警告が出るんだってばさ。
0073デフォルトの名無しさん
2008/07/18(金) 02:05:280074デフォルトの名無しさん
2008/07/18(金) 02:24:29そんな条件は関係ない。デストラクタに virtual が付いてない基底クラスへのポインタが
実際には派生クラスを指している場合、 delete すると未定義動作になる。
0075デフォルトの名無しさん
2008/07/18(金) 02:37:36つhttp://www.kouno.jp/home/c_faq/c1.html#30
0076デフォルトの名無しさん
2008/07/18(金) 03:24:250077デフォルトの名無しさん
2008/07/18(金) 04:49:34元のGNUのソースを同封しないといけませんか??
0078デフォルトの名無しさん
2008/07/18(金) 04:52:32改変せず利用するだけならば、入れなくて良いですか?
GNUのライブラリを使用していると明記する必要ありますか?
0079デフォルトの名無しさん
2008/07/18(金) 05:03:490080デフォルトの名無しさん
2008/07/18(金) 05:25:330081デフォルトの名無しさん
2008/07/18(金) 05:29:24ってことでOK?
具体的には、GNUコードから、WindowsのスタティックリンクかDLLを作って
それを自分のソフトで使用した場合は、自分のプログラムのコードをうpするって事?
0082デフォルトの名無しさん
2008/07/18(金) 08:47:02もしスレ違いなら誘導お願いします。
private継承について質問なのですが、親から継承したメンバはすべてprivateになり
子クラスからアクセスできないものと思っておりますが、違うのでしょうか。
実際コードを書いて確認してみたところ、アクセスできないぽいのですが
サイトによってアクセスは可能と書いているところもあるので混乱しています。
アクセスする方法があれば教えていただきたいです。
それと、private継承を調べると「実装の継承」という言葉がたいてい出てくるのですが、
これの意味がよくわかりません。
「実装の継承」の実際の使い方など教えていただけませんか。
0083デフォルトの名無しさん
2008/07/18(金) 09:06:130084デフォルトの名無しさん
2008/07/18(金) 09:24:31private継承、実装の継承というのは、基底クラスで定義された関数など「実装」のみを継承し、
インターフェイスや性格については基底クラスと同じものを持たなくて良い
=基底クラスのオブジェクトではあれができたから継承先でも出来るだろうという期待が出来ない継承のことかな。
逆にpublic継承というのは、DerivedクラスはBaseクラスの一種であるとみなして操作できなければならなくて、
BaseがCry()と言う関数を持ってたらDerivedも持っていなくてはいけないし(鳴き声は違うにしても)同じような動作をしなくてはいけない。
…という話がEffective C++に詳しく書いてあるので読んでおこう。
0085デフォルトの名無しさん
2008/07/18(金) 10:02:33LGPLかGPLで扱いが変わって来るはず。
glibcとリンクしただけで全てのプログラムが公開されなければいけないなら、
Unix系で商用ソフトなんて作れなくなるよ。
>>81
再配布条件と利用条件は区別して考えてる?
作ったプログラムを公開しないのであれば、何もUPする必要は無いよ。
0086デフォルトの名無しさん
2008/07/18(金) 10:06:58鵜呑みしないで疑っているからここにいるわけで
0087デフォルトの名無しさん
2008/07/18(金) 16:33:35[2] 問題文(含コード&リンク):
配列の要素を昇順にソートしたときの、添え字の順番を配列に記憶するプログラムを書け。
data = {2,6,3,1,2} なら, index = {3,0,4,2,1}である。
元の配列は書き換えてはならない。
qsortなどのライブラリを用いて構わない。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C C++
[4] 期限: 明日
0088デフォルトの名無しさん
2008/07/18(金) 16:52:110089デフォルトの名無しさん
2008/07/18(金) 18:11:05int [] data = { 2, 6, 3, 1, 2 };
int [] index = data.Select((a, i) => new { a, i }).OrderBy(x => x.a).Select(x => x.i).ToArray();
0090デフォルトの名無しさん
2008/07/18(金) 20:53:48回答ありがとうございます
実装への直接的なアクセスをできないようにすることで
実装については変更させず、他の部分のみ変更可能にする
ということなのですかね
Effective C++も探して読んでみます
0091デフォルトの名無しさん
2008/07/18(金) 21:44:50だなあ。
結局unsignedのメリットって1bit表現範囲が広がるくらい?
0092デフォルトの名無しさん
2008/07/18(金) 21:59:320093デフォルトの名無しさん
2008/07/18(金) 22:25:54signedな整数は符号拡張がウザいこともあるし
ビット演算や何かとの相性も良くない
まあ、適材適所で使い分けろ
0094デフォルトの名無しさん
2008/07/19(土) 00:40:43鼻から牛乳がオーバーフローしました
0095デフォルトの名無しさん
2008/07/19(土) 15:30:21境界チェックの比較が1回で済む
0096デフォルトの名無しさん
2008/07/19(土) 17:14:33本当にunsignedなら最適化してくれる
0097デフォルトの名無しさん
2008/07/19(土) 17:16:03いつ誰が構造体に書き換えるかわからないですもんね
0098デフォルトの名無しさん
2008/07/19(土) 19:10:21while( *d++ = *s++ )
文字列コピーできるんですか?
0099デフォルトの名無しさん
2008/07/19(土) 19:17:410100デフォルトの名無しさん
2008/07/19(土) 19:19:200101デフォルトの名無しさん
2008/07/19(土) 19:37:450102デフォルトの名無しさん
2008/07/19(土) 20:21:47void testFunc()
{
for(int i=0; i<10;i++){
CTest test;
test.i = i;
hoge.push_back(test);
}
}
int main(){
testFunc();
for(int i=0; i<hoge.size();i++){ printf("%d\n",hoge[i].i);
}
こんなことしても問題ありませんか?一応表示はされたのですが。
std::vector<int>とかはそのまま数値いれてますけど、
std::vector<クラス>の時もnewしないで入れても平気なのかなって思いまして。
0103デフォルトの名無しさん
2008/07/19(土) 20:28:05push_back内でnewしてコピーしてるのでnewはいらない
で、そのコピーのときにCTestのコピーコンストラクタでメンバのコピーがされる
デフォルトコピーコンストラクタでも問題ないなら特にコーディングしてなくてもおk
デフォルトコピーコンストラクタじゃだめなら自分で書く必要あり
0104デフォルトの名無しさん
2008/07/19(土) 20:38:080105デフォルトの名無しさん
2008/07/19(土) 21:04:33されるのは便利なのですが、さらに進んで
ある行にカーソルを置くとどういう階層のとこに
いるかって機能がついたエディタとかってありますか?
例
main()
{
if(a==1)
{
while(b>1)
{
…
if(c==0)
{
ここ
}
}
}
}
「ここ」にカーソルを置くと
main()->if(b==1)->while(b>1)->if(c==0)
みたいに表示されるやつ
0106デフォルトの名無しさん
2008/07/19(土) 23:33:411つの関数に詰め込みすぎのサインだったりするんじゃないかな。
0107デフォルトの名無しさん
2008/07/19(土) 23:39:330108デフォルトの名無しさん
2008/07/19(土) 23:52:230109デフォルトの名無しさん
2008/07/19(土) 23:53:220110デフォルトの名無しさん
2008/07/19(土) 23:53:26思うだけにしておいたほうがいいと思います
0111デフォルトの名無しさん
2008/07/20(日) 00:06:57闇雲にインライン展開しても速くならないんだな。
0112デフォルトの名無しさん
2008/07/20(日) 00:09:331画面に収まらない関数は書かないのが鉄則ですう
0113デフォルトの名無しさん
2008/07/20(日) 01:01:24関数呼び出しだけでも一画面におさまんなくなって
便利な機能な気がするけど…
ウィンドウプロシージャとかでかい関数はどうしてもできるわ(´・ω・`)
一つのファイルにいっぱい関数詰め込むととか
あとアルゴリズムを激しく書く人はいる気がする。
何千行ものコードを一画面に収まるくらいに
分けたら関数出来過ぎ君だわ
なんかおれ必死な感じだけど、便利な気がするけど…
ないってことは作るしかないんかな。
0114デフォルトの名無しさん
2008/07/20(日) 01:04:080115デフォルトの名無しさん
2008/07/20(日) 01:06:06inlineじゃだめですか?
0116デフォルトの名無しさん
2008/07/20(日) 01:27:26出来ねぇよ、関数分けろ
0117デフォルトの名無しさん
2008/07/20(日) 01:30:330118デフォルトの名無しさん
2008/07/20(日) 01:42:52OK,読み間違えてた
ダイビング土下座しながら吊ってくる
0119デフォルトの名無しさん
2008/07/20(日) 01:43:240120デフォルトの名無しさん
2008/07/20(日) 02:42:46inlineにしててもインライン展開しないこともあるんだったよな確か?
0121デフォルトの名無しさん
2008/07/20(日) 02:50:40マクロにすれば確実にインラインになるけど、デバッグが困る
0122デフォルトの名無しさん
2008/07/20(日) 02:53:58inlineにしなくてもインライン展開されることもあるしね。
0123デフォルトの名無しさん
2008/07/20(日) 03:01:41そういうのあるんだ
古い人だから#defineとか
いっぱい使うとわかんなくなるから
カーニハンとリッチーだっけ?
あれの本だとcはシンプルで
なんとかってのってたけど
いいねそれ。
ただ今の時代では違うのかもだけど。
とりあえず今1万7千行くらい
switchcase文がいっぱいあるわ。
c標準のデータ型以外は
最低限のやつしかwindows.h系のは
使ってない。
でも昔よりは関数で分けるようになったかも
0124デフォルトの名無しさん
2008/07/20(日) 03:31:34それくらいがむしろ普通
0125デフォルトの名無しさん
2008/07/20(日) 03:51:00関数分けするためのマクロが用意されているくらいなのにな。
0126デフォルトの名無しさん
2008/07/20(日) 05:22:05SJISで作ったテキストファイルも普通に読み込んでいると思うのですが何故でしょう?
0127デフォルトの名無しさん
2008/07/20(日) 05:30:130128デフォルトの名無しさん
2008/07/20(日) 05:42:54どうもUTF-8だと思ってたのは勘違いのようですね
文字コードってユーザーとして意識したことないから難しい...
0129デフォルトの名無しさん
2008/07/20(日) 08:55:06そんな鉄則ねえよ。
0130デフォルトの名無しさん
2008/07/20(日) 12:25:290131デフォルトの名無しさん
2008/07/20(日) 12:30:20という言葉があってのう
0132デフォルトの名無しさん
2008/07/20(日) 13:45:18冗談じゃねぇ。
0133デフォルトの名無しさん
2008/07/20(日) 13:49:48こだわってるやつはたいてい頭悪い
0134デフォルトの名無しさん
2008/07/20(日) 13:54:501600x1200?w
寧ろ、3分割して80桁x300行とか嫌そうだw
0135デフォルトの名無しさん
2008/07/20(日) 13:56:380136デフォルトの名無しさん
2008/07/20(日) 14:06:390137デフォルトの名無しさん
2008/07/20(日) 14:10:04上達したら一画面越えてもいいよと教える
0138デフォルトの名無しさん
2008/07/20(日) 14:14:15#pragma message("hogehoge") をマクロにしたいんですが...
次のやり方でコンパイラが怒ります...。
#define _message( str ) #pragma message( str )
どう登録すれば良いんでしょうか?
0139デフォルトの名無しさん
2008/07/20(日) 14:22:41できないんじゃないの?
0140デフォルトの名無しさん
2008/07/20(日) 14:24:270141デフォルトの名無しさん
2008/07/20(日) 14:53:05VC++も2008から__pragmaという名称で同じ機能を用意している。
0142デフォルトの名無しさん
2008/07/20(日) 15:17:57誰が得するんだ…。
0143デフォルトの名無しさん
2008/07/20(日) 15:22:58処理系によってプラグマの書き方が異なる場合
0144デフォルトの名無しさん
2008/07/20(日) 15:37:54いや理論的にはそんなんだけど、俺の未熟な経験からは
使った方が便利だってケースが思い当たらない。
そんで誰が得するのかな、と。
0145デフォルトの名無しさん
2008/07/20(日) 16:06:04処理系A #pragma align packed
処理系B #pragma pack(1)
だとすると、構造体の定義のたびに、
#if defined(_IMPL_A)
#pragma align packed
#elif defined(_IMPL_B)
#pragma pack(1)
#endif
struct S {...}
#if...さらにアライメントを元に戻すpragma
と書かないといけない。
さらに処理系C #pragma options align=packed
を追加したくなったら、もううんざりだ。
0146デフォルトの名無しさん
2008/07/20(日) 16:14:150147デフォルトの名無しさん
2008/07/20(日) 16:17:04うん。実際そうやってた。
でも美しくないんだよねえ。構文的に
0148デフォルトの名無しさん
2008/07/20(日) 16:39:11井戸の中にしかないと思われ。
0149デフォルトの名無しさん
2008/07/20(日) 17:16:25有る関数の中でループを毎に乱数を発生させ、配列に値を保存させようとしたのですが
実行画面では同じ数値に成ってしまいました。デバックをしてみたところ
@1から見ていくと、配列にちゃんと違う数値が入っていき、ループを抜けた
@2までみても違う数値が保存されていました。
@2にブレークポイントを設定し、そこで値を確かめるとListの値には
同じ数値が配列に保存されていました。
全て値がう値が保存されている様にしたいのですが、何が問題になっているのか見当がつきません。
何か対策とかあるのでしょうか
srand( (Uint32)time(NULL) );
m_Tmp = new Object();
@1
for ( Uint32 i=0; i<MAX; ++i )
{
m_List.push_back( *m_Tmp );
m_List[i].SetNum( rand() % 10 );
}
@2
※SetNumは与えられた値を保存させるだけのメソッドです。
0150デフォルトの名無しさん
2008/07/20(日) 17:19:220151デフォルトの名無しさん
2008/07/20(日) 17:22:060152デフォルトの名無しさん
2008/07/20(日) 17:26:020153デフォルトの名無しさん
2008/07/20(日) 17:27:51ちょwww
これはだめでしょ
Object は最初に1回 new しただけでしょ?
そこに値をどんどん入れて行ったら、当然同じインスタンスに値をどんどん突っ込むわけで、
最後には、一番最後に代入した値ばっかりのリストになるよwww
0154デフォルトの名無しさん
2008/07/20(日) 17:28:56Object の定義が怪しい。 SetNum の値をポインタの先に保存してて、 Object のコピーでは
ポインタがコピーされてるとか。
>>153 push_back(*m_Temp) だから、そこが問題じゃないでしょ。
0155デフォルトの名無しさん
2008/07/20(日) 17:29:38SetNumで違う変数に値を保存してました。お騒がせしました orz
0156149
2008/07/20(日) 17:30:23じゃあ152が正しいか。
0157デフォルトの名無しさん
2008/07/20(日) 22:22:03string script="abcde";
string strbuf="";
int moji=0;
for(int i=0;i<script.size();i++){
strbuf+=script[moji];
//ここでstrbufの内容を表示
//ここにwait処理が入る
moji++;
}
strbuf="";
moji=0;
scriptの中身が1バイト文字だと正常に表示されるんですが、
2バイト文字だと文字の背後に・(黒点?)が表示されてしまいます
stringは2バイト文字は使えないんでしょうか?
0158デフォルトの名無しさん
2008/07/20(日) 22:23:270159デフォルトの名無しさん
2008/07/20(日) 22:32:17おそらくstd::stringで1バイトづつ出力させてるんだろうけど、それやっちゃうと2バイト文字は半分ちぎれたりするから正常に表示できない。
ちゃんと2バイト文字は2バイトづつ出力させるか、2バイト固定のUTF-16使えばOK。
荒技としては逆に1バイト文字を使わないという手もある。(全角数字、全角アルファベット、全角記号で代用)
0160デフォルトの名無しさん
2008/07/20(日) 22:35:47数字は全角で書くなりすれば良いわけですね
ありがとうございます
0161デフォルトの名無しさん
2008/07/20(日) 22:44:30UTF-16だから2バイト固定なんてことが許される時代はもう終わっているよ。
0162デフォルトの名無しさん
2008/07/20(日) 22:47:140163デフォルトの名無しさん
2008/07/20(日) 22:52:10標準でなくても、それぞれのプラットホームには必ずあると思うけど。
0164デフォルトの名無しさん
2008/07/20(日) 22:52:400165デフォルトの名無しさん
2008/07/20(日) 22:57:08つUTF-8, UTF-32
0166デフォルトの名無しさん
2008/07/20(日) 22:59:55そんなレガシー技術に頼るぐらいならUnicodeにしとけよ
UTF-8では先頭バイトと後続バイトはMSB側の2bitを見るだけで簡単に区別できるし
先頭バイトだけで後続バイト数は判断できるし
後続バイトがASCII文字と重なるようなこともない
マルチバイト処理は必要だが、レガシーなエンコーディングスキームよりは
ずっといい性質を持っている
0167デフォルトの名無しさん
2008/07/20(日) 23:00:00つwchar_t
0168166
2008/07/20(日) 23:04:30euc-jpやiso2022系では、「lead byteかどうか」は特定の2バイトを見ただけでは
判断できない。
行頭なり何なりから順番に舐めるしかないはずだよ。
>>163の言っているような"iskanji"風のレガシーなクソマクロは、特定の条件でしか
役に立たないものだ。
0169デフォルトの名無しさん
2008/07/20(日) 23:09:52先頭から見ないとわからないってのは、EUCのほうじゃなくてShift JISのほうでは?
0170デフォルトの名無しさん
2008/07/20(日) 23:15:370171デフォルトの名無しさん
2008/07/20(日) 23:18:27皆、思い思いに書いてるだけだよ。
偉そうに見えるのはおそらく・・・
0172デフォルトの名無しさん
2008/07/20(日) 23:23:01EUCで簡単なのは1byteコードと2byteのコードの識別だけで、
lead byteとtrail byteの識別は難しいのでは?
0173デフォルトの名無しさん
2008/07/20(日) 23:31:16内部コードにUTF-8, UCS2, UTF-16, UTF-32以外を使うのは止めておけ。
マジで。
0174デフォルトの名無しさん
2008/07/20(日) 23:40:52固定サイズであるUCS2/UTF-32と考えるのはそれほど問題でないが、
可変サイズであるUTF-8/UTF-16として扱うのは完全にNG
0175デフォルトの名無しさん
2008/07/20(日) 23:43:050176デフォルトの名無しさん
2008/07/20(日) 23:50:50wchar_t=UCS2と想定するのが良い
UTF-16、UTF-32はC++0xが出てくるまで我慢
0177176
2008/07/20(日) 23:53:110178デフォルトの名無しさん
2008/07/21(月) 02:42:010179デフォルトの名無しさん
2008/07/21(月) 08:10:43C++0xでUTF-8リテラルが追加される。u8"文字列"
※ime.nu通すと#以降が消えるので
ttp://ja.wikipedia.org/wiki/C%2B%2B0x#.E6.96.B0.E3.81.9F.E3.81.AA.E6.96.87.E5.AD.97.E5.88.97.E3.83.AA.E3.83.86.E3.83.A9.E3.83.AB
0180デフォルトの名無しさん
2008/07/21(月) 14:04:39とかやってるコードを見かけたのですが、
\b\b\bはどういう意図でやっているのでしょうか?
\bはバックスペースのようですが…
0181デフォルトの名無しさん
2008/07/21(月) 14:20:490182180
2008/07/21(月) 14:40:00ファイルコピーの進捗状態をコンソール上の同じ位置で
パーセント表示する際などに
使うわけですね。なるほど。
0183デフォルトの名無しさん
2008/07/21(月) 19:36:23char **pp = malloc(sizeof(char*) * 100);
という式はcharのポインタのポインタを100確保したという意味でいいのですか?
pp[0]はpと同じ意味ですか?
0184デフォルトの名無しさん
2008/07/21(月) 19:42:56あくまでも指定されたサイズのエリアを確保しているだけで、ポインタを確保している訳ではありません。
上記コード上ではpとpp[0]には何の関連もないけど、
p = pp[0];ができる?という意味なら、できる。
0185デフォルトの名無しさん
2008/07/21(月) 22:34:01同じ意味とは型が同じかという意味でした。
0186デフォルトの名無しさん
2008/07/21(月) 23:08:32tchar.hがないってエラーになるんだが、
Linuxでは何てヘッダを読み込めば_TCHARとか_T()とか使える?
自分で定義するしかない?
0187デフォルトの名無しさん
2008/07/21(月) 23:17:410188デフォルトの名無しさん
2008/07/22(火) 04:22:320189デフォルトの名無しさん
2008/07/22(火) 04:24:17wchar_t が UCS4 だったりすることもあるんじゃないのか。
0190デフォルトの名無しさん
2008/07/22(火) 14:21:020191デフォルトの名無しさん
2008/07/22(火) 14:28:47WしかないAPIもある
0192デフォルトの名無しさん
2008/07/22(火) 14:34:56そんな話はしていない
0193デフォルトの名無しさん
2008/07/22(火) 16:50:58UCS2でも4でも動くように書くしかないかと
あるいはライブラリを使うか
0194デフォルトの名無しさん
2008/07/22(火) 17:33:550195デフォルトの名無しさん
2008/07/22(火) 20:54:18その処理系の名前教えて。
いや、煽りとかじゃなくて普通に知りたいので。
0196デフォルトの名無しさん
2008/07/22(火) 21:25:07Linux以外のほぼすべてのUNIX。
すくなくとも、Solaris FreeBSD NetBSDはUnicodeではなかったはず。
0197デフォルトの名無しさん
2008/07/22(火) 22:00:160198デフォルトの名無しさん
2008/07/22(火) 22:02:46ちゃんとUNIXライクOSと言いましょう
0199デフォルトの名無しさん
2008/07/22(火) 22:11:08http://ml.tietew.jp/cppll/cppll/article/862
0200デフォルトの名無しさん
2008/07/22(火) 22:40:13gcc 2.xだろ?
0201デフォルトの名無しさん
2008/07/22(火) 22:55:17あまりにも有名すぎる話
0202デフォルトの名無しさん
2008/07/22(火) 23:37:26いやその、今のgccはinput-charsetだのexec-charsetだのwide-exec-charsetだの
指定できるだろ?
0203デフォルトの名無しさん
2008/07/23(水) 01:49:03*i |= 3;
はちゃんと
*i = *i | 3;
に展開されるのでしょうか?
0204デフォルトの名無しさん
2008/07/23(水) 02:26:540205デフォルトの名無しさん
2008/07/23(水) 02:32:22「展開される」の意味が分からない
Cだと結果は動作は等しくなる
C++だとoperatorのオーバーロードがあるのでなんともいえない
0206デフォルトの名無しさん
2008/07/23(水) 10:02:00string* p;
public:
test() { p = new string; }
~test() { delete p;}
}
main() {
test obj1;
test obj2 = obj1;
}
2度目のdeleteにてセグメンテーション違反で落ちるコードです
教科書ではコピーコンストラクタを上書きして
ポインタの指す先までコピーするようにしてるのですが
delete時にチェックする方法はあるんでしょうか?
実用性は考えていませんが、興味があります
環境:
Linux kernel 2.6-686
GNU C++ compiler 4.1.1
0207デフォルトの名無しさん
2008/07/23(水) 10:07:150208デフォルトの名無しさん
2008/07/23(水) 10:13:42obj2.pはobj1.pと同じだから落ちて当たり前。
何がしたいのか分からないけど、ポインタにNULLポインタを入れておけば
それがdeleteされても問題なく動く。
0209デフォルトの名無しさん
2008/07/23(水) 10:13:50> delete時にチェックする方法はあるんでしょうか?
参照カウンタをどこかに持つとか。
0210デフォルトの名無しさん
2008/07/23(水) 10:18:20バーライドしなきゃいけないか。
0211デフォルトの名無しさん
2008/07/23(水) 10:25:16どこでNULLをセットすればいいですか?
>>209
なるべく簡単な方法がいいんですよね
catchしちゃえばいいのかな
このアドレスは使っちゃ駄目みたいなのは
カーネルに聞けば教えてくれるのかなと思ったんですが
0212デフォルトの名無しさん
2008/07/23(水) 10:33:33あくまでチェックしたいってことなら、方法は無い。
ヌルをセットするとかして、とにかく落ちないようにするなら auto_ptr でも使っとくのが簡単。
#include <memory>
#include <string>
using std::string;
using std::auto_ptr;
class test {
auto_ptr<string> p;
public:
test() : p(new string) {}
};
int main() {
test obj1;
test obj2 = obj1;
}
0213デフォルトの名無しさん
2008/07/23(水) 11:37:38規格ではスタックが使われるのかすら決まってなかった気がする
0214デフォルトの名無しさん
2008/07/23(水) 12:39:32string*ではなくstringをメンバに持たせる
0215デフォルトの名無しさん
2008/07/23(水) 16:25:27private:
int fuga;
public:
void setfuga(int a){ fuga = a; }
int getfuga(){ return fuga; }
};
class foo{
private:
std::vector<hoge> var;
public:
void sethoge(hoge hage){ var.push_back(hage); }
std::vector<hoge> getvar(){ return var; }
};
int main(){
foo foo0;
hoge hoge0;
hoge0.setfuga(1);
foo0.sethoge(hoge0);
std::vector<hoge>::iterator itr;
itr = foo0.getvar().begin();
std::cout << foo0.getvar().at(0).getfuga() << std::endl;
std::cout << (*itr).getfuga();
return 0;
}
これを実行すると、一つ目のcoutは正常に出力(1)されますが、二つ目はでたらめな値が出ます。
itr = foo0.getvar().begin()はfoo0.getvar().at(0)を指すiteratorだと思うので、同じ結果になると
思っているのですが…。どなたかお教えいただけると助かります。
0216デフォルトの名無しさん
2008/07/23(水) 16:35:26getvarの戻り値はfoo0.varそのものではなくfoo0.varの一時的なコピーで、次の文に移る前には破棄される
getvarはfoo0.varのコピーを返すのではなくfoo0.varへの参照を返す必要がある
0217デフォルトの名無しさん
2008/07/23(水) 16:38:55その通りでした。ちょうど思いついたところでした。
すみません、どうもありがとうございます。
0218デフォルトの名無しさん
2008/07/23(水) 20:39:07HOGE *hoge;と宣言します。
void function(HOGE *hoge){
}という関数に
function(hoge)と渡すと参照渡しになってますか?
0219デフォルトの名無しさん
2008/07/23(水) 20:42:42それはC++でいうところの参照ではありません
0220デフォルトの名無しさん
2008/07/23(水) 20:44:260221デフォルトの名無しさん
2008/07/23(水) 20:46:440222デフォルトの名無しさん
2008/07/23(水) 20:47:380223デフォルトの名無しさん
2008/07/23(水) 21:01:10俺だけじゃないはず。
0224デフォルトの名無しさん
2008/07/23(水) 21:33:45bar(HOGE* pFuga){ }
baz(HOGE& fuga){ }
func()
{
HOGE hoge;
HOGE *pHoge;
// 値渡し
foo(hoge);
// ポインタ渡し(アドレス渡し)
bar(pHoge);
// 参照渡し
baz(hoge);
}
0225デフォルトの名無しさん
2008/07/23(水) 21:40:34foo(HOGE &fuga)
HOGE hoge;
foo(hoge);
この場合どっちが優先されますか?
0226デフォルトの名無しさん
2008/07/23(水) 21:43:00自分でコンパイルしてみては?
0227デフォルトの名無しさん
2008/07/23(水) 21:44:40俺は試しました。VC++2005EE
XXX.cpp(19) : error C2668: 'foo' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照)
XXX.cpp(11): 'void foo(HOGE &)' の可能性があります。
XXX.cpp(7): または 'void foo(HOGE)'
引数リスト '(HOGE)' を一致させようとしているとき
0228デフォルトの名無しさん
2008/07/23(水) 21:44:440229デフォルトの名無しさん
2008/07/23(水) 21:50:020230デフォルトの名無しさん
2008/07/23(水) 22:08:24stdafx.hみたいに一つのヘッダファイルでSTLやboostとかのヘッダ
全部読み込むのはやめたほうがいい?
0231デフォルトの名無しさん
2008/07/23(水) 22:44:370232デフォルトの名無しさん
2008/07/23(水) 23:54:09225は自分じゃないです。
ポインタ渡しした場合はbar関数の中で値を書き換えても、元には影響ないんですか?
0233デフォルトの名無しさん
2008/07/24(木) 00:03:05ポインタを引数に指定しないとだめか、そうでないかの違いで、影響あることには変わりないよ
0234デフォルトの名無しさん
2008/07/24(木) 00:10:51ポインタ渡しは影響する
参照渡しも影響する
値渡しだけは影響しない
0235デフォルトの名無しさん
2008/07/24(木) 00:21:320236デフォルトの名無しさん
2008/07/24(木) 00:23:12bar(HOGE* pFuga){
*pFuga = ...; //影響する
pFuga = ...; //影響しない
}
0237デフォルトの名無しさん
2008/07/24(木) 02:02:44そういう理由もあるだろうし、依存関係は最小限にしたほうがいいと思うよ。
g++ でもプリコンパイル済みヘッダ自体は使えたような気がする。使い方が
全然違ったはずだけど。
0238デフォルトの名無しさん
2008/07/24(木) 09:04:36嘘をつくな
0239デフォルトの名無しさん
2008/07/24(木) 13:36:21クラスもコピーコンストラクタ呼ばれて値渡しされるよね?
0240デフォルトの名無しさん
2008/07/24(木) 13:39:58コンパイルできないはず
0241240
2008/07/24(木) 13:42:250242デフォルトの名無しさん
2008/07/24(木) 13:43:59でないと、struct A a, b; a = b;というC由来のコードがコンパイルできなくなってしまう。
0243240
2008/07/24(木) 13:44:400244240
2008/07/24(木) 13:47:05勘違いしてた。
自分がよくコンパイルエラー出すもんで。。w
0245デフォルトの名無しさん
2008/07/24(木) 13:52:09中間インスタンス生成+コピーコンストラクタ呼んだ後は 参照でわたしてる?
呼び出し元のインスタンスには影響を与えないけど、スタックに実体を積んでいるわけではない
みたいな構造
0246デフォルトの名無しさん
2008/07/24(木) 13:53:440247デフォルトの名無しさん
2008/07/24(木) 13:55:27でboostいれたいんですけど
バイナリ配布しているVC2008しか成功しません
1.35のそれぞれのバイナリ置いてある所無いですか?
0248デフォルトの名無しさん
2008/07/24(木) 14:17:41boostてdrwinとvc7以上で主に動くんですね borlandはかなり駄目ですね
0249デフォルトの名無しさん
2008/07/24(木) 14:39:090250デフォルトの名無しさん
2008/07/24(木) 19:59:10boost::regex で,置換する時に置換フォーマットが $10 だと 10 番目のキャプチャ要素に置換されるんだけれど,
これを一番目のキャプチャ要素 $1 + 0 にするにはどうしたらいいの?
0251デフォルトの名無しさん
2008/07/24(木) 20:00:54regex を二回呼べばいいんでは?
0252デフォルトの名無しさん
2008/07/24(木) 20:09:39すいません 2 回呼ぶと言うのはどういう意味でしょうか?
0253デフォルトの名無しさん
2008/07/24(木) 20:23:33簡単な例をplz
0254デフォルトの名無しさん
2008/07/24(木) 20:29:020255デフォルトの名無しさん
2008/07/24(木) 20:31:59"\\10"で大丈夫。sed format string syntaxってやつだ。
"${1}0"はだめ。
#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
boost::regex re("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.).*");
std::string s ="abcdefghijklmn";
std::cout << boost::regex_replace(s, re, "\\10") << std::endl;
return 0;
}
0256デフォルトの名無しさん
2008/07/24(木) 20:34:490258デフォルトの名無しさん
2008/07/25(金) 10:23:37test_classは別に定義してあるとします。これだとファイル出力です
#include <fstream>
#include <string>
int main()
{
std::ofstream fp("XXX.xml");
boost::archive::xml_oarchive oarchive(fp);
test_class Z;
Z.a = 22; Z.b = 7;
oarchive << boost::serialization::make_nvp("Root", Z);
}
0259デフォルトの名無しさん
2008/07/25(金) 10:34:45よくわからんが
ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?
0260デフォルトの名無しさん
2008/07/25(金) 10:35:02型 const boost::serialization::nvp<T>の出力方法がわかればいいのですが
0261デフォルトの名無しさん
2008/07/25(金) 10:36:58xml_oarchive oarchive(fp); → xml_oarchive oarchive(cout);
0262デフォルトの名無しさん
2008/07/25(金) 10:41:06string s;
boost::archive::xml_oarchive oarchive(s);
1番目の引数を 'std::string' から 'std::ostream &' に変換できません。
0263デフォルトの名無しさん
2008/07/25(金) 10:46:46つ[stringstream]
0264デフォルトの名無しさん
2008/07/25(金) 10:50:320265デフォルトの名無しさん
2008/07/25(金) 13:06:02参照なんて使わない!もしくはできる限り全て参照を使う!って方いますか?
どうもポインタと参照の違いが分かりません(使いどころとして)
0266デフォルトの名無しさん
2008/07/25(金) 13:46:14C++では、ポインタを使わないといけないケース以外はポインタを使わない。
使うとしても、大抵はイテレータと言う形で使っている。
必要に迫られれば、ポインタを使うこと自体は吝かではない。
0267デフォルトの名無しさん
2008/07/25(金) 13:50:08全て const char & とか const std::string & を使うの?
0268デフォルトの名無しさん
2008/07/25(金) 13:51:130269デフォルトの名無しさん
2008/07/25(金) 13:58:18それ以外はポインタ
0270デフォルトの名無しさん
2008/07/25(金) 14:08:14if(&s==NULL){
std::cout << "(NULL)" << std::endl;
}
else{
std::cout << &s << std::endl;
}
}
int main(){
test(*"aaa");
test(*static_cast<const char*>(NULL));
return 0;
}
--結果---
aaa
(NULL)
扱えないことはない。
でもまぁ正直言って、これはないw
0271265
2008/07/25(金) 14:12:35それをわざと参照でやる理由はなんでしょう?
c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。
ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか?
int n;
int &func();
void main()
{
int i = 0;
func() = i;
}
int &func()
{
return n;
}
0272デフォルトの名無しさん
2008/07/25(金) 14:29:06参照はポインタと違っていい一般保護例外を起こすようなアドレスを排除できるらしいよ。
0273デフォルトの名無しさん
2008/07/25(金) 14:35:22少なくともread-onlyな引数を、効率のためにconst参照渡しがしたいケースなら、
素直にreference使ったほうが便利だよ
>>272の言うような問題もないし、呼ぶ側としても
ただの値渡しと同じように記述できて、型変換や何かが必要な場合もコンパイラが面倒
見てくれるからな
ユーザ定義演算子などでは、意図した記法を実現したければ、
事実上参照以外に選択肢が無いこともある
0274デフォルトの名無しさん
2008/07/25(金) 14:36:21やってやれんことはないな
void hoge(double &d) { }
hoge(*(double *)NULL);
hoge(*(double *)123);
0275デフォルトの名無しさん
2008/07/25(金) 14:37:23const参照になるけど、
・良いかどうかは別にして、コンストラクタの暗黙呼び出しが使える。
・一時オブジェクトが渡せる。
という利点はある。
struct IntX {
int n;
IntX():n(0){}
IntX(int argn):n(argn){}
};
void test(const IntX& a){
std::cout << a.n << std::endl;
}
void test2(const IntX* a){
std::cout << a->n << std::endl;
}
int main(){
test(IntX());
test(10);
//test2(&IntX(20)); //左辺値でないのでコンパイル不可
return 0;
}
あと、>>272がツッコミ入れてくれた通り、
>>270で書いた *static_cast<const char*>(NULL) みたいなネタは
実際のプログラムでやったら(無効な参照を作ったら)駄目だからね。
0276265
2008/07/25(金) 14:47:48もう少し理解を深めてから出直したいと思います。
0277デフォルトの名無しさん
2008/07/25(金) 14:48:21参照が追加になったのは演算子のオーバーロードやコピーコンストラクタで
必要に迫られたからということらしい。
通常では戻り値はいいとして引数で使うと変数の変化が追いにくくなるので
多用はしないということだった。
0278265
2008/07/25(金) 14:55:17同じネタが上がるということは、同じ疑問を持つ人がいるということですかね。
オーバーロードやコピーコンストラクタのあたりも見直してみます。
0279デフォルトの名無しさん
2008/07/25(金) 14:56:12その場合は呼び出し元に問題があることが確定するのが、参照にしとく利点になるかな?
ポインタだと、渡された側でヌルチェックすべきかどうか気になってしまう。
0280デフォルトの名無しさん
2008/07/25(金) 14:57:23まだ勉強中って書いてあったね、ごめん。
慣れるまで、参照でなければならない箇所以外は
ポインタで良いと思うよ。
たぶん、経験が自然に教えてくれる。
0281デフォルトの名無しさん
2008/07/25(金) 14:57:42こんなん落ちないの?
0282デフォルトの名無しさん
2008/07/25(金) 15:01:25ちなみに言語規約違反な。
0283デフォルトの名無しさん
2008/07/25(金) 15:04:080284デフォルトの名無しさん
2008/07/25(金) 15:08:090285デフォルトの名無しさん
2008/07/25(金) 15:08:490286デフォルトの名無しさん
2008/07/25(金) 15:13:290287デフォルトの名無しさん
2008/07/25(金) 17:21:06ファイル間のインクルードの関係が以下の時、変更してないファイルも毎回コンパイルされるんですが回避策ってありますか?
A.h
B.h(include A.h)
A.cpp(include A.h)
B.cpp(include A.h,B.h)
オナがいします。
0288デフォルトの名無しさん
2008/07/25(金) 17:22:52ヘッダを変更しなければいいだけじゃないの?
0289デフォルトの名無しさん
2008/07/25(金) 17:31:40簡単なプログラムなのですが、回答よろしくお願いします
void hogefunc(char *);
void main()
{
char a[256] = "abc 0001";
hogefunc(a);
}
void hogefunc(char *tmp)
{
char b[256];
strcpy(b,tmp);
}
//////////////
デバッグを行うと、bの中身が"abc"のみでaの中身"abc 0001"が文字列コピーできていません。
予想だと、aの中身とbの中身は同じになると思ってました。なぜ0001が切られたのでしょうか?
よろしくお願いします
0290289
2008/07/25(金) 17:34:42このプログラムの場合、aの中身とbの中身を同じにするにはどうすればいいでしょうか?
0291デフォルトの名無しさん
2008/07/25(金) 17:34:570292デフォルトの名無しさん
2008/07/25(金) 17:35:57void main()
{
char a[256] = "abc 0001";
hogefunc(a);
}
void hogefunc(char *tmp)
{
char b[256];
strcpy(b,tmp);
printf("%s",b);
}
で試したけどちゃんと表示されてました
0293デフォルトの名無しさん
2008/07/25(金) 17:35:58んなこたぁーない
もう少しデバッグのステップ続けてみ
0294デフォルトの名無しさん
2008/07/25(金) 17:36:21どうやってコンパイルしてる?
make 使ってるのなら makefile 見せてみ
0295デフォルトの名無しさん
2008/07/25(金) 17:37:42"abc 0001"
^ 実はこれが\0というオチを予想
0296デフォルトの名無しさん
2008/07/25(金) 19:01:40どうやらファイル名が長すぎるのが原因のようでした。
最小限の再現作ってたらincludeのみのヘッダファイルが二個だけになったので^^;
0297デフォルトの名無しさん
2008/07/25(金) 19:11:07In function `GaussRandom':: undefined reference to 'sqrt’と In function `GaussRandom':
: undefined reference to `exp'というエラーがでて実行できません。もちろん<math.h>は定義しました。
レポート課題なのでマジで困ってます。是非教えてください。ソースを下に載せておきます。
ちなみにxが一様乱数で、yが正規乱数です。
double GaussRandom()
{
double x;
double y;
x=UniformRandom();
y=1/sqrt(2)*exp(-1/2*x*x);
return y;
}
double UniformRandom()
{
double x;
int r=1;
r=1229*r+351750;
x=r/1664501;
return x;
}
0298デフォルトの名無しさん
2008/07/25(金) 19:29:31お前いい加減にしろよ。
0299デフォルトの名無しさん
2008/07/25(金) 19:53:42変数寿命が切れてるから上書きされているんじゃないの?
0300デフォルトの名無しさん
2008/07/25(金) 20:23:03分からない、全然分からない。
どこが分からないのかすら分からない。
0301デフォルトの名無しさん
2008/07/25(金) 20:28:50じゃあメンバ関数ポインタでぐぐるんだ
0302デフォルトの名無しさん
2008/07/25(金) 20:35:00関数ポインタをメンバに含めると初期化できませんよね?こんな風に
void (*pf[])() = {hoge, piyo, foo};
もう普通に関数にした方がいいのかな……。
0303デフォルトの名無しさん
2008/07/25(金) 20:39:47X (*f)(X &, X &) = +;
X (*f)(X &, X &) = &+;
X (*f)(X &, X &) = ::+;
X (*f)(X &, X &) = &::+;
X (*f)(X &, X &) = *::+;
X (*f)(X &, X &) = operator +;
X (*f)(X &, X &) = &operator +;
X (*f)(X &, X &) = &::operator +;
とか色々試したんですが「;が足りません」だの「operatorの位置が不正です」だのなんだの
構文に文句付けられて通りません
取り方があれば教えて下さい
0304デフォルトの名無しさん
2008/07/25(金) 20:42:200305デフォルトの名無しさん
2008/07/25(金) 20:46:28これでいけたぞ
#include <stdio.h>
struct X{}x;
X operator+(X&, X&){printf("x");return X();}
int main(){
X (*f)(X&, X&) = operator+;
f(x,x);
}
0306デフォルトの名無しさん
2008/07/25(金) 20:53:37#include <stdio.h>
class A{
static void (A::*pf[])();
public:
void hoge(){ printf("hoge"); }
void piyo(){ printf("piyo"); }
void foo(){ printf("foo"); }
void call(){ for(int i = 0; i < 3; i++) (this->*pf[i])(); }
};
void (A::*A::pf[])() = { &A::hoge, &A::piyo, &A::foo };
int main() {
A().call();
}
0307デフォルトの名無しさん
2008/07/25(金) 20:56:100308デフォルトの名無しさん
2008/07/25(金) 21:24:13データベースやファイルに書き込むなどの方法を取らずに、出来る方法があれば是非知りたいです。
0309デフォルトの名無しさん
2008/07/25(金) 21:27:34JNIと相談してみてください。
0310デフォルトの名無しさん
2008/07/25(金) 21:29:000311デフォルトの名無しさん
2008/07/25(金) 21:30:24ありがとうございます。
あとはゆっくり中身を理解したいと思います。
0312デフォルトの名無しさん
2008/07/25(金) 22:25:34普通にclassファイルがあれば、望みは全て叶うでしょう。
実行中のプログラムとかCORBAとかその他みたいなプロセス間通信の事を言っているのなら、そういうインターフェースを自分で作ってください。
0313デフォルトの名無しさん
2008/07/25(金) 22:52:23#include <math.h> と書いてありますか?
手元のコンパイラで試しますので、全文をどこかにアップロードしていただけますか?
0314デフォルトの名無しさん
2008/07/25(金) 23:04:42http://pc11.2ch.net/test/read.cgi/tech/1215568848/919-921
0315デフォルトの名無しさん
2008/07/25(金) 23:18:23>>308に言ってあげてください
0316デフォルトの名無しさん
2008/07/26(土) 09:16:53この場合ってループで回して一文字ずつ処理するしかないんですかね?
0317デフォルトの名無しさん
2008/07/26(土) 09:19:56言ってる意味が分からないのでソースで。
0318デフォルトの名無しさん
2008/07/26(土) 09:23:35としか・・・
0319デフォルトの名無しさん
2008/07/26(土) 09:44:13>のですが一文字目は出来ますがふた文字目以降ができません。
0320デフォルトの名無しさん
2008/07/26(土) 09:45:24ソースだせソースだせってわからないだけでしょ?それをソースだせって馬鹿なの?
0321デフォルトの名無しさん
2008/07/26(土) 09:48:350322デフォルトの名無しさん
2008/07/26(土) 09:48:510323デフォルトの名無しさん
2008/07/26(土) 09:52:290324デフォルトの名無しさん
2008/07/26(土) 09:56:490325デフォルトの名無しさん
2008/07/26(土) 12:29:550326デフォルトの名無しさん
2008/07/26(土) 12:59:33JNIを調べて試してみましたが,自分の場合は使えなさそうです.
JAVAソースを書いて→ヘッダー作成→C++ソース作成
という順序のようですが,今の状態ではC++ソースとJAVAソースが全然別のアプリケーションとして完成していて,
C++アプリで使っているデータをJAVAで扱いたいという事なんですが…。
C++でデータを自分自身のIPに送って,JAVAでそれを取得するというのを今考えているんですが….
0327デフォルトの名無しさん
2008/07/26(土) 13:04:530328デフォルトの名無しさん
2008/07/26(土) 13:06:250329デフォルトの名無しさん
2008/07/26(土) 13:19:36(2)だと、クッキーの設定はちゃんとしてるのに書き込み確認画面のまま止まってる。
つまりクッキーの設定がうまくいってないみたいなんだが、デバッガで文字列を確認してみても正常だし
そのデバッガで確認した文字列を手動で書いて送信するとうまくいく。
0330デフォルトの名無しさん
2008/07/26(土) 13:20:270331デフォルトの名無しさん
2008/07/26(土) 14:00:26それでも一応可能なんですが,
取得したデータに対応した動きみたいなモノを作らないといけない為,
JAVA側でテキストファイルをずっと参照し続け,更新があった場合○○する.
といった風な感じになってずっと参照し続けるというのが気持ち悪いから避けたいんです.
0332デフォルトの名無しさん
2008/07/26(土) 14:01:00プロセス間通信とか、XMLでシリアライズしたのを渡すとか。
0333デフォルトの名無しさん
2008/07/26(土) 14:55:33自分で書いたのは↓です。
#include <iostream>
using namespace std;
int main()
{
int i;
cout << "1〜10までの偶数を出力します\n";
for(i = 1; i <= 10; i++){
if(i % 2 == 1){
continue;
}
cout << i << "です\n";
}
return 0;
}
0334デフォルトの名無しさん
2008/07/26(土) 14:56:34cout << i << "です\n";
}
0335デフォルトの名無しさん
2008/07/26(土) 14:58:060336デフォルトの名無しさん
2008/07/26(土) 14:59:02ありがとうございます
0337デフォルトの名無しさん
2008/07/26(土) 14:59:380338デフォルトの名無しさん
2008/07/26(土) 15:01:390339デフォルトの名無しさん
2008/07/26(土) 15:07:520340デフォルトの名無しさん
2008/07/26(土) 15:08:350341デフォルトの名無しさん
2008/07/26(土) 15:31:54☆
☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
と表示させるコードを書いてみたのですが、もっと簡単に書く方法ありませんか?
#include <iostream>
using namespace std;
int main()
{
int i;
for(i = 1; i <= 5; i++){
if(i == 1){
cout << "☆\n";
} else if (i == 2){
cout << "☆☆\n";
} else if (i == 3){
cout << "☆☆☆\n";
} else if (i == 4){
cout << "☆☆☆☆\n";
} else if (i == 5){
cout << "☆☆☆☆☆\n"; }
}
return 0;
}
0342デフォルトの名無しさん
2008/07/26(土) 15:34:260343デフォルトの名無しさん
2008/07/26(土) 15:35:550344デフォルトの名無しさん
2008/07/26(土) 15:36:47cout << "☆\n☆☆\n☆☆☆\n☆☆☆☆\n☆☆☆☆☆";
0345デフォルトの名無しさん
2008/07/26(土) 15:41:25そこはif文じゃなくて、switchで場合分けするべきだと思うんだ。
0346デフォルトの名無しさん
2008/07/26(土) 15:42:47いやswitchにしてもまだおかしいだろwwww
0347デフォルトの名無しさん
2008/07/26(土) 15:44:040348デフォルトの名無しさん
2008/07/26(土) 15:46:100349デフォルトの名無しさん
2008/07/26(土) 15:53:45#include <iostream>
using namespace std;
int main()
{
int i;
int j;
for(i = 1; i <= 5; i++){
for(j = 1; j <= i; j++){
cout << "☆";
}
cout << '\n';
}
return 0;
}
これでも同じように表示されたましたけど 考え方はあってますか? それとも、もっと簡単な方法があるのでしょうか?
0350デフォルトの名無しさん
2008/07/26(土) 15:56:42個人的に
for(i = 0; i < 5; i++){
for(j = 0; j < i; j++){
の方が好き
0351デフォルトの名無しさん
2008/07/26(土) 15:58:14なるほど0からのカウントですか。
もっと分かりやすいコードが書けるように頑張ってみます。
0352デフォルトの名無しさん
2008/07/26(土) 15:58:55そこは繰り返しじゃなくて再帰を使うべきだな。
void print_hosi(int num);
void print_hosi(int num)
{
if ( num <= 0 ) { return; }
for ( int i = 0; i < num; i++ ) { cout << "☆"; }
cout << endl;
print_hosi( num - 1 );
}
0353デフォルトの名無しさん
2008/07/26(土) 16:10:37☆
☆☆
☆☆☆
☆☆☆☆
☆☆☆☆☆
と表示させるなら
for(i = 0; i < 5; i++){
for(j = 0; j <= i; j++){
だと思います。
0354デフォルトの名無しさん
2008/07/26(土) 16:14:39for(i = 0; i < 5; i++){
for(j = 0; j < i+1; j++){
にするかな、気分の問題だけど
0355デフォルトの名無しさん
2008/07/26(土) 16:17:28for(j = 0; j < j; j++)
0356デフォルトの名無しさん
2008/07/26(土) 16:18:080357デフォルトの名無しさん
2008/07/26(土) 16:19:28それで実行したら
-----------
改行
☆
☆☆
☆☆☆
☆☆☆☆
-----------
でした。
0358デフォルトの名無しさん
2008/07/26(土) 16:19:330359デフォルトの名無しさん
2008/07/26(土) 16:29:21for(i = 0; i < 5; i++){ cout << "☆";
for(j = 0; j < i; j++){ cout << "☆";
}
cout << "\n";
}
でも出来るけど、>>355が正解だろうな。
0360デフォルトの名無しさん
2008/07/26(土) 16:45:24for(int i=0; i<5; i++){
std::cout << "☆";
for(int j=0; j<i; j++){
std::cout << ",";
std::cout << "☆";
}
std::cout << "\n";
}
みたいな感じに落ち着くことも多い。
0361デフォルトの名無しさん
2008/07/26(土) 16:47:44#include <iomanip>
int main() {
int i, j;
std::cout.fill('☆');
for(i = 1; i <= 5; i++)
std::cout<<std::setiosflags(std::ios::right)<<std::setw(i)<<""<<std::endl;
return 0;
}
0362デフォルトの名無しさん
2008/07/26(土) 17:00:180363デフォルトの名無しさん
2008/07/26(土) 17:09:26なんだと
0364デフォルトの名無しさん
2008/07/26(土) 17:09:38for(int i=0; i < 5; i++) {
str += "☆";
std::cout << str;
}
std::cout << "\n";
0365デフォルトの名無しさん
2008/07/26(土) 17:11:16寄生獣ですね、わかります。
0366デフォルトの名無しさん
2008/07/26(土) 19:54:58StartServiceCtrlDispatcher()で失敗します
GetLastError()で1063が取れるんですけど、どうすればいいんでしょうか?
環境はxp sp2、vc++2005でやってます
void ErrorHandler( char *s, DWORD err )
{
std::cout << s << std::endl;
std::cout << "Error number: " << err << std::endl;
ExitProcess( err );
}
void WINAPI ServiceMain( DWORD argc, LPTSTR *argv )
{
// 空
}
void main()
{
char *SERVICE_NAME = "BeepService";
SERVICE_TABLE_ENTRY serviceTable[] = {
{ SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
};
// SCMで登録する
BOOL success = StartServiceCtrlDispatcher( serviceTable );
if( !success )
ErrorHandler( "In StartServiceCtrlDispatcher", GetLastError() );
}
0367デフォルトの名無しさん
2008/07/26(土) 20:23:00よくわからんが、ちゃんとサービスとしてSCMのデータベースに登録済みで、
SCMからサービスとして起動されたときにそういうエラーが出ているの?
ただのコンソールアプリとして普通にキックしたときに
StartServiceCtrlDispatcher()が失敗するのはただの仕様なんじゃないの
0368デフォルトの名無しさん
2008/07/26(土) 22:02:45全く方法が解りません・・・。
誰か助けてください。
その際関数のオーバーロードを必ず使用する事、と言われました。
実は問題の意味があまり分かってなかったり。疑似変換とは・・・?
0369デフォルトの名無しさん
2008/07/26(土) 22:05:400370デフォルトの名無しさん
2008/07/26(土) 22:08:250371デフォルトの名無しさん
2008/07/26(土) 22:10:58でもオーバーロードなんか必要ないしなぁ・・・
0372デフォルトの名無しさん
2008/07/26(土) 22:13:17とりあえず考えられる事をいくつかプログラムしてみます。
疑似変換・・・・か。
0373デフォルトの名無しさん
2008/07/26(土) 22:20:580374デフォルトの名無しさん
2008/07/26(土) 22:22:31こんなん?
真夜中の電話、不吉な感じがイヤン
#include<iostream>
#include<string>
//ここでオペレータをほげほげ
int main(void){
double x=1.2345;
std::string str;
str=x;
std::cout << str << std::endl;
return 0;
}
0375デフォルトの名無しさん
2008/07/26(土) 22:33:260376デフォルトの名無しさん
2008/07/26(土) 22:37:310377デフォルトの名無しさん
2008/07/26(土) 23:15:40#include <iostream>
using namespace std;
//関数の宣言
inline int square(int x);
inline double square(double x);
int main()
{
int i;
double j;
cout << "整数を入力してください\n";
cin >> i;
int sum1 = square(i);
cout << i << "の二乗は" << sum1 << "です\n";
cout << "小数を入力してください\n";
cin >> j;
double sum2 = square(j);
cout << j << "の二乗は" << sum2 << "です\n";
return 0;
}
//関数の定義
inline int square(int x){
int num1;
num1 = x * x;
return num1;
}inline double square(double x){
double mum1;
mum1 = x * x;
return mum1;}
0378デフォルトの名無しさん
2008/07/26(土) 23:19:47inline なら定義が無いと意味無いし、定義は宣言を含むから、定義だけ書いとけばいいよ。
0379デフォルトの名無しさん
2008/07/26(土) 23:21:060380デフォルトの名無しさん
2008/07/26(土) 23:28:40テンプレート関数は
templat <class T>
0381デフォルトの名無しさん
2008/07/26(土) 23:29:25スレ汚しすいません;;
0382デフォルトの名無しさん
2008/07/26(土) 23:34:20template <class T>
T square(T x){
処理
}
と記述できると書いてあったんですが
宣言と定義みたいに分けて記述することはできないんですか?
試しに
//宣言
template <class T>
T square(T x);
main関数
return 0;
//定義
T square(T x){
処理
}
とやったのですがエラーが出ました。要するに無理ってことでしょうか?
0383デフォルトの名無しさん
2008/07/26(土) 23:43:04無理です。使う時点で定義が読み込まれている必要があります。
0384デフォルトの名無しさん
2008/07/26(土) 23:44:15ありがとうございます。
不思議に思っていたことが解決しました。
0385デフォルトの名無しさん
2008/07/26(土) 23:44:31っ export
0386デフォルトの名無しさん
2008/07/26(土) 23:52:22つ現実
0387デフォルトの名無しさん
2008/07/27(日) 00:02:31ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-3.html
0388デフォルトの名無しさん
2008/07/27(日) 00:06:47馬鹿?
0389デフォルトの名無しさん
2008/07/27(日) 00:08:34分けて書くこと自体は可能。その感じだと、たぶん定義のほうに template <class T> が足りないだけ。
0390デフォルトの名無しさん
2008/07/27(日) 01:35:03みたいに、
・昇順で並んでいる
・同じ文字がたくさん入ってる
・あとから変更されることはない
・wchar_t
・一文字あたりの繰り返しは少ない(5個くらいまで)
・長い文字列もある(10MBytesくらい)
という文字列を扱うんだが、
・「N番目の文字」を高速に取り出せる
・「N種類目の文字と個数」を高速に取り出せる
条件を満たすデータ構造ってどんなのがある?
配列を2つ用意するしかない?
てかこのスレでよかった?
0391390
2008/07/27(日) 01:36:00> ・同じ文字がたくさん入ってる
これは無視してくれ。
0392デフォルトの名無しさん
2008/07/27(日) 01:41:12struct { int start; wchar_t c; } を start でソートした配列、でいいんじゃないかな?
その例だと {{0, L'a'}, {4, L'i'}, {7, L'u'}, {10, L'e'}, {11, L'o'}, {13, L'あ'}, ...} って感じで。
0393デフォルトの名無しさん
2008/07/27(日) 01:41:14昇順に並んでるってのは、文字コードが昇順にならんでるってわけじゃないの?
0394デフォルトの名無しさん
2008/07/27(日) 01:46:54おお!
なんだかよさそうだ。
ありがと!
>>393
そうです
0395デフォルトの名無しさん
2008/07/27(日) 01:48:28例にでてる文字列が文字コード順に並んでないけど、それは例が間違いってことだな。
0396デフォルトの名無しさん
2008/07/27(日) 01:50:47ひらがなが先だっけ?
なら例が間違ってるわ。
すまん
0397デフォルトの名無しさん
2008/07/27(日) 01:53:16いや、アルファベットをローマ字で昇順に並べても、文字コード順にはならんよ。
0398デフォルトの名無しさん
2008/07/27(日) 10:26:24そうでした
0399デフォルトの名無しさん
2008/07/27(日) 14:51:23using namespace std;
//関数addの宣言
void add(int *px, int *py, int *pz);
//点数を加算するプログラム
int main()
{
int x1;
int x2;
int a;
cout << "2科目の点数を入力してください\n";
cin >> x1 >> x2;
cout << "加算する点数を入力してください\n";
cin >> a;
add(&x1, &x2, &a);
cout << "科目1は" << x1 << "点です\n";
cout << "科目2は" << x2 << "点です\n";
return 0;}
//関数addの定義
void add(int *px, int *py, int *pz){
*px += *pz;
*py += *pz;}
0400デフォルトの名無しさん
2008/07/27(日) 14:53:22という宿題が出たのですが、これで実行したら成功したのですが。
これは無駄過ぎるという所はありませんか?
あったら指摘お願いします
0401デフォルトの名無しさん
2008/07/27(日) 14:55:170402デフォルトの名無しさん
2008/07/27(日) 15:00:46まあパッと見pzはポインタにする必要はまったくないな。
0403デフォルトの名無しさん
2008/07/27(日) 15:01:49こっちの方に書き込んでしまいました。
ご迷惑おかけして大変申し訳ございませんでした。
この場を借りて謝罪いたします。
0404デフォルトの名無しさん
2008/07/27(日) 15:05:10指摘ありがとうございます。
0405デフォルトの名無しさん
2008/07/27(日) 17:59:33void f(T t, U u)
{
...
}
template<class T>
void f<T, int>(T t, int u)
{
...
}
こういうことってできないんだっけ?
error C2768: 'f' : 明示的なテンプレート引数を使用することはできません。
って出るんだが。
0406デフォルトの名無しさん
2008/07/27(日) 18:01:190407デフォルトの名無しさん
2008/07/27(日) 18:04:36ありがとうさん
0408405
2008/07/27(日) 18:07:53void f()
{
}
template<int I>
void f<I, 0>()
{
}
これは無理?
J=0の場合のみ特殊化。
0409デフォルトの名無しさん
2008/07/27(日) 18:11:11コンパイルエラーは以下のように出ます。
-------------------------
Test.cpp:13: error: expected constructor, destructor,
or type conversion before ‘Test’
-------------------------
このエラーを理解できないため、デバグできません。
どうしたらいいのでしょうか?
教えてください。
ソースは以下。
0410デフォルトの名無しさん
2008/07/27(日) 18:12:25#include<iostream>
using namespace std;
template<typename T>
class Test{
public:
T value;
Test(){};
Test operator+(const Test& t);
};
template<typename T>
Test Test<T>::operator+(const Test<T>& t) //←13行目
{
Test tmp;
tmp.value = value + t.value;
return tmp;
}
int main()
{
Test<int> test1, test2;
test1.value=100;
test2.value=200;
Test<int> test3 = test1 + test2;
return 0;
}
-------------------------
0411デフォルトの名無しさん
2008/07/27(日) 18:15:34じゃない?
const Test<T> Test<T>::operator+(const Test<T>& t)
このほうがいいかな
0412410
2008/07/27(日) 18:25:03ありがとうございます m(_ _)m
続けて質問して申し訳ないのですが、
const をつけると付けないとではどのようなちがいがあるのでしょうか?
0413デフォルトの名無しさん
2008/07/27(日) 18:34:16メンバ変数が定義されていないとか言うんだけど
何これ…
0414413
2008/07/27(日) 18:41:51メンバ変数じゃなくてメンバ関数をポインタ型にすると
メンバ変数が定義されていないって出る
0415デフォルトの名無しさん
2008/07/27(日) 18:42:390416デフォルトの名無しさん
2008/07/27(日) 18:46:14static付けたらどうでしょうと言ってみよう
0417デフォルトの名無しさん
2008/07/27(日) 18:48:36メンバ変数をメンバ関数ポインタの型にするって事か?
0418デフォルトの名無しさん
2008/07/27(日) 18:54:38class A{
praivate:
int *a;
public:
void *get_a();
}
void A::*get_a()
{
return a;
}
aが定義されていない識別子です
ってなる
0419デフォルトの名無しさん
2008/07/27(日) 18:56:440420デフォルトの名無しさん
2008/07/27(日) 18:58:56>>419
解決した。ありがとう!
0421デフォルトの名無しさん
2008/07/27(日) 18:59:27GDBでUTF-8の内容を表示させるにはどうすればよいのでしょうか?
ご存知の方がいらっしゃいましたら何卒ご教授下さい。
よろしくお願いいたします。
0422デフォルトの名無しさん
2008/07/27(日) 19:37:58std::wcin.getline(pString, 64) ;
が入力を待たずに終わってしまいます。
プロジェクトを別に作って試したんですが他ではちゃんと入力を待ってます。
どういう状況の時だと処理を待たずに終了してしまうのでしょうか?
0423デフォルトの名無しさん
2008/07/27(日) 19:52:06現象とは関係ないけど、それ、wchar_tかWCHARを使ったほうがいいよ。
0424デフォルトの名無しさん
2008/07/27(日) 20:15:58直前で数値や文字列を入力したときに改行が残ったままになってるとか
0425デフォルトの名無しさん
2008/07/27(日) 20:25:08include <iostream>
#include <string>
using namespace std;
//関数countの宣言
int count(char str[], char ch);
//指定した文字数を調べるプログラム
int main()
{
char str[256]; //入力する文字列
char c; //調べる文字
int sum; //文字数
cout << "文字列を入力してください\n";
cin >> str;
cout << "探したい文字を入力してください\n";
cin >> c;
sum = count(str, c);
cout << str << "の中に" << c << "は" << sum << "個あります\n";
return 0;
}
0426デフォルトの名無しさん
2008/07/27(日) 20:26:14int count(char str[], char ch){
int j; //文字列の文字数
int i;
int num = 0; //カウントする変数
j = strlen(str);
for(i = 0; i < j; i++){
if(str[i] == ch){
num++;
}
}
return num;
}
これで実行してちゃんとカウントできたのですが、無駄過ぎる文はありませんか?
指摘お願いします。
連投すいません;;
0427デフォルトの名無しさん
2008/07/27(日) 20:29:50sum = std::count( str.begin(), str.end(), c )
0428デフォルトの名無しさん
2008/07/27(日) 20:30:22std::string と std;;wstring で template を使って関数を共通化したいんだけど,
文字列リテラル ( "hoge" と L"hoge") や,文字型の違い ( 'a' と L'a') を吸収するには
どうやったらいいの?
例えば,バックスラッシュを付け足す場合とか.
template <typename string_type>
string_type& AddBackSlash(string_type& str)
{
return str += '\\';//← wstring の場合は L'\\' にしたい,
}
0429デフォルトの名無しさん
2008/07/27(日) 20:31:09ありがとうございます!
0430デフォルトの名無しさん
2008/07/27(日) 20:37:12特殊化
0431デフォルトの名無しさん
2008/07/27(日) 20:58:44今までC言語を始めよう!というフリーソフトを使ってきました
0432428
2008/07/27(日) 21:13:16>>430 ありがとうございます.特殊化するということはコピペして,wstring に置換して, L を付ける作業をするしかないですかね…
template <typename string_type>
string_type& AddHoge(string_type& str)
{
string_type strInternal = "foo";
return str += "Hoge";
}
//特殊化
template<>
std::wstring& AddHoge<std::wstring>(std::wstring& str)
{
std::wstring strInternal = L"foo";
return str += L"Hoge";
}
0433デフォルトの名無しさん
2008/07/27(日) 21:32:49ありがとうございます、>>424さんが言われたとおり直前で数値をwcinにて
受け取ってます。それをコメントアウトしたらgetineのとこで処理が
止まりました。
原因はわかったのですがどうやって回避してよいのでしょうか?^^;
0434デフォルトの名無しさん
2008/07/27(日) 21:41:25このとき確保されるメモリは実装しだい?
0435デフォルトの名無しさん
2008/07/27(日) 21:56:050436デフォルトの名無しさん
2008/07/27(日) 21:57:02結局は好みだから使ってみて気にいったのを使えよ。
因みに俺はemacs使ってる。
0437デフォルトの名無しさん
2008/07/27(日) 22:03:18strlen(str) で文字列の末尾まで '\0' を検索した後に,
再び文字を検索するのが無駄と言えば無駄かも.
int count(const char str[], const char ch)
{
int num = 0; //カウントする変数
while( *str != '\0' ) if( *str++ == ch ) num++;
return num;
}
0438デフォルトの名無しさん
2008/07/27(日) 22:08:45{
unsigned num = 0;
for (char const * p = str; (p = strchr(p, ch)) != NULL; ++p) ++num;
return num;
}
0439デフォルトの名無しさん
2008/07/27(日) 23:13:070441デフォルトの名無しさん
2008/07/28(月) 01:34:49PASCAL stringを授けよう。
0442デフォルトの名無しさん
2008/07/28(月) 02:20:14OnKeyDownという関数にwpとlpをそのまま渡しています。
そして、押されたキーが"v"だった時だけ処理をしたいのでstrcmpを使ってみたのですが
そこで強制終了してしまいます。正しくはどう書いたらよいのでしょうか?
教えてください。お願いします。
OnKeyDown(WPARAM wp, LPARAM lp)
{
switch(wp)
{
case VK_RETURN:
break;
〜
略
〜
default:
if(strcmp((char*)wp,"v") == 0)
{
//キーがvだった時の処理
}
}
0443デフォルトの名無しさん
2008/07/28(月) 02:26:08一文字だったら *(char*)wp == 'v' とかでどうなんだろう
あとメッセージボックスなんかでwpの中身確認してみたらどうだろうか
ついでにこっちの方が回答もらいやすいかもね
Win32API質問箱 Build68
http://pc11.2ch.net/test/read.cgi/tech/1215348804/
0444デフォルトの名無しさん
2008/07/28(月) 02:31:31MessageBoxに表示させようと
wpをchar*にキャストしたら同じように落ちました・・・
とりあえずそっちで聞いてきます。
ありがとうございました。
0445デフォルトの名無しさん
2008/07/28(月) 11:16:350446デフォルトの名無しさん
2008/07/28(月) 11:19:213Dやら暗号やら圧縮やらを扱いたいなら数学が必要になってくるかも
0447デフォルトの名無しさん
2008/07/28(月) 11:21:270448デフォルトの名無しさん
2008/07/28(月) 11:29:53数学:sin cos tan(三角関数?)等
物理:ベクトル等
0449デフォルトの名無しさん
2008/07/28(月) 11:34:01物理演算しようってわけじゃないんだから、完全な理解も必要なし
0450デフォルトの名無しさん
2008/07/28(月) 11:39:080451デフォルトの名無しさん
2008/07/28(月) 13:18:580452デフォルトの名無しさん
2008/07/28(月) 14:03:08ベクトルが分かっててプログラミングができるなら小学生にもできるよ、って話だけどな
0453デフォルトの名無しさん
2008/07/28(月) 14:04:410454デフォルトの名無しさん
2008/07/28(月) 14:13:46今までだってそうやってきただろ?
0455デフォルトの名無しさん
2008/07/28(月) 14:15:05>>453 に例示されるような人はおそらく勉強しないでしょう
0456デフォルトの名無しさん
2008/07/28(月) 14:27:06CとC++とwindowsプログラミングを一通り勉強したので
次にDirectXの勉強をしようと思っているのですが、勉強する前に三角関数・ベクトル・行列を復習してから(曖昧なので)
DirectXの勉強をしたほうが理解が深まると思うのですがどう思いますか?
先輩方アドバイスよろしくお願いします。
0457デフォルトの名無しさん
2008/07/28(月) 14:29:490458デフォルトの名無しさん
2008/07/28(月) 14:30:12目的にもよりますが Direct3D を勉強しながら分からないところを調べるほうがオススメ
0459デフォルトの名無しさん
2008/07/28(月) 14:30:210460デフォルトの名無しさん
2008/07/28(月) 14:33:25思い出すのなら必要なことが出てからでも、今やってることが止まることも無いでしょう。
0461デフォルトの名無しさん
2008/07/28(月) 14:37:480462デフォルトの名無しさん
2008/07/28(月) 14:38:01アドバイスありがとうございます。
この夏休みでDirectXの基本をマスターして3Dゲームが作れるようにがんばります。
0463デフォルトの名無しさん
2008/07/28(月) 14:38:45そうなんですか?
勘違いしていたみたいです・・。
もう少し調べてみます。
0464デフォルトの名無しさん
2008/07/28(月) 14:43:38DirectXの描画は基本3Dじゃなかったっけ
0465デフォルトの名無しさん
2008/07/28(月) 14:47:030466デフォルトの名無しさん
2008/07/28(月) 14:48:250467デフォルトの名無しさん
2008/07/28(月) 14:49:42そうだった
昔2D描画用のがあったんだけどもうなくなったんだね
あれ結構評判良かったのに
0468デフォルトの名無しさん
2008/07/28(月) 16:02:03ドキュメントが無くなったけどな
0469デフォルトの名無しさん
2008/07/28(月) 16:38:04ヒキスウって最近知った
0470デフォルトの名無しさん
2008/07/28(月) 16:48:16カエリチ?ヘンチ?
0471デフォルトの名無しさん
2008/07/28(月) 16:48:560472デフォルトの名無しさん
2008/07/28(月) 16:53:39どーぞくハケーン
0473デフォルトの名無しさん
2008/07/28(月) 16:54:36授業とかでやったら確実に発音するでしょ
0474デフォルトの名無しさん
2008/07/28(月) 16:58:05俺はモドリチ
0475デフォルトの名無しさん
2008/07/28(月) 17:00:150476デフォルトの名無しさん
2008/07/28(月) 17:03:540477デフォルトの名無しさん
2008/07/28(月) 17:05:450478デフォルトの名無しさん
2008/07/28(月) 17:07:410479デフォルトの名無しさん
2008/07/28(月) 17:12:310480デフォルトの名無しさん
2008/07/28(月) 17:37:500481デフォルトの名無しさん
2008/07/28(月) 20:39:330482デフォルトの名無しさん
2008/07/28(月) 20:52:11でも「返り値として0を戻す」はいったことないな。
0483デフォルトの名無しさん
2008/07/28(月) 21:21:23返り値を使うなら「返り値をaに戻す/返す/当てる」とかは言う
返り値の値に言及する時は思いつかない
0484デフォルトの名無しさん
2008/07/29(火) 00:56:44{
static std::string str = boost::lexical_cast<std::string>(n);
return str;
}
const std::string g_strNotFound("NotFound");
const std::string& GeRefOfFuncStaticString2(int n)
{
static std::map<int,std::string> mapStr;
if( mapStr.empty() )
{
mapStr.insert( std::make_pair(100, "100") );
mapStr.insert( std::make_pair(101, "101") );
}
std::map<int,std::string>::const_iterator itrFound = mapStr.find(n);
return itrFound != mapStr.end() ? itrFound->second : g_strNotFound;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << GeRefOfFuncStaticString( 100 ) << std::endl; // 表示: 100
std::cout << GeRefOfFuncStaticString( 101 ) << std::endl; // 表示: 100 ← 関数内の static 変数の参照を取り出せない
std::cout << GeRefOfFuncStaticString2( 100 ) << std::endl; // 表示: 100
std::cout << GeRefOfFuncStaticString2( 101 ) << std::endl; // 表示: 101
return 0;
}
map を使った場合の GeRefOfFuncStaticString2( ) は意図した動作になるんですが,たまたまでしょうか?
0485デフォルトの名無しさん
2008/07/29(火) 01:24:05関数内のstatic変数の参照を取り出してますよ。
0486デフォルトの名無しさん
2008/07/29(火) 01:43:11初期化が一度しか行われないんですね.以下のようにして GeRefOfFuncStaticString() でも望みどおりの
動作が出来るようになりました.
有難うございました.
const std::string& GeRefOfFuncStaticString(int n)
{
static std::string str;
str = boost::lexical_cast<std::string>(n);
return str;
}
0487デフォルトの名無しさん
2008/07/29(火) 03:24:060488デフォルトの名無しさん
2008/07/29(火) 07:50:000489デフォルトの名無しさん
2008/07/29(火) 08:06:380490デフォルトの名無しさん
2008/07/29(火) 09:24:49const std::string& GeRefOfFuncStaticString(int n)
{
static std::string str = boost::lexical_cast<std::string>(n);
return str;
}
これ static のところ、いつ初期化されるんだ? 今までプログラム
起動時(main以前)だと思ってたんだが、nが関数の呼び出し時に
決まるじゃん。
内部で
if(関数の初回呼び出しなら){
str = boost::lexical_cast<std::string>(n);
}
みたいなコードにコンパイルされるわけ?
>>484の挙動見ているとそう見えるんだが…
0491デフォルトの名無しさん
2008/07/29(火) 09:36:58それであってる。
ちなみに初期化についてスレッドセーフである保証は無いので、
マルチスレッドのプログラムで排他せずにstatic変数使ったら、
いつ異常動作してもおかしくない。
0492デフォルトの名無しさん
2008/07/29(火) 10:07:55探したけど俺の目が悪いんだろうか、見つかりません;;
だれか教えてください
もしくは、この質問に答えてください。
istringstreamのオブジェクトに、文字列を代入(?)するとき、
istringstream is(string("abc"));
のように初期化ではなくて、あとから代入することはできますか?
やり方を教えてください。
0493デフォルトの名無しさん
2008/07/29(火) 10:18:55いつの間にそうなったんだ…
関数呼び出し時に初回判定が入るんじゃあパフォーマンス
に悪影響があるだろうが。
func(){
static int a = 100;
}
は昔どおり初回判定なんか入らないよな?
0494デフォルトの名無しさん
2008/07/29(火) 10:34:42昔から変わってないよ。その int の例でも、関数内で値の変更があったり、
ポインタや参照を外に渡してしまっている場合は初回判定が必要になるでしょ。
0495デフォルトの名無しさん
2008/07/29(火) 10:35:440496デフォルトの名無しさん
2008/07/29(火) 10:37:380497デフォルトの名無しさん
2008/07/29(火) 10:38:57istringstream ではなくて stringstream を使ってみては?
0498デフォルトの名無しさん
2008/07/29(火) 10:41:57http://www.cppreference.com/
http://www.cppll.jp/cppreference/
http://msdn.microsoft.com/ja-jp/library/cscc687y.aspx
is.str("abc");
0499デフォルトの名無しさん
2008/07/29(火) 10:42:21その辺の最適化は処理系定義。
引数で初期化したら、まず確実に判定が入る。
0500デフォルトの名無しさん
2008/07/29(火) 11:07:28頭にBOMを追加してくるみたいなものって存在しますか?
自分で先に書くのが普通でしょうか?
自分でFF FE をファイルと開いて書き込んでから
wofstreamを使うと先に書き込んだ2バイトが消されてしまい途方にくれて
おります・・・・
0501デフォルトの名無しさん
2008/07/29(火) 11:09:440502デフォルトの名無しさん
2008/07/29(火) 11:22:180503デフォルトの名無しさん
2008/07/29(火) 11:22:48つまり、関数内のstatic変数の初期値が定数じゃない限り、初回確認用のフラグもstatic領域に用意されるわけだな。
0504デフォルトの名無しさん
2008/07/29(火) 11:36:53std:ios::appでBOMが残せましたmありがとうございます!
0505デフォルトの名無しさん
2008/07/29(火) 11:43:28一連のレスは理解できるのだが、
> int の例でも、関数内で値の変更があったり、
>ポインタや参照を外に渡してしまっている場合は初回判定が必要
これが分からん。
プログラムロード時にaが100になるでしょ。それで、関数内で
値の変更があったり、 ポインタや参照を外に渡してしまっている
場合はどうして初回判定が必要になるの?
0506デフォルトの名無しさん
2008/07/29(火) 11:48:26例えばこんなケース。
int func(int n)
{
static int a = n;
return a;
}
int main()
{
for (int a = 2; a <= 5; ++a) {
printf("%d, %d\n", a, func(a));
}
return 0;
}
0507494
2008/07/29(火) 12:23:54変数宣言通過時に初期化されるんなら初回判定が必要かと思ったんだけど、
プログラム起動時に初期化してもいいみたい。
ってことで >494 は間違いで、初回判定が必要になるのは初期値が定数式じゃないときね。
ごめんよ >>506
0508デフォルトの名無しさん
2008/07/29(火) 14:13:54ファイル中のN個の値で、配列a[N]を作りたいんですが
うまいやり方が思いつかないので、どなたか教えていただけませんか?
0509デフォルトの名無しさん
2008/07/29(火) 14:15:51mallocの使い方を聞いてるのか?
0510デフォルトの名無しさん
2008/07/29(火) 14:19:200511デフォルトの名無しさん
2008/07/29(火) 16:37:390512デフォルトの名無しさん
2008/07/29(火) 18:48:40という夏休みの課題が出たのですが、何から始めていいかさっぱりわかりません・・・・。
だれか御助けを・・・・。
0513デフォルトの名無しさん
2008/07/29(火) 18:49:310514デフォルトの名無しさん
2008/07/29(火) 19:32:11int Y;
int O;
};
0515デフォルトの名無しさん
2008/07/29(火) 20:45:26残念ですが、その課題を出した先生は脳に異常をきたしています・・・。
まともな対話は不可能でしょう。課題の提出は諦めるほかないでしょう。
0516デフォルトの名無しさん
2008/07/29(火) 21:39:360517デフォルトの名無しさん
2008/07/29(火) 22:07:510518デフォルトの名無しさん
2008/07/29(火) 22:26:11private:
std::list<int> foo;
public:
void setfoo(std::list<int> foo){
this->foo.clear();
std::list<int>::iterator itr;
for(itr=foo.begin();itr!=foo.end();itr++)
this->foo.push_back(*itr);
}
std::list<int> getfoo() const{
return foo;
}
};
int main(){
hoge hoge0;
std::list<hoge> hogehoge;
std::list<int> tmp;
tmp.push_back(1);
tmp.push_back(2);
hoge0.setfoo(tmp);
std::list<int>::iterator tmpitr = hoge0.getfoo().begin();
hogehoge.push_back(hoge0);
std::list<int>::iterator itr = (*hogehoge.begin()).getfoo().begin();
std::cout << *itr << "," << *(++itr);
}
このコードで、最後に"1,2"と表示されて欲しいところが、"0,0"となってしまいます。
どこが悪いのかがわからず困っています。よろしければ教えていただけないでしょうか…。
0519デフォルトの名無しさん
2008/07/29(火) 22:30:320520デフォルトの名無しさん
2008/07/29(火) 22:34:42ひとつの式の中でitrを代入と参照の両方してるから
0521518
2008/07/29(火) 23:03:49ありがとうございます。
最後にcoutするところで、itrが無効化してしまってるということでしょうか。
一時コピーが破棄されるタイミングがイマイチわかりません。
たびたびすいません…。
0522デフォルトの名無しさん
2008/07/29(火) 23:15:52完全式の終わりで破棄される
0523デフォルトの名無しさん
2008/07/29(火) 23:39:25百聞は一見にしかずだから
>>518のコードを希望通りに動くように修正汁!
すまん、俺C++わからんから><
0524デフォルトの名無しさん
2008/07/29(火) 23:44:320525デフォルトの名無しさん
2008/07/30(水) 00:02:27が、printf("hello")の時点で壁にぶちあたりました。
正しくコードを入れたはずですが、実行して表示されるのは、
2chアップローダ:http://www-2ch.net:8080/up/download/1217343270379299.ZNkHRl
です。exeと、badが同時に出現するのは何故?さらHELLOが表示されていないのは何故?
「苦しんで覚えるC言語」を参考にやってみたのですが、いきなり苦しいです。
神様助けてください。。。
コンパイラ:Borland C++ Compiler
エディタ:CPad for Borland C++Compiler
0526デフォルトの名無しさん
2008/07/30(水) 00:17:17std::cout << *itr << ",";
std::cout << *++itr;
と二行に分けると動く。
その理由は、((std::cout.operator<<(*itr)).operator<<(",")).operator<<(*++itr)
というようにちょっと考えるとインクリメント演算子は後から適用されるように思えるが、
インクリメント演算子は副作用完了点に達するまでのどの段階で働いても
構わない事になっているからである。
もっと言えば>>518の動作は未定義である。
0527デフォルトの名無しさん
2008/07/30(水) 00:18:11なんで start ってするの?compile したのは a.exe とかじゃない?
ところでその本には int main(void) 推奨なの?
0528デフォルトの名無しさん
2008/07/30(水) 00:19:570529デフォルトの名無しさん
2008/07/30(水) 00:21:51まあたぶん./startってやったら動くんじゃない
0530デフォルトの名無しさん
2008/07/30(水) 00:24:31#include <iostream>
int main()
{
int i = 1;
std::cout << i << ' ' << ++i << std::endl;
}
のようなプログラムは "1 2" と出力しそうであるが、実際は未定義動作であり、
無理矢理動かすと大抵のコンパイラでは直感に反して"2 2"と表示されるのも
同じ理由による。
0531デフォルトの名無しさん
2008/07/30(水) 00:25:04printf("hello");では上記URLのようにexeと、badが同時に出現し、また何も表記が無い状態でしたが
printf("hello\n");では「HELLO」が改行ありで表記されました。
また、printf("%d",100); printf("円\n");では改行ありで「100円」が表記されました。
私の見解では、ただ単に参考にした構文が間違っている(\nが必要だが書かれていなかっただけ)
のだと思いますが。。。意見を聞かせてください。
0532デフォルトの名無しさん
2008/07/30(水) 00:26:06start.exeはまずくない?
0533デフォルトの名無しさん
2008/07/30(水) 00:26:14printfのあとに
fflush();つけたらどうなるかな?
0534533
2008/07/30(水) 00:27:060535デフォルトの名無しさん
2008/07/30(水) 00:27:240536デフォルトの名無しさん
2008/07/30(水) 00:32:52aに変えました。そしたらbatのみになりました。
参考元URL:http://homepage3.nifty.com/mmgames/c_guide/index.html
しかも、printf("hello");で改行なし「hello」が表示されました。
お騒がせ申し訳ありません。m(--)m参考元さんも申し訳ありません。m(--)m
0537デフォルトの名無しさん
2008/07/30(水) 00:42:510538デフォルトの名無しさん
2008/07/30(水) 00:44:24うん。あるある
0539デフォルトの名無しさん
2008/07/30(水) 00:44:46セキュリティーホールがあれば入りたいです。
startをaに変更すると、
http://www-2ch.net:8080/up/download/1217345861729515.WpasSs
な感じになりました。これで夜も安心して眠れます。
>>527 startにしたのは無知だからでした。「手始めにスタート」のつもりでした。
この本というかサイトではそうでした。他のサイトを見てみると他の記述もありましたが、
最初に見たこのサイトの記述で貫こうと思います。
>>532 決定的な回答ありがとうございます。小鳥の1歩ほど前進することができました。
終わりなきC言語を心ゆくまで堪能したいと思います。親切にしてくださってありがとうございます。
>>534 いっしょにセキュリティーホールに入りませんか。
>>535 完全に撃ち間違いです。申し訳ありま栓。
0540デフォルトの名無しさん
2008/07/30(水) 02:16:56ソラリスでは使えてたのですが、Linuxだとエラーが出てしまってgoogle検索したのですがいい対応策が見つかりません。
newとdeleteは演算子なのですが、
例
string * aaa;
というのを.hで宣言し
.ccにて
コンストラクタでNULLクリア
main処理にて値を入れる場合と入れない場合があるのですが、
値を入れない場合に、
デストiラクタでaaaをdeleteしようとすると、落ちてしまいます。
SolarisからLinuxに入れ替えようとしているので、Solarisでは通るのにLinuxでは通らないという事はあるのでしょうか。
簡単にプログラムの例を
classで、
string * aaa; を宣言しておき、
コンストラクタで、aaaをNULL初期化します。
mainルーチンで、aaaにファイルから文字列を取得するのですが、
該当しない場合はaaaはNULLのままとなっています。
デストラクタで、
if(aaa){
delete aaa;
}
とやっているのですが、そこで落ちてしまいます。
よろしければアドバイスお願いします。
0541デフォルトの名無しさん
2008/07/30(水) 02:19:230542デフォルトの名無しさん
2008/07/30(水) 02:19:37char ItemObject[1024];
ItemObject = "TEST";
listBox->Items->Add(ItemObject);
とするとコンパイルできません。
プログラミング初心者で、どうすればいいのか分からず困っています。
どなたか、助けて下さい。よろしくお願いします。
0543デフォルトの名無しさん
2008/07/30(水) 02:20:01戻るようになっている。
従って if文は不要。原因は他の所にあるのではないか。
0544デフォルトの名無しさん
2008/07/30(水) 02:23:19listBox->Items->Add( gcnew System::String(ItemObject) )
はじめから System::Stringを使え。
それより、このスレはC++/CLIはOKなのかな?C++/CLIはC++とは別物だから明記しておくように。
0545デフォルトの名無しさん
2008/07/30(水) 02:28:22>>delete演算子は対象のポインタが 0 の時は何もしないで
>>戻るようになっている。
これは知ってはいたのですが、チェックしてしまうクセがついてしまっています。
>>従って if文は不要。原因は他の所にあるのではないか。
やはり原因は他にあるのですかね。
Soralisで通っててLinuxでは通らないので、規格の違いかと思い質問させてもらいました。
(LinuxはSoralisと比べて厳しいので
もうちょっと調べてみます。
アドバイスありがとうございます。
0546デフォルトの名無しさん
2008/07/30(水) 02:29:17クラスも無いのにコンストラクタとか言ってるのがおかしい。ソース晒せ。
0547デフォルトの名無しさん
2008/07/30(水) 02:33:410548デフォルトの名無しさん
2008/07/30(水) 02:39:30class hoge{
string * aaa;
}
mainでaaaに文字列を取得
(ない場合は取得しない
hoge::hogeでaaaにはNULLを設定
oge::~hogeで
if(aaa){
delete aaa;
}
としています。
>>547
>>memsetでクリアしてたりする?
memsetはやっていないですね。
文字列取得にはc_str()を使用しています。
0549デフォルトの名無しさん
2008/07/30(水) 02:42:52hoge にデストラクタもコンストラクタもねーじゃねーか。
ソースを省くな。問題が再現する完全なコードを貼れ。
0550デフォルトの名無しさん
2008/07/30(水) 02:51:20すいません、完全なコードを張る事ができないので省略してました。
何かしらヒントでもあればと思い質問しました。
SoralisとLinuxの互換性がまだ完全に把握できていないので
分かる人がいればと思い。
もうちょっと自分で調べてみます。解決したら役に立つかわかりませんが書き込みます。
0551デフォルトの名無しさん
2008/07/30(水) 02:59:06問題が再現する最小のコードを作ってもらわないと、エスパーでもなけりゃわからない。
OS間の互換性に原因があると思ってるようだが、どうせ違う。
そういうコード作るのは相談のためでもあるが、基本的な調査の方法でもあるんで、
たいていは作ってる間に自分で気づくんだけどな。
0552デフォルトの名無しさん
2008/07/30(水) 03:10:02hogeが意図せずコピーコンストラクタでコピーされてて、
2箇所でaaaがdeleteされているとかないだろうか。
deleteしたばかりで領域が再利用されていない場合に
2回目のdeleteでもエラーにならない処理系は存在する。
Soralisが落ちない処理系で、linuxが落ちる処理系だとすると・・
0553デフォルトの名無しさん
2008/07/30(水) 03:19:04一応gdbでも処理追ってみたのでコンストラクタが2度通ってる事はないみたいです。
0554デフォルトの名無しさん
2008/07/30(水) 03:23:12デフォルトのコピーコンストラクタが使われているなら、
普通のコンストラクタは通らないよ。
stringがstl::stringだったらポインタで持つ意味があるのかは検討したほうがいいな。
0555デフォルトの名無しさん
2008/07/30(水) 03:26:42なるほどprivateもありですね。試してみます。
stringはstd::stringです。
0556デフォルトの名無しさん
2008/07/30(水) 03:49:12出なくてLinuxではしっかりチェックされて落ちるってオチだろうな。
多分ソースにバグがある。
0557デフォルトの名無しさん
2008/07/30(水) 03:58:01その可能性大ですね。
Solarisはチェックが甘いからたまたま通ってただけな気がします。
時間あるから作り直そうかな。他にもありそうですし。
元々作った人が逃げて改修まかされて困ったもんです。
0558デフォルトの名無しさん
2008/07/30(水) 03:58:370559デフォルトの名無しさん
2008/07/30(水) 04:07:31vc++2008は落ちないのを確認。
0560デフォルトの名無しさん
2008/07/30(水) 04:19:15int main()
{
std::string* str = new std::string;
delete str;
delete str;
}
BCC5.9.3(C++Builder2007付属品)+CodeGuardで次のログ出力。
Error 00004. 0x100630 (スレッド 0x0C24):
解放済みメモリの アクセス : アドレス 0x00D743E0+16 から 4
バイトを参照しました。.
| C:\Program Files\CodeGear\RAD Studio\5.0\Include\dinkumware\xstring line 1757:
| else if (_BUF_SIZE <= _Myres)
| { // copy any leftovers to small buffer and deallocate
|> _Elem *_Ptr = _Bx._Ptr;
| if (0 < _Newsize)
| _Traits::copy(_Bx._Buf, _Ptr, _Newsize);
呼び出し履歴:
0x00401477(=double_delete1.exe:0x01:000477) C:\Program Files\CodeGear\RAD Studio\5.0\Include\dinkumware\xstring#1757
0x004012FE(=double_delete1.exe:0x01:0002FE) C:\Program Files\CodeGear\RAD Studio\5.0\Include\dinkumware\xstring#561
0x00401205(=double_delete1.exe:0x01:000205) double_delete1.cpp#8
0x328876DE(=CC3280MT.DLL:0x01:0866DE)
0561デフォルトの名無しさん
2008/07/30(水) 04:22:07出力されましたがあまりに長いため省略します。
Linuxにはこの手のデバッガはありませんか?
0562>>542
2008/07/30(水) 04:24:09お答えを下さった方、助かりました。どうもありがとうございました。
0563デフォルトの名無しさん
2008/07/30(水) 04:29:09gdbがある
zeroとかなんとかそういう感じのもあった気がする
0564デフォルトの名無しさん
2008/07/30(水) 04:33:14前述したようにdeleteの2重はありませんが、
そのプログラムで
str に NULLを代入し、str に対して delete を行うとLinuxでは落ちてしまいます。
デバッガはgdbが標準でついてるはずなのでそれで可能です。
gdbのコマンドとしては、
落ちた時のcoraファイルを取得し
gdb main.o coreファイル名
で、デバッグ可能です。
main.oはLM名です。
gdbのプロンプトに変わりますので、そこから解析は可能ではあります。
0565デフォルトの名無しさん
2008/07/30(水) 04:46:46素朴な疑問なんだけどNULLと0が違うんかもしれんね。
0を代入してdeleteしてみ。
0566デフォルトの名無しさん
2008/07/30(水) 06:19:130567デフォルトの名無しさん
2008/07/30(水) 06:20:030568デフォルトの名無しさん
2008/07/30(水) 06:33:15ユーザー定義のNULLが存在するのかもしれない
調べてみては?
0569デフォルトの名無しさん
2008/07/30(水) 09:27:14#include <string>
int main() { std::string* str = new std::string; str = NULL; delete str; delete str; }
↑これで落ちるってこと?
ヌルポインタの delete で落ちるんならコンパイラが腐ってる。
>567 も挙げてるけど、コンパイラは何?
0570デフォルトの名無しさん
2008/07/30(水) 09:47:33再現する最小ソースが作れないほどの規模らしいから
str に NULLを代入し、
:
*ここに何かいっぱい処理がある
:
str に対して delete を行うとLinuxでは落ちてしまいます。
0571デフォルトの名無しさん
2008/07/30(水) 09:55:490572デフォルトの名無しさん
2008/07/30(水) 11:45:50#include <iostream>
using namespace std;
int main()
{
int num;
cout << "1から9までの数を入力してください\n";
cin >> num;
try{
if(num <=0){
throw "0以下を入力しました\n";
}
if(num >=10){
throw "10以上を入力しました\n";
}
cout << num << "です\n";
}
catch(char* err){
cout << "エラー:" << err << '\n';
return 1;
}
return 0;
}
catchブロックのreturn 1というのは異常に終了したから1を返すという意味ですか? 試しに0で実行しても同じ結果だったので気になりました。
0573デフォルトの名無しさん
2008/07/30(水) 11:54:09実行した後に、何が返ったのか調べることができる。
どうやって調べるかは実行したシェルによる。
調べなきゃ何もかわらない。
0574デフォルトの名無しさん
2008/07/30(水) 11:55:33お使いのコマンドインタプリタに終了ステータスが渡されています。
その値を見ることができれば、0だったり1だったりするのが判ることでしょう。
0575デフォルトの名無しさん
2008/07/30(水) 12:01:45ありがとうございます
今日も良い一日を
0576デフォルトの名無しさん
2008/07/30(水) 16:36:05#include <stdlib.h>
#include <tchar.h>
int main()
{
FILE *fp;
wchar_t buf[16] = {0};
if(_wfopen_s(&fp, _T("hoge.txt"), _T("w, ccs=UTF-8"))) exit(1);
fputwc(_T('あ'), fp);
fputwc(_T('イ'), fp);
fputwc(_T('菟'), fp);
fclose(fp);
if(_wfopen_s(&fp, _T("hoge.txt"), _T("r"))) exit(1);
for(int i = 0; i < 3; i++)
{
buf[i] = fgetwc(fp);
}
fclose(fp);
wprintf(_T("%s"), buf);
return 0;
}
このようにUTF-8で入出力すると、出力はうまくいくのですが入力で文字化けが起きてしまいます
どうすればいいのでしょうか。環境依存のものですが、よろしくお願いします。
WindowsXP + VC2005です。
0577デフォルトの名無しさん
2008/07/30(水) 16:38:190578デフォルトの名無しさん
2008/07/30(水) 16:40:37入力したものの画面出力、じゃないの?
ロケール設定してみては。
0579デフォルトの名無しさん
2008/07/30(水) 16:41:44入力では文字コードのフラグがなくてもBOMで勝手に判断してくれるとのことなのですが……。
0580デフォルトの名無しさん
2008/07/30(水) 16:43:00ええ、コンソール出力したものが化けます。
そちらが問題なのでしょうか。
0581デフォルトの名無しさん
2008/07/30(水) 16:43:120582デフォルトの名無しさん
2008/07/30(水) 16:54:38"r, ccs=UTF-8" にして、 #include <locale.h> 追加して setlocale(LC_ALL, "japanese"); 追加したら出たよ。
0583デフォルトの名無しさん
2008/07/30(水) 17:16:02ありがとうございます。
setlocaleの使い方が分からなくて手間取りましたが無事出ました。
ということは入出力はちゃんと行われているんですね。
ロケールについて少し調べてみます。
0584540
2008/07/30(水) 22:24:54簡略すると下記のようなソースになります。
�@で、aaaの初期値にnull_stを代入しており、
その後ifを通らなかった場合に、
�Aのdeleteで同じ箇所を2度行おうとし、落ちているみたいでした。
>>558さんの言う通りSolarisはdeleteした領域を触っても落ちないのですね。
解決策として、�Bの記述を
null_st = NULL;
に変えようかと思うのですが、これは大丈夫なのでしょうか。
質問ばかりですみません。
main()
{
string* aaa;
string* null_st;
int cnt;
null_st = new string(""); // �B
aaa = null_st; // �@
// cntは別の所で操作されると思ってください。
if(cnt == 1)
{
aaa = new string("AAA");
}
delete null_st; // �A
delete aaa; // �A
}
0585デフォルトの名無しさん
2008/07/30(水) 22:29:040586デフォルトの名無しさん
2008/07/30(水) 22:34:350587540
2008/07/30(水) 22:47:16規模が結構大きくて全部改修するには手間がかかるので必要最低限だけを変えたいんですが、
string* null_st;
を消して、NULLにするだけで大丈夫ですかねぇ
0588デフォルトの名無しさん
2008/07/30(水) 22:51:50aaa = new string("AAA"); のあと
aaa = new string("BBB"); 別の文字を代入することあったら、
"AAA"がメモリリークをおこしてるようなことはないだろうか。
0589540
2008/07/30(水) 23:08:10aaa = new string("BBB"); は、みたところありませんでした。
別の文字列を入れる場合は必ずdeleteが走る仕組みになってます。
0590デフォルトの名無しさん
2008/07/30(水) 23:16:23自分で書いたのなら、何故入門書なり入門サイトを見ずに書いたのかと・・・
0591デフォルトの名無しさん
2008/07/30(水) 23:23:06aaa = new string("BBB");があったら、そらメモリリークですよ…
string* aaa = NULL;
if(cnt == 1){
aaa = new string("AAA");
}
if (aaa != NULL && aaa == "") {
//カラ文字の時の処理
}
if (aaa == NULL) {
// カラ文字どころか存在さえしない時の処理
}
delete aaa;
aaa = NULL; // ←これは別に必要ではない
0592デフォルトの名無しさん
2008/07/30(水) 23:29:49素直にboost::optional使ったほうがいいと思う。
そうには思えないけど。
0593デフォルトの名無しさん
2008/07/30(水) 23:30:52なんとなくメモリの扱いをわかった気になっているだけ、という匂いを感じる。
0594591
2008/07/30(水) 23:33:170595デフォルトの名無しさん
2008/07/30(水) 23:33:420596デフォルトの名無しさん
2008/07/30(水) 23:36:460597デフォルトの名無しさん
2008/07/31(木) 00:32:54null_stは削除の方向で。
何か弊害ありそうでしたら教えてくださったら幸いです。
0598デフォルトの名無しさん
2008/07/31(木) 00:44:14あったらnull_strは消さない方がいいかも
あと590のカラ文字かの判定間違ってるわね
×if (aaa != NULL && aaa == "") {
○if (aaa != NULL && *aaa == "") {
0599デフォルトの名無しさん
2008/07/31(木) 00:48:45この判定は試してませんでした。
その条件で大丈夫そうなら使ってみます。
このプログラム作った人がいたら、何を意図して作ったのか聞きたいんですが、
もういないので、聞くに聞けずここをいじったらまた別のが出てくるのではないかと
怖いんですよね。
ただでさえ、SolarisとLinuxのポーティングに苦労してるので・・
0600デフォルトの名無しさん
2008/07/31(木) 01:39:40TCHARを使ったプログラムを書いていて、ヘッダ側とソース側で何故か
TCHARの定義が変わってしまい、
外部シンボル 〜が未解決
というエラーが出てしまいます。どうすればこれを回避できるのでしょうか?
0601デフォルトの名無しさん
2008/07/31(木) 01:49:04あ、判定にそのコードを使ってるかって事ですね。
それは使ってないです。
deleteする時にその条件使えばいいかなと思ったので、
>>599の解答になりました。
0602デフォルトの名無しさん
2008/07/31(木) 02:02:03gccのバージョンとかglibcのバージョンとか含めてね。
その辺のことすら示さないで、何が「挙動の違い」だか。
0603デフォルトの名無しさん
2008/07/31(木) 02:24:28同じコード>>584
main()
{
string* aaa;
string* null_st;
null_st = new string("");
aaa = null_st;
delete null_st;
delete aaa
}
これで落ちると落ちないの違いがあるので挙動の違いじゃないんですか?
上記をコンパイルして実行してみるると、Solarisでは落ちます。Linuxでは落ちません。
挙動の違いじゃないなら何があるか逆に教えてください。
まだ互換性についても詳しくないので。
0604デフォルトの名無しさん
2008/07/31(木) 02:25:18Solarisでは落ちません。Linuxでは落ちます。
0605デフォルトの名無しさん
2008/07/31(木) 02:27:420606デフォルトの名無しさん
2008/07/31(木) 02:55:50それを乗せ換え時に改修してるだけ
0607デフォルトの名無しさん
2008/07/31(木) 04:48:54昨夜からまだやってたのか
string* aaa;
int cnt;
aaa = new string("");
if(cnt == 1) {
delete aaa;
aaa = new string("AAA");
}
delete aaa;
0608デフォルトの名無しさん
2008/07/31(木) 04:50:59string aaa;
public:
void set_aaa(const string& s) { aaa = s; }
const string& get_aaa() { return aaa; }
};
// どうしても aaaをポインタにしたいならいろいろとやることが増える
class bar {
string * aaa;
public:
bar() { aaa = new string(""); }
~bar() { delete aaa; }
void set_aaa(const string& s) { delete aaa; aaa = new string(s); }
const string& get_aaa() { return *aaa; }
bar(const bar& o) { aaa = new string(*o.aaa); }
bar& operator=(const bar& o) { aaa = new string(*o.aaa); return *this; }
};
0609デフォルトの名無しさん
2008/07/31(木) 08:45:11言語のルールとしては明らかにおかしいんだから、さらに情報が欲しければそれぞれのスレで聞いたほうがよいのでは?
で、おかしいコードを改修してるんだよね
その改修ポイントのアドバイスとしては>>605はピンポイントで教えてくれてるんだからそんなにつっかからなくてもいいんじゃない
0610デフォルトの名無しさん
2008/07/31(木) 09:28:49aaaはポインタじゃない方がいいんですね。
その場合どうするべきなのでしょう。
0611デフォルトの名無しさん
2008/07/31(木) 09:33:240612デフォルトの名無しさん
2008/07/31(木) 09:34:08全てのdeleteの直後にNULL代入のコードを追加して確認してみろ
0613デフォルトの名無しさん
2008/07/31(木) 09:51:44根本的なこと聞きたいんだけど、自分でプログラム組む時に
他人に質問しないでやり遂げられるくらいのレベルにはなってるの?
それともC/C++そのものがはじめて?
やり取り見てると何がしたいのかイマイチ意味不明。
確実なのは、Solarisのその落ちない状況が「たまたま」
だということで、「挙動の違い」というのが何を欲して
そういう風に言ってるのか分からない。
環境移してバグが表面化してるだけだから、解決方法は
ひとつしかない。二度開放するソースを直すしかない。
0614デフォルトの名無しさん
2008/07/31(木) 10:10:22>aaaはポインタじゃない方がいいんですね。
>その場合どうするべきなのでしょう。
string自体が文字ポインタとその先の文字配列を管理してるクラスなんだから
それをさらにポインタにしてそのインスタンスを管理するのは愚の骨頂。
>>584 のコードはこれだけになる。
main() {
string aaa;
int cnt = ... ;
if(cnt == 1) { aaa = "AAA"; }
}
つ〜か >>608 に解答があるじゃん。
0615デフォルトの名無しさん
2008/07/31(木) 10:26:040616デフォルトの名無しさん
2008/07/31(木) 10:57:33そのときはauto_ptrかshare_ptrを使おうぜ。
それなりにカオスな予感がするけど
std::auto_ptr<std::string> aaa(new std::string())
0617デフォルトの名無しさん
2008/07/31(木) 12:47:28ポインタと単語長を格納します。
class tango { public: char *p; int L; };
string str="abc defg hijkl mn\n opq \r\n rstu";
vector< tango > tng;
0618デフォルトの名無しさん
2008/07/31(木) 13:04:360619デフォルトの名無しさん
2008/07/31(木) 13:09:21相談したいんなら、まず自分で書いたコードから。
0620デフォルトの名無しさん
2008/07/31(木) 13:11:01class tango { public: char *p; int L;
output(){string x(L+1,'\0'); memcpy(&x[0],p,L); cout<<x<<endl;}};
chk(char c){ return (c==0 || c==' ' || c=='\r' || c=='\n');}
int main() {
string str="abc defg hijkl mn\n opq \r\n rstu";
vector<tango> tng;
int i=0,L,sz=str.size();
for(;i<sz && chk(str[i]); i++);
while(i<sz){
for(L=1; L<sz && !chk(str[i+L]); L++);
tango x; x.p=&str[i]; x.L=L;
tng.push_back(x); i+=L;
for(;i<sz && chk(str[i]); i++);}
for(i=0;i<tng.size();i++) tng[i].output();}
0621デフォルトの名無しさん
2008/07/31(木) 13:16:50chk のループは、 string の find_first_of() と find_first_not_of() で置き換えるのがおすすめ。
0622デフォルトの名無しさん
2008/07/31(木) 13:25:02関数の戻り値省略しちゃダメ。
> output(){string x(L+1,'\0'); memcpy(&x[0],p,L); cout<<x<<endl;}};
これは
void output() const {cout<<string(p, L)<<endl;}};
でいい。
そもそも tango 自体が string でいいような気もするけど。
0623デフォルトの名無しさん
2008/07/31(木) 13:27:210624デフォルトの名無しさん
2008/07/31(木) 13:37:40あくまで二重deleteにしか問題がない、ってことを他のソースコード
に一切手をつけないで確かめたいなら方法が無いこともないよ
0625デフォルトの名無しさん
2008/07/31(木) 13:49:21class tango { public: char *p; int L; output(){cout<<string(p,L)<<endl;}};
int main() {
string str="abc defg hijkl mn\n opq \r\n rstu";
char dem[]=" \r\n";
vector<tango> tng;
int i=0,j;
while(1){
i=(int)str.find_first_not_of(dem,i);
j=(int)str.find_first_of(dem,i);
if(i==-1 || j==-1)break;
tango x; x.p=&str[i]; x.L=j-i;
tng.push_back(x); i+=j-i;}
for(i=0;i<tng.size();i++) tng[i].output();}
0626デフォルトの名無しさん
2008/07/31(木) 13:52:10stringだと参照ではなくコピーになるので元のメモリかファイルの量の倍になってしまいます。
Returnはエラーでない限りは省略してました。voidとかreturnはコンパイラに依存しますね
0627デフォルトの名無しさん
2008/07/31(木) 14:00:37C++ の標準規格では戻り値の省略はできない。
そのソースがコンパイルできることがコンパイラ依存。
「voidとかreturnはコンパイラに依存」こっちは意味不明。
0628デフォルトの名無しさん
2008/07/31(木) 14:05:130629デフォルトの名無しさん
2008/07/31(木) 14:05:560630デフォルトの名無しさん
2008/07/31(木) 14:06:110631デフォルトの名無しさん
2008/07/31(木) 14:17:14tangoの中身をstringにすれば、625のコードで言うとこのstrが
空白区切りを終わった後は不要になるから、
何も考えずに倍のメモリを使うと決め付けるのは早計。
0632デフォルトの名無しさん
2008/07/31(木) 14:29:370633デフォルトの名無しさん
2008/07/31(木) 14:31:450634デフォルトの名無しさん
2008/07/31(木) 14:33:53「サイズが3Gとかあれば」なんて事情があるなら、そのとおりだが、
その場合は元データを string に入れるのが間違いだろ。
istream で読んで、空白区切りの単語をそれぞれ string に入れたほうがいい。
まぁそんなことは正直どうでもよくて、読み手はエスパーじゃないんだから、
そういう特定の事情に依存する話をあたりまえのようにするなってことだ。
0635デフォルトの名無しさん
2008/07/31(木) 18:12:39あとstringのfind_first_ofはバイナリに対応出来ないので自作しました。
#include <string>
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
string delimiter=" \r\n\0";
class tango { public: char *p; int L; output(){cout<<string(p,L)<<endl;}};
class file2array {
HANDLE fp, mp; char *p; DWORD sz;
public: file2array(string); ~file2array();
char* operator[](unsigned int); DWORD size();};
int find_of(file2array &p, string dem, int n){
unsigned int i,j;
for(i=n;i<p.size();i++){
for(j=0;j<dem.size(); j++)if(dem[j]==*p[i])return i;}
return -1;}
int find_not_of(file2array &p, string dem, int n){
unsigned int i,j,s;
for(i=n;i<p.size();i++){ s=0;
for(j=0;j<dem.size(); j++)if(dem[j]==*p[i])break; else s++;
if(s==dem.size())return i;}
return -1;}
0636デフォルトの名無しさん
2008/07/31(木) 18:13:17file2array p("text.txt");
vector<tango> tng;
int i=0,j;
while(1){
i=find_not_of(p,delimiter,i);
if(i==-1)break;
j=find_of(p,delimiter,i);
if(j==-1)break;
tango x; x.p=p[i]; x.L=j-i;
tng.push_back(x); i+=j-i;}
for(i=0;i<tng.size();i++) tng[i].output();
return 1;}
file2array::file2array(string name){
fp=CreateFile(&name[0], GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0 );
if(fp==INVALID_HANDLE_VALUE){cout<<"file load err\n";return;}
sz=GetFileSize(fp, NULL);
mp=CreateFileMapping( fp, 0, PAGE_READONLY, 0, 0, "memmap" );
if( mp <= 0 ){cout<<"mapping err\n";return;}
p=(char*)MapViewOfFile( mp, FILE_MAP_READ, 0, 0, 0);}
file2array::~file2array(){ UnmapViewOfFile(p);CloseHandle( mp );CloseHandle( fp );}
char* file2array::operator[](unsigned int n){ return (p+n); }
DWORD file2array::size(){return sz;}
0637デフォルトの名無しさん
2008/07/31(木) 18:29:20順次アクセスしたときキャッシュにデータ乗るかと言う事です。
毎回HDDにアクセスしたら鈍いです。
自分でキャッシュ管理した方が確実で汎用性が上がりますか?
0638デフォルトの名無しさん
2008/07/31(木) 18:33:23share しなきゃ OS がよきに計らってくれると思う
0639デフォルトの名無しさん
2008/07/31(木) 19:19:34あるオブジェクトのポインタを取得する関数が2通りあって、
どちらで取得したかによって、そのオブジェクトにアクセスできたり、
アクセスできずに落ちたりする現象が起こって困っています。
gdbで追っていくと、一方で取得したポインタは
(hoge *) 0x8f1d48 ←ポインタを返す関数で取得
もう一方で取得したポインタは
(hoge *&) @0x8f1b10: 0x8f1d48 ←ポインタのvectorを返す関数で取得後、at()で欲しい要素を取得
となっています。
同じアドレスを指しているのは間違いなさそうですが、
(hoge *)と(hoge *&)で異なった型?になっているようです。
これが原因かとも思うのですが、意味がよくわかりません。
もしお分かりになれば、教えていただけないでしょうか。
0640639
2008/07/31(木) 19:29:03再現する小さいコードが上手く作れない(再現しない)ので
コードがありません。申し訳ありません。
0641デフォルトの名無しさん
2008/07/31(木) 19:32:180642デフォルトの名無しさん
2008/07/31(木) 19:44:43バグはそこじゃないとこにいるんじゃね?
0643デフォルトの名無しさん
2008/07/31(木) 19:45:44検索しても実行ファイルのアイコンの変更が引っ掛かり、目的のページが見つからず困っています。
現在VC++2005(c++)で組んでいます。
0644デフォルトの名無しさん
2008/07/31(木) 19:47:12何に変更させるの?
0645デフォルトの名無しさん
2008/07/31(木) 19:50:12何でもいいのですが、例えば.aaa形式のファイルのアイコンをこちらで用意してある32x32の真っ黒のアイコンに変えたりなど。
拡張子を表示させている人はいいのですが、ファイル名だけを表示している人にとって全て未定儀形式のアイコンだと分かりずらくて。
0646デフォルトの名無しさん
2008/07/31(木) 19:52:54検索ワード
関連付け アイコン レジストリ
0648デフォルトの名無しさん
2008/07/31(木) 20:33:060649デフォルトの名無しさん
2008/07/31(木) 21:06:250650デフォルトの名無しさん
2008/07/31(木) 21:16:52人のプログラムを見てて、
new演算子を使用しているのにdelete演算子で開放していない場合としている場合がありました。
newとdeleteはセットで使うものだと参考書には書いてありましたが、
下のソースではp2をdeleteしていません。
deleteしなくてはいけない場合と、deleteしなくても良い場合があるのでしょうか?
hoge()
{
int *p1;
int i =0;
p1 = new int();
*p1 = 123;
〜中略
if(j==1)
{
int *p2;
p2 = new int();
{
delet p1;
}
0651デフォルトの名無しさん
2008/07/31(木) 21:19:500652デフォルトの名無しさん
2008/07/31(木) 21:33:32bar()
{
int *p1 = new int;
int *p2 = new int;
foo(p2);
delet p1;
}
foo(int *p)
{
// なんかいろいろ処理
delete p;
}
0653デフォルトの名無しさん
2008/07/31(木) 21:43:34どうせすぐ終了するからとdeleteをサボる場合があります。
でもホントはいけないことなので、必ずdeleteするクセをつけてください。
あと、他の関数に渡してその中でdeleteしている場合もありますが、
これも一ヵ月後の自分が見たときに混乱する原因になるだけなので控えるべきです。
0654デフォルトの名無しさん
2008/07/31(木) 21:45:470655デフォルトの名無しさん
2008/07/31(木) 21:50:37スマートポインタ使っても、中で何やってるか分かってないと詰まる事あるし。
0656デフォルトの名無しさん
2008/07/31(木) 21:55:49ありがとうございます。
0657デフォルトの名無しさん
2008/07/31(木) 22:25:57deleteしなくてもプログラム的には大丈夫なのですか?
もちろん悪い事なんでしょうけど、実行しても落ちたりしないですし。
0658デフォルトの名無しさん
2008/07/31(木) 22:32:45メモリが解放されないこと以外何の問題も無い
プログラム終了時にはきちんと解放される(ごく一部のOSを除いて)
0659デフォルトの名無しさん
2008/07/31(木) 22:34:53動かないプログラムって存在意義なくね?
0660デフォルトの名無しさん
2008/07/31(木) 22:35:100661デフォルトの名無しさん
2008/07/31(木) 22:37:00>>(ごく一部のOSを除いて)
これに該当しない限り大丈夫なわけですね。
>>659
ずっと動いているようなプログラムではまずいんですね。
0662デフォルトの名無しさん
2008/07/31(木) 22:39:450663デフォルトの名無しさん
2008/07/31(木) 22:50:55#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE *fp;
int i;
char buff[256];
memset( buff, 'Z', 256 );
if((fp = fopen( "nekoneko.txt", "w")) == NULL ) {
fprintf(stderr,"ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
printf("ファイル位置(書き込み前) = %ld\n",ftell(fp));
for (i=0; i<10; i++){
fputc('A',fp);
}
fputc('\0', fp);
printf("ファイル位置(書き込み後) = %ld\n",ftell(fp));
rewind(fp);
printf("ファイル位置(rewind後) = %ld\n",ftell(fp));
0664デフォルトの名無しさん
2008/07/31(木) 22:52:35// fclose( fp );
// fp = fopen( "nekoneko.txt", "r");
fread(buff, sizeof(char), 5, fp);
*(buff + 5) = '\0';
printf("%s \n", buff);
fclose(fp);
return(0);
}
○実行した結果 AAAAA とならずにあらかじめ初期化していた文字が表示されました。
Aを10個書き込んだのでrewind関数でファイルポインタを先頭に戻したので
ファイルの先頭からAを読み込めると思っていたのですがダメでした。
試しにfread関数の前で一度、ファイルをクローズ、読み込みモードで再度オープン
(コメントアウトした部分)を行えば AAAAA は表示されました
<質問>ファイルポインタの操作の仕方に問題があるのではないかと思いますが
どうして上手くいかないのかが解りません。
ファイルに書き込むことにより移動したファイルポインタを先頭に戻せば
ファイルの最初から読み込めると思ったのですがこれは間違いでしょうか?
・作成したファイル(nekoneko.txt)にはAは10個書き込まれている
・rewind関数の代わりにfseek(fp,0L,SEEK_SET) またはfgetpos関数、fsetpos関数で
ファイルポインタを先頭に戻しても駄目でした。
・ファイルから読み込むのにfread関数の他、fgets関数、fgetc関数を試したが
駄目でした。
・Visual Studio 2005でコンパイルしました。
0665デフォルトの名無しさん
2008/07/31(木) 22:56:540666デフォルトの名無しさん
2008/07/31(木) 23:04:52"w"で開くと読めない気がする
それをやりたいなら"a+"じゃないの?
0667デフォルトの名無しさん
2008/07/31(木) 23:08:39ファイルを開いて、読み書き同時にやることなんて、やったこと無かったな。
0668663
2008/07/31(木) 23:13:01コンパイルはOKでしたが実行時にエラーがでました
>>666
"a+"で実行したら上手く表示できました。
>>665、>>666さん ありがとうございました。
0669デフォルトの名無しさん
2008/07/31(木) 23:14:24tmpfile()はモード"wb+"で一時ファイルを作成してくれる
"w+"だと既存のファイルがあるならtruncateして作成する
"r+"はファイルがない場合は失敗する
読み書きを切り替えるときは間にfseek()/fsetpos()を挟むように汁
0670663
2008/07/31(木) 23:29:49ファイルの読み書きの時には + が必要なんですね
今までそんなことも気に掛けずにC言語の勉強してきました。
ありがとうございました。
0671デフォルトの名無しさん
2008/08/01(金) 00:08:47空欄を埋めよ
モード 目的 ファイルがあるとき ファイルがないとき
"r" 読み込み 開く
"w" 書き込み 開いて空にする
"a" 追記
"r+" 読み書き
"w+" 読み書き
"a+"
0672デフォルトの名無しさん
2008/08/01(金) 01:18:37コンパイル時に↓のようなメッセージが出ます。
*** glibc detected *** free(): invalid pointer: アドレス ***
調べてみると、
GCCのバージョンがC++アプリケーションと互換がない場合に起こると。
InkscapeまたはそのC++ライブラリ(libstdc++, libsigc++, libglibmm および libgtkmm)を同じバージョンのGCCで再コンパイルすれば、問題は解消する。
いうのは分かったのですが、「ライブラリを同じバージョンのGCCで再コンパイルすれば」というのが分かりません。
ライブラリは提供されているものだと思っているのですが、自分でもコンパイルできるのでしょうか?
gccのバージョンは346で上記の記述されいるライブラリを使用していると思われるのは
libstdc++ なのですが、
libstdc++のバージョンは詳しくわかりません。
libstdc++.so.6だとは思うんですが・・
行き詰ってしまったので解決策あればよろしくお願いします。
0673デフォルトの名無しさん
2008/08/01(金) 01:38:040674デフォルトの名無しさん
2008/08/01(金) 02:09:39> ライブラリは提供されているものだと思っているのですが、自分でもコンパイルできるのでしょうか?
そうだよ。
0675デフォルトの名無しさん
2008/08/01(金) 02:16:35どうやるのでしょうか
ソースがないと無理だと思ってました
良かったら教えてください。
0676デフォルトの名無しさん
2008/08/01(金) 02:17:280677デフォルトの名無しさん
2008/08/01(金) 02:17:40ソースはあるのでがんばってください
0678デフォルトの名無しさん
2008/08/01(金) 02:18:58やってみます。
どうもです。
0679デフォルトの名無しさん
2008/08/01(金) 04:55:13ネットゲームの解析等をやってみたいのですが
デバッガ?数値?C言語?な状態です・・・
一から勉強したいのですがどこで教わればいいのかわかりません
わかりやすい講座サイトを知ってる方いませんか?もしよければ教えて頂きたいです。
返事お待ちしてます
0680デフォルトの名無しさん
2008/08/01(金) 04:55:520681デフォルトの名無しさん
2008/08/01(金) 05:07:42つまり規約違反なことして俺TUEEEしたいんですねわかります
0682デフォルトの名無しさん
2008/08/01(金) 05:08:25ネトゲのチーとスレでもいけば?そこにもなんの情報も無いけどw
0683デフォルトの名無しさん
2008/08/01(金) 05:08:510684デフォルトの名無しさん
2008/08/01(金) 05:34:13・ネトゲ厨
・学生
・ルール違反
・文盲
三つ当てはまるだけで既に罪
五つも当てはめてるんじゃないぞコラ☆
0685デフォルトの名無しさん
2008/08/01(金) 06:01:08visualc++2008
をつかってるんですがコンパイルするときに
1>.\Debug\cal.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manifest. U_U!$kLdK
1>~[
って出ます。
これはなんなんでしょう。
スレ違いでしたらすみません。
0686デフォルトの名無しさん
2008/08/01(金) 06:14:15マニフェストが壊れてる。
それは新規に別のプロジェクトを作ってもでる?
0687デフォルトの名無しさん
2008/08/01(金) 06:17:30プロジェクトを新しく作り直したらでなくなりました。
ありがとうございました。
0688デフォルトの名無しさん
2008/08/01(金) 09:11:56次のようなファイル名をドライブ名付きのフルパスに
変換する方法を教えてください。
%CommonProgramFiles%\test.dat
0689デフォルトの名無しさん
2008/08/01(金) 09:13:53次のようなファイル名をドライブ名付きのフルパスに
変換する方法を教えてください。
%CommonProgramFiles%\test.dat
0690デフォルトの名無しさん
2008/08/01(金) 09:15:29それはライブラリの互換性を気にするより前に、アプリケーションプロ
グラムのバグを疑うべき。free()におかしなアドレスを渡しているって
いうのが直接の問題だから。
0691デフォルトの名無しさん
2008/08/01(金) 09:21:26次のようなファイル名をドライブ名付きのフルパスに
変換する方法を教えてください。
%CommonProgramFiles%\test.dat
0692デフォルトの名無しさん
2008/08/01(金) 09:22:31次のようなファイル名をドライブ名付きのフルパスに
変換する方法を教えてください。
%CommonProgramFiles%\test.dat
0693デフォルトの名無しさん
2008/08/01(金) 09:23:59いやいや、リンク時の話
.so と .a のバージョンが違うぜって事
0694デフォルトの名無しさん
2008/08/01(金) 09:26:56GetEnvironmentVariable
SHGetSpecialFolderPath
0695540
2008/08/01(金) 09:49:50必要ないかもしれませんが、経過と報告を。
結局2重開放しないように修正しました。
>>598
まさしくその判定を使っているところがあったので、
削除はやめました。
>>613
初心者に毛が生えた程度です。
会社から2ch見れないので返事遅くなりすいません。
ありがとうございました。
0696デフォルトの名無しさん
2008/08/01(金) 19:13:42float x[100], z[100];
} formation;
void init()
{
float MIN=20;
int baseX[] = { 0, -1, 1, 0, -1, 1, 0, -1, 1, -2, 2, -2, 2, -2, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2 };
int baseZ[] = { 0, 0, 0, -1, -1, -1, 1, 1, 1, 0, 0, -1, -1, 1, 1, -2, -2, -2, -2, -2, 2, 2, 2, 2, 2 };
for(int i = 0; i < 25; i++)
{
formation.x[i] = baseX[i] * MIN;
formation.z[i] = baseZ[i] * MIN;
}
}
int main()
{
init();
return 0;
}
実行するとエラーが出て、その原因がわかりません。文法がおかしいのでしょうか? VC++2008です
>.\main.c(11) : error C2143: 構文エラー : ';' が '型' の前にありません。
1>.\main.c(11) : error C2065: 'i' : 定義されていない識別子です。
1>.\main.c(12) : error C2143: 構文エラー : ';' が '{' の前にありません。
1>.\main.c(13) : error C2065: 'i' : 定義されていない識別子です。
1>.\main.c(14) : error C2065: 'i' : 定義されていない識別子です。
0697デフォルトの名無しさん
2008/08/01(金) 19:16:30for(i = 0; i < 25; i++)
0698デフォルトの名無しさん
2008/08/01(金) 19:16:54main.c を main.cpp に変更してみては?
0699デフォルトの名無しさん
2008/08/01(金) 19:17:460700デフォルトの名無しさん
2008/08/01(金) 19:30:07解決しました。たまにCやるとこれだ
0701デフォルトの名無しさん
2008/08/01(金) 21:53:03同じ配列を表すのに下記のように違う書き方があります。
書き方によって処理の速度に違いなど出てくるのでしょうか?
int a[100] = { 1, 2, 3, 4, 5,・・・・,100 };
int *po;
int cnt;
po = a + 10;
(1)
for( cnt = 10 ; cnt < 100 ; cnt++ ){
printf( " %d", a[ cnt ] );
} ^^^^^^^
(2)
for( cnt = 10 ; cnt < 100 ; cnt++ ){
printf( " %d", *(a + cnt) );
} ^^^^^^^^^
(3)
for( cnt = 10 ; cnt < 100 ; cnt++ ){
printf( " %d", *(po++) );
} ^^^^^^^
0702デフォルトの名無しさん
2008/08/01(金) 21:55:55出る場合もあるし出ない場合もある
個々のコンパイラの出来による
0703デフォルトの名無しさん
2008/08/01(金) 21:57:37それを気にしないといけない状況ではないと思う
0704デフォルトの名無しさん
2008/08/01(金) 22:11:030705デフォルトの名無しさん
2008/08/01(金) 22:16:30>>703
書き方によって処理の速度に違いがあるのなら
その書き方を意識して勉強していこうと思っていましたが
コ、コ、コンパイラとかそんなもん全然手が出せないので
地道に勉強していきます。
ありがとうございました。
0706デフォルトの名無しさん
2008/08/01(金) 22:22:57基本は、読みやすさ優先でOK
0707デフォルトの名無しさん
2008/08/01(金) 23:00:39VCだとデバッグ時に範囲チェックしてるせいで、[]より+の方が速かった。
0708デフォルトの名無しさん
2008/08/01(金) 23:06:410709デフォルトの名無しさん
2008/08/01(金) 23:19:50と思って、逆アセンブルでコード見てみたけど、範囲チェックらしき処理はなかった。
0710デフォルトの名無しさん
2008/08/01(金) 23:37:430711デフォルトの名無しさん
2008/08/01(金) 23:40:31見たい箇所にブレイクポイントを入れて、逆アセンブルのウインドウ開くだけだから、
わざわざって言うほど手間じゃないよ。
0712デフォルトの名無しさん
2008/08/01(金) 23:45:210713デフォルトの名無しさん
2008/08/02(土) 00:09:360714デフォルトの名無しさん
2008/08/02(土) 00:26:08int dmy1[10];
int tbl[100];
int dmy2[10];
tbl[100] = 1;
ポインタ経由で書き込んでみても同じエラーがでた。
int *p = tbl;
*(p+100) = 1;
どうやってトラップしてるんだろ。
0715デフォルトの名無しさん
2008/08/02(土) 01:37:530716デフォルトの名無しさん
2008/08/02(土) 09:26:11こんな感じの処理
int tbl[100]; int trap; // tbに続けて配置
trap = 121212; // 適当なmagic number
int *p = tbl; *(p+100) = 1;
if (trap != 121212) abort(); // 書き換わってないかチェック
なもんで
*(p+110) = 1 と大きく跳ぶと引っかからない。
0717デフォルトの名無しさん
2008/08/02(土) 11:36:13どれがあってるのか知らんが脳内が如何に多いのか分かってw
0718デフォルトの名無しさん
2008/08/02(土) 11:56:280719デフォルトの名無しさん
2008/08/02(土) 12:47:16VisualStudioを使ってるならデフォルトオンになってると思うよ。それで見解に差が出ている。
0720デフォルトの名無しさん
2008/08/02(土) 13:01:51「脳内が如何に多いのか」、多少無理のある誤読でもいいから、
とにかくわかりたくて仕方がないんだよ。
思春期の自尊心ってそういうもんでしょ?
0721デフォルトの名無しさん
2008/08/02(土) 18:10:06代入したいのですがそういう事は可能でしょうか?
javaとかだとこんな感じの事です。
var s1 = ["【", "】"];
散々調べたのですが見つからなくて。
0722デフォルトの名無しさん
2008/08/02(土) 18:47:070723デフォルトの名無しさん
2008/08/02(土) 18:48:22C++0xまで待ってください。
0724デフォルトの名無しさん
2008/08/03(日) 00:33:47#include <string>
using namespace std;
int main()
{
string s1("【" "】");
cout << s1 << endl;
}
まあ、そういうことじゃないのは分かってるけど。
0725724
2008/08/03(日) 00:36:050726デフォルトの名無しさん
2008/08/03(日) 00:38:520727デフォルトの名無しさん
2008/08/03(日) 00:42:50std::vector<std::string> > strings(initial_strings, sizeof(initial_strings) / sizeof(* initial_strings));
0728デフォルトの名無しさん
2008/08/03(日) 00:46:27709だけど、おれは別に脳内じゃないぞ。
関数を抜けるときにある範囲チェックを見逃してたけど、それは「範囲チェックで配列アクセスが遅くなる」って
話題とは関係ないから。
0729デフォルトの名無しさん
2008/08/03(日) 08:36:490730デフォルトの名無しさん
2008/08/03(日) 10:09:58class Test
{
public:
Test()
{
???
}
private:
double values[N];
};
このvaluesをコンストラクタで全て0.0にしたいとき、
どんな方法が環境非依存でベター?
std::fill_n?
0731デフォルトの名無しさん
2008/08/03(日) 10:18:06#include "stdio.h"
main( )
{
int ans=10;
printf("%d\n",ans);
retrun 0;
}
と書いてあったんですけど、これであってますか?
0732デフォルトの名無しさん
2008/08/03(日) 10:37:120733デフォルトの名無しさん
2008/08/03(日) 10:37:15パソコンなら問題ないんじゃね。
組込み機器で使おうと思ってるなら、標準ライブラリが存在しない場合も考慮して
for ( int i = 0; i<<N; i++ ) { values[i] = 0.0; }
とか?
>>731
あってるというのはどういう意味?
コンパイラを通してみれば、文法があってるかどうかは確認できるよ。
人間の目でチェックするより信頼できる。
動作があってるかどうか確かめるなら、実際にコンパイルして動かしてみるといいよ。
にちゃんねらの脳内で実行するより信頼できる。
0734デフォルトの名無しさん
2008/08/03(日) 10:39:45> main( )
その参考書は捨てて良い。
0735デフォルトの名無しさん
2008/08/03(日) 10:48:29標準ライブラリとかは使えるとして、
なんか定番の初期化の方法とかあるのかな〜と思って。
tnks
0736デフォルトの名無しさん
2008/08/03(日) 11:08:02std::memset
0737デフォルトの名無しさん
2008/08/03(日) 11:22:23何処がおかしいでしょうか?
font->draw()は画面に文字表示する関数です。
void draw(const wchar_t* text, Point position,Color color)
----------------------------------------------------------
std::string stdstr="自民党総裁";
const char* cstring = new char[256];
cstring = stdstr.c_str();
wchar_t wcstring[sizeof(cstring)*2];
MultiByteToWideChar(
CP_ACP, 0, cstring, strlen(cstring), wcstring, sizeof(wcstring));
font->draw(wcstring,Point(0,0,0,0),0xFFFF0000);
------------------------------------------------------------
↑では「自民党総裁 」の後ろに意味不明な文字が何個か表示されてしまいます。
単純に
font->draw(L"自民党総裁",Point(0,0,0,0),0xFFFF0000);
とした場合はきちんと表示されます。
0738デフォルトの名無しさん
2008/08/03(日) 11:32:31>cstring = stdstr.c_str();
char[256]分がメモリリーク
>MultiByteToWideChar(CP_ACP, 0, cstring,
>strlen(cstring)
'\0'が含まれないので、wcstringにもL'\0'が付かない
0739デフォルトの名無しさん
2008/08/03(日) 11:34:29ありがとうございます。
して、、どう書けばよろしいのでしょうか・・・
0740デフォルトの名無しさん
2008/08/03(日) 11:38:28wchar_t wcstring[sizeof(cstring)*2];
やりたいことはわかるけど、ポインタのサイズの2倍の個数の文字分
を確保するというコードになっている。(32btiプロセッサなら8文字)
"自民党総裁"は五文字だからたまたま納まっているけど、意図したい
のはそうじゃないでしょ?
0741737
2008/08/03(日) 11:47:35その方が、どこがおかしかったか理由が類推しやすいので
理解しやすいです。
今のところ原因が全く分からないので
途中の理由を書かれても何のことか理解できないです;;
0742デフォルトの名無しさん
2008/08/03(日) 11:48:54wcstring[sizeof(cstring)*2] ='\0';
などと最後にくっつけてみましたが
変な文字が減ったものの完治はしませんでした。
0743デフォルトの名無しさん
2008/08/03(日) 11:50:06wchar_t wcstring[256];
MultiByteToWideChar(CP_ACP, 0, stdstr.c_str(), -1, wcstring, sizeof(wcstring));
0744デフォルトの名無しさん
2008/08/03(日) 11:51:27おいおいメモリ壊してないか?
0745デフォルトの名無しさん
2008/08/03(日) 11:54:44ども
0746デフォルトの名無しさん
2008/08/03(日) 11:58:18ありがとうございます。
でも>>737の変換は全部通さないといけないので省略はできないのです。
実際のソースは関数に渡してたりしていて、そのせいでこの変換が必要なんです。
>>744
wchar_t wcstring[strlen(cstring)*2];
MultiByteToWideChar(
CP_ACP, 0, cstring, strlen(cstring), wcstring, sizeof(wcstring));
wcstring[strlen(cstring)*2] ='\0';
としたらコンパイルできませんでした;;
0747デフォルトの名無しさん
2008/08/03(日) 12:03:05const char* cstring = new char[256];
とか
wchar_t wcstring[256];
みたいに適当に決め打ちするのってよくないですよね?
0748デフォルトの名無しさん
2008/08/03(日) 12:06:07言ってる意味がわからないんだが・・・
0749デフォルトの名無しさん
2008/08/03(日) 12:08:16std::string → const char* →wchar_t
という順序で必ず変換をしないといけないということです。
0750デフォルトの名無しさん
2008/08/03(日) 12:08:56もうちょっとC言語の基本しっかりしてから見直したほうがいいと思う。
確かに決めうちはよくないけど、それ以前に言語の動作が分かってない。
現状の知識でプログラム書いても正しいものにならないよ。
0751デフォルトの名無しさん
2008/08/03(日) 12:09:31std::vector<wchar_t> wbuf(stdstr.length()*2+1);
MultiByteToWideChar( , , stdstr.c_str(), stdstr.length(), &wbuf[0], wbuf.size());
font->draw(&wbuf[0],Point(0,0,0,0),0xFFFF0000);
0752デフォルトの名無しさん
2008/08/03(日) 12:11:38意味がわからん・・・
>>743は実質、const char* → wchar_t なわけだが。
0753デフォルトの名無しさん
2008/08/03(日) 12:12:250754デフォルトの名無しさん
2008/08/03(日) 12:15:050755デフォルトの名無しさん
2008/08/03(日) 12:16:09実際のソースは関数を跨いでるので、
その引数にあわせてあの順序で変換しながら渡さないといけないんです。
0756デフォルトの名無しさん
2008/08/03(日) 12:16:58宿題?
std::string → const char*なんて、c_str()でしかないと思うけど
0757デフォルトの名無しさん
2008/08/03(日) 12:19:13{
int len = MultiByteToWideChar(CP_ACP, 0, s.data(), s.size(), 0, 0);
std::vector<wchar_t> vec(len);
MultiByteToWideChar(CP_ACP, 0, s.data(), s.size(), &vec[0], len);
return std::wstring(vec.begin(), vec.end());
}
こんな感じかね
エラー処理省略してるが
標準C++の範囲でも一応エンコード変換できるっちゃできるけど
実装や信頼性がまちまちだったりするのがどうもな
0758デフォルトの名無しさん
2008/08/03(日) 12:20:15std::string str = "a";
const char* cs = str.c_str();
f(cs);
と
std::string str = "a";
f(str.c_str());
が同じってことは分かる?
0759デフォルトの名無しさん
2008/08/03(日) 12:21:17multibyte<->widechar変換の機能がほしいとか
CStringAのようにmbsをケアしてほしいとかいう意味じゃないの
0760デフォルトの名無しさん
2008/08/03(日) 12:22:04なんで質問の条件無視して話し勧めようとするんですか・・・
0761デフォルトの名無しさん
2008/08/03(日) 12:23:30ここはべつに君のための場所ではないからだよ
2chをカスタマーサポートセンターか何かだと思ってるのかい?
0762デフォルトの名無しさん
2008/08/03(日) 12:23:340763デフォルトの名無しさん
2008/08/03(日) 12:25:300764デフォルトの名無しさん
2008/08/03(日) 12:26:22自民党総裁とか書いてる時点で厨くせぇと思っていたが
0765デフォルトの名無しさん
2008/08/03(日) 12:26:55>>756と>>758に答えてもらえます?
>>763
形は崩してないと思うよ。
>>743はちゃんとstd::string → const char* →wchar_tになってるし。
0766デフォルトの名無しさん
2008/08/03(日) 12:27:43おもすれー
0767デフォルトの名無しさん
2008/08/03(日) 12:34:10const char* cs = str.c_str();
f(cs);
と
std::string str = "a";
f(str.c_str());
これが同じなのは分かります。
ですがとりあえず下の順序を守ってください。
stdstrからスタートして、
const char*を必要最小限用意してそれに代入し、
最終的に必要最小限のwchar_tに出力してください。
std::string stdstr="自民党総裁";
const char* cstring = new char[256];
cstring = stdstr.c_str();
wchar_t wcstring[sizeof(cstring)*2];
MultiByteToWideChar(
CP_ACP, 0, cstring, strlen(cstring), wcstring, sizeof(wcstring));
0768デフォルトの名無しさん
2008/08/03(日) 12:37:00>これが同じなのは分かります。
下の文章・ソースを読む限り、分かってないです。
0769デフォルトの名無しさん
2008/08/03(日) 12:41:56そのソースでどれだけバカなことやってるか分かるから。
0770デフォルトの名無しさん
2008/08/03(日) 12:44:320771デフォルトの名無しさん
2008/08/03(日) 12:45:310772デフォルトの名無しさん
2008/08/03(日) 12:47:15>>750
>>770
>>740
0773デフォルトの名無しさん
2008/08/03(日) 12:48:11それを言う理由ってなんですか?
おかしいのは分かってるんで、だから質問してるわけですが。
0774デフォルトの名無しさん
2008/08/03(日) 12:48:44それはない。
0775デフォルトの名無しさん
2008/08/03(日) 12:49:57じゃあもうこのスレいりませんね。
どの質問も勉強して来いで終了ですね。
0776デフォルトの名無しさん
2008/08/03(日) 12:51:040777デフォルトの名無しさん
2008/08/03(日) 12:51:040778デフォルトの名無しさん
2008/08/03(日) 12:51:16cstring = stdstr.c_str();
ここでnew char[256]で確保した領域へのポインタは上書きされちゃってるけど
どうやってdeleteするつもりなんですか
newの意味ちゃんとわかってる?
0779デフォルトの名無しさん
2008/08/03(日) 12:53:28>>746の「そのせいでこの変換が必要なんです」のようなことを言うには、
知識が足りなさ過ぎるってことだよ
0780デフォルトの名無しさん
2008/08/03(日) 12:53:570781デフォルトの名無しさん
2008/08/03(日) 12:54:54256を期待してるなら間違いだぞ
4か8になるはずだ(環境による)
どうしてかはちゃんと調べることだ
0782デフォルトの名無しさん
2008/08/03(日) 12:57:06>>740
0783デフォルトの名無しさん
2008/08/03(日) 12:57:25人の話を聞いて理解を深めていこうとする人、ちゃんとコミュニケーションが取れる人には
ちゃんと教えてくれると思うよ。教えたがりも多いし。
説明はいいから俺の望む形で答え教えれ、なんていうからこんな流れになる。
0784デフォルトの名無しさん
2008/08/03(日) 12:58:430785デフォルトの名無しさん
2008/08/03(日) 13:00:24どう書けばいいかだけ教えてくれればいいんです
バカにしないで下さい
0786デフォルトの名無しさん
2008/08/03(日) 13:03:150787デフォルトの名無しさん
2008/08/03(日) 13:08:25クラスのメンバとしてstd::string stdstrを持ってます。
これにはstdstr = "自民党総裁";などと代入してあります。
で、引数がconst* charの関数にそれを渡します。
その際は、単純にstdstr.c_str()を使って渡します。
でその関数の中で文字表示font->draw()を実行しますが
それはwchar_tを要求します。
というわけでconst* charへはc_str()を使うだけでいいのは分かるのですが
質問するに際し、関数の受け渡しの部分を省略するために
>>737のように書いてみたわけです。
だから無駄なことをやってるのは分かるんですが、
もし実際書くとしたらどう書いたらいいのかということが気になります。
0788デフォルトの名無しさん
2008/08/03(日) 13:12:05質問する時はなるべく省略するべきではないこと、やむをえず省略した場合は、
その部分の都合は相手には伝わらないのが当然だということを理解してください。
0789デフォルトの名無しさん
2008/08/03(日) 13:14:21もう一度言うが
std::string str = "a";
const char* cs = str.c_str();
f(cs);
と
std::string str = "a";
f(str.c_str());
は同じなんだよ。少しは考えろ。
0790デフォルトの名無しさん
2008/08/03(日) 13:15:07わけあってこういう事がしたい、って何度も何度も何度も何度も断った上で
お願いしてるんですから、別にそれ以上詮索する必要なんて無いですよね。
田代趣味があるならともかく。
0791デフォルトの名無しさん
2008/08/03(日) 13:15:54だからそれは知ってるって言ってるでしょ。
少しは考えろ。
0792デフォルトの名無しさん
2008/08/03(日) 13:16:090793デフォルトの名無しさん
2008/08/03(日) 13:16:280794デフォルトの名無しさん
2008/08/03(日) 13:16:460795デフォルトの名無しさん
2008/08/03(日) 13:17:37std::string stdstr = "自民党総裁";
const char *cstring = stdstr.c_str();
wchar_t wcstring[256];
MultiByteToWideChar(CP_ACP, 0, cstring, -1, wcstring, sizeof(wcstring));
これでいいか?
>>743と意味は全く同じだがな
0796デフォルトの名無しさん
2008/08/03(日) 13:18:07いや、同じじゃないし。
前者はありがちなミス。
0797デフォルトの名無しさん
2008/08/03(日) 13:18:13MultiByteToWideChar(CP_ACP, 0, stdstr.c_str(), -1, wcstring, sizeof(wcstring));
を
const char* cstring = stdstr.c_str();
MultiByteToWideChar(CP_ACP, 0, cstring, -1, wcstring, sizeof(wcstring));
にする理解力/応用力すら無いならプログラム書くのは諦めた方が良い。
0798デフォルトの名無しさん
2008/08/03(日) 13:20:02これって何を意味しますか?
これは不正ですか?
0799デフォルトの名無しさん
2008/08/03(日) 13:20:510800デフォルトの名無しさん
2008/08/03(日) 13:21:290801デフォルトの名無しさん
2008/08/03(日) 13:21:44勝手に他人のやることを規定するなどという
思い上がりも甚だしいお前は人間諦めたほうがいいんじゃね。
0802デフォルトの名無しさん
2008/08/03(日) 13:21:51いや、同じだし。
おそらくc_str()の結果の有効期間を勘違いしてるよ。
0803デフォルトの名無しさん
2008/08/03(日) 13:22:24char型256個分の領域を確保して、そこへのポインタをcstringに納める
そこに文字列を入れたかったらstrcpy(cstring, stdstr.c_str())とかする
cstring = stdstr.c_str()はポインタを上書きするだけだからアウト
0804デフォルトの名無しさん
2008/08/03(日) 13:23:01ムキになんなw
0805デフォルトの名無しさん
2008/08/03(日) 13:23:09char 型で要素数256の配列の領域をnewで確保した。
cost char * 型の変数cstringを宣言・定義した。
その確保した領域の先頭アドレスをcstringの初期値として設定した。
その一文自体は不正ではない。
0806デフォルトの名無しさん
2008/08/03(日) 13:24:07なるほど。分かりました。
0807デフォルトの名無しさん
2008/08/03(日) 13:25:36おもすれ
0808デフォルトの名無しさん
2008/08/03(日) 13:26:06>そこに文字列を入れたかったらstrcpy(cstring, stdstr.c_str())とかする
ならそういう書き方を教えてくれたらよかったのに・・・。
わざわざ領域確保して云々って条件で聞いてたんだから。
0809デフォルトの名無しさん
2008/08/03(日) 13:26:200810デフォルトの名無しさん
2008/08/03(日) 13:27:220811デフォルトの名無しさん
2008/08/03(日) 13:28:49ゆとりこえー
0812デフォルトの名無しさん
2008/08/03(日) 13:29:530813デフォルトの名無しさん
2008/08/03(日) 13:30:26strcpyで書けるならその書き方で教えればよかっただけじゃん。
かたくなに秘密にする意味って何www
0814デフォルトの名無しさん
2008/08/03(日) 13:30:48仕様書再確認しちまったじゃねぇか!
やっぱ違うぞ。
0815デフォルトの名無しさん
2008/08/03(日) 13:32:52「const char*の領域を新たに確保すること」という条件が付いた課題で無い限り、
>>737,>>787にstrcpyを使うのは馬鹿でしかないから。
0816デフォルトの名無しさん
2008/08/03(日) 13:35:58delete cstringじゃないからな
0817デフォルトの名無しさん
2008/08/03(日) 13:37:49何のためにconst付けてんの
0818デフォルトの名無しさん
2008/08/03(日) 13:38:20ごめんおしえて
>>789の上と下どう違うの? 何か見落としてるのか…?
0819デフォルトの名無しさん
2008/08/03(日) 13:39:24何がどう違うんだよ・・。
str.c_str()の戻り値は、strの非constメンバ関数が呼ばれるまで有効だぞ。
0820デフォルトの名無しさん
2008/08/03(日) 13:39:34だから何度も何度も何度も何度も”あえて”そう書くとしたらって断り入れたのに。
0821デフォルトの名無しさん
2008/08/03(日) 13:44:19つまりお前の説明が下手過ぎたってことだ。
それから宿題なら最初からそう言え。
0822デフォルトの名無しさん
2008/08/03(日) 13:45:14const付けてる時点で中身変えるつもりないんだろ(とみんな理解したはずだ)
MultiByteToWideCharを呼ぶまでに中身が変わらないならnewだのstrcpyだのは全く必要ない
中身変えたいならconst消せよ
0823デフォルトの名無しさん
2008/08/03(日) 13:45:440824デフォルトの名無しさん
2008/08/03(日) 13:47:55f(cs);
※の時点でEOSが来てるからc_str()が作った一時オブジェクトが消えてるかもしれない
f(str.c_str());
fにc_str()の戻り値が渡されて、fの実行が終わってからEOSだからfの実行中は一時オブジェクトが生きてることが保証される
こうですかわかりません
c_strってstring内のメンバへのポインタ戻すだけなの?一時オブジェクト作るの?
前者なら>>819の言う通りだし後者なら上で書いた通りになると思うんだけど
0825デフォルトの名無しさん
2008/08/03(日) 13:50:34コンストラクタ/デストラクタを持たない型の値を
一時オブジェクトとは普通言いません。
0826デフォルトの名無しさん
2008/08/03(日) 13:52:20どっちもありうる。
が、実際はポインタ返すだけの実装ばっか。
0827デフォルトの名無しさん
2008/08/03(日) 13:52:350828デフォルトの名無しさん
2008/08/03(日) 13:53:26>819 の言うとおり、次の非 const メンバ関数を呼ぶまでの間有効なポインタを返す。
一時オブジェクトは作られない。
やっぱり >814 が何を言ってるのかわからない。
0829デフォルトの名無しさん
2008/08/03(日) 13:53:54でも一時オブジェクトを作るのだとしても非constメンバ関数が呼ばれるまで有効なようになってなきゃライブラリが規格違反ってこった。
0830デフォルトの名無しさん
2008/08/03(日) 13:54:11作れねぇよ。
0831デフォルトの名無しさん
2008/08/03(日) 13:54:40char配列の一時オブジェクトなんか作れるわけないな。勘違いしてた
だったらstrの非constメンバ呼ばれるまでは大丈夫そうだけど
0832デフォルトの名無しさん
2008/08/03(日) 13:56:50一時オブジェクトを返すんじゃなくて、
stringが内部的に一時オブジェクトを作ってその中で確保した領域のポインタを返すことはありえる。
でも、そんなことはどっちでもいいよな。
0833デフォルトの名無しさん
2008/08/03(日) 13:58:51お前も要勉強だなw
それやったら f(str.c_str()); でf値が渡る前に
その一時オブジェクトはデストラクトされてるよ。
0834デフォルトの名無しさん
2008/08/03(日) 13:59:05(現存するstd::stringにそんな実装は無いかも知れないけど)
故にc_str()はthrow()ではない。
何で今更こんな話題で盛り上がってるのかと思ったが、>>814のおかげということが分かった。
0835デフォルトの名無しさん
2008/08/03(日) 14:00:54別に決められてるわけじゃないんだろ
0836デフォルトの名無しさん
2008/08/03(日) 14:01:21初心者は歓迎だが、
質問のしかたも分からない馬鹿は帰れ
0837デフォルトの名無しさん
2008/08/03(日) 14:02:13仮にこうなるとすると、それが開放されるチャンスはどこにあるの?
0838デフォルトの名無しさん
2008/08/03(日) 14:02:45一時オブジェクト ≠ 一時的に存在するオブジェクト
一時オブジェクトは規格の用語なので他の意味に転用しないように
0839デフォルトの名無しさん
2008/08/03(日) 14:03:03回答の仕方も分からない馬鹿は帰れ
0840デフォルトの名無しさん
2008/08/03(日) 14:04:09次にc_strが呼ばれて作り直すときとか
string自体のデストラクタとかじゃないの
0841デフォルトの名無しさん
2008/08/03(日) 14:05:04それと戻り値の有効期間や一時オブジェクトの話は関係無いぞ。
その実装ならstringのメンバに保持しておく必要がある。
0842デフォルトの名無しさん
2008/08/03(日) 14:06:21それ一時オブジェクトじゃないよ
0843デフォルトの名無しさん
2008/08/03(日) 14:07:40質問あっての回答だろうw
エスパーじゃないんだからw
0844デフォルトの名無しさん
2008/08/03(日) 14:10:41実装を考えてみると、stringのメンバにcchar*戻値用のvectorとかchar*とか
あって、そこに確保して返すことになるんじゃないか。
解放タイミングはstringのデストラクト時で。
0845デフォルトの名無しさん
2008/08/03(日) 14:11:43テンポラリオブジェクトとか読みかえれ
0846デフォルトの名無しさん
2008/08/03(日) 14:12:22どっちも同じで語弊があるのも同じ。
0847デフォルトの名無しさん
2008/08/03(日) 14:13:440848デフォルトの名無しさん
2008/08/03(日) 14:15:050849デフォルトの名無しさん
2008/08/03(日) 14:15:15非constメンバ呼ばれるまでは有効なことには変わりないんじゃないの
0850デフォルトの名無しさん
2008/08/03(日) 14:15:43string 内部のオブジェクト。
0851デフォルトの名無しさん
2008/08/03(日) 14:19:45そうなんだけど一部の人が違うと言い張ってる。←いまここ
0852デフォルトの名無しさん
2008/08/03(日) 14:26:58その仕様書書いた奴が元凶かと。
やはり仕様書としては「The C++ Programming Language」の
PDFを持っておくべき。
あと関係無いけどD&Eオヌヌメ
0853デフォルトの名無しさん
2008/08/03(日) 14:41:47レス速度を見ただけでワクワクしてしまった
俺は間違いなく出遅れ
/ ̄\
| ^o^ |
\_/
0854デフォルトの名無しさん
2008/08/03(日) 14:54:16Requires: The program shall not alter any of the values stored in the array.
Nor shall the program treat the returned value as a valid pointer value
after any subsequent call to a nonconst member function of
the class basic_string that designates the same object as this.
「nonconstなメンバ関数呼び出しのあとは返されたポインタをさわっちゃいかんよ」
とは書いてあるけど「それまでは大丈夫だよ」ともはっきり書いてないな
でも、この書き方だと大丈夫だと受け取っていいんだろな
0855デフォルトの名無しさん
2008/08/03(日) 15:02:070856デフォルトの名無しさん
2008/08/03(日) 15:21:130857デフォルトの名無しさん
2008/08/03(日) 15:22:170858デフォルトの名無しさん
2008/08/03(日) 15:30:25このstringから"abc"を取り除く(つまり"cba"にする)には、どうやればいいですか?
0859デフォルトの名無しさん
2008/08/03(日) 15:38:24{
string::size_type m = 0, n;
while ((n = s.find(from, m)) != string::npos) {
s.replace(n, from.size(), to);
m = n + to.size();
}
return s;
}
こんなもんでいいと思うが
boost::regexでも使っとけ
0860デフォルトの名無しさん
2008/08/03(日) 15:40:020862デフォルトの名無しさん
2008/08/03(日) 15:51:370863デフォルトの名無しさん
2008/08/03(日) 15:53:16自演の予感。
0864デフォルトの名無しさん
2008/08/03(日) 15:54:32残念ながら違うんだなこれが
0865デフォルトの名無しさん
2008/08/03(日) 15:55:030866デフォルトの名無しさん
2008/08/03(日) 15:55:190867デフォルトの名無しさん
2008/08/03(日) 15:55:230868デフォルトの名無しさん
2008/08/03(日) 15:56:120869デフォルトの名無しさん
2008/08/03(日) 16:04:250870デフォルトの名無しさん
2008/08/03(日) 16:04:430871デフォルトの名無しさん
2008/08/03(日) 16:07:020872デフォルトの名無しさん
2008/08/03(日) 16:07:590873デフォルトの名無しさん
2008/08/03(日) 16:08:50自演の予感
0874デフォルトの名無しさん
2008/08/03(日) 16:09:44残念ながら違うんだなこれが
0875デフォルトの名無しさん
2008/08/03(日) 16:10:45こうですかわかりません><
0876デフォルトの名無しさん
2008/08/03(日) 16:12:36sageとるがな
0877デフォルトの名無しさん
2008/08/03(日) 16:14:540878デフォルトの名無しさん
2008/08/03(日) 16:15:570879デフォルトの名無しさん
2008/08/03(日) 16:16:180880デフォルトの名無しさん
2008/08/03(日) 16:17:44残念ながら違うんだなこれが
0881デフォルトの名無しさん
2008/08/03(日) 16:18:51残念ながら違うんだなこれが。
0882デフォルトの名無しさん
2008/08/03(日) 18:21:10VCならTest() : values() {}
で規定値で初期化されるみたい
0883デフォルトの名無しさん
2008/08/03(日) 18:23:16\すげぇ/
0884デフォルトの名無しさん
2008/08/03(日) 18:27:140885デフォルトの名無しさん
2008/08/03(日) 18:32:160886デフォルトの名無しさん
2008/08/03(日) 19:01:51// Debug用コード
#else
// Release用コード
#endif
こんな感じでDebug用とRelease用をわけるときのXXXの部分に入るマクロが思い出せないです。
何か標準であったと記憶しているのですが何でしたっけ?
0887デフォルトの名無しさん
2008/08/03(日) 19:04:24コンパイルオプション見てみたらいいんじゃ
C/C++のプロパティで-D_DEBUGとか書いてあったら_DEBUG
0888デフォルトの名無しさん
2008/08/03(日) 19:08:18thx
コンパイラ依存なんですね。
環境はVC2008EEで、_DEBUGでした。
0889デフォルトの名無しさん
2008/08/03(日) 19:18:09標準で決められてるのは assert() の有効無効を切り替える NDEBUG 。
0891デフォルトの名無しさん
2008/08/03(日) 19:50:51#include <winsock2.h>
int main() {
TCHAR str[1024];
WSADATA wsaData;
WSAStartup(2 , &wsaData);
printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
wsaData.szDescription , wsaData.szSystemStatus
);
WSACleanup();
return 0;
}
超初心者です。丸写しのコピーです。VC++2008でwindowsアプリケーションで貼ったら4つエラーが出たのですが、プロジェクトの設定が悪いのでしょうか。
アドバイスお願いします。っていうかWinsockの質問はここで良いですか?スレ一覧にも無いようですが、人気が無いのでしょうか。
0892デフォルトの名無しさん
2008/08/03(日) 20:06:33他の環境使ってる人も答えてくれやすい
winsockもここでいいんじゃね?
俺ここで教えてもらったことあるよ
0893デフォルトの名無しさん
2008/08/03(日) 20:09:100894デフォルトの名無しさん
2008/08/03(日) 20:13:23このエラーだけに成りました。ws2_32.libについてはよくわかりません。
0895デフォルトの名無しさん
2008/08/03(日) 20:13:39構成プロパティ−リンカ−入力
追加の依存ファイルにws2_32.libと書いてOK
もっかいビルド
0896643
2008/08/03(日) 20:17:09これをCやC++のプログラム中で実行することを解説したサイトは無いのでしょうか。
もしかして一般に公開できないほど価値のあることだったり・・・?
0897デフォルトの名無しさん
2008/08/03(日) 20:17:35ってできます?
今自分のいる足元を壊すみたいな。
0898デフォルトの名無しさん
2008/08/03(日) 20:22:10ありがとうございます。
0899デフォルトの名無しさん
2008/08/03(日) 20:23:33レジストリキーが分かってるなら
それをRegOpenKeyExとかRegSetValueExとかで追加したり変更したりはできるじゃん?
そういう意味じゃないのきゃ?
>>897
できる
0900デフォルトの名無しさん
2008/08/03(日) 20:23:58出来るよ。
0901デフォルトの名無しさん
2008/08/03(日) 20:25:26コードはわりと見かけるな
0902デフォルトの名無しさん
2008/08/03(日) 20:25:38RegSetValueEx HKEY_CLASSES_ROOT DefaultIcon
0903デフォルトの名無しさん
2008/08/03(日) 20:26:530904643
2008/08/03(日) 20:27:57レスありがとうございます。
その関数の存在自体分からない状態でしたので、加えた上で改めて検索してみたら求めていたサイトが出てきました。
本当に助かります。
0905デフォルトの名無しさん
2008/08/03(日) 20:30:28ただし行儀悪いコードには違いない。
0906デフォルトの名無しさん
2008/08/03(日) 20:44:16練習問題に書かれていたサンプルは答えが出たのですが、
http://opct.ath.cx/に投稿すると、wrongと出てエラーです。
http://algorithms.blog55.fc2.com/blog-category-18.htmlに書かれていた
プログラムは正解ですので、自分のミスだと思いますが、
理由がまったく分かりません。
どなたか、教えていただけないでしょうか?
よろしくお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7585.txt
0907デフォルトの名無しさん
2008/08/03(日) 21:20:34int mainじゃないのがちょっと気持ち悪いと思った。
0908897
2008/08/03(日) 21:30:49>>900
>>905
ありがとうございます。
>>905
コードを手っ取り早く短くできるんで、どうかなと思ったんですが、
やっぱり行儀が悪いですね。
0909デフォルトの名無しさん
2008/08/03(日) 21:51:32何を聞きたいのか、わからない。
0910デフォルトの名無しさん
2008/08/03(日) 22:22:11スタック配置不可、スマートポインタに格納不可、配置new不可、と。
0911デフォルトの名無しさん
2008/08/04(月) 01:06:03自動変数にしたりスマポに入れたり配置newしたりするようなクラスには不要だろ。
0912デフォルトの名無しさん
2008/08/04(月) 03:24:450913デフォルトの名無しさん
2008/08/04(月) 04:20:51いや、普通に思いつかなくて。
0914デフォルトの名無しさん
2008/08/04(月) 08:39:44ゲームのタスクシステムみたいなもので、リストでつながってる要素が
自殺したい時など。外部に消滅を管理する部分を設けなくても済む。
0915デフォルトの名無しさん
2008/08/04(月) 17:05:470からiまでの整数を入力させ、それ以外の数や、文字が入ったときはもう一回入力させることで、
確実に0からiまでの整数を戻す、以下のような感じの関数を作りたいんですが…
int nyuryoku(int i=1){
int a=0;
do{
cin>>a;
}while(a<0 || i<a);
return a;
}
数字以外の文字が入力されたときに固まったり無限ループになってしまいます。
istreamの問題だと思うのですが、対処が出来ません;;
どなたか教えてください
0916デフォルトの名無しさん
2008/08/04(月) 17:13:26そんな横着しないでgetlineしてパース汁
0917デフォルトの名無しさん
2008/08/04(月) 17:48:01http://pc11.2ch.net/test/read.cgi/tech/1217073697/408,436
0918デフォルトの名無しさん
2008/08/04(月) 18:06:24それとも書店に売ってる本や雑誌の中から良さ気なのを適当に買ってきて始めても問題ないのでしょうか
スレチだったら申し訳ないです…
0919デフォルトの名無しさん
2008/08/04(月) 18:20:56void main()
とか
void main(void)
と書いてある入門書は避けてください。
あとは第一印象でいいんじゃね。
0920デフォルトの名無しさん
2008/08/04(月) 18:25:33俺は 「柴田望洋」 って人の本を図書館で数冊読んで勉強したよ.
かなり判り易く書いてあったと思うけど,だいぶ昔の話だから今は
もっと良書があるかもね.
0921デフォルトの名無しさん
2008/08/04(月) 18:34:29int argc;
char *argv[];
{
と書いてあったら古すぎ。K&R初版レベル。
0922デフォルトの名無しさん
2008/08/04(月) 18:55:23今となっては絶対買ってはいけない地雷の一つじゃね
0923デフォルトの名無しさん
2008/08/04(月) 21:01:470924918
2008/08/04(月) 21:10:22やっぱり特にこれがいいってのはあんまりないみたいですね。買う際の参考にさせてもらいます。
0925デフォルトの名無しさん
2008/08/04(月) 21:28:38今でも売ってるのかそんな本
0926デフォルトの名無しさん
2008/08/04(月) 22:50:33char *ptr = new char[10];
〜〜〜
//ptrのアドレス先に、いくらメモリを割り当てているか知りたい
0927デフォルトの名無しさん
2008/08/04(月) 22:51:58vector オススメ
0928デフォルトの名無しさん
2008/08/04(月) 23:43:490929デフォルトの名無しさん
2008/08/04(月) 23:51:56慣れてくると、サイズでなくbeginとendで扱うようになるでしょう。
0930デフォルトの名無しさん
2008/08/04(月) 23:55:42前にVCで探したけど見つからなかった
見つかったら教えてください
0931デフォルトの名無しさん
2008/08/04(月) 23:58:41下痢便や軟便は特に超苦いです。
0932デフォルトの名無しさん
2008/08/05(火) 00:02:480933デフォルトの名無しさん
2008/08/05(火) 00:10:16空でないデストラクタのある型なら調べられない事もない場合があるが、
素直に vector 使っとこうぜ。
CString みたいなひねった記録のしかたをすることもできるが、
あれは可変長引数に渡せるようにするためのトリックであって
普通は必要になんない。
(まあ、空でないデストラクタのある型の場合
自動的にそんな感じにするコンパイラもあるわけだが)
0934デフォルトの名無しさん
2008/08/05(火) 00:14:310935デフォルトの名無しさん
2008/08/05(火) 00:21:08感謝!
Win限定だけどあるのですね
0936デフォルトの名無しさん
2008/08/05(火) 00:23:030937デフォルトの名無しさん
2008/08/05(火) 00:38:48いやそれさあ、newの返値に対して使えるの?
>_msize は,アドレスが block である割り当て済みのヒープブロックのサイズを返します。
>このブロックは,malloc,calloc,または realloc を使って割り当てられている必要があります。
>最初にブロックを割り当てるときに要求したバイト数より大きなサイズが返される場合があります。
しかもmallocに要求した数字より大きい数字が返ることがあるって。
まあ本人が良いなら良いかw
0938デフォルトの名無しさん
2008/08/05(火) 02:14:34極めて普通に感じるけど。
9byte要求して
その環境でのalign(4byteや8byte)に適合するサイズに調整されて
12byteなり16byteなりを確保したのと全く同じように振舞った。
その結果、9ではなく12なり16なりの
要求した数字より大きい数字が返るってことだけど。
0939デフォルトの名無しさん
2008/08/05(火) 02:27:130940デフォルトの名無しさん
2008/08/05(火) 02:29:33想像力無さすぎる。
0941デフォルトの名無しさん
2008/08/05(火) 10:05:16char (&ptr)[10] = (char(&)[10]) new char[10];
で sizeof(ptr) は 10 になるがお友達にはなりたくない。
0942デフォルトの名無しさん
2008/08/05(火) 10:26:590943デフォルトの名無しさん
2008/08/05(火) 10:33:570944デフォルトの名無しさん
2008/08/05(火) 11:07:130945デフォルトの名無しさん
2008/08/05(火) 11:10:230946デフォルトの名無しさん
2008/08/05(火) 12:33:56質問が無いと言うことは困っているプログラマもいない,平和でいいじゃないか
0947デフォルトの名無しさん
2008/08/05(火) 13:28:12配列のアクセス範囲が知りたいのじゃなく、使用してるメモリ量が知りたいので
>要求した数字より大きい数字が返ることがある
ってのは問題なし。
newで割り当てた全ての型に、正常に使えるのかは気になるところですが。
0948デフォルトの名無しさん
2008/08/05(火) 13:42:47なんかnewの返り値をfreeに渡すみたいで気持ち悪いんだよね。
0949デフォルトの名無しさん
2008/08/05(火) 13:46:53デバッグに使う分には良いんじゃない?
0950デフォルトの名無しさん
2008/08/05(火) 13:57:44関数内でcount=0;とし、count++;で数えていくのはわかるのですが…
0951デフォルトの名無しさん
2008/08/05(火) 13:58:54そこまでわかって何が知りたいの・・・?
countをstaticにしておけばいいでしょ
0952デフォルトの名無しさん
2008/08/05(火) 14:01:02デストラクタ回す関係で、総サイズ以外に確保要素数もどこかに
書いてありそうなんだが…、コンパイラの実装依存か
0953デフォルトの名無しさん
2008/08/05(火) 14:02:51int count = 0;
void hoge(void) { ++count; }
// 2
void fuga(int * pCount) { ++(*pCount); }
// 3
void hage(void) { static int count = 0; ++count; printf("%d", count); }
さあ選べ。
0955デフォルトの名無しさん
2008/08/05(火) 14:34:55YOU、これ使っちゃいなYO
A* p = new A[3];
std::cout << reinterpret_cast<int*>(p)[-1] << std::endl;
delete[] p;
もちろんデバッグ目的限定で。
0956デフォルトの名無しさん
2008/08/05(火) 14:43:41VC++7.1とgcc3.4.4で試したけどどっちも駄目だった
それが動くのってどういう処理系?
0957デフォルトの名無しさん
2008/08/05(火) 14:47:22vc++8(2005)と記憶の中のvc++6。
0958デフォルトの名無しさん
2008/08/05(火) 14:50:08え?
#include <iostream>
int main()
{
char *p = new char[10];
std::cout << reinterpret_cast<int*>(p)[-1] << std::endl;
}
これ、俺のVC++8では、917968
とか印字されるけど。
0959デフォルトの名無しさん
2008/08/05(火) 14:55:10そりゃデストラクタ無い型なら出ないよ。
持つ必要無いから。
0960デフォルトの名無しさん
2008/08/05(火) 14:55:47理解した。
0961デフォルトの名無しさん
2008/08/05(火) 15:10:05デストラクタがある型の場合、
mallocで確保したメモリの先頭を要素数に使う(実装が多い)ので
HeapSize, _msizeにはそのアドレスを渡さないといけない。
ちなみにVC++のmallocは実質HeapAlloc。
A* p = new A[3];
HeapSize(GetProcessHeap(), 0, reinterpret_cast<int*>(p)-1)
_msize(reinterpret_cast<int*>(p)-1)
0962デフォルトの名無しさん
2008/08/05(火) 16:45:39COM1でこれ以上の速度はむりなんでしょうか?
0963デフォルトの名無しさん
2008/08/05(火) 16:55:210964デフォルトの名無しさん
2008/08/05(火) 16:57:49そもそもCBR_115200はあるけどCBR_230400なんてないんだが。
0965デフォルトの名無しさん
2008/08/05(火) 17:09:040966デフォルトの名無しさん
2008/08/05(火) 23:35:370967デフォルトの名無しさん
2008/08/05(火) 23:48:53boost string_algoのto_lower/to_lower_copy使えばいい。
中でやっていることは結局1文字ずつstd::tolowerなんだけどね。
Boostが嫌なら自分でそういう関数を作るが由。
0970966
2008/08/05(火) 23:52:490971デフォルトの名無しさん
2008/08/06(水) 02:05:130972デフォルトの名無しさん
2008/08/06(水) 02:34:14mapの仕組み上できない。
mapは構築時に指定された比較方法で内部的にソートしているので、
違う比較方法に対してはソートされていないvectorとかと同程度かそれ以下の効率しか出ない。
0973デフォルトの名無しさん
2008/08/06(水) 02:38:18newで生成したインスタンスBを保持していた場合、Aのインスタンスをdeleteする前に、
デストラクタなどでBをdeleteしなければなりませんか?
0974デフォルトの名無しさん
2008/08/06(水) 02:49:21なるほど。
でも、この関数オブジェクトって大小比較ですよね。
findの時はどんな仕組みになっているのでしょう?
まさかcomp(a, b)とcomp(b, a)の2回調べているのですか?
0975デフォルトの名無しさん
2008/08/06(水) 03:08:360976デフォルトの名無しさん
2008/08/06(水) 03:09:34そういわれれば二回比較しないと確定できませんね
0977デフォルトの名無しさん
2008/08/06(水) 03:53:48まぁ実装のアルゴリズム次第としか言いようがないんだが、
findの大抵の(効率の良い)実装ではoperator<だけでも(operator==を使わなくても)
検索に必要な比較回数の期待値は精々1回ぐらいしか増えないはず。
試しに二分探索をoperator<だけで書いてみるようなコードとか、
書かなくてもいいから頭の中でどうなるか考えてみると面白いかもね。
>>980
次スレよろ
0978デフォルトの名無しさん
2008/08/06(水) 04:09:39比較回数が1回程度しか増えないとは、うまいアルゴリズムがあるもんなんですね。
二分探索について調べてみます。
どうもありがとうございました。
0979sage
2008/08/06(水) 18:18:37そのクラスオブジェクトの、newで実体を確保したデータメンバ(ポインタ)は、同時に自動的にdeleteされるのでしょうか??
ご教示頂けると幸いです。
0980デフォルトの名無しさん
2008/08/06(水) 18:21:330981デフォルトの名無しさん
2008/08/06(水) 18:22:03メンバで保持してるポインタはdeleteされない。放置。
0982デフォルトの名無しさん
2008/08/06(水) 18:22:320983デフォルトの名無しさん
2008/08/06(水) 18:22:500984979
2008/08/06(水) 18:23:400985デフォルトの名無しさん
2008/08/06(水) 18:24:05で
hoge *p = new hoge();
p->pointer_ = new fuga();
delete p;
とやったときに、自動で(見えないところで)
delete (p->pointer_);
も実行されるかってことだよね?
されません。
最近shared_ptrにべったりで、deleteなんて見てないや…。
0987デフォルトの名無しさん
2008/08/06(水) 19:12:53使用したソースをG++でMake可能でしょうか?
現在VC++Express使ってるんですが、将来的にMSがExpress配布
しなくなったときに、ソース(ほぼ)そのままでフリー環境に逃げれるのか気になって。
0988デフォルトの名無しさん
2008/08/06(水) 19:20:08まあAPIやDirectXは結局はDLL呼び出しなんで、DLLが呼べればどこからでも使える。
ライブラリは互換性が無いので、gcc用に作るか作られたものをもってくればいい。
0989デフォルトの名無しさん
2008/08/06(水) 19:20:16今配布してるExpressが使えなくなるわけじゃないんだから、
DVDに焼いて大事に取っておけばいいんじゃない
0990デフォルトの名無しさん
2008/08/06(水) 19:22:09取り越し苦労かもですけど、一安心しました。thx
0991デフォルトの名無しさん
2008/08/06(水) 19:47:05そろそろ次スレ立てた方が良い。
0992デフォルトの名無しさん
2008/08/06(水) 20:57:10http://pc11.2ch.net/test/read.cgi/tech/1218023777/
0993デフォルトの名無しさん
2008/08/06(水) 20:58:16インポートライブラリをreimpで変換するだけだす。
0994デフォルトの名無しさん
2008/08/07(木) 01:45:11DirectX9 関係では苦労します
DirectX10 は知りません
D3DX**** 系の関数を使用するときに注意が必要です
d3dx9.lib がスタティックライブラリなので vc 専用で g++ からは利用できません
g++ からは d3dx9_??.dll を使用できますが ?? 部分の数値が一致するものが対象のPCに存在しないと動きません
できれば vc を使ったほうが余計な苦労が無いと思います
0995デフォルトの名無しさん
2008/08/07(木) 09:18:540996デフォルトの名無しさん
2008/08/07(木) 10:51:29f.seekg(0, std::ios::end);
std::size_t size = static_cast<std::size_t>(f.tellg());
0997デフォルトの名無しさん
2008/08/07(木) 16:07:32どうもです。
サイズ求めるだけなのに結構めんどくさいですね。
0998デフォルトの名無しさん
2008/08/07(木) 16:21:19標準ではないからな
boost::filesystemにはそのものズバリのfile_size()という関数があったと思う
0999デフォルトの名無しさん
2008/08/07(木) 16:50:301000デフォルトの名無しさん
2008/08/07(木) 16:55:2310011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。