09/03/12 19:44:28
Windows上のC++の質問なんですが、プロパティの中のコード生成のランタイムライブラリーには
/MT
/MTd
/MD
/MDd
の4つの選択肢がありますが、デフォルトは/MDdだと思いますが、本のサンプルを実行する際に、
/MTdに変更するように指示があり、実際変更しなければコンパイルできませんでした。
どういう場合に/MTdにしなければだめになるのでしょうか?
370:デフォルトの名無しさん
09/03/12 20:13:31
>>369
ソリューションの構成をDebugからReleaseにする
ツールバーの下にDebugっていうドロップダウンリストがあるからそこで切り替えろ
371:デフォルトの名無しさん
09/03/12 20:22:34
ネットワーク共有ファイルに対してFindFirstFileを行うにはどうすればよいのでしょうか?
例えば
\\Server\folder\test.txt
にあるファイルに対して
FindFirstFile( "\\\\Server\\folder\\test.txt",&data );
とやっても失敗になってしまいます。
ショートパスからロングパスにしたいのですが、、、、
372:デフォルトの名無しさん
09/03/12 21:58:54
ドライブにマウントしてから x:\test.txt とかでアクセスすればいいのでは?
373:デフォルトの名無しさん
09/03/13 14:45:20
2chトリップ生成プログラム教えてください。
ライブラリ作った人とかいますか?
374:デフォルトの名無しさん
09/03/13 15:17:00
団子さんの出番ですね!!
375:デフォルトの名無しさん
09/03/13 15:21:22
やばい、>>374と同じ事が頭に浮かんだ
376:デフォルトの名無しさん
09/03/13 15:37:46
>>373
2chのトリップと互換のPHPやらPerlやらの掲示板ソースでも探したらあるよ
377:デフォルトの名無しさん
09/03/13 15:40:55
[環境]C++ WindowsMobile向けアプリ(練習でデスクトップ版を作ります)
GoogleCalendarとの同期を取るアプリを作りたいんですが、
最初の認証(ユーザーアカウント&パスワード)をどうやって投げれば
いいのかご存知の方いらっしゃいましたら、ご教授願えないでしょうか?
378:デフォルトの名無しさん
09/03/13 15:44:06
>>373
PHPのを探してきた
$trip = '';
if (preg_match("/([^\#]*)\#(.+)/", $_POST['FROM'], $match)) {
$salt = substr($match[2]."H.", 1, 2);
$salt = preg_replace("/[^\.-z]/", ".", $salt);
$salt = strtr($salt,":;<=>?@[\\]^_`","ABCDEFGabcdef");
$trip = substr(crypt($match[2], $salt),-10);
$_POST['FROM'] = $match[1].'</b>◆'.$trip.'<b>';
}
cryptがDESかMD5かで結果が変わる
379:デフォルトの名無しさん
09/03/13 15:55:43
>>373
Cのソースがあった
URLリンク(www.geocities.com)
380:デフォルトの名無しさん
09/03/14 20:40:26
using namespace std;
とソースの上に書くのと、
ソース全体を
namespace std {
...
}
というようにnamespaceの中に書くのとは、同じ意味ですか?
381:デフォルトの名無しさん
09/03/14 20:45:14
違います
382:デフォルトの名無しさん
09/03/14 21:00:19
ありがとうございます。
どう違うか、教えてください。
383:デフォルトの名無しさん
09/03/14 21:04:06
利用と宣言の違い棚。
384:デフォルトの名無しさん
09/03/14 21:11:37
わかりました。
後者の場合stdの中で宣言するというだけなので、Main関数を入れたりとかは
できないということですね。
ありがとうございました。
385:デフォルトの名無しさん
09/03/14 21:22:45
std 名前空間内に自分で宣言を追加してはいけない。
規格上未定義動作になる。
386:デフォルトの名無しさん
09/03/15 00:23:57
std::swapの特殊化は置いてもいいけどね。
387:デフォルトの名無しさん
09/03/15 00:31:35
std::swapの特殊化じゃなくて、テンプレートの完全特化が許されてるってことね
388:デフォルトの名無しさん
09/03/16 01:03:47
stringのvectorにファイルを一行づつ読み込んで、まとめて別のファイルに書き込むというプログラムを作ってるんですけど
エラーチェックは↓見たいな感じで十分ですかね?
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
void read(char *file, vector<string> &lines);
void write(char *file, vector<string> &lines);
int main(void)
{
vector<string> lines;
read("C:/Work/from.txt", lines);
write("C:/Work/to.txt", lines);
cout << "正常終了" << endl;
return 0;
}
389:デフォルトの名無しさん
09/03/16 01:04:39
void read(char *file, vector<string> &lines)
{
ifstream ifs(file);
if(!ifs.is_open()){
cout << "コピー元ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}
while(ifs.good()){
string line;
getline(ifs, line);
lines.push_back(line);
}
if(!ifs.good() && !ifs.eof()){
cout << "読み込み途中でエラー" << endl;
ifs.close();
exit(EXIT_FAILURE);
}
}
390:デフォルトの名無しさん
09/03/16 01:05:31
void write(char *file, vector<string> &lines)
{
ofstream ofs(file);
if(!ofs.is_open()){
cout << "コピー先ファイルを開けない" << endl;
exit(EXIT_FAILURE);
}
vector<string>::iterator i = lines.begin();
while(ofs.good())
{
ofs << *i;
if(++i == lines.end())
break;
ofs << endl;
}
if(!ofs.good() && !ofs.eof())
{
cout << "書き込み途中でエラー" << endl;
ofs.close();
exit(EXIT_FAILURE);
}
}
391:デフォルトの名無しさん
09/03/16 01:39:45
while (!feof()) {}
と同じ匂いを感じる。
ところで、
while (...) {
string str;
...
}
より
string str;
while (...) {
...
}
の方が、コンストラクタとデストラクタが毎回走らない分、コスト的には良いよね?
でも、スコープを限定した方が可読性等の面からは好ましいよね?
どっちが良いのかな。
392:デフォルトの名無しさん
09/03/16 01:44:22
その辺を言い出したらvectorから見直しだけどな。
393:デフォルトの名無しさん
09/03/16 02:11:37
>>391
{string str; while(...){...}}
394:デフォルトの名無しさん
09/03/16 02:26:56
for(string str; ifs.good();)
395:デフォルトの名無しさん
09/03/16 02:36:54
初期化がループに依存しないならコンパイラが良きに計らってくれると思うよ。
396:デフォルトの名無しさん
09/03/16 02:40:10
getline(,)後!ifs.good()でも1回push_backしちゃうのはマズくないか。
397:デフォルトの名無しさん
09/03/16 07:38:25
VC++9での質問です。
あるライブラリをインクルードする必要があるのですが、
ソース中に #pragma comment(lib, "ライブラリ名") と書くと、LNK2005のエラーが出ます。でも、
プロジェクト→プロパティ→リンカ→追加のライブラリ
のところに「ライブラリ名」を書くとLNK2005は出なくなりコンパイルできます。
リンクの順序が関係してるのかと思ったのですが、よくわかりません。
どういう基準で方法を選べばいいですか?
398:デフォルトの名無しさん
09/03/16 07:41:35
>>397
ライブラリのパスを通せばいいと思う
399:デフォルトの名無しさん
09/03/16 07:50:49
>>398
ありがとうございます。
ライブラリは見えてます。LNK2005は、同じライブラリを複数回リンクしようとした、
というエラーみたいなのです。自分の場合、
unsigned int *a = new unsigned int(100);
みたいな行がエラーになります。でもLNK2005が出ないやり方でリンクすると
この行も問題なくコンパイルされます。
書いてて思ったのですが、追加のライブラリのところにライブラリ名を書くと、
Visual Studioがリンクの順序を勝手に調整してくれるんですかね?
400:デフォルトの名無しさん
09/03/16 13:38:45
あるテーブルより、KOJIN_ID(数値型8桁)を一旦ホスト変数H_KOJIN_IDに入れ
それを11桁の文字型として出力しなければいけないのですが(余った桁はスペースで埋める)
下記のようにsprintf関数を使ってH_KOJIN_IDから、ファイル書き出し用構造体outの項目KOJIN_IDに
セットするときに、現状のままだと余った桁に0が入ってしまいます。
データセット部
sprintf(out.KOJIN_ID,"%11.11ld",H_KOJIN_ID);
余った桁に半角スペースが入るようなsprintf指定方法はありませんか?
401:デフォルトの名無しさん
09/03/16 14:41:57
>>399
もしかして複数ファイルに分けてる?
スタティックライブラリの関数名がダブってるような気がする
402:デフォルトの名無しさん
09/03/16 14:44:55
>>400
いってる意味がよく分からないけど
%11ld または %-11ld でいいのかな?
403:デフォルトの名無しさん
09/03/16 16:44:14
400です。
おかげさまで解決です。
404:デフォルトの名無しさん
09/03/16 16:54:03
おかげさまってマルチでよそで答えもらっただけだろ。
405:デフォルトの名無しさん
09/03/16 20:22:15
std::cinで矢印キーの入力を取得することはできますか?
406:デフォルトの名無しさん
09/03/16 20:29:07
質問です
WM_NCHITTESTをフックしたいのですが
SetWindowsHookEXの中のどの項目ならフックできるでしょうか?
407:デフォルトの名無しさん
09/03/16 22:16:04
>406
>The WM_NCHITTEST message is sent to a window when the cursor moves
より、このメッセージは Send される。
従って WH_CALLWNDPROC か WH_CALLWNDPROCRET だが、いずれもメッセージを調べるだけで変更することはできない。
別途処理したいならサブクラス化とかが必要。
408:デフォルトの名無しさん
09/03/16 22:17:02
っつーか、Win32API質問箱の管轄だな。
409:406
09/03/16 22:53:13
>>407
ありがとうございます。
メッセージの変更ができなかった謎も解けました。
410:デフォルトの名無しさん
09/03/17 00:11:37
const stringのイテレーターってどうやって宣言するんでしょうか?
std::_String_const_iterator<char,std::char_traits<char>,std::allocator<char>> でイテレーターを宣言すればうまくいくんですが、もっとスマートな書き方が知りたいです
411:デフォルトの名無しさん
09/03/17 00:13:31
>>410
#include <string>
412:デフォルトの名無しさん
09/03/17 00:15:06
>>411
#include <string>はちゃんとしてます
413:デフォルトの名無しさん
09/03/17 00:17:51
>>412
ならイテレータの宣言は済んでる。
何がしたいのかよくわからん。 std::string::const_iterator i; みたいにイテレータ型の
変数を宣言したいってこと?
414:デフォルトの名無しさん
09/03/17 00:19:17
あ、const_iteratorってやるんですね。解決しました。ありがとうございます
415:デフォルトの名無しさん
09/03/17 00:19:30
const stringのイテレータという言い方は無い。
stringのconst_iteratorならstd::string::const_iteratorで宣言できる。
416:デフォルトの名無しさん
09/03/18 17:14:42
newが失敗するのってメモリが足りない時以外にどんな状況が考えられますか?
417:デフォルトの名無しさん
09/03/18 17:27:57
何をnewするかに拠る
418:デフォルトの名無しさん
09/03/18 17:42:35
コンストラクタがエラー投げてることもある
419:デフォルトの名無しさん
09/03/18 17:46:41
そもそもメモリが足りてなくても失敗するとは限らない。
420:デフォルトの名無しさん
09/03/18 18:52:06
STLの出す例外一覧みたいなのってありませんか?
421:デフォルトの名無しさん
09/03/18 19:54:38
これ格納すればあらゆる例外投げてくれるよ
struct Hoge{
Hoge(){throw new MyFavoriteException;}
};
422:デフォルトの名無しさん
09/03/19 16:14:20
そうかなあ
423:デフォルトの名無しさん
09/03/20 02:41:10
VC++でCGIを作ってます(ただの興味本位です
HTMLの文字コードはUTF-8にしたいので、文字列リテラルの文字コードをUTF-8にするために、
ソースコードをUTF-8で保存して、コンパイルしました。
すると「現在のコードページで表示できない文字を含んでます。Unicode形式で保存してください。」という警告が出て、
更に文法エラーが出てきてコンパイルできませんでした。
ソースコードにBOM付けてコンパイルしたら成功しましたが、出力された文字列は何故かShift_JISになってました。(VC++が日本語版だから?
文字列にUTF-8を使うことは不可能なんですか?
424:デフォルトの名無しさん
09/03/20 03:11:19
ソースファイルの文字コードとプログラムの出力は別物
ソースはShift_JISでもUTF-8でもコンパイルすれば内容は同じ
で、出力をUTF-8にするためにはプログラムで文字列を組み立ててから
最後にUTF-8に自力で変換してやらなくてはいけない
UTF-8への変換はWin32APIを使う必要がある
たぶんIMultiLanguage2のあたりつかえばできると思うので検索して調べてみてくれ
あと、Shift_JIS以外の文字コードをstdoutに出力するなら、stdoutをバイナリモードに
する必要があるような気がするので、fprintfとかfwriteの前に以下のようなコードが必要かも
setmode( fileno(stdout), O_BINARY );
425:デフォルトの名無しさん
09/03/20 04:28:22
2005以降なら、fopenなどでccs=UTF-8を付加すればいいのではと思う
426:デフォルトの名無しさん
09/03/20 12:00:07
あー、fopenなんてここ何年も使ってないからすっかり忘れてたわ
427:デフォルトの名無しさん
09/03/20 13:06:36
環境依存しない方法で変換するにはどうすればよかろうの?
428:デフォルトの名無しさん
09/03/20 13:15:48
無理
環境ごとに#ifdefしまくるのが精一杯
429:デフォルトの名無しさん
09/03/20 13:45:03
CGIやるならLinuxだろ
>>425
stdoutには使えないよね
430:デフォルトの名無しさん
09/03/20 15:38:25
ソースが Shift_JIS なら、環境に依存してない。
431:デフォルトの名無しさん
09/03/20 16:55:09
Visual Studioで画面に複数のソースを表示させる方法ってありますか?
Source.cppとSource.hを横に並べて表示したいんですが、、
432:デフォルトの名無しさん
09/03/20 17:01:15
タブを右クリ→垂直タブグループの新規製作
433:デフォルトの名無しさん
09/03/20 17:04:01
すごい、出来ました!
ありがとうございました。
434:デフォルトの名無しさん
09/03/20 23:07:02
URLリンク(page4.auctions.yahoo.co.jp)
435:デフォルトの名無しさん
09/03/21 13:22:55
opendialogを使うと
ShellExeCuteを使いバッチファイルを起動すると
パスが見つからなくなってしまいます。
opendialogを使わない状態でバッチファイルを起動すると大丈夫でした。
何かディレクトリを指定するようなコマンドがあったら教えてください。
436:デフォルトの名無しさん
09/03/21 14:24:00
chdir
437:デフォルトの名無しさん
09/03/21 14:42:32
436>>
バッチファイルのほうで探したら見つかりました
ありがとうございます。
438:デフォルトの名無しさん
09/03/21 20:56:55
Visual C++の質問なんですが、
新規プロジェクトを作成した後、ソリューションエクスプローラーでフォルダを追加して、そのフォルダの中に
ソースファイルを追加しました。でも実際にはそのフォルダは作られてなくて、プロジェクトのフォルダのトップに
全部のファイルが存在してました。ソリューションエクスプローラーからフォルダを追加しては駄目だったので
しょうか?
439:デフォルトの名無しさん
09/03/21 20:59:56
ファイルシステム上のフォルダとは別物だ。
440:デフォルトの名無しさん
09/03/21 21:03:40
>>439
ええーそうなんですか、、、と思ってもう一回見てみたら追加されるのはフィルタになってました。
じゃあ、プロジェクト内にソースを入れておくフォルダを作るにはどうすればいいですか?
ソースを追加するときに新規フォルダを作っても、ソリューションエクスプローラからは見えません
でした。
フィルタって何の意味があるんだろう。。
441:デフォルトの名無しさん
09/03/21 21:10:07
自己レスです。
自分なりに考えてみたのですが、ソース追加時に新規フォルダーを作ってそちらにソースを追加した場合、
フィルターもあわせて設定すれば、やりたいことができそうです。
でも途中でフォルダ名を変更しようとすると面倒そうですが、、、。
プロジェクトのトップに全ファイルが置かれるのがいやなのですが、皆さんはどうされてますか?
442:デフォルトの名無しさん
09/03/21 21:21:54
hoge/srcフォルダにソースもヘッダもぶち込む
443:デフォルトの名無しさん
09/03/21 21:51:18
>>442
ありがとうございます。なんか、そっちのほうがいいのかと思えてきました。
自分のプロジェクト内には、DaemonとCommandという2つのフォルダがあって、それぞれの中に
PrintInfo.cppというのがあるのですが、ビルド時にPrintInfo.objというのが重なってるせいか、
リンクでエラーになります。(LNK2019とかLNK2001とか)
同じ名前のソースが1つのプロジェクト内にあると、フォルダをわけてもよくないのでしょうか?
何度もすいません。
444:デフォルトの名無しさん
09/03/21 22:13:52
URLリンク(image.space.rakuten.co.jp)
445:デフォルトの名無しさん
09/03/21 22:23:20
>>444
浦賀湾のあたり?
解決しました。
出力ファイルのオブジェクトファイル名を変更すればできました。
ただ、両方のPrintInfo.cppに対して、オブジェクトファイル名を手動で指定
しないとだめなのが、分かりにくかった。
片方だけ手動で変更すればいいんじゃないか、、と思ったんですが。
ありがとうございました。
446:デフォルトの名無しさん
09/03/21 22:33:42
>>444
テラナツカシス
447:デフォルトの名無しさん
09/03/22 13:01:45
昨日VSいれてみました。いきなり分りません。
System::Object^
の^ってなんですか
448:デフォルトの名無しさん
09/03/22 13:12:49
>>447
C++の入門書買ってくるか入門サイトを見て最低限の知識をつけろ
449:デフォルトの名無しさん
09/03/22 13:12:55
検索すればわかることだと思うけれど、
URLリンク(www.google.com)
の3番目
450:デフォルトの名無しさん
09/03/22 13:27:51
C++builderでTreeViewを使っているのですが、子を持つノードだけそのままの位置にして
他のノードのみをソートしたいのですが、alphasortだと全て並び変わってしまい
うまくいきません。
何か良い方法があったら教えてください。
451:デフォルトの名無しさん
09/03/22 13:34:07
C++の入門書には載ってないだろうな。
C++/CLIの入門書嫁。
452:デフォルトの名無しさん
09/03/22 13:54:28
CLIだったのか。どうりで。
ありがとね。
453:デフォルトの名無しさん
09/03/22 15:29:42
int hoge(int n) { return n; }
int hoge(const int n) { return n; }
int hoge(int &n) { return n; }
int hoge(const int &n) { return n; }
だと、2番目だけコンパイルできないんですけど、どうしてなんでしょうか。
呼び出すときに、結局intを丸ごとコピーして引数に渡すので、呼び出し元では
int であろうがconst int であろうが区別していないのでしょうか。
454:デフォルトの名無しさん
09/03/22 15:41:21
>>453
そう。関数引数の型としてはトップレベルの const は無視され、区別されない。
ただし定義においてはローカル変数への const と同様に働く。
455:デフォルトの名無しさん
09/03/22 16:58:39
暗号の本で一通りのアルゴリズムのようなものは理解したのですが、
Cに組み込むにはどうすればいいのでしょうか?
アセンブリはやったことがないのですが、Cプログラムを逆アセンブルすると簡単にバレたりしませんか?
たとえば全てのバイトにn加算するという暗号化を施す場合、
その加算するという処理、nという数値が逆アセンブルによって解ると思うのですが、
そうさせないために何か対策する必要はないのでしょうか?
456:デフォルトの名無しさん
09/03/22 17:04:17
アルゴリズムが判明して脆弱になるような暗号は、その時点で脆弱なのです。
457:デフォルトの名無しさん
09/03/22 17:21:23
例が悪かったですね。
AES等安全性の確立されたアルゴリズムを使うことを前提とします。
ある暗号化されたデータをプログラムで読み込み複合化する場合、プログラムコードに鍵を含める必要がありますよね。
その鍵は逆アセンブル等で簡単に解ったりしないんですか?
458:デフォルトの名無しさん
09/03/22 17:24:55
>>457
分かります
AES暗号化を使っていることが分かるだけでも
どこを調べればいいか分かってしまいます
ある程度以上は諦めるしかないです
459:デフォルトの名無しさん
09/03/22 18:09:08
MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
460:デフォルトの名無しさん
09/03/22 18:53:39
#include <iostream>
int main(){return 0;}
というプログラムなんですが、プロジェクトを新規作成するときに、
(1)最初から空のプロジェクト
(2)Win32プロジェクトを選択して、空のプロジェクト
という2つの方法でやると、(1)はコンパイルできるのですが、(2)だとコンパイルが
通らず、LNK2019というエラーになります。
この2つの方法って何が違うのでしょうか?
461:デフォルトの名無しさん
09/03/22 18:55:39
Win32プロジェクトはGUIプログラム用です
462:デフォルトの名無しさん
09/03/22 19:01:50
>>460
プロジェクトのプロパティをよく比較するとわかるが、いくつかの初期設定が異なっている。
そのエラーの元になっている違いはエントリポイントの違い。
Win32プロジェクトでは、main()の代わりにWinMain()という関数からプログラム開始する。
他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
463:デフォルトの名無しさん
09/03/22 19:24:03
>>461-462
ありがとうです。
でもmainをWinMainに書き直しても駄目でした。
>他にもコンソールが表示されるかとかプリプロセッサ定義とか諸々も違う。
本当にほかにも色々違うんですね。
464:デフォルトの名無しさん
09/03/22 20:09:48
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {return 0}
これが一応の最小プログラムね
Windowsプログラミングでは初めて見る型がたくさん出てくるけど
ほとんどtypedefしただけだから、惑わされずに命名規則と元の型を覚えるといいよ
465:デフォルトの名無しさん
09/03/22 20:15:12
>>464
何のためのtypedefだよ…
466:デフォルトの名無しさん
09/03/22 20:23:08
typedef元の型が変化しても書き直す必要をなくすため
467:デフォルトの名無しさん
09/03/22 20:26:11
個人的にはAPIENTRYの方が好きだなあ
468:デフォルトの名無しさん
09/03/22 22:28:20
可読性のためだろ
469:デフォルトの名無しさん
09/03/23 00:16:56
memcpy.asmの
mov [edi],al ;U - write second byte to destination
でエラーが発生してしまいます。なぜでしょうか?
以下 プログラムです。
class ErrorDiffusion{
public:
ErrorDiffusion(int campussize);
~ErrorDiffusion();
void Upperandlowerreversing(int width,int height,unsigned char *Grey);
private:
unsigned char *Output;
};
//上下反転
void ErrorDiffusion::Upperandlowerreversing(int width,int height,unsigned char *Grey)
{
int i,flag=1;
printf("上下反転\n");
for(i=0;i<height;i++)
{ //printf("memcpy mae\n");
memcpy(&OutPut[(height-flag)*width],&Grey[i*width],width);
//printf("%d loop\n",i);
flag++;
}
}
//ここで関数を呼んでいます。
errordiffusion.Upperandlowerreversing(width,height,&Grey[0]);
470:デフォルトの名無しさん
09/03/23 00:47:52
private:
unsigned char *Output; にして、コンストラクタで、メモリを確保していて
NULLにはなっていないのですが・・。privateへのアクセスは、普通に
Outputでいいはずだとおもうのですが違うのかな?
471:デフォルトの名無しさん
09/03/23 01:09:47
自己解決しまsちあ
472:デフォルトの名無しさん
09/03/23 09:55:51
ifstream ifs(filename, ifstream::binary);
Windows環境で、Ifstreamの読みこみで、Ifstream::binaryを書かなかったら
どうしてだめなのでしょうか?
473:デフォルトの名無しさん
09/03/23 10:16:20
テキストファイルの読み込みとか、書かなくてもいい場合があるじゃん。
Cの"r" "rb" と同じ関係。
474:デフォルトの名無しさん
09/03/23 10:58:52
>>473
ありがとうです。テキストファイルの読み込みの場合は書かなくていいんですね。
ついでにあと1個質問させてください。
Ifstream.seekg()で、
Ifstream.seekg(0,ifstream::end)
Ifstream.seekg(ifstream::end)
はどうちがいますか?どっちもコンパイルできるし、意味も同じっぽいんですけど、、、
475:デフォルトの名無しさん
09/03/23 11:02:37
>>474
省略時はどの値を渡したのと同じってのを意識するといい。
476:デフォルトの名無しさん
09/03/23 11:36:04
>>475
なるほど。
省略時は0を渡したのと同じですね。
477:デフォルトの名無しさん
09/03/23 11:46:00
念のため書くけど、省略時にどの値を採用するかはその関数を書いた人が決めるのよ。
さっきのIfstream::binaryも同じ
478:デフォルトの名無しさん
09/03/23 12:35:15
>>477
本当ですね。
VC9++で試したら、ゼロじゃなかったです。
どういう値になっているのか調べられなかったけど、
ちゃんと読めてなかったです。
479:デフォルトの名無しさん
09/03/23 12:50:29
ああそうか、binary modeとcooked modeはCP/M、ひいてはMS-DOSの
ためにC言語時代から受け継いでいる伝統だったな
unix系は意識不要
480:デフォルトの名無しさん
09/03/23 14:42:51
おまえFTPとか知らないだろ
481:デフォルトの名無しさん
09/03/23 14:54:43
File Transfer Proturk がどうかなさいましたか?
482:デフォルトの名無しさん
09/03/23 15:09:04
TDateTime now = Date();
String hiduke=DateTimeToStr(now);
SaveDialog1->FileName=hiduke;
日付をFileNameのところに表示したいのですが、上記のようにやっても
うまくいきません原因の分かる方教えてくださいー。
483:デフォルトの名無しさん
09/03/23 15:39:00
482です
解決しました
2009/03/23の
/がダメだったようです。
484:デフォルトの名無しさん
09/03/23 22:00:05
free(array);
すると、プログラムが止まってしまいます。
メモリは確保しているし、なぜfreeするとエラーになるかわからないです
メモリのエラーはerrorno でチェックしろとかいてあったのですが
どうやってチェックすればいいかサンプルコードをください
485:デフォルトの名無しさん
09/03/23 22:07:14
エスパーさんたのみます!
486:デフォルトの名無しさん
09/03/23 22:13:31
間違えたアドレスを開放しようとしてる
487:高橋
09/03/23 22:15:23
>>485
情報がこれだけじゃ、いかに魔美くんでも無理だよ。
488:Cの達人
09/03/23 22:27:56
Cの達人と申します。
ネイティブCのことなら、お任せください。
by Cの達人
489:デフォルトの名無しさん
09/03/23 22:29:38
URLリンク(www.kouno.jp)
490:デフォルトの名無しさん
09/03/23 22:35:46
TCPで他のマシンから要求を受け付けるサーバーを書いてるのですが、過去の一定の時間内(例えば1時間)で処理した
要求の上限を設定(例えば100個まで)して、それ以上は処理しない(要求を受け付けるだけ)ようにしたいと思ってます。
そこで、受け付けた全要求の{受け付けた時間、処理が終わった時間}という構造体を作って、それをダブルリンク
リストにつないで置くようにしました。新しい要求が来たらそのダブルリンクを回って、処理が終わってから1時間
たってないものの数をカウントして、処理する/しないを決めます。
ところがこれだと要求の数が増えると(10万件とか50万件とか)、どんどん重くなるのですが、何か良い方法はない
でしょうか?こういう処理って結構色々な場面で使われると思うのですが。
よろしくお願いします。
491:デフォルトの名無しさん
09/03/23 22:38:48
10万とかのオーダーになったら、DB 使うことを考えちゃうな。
492:デフォルトの名無しさん
09/03/23 22:43:43
>>490
deque を使ってみるといいよ
新しい要求がきたときに
1.一番古い [0] の時刻が1時間より前だったら pop_front で削除
2.1.で削除が行われた場合1.に戻る
3.deque のサイズが 100 未満であれば要求を受け付ける
4.deque に push_back で追加
最近同じような質問があった気がする
493:デフォルトの名無しさん
09/03/23 22:50:42
>>491
DB使ったほうがいいですかね。
出来るだけ軽い処理で実装しろと言われてて、自分はCで実装してるのですが、、、
上限を過ぎた要求は拒否しちゃえばいいのかな、、。でも拒否された方にいつ
リトライすればいいか教えるのも面倒だし。一応、受け付けた要求の数があまり
多くなりすぎた時には拒否できるようなオプションも付けようかとは思ってます。
リトライのタイミングは相手まかせです。
ありがとうございます。
494:デフォルトの名無しさん
09/03/23 22:56:09
C++には便利な仕組みがいっぱいあるよねー。
495:デフォルトの名無しさん
09/03/23 22:57:02
>>492
ありがとうございます。
dequeも考えたのですが、処理中の要求がどういう順序で終わるかは決まってないので
(重い要求の少し後に軽いのが来た場合、後から来た軽いのが先に処理が終わる可能性があります)
dequeは使えないか、と思ったんですが、どうですか?
>最近同じような質問があった気がする
ありがとうございます。探してみます。
496:デフォルトの名無しさん
09/03/23 23:09:23
処理中のものは一時的に別のmapとかに保存しておいて、処理が終了したらlistに積むとか
497:デフォルトの名無しさん
09/03/23 23:09:26
処理の軽さがあらかじめわかるなら
あの、あれ、なんていったっけ、常にソートされるコンテナ、
それ。
498:デフォルトの名無しさん
09/03/23 23:21:09
時刻をキーにしてstd::set使えばよさげだね
重さ?シラネ
499:デフォルトの名無しさん
09/03/23 23:35:58
どうも自分の環境だと、30万件を越えたあたりからマシンが応答なくなります。
30万件のダブルリンクを、全然内容に変化がないのに1秒とかの間に何度も何度も
回ってて、何度も何度も処理後1時間以内のエントリの数を数えてます。
この処理を減らせれば、もっといけそうな気がする。
メモリ消費自体は、構造体が16バイトなので、100万件でも16MBとかの消費のはず
なんですがね、、、
500:デフォルトの名無しさん
09/03/23 23:41:11
それは「新しい要求が1秒とかの間に何度も何度も」来てるからじゃろ?
そして「受け付けた全要求」、つまりここでは30万件を
要求が来るたびに「回って、処理が終わってから1時間たってないものの数をカウントして」る
からじゃろ? 仕様どおりじゃないのかな?
501:デフォルトの名無しさん
09/03/23 23:48:29
>>500
そうですね。
負荷テストやっとこうと思って、別プロセスからガンガン要求なげてみたんです。
1秒間に10000件とかです。負荷が高いときは要求を拒否しますといったほうがいいんですかね。
そうなると、要求を出す側のプログラムも変更しなくちゃいけないのがいやなんですけどね。。
502:デフォルトの名無しさん
09/03/23 23:52:40
>>497-498
ありがとうございます。
でもC++は手元のコンパイラが対応してなくてですね、、強く要求すれば購入してもらえるかも
しれないんですが、なんとかCでやりたいと思ってます。
自分でstd::setとかコンテナとか実装すればいいのかもしれないですが、
常にソートされるコンテナって重そうな感じがするし、、、、
503:デフォルトの名無しさん
09/03/23 23:53:31
全体的に仕様がおかしい気がするけど
そういう仕様なら仕方ないのであきらめましょう。
プログラマは仕様について意見することはできても
仕様を変える力はありません。しようがないのです。なんちて・・・
コマネチ!
504:デフォルトの名無しさん
09/03/24 00:08:07
>>501
それは仕事でやってるの?
505:デフォルトの名無しさん
09/03/24 00:11:58
>>501
そうです。でも売り物じゃなくて、社内のデータ管理ソフト用の処理を書かされてます。
506:デフォルトの名無しさん
09/03/24 00:22:25
すげー社内システムだな。
507:デフォルトの名無しさん
09/03/24 00:27:16
>>492の方法なら一番軽いと思うんだけどな。処理が終了してからlistとかdequeに積めばいいだけだし。
全探索の力業を少しでも軽くしたいなら要求が来るたびに調べるんじゃなくて、少しの誤差を許容して
調べるのは一秒に1回までとすれば1/10000まで軽くなると思う。
508:デフォルトの名無しさん
09/03/24 00:30:19
結構大きな会社で、ストレージ管理ソフトも自社製のがあるんですが、
そういうのは管理できる人を手配するのが大変らしいです、、、
509:デフォルトの名無しさん
09/03/24 00:30:50
STLは偉大だなぁ。ちゃんと処理時間についても言及されてる。
510:デフォルトの名無しさん
09/03/24 00:40:32
>>507
そうですね。
じゃあ、ダブルリンクには処理が終了してないものを入れておくことにして、終了したものは
dequeで管理する、そしてダブルリンクの全探索は1秒に1回にしてやります。
過去1時間以内に処理した要求の数は、ダブルリンク上の処理中のものの数+deque上のもの。
これで実装してみます。
明日の朝までにできるかな。
511:デフォルトの名無しさん
09/03/24 00:41:40
STLは元々Adaに組み込もうと研究されてたようですね
C++にtemplate機能が付け加えられたのに目を付けた
Stephanov(だっけ)がC++に移植したのが初めだとか
512:デフォルトの名無しさん
09/03/24 07:02:35
template に関してだけど、オーバーロードにするか、templateを書くかといつも
使いどころに迷ってしまう、皆さんはどういう基準で使い分けていますか?
513:デフォルトの名無しさん
09/03/24 07:23:59
オーバーロードで済むならオーバーロード。
テンプレートが必要な時だけテンプレート。
514:デフォルトの名無しさん
09/03/24 08:09:13
時間がないとき以外は全部テンプレート。自分が成長するため。
515:デフォルトの名無しさん
09/03/24 08:30:05
演算子のオーバーロードについて質問があります。STLのIteratorみたいに、
List<int> *list = new List<int>();
llist.push_back(1);
llist.push_back(2);
for(Iterator* iter = (ListIterator<int>*)list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
このような書き方ができるようにソースコードを書きたいのですがうまくいきません。
以下が(全部載せるには少し長いので)自分のソースの抜粋です。
class Iterator{
public:
//省略
virtual bool hasNext() = 0;
virtual Iterator<Type> &next() = 0;
virtual Iterator<Type> &operator++() = 0;
virtual Type& operator*() = 0;
};
template <class Type> class ListIterator : Iterator<Type>{
public:
//省略
Iterator<Type>& operator++ (int dummy){
return next();:
}
Type& operator*(){
return value;//現在イテレータが指しているセルの内容
}
}
このように定義したものを上のように実行すると、4227856のような数字が連続して表示されてしまいます。また、for文のところで実行時エラーが出ます。
どう書き直せばよいでしょうか……。
(素直にSTL使えって話なんですがね……OTL)
516:デフォルトの名無しさん
09/03/24 08:41:56
>>515
よく1回のカキコにおさめたな。
517:デフォルトの名無しさん
09/03/24 08:48:26
>>516
載せるところ選ぶのに苦労しました……。
重要そうなところだけ抜粋してます。
テンプレートクラスのListは自前で教科書読みながら基本的な機能は実装してみました。
こんなことしてるのは、単に興味とステップアップのためなんですが。
ちなみに学生ではありますが、ただの(へたれ)日曜?プログラマです。
サンプルコードまねるだけでろくなソフトも作れませんが……OTL
(っとこんなことはどうでもいいですよね……)
518:デフォルトの名無しさん
09/03/24 10:05:31
あるサイトを参考にして、下記のような半角全角変換関数を
作成したのですが、試しに適当にint型の変数を入れて
動かそうとすると下記のようなエラーが出ます。
参考サイトにあるものをほぼそのまま使用しており、
修正したところはcase文の中の変換する文字のみです。
参考サイトには、そのまま使用できるようなことが
書いてあったのですが、何が間違っているのか教えてください。
519:デフォルトの名無しさん
09/03/24 10:06:52
int han2zen(char *str)
{
char *buf, *p, *ptr;
buf=(char *)calloc(strlen(str)*2+1,sizeof(char));
for(ptr=str,p=buf; *ptr!='0\'; *ptr++){
switch((int)*ptr){
case '0': strcpy(p,"0");p+=2;break;
case '1': strcpy(p,"1");p+=2;break;
case '2': strcpy(p,"2");p+=2;break;
case '3': strcpy(p,"3");p+=2;break;
case '4': strcpy(p,"4");p+=2;break;
case '5': strcpy(p,"5");p+=2;break;
case '6': strcpy(p,"6");p+=2;break;
case '7': strcpy(p,"7");p+=2;break;
case '8': strcpy(p,"8");p+=2;break;
case '9': strcpy(p,"9");p+=2;break;
case default:
*p=*ptr;
p++;
*p='\0';
break;
}
}
strcpy(str,buf);
free(buf);
return(0);
520:デフォルトの名無しさん
09/03/24 10:07:57
(1849) : error C2001: 定数が 2 行目に続いています。
(1849) : error C2015: 定数の文字数が多すぎます。
(1850) : error C2143: 構文エラー : ';' が 'switch' の前にありません。
(1850) : error C2143: 構文エラー : ')' が 'switch' の前にありません。
(1861) : error C2059: 構文エラー : 'default'
(1868) : error C2040: 'strcpy' : 'int ()' は 'char *(char *,const char *)' と間接操作のレベルが異なります。
(1869) : error C2371: 'free' : 再定義されています。異なる基本型です。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\\include\malloc.h(123) : 'free' の宣言を確認してください。
(1871) : error C2059: 構文エラー : 'return'
(1872) : error C2059: 構文エラー : '}'
521:デフォルトの名無しさん
09/03/24 10:10:37
>>515
printf("%d ", (**iter));
正直混乱するのでiteratorで多態はやめた方がいいんじゃない?
Listの実装でListIteratorを返すようにして
for(ListIterator iter = list->iterator(); iter->hasNext(); iter++){
printf("%d ", (*iter));
}
522:デフォルトの名無しさん
09/03/24 11:12:35
>>519
'0\'
'\0'
case default:
default;
523:515
09/03/24 12:20:00
>>521
レスありがとうございます。
>printf("%d ", (**iter)
なんでうまくいかないんだろうと4時間くらい混乱してました。
List::iterator()でnewしてポインタを返す仕様でした……(もちろん管理してdeleteもする)。
とりあえず一つ前のソースコードは(**iter)で動きました! どうもです。
ポインタ渡してるんだから*が一個多く必要なのは当然。初歩的なミスだったとは恥ずかしい。
初めて演算子のオーバーロードなんてやるからそれが間違ってるのかと思い込んでました。
List::iterator()は、
ListIterator<Type> iterator(){
return ListIterator<Type>(this);
}
現在のソースコードはポインタじゃなくてこんな感じにしてみました。
>多態はやめたほうが……
Iteratorクラスを作って継承するのはやめる方向で書き直してみます。どうせ自分しか使わないですし。
アドバイスありがとうございました。
スレ汚し失礼しました。
524:デフォルトの名無しさん
09/03/24 13:59:10
518,519,520です。
ありがとうございます。
おかげで動くようにはなったのですが、
期待する値を得ることができません。
下記のような値が返ってきてしまいます。
何がいけないんでしょうか?
INPUT OUTPUT
HAN2ZEN("9") NULL
HAN2ZEN("99") 結果なし
HAN2ZEN("999") 9
HAN2ZEN("9999") 結果なし
HAN2ZEN("99999") 9
HAN2ZEN("999999") 99
HAN2ZEN("9999999") 999
HAN2ZEN("99999999") 99
HAN2ZEN("999999999") 999
HAN2ZEN("9999999999") 9999
525:デフォルトの名無しさん
09/03/24 14:24:58
>>524
int main()
{
char s[100];
for (int i = 1; i <= 10; i++)
{
s[0] = '\0';
for (int j = 0; j < i; j++)
{
strcat(s, "9");
}
printf("HAN2ZEN(\"%s\")", s);
han2zen(s);
printf("%s\n", s);
}
return 0;
}
これでちゃんと出たけどな?
526:デフォルトの名無しさん
09/03/24 14:43:54
ありがとうございました。han2zen関数の使用方法を間違って、
例えばprintf("%s\n", han2zen(s));のように使用していたため
変な値が返ってきていただけでした。助かりました。
527:デフォルトの名無しさん
09/03/24 16:19:10
VS2005を使っているのですが、iostreamをインクルードすると
error C2913:明示的な特殊化; 'std:iterator_traits'はクラス テンプレートの特殊化ではありません。
をはじめ100以上のエラーがでます。
xutilityというファイルが原因のようですが、特に書き換え等行っていません。
プログラムは別のPC(同じOS、同じVS)に移すとエラーを吐きません。
アドバイスを御願いします。
528:デフォルトの名無しさん
09/03/24 16:37:17
VSを入れ直す
529:デフォルトの名無しさん
09/03/24 17:06:31
ところで、
C言語のスレッド関係の関数をC++のクラスでとりあえずラップ・カプセル化っぽくした簡単な自作ソースコードがあるんですけど、
需要ありますか?
機能はかなり限定されてますけど、Windows(ほぼWin32 APIのみのVC++)用、確かLinux用(pthread。簡素です)と両方あります。
これ見られたら、ダメ出しをたくさんくらいそうだけど。
530:デフォルトの名無しさん
09/03/24 18:13:44
需要ありますか?じゃなくて
ダメ出しして欲しいんで見てくれませんか?だろ
boost::threadがあるしな
531:デフォルトの名無しさん
09/03/24 18:16:28
>>530
だよな
いらないよな
532:デフォルトの名無しさん
09/03/24 18:20:01
えー。マルチスレッドなprintfとか欲しいよ。
文字単位でスレッド分割して最終的に正しいストリームを形成するみたいな。
どう?
533:デフォルトの名無しさん
09/03/24 18:21:22
>>529
最近ねたが無いからうpれ
534:デフォルトの名無しさん
09/03/24 18:40:22
土下座して頼むならうpってあげてもいいんですが。
535:デフォルトの名無しさん
09/03/24 19:05:54
>>530,531,533
それが本音で、ネタのためにも、うpしたかったと>>529が申しております。
よかったら見てやってくださいとのこと。
多分、これだ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
536:デフォルトの名無しさん
09/03/24 20:31:51
>>535
このスレ見るものが、怪しげなzipファイルを踏むとは思えないんだけど
537:デフォルトの名無しさん
09/03/24 20:44:13
オレは踏んだ
そしてどちらかの環境(Win,Linux)しか使わないなら必要ないと判断した
538:デフォルトの名無しさん
09/03/24 20:59:44
svg形式を解析・出力するようなオープンなライブラリないのかな
なけりゃ自力で作るんだが・・・完全準拠って大変だな・・・
改めてブラウザって大変なんだなって思うわ
539:デフォルトの名無しさん
09/03/24 21:13:22
ないわけないやろが
540:デフォルトの名無しさん
09/03/25 00:34:19
>>538
オープンの意味による。
GPLならいっぱいあるが、Non-GPLでC/C++から使えるオープンソース実装は多分ないと思う。
ていうかあるなら俺に教えてくれ。
OpenVGもNon-GPLで非プロプライエタリな実装が見あたらないんだよ。
リファレンス実装をGPLで配布するとかマジやめて欲しい。
541:デフォルトの名無しさん
09/03/25 00:42:20
ハノイの塔を解くプログラムを書いたのですが、結果が正しいのかわかりません。
どなたか検証していただけないでしょうか?
↓ソース
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8999.c
ちなみに、円盤の個数が5までなら正しいのを確認してます。
542:デフォルトの名無しさん
09/03/25 01:14:36
5個まで正しいなら、6個目も正しいのは簡単にわかるよ。
なぜなら、6個目の解法は
5個目までの解法+一番下を動かす+5個目までの解法(ただし最初とは使う柱が違う)
だから。
ちなみに7個目の解法は
6個目までの解法+一番下を動かす+6個目までの解法(ただし最初とは使う柱が違う)
以下同様。ハノイは簡単。
543:デフォルトの名無しさん
09/03/25 01:19:59
>>541
危なっかしい警告が出てるので、まず潰したほうがいい。
結果はこれと比べとき。
#include <stdio.h>
int Solve(int num, int step, int from, int to, int tmp)
{
if (num) {
step = Solve(num-1, step, from, tmp, to);
printf("%d 手目: %d -> %d\n", step++, from, to);
step = Solve(num-1, step, tmp, to, from);
}
return step;
}
int main(void)
{
int num;
printf("円盤の個数を入力して下さい: ");
scanf("%d", &num);
Solve(num, 1, 0, 2, 1);
return 0;
}
544:デフォルトの名無しさん
09/03/25 08:23:34
for (list<int>::iterator i = lists.begin(); i != lists.end(); ++i) {
if (iが何かの条件を満たしているとき)
lists.erase(i);
}
とやれば、リストをたどって、条件を満たしている要素全部を消していくことができますか?
545:デフォルトの名無しさん
09/03/25 08:46:11
remove_if
546:デフォルトの名無しさん
09/03/25 09:02:16
RemoveとEraseはなにが違うんですか?
547:デフォルトの名無しさん
09/03/25 10:27:35
>>546
あなたのお使いのライブラリの仕様によります。
STLについてなら、RemoveもEraseもありませんのでremove, eraseのことだと思いますのでそれについては以下に。
removeは対象の要素が指定したキーと一致した場合のみ削除しますが、eraseは一致を確認することなく削除します。
但し、removeは対象となるコンテナがlistの場合のみ使用できます。
尚、algorythmにあるremoveは、対象要素を移動しますがメモリの後始末はしないので注意が必要です。
548:デフォルトの名無しさん
09/03/25 10:34:29
>>541
円盤の番号を上から1~n、手順を1から数えるとして、手順mに動かす円盤は手順mを
二進表現したときの最初の1が下から数えて何番目に出現するか数えればいい。
例えば、100手目に動かす円盤を知るには先ず100の二進表現を得ればいい。
これが110100なので、下から3番目が1と判る。つまり、上から3番目の円盤を動かすと知れる。
要は、再帰は必須ではない。
549:デフォルトの名無しさん
09/03/25 12:19:05
>>547
ありがとうございます。VC++9を使ってます。
listの中を1周しながら、条件に合うものをerase()しているのですが、1周する途中で
デバッグエラーに引っかかります。何が間違ってるのでしょうか?
550:デフォルトの名無しさん
09/03/25 12:26:29
要素の追加、削除した後のiteratorって保障されないんじゃないの?
remove_ifとかした後で、いらない要素をまとめてeraseすればいいんじゃないだろうか
551:デフォルトの名無しさん
09/03/25 12:35:17
>>544
erase() に渡されたイテレータは無効にり、無効なイテレータは
インクリメントできない(未定義動作になる)。
URLリンク(www.google.co.jp)
552:541
09/03/25 17:06:53
お礼が遅くなってすみません。
大丈夫みたいですね。どうもありがとうございました。
553:デフォルトの名無しさん
09/03/25 17:32:34
list< int >::iterator i = lists.begin();
while ( i != lists.end() ) {
i = lists.erase( i ); // erase()は削除した要素の次の要素を指すイテレータを返す
}
こんなかな。っていうか、STLでは自前のループはなるべく書かない。
554:デフォルトの名無しさん
09/03/25 17:54:06
C++で変数(例えばdouble型)に#INFを代入する方法はないでしょうか?
出来れば環境依存しない方法を探しています。
555:デフォルトの名無しさん
09/03/25 17:59:03
依存無しは無理だろ
浮動小数にIEEE754を使うことが定められてるわけじゃないから
INFなんてものが存在するとは限らないし
556:デフォルトの名無しさん
09/03/25 18:40:44
>>554
std::numeric_limits<double> infinity()
存在するかどうかのテストも用意されてたはず。
557:デフォルトの名無しさん
09/03/25 18:41:42
>>554
環境依存だろうけど
x=1e+1000;
558:デフォルトの名無しさん
09/03/25 21:59:14
Windows(Vistaです)のC++でsleep(秒)を使おうと思っているのですが、どのヘッダを
インクルードすればよいのかわかりません。結局
#include <windows.h>
をインクルードして、
Sleep(ミリ秒);
を使ってますが、Windowsでsleep()はつかえるのでしょうか?
559:sage
09/03/25 21:59:39
すみません。古い技術で恐縮ですが、
VB6用のDLLをVC++で作成するとき、
VB6で使用するタイプライブラリはどのように作成するのでしょうか?
560:デフォルトの名無しさん
09/03/25 22:21:08
>>558
それしかありません
561:デフォルトの名無しさん
09/03/25 22:53:14
>>560
わかりました。
ありがとうございます。
562:デフォルトの名無しさん
09/03/26 00:48:06
VC6.0でビットマップAの特定座標にビットマップBをコピーして、
それらを一切表示せずにビットマップCとして保存したいのですが、
BitBltという関数を用いれば可能なのでしょうか?
563:デフォルトの名無しさん
09/03/26 01:26:02
C++で、名前なし名前空間に関数を書いた場合とただのスタティック関数は、機能面から
考えたら同じと思っていいですか?
そのファイル内からだけ使えるという点で。
564:デフォルトの名無しさん
09/03/26 01:37:41
おい、誰か答えろや。
答えんかい!
565:デフォルトの名無しさん
09/03/26 02:43:02
関数使わなくても
座標計算してあとは合成すればいい
まああれだ
566:デフォルトの名無しさん
09/03/26 03:26:22
>>564
ちょっとだけ違う
567:デフォルトの名無しさん
09/03/26 03:54:26
そのへんは週刊 名前空間・創刊号に詳しく載ってるから買ってくるといい
確か初回は特製boost::binderがついてくるはず
568:デフォルトの名無しさん
09/03/26 05:27:59
>>566-567
ほんとに役に立たないスレだな。
もっとちゃんと答えろ。
こっちは眠いのを我慢してレス待ってんだから。
早くしてくれや。
569:デフォルトの名無しさん
09/03/26 06:28:20
あー眠い眠い。早く教えてくれ。寝ちまうぞ。
570:デフォルトの名無しさん
09/03/26 06:55:12
いいよ。
571:デフォルトの名無しさん
09/03/26 06:57:10
おやすみー
572:デフォルトの名無しさん
09/03/26 07:04:18
>>570-571
はやく助けろや。
こっちは急いでんだわ。
573:デフォルトの名無しさん
09/03/26 07:15:17
おぅ。わかった。すぐに答えるからちょっと待ってろ
574:デフォルトの名無しさん
09/03/26 07:21:27
>>563
リンケージが違う。といっても、どのみちファイル外からはアクセスできないんで
あまり実用上の違いはない。
「リンケージが違う」ことを意識して、わざと違いの出るサンプルを作るとこんな感じ。
他にもあるかもしれないけどね。
template<void (*)()> int t() { return 0; }
namespace { void an() {} }
static void st() {}
int main() { return t<an>(); } // t<st> はコンパイルエラー
575:デフォルトの名無しさん
09/03/26 07:28:56
もっとわかりやすく説明しろよカスども
576:デフォルトの名無しさん
09/03/26 08:39:31
あたまだいじょうぶでちゅかあ?
ことばわかりまちゅかあ?
577:デフォルトの名無しさん
09/03/26 08:44:02
わからないでちゅ・・・
578:デフォルトの名無しさん
09/03/26 08:56:46
意味もなく盛り上げてんじゃね~よ
579:デフォルトの名無しさん
09/03/26 09:10:06
>>574
ダメだよこういう時は嘘を教えなきゃ。
580:デフォルトの名無しさん
09/03/26 09:47:06
浅く寝ちまったよ。
>>574
ありがとョ。でもVC++2008だと、t<st>でもt<an>でも両方とも
コンパイルできたけど?ほかの環境でも試したほうがいいのかな?
>>579
うるせーやつだな。
581:デフォルトの名無しさん
09/03/26 11:50:38
>>580
> ほかの環境でも試したほうがいいのかな?
試さなくていいよ。
582:デフォルトの名無しさん
09/03/26 12:45:35
>>581
そうか、まあまずリンケージから理解するかと思って調べたらこんなの出てきたんだけど、
ほんとかどうかついでに教えてよ。
C 言語と C++ 言語では const キーワードを使うことで定数を宣言することができます。
例えば const int cardmax=13; のように使用できます。これが単一のモジュールだけで
使われるのならば問題がないのですが、複数のモジュールにわたって使われる場合、
C言語と C++ 言語では constのリンケージが違うので、注意が必要です。具体的には
C言語では外部リンケージをもち、C++ 言語では内部リンケージを持ちます。つまり
C 言語では他のモジュールから使用する場合、そのモジュール内で
extern const int cardmax;
と宣言すればこの定数は使用可能ですが、C++ 言語では同じようにしても参照する
ことはできません。C++ 言語で外部から const オブジェクトを参照したい場合には、
定数を定義するときに、
extern const int cardmax=13;
のように定義する必要があります。
583:デフォルトの名無しさん
09/03/26 12:49:13
>>582
正しいよ。
ちなみにCでconstで内部リンケージを持たせるなら
static const cardmax=13;
ってやる。
584:デフォルトの名無しさん
09/03/26 15:14:19
>>580
へぇ VC++ だと通るのか。独自拡張じゃないかな? /Za でエラーになるかも。
ちなみに Cygwin の gcc 3.4.4 ではこんなエラーになる。
: In function `int main()':
:4: error: `st' is not a valid template argument
:4: error: no matching function for call to `t()'
585:デフォルトの名無しさん
09/03/26 22:18:37
>>584
/Zaのつけ方を教えて。
586:デフォルトの名無しさん
09/03/26 22:36:10
>>585
つけ方がわかったんで、つけてもう一回コンパイルしてみたけど、それでも
結果は同じ。どっちでも通るけどな。
587:デフォルトの名無しさん
09/03/27 02:07:55
まったくお前らのせいで昼夜逆転しちゃったよ。
はやく解クレや。
今はカップ麺にお湯入れたんで、完成待ち。
やっぱ夜はいいな、静かでな。
588:デフォルトの名無しさん
09/03/27 13:02:08
なんかカキコが減っちゃったな。
俺のせいかな。
悪かったよ。もう消えるわ。
じゃあな。
589:デフォルトの名無しさん
09/03/27 23:33:13
なんか難しい方のスレで聞いちゃったみたいだからこっちで聞きなおしますね。
それにしても初心者スレって沢山あってどこで聞けばいいか良く解らないけどここにする。
C言語は上から順番に処理されるんだよね。
そうすると、割り込むみたいなことは許されないんだよね?
例えばfor文のループ中にキーを押したらそのときのtimeを取れるみたいなのは無理?
for( )
・・・・・・・・・
if(getchar
見たいなのじゃなくて、for文でゲームみたいなの動かしたいんだけど、
その途中でどんな途中でもtimeが取れるみたいなことは出来ないですか?
590:デフォルトの名無しさん
09/03/27 23:50:42
>>589
_beginthreadex
591:デフォルトの名無しさん
09/03/28 00:04:52
つ _kbhit()
592:589
09/03/28 01:09:16
ありがとうございます。
593:デフォルトの名無しさん
09/03/28 05:28:17
>>589
スレッドを作るんだよ。2つのスレッドを作ってそれぞれにHello world出力
させてみろ。話はそれからだ。
あとは環境を書けや。WindowsかLinuxか。
594:デフォルトの名無しさん
09/03/28 07:06:38
スレッド信者ウゼ
595:デフォルトの名無しさん
09/03/28 07:30:11
>>594
信者もなにも、基本だろ。
クソな書き込みするくれーなら、意味のあること書いてミロ。
596:デフォルトの名無しさん
09/03/28 07:57:08
_kbhit()にしてもどんなタイミングでも実行させるならマルチスレッドでやるしかないだろう
597:デフォルトの名無しさん
09/03/28 08:19:14
USBから自作した機器の制御とかをやりたいと思い、Windowsのドライバのプログラミング
について勉強しようと調べてたんですが、ググっても本の通販ページばかり出てきて
何が必要なのか、どのようにして作るのかがまったく分かりません。
どこか基本的なところから作り方解説してくれてるサイトありませんか?
本買えと言われるかもしれかいけど、本買うかはドライバ開発ってどんな感じなのか
知って、本当にやってみようか考えてから買いたいんです。
598:デフォルトの名無しさん
09/03/28 08:26:05
めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
下記のように、CHogeHogeのクラス変数を初期化するのに、別のシングルトンクラス(CHoge)のメソッドの
戻り値を与えるコードを書いたところ、CHogeHogeのクラス変数を初期化するタイミングではまだCHogeが
生成されておらず、落ちます。コメント内のコードもうまくいきそうですがNGです
恐らくリンクオプションとか、pragmaで逃げられそうに思うのですが
対策方法を教えてください。処理系はVC6 SP5です
「CHogeHoge.cpp」
CHogeHoge* CHogeHoge::s_pInstance = new CHogeHoge(); // static
CHogeHoge* CHogeHoge::GetInstance()
{
return s_pInstance;
}
int CHogeHoge::GetValue()
{
return m_Value;
}
/* -- これもNG
CHogeHoge CHogeHoge::s_Instance; // static
CHogeHoge* CHogeHoge::GetInstance()
{
return &s_Instance;
}
*/
「CHoge.cpp」
const int CHoge::STATIC_VALUE = CHogeHoge::GetInstance()->GetValue();
なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
599:デフォルトの名無しさん
09/03/28 08:32:03
>>598
言ってることと書いていることが違う気がするのは気の所為か?
私にはCHogeクラスの変数をCHogeHogeクラスのメンバ関数で初期化しているように見えるのだが。
つーか、設計を見直すと言う選択肢はないのだろうか。
600:デフォルトの名無しさん
09/03/28 08:46:03
CHogeの実装をCHogeHoge.cppに入れればいいんじゃね?
601:デフォルトの名無しさん
09/03/28 08:51:34
class CHoge {
CHoge & instance() { static CHoge h; return h; }
};
void CHogeHoge::init()
{
m_Value = CHoge::instance().value;
}
602:デフォルトの名無しさん
09/03/28 09:05:29
>>596
入力反応に対応出来る範囲をうまく見積ればどうとでもなる
for(){
int i = 0;
l_c:
switch(_kbhit()?0:++i){
case 0: printf("time");goto lc;
case 1: ~;goto lc;
case 2: ~;goto lc;
default:
}}
603:デフォルトの名無しさん
09/03/28 09:27:12
>>597
ググった結果から microsoft のサイトのものを見るといい
604:デフォルトの名無しさん
09/03/28 10:10:15
>598
>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
なんでそれだと駄目なん?
>めちゃくちゃ環境依存(処理系依存)の問題だと思うので、こちらで質問です。
問題そのものは静的オブジェクトの初期化順序問題として割と有名。
URLリンク(www.parashift.com)
>601 みたいに関数内 static にするのも駄目?
605:598
09/03/28 12:22:45
>601さんの方法でうまくいきました。
しかもインスタンス保持用の変数は、クラス変数である必要すらないってことで、シンプルなので、
今後シングルトンはこの方法を愛用することになりそうです。
>604さん
有名な問題なのですね、勉強になります。
>>なお、GetInstance内でnewすれば問題解決するとは思いますが、それ以外の方法でお願いします。
>なんでそれだと駄目なん?
出来るだけシンプルにしたかったのと、
正攻法の攻略法を知っておこうと思ったからです。
ありがとうございました。
606:デフォルトの名無しさん
09/03/28 13:44:42
>>605
> 正攻法の攻略法を知っておこうと思ったからです。
わかってないから質問してるんだろうに、
正攻法で無いと決め付けてるのは何で?
607:デフォルトの名無しさん
09/03/28 16:26:26
>606
私の設計意図から外れるから。
URLリンク(ja.wikipedia.org)
のJavaの例の後者の方の例でどうしてもやりたかったから。
608:デフォルトの名無しさん
09/03/28 16:28:50
そしてスルーされる>599と>600。
>599の設計を見直すとか、>600のソースを纏めるとか、その辺りが正攻法じゃないのか?w
609:デフォルトの名無しさん
09/03/28 16:33:39
どう転んでも無理なんだから、どこかで妥協するなら、静的メンバで持つのを否定することも選択肢のうちだぜ
610:デフォルトの名無しさん
09/03/28 16:34:50
設計を見直す、は設計の正攻法だけど、設計を変えないといけないから、
対処法の正攻法ではない、と。
単に言葉の問題。変なところに噛み付いてこないでね。
>599は説明ミス。指摘のとおりCHogeとCHogeHogeは逆。
>600は
うーん、
実際のところはCHogeはテンプレートクラスでm_Valueはテンプレートに渡された型からその型のビットサイズを求めてる。
で、これをほかのクラスで定数のように使いたい、っていう感じなんで、一緒のクラスに実装するのは抵抗ありますね。
611:デフォルトの名無しさん
09/03/28 16:38:28
後出しウザい
612:デフォルトの名無しさん
09/03/28 16:41:27
まさかとは思うが、1クラス1ファイルじゃないといけないなんて思ってないよな?
そんな阿呆みたいな糞言語と一緒にされたら困るんだが。
613:デフォルトの名無しさん
09/03/28 17:03:07
型情報から定数作りたいだけならmy_traitsクラスでも作ってろよ
614:デフォルトの名無しさん
09/03/28 17:11:28
相変わらず終わった話に食いつく奴の多いこと。
615:デフォルトの名無しさん
09/03/28 17:17:35
上から目線の質問者が、中途半端な認識で勝手に終了宣言しただけだと
なかなかスパッとはいかないね。
616:デフォルトの名無しさん
09/03/28 17:49:51
>>610
設計が正攻法じゃないのに正攻法な解決っておかしいだろJK
617:デフォルトの名無しさん
09/03/28 21:51:53
class Sample {
public:
static void func();
};
という定義をヘッダに書いたとき、関数の内容をソースファイルに書く際は、
staticを取って、
void Sample::func() {....}
と書けばいいですか?
staticはつけてはだめなんですか?
618:デフォルトの名無しさん
09/03/28 22:02:28
>>584
たしかにCygwinで試すと同じエラーになったけど、どうしてだめなのか
ぜんぜんわからん、、、
結構C++歴長いんだけどな。誰かわかる人いる?
619:デフォルトの名無しさん
09/03/28 22:03:01
そうだね。そっちにはstaticは付けない。
620:デフォルトの名無しさん
09/03/28 22:03:20
>>617
そのとおり。っていうか試せばわかるだろ。
621:デフォルトの名無しさん
09/03/28 22:11:39
>>618
ポインタや参照型のテンプレート実引数には外部リンケージを持つ
オブジェクト(へのポインタ)しか使えない。(メンバへのポインタでは関係ない)
14.4.2 Template non-type arguments p1 より
> A template-argument for a non-type, non-template template-parameter shall be one of:
> - an integral constant expression; or
> - the name of a non-type template-parameter; or
> - the address of an object or function with external linkage, including
> function templates and function template-ids but excluding non-static
> class members, expressed as & id-expression where the & is optional if
> the name refers to a function or array, or if the corresponding
> template-parameter is a reference; or
(以下略)
622:621
09/03/28 22:12:41
ごめん。
× 外部リンケージを持つオブジェクト
○ 外部リンケージを持つオブジェクトまたは関数
623:デフォルトの名無しさん
09/03/28 22:24:28
内部リンケージだと、テンプレートを実体化した先から見えないかもしんないからな。
まあ処理系の実装次第だろうけど、規格としては許すわけにはいかんのだろう。
624:デフォルトの名無しさん
09/03/28 22:32:26
すごい。
そんな仕様があったんだ。でもその仕様から、名前なし名前空間の中の関数とスタティック関数の
動作の違いを作り出すなんて、あんた頭いいね。
ありがとう。
625:デフォルトの名無しさん
09/03/28 22:39:16
>>624
昔 static 付けて定義した関数を template 引数に使おうとしてエラーになって
半日規格を漁ってたことがあってな。こういうのは知ってるかどうかだけの話で、
頭がいいとか言わんよ。
626:デフォルトの名無しさん
09/03/28 22:40:26
ということは、625はLinux使い?
627:デフォルトの名無しさん
09/03/28 22:46:26
gcc なら Linux 使いというのは Windows しか知らない奴の思考パターンだな。
PC 以外では gcc や gcc ベースのコンパイラがたくさん使われてるし、 >584 の
ように Cygwin だってある。それに規格がああなってる以上、 VC++ が異端なだけ。
628:デフォルトの名無しさん
09/03/28 22:56:20
でもstaticな関数引数をとるテンプレートを使うようなプログラムでgccを使うような人って、
普段はLinux使ってるという気がするけど。
BSD系使いとかSolaris使い?
最近は見かけないし。
629:デフォルトの名無しさん
09/03/28 23:06:44
>>628
なんという俺統計。
630:デフォルトの名無しさん
09/03/28 23:19:23
じゃあ結局何使いなの?
俺統計かもしれないが、結構同意してもらえると思うけどな。
Linux使ってんでしょ?
631:625
09/03/28 23:39:47
なんか変わった人がいるなぁ。
625 の話は「PC 以外」の話で、普段使ってるのは Windows だよ。
>627 も言ってるとおり、 Linux はまったく関係ない。
632:デフォルトの名無しさん
09/03/29 00:08:03
俺も普段は Windows で gcc (Mingw版) 使ってるしなぁ。
Linux と決め付ける根拠も「気がする」とか曖昧な割にしつこい。
まぁ、釣りなんだろうけど。
633:デフォルトの名無しさん
09/03/29 03:25:48
ごめん。
俺プログラマ結構たくさん知ってると思ってたんだけど、その中にWindows+gccという
組み合わせの人がいなかったもんでついつい変な書き方をしちゃった。
634:デフォルトの名無しさん
09/03/29 04:07:54
OSXが触れられてなくて泣いた
635:デフォルトの名無しさん
09/03/29 04:39:41
>>633 自分が知ってることが世の中のすべてだと思い込めるその思考回路が信じ難い。
636:デフォルトの名無しさん
09/03/29 09:10:55
たかがこれっぽっちのやりとりで
相手の思考回路を把握したと思い込める思考回路とかもな。
637:デフォルトの名無しさん
09/03/29 09:25:07
C++ではファイルスコープの宣言として、無名名前空間を使うことが推奨らしいですけど、
これってグローバル名前空間の中に無名名前空間を作ればいいのですか?
逆に、たとえばMyAppという名前空間に無名名前空間を追加しても、ファイルスコープの宣言とはならないのでしょうか。
638:デフォルトの名無しさん
09/03/29 09:51:02
>>637
ならない。
639:デフォルトの名無しさん
09/03/29 10:45:05
1>GameMain.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>GameTitle.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>CSelect.obj : error LNK2005: "class CDXMusic * m_dxmusic" (?m_dxmusic@@3PAVCDXMusic@@A) は既に Frame.obj で定義されています。
1>C:\.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
ヘッダーファイルで定義されているクラスにstaticをつけないと上のエラーが出るのですが
何故ですか・・・?
640:デフォルトの名無しさん
09/03/29 10:57:16
例のスレの人かな。
>>639
そのヘッダファイルがインクルードされる度にm_dxmusicが定義されているからです。
staticを付けると消えるのは、そのシンボルがエクスポートされずファイルスコープになるからです。インクルードしたファイル毎に別々のm_dxmusicが存在する状態になります。
これが意図した動作ではなく、m_dxmusicが複数のファイルで共有するシンボルなのであれば、ヘッダファイルでextern付きの宣言のみを行い、適当な.cppファイルで1度だけ定義しましょう。
641:デフォルトの名無しさん
09/03/29 11:40:43
>>637
名前空間の中でもいいよ。あんまり意味無いけど。
642:637
09/03/29 12:05:28
ありがとうございます。
うちのIDEでは、グローバル名前空間の無名空間がどれも同じ括りで表示されるので、名前空間ごとに把握できたら、
と思ってのことでしたが、グローバル空間に作ることにしました。
643:デフォルトの名無しさん
09/03/29 12:12:40
いや、名前空間の中でいいってば。
644:デフォルトの名無しさん
09/03/29 12:19:03
>>640
ありがとうございます
645:デフォルトの名無しさん
09/03/29 15:03:01
URLリンク(ruffnex.oc.to)
↑のツールと例を使ってkernel32.DLLの書き換えに挑戦してるのですが、
上手く行きません。
DLLを作成しようとすると 「 Error 12: Number Overflow : 」というエラーがdefファイルから検出されます。
エラーが出ている箇所は、「HeapSize=d_HeapSize @680」です。
自分で書き換えた箇所を戻して、コンパイルしてみても駄目でした。
コンパイラはdigital Marsのやつです。OSはvista
原因が特定できなくて困ってます
646:デフォルトの名無しさん
09/03/29 16:17:12
OSはvista
647:637
09/03/29 16:25:23
両方の意見が出たから、安全側とっといた方がいいかなあと思ったんで。
>あんまり意味無いけど。
ということであったし、とりあえずグローバル名前空間の方に書いときます。
648:デフォルトの名無しさん
09/03/29 16:39:15
>>647
無名名前空間の効果は名前付き名前空間の中でも変わらない。 >638 はデマ。
そして「あんまり意味無い」のは >642 のような事情が無いことが前提。
名前空間の中に入れたほうが便利なのに、わざわざグローバルに持っていく必要は無い。
649:デフォルトの名無しさん
09/03/29 16:52:09
「ファイルスコープの宣言」ということなら >638 は正しいだろ。
「ファイルローカルな宣言」ということなら間違いだけど。
650:デフォルトの名無しさん
09/03/29 17:00:39
そもそも C++ に「ファイルスコープ」などというスコープは無い。
651:デフォルトの名無しさん
09/03/29 20:46:44
コモンダイアログを用いてファイルの保存等を実装したいのですが、
OPENFILENAMEは定義されていない識別子です、とエラーが表示されてしまいます
何かをincludeすれば良いのでしょうか
652:589
09/03/29 20:48:04
あのですね、何度も申し訳ありませんが、kbhitじゃダメでした。
while(!kbhit())とかにしても、したまで実行してからじゃ無いと止まってくれません。
do~whileとか色々試してみたけどやっぱりダメです。
何かいい方法をよろしくお願いします。>>589
653:デフォルトの名無しさん
09/03/29 20:52:33
>>651
URLリンク(msdn.microsoft.com)
654:589
09/03/29 21:05:25
いいなー、凄いなー
655:589
09/03/29 21:06:51
>>654
↑
これ無しwwww
NHK見てて間違ったwww
因みに589はマジレスですのでよろしくお願いします。
656:デフォルトの名無しさん
09/03/29 21:12:35
void foo()
{
while(1)
{
Sleep(100);
if( _kbhit() )
{
printf("Time:%d\n", clock() );
_getch();
}
}
}
int _tmain(void){
HANDLE handle;
int id;
handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)foo, NULL, 0, (LPDWORD)&id);
while(1)
{
Sleep(1000);
printf("var\n");
}
}
657:デフォルトの名無しさん
09/03/29 21:17:44
// VC++6.0 SP6
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>
void main()
{
time_t tm;
int i;
while (1) {
if (_kbhit()) {
i = getch();
if (i == 'e') {
break;
}
time(&tm);
printf("%d\n", tm);
}
Sleep(100);
}
}
658:デフォルトの名無しさん
09/03/29 21:20:53
>>651です
Commdlg.hが足りていませんでした
事前調べ不足でした。>>653さんありがとうございます
659:デフォルトの名無しさん
09/03/29 22:58:15
>>652
ちゃんとやろうとすると C/C++ の規格内では出来ない。
環境が Windows ならメッセージループを作るべきだろうけど…
あるいは既にレスがあるとおりスレッドを作るにしても、
メインスレッドとのやり取りには注意点は多いし。
初心者に説明するには結構こみいった話なんだわ。
ここで全てを説明するのはちょっと無理ってことをわかってくれ。
メッセージループやスレッドの基礎をわかってからまた来い。
660:デフォルトの名無しさん
09/03/30 07:24:29
状態移管さえ把握すればCで出来ん訳ない。
661:デフォルトの名無しさん
09/03/30 08:25:21
VC++を使ってますが、NULLを使おうとすると
#include <iostream>
とかしないとコンパイラが受け付けてくれません。
でも自前のヘッダがあるのでできるならインクルードしたくありません。
このばあいどうすればよいでしょうか
インクルードするしかないですか
662:デフォルトの名無しさん
09/03/30 08:28:19
>>661
C++であるなら
NULL は確実に 0 のdefineなので
0 つかっとけ
663:デフォルトの名無しさん
09/03/30 08:44:19
でもポインタの初期化であることをはっきりさせるためにNULLを使いたいんです。
自分で定義するのはだめですか
664:デフォルトの名無しさん
09/03/30 08:51:44
>>661
VCバージョンいくつよ?
VC6なら窓から投げ捨てろ
665:デフォルトの名無しさん
09/03/30 08:54:40
NULLが欲しいなら
#include <cstddef>
だろ
666:デフォルトの名無しさん
09/03/30 08:55:40
>>663
#ifndef 使ってちゃんと囲っておけば
コンパイルや動作上の意味では問題は起こらないから
好きにすればいいんじゃないかな
重ねて言うがC++では 0 で定義されてるから
>>664
なんにもincludeしてないのにNULLが定義されてるほうがおかしいだろ
667:デフォルトの名無しさん
09/03/30 09:15:52
>>662
実装依存だよ。 gcc なんかは特別な警告が出るように細工してあったはず。
668:デフォルトの名無しさん
09/03/30 09:22:26
ほとんどのプログラムはstdio.hかwindows.hをインクルードするから
どっかでNULLは定義されるな
iostreamは知らん
669:デフォルトの名無しさん
09/03/30 09:49:25
>>667
調べたらほんとに違うんだな
C++ じゃ ((void *)0) はありえないから 0 だぜっての鵜呑みにしてた
どうもありがとう
670:デフォルトの名無しさん
09/03/30 09:58:13
>>668
NULLが定義されてるのは <cstddef> の中(Cなら <stddef.h>)。
それ以外を #include して定義されても処理系依存の動作。
671:デフォルトの名無しさん
09/03/30 10:27:02
boost::shared_ptr<Test> p = new Test();
boost::shared_ptr<Test> p(new Test());
この2つはどう違いますか?
上のやつだとコンパイルできません。
672:デフォルトの名無しさん
09/03/30 10:32:30
shared_ptrはポインタを取るコンストラクタがexplicitなので、
暗黙の型変換はされない。明示的にコンストラクタを呼ぶ必要がある。
673:デフォルトの名無しさん
09/03/30 10:33:19
>>670
NULL は cstddef のほかに cstring, ctime, cwchar, clocale, cstdio でも定義されることに
なっている。
C.2.2.4 Macro NULL より
> The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or
> <cwchar>, is an implementation-defined C++ null pointer constant in this International Standard.
674:デフォルトの名無しさん
09/03/30 10:37:20
>>672
ありがとうです。
でもよくわかりませんでした。
boost::shared_ptr<Test> p = new Test();
という書き方は明示的にコンストラクタを読んでないということですか?
675:デフォルトの名無しさん
09/03/30 10:47:49
明示的に呼ぶとこうなる
boost::shared_ptr<Test> x = boost::shared_ptr<Test>(new Test);
676:デフォルトの名無しさん
09/03/30 10:55:12
>>675
それでできました!
Testクラス内にboost::shared_ptr<Test> mInstance;
というポインタを持たせてたのですが、初期化できずにこまってました。
(初期化をコンストラクタ以外の場所で行いたかったため、
mInstance(new Test())
とかってかけなかった。
ありがとうございました!
677:デフォルトの名無しさん
09/03/30 10:56:47
>671の前者だと、Test *をboost::shared_ptr<Test>にキャストしようとして失敗するわけだね。
678:デフォルトの名無しさん
09/03/30 11:16:02
>>677
なるほど。
あと、676のような場合は、scoped_ptr<Test>は使えませんよね?
コンストラクタで初期化しないから。
679:デフォルトの名無しさん
09/03/30 11:21:53
>>677,678
微妙に誤解してそうな気がするんだけどうまく説明できないので端的に言うと
>>675
の形でもshared_ptrのコンストラクタは一回しか呼ばれない
680:デフォルトの名無しさん
09/03/30 11:25:43
>>676
reset(new Test()) 使えよ。
681:デフォルトの名無しさん
09/03/30 11:34:23
>>678
コンストラクタで初期化しないことと scoped_ptr での置き換えの可能性は関係ないと思うよ。
682:デフォルトの名無しさん
09/03/30 11:46:43
>>680-681
たしかに、scoped_ptr()でreset(new Test())使うとできました。
ありがとうございました。
683:デフォルトの名無しさん
09/03/30 12:00:18
すいません。boostをucLinuxに入れようとしてます。
boost_1.38なんですが、boost::conditionが解決できません。
それ以外はコンパイルは通ります。
普通にfedora core7に入れてもだめです。
yum install boost-develだとうまくいくのですが、
なにかやり方があるのでしょうか?初心者ですいません。
684:デフォルトの名無しさん
09/03/30 12:57:04
クラス内にスタティックなポインタを持たせたいのですが、そのポインタをスマートポインタにできるでしょうか?
class Test {
static boost::scoped_ptr<MyClass> m_MyClass;
};
これの実体を書くところで初期化までしようとしているのですがうまくかけません。
685:デフォルトの名無しさん
09/03/30 13:04:21
>>684
とりあえず書いた奴とエラーメッセージと scoped_ptr のマニュアルをよく見るんだ。
それでもわからなければ、以上の全部を添えて相談するといい。
686:デフォルトの名無しさん
09/03/30 13:24:56
>>685
言われたとおりにもう一回見直してみたらできました。
初期化は
boost::scoped_ptr<MyClass> Test::m_MyClass;
と書きました。あとBoost::scope_ptrのメンバを持つクラスのデストラクタは
privateにしたら駄目なようで、publicにしないとコンパイルできませんでした。
ありがとうございました。
687:デフォルトの名無しさん
09/03/30 15:43:17
>>683
自己解決しました。
バージョンによって、ソース変えないといけないんですね。
インクルードを適度に増やして解決しました。
さて、リンクまで行ったんですが、クロスコンパイルで、想定通りには
ライブラリがうまく出来ていません。
bjamの設定でコンパイラにオプションつけるにはどうしたら
いいんでしょうか?
クロス開発なんてしてる人はいないですかねw
688:デフォルトの名無しさん
09/03/30 20:18:14
要はビルド時のコンパイラをクロスのものにしたいんだろ?
bjam -sTOOLS="gcc" -sGXX="/usr/local/cross-tools/sh-hitachi/bin/g++"...
でいいんじゃないのか
689:デフォルトの名無しさん
09/03/30 23:56:13
WindowsXP
VisualStudio2005のVC++
フォームビューに配置したエディットコントロールで
「Ctrl+A」「Ctrl+X」「Ctrl+C」「Ctrl+V」が全然きかないのですが
これはなんなんでしょうか?
他アプリからコピーした文字列をそのエディットコントロールにペースト
して処理したいのですが。
ググってもどうにも見つからなくて…。
690:デフォルトの名無しさん
09/03/30 23:59:03
カスタムからショートカットキーが消えてるとか言うオチはないか?w
691:デフォルトの名無しさん
09/03/31 00:12:30
そのエディットコントロールにフォーカスした状態で
メニューバーの「編集」をドロップダウンすると
「切り取り」「コピー」「貼り付け」等,全部グレーで選択不能になってる…。
なんか悪いことしたっけ?
692:デフォルトの名無しさん
09/03/31 00:19:59
>>689
ウィンドウプロシージャ内でブレーク張って、どこでメッセージが捨てられてるか見てみたら?
693:デフォルトの名無しさん
09/03/31 00:22:34
>>689
とりあえず、VC++にではなく、メモ帳あたりにコピペできるか試してみたら?
694:デフォルトの名無しさん
09/03/31 00:34:31
あれ?
ID_EDIT_COPY等の
OnEditCopyとかを自分で記述しなきゃいけないん?
エディットコントロールって初めからコピー・カット・ペーストくらい
できるんじゃなかったっけ…。
695:589
09/03/31 00:42:17
>>659
そうなんですか。どうもありがとうございます。
もっと勉強します。
696:デフォルトの名無しさん
09/03/31 00:42:46
編集不可になってるとかってオチじゃないのか?
697:デフォルトの名無しさん
09/03/31 01:04:16
>>696
エディットコントロールのプロパティでReadOnlyはFALSEにしてあるんですが…。
今試したら,ダイアログベースのプログラムにエディットコントロールを配置して
ビルドすると普通にカット・コピー・ペーストできますね。
でもフォームビューだとできない…。
どちらにしても「Ctrl+A」はきかないし。
こんな超重要ポイントがなんで入門書で触れられていないんだろう。w
698:デフォルトの名無しさん
09/03/31 01:16:47
OnEditCut()
{
m_edit1.Cut();
}
等を追加してなんとか解決しました。
エディットコントロールが勝手にやってくれると思い込んでいたもので…。
初心者の質問に付き合って下さった方々ありがとうございました。
699:デフォルトの名無しさん
09/03/31 01:20:34
>>698
それだと、フォームビュー上の別コントロールにフォーカスあるときも反応しちゃわないかな?
まぁEdit一つだけのデザインなら問題ないけど・・・複数あるなら困りそう。
700:デフォルトの名無しさん
09/03/31 01:33:40
IsDialogMessage
701:デフォルトの名無しさん
09/03/31 01:34:42
>>699
複数あるんです。w
今作っているものはエディットコントロールが2個あって片方はReadOnlyなのですが。
あと「Ctrl+A」もぜひ装備したいし…。
702:デフォルトの名無しさん
09/03/31 02:03:50
>>701
フォームビューだと勝手にやってくれなかったんだっけなぁ・・・?
と気になって試しにプロジェクト作ってみたら、やっぱできないわwww
というかむしろ、CDialogやCEditViewなら親切にやってくれてる、という話なんだろう。
URLリンク(www.vcppclub.com)
URLリンク(support.microsoft.com)
703:デフォルトの名無しさん
09/03/31 02:24:15
>>702
参照先ありがとうございます。
今「どのコントロールにフォーカスがあってもm_edit1のエディットコントロールに
ペーストされる」みたいな珍妙な動作になっています。w
GetFocus()を試してみます。
704:デフォルトの名無しさん
09/03/31 04:54:38
シングルトンで多態のクラスを作ったのですが、Baseクラスのコンストラクタとデストラクタを
プライベートに置こうとすると、コンパイルエラーになります。そこで、コンストラクタはProtected
に置いて、デストラクタはPublicに置きました。これって、こうするしかないですか?
ちなみに、多態を使うためのポインタを、Boost::scoped_ptr<>に置いてます。
705:デフォルトの名無しさん
09/03/31 06:30:49
生成と廃棄のコードをBaseの関数テンプレートにする。
706:デフォルトの名無しさん
09/03/31 06:32:13
あ、廃棄はいいのか。寝起きだとボケてていかん。
707:デフォルトの名無しさん
09/03/31 09:47:34
最近スマポについて色々質問させてもらっているものです。
もうちょっとだけ質問させてください。
スマポに保存しているポインタを取り出して関数とかに渡すとき、関数はスマポの形の
引数でポインタを受けるべきですか?それとも生のポインタで受けるべきですか?
class Hoge {
public:
boost::scoped_ptr<MyClass> m_MyClass;
};
というクラスがあるとして、このm_MyClassが持っているポインタを別の関数に渡すとき、
void func(MyClass *pMyClass);
void func(boost::scoped_ptr<MyClass> pMyClass);
このどっちの形にするべきなのか、わかりません。
どうかお願いします。
708:デフォルトの名無しさん
09/03/31 09:50:50
scoped_ptrはコピーできないだろ
709:デフォルトの名無しさん
09/03/31 10:24:57
>>688
mipsなんで、オプションを指定しないと正しいエンディアンにコンパイルできない。
bjamもバージョンで指定の仕方が違うなぁ。
試行錯誤しますです。
710:デフォルトの名無しさん
09/03/31 11:03:04
>>706
ありがとうございます。
Baseをテンプレートクラスにして、関数テンプレートを受けとり
コンストラクタの代わりにつかう、ということですか?
すげえややこしそうな気が、、、
711:デフォルトの名無しさん
09/03/31 12:26:30
>>688
gcc,g++等をシェルスクリプトで作ったらコンパイルできました!
引数もシェルスクリプトに入れたらスッキリインストール完了しました。
ところが、ucLibにはn_procs()というglibの関数がないんですね。
mips用のboostできたのに、ここからコンパイルできないや…
どこまでひっかかるんだか…
712:デフォルトの名無しさん
09/03/31 12:38:57
大抵はシングルトンをペチペチ叩く棒が多態になってれば十分だよね?
713:デフォルトの名無しさん
09/03/31 13:08:32
>>707
どっちでもない。参照を使え。
714:デフォルトの名無しさん
09/03/31 13:09:36
>>704
よく意味がわかんないから、ソース晒してくれたほうがいいと思うよ。
715:デフォルトの名無しさん
09/03/31 14:34:12
std::string buf;
std::ifstream ifs;
ifs.exceptions(std::ios_base::failbit);
//前半
ifs.open("a.txt");
std::getline(ifs, buf, '\0');
ifs.close();
buf.clear();
//後半
ifs.open("b.txt");
std::getline(ifs, buf, '\0');
ifs.close();
これを実行すると例外std::ios_base::failureが投げられるんですけど、どうすればファイルを2つ読み込めますか?
ちなみに、前半か後半のどちらかをコメントアウトすれば例外は発生しません。
716:デフォルトの名無しさん
09/03/31 14:41:47
>>715
前半と後半の間に ifs.clear() を入れればいいんだろうけど、そもそも
同じストリームオブジェクトで別々のファイルを開くというのが混乱の元の
ような気がする。
できれば別々のストリームオブジェクトを使うとか、前半と後半とを関数に
分けるとかするのがおすすめ。
717:デフォルトの名無しさん
09/03/31 14:47:06
>>716
ありがとうございます。
718:デフォルトの名無しさん
09/03/31 15:25:57
>>688
結局自力で解決できました。
boost::threadに相当するソースのget_nprocs(CPUの数)
を1にして、再度staticリンク指定したことで、
mips/ucLinuxのboostを作成でき、動作しました。
719:デフォルトの名無しさん
09/03/31 17:35:41
質問なんですが、Effective C++を読んで
func(boost::scoped_ptr<X>(new X), boost::scoped_ptr<X>(new X));
としたらメモリリークの危険があるのは引数の実行順が不定だからであり、それは分かります
(前者のnew Xが実行の後、後者のnew Xが実行中そのコンストラクタで例外が出たときとか)
その本では、スマートポインタへnewしたポインタを渡すのは独立したステートメントでやろう、となっているのですが
func(boost::scoped_ptr<X>(new X));
とした場合も危険はあるのでしょうか
new X → shared_ptr → 引数呼び出しの順番は変わらないような気がするので
720:デフォルトの名無しさん
09/03/31 18:39:42
それなら問題ないよ。
721:デフォルトの名無しさん
09/04/01 04:19:11
>>719
危険性があるかどうかって話なら >720 のとおり無いんだけど、
あとで func() に引数を足した場合に問題が発生する形に変更されてしまう
可能性が高いんだからそんなコードを書いていいってことには
ならないよ。
722:デフォルトの名無しさん
09/04/01 10:28:14
// value.cpp
namespace { int value = 5; }
int getValue() { return ++value; }
// use.cpp
int useValue() {
return 2 * getValue();
}
// test.cpp
namespace { int n = useValue(); }
というようなコードを書いた場合、test.cppでuseValueが呼び出されると、
getValueのコードも既に実在しているハズだからvalueも初期化済みということになりますか?
723:デフォルトの名無しさん
09/04/01 10:32:33
初期化順をコントロールするならシングルトンにしとけと、ばっちゃが(ry
724:デフォルトの名無しさん
09/04/01 11:15:30
>>722
value は静的な初期化で済むから、動的な初期化を必要とする n の初期化より先に
初期化されることは決まっている。
だからといって、そんな重箱の隅みたいな規則に依存するコードはおすすめできない。
725:デフォルトの名無しさん
09/04/01 12:36:59
ということは、関数の定義位置などとは関係なしに、変数の初期化順が決まるということですね。
そこら辺については未熟なので、勉強して理解できるようになるまでは、
何とか自分で扱えるような方法で考えてみます。ありがとうございました。
726:デフォルトの名無しさん
09/04/01 14:36:43
>>166 を誰か考察して。
727:デフォルトの名無しさん
09/04/01 15:30:21
class File {
public:
const char* data() const;
private:
boost::shared_array<char> m_Data;
};
こういうクラスがあって、m_Dataがcharの配列で、そこにデータが入ってます。
データは画像(バイナリ)です。そのデータにアクセスする手段として、
const char* data() const;
というのを作ったんですが、これは参照にすべきなのでしょうか?それとも
boost::shared_ptr<const char> data() const;
とかのように、ここでもスマポを使うべきでしょうか?
よろしくお願いします。
728:デフォルトの名無しさん
09/04/01 18:47:12
>>727
そもそも m_Data 全域へのアクセスを公開する必要があるのかどうか、だな。
getData(int index) でだめな理由はなんだろうか?
execute() で、内部にアルゴリズムを実装してはどうだろうか?
とか、考える方が先かも。
729:デフォルトの名無しさん
09/04/01 18:49:35
>728には>727の書いていることが理解できないらしい。
・アクセス関数の戻り値の型をどうしたらいいか
というのが質問の趣旨ですぜ。
730:デフォルトの名無しさん
09/04/01 19:34:11
ほうほうそれでそれで
731:デフォルトの名無しさん
09/04/01 19:37:54
スマポへの参照がいいんじゃないかな。
生ポならそのままコピーしちゃうけど
スマポはクラスでおっきいから。
boost使ったことないからよくわからんけど
732:デフォルトの名無しさん
09/04/01 19:41:47
>>727
template<typename T> const T data(const T&)const {return static_cast<const T>(m_data);}
変な受け皿用意されたらコンパイル時に蹴る。
733:デフォルトの名無しさん
09/04/01 22:36:19
C言語の質問です。
以下のコードがbus errorで死ぬんですが、何が間違っているのですか?
#include <stdio.h>
#include <stdlib.h>
void f(char **p);
int main(void)
{
char *p;
f(&p);
free(*p);
return 0;
}
void f(char **p)
{
*p = (char *)malloc(2);
*p[1] = 0;
}
734:733
09/04/01 22:38:27
あ、すみません。free(*p)はfree(p)の間違いです。
それと、どうやら*p[1] = 0;のところで死ぬようです。
735:デフォルトの名無しさん
09/04/01 22:42:41
> それと、どうやら*p[1] = 0;のところで死ぬようです。
(*p)[1] = 0;
736:デフォルトの名無しさん
09/04/01 22:42:54
mmalock( sizeof(char *) * 2 );
737:736
09/04/01 22:45:23
あれ、俺の頭がおかしい
738:デフォルトの名無しさん
09/04/01 22:56:48
ああ、疲れてんだな
739:デフォルトの名無しさん
09/04/01 23:18:38
>>735
演算子の優先順位の問題でしたか。ありがとうございます。
740:デフォルトの名無しさん
09/04/02 02:44:47
>>166,726
未初期化のオブジェクト i に対してドット演算子を適用することにより、未定義動作。
741:デフォルトの名無しさん
09/04/02 05:14:00
int *p = new int;
int *p = new int(1);
int *p = new int(100);
これってどう違うんですか?
全部コンパイル出来てしまいます。
742:デフォルトの名無しさん
09/04/02 05:22:10
>>741
int *p = new int; ← 不定値
int *p = new int(1); ← 1で初期化
int *p = new int(100); ← 100で初期化
743:デフォルトの名無しさん
09/04/02 08:48:19
>>742
ありがとうございました。
744:デフォルトの名無しさん
09/04/02 14:51:45
メモリリークを検出しようと思い
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
とやったのですが__CrtSetDbgFlagを呼ぶと
1>Frame.obj : error LNK2019: 未解決の外部シンボル __CrtSetDbgFlag が関数 _wWinMain@16 で参照されました。
と出ます アドバイスください;;
745:デフォルトの名無しさん
09/04/02 14:56:26
>>744
リリースビルドでやってないよね?
746:744
09/04/02 14:57:41
デバッグでやってます
747:744
09/04/02 14:59:04
c/c++ コード生成 ランタイムライブラリ
がマルチスレッド(/MT)ですけど関係ありますかね
748:デフォルトの名無しさん
09/04/02 15:06:57
/MTdじゃないのか?
749:デフォルトの名無しさん
09/04/02 15:07:44
/MT は、リリースビルド用・・・
750:744
09/04/02 15:10:18
すみません・・・・
勉強になりました
ありがとうございます
751:デフォルトの名無しさん
09/04/02 23:31:23
>発注額929億円のうち地元業者が受注したのは13%の122億円だった。
スポンサー以外を悪に仕立てたいマスコミと真に受ける馬鹿な国民が居る限りどうしようもないだろ。
752:デフォルトの名無しさん
09/04/02 23:33:24
談合必要論か
753:デフォルトの名無しさん
09/04/02 23:36:38
誤爆乙
754:デフォルトの名無しさん
09/04/02 23:56:14
shared_ptrのスマポをNULLで初期化できますか?
755:デフォルトの名無しさん
09/04/02 23:57:21
boost::shared_ptr<MyClass> m_MyClass =
boost::shared_ptr<MyClass>(reinterpret_cast<MyClass*>(0));
とやってできました。
756:デフォルトの名無しさん
09/04/03 00:03:38
>>754-755
単にboost::shared_ptr<MyClass> m_MyClass;ではだめなの?
757:デフォルトの名無しさん
09/04/03 00:19:11
>>756
そうやって作成したスマポが、中身が入ってるかゼロなのか、NULLと比較しても
いいのですか?
758:デフォルトの名無しさん
09/04/03 01:23:15
すいません、初心者じゃない(つもり)なんですが、初心の質問させてください。
char data[100];
というデータがあるとき、
unsigned int func1(int i)
{
unsigned char* p = reinterpret_cast<unsigned char*>(data);
unsigned int r = p[i];
r |= p[i + 1] << 8;
r |= p[i + 2] << 16;
r |= p[i + 3] << 24;
return r;
}
unsigned int func2(int i)
{
unsigned int ret = data[i];
ret += data[i+1] << 8;
ret += data[i+2] << 16;
ret += data[i+3] << 24;
return ret;
}
この2つの関数の出力が違う場合があるのですが、(たとえばこうやって初期化した場合)
for (int i = 0; i < 100; ++i)
{
data[i] = 129;
}
どうしてでしょうか?