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;
}
どうしてでしょうか?
759:デフォルトの名無しさん
09/04/03 01:30:10
>>757
デフォルトコンストラクタはこうなってる
shared_ptr(): px(0), pn() // never throws in 1.30+
{
}
px は内部に持つ生のポインタ
760:デフォルトの名無しさん
09/04/03 01:35:56
>>758
129 が CHAR_MAX より大きい可能性が高いな。
761:デフォルトの名無しさん
09/04/03 05:59:03
ありがとうです。CHAR_MAXは127でした。
色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?
762:デフォルトの名無しさん
09/04/03 06:23:45
>>761
その場合は符号拡張の話だな
int にキャストした段階で違いが起こってる
763:デフォルトの名無しさん
09/04/03 07:45:19
(1) unsigned char a = 0xff;
a = 0xff (255) を int 型にすると 0x000000ff (255)
※符号拡張の際、unsigned int 型を経由
(2) char a = 0xff;
a = 0xff (-1) を int 型にすると 0xffffffff (-1)
まあ大抵の場合、char 型で文字を扱うとき unsigned char にしといた方が
いちいちキャストしたりとか面倒なことをせずに済む
764:デフォルトの名無しさん
09/04/03 08:12:15
>>761
そもそも CHAR_MAX が 127 なら char a = 0xff でも char a = 129 でも値は実装依存になる。
コンパイラやそのバージョンやコンパイルオプションの違いで変わってくるかもしれない。
一般的には、符号付 char の表現は 2 の補数で、収まらないビットは切り捨てられるだけ
だから、以下 >763
765:デフォルトの名無しさん
09/04/03 09:13:17
char を unsigned int に型変換するときは
int に符号拡張してから unsigned int に変換される
char a に -1 (0xff) が入ってる場合は一旦 int 型 -1 (0xffffffff) に符号拡張され
unsigned int 4,294,967,295 (0xffffffff) に変換される
766:デフォルトの名無しさん
09/04/03 10:56:18
while(!(ret_cd = fetch_data())){
:
(フェッチしたレコードに関する処理部)
:
}
--------------------------
関数
int fetch_data(void)
{
:
(レコードデータ取得部)
:
return(0)
}
-------------------------
上記のようなプログラムで
while文の条件文の意味がよくわかりません。
全体の流れが「レコードが存在する間、処理を繰り返す」ような
処理ということはわかるのですが、
!(ret_cd=fetch_data())ときいている意味が
はっきりわからないのでどなたかお願いします。
767:デフォルトの名無しさん
09/04/03 11:03:57
>>766
> !(ret_cd=fetch_data())ときいている意味
「レコードが存在」しているかどうか,という意味なんじゃない?
768:デフォルトの名無しさん
09/04/03 11:44:08
fetch_data() は、レコードが存在すると 0、レコードが存在しないと 0 以外(たとえば -1)
を返すのだろう
レコードが存在する !(0) → 真となり、処理継続
レコードが存在しない !(-1) → 偽となり、処理終了
ぱっと見に分かりづらいから
while(!(ret_cd = fetch_data())){
↓
while((ret_cd = fetch_data()) == 0){
と書き換えてもいいかもしらん
769:デフォルトの名無しさん
09/04/03 12:02:29
技術的な面以外で..
「~をする意味」は有効な回答が付きづらい
概して「考えれば分かる」とか言われるのが落ち
質問の仕方が分からなくて,適当に取って着けたように「~とはどういう意味でしょうか?」と聞いてしまうよりは,
必要な用語とか,質問に至るまでの状況とかをしっかり書いておくほうが無難
770:デフォルトの名無しさん
09/04/03 12:06:14
単に、代入と検査を一緒にやってるだけだろ
771:デフォルトの名無しさん
09/04/03 12:29:49
まあ>>768の通りだが、
おそらく、 ! が見た目通りに否定の意味に感じるので
直感的に理解しづらいということだろう。
!strcmp() などもそうだが、
==0 の意図で ! を使う人は結構居る。俺は極力 ==0 を使うが。
慣れればどうということは無いのだろうが、読むときに一瞬考えるので。
772:デフォルトの名無しさん
09/04/03 14:14:14
766です。
質問の仕方も曖昧ですみません。
レスいただきありがとうございます。
しかしまだ消化不足…といいますか、流れについて
いけてないです。現在修正中のプログラムが下記のような流れです。
①カーソルセット
EXEC SQL DECLARE cur_TEST CURSOR FOR
SELECT・・・
FROM・・・
WHERE・・・
EXEC SQL OPEN cur_TEST;
773:デフォルトの名無しさん
09/04/03 14:15:05
②フェッチしながら項目セット
while(!(ret_cd=fetch_data())){
/* 中間ファイル構造体の各項目に値セット */
sprintf(・・・)
sprintf(・・・)
/* 中間ファイルに出力 */
if(temp_write(Ofp, &out)){
fclose ( Ofp );
strcat( Errmsg, "temp_write:write_error" );
AB_sjmsg( Errmsg );
putenv( Errmsg );
return(-1);
}
}
中間ファイルクローズ
fclose(Ofp)
return(ret_cd);
774:デフォルトの名無しさん
09/04/03 14:15:48
(出力関数)
int temp_write( FILE *Ofp, struct TEST *dat )
{
int ret;
ret = fprintf(Ofp, "%-1.1s" , dat->AAA ) > -1;
ret = ret && fprintf(Ofp, "%-5.5s" , dat->BBB ) > -1;
ret = ret && fprintf(Ofp, "%-8.8s" , dat->CCC ) > -1;
return(ret ? 0 : -1);
}
775:デフォルトの名無しさん
09/04/03 14:16:34
実は今回このwhile(!(ret_cd=fetch_data()))の中で
もうひとつテーブルを読み、そこで抽出したレコード(複数件)が
なくなるまで繰り返す・・・という入れ子の処理を追加しないといけなくなりました。
単純にやり方を真似てfetch_data2という関数をつくり、
while(!(ret_cd=fetch_data()))の中で
while(!(ret_cd=fetch_data2()))と記述して、やろうとしてるのですが
エラーが出るため、今まで曖昧だったwhile(!(ret_cd=fetch_data()))部の
意味をはっきりさせようと思った次第です。
776:デフォルトの名無しさん
09/04/03 14:16:45
で?
777:デフォルトの名無しさん
09/04/03 15:04:11
>>776
死ね
778:デフォルトの名無しさん
09/04/03 15:30:31
で、どこまで理解できて、どこが理解できなくて、
どんなエラーが出るの?
779:デフォルトの名無しさん
09/04/03 15:40:55
途中で止まっており失礼しました。
わからない点は、!(ret_cd=fetch_data())の部分で、
ret_cdになんの値がセットされているかです。
int型で定義されてはいますが、これに値がセットされるところを
探しても見つけきれないので。
fetch_data関数は、「if(sqlca.splcode==1403)(抽出データが終了したら)
return(1)」という処理が入っているので、セットされる値の変わり目が
はっきりとわかります。
なんだかどうしようもない質問をしてしまったみたいで申し訳ないです。
もう少し詮索してみます。
780:デフォルトの名無しさん
09/04/03 15:42:44
>>779
何の値、って、fetch_data() 関数の戻り値でしょ。
デバッガで一行ずつ追ってみれば? もしくは、printf とかで。
781:デフォルトの名無しさん
09/04/03 15:59:14
>>779
ret_cd=fetch_data()
のところでret_cdには0か1がセットされる
782:デフォルトの名無しさん
09/04/03 17:23:37
もうクビになっちゃえば
783:デフォルトの名無しさん
09/04/03 18:00:59
>>766から>>779までの5時間を
本なりサイトなりを使った「基礎からのCの勉強」に充てていれば、
今頃は普通に理解できるようになってたと思うw
784:デフォルトの名無しさん
09/04/03 19:46:00
C++言語でファイルのサイズや更新日時を取得する機能を持つクラスを、
#include <stdio.h>
FILE *fopen(const char *, const char *);
int fileno(FILE *);
int fclose(FILE *);
#include <sys\stat.h>
int fstat(int handle, struct stat *statbuf);
の関数や構造体を使って作ったものの、あまり良くないようだ。
大量のファイルを調べると、遅くてハードディスクへのアクセスが、かなりのものだ。
VBでFileLen()やFileDateTime()関数使ったプログラムのほうが速いし、ハードディスクに
ほとんどアクセスしなくて済んでる。
ファイルを開かなくて取得できんのかな。いい方法ないもんか。
785:デフォルトの名無しさん
09/04/03 19:51:09
まあそういうなよ。
おれたちも、766みたいな頃を経てきたわけだろ。
なんとなく、766はできないプログラマになりそうな気もするけど
786:デフォルトの名無しさん
09/04/03 19:54:54
fstat の実装がどうなってるか知らないけど、GetFileSize() やら GetFileTime() やらを
使った方が速いのかもね。
787:デフォルトの名無しさん
09/04/03 19:57:55
じゃあ _stat(const char *, struct _stat *) とか
FindFirstFile/FindNextFileでもつかっとけよ。
Windowsならディレクトリエントリだけの話になるから。
788:デフォルトの名無しさん
09/04/03 20:00:43
そいや、ファイルハンドルが必要なやつは遅い、って話を聞いたことがあるな。
実際の値が必要なときは、これを使わざるを得ないんだけど。
789:デフォルトの名無しさん
09/04/03 20:21:42
windowの関数を勉強しないとならんな
低レベルなプログラム書けるように勉強しないとならんな
790:デフォルトの名無しさん
09/04/03 20:32:15
代入と評価を同時にしたら、読みにくくなるだろう。
横着やな。
791:デフォルトの名無しさん
09/04/03 20:51:09
いやWinしらてとのAPIとか20年前に頭に入っていて当然なんだが
792:デフォルトの名無しさん
09/04/03 20:55:16
日本語
793:デフォルトの名無しさん
09/04/03 20:56:58
どこの方言か知らんけど意味わからん
794:デフォルトの名無しさん
09/04/03 21:00:19
しらてと?
795:デフォルトの名無しさん
09/04/03 21:03:05
すなみ
はにりいと
とんとかいも
796:デフォルトの名無しさん
09/04/03 21:07:14
女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ほら!(得意げに)』
彼女 『何これ?PC98じゃない!幻滅!』
おいら『え、だってみんなPC98が普通だし....』
彼女 『普通X68000でしょ?何このねずみ色の本体・・・最低。
大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『...』
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
PCMは?MIDIは?使ってないの?』
おいら『....』
彼女 『動きが汚ーい!遅ーい!最低ー!
スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『....』
彼女 『しょうがないからうちでX68000で遊ぶ?
出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...』
以上実話です。
797:デフォルトの名無しさん
09/04/03 21:13:35
1989年のWinしらてとて、386 2.1か。
WinしらてとてのAPIどころか、Winしらてとて自体知る人は限られてただろう。
798:デフォルトの名無しさん
09/04/03 21:15:58
間違えた。
WinしらてとのAPIどころか、Winしらてと自体(以下略)
799:デフォルトの名無しさん
09/04/03 21:23:15
うちにある最古のAPI本ですらMSC7/VC1.0のリファレンス(93年)だぞ
20年前ってどうよ
800:デフォルトの名無しさん
09/04/03 22:17:03
>>796
悔しいがワラタ
801:デフォルトの名無しさん
09/04/03 22:35:23
女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
彼女 『うん!』
おいら『ちょっと待って!俺がゲームのためにこれ買ったと思ってんの?』
彼女 『うん!』
おいら『違うよ、世の中のコンピュータを上手く繋げるソフトを開発するためなんだ
よ(得意げに)』
彼女 『何それ?ニフティとかのこと?幻滅!』
おいら『いや、そんなんじゃないよ。これからは世界中のコンピュータが繋がる
ようになるんだよ。いま目の前にあるコンピュータと、たとえばアメリカのどこかに
あるコンピュータとが繋がって、互いに自由にやり取りができるようになるんだよ。』
彼女 『でも、そんなの電話料金が大変でしょ?何このねずみ色の本体・・・最低。
大体、ゲームだってショボイRPGやシミュレーションばかりでしょ?
シューティングは?まともなシューティングはあるの?ないでしょ?』
おいら『だからゲームなんか興味ないんだって。とりあえずフィンランドの人が作った
基本ソフトを移植してみようと思ってるんだ。そのあと、相手のコンピュータの中の
情報をもっと見やすいように表示できるソフトを開発して(注:頭の中には初期のネスケ
のようなソフトのイメージ)、、、あと沢山のコンピュータが繋がるようになってくる
と、外部からコンピュータを勝手に操作されないようにするソフトも需要があると思う
し、、』
802:デフォルトの名無しさん
09/04/03 22:38:38
彼女 『大体、256色ってなに?しかもデフォルト16色のゲームまであるしw
こんなので満足できるの?しょぼいエロゲならこの色数でいいのかも知れないけどさw
スーファミじゃないんだからさ。分かるでしょ?だいたいアメリカと日本って時差が
あるのよ、どうやって寝てる人とやり取りすんのよ?それに外部から操作なんて、画面
もみないでどうやって操作すんのよ?あんたおかしいんじゃない?』
おいら『...』
彼女 『うわー音が汚いwなにこれ?FM音源?だけなの?
PCMは?MIDIは?使ってないの?』
おいら『...そうだ、C++のコンパイラからまず作らないとだめだな。。。.』
彼女 『動きが汚ーい!遅ーい!最低ー!
スプライトもないのに多重スクロールなんて見栄張って馬鹿じゃないの?
なにこのカクカクスクロールは?ファミコン以下じゃん!』
おいら 『...俺の話も聞いてくれよ。ほんとにいいアイデアなんだって!当たったらデカイよ?』
彼女 『しょうがないからうちでX68000で遊ぶ?
出たなTwinBee!やファイナルファイトの2Pプレイとか楽しいよ?』
おいら『うん...(今まで誰もおいらの話をまともに聞いてくれないんだよな。どっか間違ってんのかな。。)』
803:デフォルトの名無しさん
09/04/03 22:39:50
女の我侭は異常
おいら『パソコン買ったから遊びに来る?ゲームも出来るよ!』
おんな『シネよキモデブ。二度と話しかけんな』
804:デフォルトの名無しさん
09/04/03 23:40:26
>803
ついでに此処へも書き込みしないでいいよ。
805:デフォルトの名無しさん
09/04/03 23:42:50
コピペとしてはまだまだいけてないな
もっとブラッシュアップしてくれ
806:デフォルトの名無しさん
09/04/03 23:48:07
ヘルプです。環境は「mingw32,gtk,fc10+rawhide,wine」
やりたいことは「stdin(fd=0)からCALLBACK関数」で、
順次データを読み出すだけなんですが、私の環境ではうまく動かないです。
止まったり、データがなくなったり。Fedoraの板でサワイでたんですが、
もう諦めモードにはいってきたTT;mingw32環境ある方、試してもらえないでしょうか?
よろしくお願いします。以下、サンプルソース
#include <unistd.h>
#include <stdio.h>
#include <gtk/gtk.h>
int main(int argc,char **argv);
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data);
GIOChannel *gio;
int main(int argc,char **argv){
gtk_set_locale();
gtk_init(&argc,&argv);
gio = g_io_channel_unix_new(0);
fprintf(stderr,"gio(%d,%d)\n",(int)gio,G_IO_IN);
g_io_add_watch(gio,G_IO_IN,(GIOFunc)inputcb,NULL);
gtk_main();
return 0;
}
gboolean inputcb(GIOChannel *source,GIOCondition condition,gpointer data){
char temp;
fprintf(stderr,"gio(%d,%d,%d)\n",(int)source,condition,(int)data);fflush(stderr);
read(0,&temp,1);
fprintf(stderr,"temp(%d)\n",temp);fflush(stderr);
return TRUE;
}
807:デフォルトの名無しさん
09/04/04 11:28:40
スマポで質問があります。
class MainClass;
class SubClass {
public:
void func2(MainClass* mc) {}
};
class MainClass {
public:
MainClass() : m_SubClass(new SubClass()) {}
~MainClass() {}
void func1() {
m_SubClass->func2(this); // このthisをスマポ(shared_ptr)にする方法はありますか?
}
private:
boost::shared_ptr<SubClass> m_SubClass;
};
int main() {
MainClass m;
m.func1();
return 0;
}
どうかよろしくお願いします。
808:デフォルトの名無しさん
09/04/04 11:31:52
お前どう見てもスマポの使い方判ってないからやめとけ
809:デフォルトの名無しさん
09/04/04 11:39:33
scoped_ptrでいいじゃん
810:デフォルトの名無しさん
09/04/04 11:39:47
>>808
どうしてですか?
private:でshared_ptrにしたからですか?
なんとか使えるようになりたいんです。
どうかお願いします。
811:デフォルトの名無しさん
09/04/04 11:39:49
>>808
なんつー的確な指摘w