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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.30【環境依存OK】 (重複スレ実質Ver.31)
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
2デフォルトの名無しさん:2006/10/15(日) 15:57:58
2ダ
3デフォルトの名無しさん:2006/10/15(日) 16:00:59
ここって、テンプレないんだね。
4デフォルトの名無しさん:2006/10/15(日) 16:04:17
テンプレが1に収まるほどコンパクトなだけでは
5デフォルトの名無しさん:2006/10/15(日) 16:19:56
これからの時代はSTLですか?
6デフォルトの名無しさん:2006/10/15(日) 16:27:48
ちょっとだけ、作ってみた。
ログが見つからないので、知ってる人編集して

↓まとめサイト。
http://ja001.sukiwikiweb.com/candcppkankyouok
7デフォルトの名無しさん:2006/10/15(日) 16:35:22
すいません。質問させてください。
VC++2005でプログラムの勉強をしています。
結果の表示にはコンソールを使っています。
例えば、円の面積を計算するプログラムをつくったのですが、
半径を入れて計算すると、一瞬ぱっとでてすぐ消えます。

これは普通の文章を表示するプログラムを作った時にもあったので
ネットで検索したら、対応策があり、すぐに解決しましたが、
計算結果の場合はうまくいきません。
半径を入力したあとにenterキーを押すからでしょうか?
うまい方法があったら教えてください。
8デフォルトの名無しさん:2006/10/15(日) 16:36:01
コピーコンストラクタや代入演算子を実装したクラスを関数の戻り値の型にした場合、戻り値最適化ってされなくなってしまいますか?
9デフォルトの名無しさん:2006/10/15(日) 16:37:22
>>7
もう一回getchar()する
10デフォルトの名無しさん:2006/10/15(日) 16:39:41
>>7
デバックなしで実行
11デフォルトの名無しさん:2006/10/15(日) 16:46:35
>7
コマンドラインから起動
12デフォルトの名無しさん:2006/10/15(日) 16:56:28
>>9-11
レスありがとうございます。
コード上で書きたいと思っています。
>>9
うまくいきました。
13デフォルトの名無しさん:2006/10/15(日) 18:39:02
>>8
規格では「してもよい」とされているだけなので、
戻り値最適化の条件はコンパイラによる。

コピーコンストラクタや代入演算子の有無で最適化の
可能性に影響するとは思わないので、大丈夫なんじゃないかね。
14デフォルトの名無しさん:2006/10/15(日) 19:20:24
動的配列のメモリ量についてですが、
newを使用した場合とvectorを使用した場合で
メモリ量は異なるのでしょうか?

型のサイズを調べると
sizeof(float)は4、sizeof(vector<float>)は12なのに、
cygwin上のtopコマンドで調べると総メモリ量は同じになります。
「配列のサイズ=型のサイズ×配列数」とは限らないのでしょうか?

初歩的な質問ですみません。よろしくお願いします。
15デフォルトの名無しさん:2006/10/15(日) 19:34:49
std::vectorは配列のように使えるクラスだが、配列ではない。
従ってそのサイズはvectorがどう実装されているかによる。
それからvectorのインスタンスが占めるメモリの大きさと
vectorが持つメモリブロックの大きさには何の関係もない。
1614:2006/10/15(日) 19:44:41
>>15
なるほど。勉強不足ですみません。
単純に動的配列で使うならnewでもvectorでもメモリ量は同じなんですね。

vectorはメモリを食うからvalarrayを使う方が良いと
どこかで書いてあったのは何だったんだろう…。

もうちょっと勉強します。ありがとうございました。
17デフォルトの名無しさん:2006/10/15(日) 19:46:25
久しぶりに聞いたな valarray 。 C++ 標準ライブラリの汚点だとしか覚えていない。
18デフォルトの名無しさん:2006/10/15(日) 20:26:27
>>13
戻り値最適化が働くとコピーコンストラクタの呼び出し回数が減ると思うんです。
なのでそんなかで副作用のあることしたりしたら最適化されなくなっちゃうのかなと思ったんですよ。
19デフォルトの名無しさん:2006/10/15(日) 20:33:38
>>18
戻り値最適化される可能性があるので、呼び出し回数で結果が変わってしまうような
副作用をコピーコンストラクタに持たせるべきではない。

これは C++ プログラマの責任なので、コンパイラがそこまで見て最適化の
有効無効を決めるべきではない。もし、あるコンパイラがそこまで面倒を見てくれて、
それに依存したコーディングをしてしまえば、移植性を失うことになる。
20デフォルトの名無しさん:2006/10/15(日) 20:40:23
コピーコンストラクタや代入演算子をデフォルトのままにして方が最適化が促進されやすいとかありそうだよね。
21デフォルトの名無しさん:2006/10/15(日) 23:11:27
はじめまして下記のコードで表示結果として
10
10
と得たいと思います/*????〜????*/を
どのように書けばよいですか?

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
int i=10;
char *a="test";
/*????
a=;
????*/
printf("%d\n",i);
printf("%s\n",a);
return 0;
}
22デフォルトの名無しさん:2006/10/15(日) 23:13:16
>>21 a = "10"
23デフォルトの名無しさん:2006/10/15(日) 23:17:21
>>22
すこし言葉たりませんでした。
iを型変換してaに代入したいと思います。
24デフォルトの名無しさん:2006/10/15(日) 23:20:52
sprintf
25デフォルトの名無しさん:2006/10/15(日) 23:23:37
char a[]="test"; ならともかく、
char *a="test"; で sprintf() を使うのはどうかと。
26デフォルトの名無しさん:2006/10/15(日) 23:25:08
std::string s = boost::lexical_cast<std::string>(i);
a = s.c_str();
27デフォルトの名無しさん:2006/10/15(日) 23:36:26
Visual C++2003を使用しているのですがうまくいかないです。
28デフォルトの名無しさん:2006/10/15(日) 23:47:57
>>27
相談するつもりならソースと症状を晒せ。
29デフォルトの名無しさん:2006/10/15(日) 23:53:53
>>28さま
21で相談していたものです。すみません。
sprintfを使って少し考えてみます。
30デフォルトの名無しさん:2006/10/16(月) 02:17:25
スマートポインタを使わないと
C++プログラムとして認められませんか?

31デフォルトの名無しさん:2006/10/16(月) 08:55:27
何を以って認めるかによる
32デフォルトの名無しさん:2006/10/16(月) 09:33:26
まぁ一般論としては
肝心なのは使い方がスマートかどうかだ
33デフォルトの名無しさん:2006/10/16(月) 12:43:39
すいません、質問です。
「C言語を始めよう」でコンパイラの位置を指定し
(C:\borland\bcc55\Bin\bcc32.exe)、実行すると
Error: 外部シンボル 'wWinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32W.OBJ が参照)
と出てきて実行できません。なぜでしょうか?
34デフォルトの名無しさん:2006/10/16(月) 13:09:31
borlandスレ行け
35デフォルトの名無しさん:2006/10/16(月) 15:30:39
初心者ですが以下のように書き、
例えばaと入力すると文字コードaを表す値97が表示されますが
xの型をint型にすると9445729という値が出ます。
Cでは文字定数はint型なのに何がダメなんでしょうか。

char x;
printf("英字入力>>>");scanf("%c",&x);
printf("%d\n",x);
36デフォルトの名無しさん:2006/10/16(月) 15:40:16
scanf の中の人が %c というフォーマット指定から、渡された引数の大きさを char と期待して書き込んでいるから。

char x;
int v;
.....
scanf("%c", &x); v=x;
printf("%d\n",v);

とすればよかろう
3735:2006/10/16(月) 16:02:37
>>36
そのやり方でint型に変換することで出来るのは分かったのですが、
イマイチ「charと期待して書き込んでいる」という所が分からないので
図々しいようですが詳しい説明をお願いできますか><
上の表示部分を下のように%cにすると正常にaと表示されるということは
不正な操作で誤った値が代入されているということではないということなのでしょうか。
int x;
printf("英字入力>>>");scanf("%c",&x);
printf("%c\n",x);
38デフォルトの名無しさん:2006/10/16(月) 16:02:53
>>35
scanfの%cはcharへのポインタが渡されることを前提にしている。
また自動変数を初期化しないと、内容は不定(ごみが入っている)。

だから、int x = 0;のように初期化してやるか、
printf("%d\n", x & 0xff);のように要らないところをマスクしてやれば、
おそらくうまくいく。(ただし規格に照らし合わせて問題ないかはわからない)
39デフォルトの名無しさん:2006/10/16(月) 16:14:10
>>38
そのコードだとリトルエンディアンしか通用しないんじゃ?
4035:2006/10/16(月) 16:55:46
自分の知識を総動員して>>36,>>38さんの話を考えたところ、
char型(1バイト)とint型(とりあえず4バイト)を考えると同じ97でも
charだと01100001で、
intだと00000000 0000000 0000000 01100001で表している。
%cで指定したscanfはchar型の8ビット、
この01100001の部分に値を入れるけど他24ビットには何もしない。
そして%cでも同様に8ビットだけ見て、そこで表されている文字を表示する。
その結果正しい文字が表示される。
しかし%dは全32ビットに注目するので残り24ビットを0にしておかないと不定値が出る。

という結論になったのですがこの理解でOKでしょうか?><
41デフォルトの名無しさん:2006/10/16(月) 17:05:38
ポインタを理解しているかどうかが鍵だな。
まだ、そこまでいっていないのなら さしあたり >>40 の認識(間違っているが)でも良いかもしれん。
4235:2006/10/16(月) 17:18:36
>>41
ポインタは柴田さんの「ポインタの極意」とかも読んだので
基本レベルならとりあえずちゃんと分かってる感じです。
間違っている認識だと気持ち悪いので、
理解できないかもしれませんが分からなかったら自分で勉強してみるので
そのポインタの話伺えますか。
43デフォルトの名無しさん:2006/10/16(月) 17:25:40
scanf を自分で実装することを考えてみるべし。
1) "%c" というヒントをもらった。
2) ポインターで書き込み対象の変数の先頭アドレスだけは分かる。
3) "%c" の指示に従い、2)のポインターから char サイズ分しか値を書き込まない。

こういう動作をする関数に対して無理矢理 int のポインターを渡した。
上記 3) で書き換えた部分はいったい何処に相当するのか? その結果どうなるのか?

○ char ⇔ int の実装上の大きさ、メモリ配置は環境によりばらばら。
4435:2006/10/16(月) 17:37:24
>>43
あぁなるほど!!
すごい分かりやすい説明ありがとうございます!
やっと理解できました!><
初めこのバグが出たとき完全に意味が分からなくてどうしようかと思いましたorz
文系で周りに聞ける人がいないので本当に助かりました。
本当にありがとうございました><
45デフォルトの名無しさん:2006/10/16(月) 21:39:56

char readbuf[512];
FILE* fd;

if( NULL == ( fd = fopen(path, openmode) ) )
{
//エラー処理
}
else
{
while( NULL != fgets(readbuf, 512, fd )
{
//処理 ココに入らない
}
fclose(fd);
}

上記のコードの実行ファイルを動かすと、fgetsでNULLが返ります。
ファイルは500行2MByte程度のテキストファイルです。
必ず1回目でNULLが返ってきてしまい、メイン処理が何故か動きません。
fclose直後にfeof, ferrorをかけると、エラーはセットされていないものの、何故かEOFが
ONになっています。

fopen自体は成功するのですが、fgets出来ない 理由は何が考えられますか?
46デフォルトの名無しさん:2006/10/16(月) 21:48:32
なんでfgetsがNULLを返した直後にferrorしないの?
47デフォルトの名無しさん:2006/10/16(月) 21:50:02
>>45 perror してみろ。
48デフォルトの名無しさん:2006/10/16(月) 22:07:19
>>45
fcloseでfdが無効になった後のfeof, ferrorはダメだろ。
49デフォルトの名無しさん:2006/10/16(月) 22:28:44
間違えました。feof, ferrorしてるのはfclose前です。
NULLを返した直後に実行したら、エラーなし、EOFだったんです。

ちなみに、512を20とかにすると動きました。

これはメモリ枯渇ですかね???
50デフォルトの名無しさん:2006/10/16(月) 22:32:40
馬鹿は氏ね
51デフォルトの名無しさん:2006/10/16(月) 22:36:03
openmode が変なんじゃないの? windows とかだと勝手が違うから。
52デフォルトの名無しさん:2006/10/17(火) 11:09:51
だから回答する側が初心者なのはやめろって。
53デフォルトの名無しさん:2006/10/17(火) 11:45:06
この板見ててふと思ったのですが、
Cでは文字定数はint型なのに文字配列にする時にはchar moji[]
とかってなるのは何ででしょうか?
要素はint型なのにchar?
54デフォルトの名無しさん:2006/10/17(火) 12:04:14
スレ違いかもしれませんが質問させてください。
VC++6を使っているのですが、使用している関数がスレッドセーフ関数かどうかは
どうやって調べるのでしょうか?
55デフォルトの名無しさん:2006/10/17(火) 12:08:41
>>54
何の関数か知らないが、標準関数ならMSDNに書いてあると思う。
5654:2006/10/17(火) 12:14:46
>>55
標準関数と、WIN32APIです。
MSDNってお金払わないと買えないやつですよね?
VC++6だけでも高いのにMSDNが必要なのか・・・。
誰か持っている奴に見せてもらうしかないかなぁ〜
57デフォルトの名無しさん:2006/10/17(火) 12:18:38
webで公開されてる
58デフォルトの名無しさん:2006/10/17(火) 12:19:49
VC++6.0にも入ってるハズだ
5954:2006/10/17(火) 12:41:50
皆様。迅速なレス、ありがとうございます。

>>57
オッケー。探してみます。

>>58
オッケー。探して見ます。

ついでに言うと、標準関数だけで、一覧になっているものってないでしょうか?
60デフォルトの名無しさん:2006/10/17(火) 12:45:26
いいからMSDN見ろ
6154:2006/10/17(火) 13:53:09
>>60
という事で、Web版のMSDNを見てみました。
有名なlocaltimeに関して調べて見たところ、スレッドに関する記述はありませんでした。
ただ、互換性のところを見ると、「ライブラリをLIBCMT.LIBにすれば、マルチスレッド対応になるよ」
的な事が書いてあるので、基本的に全ての関数はLIBCMT.LIBを使う限り、
スレッドセーフと考えてよいのでしょうか?
62デフォルトの名無しさん:2006/10/17(火) 13:54:07
インライン関数を使うと何故処理速度が向上するのかイメージがわかないのですが、
どういう仕組みでしょうか?しかも短い処理分じゃないと使えないそうで・・・
調べたところ、インライン関数を呼び出した所にコードを埋め込むとのことですが、
よくわからなかったのでわかりやすいように説明してくれませんか?
63デフォルトの名無しさん:2006/10/17(火) 13:56:43
あまりにも初心者的な質問で申し訳ありませんが
Java等で「System.io」と記述するところはC++では「System::io」となるのですか?
また、「System:io」のように「:」を一つだけ記述したり3つ以上記述するようなことはあるのでしょうか
64デフォルトの名無しさん:2006/10/17(火) 14:09:50
JavaのパッケージとC++のネームスペースとの区別はついているのか?

:一つは文法上ある。
:::のように三つは文法上ない。
65デフォルトの名無しさん:2006/10/17(火) 14:13:45
>>62
例えばこんなコードがあったとする。
static inline int add(int a, int b) {return a + b;}
int main()
{
printf("%d\n", add(3, 5));
return 0;
}
インライン展開できないと関数add()は明示的に呼び出されるが、
インライン展開できると関数add()がインライン展開された状態で最適化が行われる。
つまり、インライン展開してさらに最適化を行うと先ほどのコードはこのようにコンパイルされる。
int main()
{
printf("%d\n", 8);
return 0;
}
66デフォルトの名無しさん:2006/10/17(火) 14:49:37
すまん。。
Cの表記でわからなくなったので教えてくれ。

struct s A[10];
memset( A, 0, sizeof(struct s)*10 );

初期化してるだけなんだが、
A
&A
&A[0]
この3つは、同じアドレスを示してる。
本来正しい表記は、どれ?
67デフォルトの名無しさん:2006/10/17(火) 15:01:04
あれ?&Aもだっけ?

俺はAか&A[0]を使うが。
68デフォルトの名無しさん:2006/10/17(火) 15:15:00
>>66
この場合、要求されているのは(void *)だからどれでもいいよ。
6966:2006/10/17(火) 15:18:44
A ・・配列の先頭アドレス
&A[0] ・・配列の先頭要素[0]のアドレス
と認識してたんだけど、
&A
の意味はどうなるの?
7062:2006/10/17(火) 15:21:53
>>65
なんとなく分かりました。
ありがとうございます。
けれど、それならもう一つ不思議なことがあります。
インライン関数は短い処理で使われるそうですが、何故同じように長い処理でも使わないのでしょうか?
同じように最適化したら早くなるのではないのですか?
71デフォルトの名無しさん:2006/10/17(火) 15:27:38
>>70
実行ファイルサイズがでかくなるという弊害がある。
でかくなればキャッシュに入らなくなる可能性があり、逆に遅くなる事もある。
7253:2006/10/17(火) 16:16:24
誰か>>53を頼みますorz

文字定数がint型で定義されているのはEOFを
11111111 11111111 11111111 11111111
というようにcharでは表現できない値を表現するため。
文字配列ではEOFを途中で表現する必要がないからメモリの節約のために
charになってるとかそんな感じで良いのでしょうか?
ていうかそもそも文字定数がint型なのは上の理由で良いのですか?
7362:2006/10/17(火) 16:21:08
>>71
なるほど!
よく分かりました。ありがとうございました。
74デフォルトの名無しさん:2006/10/17(火) 16:38:12
>>70
短いとは限らないよ。
例えば最近のgccやiccは、一回しか呼ばないようなstaticな関数は仮令長くてもインライン展開してしまうし。
Ex.

static void func()
{
// this function is too long.
}

int main()
{
func();
return 0;
}

但し、・サイズがでかくなる・最適化処理が複雑になりコンパイル時間がかかる、
などの理由からローカル変数を使うだけでインライン展開しないコンパイラもある。
75デフォルトの名無しさん:2006/10/17(火) 16:39:40
>>72
概ねその理解でOK。
76デフォルトの名無しさん:2006/10/17(火) 18:03:11
>>69
式の中では原則、Aと&A[0]は同じ。Aの先頭要素へのポインタでありstruct s*型。
&Aと書くと、それはAへのポインタ。struct (*s)[10]型。

T型の変数(正確には左辺値)にアドレス演算子を適用するとT*型になる。
これを配列型の変数そのものに当てはめると、そうなる。
77デフォルトの名無しさん:2006/10/17(火) 18:16:53
CListBoxクラスにAddStringでデータを設定して
ボタンを押した瞬間にリストを初期化するためDeleteString
しているんですが、前のデータがなぜか残った状態で
表示されます。なぜでしょうか?
分かる方いましたら解決法を教えてください

開発環境 VS2005 WinXP SP2 MFC
78デフォルトの名無しさん:2006/10/17(火) 18:25:57
static char* str=new char;
これって大丈夫なんでしょうか?
普通に動いているんですが、どうもよく分かりません。
ウインドウプロシージャで使ってるんですが、
参照されるたびに動的に確保されているんでしょうか?
7977:2006/10/17(火) 18:29:09
すみません、自己解決しました。
80デフォルトの名無しさん:2006/10/17(火) 18:37:50
>>78
strの初期化は最初の1回だけ行われる。
81デフォルトの名無しさん:2006/10/17(火) 19:48:49
リスト構造を勉強しているのですが、リスト構造にデータを追加する
関数に戻り値に成功、失敗を返すようにするにはどうしたらいいでしょうか?
(なんらかの原因で領域が確保できなかった時のエラー対策をしたい。)
検索すると、下記のような先頭ポインタを返す関数しか見つかりません。

struct list {
int test;
struct list *next;/* 次のデータへのポインタ */
};

//--リストにデータを登録
struct list *add_list(int test, struct list *head)
{
//--リストに追加処理(略)
return head;
}
82デフォルトの名無しさん:2006/10/17(火) 20:32:45
エラーが起きたらNULLが返る、っていうのがよくある仕様です。
8372:2006/10/17(火) 21:21:12
>>75
遅レスになってしまったけどありがとうございます。
ホントにそんな感じの理由なんだ><
勉強初めに本の内容よく考えないで丸覚えしてたから
こういう基本的なこと分かってなくてダメだなぁ・・・orz
84デフォルトの名無しさん:2006/10/17(火) 22:02:06
>>83
概ねという言葉に気をつけるべし。
stdio.h をエディタで開いて EOF を検索してごらん。
85デフォルトの名無しさん:2006/10/17(火) 22:18:39
>>84
#define EOF (-1)
と出たけど、どういう意味で概ねなのでしょう?(´・ω・`)
しばし考えても言葉の裏が読み取れなかったので詳しくお願いできますか?orz
86デフォルトの名無しさん:2006/10/17(火) 22:26:38
EOFは、*いかなる整数型においても全ビットを立てた値* を示すということに相当する
8784:2006/10/17(火) 22:33:13
>>85
75ではないので75の真意は分からんが、
EOFは-1という値に置き換えられるのであって
11111111 11111111 11111111 11111111
じゃないよと言いたかった。
邪魔したな。
88デフォルトの名無しさん:2006/10/17(火) 22:44:24
ただしEOFは-1と規格で決められているわけではない。
ただ、いかなるchar型の値とも区別できなければならないと定められていたと思う。
89デフォルトの名無しさん:2006/10/17(火) 22:44:26
>>86-87
あぁ、そういうことでしたか。
2の補数なので例えばchar型なら11111111ですものね。
自分も>>72で「int型が4バイトの場合では」と厳密に書いた方が良かったですね。
どうもありがとうございました><
90デフォルトの名無しさん:2006/10/17(火) 22:45:19
てか、いつからEOFは'文字定数'になったのだろうか、、、、
、、、、、成り行きを見守るか、、、
9188:2006/10/17(火) 22:46:35
ああ、ごめん嘘書いた。
X 3010:2003見たらこう書いてある。(7.19.1)
EOFは、型がintで、負の値を持つ整数定数式に展開する。(以下略)
92デフォルトの名無しさん:2006/10/17(火) 22:47:59
>>90

EOFは文字定数と区別するためにっていう話でそ?
93デフォルトの名無しさん:2006/10/17(火) 22:52:35
>>92
最初の質問とそれに対する説明が引っかかっている。
9486:2006/10/17(火) 22:55:41
>>91
負の値をもつ(以下略) が 必ずしも全ビット立つとは限らない か…
# 負の値が2の補数ではなく1の補数もありえるわけだし
95デフォルトの名無しさん:2006/10/17(火) 23:02:14
hpp と cpp の違いって何?
96デフォルトの名無しさん:2006/10/17(火) 23:03:50
>>95
どっちでもいいよ。伝統的なもんだ。
97デフォルトの名無しさん:2006/10/17(火) 23:33:57
ロジックって言葉を聞くんだけど、どういう意味?

http://pc8.2ch.net/test/read.cgi/tech/1133286541/990/
98デフォルトの名無しさん:2006/10/17(火) 23:34:43
>>95
hppは.h+.cppって感じ
定義と実装を両方書くから
99デフォルトの名無しさん:2006/10/17(火) 23:44:46
非常に初心的な問題で聞きにくいのですが
gets();
を使って入力を読ませようと思っても入力する前に次の入力に飛んでしまうのはなぜでしょうか?

struct entry_word input[160];
int c=0;
FL:
printf("文字列1を入力してください-->");
gets(input->en);
printf("文字列2を入力してください -->");
gets(input->part);
こんな感じなのですが。getsを使うなというのはおいといてください。fgetsもしてみたんですが改行を取るのがめんどくさくてついでに上記の方も直らなかったので。
100デフォルトの名無しさん:2006/10/17(火) 23:45:08
>>95
cpp は c の C++ 版。
hpp は h の C++ 版。
101デフォルトの名無しさん:2006/10/18(水) 04:05:51
くだらない質問です。delete は型が分からなくても正しく使えますか?

class C1 { long m1; };
class C2 { long m1, m2, m3, m4, m5, m6, m7, m8; };
void main() {
C2* c2 = new C2;
void* p = c2;
delete p;
}
102デフォルトの名無しさん:2006/10/18(水) 04:34:36
メモリは解放されるけど、デストラクタが呼ばれない


つーか、そのくらい自分でテストしろよ。
それでも疑問なら「この動作は規格どおりですか」って質問しなよ。
103101:2006/10/18(水) 04:58:16
>>102
ありがとうございます。解決しました。
テストはしましたが、正しく削除されているか確認する術が見つかりませんでした。
104デフォルトの名無しさん:2006/10/18(水) 09:23:53
C2のデストラクタで文字列出力してみるとか、いろいろあるだろうに。
105デフォルトの名無しさん:2006/10/18(水) 09:56:30
クラス内のメソッドをスレッドとして生成したいのですが、どうやったらいいでしょうか?
class hoge{
 ~hoge(){
  std::cout << "終了" << endl;
 }
 void homu(){
  ...
 }
};
こんな感じでhomu()をスレッドとして作って、
スレッドが終わるとデストラクタを呼び出して抜けるって感じにしたいのですが。
106デフォルトの名無しさん:2006/10/18(水) 10:02:02
xxx thread_proc(xxx)
{
hoge foo;
foo.homu();
return xxx;
}
107デフォルトの名無しさん:2006/10/18(水) 10:04:28
>>106
ああなるほど・・・直接呼び出すことにしか頭回ってませんでした・・・
ありがとうございます
108101:2006/10/18(水) 10:26:58
>>104
デストラクタが呼ばれる呼ばれない自体当時は頭に無かったので。
109デフォルトの名無しさん:2006/10/18(水) 12:45:42
「当時」ってのは別に「ずっと以前」という意味ではないから、
ほんの6時間前の自分の状態について使っても間違いではないんだが、
慣習的にはなんか違和感があるなw
110デフォルトの名無しさん:2006/10/18(水) 13:04:00
黄色い豚はただの豚だ
111デフォルトの名無しさん:2006/10/18(水) 13:04:30
誤爆しました
112デフォルトの名無しさん:2006/10/18(水) 15:25:40
ブヒブヒ
113デフォルトの名無しさん:2006/10/18(水) 15:28:53
板違いならすいません。
(unix板で反応無かったもので)
aixでC++によるアプリ開発をしていて、DBXでデバッグをしています。
しかしstring型の変数の中身を参照したいのですが上手く出来ません。
printしてもキャストしても期待する値が表示されないんですがどなたか方法をご存知ありませんか?
114デフォルトの名無しさん:2006/10/18(水) 15:51:45
ポインタのポインタについて簡単にノートにまとめようと思っているのですが、
下記の考え方であってますでしょうか?

char *p="abcde";
char **pp=&p;

ppには変数p自体のアドレスが格納されている。
*ppは格納されているpのアドレスの内容表示であり、
その内容は文字列"abcde"の先頭のアドレスである。
よって文字列を表示させるためには

printf("%s",*pp);    /* printf("%s",p)と同じ意味 */

とする。

115デフォルトの名無しさん:2006/10/18(水) 16:53:20
>>101
ちなみに、boost::shred_ptr<void>は、
元の型のオブジェクトを削除するので、問題なく使える。

>>114
正解。
116デフォルトの名無しさん:2006/10/18(水) 17:18:09
C言語をCygwinで練習し始めたのですが、
自分で書いたCのファイルをWindows上で動くexeファイルに変換は無料で出来るのでしょうか?
調べてみてVisual C++で出来るのかな?とおもったのですが、
これはC++じゃない普通のCのプログラムもコンパイルできるのでしょうか?
117デフォルトの名無しさん:2006/10/18(水) 17:21:05
cygwinでも出来る。MinGWでも出来る。
もちろんVC++でも出来る。
118デフォルトの名無しさん:2006/10/18(水) 17:39:01
電気があれば何でもできる!
119デフォルトの名無しさん:2006/10/18(水) 17:43:19
謝れ!バベジに謝れ!
120116:2006/10/18(水) 17:56:44
ありがとうございます。
CygwinでもVC++でもコンパイルしてプログラムを走らせることは出来るようになったのですが、
単純にexeファイルをダブルクリックすると起動できる形にすることができません。
よろしければご教授願います
121116:2006/10/18(水) 18:14:23
すみません、もうひとつお願いします。
先ほどCygwin、VC++ともにコンパイルできるようになったと書きましたが、
配列を使ったプログラムの場合、CygwinではコンパイルできましたがVC++では
「配列または、ポインタでない変数に添字が使われました。」とでてコンパイルできません。
この原因はなんでしょうか?
122デフォルトの名無しさん:2006/10/18(水) 18:33:38
( ^ω^)
123デフォルトの名無しさん:2006/10/18(水) 18:37:19
>>120
Cygwinの場合は-mno-cygwinを付けてコンパイルすると、
Cygwinなしで実行できるEXEになる。
124デフォルトの名無しさん:2006/10/18(水) 19:32:07
>>120
VC++ならコンパイルオプションでマルチスレッドDLLからマルチスレッドに変更しろ。
125デフォルトの名無しさん:2006/10/19(木) 12:40:51
普段普通に呼び出して使ってる関数ってどう定義されてるのかと思って
borland C++コンパイラのIncludeフォルダの中にある「stdio.h」を開いて
「printf」で検索してみたところ、
int _RTLENTRY _EXPFUNC printf(const char * __format, ...);
みたいなのしか見当たらなかったのですが、これがprintfの定義なんでしょうか?
てっきり自分で作る関数みたいに
int printf(const char *xxx,・・・)
{
・・・・・・・
}
みたいな部分があると思ってたのですが、そういうのは無いのですか?
126デフォルトの名無しさん:2006/10/19(木) 13:00:22
ソースが提供されてなければあきらめろ
127デフォルトの名無しさん:2006/10/19(木) 13:37:05
>>125
stdio.hに書かれてるのは宣言だけ。
ビルド時にリンクされるCW32(MT).libに実体がある。

TurboC++2006ExpにVCLソース付いてるから一緒にRTLのソースも入ってるんじゃないかな。
128デフォルトの名無しさん:2006/10/19(木) 16:07:02
>125
それはただのプロトタイプ宣言。
129デフォルトの名無しさん:2006/10/19(木) 22:34:35
>>126-128
どうもありがとうございます。
_RTLENTRY _EXPFUNCとか知らないのが入ってるし他に見当たらないから特別な定義の仕方なのかと勘違いしてましたorz
RTLが何かとかよく把握してないレベルなので色々と調べてきます><
130デフォルトの名無しさん:2006/10/19(木) 22:59:13
_RTLENTRY _EXPFUNCあたりはBorland C++固有のものだから、あまり気にしないが吉。
131デフォルトの名無しさん:2006/10/20(金) 07:35:02
C言語で、#defineをstatic constに書き換えようと思ったのですが

#define FOO 100
#define BAR FOO*2

みたいなものを

static const int foo = 100;
static const int bar = foo*2

とすると
”initializer element is not constant”
というエラーが出ます。
static変数を使って他のstatic変数を初期化することは無理なのでしょうか?
132デフォルトの名無しさん:2006/10/20(金) 07:39:09
あー、Cではどうだったかナァ。
C++では出来るはずだが。
133デフォルトの名無しさん:2006/10/20(金) 10:24:20
>>131
Cではマズイ。C++使うか、 #define のままにしとけ。
134デフォルトの名無しさん:2006/10/20(金) 12:53:44
enumなら大丈夫
135デフォルトの名無しさん:2006/10/21(土) 01:07:25
質問:RECTの初期化について
環境:vc2005EE

struct A {
public:
 RECT rc[40];
};
struct B...
struct C...

class HOGE: public A, public B, public C
{...};
static HOGE Hoge;

とし、現在は Hoge のコンストラクタでデータをいれ、RECT rc を初期化しているのですが。
rc.left = 0, rc.top = 0, .... と書いています。

RECT rei = {0,0,10,10}; みたいに短く書きたいのですが何か手はあるでしょうか。
136デフォルトの名無しさん:2006/10/21(土) 01:26:04
#include <algorithm>

HOGE::HOGE() {
const RECT proto = {0,0,10,10};
std::fill(this->rc, this->rc + 40, proto);
}
137デフォルトの名無しさん:2006/10/21(土) 01:56:18
ありがとうございます。
早速試します。
138デフォルトの名無しさん:2006/10/21(土) 10:42:06
VC2005です
アクセラレータ作成に挑戦してるのですが
メニューの一番上の項目(ファイル(F)や編集(E)など)には
IDがないですよね?
こいつらをAlt+FやAlt+Eで表示できるようにするには
どうすればいいのでしょうか
139138:2006/10/21(土) 11:24:10
自己解決
Captionにファイル(&F)のように&をつけて指定することで
うまくいきました
140デフォルトの名無しさん:2006/10/21(土) 11:51:15
vc7.1とか8.0とかでつかえるinttypes.hはありますか?
141デフォルトの名無しさん:2006/10/21(土) 12:44:26
質問させていただきます.
今繰り返し計算を行っているのですが
たとえば100万回繰り返し計算をしているときに
あとどれくらいで終わるか知りたいため,(目安で)
1万回ごとに「今○回計算が終了しました」という文章を
DOS画面上に出したいのですがどのようにしたらできるのでしょうか?
教えてください.よろしくお願いします.
142デフォルトの名無しさん:2006/10/21(土) 12:49:26
%
143デフォルトの名無しさん:2006/10/21(土) 13:32:12
boost::progress_displayを無駄に使ってみるとか
144デフォルトの名無しさん:2006/10/21(土) 13:41:46
ピクセルデータを格納した配列から、
イメージ(JavaのBufferedImageのようなもの)を生成するには
どうすればいいんでしょうか
145デフォルトの名無しさん:2006/10/21(土) 15:23:13
CreateDIBSection
146145:2006/10/21(土) 15:26:27
Win32前提にしてどうする orz
147デフォルトの名無しさん:2006/10/21(土) 17:28:21
Visual Studio .NET2003でスタックの領域を増やす方法を教えてください。
double型の配列を3つ(256*256)宣言するだけでエラーが出て終了するので。

for(i=0;i<256;i++)
{
   for(j=0;j<256;j++)
   {
      for(k=0;k<256;k++)
      {
         c[i][j] = a[k][j]+b[k][j];
      }
   }
}

みたいな使い方をするので3つ用意する必要があると思うのですが・・・。
148アフォルトの名無しさん:2006/10/21(土) 17:34:16
javaのコードをC++に移植するとき、例外処理の部分ってどう移植したらいいでしょうか。
javaの例外クラスの階層とC++の例外クラスの階層構造とは完全にはかさならない
ですよね??
C++ではユーザー定義の例外クラスを作ることはできますか?
149デフォルトの名無しさん:2006/10/21(土) 17:45:46
std::exception を継承したクラスでなければならないと言う制限をどこかで見た気がしないでもないが、
基本的になんでも(組み込み型だろうが、自作のクラスだろうが抽象クラスじゃなきゃ) throw できるよ。
150デフォルトの名無しさん:2006/10/21(土) 17:47:15
>>148
例外は型であればなんでもいい。例外クラスを作ることもできる。
階層構造も再現できるだろう。そこまでする意味があるとは思わないけど。
151デフォルトの名無しさん:2006/10/21(土) 17:48:19
>>147
本当にスタックにおく必要があるのか?
ヒープで済ませたほうがいいんじゃないか?
152デフォルトの名無しさん:2006/10/21(土) 18:03:51
>>147
プロジェクトのプロパティから[リンカ]-[システム]-[スタックのサイズの設定]
俺もヒープに確保したほうがいいとは思うが。
153アフォルトの名無しさん:2006/10/21(土) 18:30:35
たとえば、

try
{
throw new NullPointerException();
}
catch( NullPointerException e )
{
e.printStackTrace();
}

こんな感じのJavaの例外処理をC++に置き換えたいとすれば、
どうなる?C++にNullPointerExceptionってないよね。
NullPointerExceptionに相当するクラスを作って投げなきゃいけないよね。
でも、どんなクラスにすればいいんでしょうか
154デフォルトの名無しさん:2006/10/21(土) 18:45:58
>>153
std::exception から派生させたクラスとして、 what() を適当に実装すればいい。
スタックトレースは無理。 throw するときに new しちゃだめ。 catch は const& で受ける。
155アフォルトの名無しさん:2006/10/21(土) 19:04:41
#include <iostream>
#include <exception>

class nullpointerexception: public std::exception { };



int main(void){
try{
throw nullpointerexception();
}
catch(std::exception& e){
std::cerr << e.what() << std::endl;
}


return 0;
}


こんなん書いてみたんだけど、
no named exception thrown
ってでるよ。
156デフォルトの名無しさん:2006/10/21(土) 19:13:06
157デフォルトの名無しさん:2006/10/21(土) 19:32:25
>>151
>>152
ヒープはよくわからないので。
スタックを増やしたら実行できました。
ありがとうございました。
158144:2006/10/21(土) 19:34:03
>>145
回答どうもです


配列から生成したイメージを、DirectXをつかってtextureにしたい
のですが、CreateDIBSectionで可能なんですか?
159デフォルトの名無しさん:2006/10/21(土) 20:12:48
vc7.1とか8.0とかでつかえるinttypes.hはありますか?
160デフォルトの名無しさん:2006/10/21(土) 20:18:15
>>158
くだすれDirectX(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1132965206/
161デフォルトの名無しさん:2006/10/21(土) 20:20:51
162デフォルトの名無しさん:2006/10/21(土) 23:15:13
.net2003で、C++を勉強し始めて2日目になります。

テンプレートメソッドパターンの勉強中なんですが、
#include<iostream>

template <class T,T>
T ave(T a,T b) {
return (a + b) / 2;
}
main() {
using namespace std;
cout << ave<int,int>(1203, 3344) << endl;
}

とすると、
Question.cpp
Question.cpp(11) : error C2975: 'ave' : 'function-parameter' に対するテンプレート引数が無効です。コンパイル時に評価可能
な定数式が必要です。
Question.cpp(4) : 'ave' の宣言を確認してください。

と出てしまいます。
文法的に正しくするとしたら、どうすればいいですか。
163162:2006/10/21(土) 23:17:22
すみません、テンプレートメソッドではなく、
ただのテンプレートでした。
164デフォルトの名無しさん:2006/10/21(土) 23:20:54
>>162
エラーメッセージが遠いな。

× template <class T,T>
○ template <class T>

× ave<int,int>(1203, 3344)
○ ave(1203, 3344)
165162:2006/10/21(土) 23:29:04
>>164
ありがとうございます。

他の例で、

template <class T,T>
T max(T a,T b) {
return (a > b) ? a : b;
}
mainの中で、
cout << max(2,5) << endl;

この場合は、<class T>ではなく、<class T,T>にしないと動かないのですが、
違いはなんででしょうか。
166デフォルトの名無しさん:2006/10/21(土) 23:35:51
>>165
cass T だと、どうなる?
167デフォルトの名無しさん:2006/10/21(土) 23:37:51
>>165
maxは標準に既に用意されている。
別の名前で試してみ。
168162:2006/10/21(土) 23:41:21
>>166 >>167
max2にしたら、コンパイル通るようになりました。
試していたのが、max min 等だったので、今まで偶然 標準関数ばかりを
試していたようです。
ありがとうございました。
169デフォルトの名無しさん:2006/10/22(日) 00:03:34
void func( char* begin, char* end );

int main(){
std::vector<char> v;
func( &*v.begin(), &*v.end() );
}

このコードをVisualC++のSTLを使って
実行すると、*v.end()のところで
"vector iterator not dereferencable"とアサートに引っ掛ります。
STLPortでは引っ掛りません。
言わんとしていることはわかるのですが、これに対する対策をどうしてよいやら
がわかりません。

template< typename iterator >
void func( iterator begin, iterator end );
にすると、関数のオーバーロードに引っ掛りマズー

template< typename value_type >
void func( std::vector<value_type>::iterator begin, std::vector<value_type>::iterator end );
にするとstd::vector以外使えなくなってマズー

いったいどうすればいいと思いますか?
170デフォルトの名無しさん:2006/10/22(日) 00:18:44
>>169
if (!v.empty()) { char* begin = &v[0]; func(begin, begin + v.size()); }
171デフォルトの名無しさん:2006/10/22(日) 00:44:39
>>170
お答えありがとうございます。
その方法をとって、以下のようにしました。
void func( char* begin, size_t size );
172アフォルトの名無しさん:2006/10/22(日) 11:08:40
C++にはjavaのthrowsに相当するような、メソッドの呼び出し元に対して
例外処理を丸投げする仕組みはないんでしょうか。
ないとしたら、それを再現するようなうまい方法って知りませんか
173デフォルトの名無しさん:2006/10/22(日) 11:40:49
class Image1 {
public:
vector<double> db1;//
vector<double> db2;//
};

class Character1 {
public:
vector<Image1> img;// Image1のデータ
};
vector<Character1> chara1;
174173続き:2006/10/22(日) 11:42:04
int main(int argc,char *argv[]){
for(int j = 0; j < 2; j++){
// 5人分キャラクターを作成
chara1.reserve(5);
for(int i = 0; i < 5; i++){
chara1.push_back(Character1());
}

chara1[0].img.reserve(2);
for(int i = 0; i < 2; i++){
chara1[0].img.push_back(Image1());
}
chara1[0].img[0].db1.push_back(0.5);
chara1[0].img[0].db1.push_back(1);
chara1[0].img[0].db1.push_back(1.5);
chara1[0].img[0].db2.push_back(10);

/*
chara1[0].img[0].db1.clear();//
chara1[0].img[0].db2.clear();//
chara1[0].img.clear();//
*/

chara1.clear();// データを消去
}
return 0;
}

こんな風にした場合は、コメントの中の部分は要る?
あってもなくても正常に動きはしたけど…
175デフォルトの名無しさん:2006/10/22(日) 11:51:53
>>172
これらじゃ用件を満たさない?

void f0(){
throw exception();}

void f1(){
try{
throw exception();}
catch(...){
throw;}
176デフォルトの名無しさん:2006/10/22(日) 11:53:20
>>173
いらない
177デフォルトの名無しさん:2006/10/22(日) 12:25:01
>>172
C++にもJavaのthrowsのようなものはあるにはあるが、
コンパイル時にチェックされるわけではないなどの理由から原則使わない。
使わなくても全ての例外はJavaのRuntimeExceptionの如く自動的に呼び出し元へ伝わる。
178アフォルトの名無しさん:2006/10/22(日) 12:49:11
>>175


throw;って投げるエラーかかないと何のエラーがどこに投げられるの?
179デフォルトの名無しさん:2006/10/22(日) 13:46:46
>>178
catch の中で実行された場合は、現在処理中の例外を外に投げる。
それ以外の場合は死ぬ。
180デフォルトの名無しさん:2006/10/22(日) 13:49:07
>>178
catch文の中でthrow;のように投げるものを書かない場合は、
受け取った元の例外オブジェクトを投げるということを意味する。catch(...)以外でも次のように必要。
#include <iostream>
#include <stdexcept>
int main() {
    try {
        try {
            throw std::runtime_error("hoge");
        } catch(const std::exception& e) {
            throw;
        }
    } catch(const std::runtime_error&) {
        std::cout << "std::runtime_error" << std::endl;
    } catch(const std::exception&) {
        std::cout << "std::exception" << std::endl;
    }
}
もしthrow;をthrow e;とすると、オブジェクトをコピーすることになり、スライシングされてしまう。
つまりeの静的な(つまりソースコード上の)型であるstd::exception型のオブジェクトを投げることになる。
throw;では元のstd::runtime_errorを投げることになり、外側のcatchでもstd::runtime_errorとして受け取ることができる。
181アフォルトの名無しさん:2006/10/22(日) 14:24:49
なるほど。大変よく分かりました。さんきう
182デフォルトの名無しさん:2006/10/22(日) 15:08:48
std::numeric_limitsって、windows.hと共存できないんでしょうか?

#include <limits>
//#include <windows.h> //このコメントはずすとエラー
#include <iostream>
int main(){
std::cout << std::numeric_limits<int>::max() << std::endl;
return 0;
}
183182:2006/10/22(日) 15:17:06
解決
すみません、ググったらでてきました
#define NOMINMAXをwindows.hの前に定義すると
うまくいきました
184デフォルトの名無しさん:2006/10/22(日) 16:53:06
ウィンドウズXPでウィンドウソフトを作っています。
処理をさせているときに突然勝手にウィンドウが閉じて
終了します。何が主な原因でしょうか?
185デフォルトの名無しさん:2006/10/22(日) 16:56:37
>>184
エスパーで解答すると、
ウインドウプロシージャの中で使っているswitch文のbreakを書き忘れているとか。

まあ、超エスパーの降臨を待てよ。
186デフォルトの名無しさん:2006/10/22(日) 17:03:03
あるいは、その「処理」とやらが、何十秒もかかるようなものだったら、
別スレッドに移すことか。

HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasksの値が1だったら、
一定時間応答のないアプリケーションを自動的に強制終了する。

とはいっても、これデフォで0だから違うだろうけど。
187デフォルトの名無しさん:2006/10/22(日) 18:15:09
>184
あなたが作っているのはコンソールプログラムと見た。
int main(){
  略
 sleep(10); /*ここを追加*/
return 0; }
でコンパイルしてみ。
188184:2006/10/22(日) 18:57:10
すいません説明不足でした。
ウィンドウズソフトです。コンソールプログラムではありません
さっきパフォーマンスモニタを観察していたら、強制終了される処理の部分で
Handle Countが異様に増えていきました。ファイルハンドル解放わすれかな
と思いましたので、調べてみます
189デフォルトの名無しさん:2006/10/22(日) 20:06:06
2007年のクリスマスは、サンタクロースの大井競馬場での騎乗のため
中止となります。また、それに伴いましてクリスマスイヴやプレゼント交換会
も中止となります。ご了承下さい
http://2chart.fc2web.com/2chart/2007kurichuusi.html
また、昨年お伝えしましたように、2006年のクリスマスも中止です。
http://2chart.fc2web.com/2chart/2006kurisumasuchuushi.html

毎年、各所でこのような楽しいクリスマスの風景が見られましたが
自粛でお願いします。
http://2chart.fc2web.com/2chart/tanosiikurisumsu.html
190デフォルトの名無しさん:2006/10/22(日) 20:32:04
/*
* list4a.c
*
*/
#include <stdio.h>

int x = 10;
extern int y; /* externは実はなくても動く */

int main(void)
{
extern int z;

printf("x=%d y=%d z=%d\n", x, y, z);

return 0;
}


/*
* list4b.c
*
*/
int y = 20;
int z = 30;


externの実験なのですが、
これを動作させるにはどうすればいいのでしょうか?
list4a.cだけを実行させても動きません。

191デフォルトの名無しさん:2006/10/22(日) 20:35:42
>>190
「動きません」って、どうなるんだ?
list4b.c もコンパイルしてリンクしないとダメだよ。
192デフォルトの名無しさん:2006/10/22(日) 20:40:32
>>191
それってどうすればできますか?
とりあえずそれぞれ.objっていうのが出来たんですが。
193デフォルトの名無しさん:2006/10/22(日) 20:43:07
>>192 コンパイラの使い方を調べろ。
194デフォルトの名無しさん:2006/10/22(日) 20:47:50
VCでやれば意識しないでいいぞ〜
195デフォルトの名無しさん:2006/10/22(日) 20:48:41
>>192
環境くらいかけよ

大抵のコンパイラはhoge.c foobar.cのようにファイル名並べてやればうまくやってくれる
.obj作れたんなら自分でリンカでなんとかできるはず
196デフォルトの名無しさん:2006/10/22(日) 20:59:58
>>195
できました。
bcc32 hoge.c foobar.c で。
どうもありがとう。
197デフォルトの名無しさん:2006/10/22(日) 23:00:36
bccかよ!
198デフォルトの名無しさん:2006/10/23(月) 00:41:13
>>196
コンパイル済みのobjからexe作成したい場合はリンカ直接呼べばいい。
ilink32 c0x32.obj hoge.obj foobar.obj, hoge.exe, , cw32.lib, ,

※c0x32.objはスタートアップモジュール(コンソールアプリ)。GUIならc0w32.obj、dllならc0d32.obj
 cw32.libは標準ライブラリのスタティックリンクライブラリ。マルチスレッドの場合はcw32mt.lib
199デフォルトの名無しさん:2006/10/24(火) 18:55:44
メインウィンドウのスタイルにWS_CLIPCHILDRENを追加し、
ステータスバーを追加。
起動して、マウスでウィンドウを小さく(タイトルバーだけにする)と下の部分の描写がおかしくなります。
InvalidateRectやUpdateWindowをステータスバーに指定しても変わりません。
どうしたらいいのでしょうか。。。?それともメインウィンドウにWS_CLIPCHILDRENを指定してはいけないのですか?
200デフォルトの名無しさん:2006/10/24(火) 23:44:28
>下の部分の描写がおかしくなります
それだけじゃわからん
201デフォルトの名無しさん:2006/10/24(火) 23:46:20
すいません、すごく初歩的な質問で申し訳ないのですがファイルを分割して変数や関数がどのファイルで通用するか考えた場合、
スコープはグローバル変数と関数は全てのファイルで通用、ただし両方ともstaticをつけるとスコープは内部リンゲージになる。

ローカル変数はブロック内でstaticをつけると内部リンゲージになる。
ただしグローバル変数に関して別のファイルの無指定のグローバル変数を利用するときは(staticをつけない場合のことです)
externという指定をつけたヘッドファイルを読み込んでコンパイルしないと正しく使うことができない

という理解でよろしいでしょうか?
分かりにくい文章でごめんなさい
202デフォルトの名無しさん:2006/10/25(水) 01:42:34
>>201
ちょっとおかしい。

×リンゲージ
○リンケージ

×ヘッドファイル
○ヘッダファイル

ローカル変数は( extern を付けて宣言しない限り)リンケージなし。
static を付けた場合、記憶クラスが変わる。
203デフォルトの名無しさん:2006/10/25(水) 02:36:45
きっと>>201は、リンゲージを飲んでヘッドファイルになっちゃったんだよ。
もともと頭おかしかったみたいだし。
204デフォルトの名無しさん:2006/10/25(水) 10:40:37
エディットコントロールで文字の中央揃えをしたいのですが
Create時に指定するのではなく動的に変更する場合
どのようにしたらいいでしょうか?
205204:2006/10/25(水) 10:46:58
スレ違いでした。
206201:2006/10/25(水) 19:16:08
>>202
すいませんw ちょっと疲れてたので書き間違いをしてしまいました
リンケージとヘッダファイルですね。

ローカル変数はexternをつけると別のファイルでも通用する
staticをつけるとそのファイルのみ通用する
何もつけないとブロック内のみ通用する

これで完璧ですか?
207デフォルトの名無しさん:2006/10/25(水) 20:34:32
ダメだこりゃ
208デフォルトの名無しさん:2006/10/25(水) 20:39:27
エクス y=ー( ゚д゚)・∵.ターン
209デフォルトの名無しさん:2006/10/25(水) 20:41:34
関数ブロック内で、externを付けて宣言すると、
外で宣言したのと同じくグローバル変数の宣言になる。
(ただしそれが見えるスコープはそのブロック内限定)
210デフォルトの名無しさん:2006/10/25(水) 21:03:23
static
  そのスコープ内で(ファイル・関数)一回だけ初期化し、その後領域を保持しつづけてくれる
エクス y=ー( ゚д゚)・∵.ターン
  誰かが外に造っているはずと期待し本体の置き場は(基本的に)他ソースにあることを想定
211デフォルトの名無しさん:2006/10/27(金) 12:33:43
c言語初めて1ヶ月で壁に当たっています。 
レベル低くて申し訳ないんですが教えてください。 

scanf("%s",str)で^zを判断する方法が知りたいです 

おねがいします
212デフォルトの名無しさん:2006/10/27(金) 12:43:53
あー来た来たw

>>211
DOS系OSならscanf()の戻り値を判断せよ。入力が閉じられている筈だから変換に失敗したことになるので0のはずだ。
Unix系OSなら単純に収容されるからstrchr(str, '\x1a')でもするってところかな。
213デフォルトの名無しさん:2006/10/27(金) 12:51:16
>>212
ありがとうございます。
先ほど私もその方法を試してみたのですが
scanfの戻り値の型がわからず代入時にエラーがでてしまいます

int chk;
chk = scanf("%s",str);
if (chk == 0){
〜〜

おかしいでしょうか?
214デフォルトの名無しさん:2006/10/27(金) 13:01:03
これだけヒントが並んでも未だに自分の環境を語らない>>213w
おまけにエラーが出たと言いつつエラーメッセージも張らないし。
先ずはコミュニケーションのレベル上げから始めた方がいいんでない?
215デフォルトの名無しさん:2006/10/27(金) 13:11:16
>>214
すいませんでした><
環境はbcc5.5.1 + DOS です
エラーメッセージは出ず異常終了します
216デフォルトの名無しさん:2006/10/27(金) 13:44:15
>>213
ヘッダファイル見れば?
scanfでぐぐれば?

確かEOFが返った気がする
217デフォルトの名無しさん:2006/10/27(金) 13:51:53
ヘッダファイルにそこまで書いてあるとは思わないが、>213のケースなら0ではなくてEOFだろうな。
218デフォルトの名無しさん:2006/10/27(金) 14:05:22
> scanfの戻り値の型がわからず

に反応しただけです。
219デフォルトの名無しさん:2006/10/27(金) 14:53:01
やっぱりCは難しいな…
220デフォルトの名無しさん:2006/10/27(金) 15:24:47
コンパイラ : VC2005
クラスが巨大なので、クラスを書いたファイルとmainのあるファイルを別にしたのですが、
どうすればmainのあるファイルで、別ファイルにあるクラスが使えるようになるんでしょうか。
ただの関数なら共通ヘッダにプロトタイプを書けば良いというのは分かるんですが。
221デフォルトの名無しさん:2006/10/27(金) 15:33:08
>>220
クラスのインターフェースだけをヘッダファイルに書く。
実現部は別ファイルでよい。
222デフォルトの名無しさん:2006/10/27(金) 15:35:41
>>221
ありがとうございました。
223デフォルトの名無しさん:2006/10/27(金) 17:46:42
環境:VS2005を使用しています。

ダイアログで日付と時刻を表示するプログラムを作っています。
日付と時刻が連結された状態で入ってくるのですが、下記のような
コードを記述したところ
Run-Time Check Failure #2 - Stack around the variable 'cBuf' was corrupted.
というエラーが発生してしまいました。
メモリを破壊しているようなのですがなぜ壊れているのかわかりませんでした。
分かる方いましたらお教えください。お願いします。

以下コード抜粋
m_DateStr = _T("2006/10/21 30"); //日付と時刻が入っている。

wchar_t cBuf[2];
_tcscpy_s(cBuf, sizeof(cBuf), m_DateStr.Right(2));
224デフォルトの名無しさん:2006/10/27(金) 17:58:06
>>223
その関数には、バッファの「文字数」を指定する必要がある。
バッファの「バイト数」ではない。
char型の場合は、文字数はバイト数と同じだが、
wchar_tの場合は違う。

TCHAR str[256] ;
size_t number_of_chars = sizeof(str) / sizeof(TCHAR) ;

そもそも_tcsとつくのは、マクロで置き換わるわけだから、
wchar_tを直接使うのであれば、wcscpy_s()を直接呼んだほうがいいと思うのだけれど。
225デフォルトの名無しさん:2006/10/27(金) 18:11:08
>>224
出来ました。
すごく分かりやすい解説をありがとうございました。
226デフォルトの名無しさん:2006/10/27(金) 19:57:31
クラスのインターフェースってなんですか?
227デフォルトの名無しさん:2006/10/27(金) 21:27:27
>>226
とりあえず何か本でも買って一通り勉強した方がいいよ
228デフォルトの名無しさん:2006/10/27(金) 22:35:26
>>226
C++ではメソッドのシグニチャだ。
229デフォルトの名無しさん:2006/10/27(金) 22:58:19
ようするに、とことん大雑把に言えばそのクラスがどんなメンバを持っているかということ。
230デフォルトの名無しさん:2006/10/28(土) 03:55:32
MFCとかのライブラリって
何段階も継承してるけど、あそこまでやる必要あるの?
231デフォルトの名無しさん:2006/10/28(土) 07:21:36
指→手→腕→体→一歩前へ→歩け

歩かせるのに指の動作から指示し直してたら効率悪いってことだろ。
納得行かなければ自分で改良してやんな
232デフォルトの名無しさん:2006/10/28(土) 09:26:54
・C++にテンプレートが無い時代だった
・オブジェクト指向と言えば継承な時代だった(包含しない)
233デフォルトの名無しさん:2006/10/28(土) 16:12:06
そういえば、今はテンプレート時代だな。
234デフォルトの名無しさん:2006/10/29(日) 17:26:02
VS.NET 2005です。
iostreamから1行getlineをしてstringを得たいのですが、途中でchar[128]などのバッファを使わず、一気にstringをとる方法はありますか?
string s = stream.getline(); のようなものを期待しています。
235デフォルトの名無しさん:2006/10/29(日) 17:31:36
>>234 std::getline()
236234:2006/10/29(日) 17:33:01
すみません解決しました
fstream >> string
237デフォルトの名無しさん:2006/10/29(日) 17:34:16
>>236
それだと空白で途切れるよ。
238デフォルトの名無しさん:2006/10/29(日) 17:49:54
>>236
>>237の言うとおりだ。std::getline使え。
239デフォルトの名無しさん:2006/10/30(月) 00:53:21
char buf[256];
fgets(buf, sizeof(buf), stdin);
という記述を良く見かけますが、
sizeof(buf)は256なので、もし256文字分入力されたら
bufの最後の\0が入らなくてよろしくない結果になったりしないのですか?
240デフォルトの名無しさん:2006/10/30(月) 01:01:05
なぜ試さない?
241デフォルトの名無しさん:2006/10/30(月) 02:37:05
>>239を見て、ためしに「fgets NULL」でぐぐったら、最初のページでもう答となる記述を見つけた。
1分で自己解決できることをなぜ質問するのか、理解に苦しむ。
242デフォルトの名無しさん:2006/10/30(月) 03:01:17
初心者だからだよ
243デフォルトの名無しさん:2006/10/30(月) 03:16:53
ネットの?社会生活の?
244デフォルトの名無しさん:2006/10/30(月) 03:39:36
両方
245デフォルトの名無しさん:2006/10/30(月) 15:54:46
質問です。
int *a,
int b=100;
*a=&b;
printf("%d",*a);

char *a="a"
printf("%c",*a);

char *a="abcde";
printf("%s",a);

文字や数字を表示させる時は*をつけるのに、文字列の場合は*をつけないのはなぜですか?
文字の場合は値の内容なのに、文字列の場合はアドレスで文字表示ができるのが
理解できません。何て言えばいいのかよく分からないので、
質問が解りにくくてすみません。
よろしくお願いします。
246デフォルトの名無しさん:2006/10/30(月) 16:05:40
>>245
Cの文字列は'\0'で終端するcharの配列だからだよ。
配列の内容を参照するだけなら、直接渡すのではなく
先頭アドレスを渡すことで事足りる。
だからオブジェクトじゃなくて先頭を示すポインタを渡してる。おわり。
247デフォルトの名無しさん:2006/10/30(月) 16:09:31
認識できない前処理命令です

ってエラーはどういうことでしょうか・・・?
msxmlをimportしようとして、VCならいけるんですが
Solarisではコンパイルエラーになってしまいます。

どなたか救いの手を…。
よろしくおねがいします。
248247:2006/10/30(月) 16:10:46
認識できない前処理指令
でした。
よろしくおねがいします。
249デフォルトの名無しさん:2006/10/30(月) 16:36:31
>>247
#importはVC++独自拡張。他のコンパイラには存在しない。
250デフォルトの名無しさん:2006/10/30(月) 16:56:53
#importはオートメーション、Windowsべったり。msxmlもWindowsもの。
Solarisに移植ですか・・・xmlライブラリ探してそれ使う所は自分で書かなきゃだね。
251デフォルトの名無しさん:2006/10/30(月) 17:07:28
COMってUNIXでも使えなかったっけ?
252250:2006/10/30(月) 17:44:30
おぉ、COMの仕様はOSに依存しないのか。普及してるのかな。
253デフォルトの名無しさん:2006/10/30(月) 18:22:06
質問があります。

プログラムをUNICODE対応に変更したのですが
char型の配列に格納した文字列をListBoxに
AddStringするところでキャストエラーが発生したため、
(wchar_t*)でキャスト変換したところ、リスト内の文字が
文字化けしてしまいました。
原因がお分かりになる方いらっしゃいましたら
お教え下さい。お願いいたします。


wstring wstr = (wchar_t*)m_tagtestDat->testStr;
254253:2006/10/30(月) 18:23:41
>wstring wstr = (wchar_t*)m_tagtestDat->testStr;

間違って入ってしまいましたorz
上記の記述は無視してください。
255デフォルトの名無しさん:2006/10/30(月) 18:40:31
>>253
そんな化けるようではUNICODE対応したと言わないだろ。
それはともかく、そのchar型の配列をTCHARにするか、
それができないならUNICODEとしてコンパイルするときにはchar配列をワイド文字列に変換するようにしろ。

VC++ならATLのATL::CA2TだかA2Tで簡単に変換できる。

UNICODEだけに対応するならTではなくWだがな。
256253:2006/10/30(月) 18:54:18
>>255
CA2Wマクロを使用することでワイド文字列に変換することが出来ました。
ありがとうございました。
257デフォルトの名無しさん:2006/10/31(火) 02:01:07
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
char *buf;
buf=(char *)malloc(20);
if(buf==NULL){
printf("失敗です\n");
exit(1);
}
buf="abcde";
printf("%s",buf);
free(buf);
return 0;
}

強制終了になるんですがどこがおかしいのでしょうか??
258デフォルトの名無しさん:2006/10/31(火) 02:02:41
>>257 buf = "abcde"
259デフォルトの名無しさん:2006/10/31(火) 02:04:29
CString使おうぜ〜
260259:2006/10/31(火) 02:05:20
タイミング悪 orz
261257:2006/10/31(火) 02:18:36
strcpyを使ってできました。ありです。
でもこの場合bufってabcdeの先頭のアドレスが入るんではないんですかね?
なぜ入らないんですか?
262デフォルトの名無しさん:2006/10/31(火) 02:35:47
>>261
期待通りに値は入っている。それを free() に渡すから落ちる。
free() の引数には malloc() の戻り値を渡さないといけない。
263デフォルトの名無しさん:2006/10/31(火) 18:40:16
教えてください。
それぞれのデータ型が使うメモリを調べてみようとして、
char c
int i
double d,e
のアドレスを表示させたら
0012FF8B
0012FF84
0012FF7C
0012FF74
と、表示されたんですが、
cは8B番地の1バイト分のメモリを使っているぽいのは分かるんですが、
iとdとeはそれぞれ何番地から何番地までのメモリを
使っているんですか?

264デフォルトの名無しさん:2006/10/31(火) 18:57:10
>>263
sizeof(int)とsizeof(double)
265デフォルトの名無しさん:2006/10/31(火) 19:30:01
必ずしも c, i, d, e が隙間無く配置されるとは限らない。
アライメント ってやつだ。

sizeof(char)=1, sizeof(int)=4, sizeof(double)=8 として
4バイトアライメントがかかると
cxxxiiiiddddddddeeeeeeee (1文字が1バイト xはゴミ)
のようなことになる。
266デフォルトの名無しさん:2006/10/31(火) 21:28:34
>>265
>>263のアドレスからすると、先頭番地が 0012FF74H で、
eeeeeeeeddddddddiiiixxxc
dとeはどっちが先かは環境依存だと思うけど、こんなかんじじゃないか?
267265:2006/10/31(火) 21:32:04
>>266
thx >>263 のアドレスを全く考慮してなかった orz
268デフォルトの名無しさん:2006/11/02(木) 02:24:05
C++について質問させて下さい。
C++で書かれたBlowfishの実装を眺めていたら下記のようなコードに出くわしました。

union aword {
 unsigned long dword;
 unsigned char byte[4];
 struct {
  unsigned int byte3:8;
  unsigned int byte2:8;
  unsigned int byte1:8;
  unsigned int byte0:8;
 } w;
};

この、unsigned int byte3:8;の末尾にある、:8というのはどのような意味なのでしょうか?
多分、下位(あるいは上位)8ビットを使用する、というような意味だとおもうのですが、
だとしたらunsigned char byte3というような定義と違いが無いとおもうのです。
無論、charが8ビットであるという前提において、ですが。

このような定義をしているということは、自分の考えが間違っているとおもうので
その辺りを教えていただけませんでしょうか。
269デフォルトの名無しさん:2006/11/02(木) 02:25:24
>>268 ビットフィールド
270デフォルトの名無しさん:2006/11/02(木) 04:57:23
std::vectorって代入無理ですか。

std::vector<int> a,b;
b.push_back(1);
a = b;

とかやると挙動が変で。
配列と違ってそういう事できるものだと思ってた。
271デフォルトの名無しさん:2006/11/02(木) 05:31:43
できます。
272デフォルトの名無しさん:2006/11/02(木) 10:49:20
>>270
「挙動が変」じゃぁわからん。
期待した動作と、それに対する結果を言えるか?
おおかた >>270 のミスなんだろうけど。
273デフォルトの名無しさん:2006/11/03(金) 02:56:14
270そのままのソースでバッファオーバーランとかアンダーランとか言ってくる。
動作はおおむね期待どうりだけど不安なので

template<class T>
class vector2: public: std::vector<T>
{
public:

T& operator=(T& right)
{
if(this == &right) return *this;
clear();
insert(begin(), right.begin(), right.end());
return *this;
}

}

細かい所間違ってるかもしれないけどこういうの書いた。
これで大丈夫。
274デフォルトの名無しさん:2006/11/03(金) 03:07:34
Windows2000のDOSプロンプトで使うツールを作っています。
Win2Kのプロンプト上ではエスケープシーケンスでの文字色の
変更などができませんでした。
何か使いやすいモジュール(と言うのでしょうか?)は
ないでしょうか。
使っているコンパイラはフリーのBorland C++です。
よろしくお願いします。
275デフォルトの名無しさん:2006/11/03(金) 09:27:29
>>273
警告を回避するためだけにそんなことするかよ。

>>274
使いやすいかどうかは別として、Windows APIでそういうことはできる。
276デフォルトの名無しさん:2006/11/03(金) 10:20:12
引数を調べるプログラムで

int _tmain(int argc, _TCHAR* argv[])
{
int i;
printf("argcは %dです。\n",argc);
printf("次に、argv[x]の中身を表示します。\n");

for(i=0; i < argc; i++)
printf("argv[%d]=%s\n", i, argv[i]);

printf("おしまいっ!\n");
rewind(stdin);
getchar();
return 0;
}

a.exe abc def
と引数を入れても、
Visual C++ 2005では C a d と、最初の1文字しか出ません。
なぜなのでしょうか
277デフォルトの名無しさん:2006/11/03(金) 10:28:05
>>276
Unicode文字列をascii文字列として出力しようとしているから。
詳しくはVSスレなりどこへでも。
278デフォルトの名無しさん:2006/11/03(金) 10:53:40
>>273
VC++2003では出ないが、どんな環境なんだ?
std::vectorにはoperator=があるんだし、わざわざそんなことする必要無いと思うが。
279デフォルトの名無しさん:2006/11/03(金) 11:20:04
>>277
出来ました
ありがとうございます。
280デフォルトの名無しさん:2006/11/03(金) 11:45:13
マルチモニタで両方のディスプレイにフルスクリーン表示させる方法ってありますか?
プライマリモニタでしかフルスクリーン表示できなくて
281デフォルトの名無しさん:2006/11/03(金) 12:34:59
スレ違い
282デフォルトの名無しさん:2006/11/03(金) 19:32:24
ちょっと相談させてくれ。
HDC をラップするRAIIクラス作ろうと思ったんだが、メンバ関数名のつけ方で悩んでる。
clas DeviceContext {
public:
  // HDC を置き換える
  void reset(HDC hdc=NULL) {
    if (hdc_)
      ReleaseDC() か DeleteDC() を呼ぶ;
    hdc_ = hdc;
  }
  // HDC の所有権を解放
  HDC release() {
    HDC hdc = hdc_;
    hdc_ = NULL;
    return hdc;
  }
  //...
private:
  HDC hdc_
  //...
};
こんなクラスなんだが、release ってメンバ名が非常に微妙な気がしてならん。
とりあえず auto_ptr や shared_ptr のインターフェイスに合わせとこうと思ったんだが、
release ってのが Win32 API の ReleaseDC とカブってるのにぜんぜん違う動作だから混乱を招きそうだ。
かといって、他にいい名前を思いつかん。
なんかいい名前ってない?

ちなみに環境は、Win32 SDK + VC6.0以降。
283デフォルトの名無しさん:2006/11/03(金) 19:42:22
MFCではAttach+Detach
284デフォルトの名無しさん:2006/11/03(金) 19:53:30
>>282
本当に必要じゃないんなら reset() も release() も消しとけ。
285デフォルトの名無しさん:2006/11/03(金) 20:13:11
>>283
普段は MFC 使うことのほうが多いクセにまったく思いつかんかった・・・orz
サンクスです!

>>284
いや、インターフェイスを最小限にってのはわかるけど、一応どっちも必要なんす。
DCが不要になった時点でさっさと reset しないとなんかキモチワルイし、
release (または Detach)がないと、戻り値とか引数として使えなくなっちゃうし。
286デフォルトの名無しさん:2006/11/03(金) 21:48:17
俺だったら、リソース管理をしない、関数をラップするだけのクラスを作り、
それをprivate継承して、所有権を持つクラスを作ると思う。

ATL::CDCでは、releaseではなく、Detachという名前で同様のものを持っていたはず。
もちろんその逆のAtatchもある。
287デフォルトの名無しさん:2006/11/04(土) 00:25:22
>>286
自分の場合、単なる関数ラッパークラスにはあんまり魅力を感じとらんのです。
結局それって DeleteDC(dc); が dc.DeleteDC(); と書けるくらいの違いですよね?
それで HDC を引数にとるAPIを片っ端からメンバにしようとするとメンバ関数が膨大になるし、
かといって「よく使うやつだけ」とかやると、どれがメンバでどれが非メンバか覚えとくのが大変だし。
小さな具象クラスに留めておきたいから、継承とかもあんまりやりたくないし。

ただ、 if (...) return FALSE; のたびにオブジェクトを忘れず解放ってのはめど過ぎるし、
自分のケツくらいはオブジェクト自身で拭いて欲しいなと。
288デフォルトの名無しさん:2006/11/04(土) 00:50:52
環境は
WinXP home sp2
Microsoft Visual C++ .NET

上位関数でファイルポインタを宣言して
fopenは子関数でして
fcloseは親でしたいんだけど
↓じゃ上手いこといきません

void a(file *fp){
  fp=fopen(filename,"w");
  fprintf(fp, "test\n");
}
main(){
  file *fp
  a(fp);
  fclose(fp);
}
289デフォルトの名無しさん:2006/11/04(土) 00:52:45
void a(file **fp){
  *fp=fopen(filename,"w");
  fprintf(*fp, "test\n");
}
main(){
  file *fp
  a(&fp);
  fclose(fp);
}
290デフォルトの名無しさん:2006/11/04(土) 00:52:59
>>288

void a(FILE **fpp) {
*fpp = fopen(filename, "w");
fprintf(*fpp, "test\n");
}

main(){
FILE *fp;
a(&fp);
fclose(fp);
}
291デフォルトの名無しさん:2006/11/04(土) 00:54:05
>>289
うお、思い切りかぶったw
292288:2006/11/04(土) 01:04:00
>>289-290
ありがとう

あーそうか
ファイルポインタのアドレスが入った場所のアドレスを送らないといけないのか
で受け取った先は↑のせいで**になるのか
293デフォルトの名無しさん:2006/11/04(土) 01:07:30
C++なら *& で受けるんだけどな
294デフォルトの名無しさん:2006/11/04(土) 01:43:10
そういえば、どこかのスレで、
同じように**を使ってポインタ変数を書き換える部分を書いたら
**を見た瞬間に「初期化が」「NULLを参照すると」とか言い出す奴が湧いて来たっけ。

お前らはint*を受けて整数を代入するコードでも同じ事を言うのか、と。
いや、本当に必要があるなら、NULLチェックするのも当然だとは思うけどね。
295デフォルトの名無しさん:2006/11/04(土) 01:47:30
>>294
あとでライブラリ的に再利用する予定(または可能性)があるコードなら、
それの外部インタフェースとなる関数では入力値のチェックはしたほうがいいかもね。
ユーザ(他人や将来の自分)が間違った使い方をしてもいいように。

内部的な関数でコール元から適切な値が渡ってくることを前提にできる関数なら
いちいちチェックする必要は無いと思う。
296288:2006/11/04(土) 02:12:02
孫以降は
↓でおkだよね?

void aa(file **fp){
  fprintf(*fp, "test\n");
}
void a(file **fp){
  *fp=fopen(filename,"w");
  fprintf(*fp, "test\n");
  aa(&*fp);
}
main(){
  file *fp
  a(&fp);
  fclose(fp);
}
297デフォルトの名無しさん:2006/11/04(土) 02:16:22
void a(file **fp){
  *fp=fopen(filename,"w");
  fprintf(*fp, "test\n");
  aa(fp);
}

でいいよ。二回目以降の呼び出しはわざわざ &*ってしなくてもいい
298デフォルトの名無しさん:2006/11/04(土) 02:17:06
>>296
読むだけの関数は値渡しで頼む。
299デフォルトの名無しさん:2006/11/04(土) 02:18:09
>>296
孫以降というよりも、
 FILE *fp = <なんか> のようなポインタの書き換えを伴うやつ(fopen だな)だけ
 引数では FILE ** で受けて 呼び出し側は FILE *fp; foo(&fp) のように &付きで渡す。
あとは素直に FILE * で受けてれば問題無い。
300デフォルトの名無しさん:2006/11/04(土) 02:26:24
fseek()も書き換えを伴うぞ。
301デフォルトの名無しさん:2006/11/04(土) 02:30:09
>>300
それは fp 自身ではなく fp が指す FILE構造体の内容を書き換えるんでない?
302デフォルトの名無しさん:2006/11/04(土) 02:33:50
>>300
fseek() は fp の実体内部を書き換えるだけで fp そのものは書き換えられないだろ?
その証拠に FILE* を戻さないし、FILE** で受けてない

# fwrite() fprintf() も fp の実体内部を書き換えてるぞ
303デフォルトの名無しさん:2006/11/04(土) 02:34:20
だからfseek()を使う関数をfile *fp;で呼び出したらだめ。
**fpで呼び出さないと戻ってきた時fpの中身が食い違ってしまう
304デフォルトの名無しさん:2006/11/04(土) 02:35:42
>>303
アホか。
305デフォルトの名無しさん:2006/11/04(土) 02:35:52
>>302
それやったら、fseek()をした直後にfread()をやっても影響を受けないと
言うのか?読み出す場所が違ってくるだろ。
306デフォルトの名無しさん:2006/11/04(土) 02:39:00
あ seek ポイントが狂うからか。
あれ? fwrite, fprintf は書き換えずに別管理で現在位置を保持してるのか?
307デフォルトの名無しさん:2006/11/04(土) 02:40:04
結局**fpで受ける必要があるのは、fopen()で代入する時だけだよね?
308デフォルトの名無しさん:2006/11/04(土) 02:41:43
>>306
いや、*fpだけでもFILE構造体を指す事はできる。しかしfopenは
FILE構造体へのポインタを返すので、**でないといけないんだろう。
309デフォルトの名無しさん:2006/11/04(土) 02:46:26
まとめると
1.FILE構造体へのポインタを受け取って代入する関数は**で呼び出す。
2.それ以外は*だけでよい。

1.はfopen()、freopen()
2.はそれ以外

ってとこかな
310デフォルトの名無しさん:2006/11/04(土) 02:47:26
書き換えてるのはFILE構造体の実体だものな。

foo(int **a) { *a = malloc(...); }
bar(int *a) { *a = ...; } // fseek に相当
hoge(int *a) { ... = *a; } // その他参照のみ

{
 int* a;
 foo(&a);
 bar(a);
 hoge(a);
}

別に bar() hoge() 間で問題おきないよな。
311286:2006/11/04(土) 02:53:03
>>297-310
マジ、ありがとう

ポインタも奥が深いorz
まだまだがんばらないといけないな・・・
312デフォルトの名無しさん:2006/11/04(土) 02:53:13
できれば戻り値を使うのが一番だってのを忘れんなよ。
313273:2006/11/04(土) 03:46:45
>278
BCB5。
別件で別スレに質問したらRogueWaveのバグの可能性があると言われた。
これもそうかも。
ちなみにpush_back()やらないと何もいってこないのでひょっとすると浅いコピーやってるのではと思ってる。
普通は=使えると聞いてほっとした。
314デフォルトの名無しさん:2006/11/04(土) 03:50:34
>>313
STLport4.6.3なら入るからそれ入れたら?
315デフォルトの名無しさん:2006/11/04(土) 03:51:07
>>313
clear() + insert() よりも assign(right.begin(), right.end()) がお勧め。
316デフォルトの名無しさん:2006/11/04(土) 11:54:14
すみません、まったくの初心者なのですが・・・
ANSI−Cを使ってWinXP上にウインドウを出すには
何をそろえればいいんでしょうか?
VC++5.0持ってますけど・・・これじゃなきゃ駄目?
317デフォルトの名無しさん:2006/11/04(土) 11:56:58
>>316
ANSIの規格内ではGUIに関する操作は一切出来ない。
318デフォルトの名無しさん:2006/11/04(土) 11:57:11
> 何をそろえればいいんでしょうか?
ANSI-C準拠の処理系
> これじゃなきゃ駄目?
いいえ
319デフォルトの名無しさん:2006/11/04(土) 11:58:02
>>317
コマンドプロンプトも窓だろ。
320デフォルトの名無しさん:2006/11/04(土) 11:59:25
Windowsのclおよびgccを使っています。
問題を単純化した例を下記に挙げます。
#include <stdio.h>
int Test1() {
    printf("Test1\n");
    return 0;
}
int Test2() {
    printf("Test2\n");
    return 0;
}
int main(void) {
    int B = Test1() && Test2();
    return 0;
}
上記でTest2()が実行されません。(Bの結果が何であるにせよTest2()は実行したい)
webを調べたところvolatileと言うキーワードに遭遇したので試しに下記にしてもだめでした。
volatile int Test1() {
volatile int Test2() {
volatile int B = Test1() && Test2();

Test2()を確実に実行するには
B1 = Test1();
B2 = Test2();
B = B1 && B2;
のように、2つに分けるしか手がないでしょうか?
321デフォルトの名無しさん:2006/11/04(土) 12:02:14
>>319
コマンドプロンプトはCUIだ
322デフォルトの名無しさん:2006/11/04(土) 12:08:02
>>320
それはショートサーキットという動作。
ショートサーキット無しの論理演算をしたければ、2つに分けるのが正解。
そうでなければ、たとえば Test1() & Test2() ならショートサーキットは起こらない。
volatile は関係ない。
323デフォルトの名無しさん:2006/11/04(土) 12:19:35
>> 320
式1 && 式2
という演算では、式2より先に式1が評価されるのが保障されている。
そして、式1が偽(=0)なら式2は評価されないことが保障されている。
324>323:2006/11/04(土) 12:23:08
保障?
325デフォルトの名無しさん:2006/11/04(土) 12:26:17
>>320
副作用と判定を混ぜてるからそうなる。
326323:2006/11/04(土) 12:29:45
>>324
すまん、この場合は「保証」だっけ?
327デフォルトの名無しさん:2006/11/04(土) 13:21:53
>>321
>>316にGUI/CUI云々は書かれてないぜ。
ウィンドウが出さえすれば要件を満足するはずだ。
328デフォルトの名無しさん:2006/11/04(土) 14:23:23
>>327
いやあの、GUIです…
ないんですか?
ANSI−C準拠の処理系ってどんなのがあるんですか?
329デフォルトの名無しさん:2006/11/04(土) 14:35:58
>>328
前にも書かれているようにC言語自体にウィンドウ表示する機能はない
Windows環境でウィンドウを出したいのならWin32APIを使う必要がある。
そのためにはPlatform SDKが必要だが、VC++5.0持ってるなら必要ない。
でも今さら5.0使うよりかはVS2005Expressを使ってみるのもいいかもね。
330デフォルトの名無しさん:2006/11/04(土) 16:12:02
質問です。
下記のコードなのですがWinXPのCygwin上のgcc3.44ではコンパイルして
実行できたのですが、VC6.0では

「error C2440: 'initializing' : 'struct teststruct' から 'int' に変換することはできません。
(新しい動作 ; ヘルプを参照)
この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。」

というエラーが出てしまいます。VC6.0では配列の初期値として構造体を
返す関数を指定する事はできないのでしょうか?

#include <stdio.h>

struct teststruct{
int mem1;
double mem2;
};

teststruct get_ts(int in_mem1,double in_mem2){
teststruct ts;
ts.mem1 = in_mem1;
ts.mem2 = in_mem2;
return ts;
}

teststruct array[] = {get_ts(1,1.1),get_ts(1,2.4)};

int main(){
printf("%d %f : %d %f\n",array[0].mem1,array[0].mem2,array[1].mem1,array[1].mem2);
return 0;
}
331330:2006/11/04(土) 16:13:32
ちなみにOSはWinXP Pro SP2でソースはcppです。
332デフォルトの名無しさん:2006/11/04(土) 16:48:48
>>329
どうもありがとうございます。
UNIXには、turtle.hとかってありましたよね…
あの頃が懐かしい
333デフォルトの名無しさん:2006/11/04(土) 18:06:10
はどうすれば良いんですか?
334デフォルトの名無しさん:2006/11/04(土) 18:29:39
>>33
それ多分gccの拡張だから

teststruct(int in_mem1, double in_mem2) : mem1(in_mem1), mem2(in_mem2) {}
teststruct() {}

って書けよ
335デフォルトの名無しさん:2006/11/04(土) 18:30:03
×>>33
>>330
336デフォルトの名無しさん:2006/11/04(土) 19:03:47
>>330
VC++ 6の問題だと思う。
VC++ 7.1/8ではコンパイルできるし、
そんなをできないようにする理由もないはず。
337秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 19:19:11
こんばんわ。C++暦2日目の学生です。

乱数で0が出るまでの回数をtemp[]配列に記憶しておき,それを1万回試行してtemp[]の平均を求める。
http://ipoko.skr.jp/ransuu.cpp.txt
というプログラムを考えたのですが,なぜか最初の1回だけランダムな数字が出て
残りの9999回は全部0になってしまいます。

何故でしょうか?誰か教えてくださいm(__)mペコ
338デフォルトの名無しさん:2006/11/04(土) 19:25:58
志村sの初期化ー!
339秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 19:27:43
>>338
アッー!
なるほど、どうもありがとうございましたw
340デフォルトの名無しさん:2006/11/04(土) 19:27:59
2日ってまだ書ける時期じゃないな。
覚えないと。
341秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 19:29:30
まだクラスの単元しか読んでいません。
テンプレートってのをはやく覚えたいです頑張ります
342秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 19:31:28
Cはそれなりに得意ですが
CとC++の違いがまだ分からないです。
勉強に当たって何に気をつければいいとかありますか?
343デフォルトの名無しさん:2006/11/04(土) 19:35:16
罠が増えてるので気をつけましょう
344デフォルトの名無しさん:2006/11/04(土) 19:42:32
C++暦2日目でもマルチポストはベテランらしいな
345秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 19:43:29
気をつけます
2ch暦6年です
346デフォルトの名無しさん:2006/11/04(土) 19:48:08
>>336
アホウ!
初期化に関数を使えるようにしたら、
関数の呼び出し順序によって結果が変わることがありえる。
その関数の場合は副作用が無いから問題ないが、
よく考えてものを言え。
347デフォルトの名無しさん:2006/11/04(土) 19:55:12
俺がアホで悪かった。
しかし規格上できることになっていることに変わりはない。
348デフォルトの名無しさん:2006/11/04(土) 19:59:09
>>347
規格のセクション貼れよ。どこにそんな事が書いてある。
349デフォルトの名無しさん:2006/11/04(土) 21:04:30
>>346
君はunary function以外認めない気かw
8.5.12
350デフォルトの名無しさん:2006/11/04(土) 21:18:19
>>349
§8.5.12なんてねーぞ。8.5.1.12も違う内容だし
351デフォルトの名無しさん:2006/11/04(土) 21:33:37
>>349
unary function?全然関係ない。
たとえばこんなコードがあったときにarrayとarray2のどっちが先に初期化されるかで結果が変わるが、
どっちが先に初期化されるのか予測できるか?

// test.h
struct teststruct{ int mem1; double mem2; };
extern int a;

// test1.c
#include "test.h"

int a=1;
teststruct get_ts(int in_mem1,double in_mem2){
struct teststruct ts;
ts.mem1 = in_mem1+(a==1);
ts.mem2 = in_mem2+(a==1);
a++;
return ts;
}

teststruct array[] = {get_ts(1,1.1), get_ts(1,2.4)};

// test2.c
teststruct array2[]={get_ts(1,1.3)};
#include "stdio.h"
int main(){
printf("%d %f : %d %f\n",array[0].mem1,array[0].mem2,array[1].mem1,array[1].mem2);
return 0;
}
352デフォルトの名無しさん:2006/11/04(土) 21:36:16
struct teststruct xxx ;
って書かないで構造体の宣言できるんですか?
いつも定義で
typedef struct {
// any code
} teststruct ;
353デフォルトの名無しさん:2006/11/04(土) 21:38:02
ずばり、規格書に書かれている場所を示せばいい。
>>349みたいな出鱈目書かないで
354デフォルトの名無しさん:2006/11/04(土) 21:41:17
コンパイル前というか、lint というツールを使用するのは基本なんでしょうか。
lintで構文チェックするのは常識ですか。
355デフォルトの名無しさん:2006/11/04(土) 21:45:18
>>354
最近のコンパイラは賢い。
あやしいところの警告もちゃんとしてくれる。
gccやvcなみのコンパイラを使ってるならlintは不要。
356デフォルトの名無しさん:2006/11/04(土) 21:46:03
失礼、8.5 -12-だった
-12- The initialization that occurs in argument passing,
function return, throwing an exception (except.throw),
handling an exception (except.handle), and brace-enclosed initializer lists (dcl.init.aggr)
is called copy-initialization and is equivalent to the form

T x = a;
357デフォルトの名無しさん:2006/11/04(土) 21:47:43
>>348
JIS X3014:2003より。
8.5の1節では、初期化子節に代入式が挙げられている。
代入式とは関数呼出式を含んでおり、
実際同2節には、関数で初期化できることも書かれている。
358デフォルトの名無しさん:2006/11/04(土) 21:48:59
359デフォルトの名無しさん:2006/11/04(土) 21:49:27
>>351
たぶんもう分かってると思うけど
それはもう配列に限った話じゃなくて未定義だ
360秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 21:51:12
すいませんさっきの大学生ですが

ボクの計算機では1万回やると約3秒かかりました。
しかし2万回以上に増やすとエラーで強制終了してしまうのですが・・・
原因はメモリ不足でしょうか?

C言語では乱数を2万回作ったくらいじゃメモリ不足?で強制終了されなかったと思いますが
C++はそんなもんなのでしょうか??



[3] 環境
 [3.1] OS: WindowsXP-SP1
 [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 for Win32 & Turbo Incremental Link 5.00

あ、CPUとメモリも載せておきます

演算装置:Athlon64-3600+
メインメモリ:DDR SDRAM 1024GB
361デフォルトの名無しさん:2006/11/04(土) 21:52:36
グローバルなコンストラクタの初期化順序が予想できないのは
配列に限ったことじゃないし。
どんな言い訳してくれるか楽しみ
362秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 21:55:47
>>360
解決済みですm(__)mペコ
363デフォルトの名無しさん:2006/11/04(土) 21:58:08
>>361
>>351>>336の「そんなをできないようにする理由もないはず。」に対する反論なんだとオモタ
364デフォルトの名無しさん:2006/11/04(土) 21:58:49
>> 355
ありがとうございます。そうすると lint は一つ前の世代のものなんですか。
書き込みが早いですね。
365秋葉の大学生♂&rlo;望志んさ屋トフソ:2006/11/04(土) 23:00:09
すいません さっきの大学生ですが
http://ipoko.skr.jp/ransuu.cpp.txt

int型の配列を25000個なら確保できるけど,
30000個以上だとプログラム実行させても強制終了しちゃいます

int temp[3万以上]; としたソースをコンパイルして実行させると強制終了しちゃいます。


これの原因は何でしょうか?
366デフォルトの名無しさん:2006/11/04(土) 23:01:38
>>365
マルチ
367デフォルトの名無しさん:2006/11/04(土) 23:08:40
私、mixiのとあるC言語コミュに加入していたのですが、そこの管理人があまりに横柄&失礼な文を書くので退会してきました(^_^;)

初心者の人が虫食い状態のソースを埋めて完成させる簡単な課題を丸投げしていたのですが…

わざと理解できないように難しく書き直したり、きちんとお礼を言っている質問者に対して『この程度の事が分からないのはやる気がないだけ、そんな人間にお礼を言われる筋合いもないし、虫酸が走る』とまで書いていました…。

分かる人には大した事の無いことだったとしても、分からない人にはそうでないのですから、もう少し常識ある態度が取れないのかな…と思った訳です。
368デフォルトの名無しさん:2006/11/04(土) 23:09:28
実は、他の掲示板でも似たような事があり、非常に不愉快な気分になった事もありました。初心者&入門者用と謳っていながら、分かる人が知識をひけらかし、分からない人を中傷するような感じだったんです。

こういうのを見た後に、ここのサイトにやってきたので、余計に素晴らしいなと思ったんですよね(笑)

私の拙い知識でも役に立つ人がいるのならば…と、今後を驕ることなく書き込みしていきたいと思ってますよ(^-^)
369デフォルトの名無しさん:2006/11/04(土) 23:10:12
いったいここは何なんだ
370デフォルトの名無しさん:2006/11/04(土) 23:11:53
>>367
表層的に丁寧な言葉を使ってても、
あからさまに解く気が無いのはとても失礼な態度だと思う。
それで罵倒されたからってここで書くのもどうかと思う。
371デフォルトの名無しさん:2006/11/04(土) 23:22:25
ここはそんなに素晴らしい場所じゃない。
人が多いから、たまにとても親切な人も来るというだけ。
あなたが退会してきたそこも、別にひどい場所じゃないだろう。
そういう考えの人がいるのは別に不思議じゃない。ここにだっている。
372デフォルトの名無しさん:2006/11/04(土) 23:46:01
質問した相手が悪かったんだろう。これからは質問する前に
Ku○○○○○eがいないかどうか確かめて、もしいたらそこには
何も書き込まない事だな。
373デフォルトの名無しさん:2006/11/05(日) 00:08:33
>372
その人は管理人じゃないから、catっぽい名前の人だと思う。
ちなみに自分も耐えられなくて逃げてきた。何かをけなされたわけではないが。
374デフォルトの名無しさん:2006/11/05(日) 00:56:07
IT化だから最近の子供は凄いのか〜とか思うのは間違い!!
最近の子供はコンピュータがブラックボックス化してしまたせいで
コンピュータの仕組みについては何も知らない

MS-DOS?Windows3.1?コマンドライン?(謎)って感じ

昔に比べて自分でプログラム作る必要は無くなったし
自作する必要も無くなった(自作PCと既製PCの値段の差が無くなってきている!)

(まぁインターネットサーフェインやHP作成はちょっと昔の子供より出来そう?だが)

商業高校の掲示板とかスレとか見てみ?
情報をたくさん勉強してるはずなのに何も知らないよ?

資格もワープロ検定やパソコン検定などエンドユーザ側の試験ばかり(それはそれで悪くはない・・?)
375デフォルトの名無しさん:2006/11/05(日) 02:54:37
>>365
そりゃ、スタックオーバーフローだろうな。
temp配列の領域をスタックに置いているから、ある程度以上のインデックスを超えると
リンカで用意しているスタック領域を超えて、メモリ領域を壊しまくる。か、MMUによってアクセス例外が起きる。
普通ある程度大きな領域を必要とする場合は、ヒープ領域にとる。
int* temp = new int[1000000]; //領域確保
... 処理
delelte[] temp; //使い終わったら必ず領域開放
376デフォルトの名無しさん:2006/11/05(日) 02:55:04
宿題スレ覗いてこっち開いたけど…マルチポストが流行ってるのか?
377デフォルトの名無しさん:2006/11/05(日) 03:00:10
マルチポストにレスを返す教えるクンが居る限り、マルチポストは
なくならない。
378デフォルトの名無しさん:2006/11/05(日) 04:16:19
              ∧        l'vヘ
         ハ ┌( ;/ ト, ,、 rヘ  r'^ナrジ-z
    __}ヽ,__ (ヽ/ス_r^フしz,り い)n/イr〜^′
   'っヾ、r'__  |レ'ノ_C'入彳勺ソメろ_j/し-,_
    `フ ヾ勹_| <_r' !|刀_」r''>||/⌒(_rヘ-‐'
     <_ゝし||フぅ(ひzメ__ゝ'l !'そ
        ~zヾ|て 、l レ^ //'| |'~
            | | ヽl| // }|
            | :! || | | ,/ ,'       すいません、ちょっと通りますよ
          | :{. || | |/ /
            l !|| | | /
          ヽ ヽ.|/ //
          _,r)_ j (_,(           ciz
         ,ノこ_- __,ーヽ         ん|Zゥ レz  zjそ_
          }    ...  丿        ろ、,_!|乙7ムLそ/し-z
         ノ""''   一(          `う.l !シ/ア了//_⊂,
        /、__      ヽ         ^'| |~//,/_ソ ハr^
        /    ......     ーl         | |// //ノ
     /~"' 、__/   ,,,...}        |/ ///
      {' _  `y′ 一  /         r'〜(_ノ
     人   =/‐-     ハ       丿"  ''(
      ヽ '' /  __,,  /       / ‐-  ''')
        '∨     X.        }'''   ....ノ 
        j    ー/        /==  ノ'ヽ 
       /=‐  r'´-ヽ        }  ー/''''  {
       ,' _,, 人 ''"`、      ノ.. '' ノ`ヽ ''"ヽ 
        {ー /  \ -'}     / /    \'''}`
      ハ  〈      )八     ( f       )ハ
       ヽ )   ((        )ノ      /
       ノ/     ')    _/
379秋葉の大学生&rlo;望志んさ屋トフソ:2006/11/05(日) 04:20:07
>>375
ありがとうございました。
スタックがそんなところに存在して
あの場所で宣言すると勝手にリンカのスタックに入ってしまい
しかもゴチャゴチャした制約があったなんて知りませんでした
勉強になります
380デフォルトの名無しさん:2006/11/05(日) 11:42:45
>>372
晒し
Kusakabe
id=1277347

耐性のない初心者はこの基地外のいるコミュニティに書き込むべからず
381デフォルトの名無しさん:2006/11/05(日) 13:25:56
メモリが足りなくて困ってます。
ただ同じことを繰り返してるだけなので、
試行が終わるたびにテキストで出力すればあとは手作業で済ませます。
どうすれば、試行の度に出力することができますか?
ファイル名をその度に変える必要があるんどえしょうか?
382デフォルトの名無しさん:2006/11/05(日) 15:00:06
メモリ足りないなら買ってくればいいじゃん。
383デフォルトの名無しさん:2006/11/05(日) 15:14:17
>>381
マルチか嵐か?
誘導されてきた積もりなのなら、誘導元に断り書きすることとこちらにもその旨を書くこと。
つーか、誘導元でソースを貼れと言われただろ。
384デフォルトの名無しさん:2006/11/05(日) 17:12:12
windowsXP,VisualC++6.0での質問です。
リストボックスで複数行(8行)そして、複数列(256列)表示させたいのです。
表示内容は2次配列を用いて、処理中に書き換え可能としたいのです。

質問は複数列表示についてですが、基本的なところでどうすれば複数列設定ができるのでしょうか?
お願いします。


385デフォルトの名無しさん:2006/11/05(日) 18:16:11
>>384
素直にFlexGridでも使っとけ。VC6ならついてるぞ。
386384:2006/11/05(日) 19:11:47
>>385

FlexGridの方が素直ですか。

明日から考えてみます。

387デフォルトの名無しさん:2006/11/05(日) 20:34:30
よくわからない事態になっているので、どなたかご教授ください。

先日、フリーのCコンパイラを試そうといろいろ入れたんです。

@ Cygwin
A VisualC++2005ExpressEdition + Platform SDK
B Borland C++Builder

と、みっつ連続でインストールしたのですが、@のCygwinしか正常にコンパイルを行うことが出来ません。
ABどちらも解説サイトの手順に沿ってインストールを行い、全てデフォルトの位置に入れました。
環境変数の Path Include Lib への追記も済んでいるので問題なくコンパイルできなければいけないはずなのですが…
AのVCはMSVCR80.dllにまつわるエラーらしき警告がたくさん出て終了、BのBCCは大量のエラーがずらずらと流れて終了、というありさまです。

これらのコンパイラは共存できないものなんでしょうか?これでは使い勝手を試しようがありません。
OSはWindows2000SP4です。どなたか解決方法をご教授ください orz
388デフォルトの名無しさん:2006/11/05(日) 20:44:44
Cygwinが一番面倒な気がするんだが…
何をしてどんなエラーが出たか書いてもらわないことには何とも言えない
389デフォルトの名無しさん:2006/11/05(日) 21:06:57
390デフォルトの名無しさん:2006/11/05(日) 21:07:34
普通に動いてるが
391デフォルトの名無しさん:2006/11/05(日) 21:18:44
>>388
上記3件全てのコンパイル用ファイルが梱包されていたathenaというプログラムを比較用サンプルに使用しました。
Cygwinでは手順どおりに行えばコンパイルが完了してexeをちゃんと吐き出しました。
VC・BCC共に環境変数及びbatファイル内のPass・Include・Libそれぞれをインストール先に書き換え、
batのダブルクリックとコマンドプロンプトからの実行をそれぞれ行いました。
VCは「プロシージャ エントリ ポイント __security_error_handler がダイナミック リンク ライブラリ MSVCR80.dll から見つかりませんでした。」
という警告ウィンドウが連続発生して処理終了。BCCはE2000番台やW8000番台のエラーが数百行近く流れ続けて処理終了。
どちらも結局exeを吐き出すことはありませんでした。

とりあえず正常に動く環境にしたいのですが、どうすればよろしいでしょうか…
392デフォルトの名無しさん:2006/11/05(日) 21:18:53
C++再考を読んで勉強中なんですが
p84にある
int main()
{
  Expr t=Expr("*", Expr("-",5),Expr("+",3,4);
  cout << t << endl;

のExpr("*", Expr("-",5),Expr("+",3,4);
の部分がよくわかりません。
Exprは型名だと思うのですが
Expr hoge("*", Expr("-" 〜
ではなく
Exprのすぐあとに括弧で引数をわたしているのはどういうことなんでしょうか?
393デフォルトの名無しさん:2006/11/05(日) 21:22:03
>>391
まずコンパイラの動作確かめるならHello, Worldにしよう
394デフォルトの名無しさん:2006/11/05(日) 21:27:30
今日始めたての初心者なんですが
ttp://homepage3.nifty.com/mmgames/c_guide/p_bcc.html
に書いてあった

#include <stdio.h>
int main (void)
{
printf("Hello World\n");
return 0;
}

をコンパイルしてみたんですが、なんかいやっても
エラー E2209 ooo.c 1: インクルードファイル 'stdio.h' をオープンできない
になってしまいます・・・
<stdio.h>がおかしいって事はかろうじて分かったんですけど、どう対処すればいいのでしょうか?
395デフォルトの名無しさん:2006/11/05(日) 21:29:02
>>392
vector<Hoge> vi;
vi.push_back(Hoge(...));

名無しの一時オブジェクトができる
396デフォルトの名無しさん:2006/11/05(日) 21:50:02
テンプレに「初心者はBCC使用禁止」を追加すべきだな。
397392:2006/11/05(日) 21:56:37
>>395
今回の例のようなSTLに格納するわけではない場合
一時オブジェクトをつくるのにどんなメリットがあるんでしょうか?

Expr t("*",Expr("-",5),Expr("+",3,4));
と書いたほうがスッキリしていると思うんですが
398デフォルトの名無しさん:2006/11/05(日) 22:25:47
>>397
Cからある初期化構文を使うんで、理解されやすいかもしれない。その程度。
399デフォルトの名無しさん:2006/11/06(月) 00:06:49
>>397
どっちかって言ったらデメリットの方が大きい気がするなぁ
400デフォルトの名無しさん:2006/11/06(月) 14:24:44
>>374
デベロッパ側の勉強は工業高校の方じゃね?
401デフォルトの名無しさん:2006/11/06(月) 15:24:27
プログラムがexit()で終了(引数の値がおかしいと出る)するんですが、
終了している箇所がライブラリの奥深くで、どこの呼出が原因なのかまったく分かりません。
exit()で正常終了されてしまうのでgdbでwhereとかも出来ないんですが、
これを調べる良い方法はありませんでしょうか?
printfデバッグしかないんでしょうか。
402デフォルトの名無しさん:2006/11/06(月) 15:26:57
>>401
exitにブレークポイントしかけて実行して、bt
403デフォルトの名無しさん:2006/11/06(月) 17:29:32
free/deleteしたポインタに明示的にNULLを代入する行為ってのは
「free/deleteしたポインタを操作する危険な命令」ですか? 
404デフォルトの名無しさん:2006/11/06(月) 17:35:28
>>403
いいえ。
free/delete した後もそのポインタが指す内容を参照すること = 「free/deleteしたポインタを操作する危険な命令」
 delete p;
 *p = .... とか hoge = *p; 等

delete p; p=NULL; としておけば、上記 *p = ... 等で不正書き込みとして検出できる。
405デフォルトの名無しさん:2006/11/06(月) 17:42:44
サンクス
406デフォルトの名無しさん:2006/11/06(月) 21:30:51
>検出できる。
とは限らない。
407デフォルトの名無しさん:2006/11/06(月) 23:14:07
>>403
「変数」と「値」の違いを理解すること
408デフォルトの名無しさん:2006/11/07(火) 00:01:59
class hoge
{
public:
  hoge()
  {
    cout << "test" << endl;
  }
};
上のようなクラスを定義して
int main()
{
  hoge hoge1;
  hoge hoge2();

  return 0;
}
とやるとhoge1のときだけコンストラクタが呼ばれるみたいなんですが
どうしてhoge2のときはコンストラクが呼ばれないでしょうか?
409デフォルトの名無しさん:2006/11/07(火) 00:08:49
>>408
> hoge hoge2();
引数を取らずhoge型を返す関数hoge2の宣言。
410デフォルトの名無しさん:2006/11/07(火) 00:29:00
>>409
よくわかりました。ありがとうございます
411デフォルトの名無しさん:2006/11/07(火) 00:57:41
STL標準講座を読んでいたらp37に

bool isEven(int i)
{
   return !(i%2);

   return false;
}

というコードがあったんですが
下のreturn false;が実行される事はあるんでしょうか?
412デフォルトの名無しさん:2006/11/07(火) 01:06:58
決してない
そんな本投げ捨てろ
413デフォルトの名無しさん:2006/11/07(火) 01:15:27
その本ひでぇw
414デフォルトの名無しさん:2006/11/07(火) 01:20:58
まあ誤植の1個くらいでそこまでたたかなくても
415デフォルトの名無しさん:2006/11/07(火) 01:35:05
C++で一つ質問。プログラム上でBATを叩いて、そのBATが吐き出した結果を
取得する方法ってあるかな? たとえばdirで出したディレクトリ構造とかとか。
416デフォルトの名無しさん:2006/11/07(火) 01:49:15
標準出力をパイプかなんかで受けて
CMD.EXEを起動して引数に渡せばいいんじゃね?
417デフォルトの名無しさん:2006/11/07(火) 02:26:26
>>415
popen
418デフォルトの名無しさん:2006/11/07(火) 02:39:02
つ[popen()]
419デフォルトの名無しさん:2006/11/07(火) 02:51:46
>>374
商業出身でも工業出身でもないが、ハードや仕組み、(工業高校のみ)BASIC(VBA)は今の高校の情報の教科書に乗っている。
ただ睡眠学習しているだけ。
420デフォルトの名無しさん:2006/11/07(火) 06:15:40
質問:デバッグ時の検討の付け方について

vc2005EEで C/C++ プラットフォームSDK win32アプリケーション を使い
ある処理をするHOGEクラスのみを書いた cpp と h を用意し
ライブラリのように使おうと思いました。

ある程度プログラムを書きデバッグをしクラスの情報を見ると
コンストラクタを呼び出す前にゴミの様な情報が
渡されている事に気が付きました。

デバック画面で
class名 {メンバ変数名 = [アドレス]"ゴミ文字"} となっていました。

どうも、ファイル内でHOGEクラスを HOGE hoge と書いた回数分だけ
ゴミ文字が付いてしまっているようです。
さらに困った事に、このゴミ文字の分だけアドレス(?)も
ずれてしまっているようです。

例えば、ZeroMemory() を使い char型のメンバ変数 moji を初期化仕様とすると
moji[0] = "@"
moji[1] = "□"
moji[2] = "."
moji[3] = "0"
moji[4] = "0"
moji[5] = "0"
moji[6] = "0"
と、なったり
421420:2006/11/07(火) 06:17:09
moji に文字列 abc を入れようとすると
moji[0] = "@"
moji[1] = "□"
moji[2] = "."
moji[3] = "0"
moji[4] = "a"
moji[5] = "b"
moji[6] = "c"
と、なってしまいます。


HOGE hogeをファイル内で一度のみ使うようにすると一応正常に動くようで
class名 {メンバ変数名 = [アドレス]""} となっていました。
そこで、問題の箇所を確かめようと、別にHOGEクラスのファイルを付けただけの
プロジェクトファイルを作り、HOGE hoge を複数の関数で使ってみたのですが
正常に動いてしまいました。
どうやら、問題の起こっているプロジェクトの方で何か不味い事をしてしまった様だ
という事は分かるのですが、そこから先の検討の付け方が分かりません。
422デフォルトの名無しさん:2006/11/07(火) 06:40:37
長文ダラダラ書かずにコード示しなよ
423415:2006/11/07(火) 07:29:56
ありがとう!やってみます!
424デフォルトの名無しさん:2006/11/07(火) 14:22:14
質問です。
とてもサイズが大きいクラスBigAがあったとします。
で、vectorみたいなコンテナを作ったとして
vector<BigA> bigAvec;
BigAオブジェクトをどんどん格納していきたいんですが
bigAvec.pusu_back(BigA());
ってやると、BigAが重たいコンストラクタで生成されて、
さらにpush_backされる時にコピーコンストラクタでコピーされますよね。

いきなりvector内のコンテナの中でBigAオブジェクトを生成したりとかできないんでしょうか。
425デフォルトの名無しさん:2006/11/07(火) 14:31:49
できない
426デフォルトの名無しさん:2006/11/07(火) 14:32:47
>>424
ポインタ格納すれば?
427デフォルトの名無しさん:2006/11/07(火) 15:57:47
>>426
連続したメモリにbigAオブジェクトを隙間無く並べたいという都合があるので、
ポインタ格納はやりたくないんです・・・。
あるいは、普通の配列にbigAオブジェクトを格納して並べて、
それらへのポインタをvectorとして管理すればいいんでしょうか。
428デフォルトの名無しさん:2006/11/07(火) 16:30:28
424です。
今思いつきましたが、
BigAのメンバ変数を全てpublicにしてしまえば、
vector<BigA> bigAvec(1000);
bigAvec[0].valueA = 9.9; //BigAのメンバ変数
bigAvec[0].valueB = 2.9;
.....

のようにすれば>>424のボトルネックは解消できますよね。
あ、でもこの場合、
vector<BigA> bigAvec(1000);
でBigAのデフォルトコンストラクタが呼ばれるのでしょうか?
429デフォルトの名無しさん:2006/11/07(火) 17:24:39
呼ばれる
430デフォルトの名無しさん:2006/11/07(火) 18:22:25
fputc(fgetc(fp),fp)

fgetcでfpの指示位置が遷移して、fputcで書き込まれる?
それとも
まるっきりコピー?
431デフォルトの名無しさん:2006/11/07(火) 18:42:34
引数の評価順って環境依存じゃなかったっけ?
432デフォルトの名無しさん:2006/11/07(火) 18:47:23
評価順は関係ないと思われ
433デフォルトの名無しさん:2006/11/07(火) 18:49:28
printf("a",printf("b"),printf("c"),printf("d"));
これってどうなる?
434デフォルトの名無しさん:2006/11/07(火) 18:52:18
>>433
dcba
WinXP BCC 5.51
435デフォルトの名無しさん:2006/11/07(火) 19:08:25
436デフォルトの名無しさん:2006/11/07(火) 19:44:42
>>430
間にseek系挟まずにread系,write系はアウト
437デフォルトの名無しさん:2006/11/07(火) 20:24:41
>fputc(fgetc(fp),fp)
fgetcがfputcより先に呼ばれるのは確実だからfgetcでポインタが進んでからfputcで書き込まれるだろ
もしかして俺、勘違いしてる?
438デフォルトの名無しさん:2006/11/07(火) 20:33:31
>>433
dcba
WinXPSP2 VC6SP6
439432:2006/11/07(火) 20:35:35
>>435
漏れそんなに恥ずかしいこと書いたか?
440デフォルトの名無しさん:2006/11/07(火) 21:04:52
fpはポインタなんだから問題ないんじゃね?
441デフォルトの名無しさん:2006/11/07(火) 21:17:16
>>440
>436
442430:2006/11/07(火) 21:19:18
int a;
a=fgetc(fp);
fseek(fp, -1, SEEK_CUR);
fputc(a,fp):

正直にこうした方がいいのかな
443デフォルトの名無しさん:2006/11/07(火) 21:26:40
何がしたいのかわからない
444デフォルトの名無しさん:2006/11/07(火) 22:39:37
C++の演算子のオーバーロードに関してなのですが、
演算子の左辺側の値を取得しようとしたら
クラス定義の際に使えるthisポインタ以外に方法はありませんよね?
445デフォルトの名無しさん:2006/11/07(火) 22:43:33
別にメンバ関数でオーバーロードしなくてもいいだろ。
446デフォルトの名無しさん:2006/11/08(水) 17:34:13
main関数のプロトタイプ宣言はするべきですか?
447デフォルトの名無しさん:2006/11/08(水) 18:46:37
何の為にプロトタイプ宣言するのか理解してる?
448デフォルトの名無しさん:2006/11/08(水) 20:10:15
>>447
関数の戻り値・名前・引数をあらかじめ宣言しておき、
呼び出される以前に関数の内容が定義されていなくてもいいようにするため。
と自分では理解しています。

main()は必ず最初に呼び出されるので書かなくてもいいんですよね?

http://www1.cts.ne.jp/~clab/index.html
このサイトではmain()のプロトタイプ宣言をしていたので不思議に思い質問しました。
449デフォルトの名無しさん:2006/11/08(水) 20:24:05
なんでこれぐらいのことコンパイラというかプリプロセッサというかどっちでもいいけど
普通に関数本体のところのプロトタイプ宣言に当る部分を読んでくれないのかね?
何でわざわざユーザーに書かすのかが分からん
450デフォルトの名無しさん:2006/11/08(水) 20:46:21
コンパイラの負担減らす為じゃなかったっけ?
上から1回だけスキャンすればいいから。
451デフォルトの名無しさん:2006/11/08(水) 20:52:52
でも関数内部見なくていいんだよ
そのためだけに1回スキャンしても一瞬で終わるじゃん
452デフォルトの名無しさん:2006/11/08(水) 20:54:54
すみません、ほとんどプログラムをしたことないのに、
仕事でプログラムをしなくてはいけなくなりまして。
VC6.0でプログラムされたものを改造しています。

関数の途中でアプリケーションを終了する方法を探しています。
exitやabortだとアプリケーションがフリーズした状態になるだけでした。
終了するコマンドってありますか?

すみませんが、どなたか教えてください。
453デフォルトの名無しさん:2006/11/08(水) 21:05:38
>>451
ソースがスキャンしたくないくらいに長いとき、ソースとヘッダを
分離するメリットくを考えるとそういう仕様になってるのが納得できるよ。
454デフォルトの名無しさん:2006/11/08(水) 21:08:08
昔のコンパイラは非力でした、でOK?

>453
言いたい事はわかるが、コンパイラがスキャンしたくないようなレベルの長さってどうよ
455デフォルトの名無しさん:2006/11/08(水) 21:12:02
v = ClassAのメンバ変数のClassB の実体

ClassA::ClassA (ClassB* p) : v( p)
{
 ……
}

本に載ってたサンプルでこんなのがあったんですけど
これってどういう構文なんでしょうか。
継承ではなさそうだし、デフォルト引数でもないし。
456デフォルトの名無しさん:2006/11/08(水) 21:20:46
コンストラクタでちゅね。
引数としてClassBへのポインタを取り、vにそれを代入する
457デフォルトの名無しさん:2006/11/08(水) 21:23:39
なるほど、こういう書き方もできるんですね。
ありがとうございます。
458デフォルトの名無しさん:2006/11/08(水) 21:24:49
代入じゃなくて初期化だろ
459デフォルトの名無しさん:2006/11/08(水) 21:37:53
初期化リストって奴だな
460デフォルトの名無しさん:2006/11/08(水) 22:16:12
>>454
関数定義が必ずしも同じソース内に無くていいってのもあるんじゃない?
aaa.cから呼び出している関数定義がbbb.cにあるとき、
aaa.cのコンパイルでbbb.cまでスキャンしなきゃならないなんてコンパイラには知りようがない。

461デフォルトの名無しさん:2006/11/08(水) 22:48:43
>>452
非MFCのウィンドウアプリケーションならメインのウィンドウへWM_CLOSEをSendMessageで送る。
ウィンドウを表示しないアプリケーションならexitで問題ないはず。
MFCは知らない。
462デフォルトの名無しさん:2006/11/08(水) 23:14:37
でもプロトタイプなくてもコンパイル通るよね
463デフォルトの名無しさん:2006/11/09(木) 03:23:21
>>462
警告出てないか?
もしくは警告レベルを低く設定していないか?
464そうべえ:2006/11/09(木) 07:29:06
かなり素人ですが、教えてください。
(Visual C++ 2005 Express Edtを使っています)
↓のエラーが出ます。(プログラムの★印)

--- ビルド開始: プロジェクト: Date01, 構成: Debug Win32 ---
InitAsign.cpp
d:\initasign.cpp(14) : error C2228: '.Year' の左側は
クラス、構造体、共用体でなければなりません
d:\initasign.cpp(14) : error C2228: '.Month' の左側は
クラス、構造体、共用体でなければなりません
d:\initasign.cpp(14) : error C2228: '.Day' の左側は
クラス、構造体、共用体でなければなりません
Date.cpp
Date01 - エラー 3、警告 0
465そうべえ:2006/11/09(木) 07:30:47
プログラムは、
Date.h@とInitAsign.cppAとDate.cppBです。
よろしくお願いします!
/*@■■■Date.h■■■*/
class Date {
int year; // 西暦年
int month; // 月
int day; // 日
public:
Date(); // デフォルト
Date(int y, int m, int d); // コンストラクタ
int Year() { return year; } // 年を返却
int Month() { return month; } // 月を返却
int Day() { return day; } // 日を返却
};
466そうべえ:2006/11/09(木) 07:32:09
/*A■■■InitAsign.cpp■■■*/

#include <iostream>
#include "Date.h"
using namespace std;

int main()
{
Date x(); // テスト

cout << "X = "
<< x.Year() << "年" << x.Month() << "月" << x.Day() << "日\n";

return 0;
}

467そうべえ:2006/11/09(木) 07:33:08
/*B■■■Date.h■■■*/
#include "Date.h"

//--- コンストラクタ ---//
Date::Date(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
//--- デフォルトコンストラクタ ---//
Date::Date()
{
year = 1;
month = 1;
day = 1;
}
以上です。(「改行が多すぎます!」ってのが出たため分割しました)
468デフォルトの名無しさん:2006/11/09(木) 07:48:40
469そうべえ:2006/11/09(木) 08:18:47
>>468
>>408の方のように、理解できません。
  hoge hoge1;  → 正しい
  hoge hoge2(); → 間違い
ということでしょうか?
括弧は必要だと思うのですが...
470デフォルトの名無しさん:2006/11/09(木) 08:19:52
Date x;
あるいは
Date x = Date();
471デフォルトの名無しさん:2006/11/09(木) 08:22:38
>>469
だから後者は関数の宣言だろうがカス。
472そうべえ:2006/11/09(木) 08:40:59
わかりました。
473デフォルトの名無しさん:2006/11/09(木) 09:55:26
474デフォルトの名無しさん:2006/11/09(木) 14:01:37
>>469の書きたかった事をエスパー分析してみる。

hoge* hoge1 = new hoge;



hoge* hoge2 = new hoge();

の違いを知りたかったのか。
PODかそうでないかで、前者と後者の動きが違う。

PODの時は前者は領域を確保するのみ、後者は0フィルされる。
PODでない時は前者と後者で差はない。デフォルトコンストラクタが呼び出される。
475デフォルトの名無しさん:2006/11/09(木) 14:15:21
>>474
エスパーする前にちゃんと前後のレスを読め
476デフォルトの名無しさん:2006/11/09(木) 15:28:29
int function(i,j)
int i;
int j;
{
if( i == j ){
return i + j;
}
}

main( void ){
int k = function(1,2);
printf( "function() = %d" , k );
}

古い書き方で申し訳内が、こんな感じのプログラムを流した場合
function() = 0
って表示されるんだがこれって0が保障されてる?
イマイチ、アセンブラの知識が乏しくてorz..
まぁ、そもそも、バグに保障も糞もないが・・・

ちなみに環境はAIXでVisualAge C++のバージョン6
477デフォルトの名無しさん:2006/11/09(木) 15:39:53
仕様では無保証。
コンパイラの吐き出すアセンブラ次第だろうね。
if 内部の等価比較のコードに左右されそうに思う今日このごろ
478デフォルトの名無しさん:2006/11/09(木) 15:42:05
>>476
returnがないときに何が戻るかと言う質問と言うことで宜しいか?
だとしたら、x86用の私の知っているコンパイラなら0になることは先ず有り得ない。
勿論1になるか2になるか、或いは他の何が戻されても不思議ではないが。
479デフォルトの名無しさん:2006/11/09(木) 15:55:49
レスサンクス

478
そうそうreturnで値を返してない時の動作ッス

ふむ、やっぱり不定値って事だよねぇ
480デフォルトの名無しさん:2006/11/09(木) 16:36:55
プログラム実行してたら、ループの途中で
killed
って表示されてそこで止まったんですが、これは何なんでしょうか?
ぐぐってもわからなかったorz
481デフォルトの名無しさん:2006/11/09(木) 17:35:57
環境をかいてくだはい。
482デフォルトの名無しさん:2006/11/09(木) 19:48:28
http://devpaks.org/details.php?devpak=144
これはdev-cpp用mingのincludeとlibファイルがパッケージになっているものですが
怪しいブツだと思います。
使い方解る方いらっしゃいますか?
483デフォルトの名無しさん:2006/11/09(木) 21:39:33
Windows XP SP2でVisual Studio Express Edition C++を使っています。
.NET無しで作りたかったので、「共通ランタイムサポート」を
「共通言語ランタイム サポートを使用しない」に設定したところ、
「error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。」
みたいなエラーがたくさん出力されました。
「共通ランタイムサポート」を「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」にすると、
正常にコンパイルできることは確認しております。PSDKもインストールしております。
どなたかスレ違いでなければ、どうすればコンパイルエラーをなくすことができるか教えていただけませんでしょうか?
484デフォルトの名無しさん:2006/11/09(木) 21:41:38
>>483
System が含まれている共通言語ランタイムのサポートを使用するといいよ。
485デフォルトの名無しさん:2006/11/09(木) 21:45:25
>>484
そうですか…
どうもありがとうございました。
486デフォルトの名無しさん:2006/11/09(木) 21:59:37
managedとunmanagedで調べるといいと思うよ
487デフォルトの名無しさん:2006/11/10(金) 01:03:10
>485
名前空間Systemにあるものは全て.NET Frameworkのクラスライブラリ。
.NET無しで作るとは、これらを全く使わないということ。
(名前空間Microsoft以下も同様)
488デフォルトの名無しさん:2006/11/10(金) 06:03:29
>>476
eaxレジスタにごみが入っていればごみが戻り値になる
489デフォルトの名無しさん:2006/11/10(金) 06:51:50
>>488
AIXだからx86系のCPUとは限らんのとちゃう?
490デフォルトの名無しさん:2006/11/10(金) 07:11:11
戻り値が返ってこない場合があると言われるんじゃ
491デフォルトの名無しさん:2006/11/10(金) 11:01:46
Fedora Core5でgccを使ってプログラムを書いています。
fprintfでファイルに書き込む際に、OSの書き込みバッファは使われるのでしょうか?
それとも、バッファを自分でプログラムする必要があるのでしょうか?
あるいは、これは、OSに依存するのでしょうか?

一文字ごとに出力するのと、100文字まとめて出力するのでは、
処理速度に大きな違いが出るので、自作プログラムから書き込みバッファがどのように使われるのか知りたいのですが。
492デフォルトの名無しさん:2006/11/10(金) 11:26:34
>>491
setbuf, fflush を調べてみよう
493デフォルトの名無しさん:2006/11/10(金) 22:20:13
どっちかというとprintfのオーバヘッドじゃないかなあ。
まずはfputc,fputs,fwriteあたり試したほうがいいような。
494デフォルトの名無しさん:2006/11/10(金) 22:34:49 BE:279569478-2BP(204)
fprintfのオーバーヘッドなんてたいしたことないんじゃないの?
試したことないけど。
495デフォルトの名無しさん:2006/11/11(土) 00:54:55
#define MAX 256
int _tmain(int argc, _TCHAR* argv[])
{
wchar_t* t[MAX];
for(int i=0; i<10; i++)
{
wchar_t buf[MAX];
swprintf_s( buf, MAX, L"test%d",i);
t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
wcscpy(t[i] ,buf);
}
for(int i=0; i<10; i++)
printf("%s\n",*(t+i));
getchar();
return 0;
}
test0,test1,test2...と表示させたいんですが、
頭の一文字目しか表示されません。何を間違えてるんでしょうか・・・?
496デフォルトの名無しさん:2006/11/11(土) 01:13:35
locale 関係の問題じゃない?
497デフォルトの名無しさん:2006/11/11(土) 01:55:49
wchar_t* t[10];
for(int i=0; i<10; i++)
{
wchar_t buf[MAX];
swprintf_s( buf, MAX, L"test%d",i);
t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
t[i] = buf;
}
for(int i=0; i<10; i++)
wprintf(L"%s\n",t[i] );
getchar();

上手く行ったと思ったんですが、全部test9でした。
t[i]に入れてるのに、なぜ全部の要素に一つのアドレスが
入ってしまうのでしょうか?
498デフォルトの名無しさん:2006/11/11(土) 02:25:13
t[i] = buf;

wcsncpy(t[i],buf,MAX);

とか
499デフォルトの名無しさん:2006/11/11(土) 03:29:58
見事解決しました。
ありがとうございました。
wchar_t* t[10];
for(int i=0; i<10; i++){
t[i] = (wchar_t*)calloc(MAX,sizeof(wchar_t));
swprintf_s( t[i], MAX, L"test%d",i);
}
for(int i=0; i<10; i++)
wprintf(L"%s\n",t[i] );

でもなんで>>497 は失敗するんでしょうか?
t[i] = bufがt[0-9]=bufになる理由がわからない。
ポインタ難しい。
500デフォルトの名無しさん:2006/11/11(土) 03:30:54
>t[i] = buf;

こんなん書いてりゃ当たり前じゃん
501デフォルトの名無しさん:2006/11/11(土) 09:48:11
wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t*));
for(int i=0; i<10; i++)
{
wchar_t* buf;
buf = (wchar_t*)calloc(MAX,sizeof(wchar_t));
t = (wchar_t**)realloc(t,sizeof(wchar_t**)*(i+1));
swprintf_s( buf, MAX, L"test%d",i);
t[i] = buf;
}
for(int i=0; i<10; i++)
wprintf(L"%s\n",t[i] );
free(t);
getchar();
return 0;
できました。
ノートにひたすら図形書きながらぽちぽちと・・・・。
ちょっと悲しくなりました。

>>500
なぜですか?
502デフォルトの名無しさん:2006/11/11(土) 10:10:00
コンパイラ : VC++2005
class foo{
static const int var0=1000;
static const double var1=0.123;//コンパイルエラー
};

なぜ整数型しか初期化してはいけないんですか。
503デフォルトの名無しさん:2006/11/11(土) 10:12:06
コンパイルエラーの内容は?
504デフォルトの名無しさん:2006/11/11(土) 10:19:47
> for(int i=0; i<10; i++)
> {
> wchar_t buf[MAX];
> swprintf_s( buf, MAX, L"test%d",i);
> t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
ここでt[i]に動的確保した領域のポインタを代入する
> t[i] = buf;
しかしここでbufへのポインタを代入する。動的確保した領域は迷子。
やりたいのはt[i]の指す領域にbufの内容をコピーしたいんだろ?
> }
さらにブロックを抜ける。bufの記憶域期間終了。しかしそれを参照しつづけるt[]。ぃゃん

つーか>>501はまったく出来てないよ。
505デフォルトの名無しさん:2006/11/11(土) 10:19:57
>>497

>t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
>t[i] = buf;

もしかして、mallocで確保した領域にbufの内容をコピーしているつもりか?
上の式ではそんなことをしていない。
mallocで確保した領域のアドレスはt[i]にいったん格納しているが、
そのあとに、それをすててbufのアドレスで上書きしているだけ。

ついでに言うと、bufはfor文のブロックの中で宣言されている。
for分のブロックを抜けたあとには参照してはいけない。
参照しても、以前自分が設定していた値が入っているとは限らないし、
更新すれば他で使用しているメモリ領域を壊すことになる。
全部test9が入っていたのはたまたま10階のループですべて同じ領域を指しており、
最後にループを抜けたとあとにもそこが壊されていなかっただけ。

506デフォルトの名無しさん:2006/11/11(土) 10:22:07
>>503
エラー : C2864
整数型は初期化できてもそれ以外が初期化できないのはどうしてだろうという疑問。
507デフォルトの名無しさん:2006/11/11(土) 10:36:49
>>506 ふーん。g++(gcc) では通るけどなあ。
508デフォルトの名無しさん:2006/11/11(土) 10:43:31
VC2005特有の仕様なのか・・・
509デフォルトの名無しさん:2006/11/11(土) 10:48:46
>>507
-pedantic つけると通らない。
あとVC6だとintもダメ。
510507:2006/11/11(土) 12:03:40
なるほど ISO C++ が非int の初期化を認めてないのね。
さんくす。
511デフォルトの名無しさん:2006/11/11(土) 12:10:55
技術的な問題ではなく、単なる技術的な部分に依存しない仕様?
512デフォルトの名無しさん:2006/11/11(土) 12:13:25
タイトルに初心者歓迎と入れてるくせに
本当に初心者来たらからかって終わりじゃん
プログラマとここの回答者はみんな死ねばいいのに
513デフォルトの名無しさん:2006/11/11(土) 12:24:01
グフ。
上手く行ったと思って眠りについたら、
朝見直してみて全然上手く行ってないことに気付きました。
>>504>>505
そうですね。いろいろいじってる内にわけわからなくなってました。。。
もう一度考えてみてこんな感じかなと思ったんですが、どうでしょう。

wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t**));
for(int i=0; i<10; i++)
{
t[i] = (wchar_t*)calloc(MAX,sizeof(wchar_t));
swprintf_s( t[i], MAX, L"test%d",i);
}
for(int i=0; i<10; i++)
{
wprintf(L"%s\n",t[i] );
}
表示はちゃんとされますが、free(t)とかfree(t[i])とかすると落ちます。
やはり最初の一行目は間違ってるんでしょうか。
でもこれをつけないと表示にすら届きません。
514デフォルトの名無しさん:2006/11/11(土) 13:08:12
10個だって分かってるのに何でmalloc使ってんだよ。
しかも1個だけしか確保してないし。
515デフォルトの名無しさん:2006/11/11(土) 15:25:19
>>512
初心者のうち、やる気があり且つそれが文章から伝わる場合のみ歓迎。
516デフォルトの名無しさん:2006/11/11(土) 17:49:02
ていうか別に「からかって終わ」ってないし。
すぐ下で「初心者」がちゃんと会話を成立させてるあたり
512のピエロっぷりが際立っててグー。
517デフォルトの名無しさん:2006/11/11(土) 21:00:10
t[i] と *(t+i) は等価値なんだ。ポインタにとってはね。
518デフォルトの名無しさん:2006/11/11(土) 21:23:59
>>506
俺はこう思っている。
そもそも導入されたきっかけが、#defineの置き換えを意図しているため。
だから、整数型さえその場で定義できれば十分だ(実際そうなっている)。
519デフォルトの名無しさん:2006/11/11(土) 21:32:23
>>518
#define による定数の定義は浮動小数点型でも文字列リテラルでも可能だったわけだが。
520デフォルトの名無しさん:2006/11/11(土) 21:37:30
M_PIとかISO C++だとどうしてるの?
521デフォルトの名無しさん:2006/11/11(土) 21:45:59
bool func(){
#ifdef DEBUG
if(hoge)
return false;
#endif
return true;
}

int main(){
if(func())
hogehoge;
}

このような関数の場合、DEBUGが定義されていない時は、
最適化されてfunc自体が呼び出されないことを期待できるのでしょうか?
522デフォルトの名無しさん:2006/11/11(土) 21:49:17
#ifdef DEBUG
#define func() (!hoge)
#else
#define func() true
#endif
のほうが最適化してくれる可能性が高そう
523デフォルトの名無しさん:2006/11/11(土) 21:51:50
>>521
期待はできる。
524デフォルトの名無しさん:2006/11/11(土) 22:01:47
>>520
ISO C++ に M_PI は定義されていません。
とりあえず #define が削除されたわけじゃないんで、
C で定義されていた定数は互換性のためにそのまま
残っています。

"Standard value" とされて "Standard macro" とは
分離されているので、マクロとするかどうかは処理系が
自由に決めていいのかもしれません。
525デフォルトの名無しさん:2006/11/11(土) 22:01:50
>>522-523
レスありがとうございます
とりあえず>>522の方法でいってみようと思います
526デフォルトの名無しさん:2006/11/11(土) 22:39:51
>>513
t[0]〜t[9]に値を格納したいなら、tは10個分の(wchar_t*)が格納できるサイズで確保すること。
freeで落ちたのは、t[1]〜t[9]に書き込んだ際に、壊してはいけない領域を壊したため。
527デフォルトの名無しさん:2006/11/11(土) 23:37:41
Windows2000、VC++7、Unmanagedでやってます
switchの動作が理解不能な動作してて困ってるんですが

switch(hoge) {
  case 値A
    式A
    break;
  case 値B
    式B
    break;
  case 値C
    式C
    break;
  case 値D
    式D
    break;
  default:
    式E
    break;
}

こうしてデバッグで追ったところ、hogeの値が値Bなのにも関わらずdefaultに跳んでました
なんでcase 値Bに行かないんでしょう?
528デフォルトの名無しさん:2006/11/11(土) 23:49:32
>>527
hogeの値は本当にBか?
まさかhogeとかBが文字列だったりしないよな
529デフォルトの名無しさん:2006/11/11(土) 23:50:06
コロンは?
530デフォルトの名無しさん:2006/11/11(土) 23:52:08
>>528
Bです
値Bは0x8002で、hogeはshort型で中身も0x8002なのデバッガで確認しました


>>529
省いてますが
元の文にはちゃんと書いてます
531デフォルトの名無しさん:2006/11/11(土) 23:56:25
値Bは、直で 0x8002 って書いてる? それともなんかの変数? 変数なら型は?
532デフォルトの名無しさん:2006/11/12(日) 00:03:32
>>513
#include <stdio.h>
#include <stdlib.h>
#define N 10
#define MAX 20
int main(void) {
    int i;
    wchar_t** t = (wchar_t**)malloc(sizeof(wchar_t*) * N);
    for(i = 0; i < N; i++) {
        t[i] = (wchar_t*)malloc(sizeof(wchar_t) * MAX);
        swprintf_s(t[i], MAX, L"test%d", i);
    }
    for(i = 0; i < N; i++) {
        wprintf(L"%s\n", t[i]);
    }
    for(i = 0; i < N; i++) {
        free(t[i]);
    }
    free(t);
    return 0;
}
533デフォルトの名無しさん:2006/11/12(日) 00:05:06
>>531
#define HOGE 0x8002
で、case HOGE: というような定数式で書いてます
534デフォルトの名無しさん:2006/11/12(日) 00:06:05
short が 16bit だと 0x8002 という値は -32766 として解釈される。
一方、0x8002 と書くと int なので 32770 として解釈される。
従って異なる値として処理される。

hoge を unsigned short にすれば解決するはず。
535デフォルトの名無しさん:2006/11/12(日) 00:07:23
あ、なるほど
ということは、「#define HOGE ((short)0x8002)」でもいけそうですね

どうもありがとうございました
536デフォルトの名無しさん:2006/11/12(日) 01:21:45
unsigned shortだって言ってるだろカス
537デフォルトの名無しさん:2006/11/12(日) 08:26:00
unsigned shortにするといいのはswitchに渡す変数の方だろ
というか、片方がsigned intで処理されてるのにunsigned shortで値だけ無理やり合わせるのは良くない
そんなことをすれば、定数値が0xffffを越えた時に絶対に一致しなくなる

>>535のは定数値の方を変数と同じsigned shortに合わせるから値範囲の違いが是正できて現実的

少しは頭使えよカス
538デフォルトの名無しさん:2006/11/12(日) 10:18:57
537のほうがカスに一票
539デフォルトの名無しさん:2006/11/12(日) 10:50:34
switch-caseの判定値を不安定な型で処理するほうがどうかしてる。
「unsigned」で統一するのが常ってもんだろ
540デフォルトの名無しさん:2006/11/12(日) 11:13:40
不安定か?
541デフォルトの名無しさん:2006/11/12(日) 12:11:07
doubleとfloatを混ぜた式では、doubleだけの式よりも速度が落ちますか?
542デフォルトの名無しさん:2006/11/12(日) 13:03:01
一文字だけcharに格納する場合は、
char x[]={'a','b','c'};
ですが、同じように、文字列{"abc","def","ghi"}を格納するにはどのように書けばよいのでしょうか?
543デフォルトの名無しさん:2006/11/12(日) 13:09:59
char* x[]={"abc","def","ghi"}
544デフォルトの名無しさん:2006/11/12(日) 14:17:59
>541
一般論では「そうかもしれない」。具体的な環境も書かずに正しい回答が得られると思ったら大間違い。
545デフォルトの名無しさん:2006/11/12(日) 20:05:26
>>541
型変換してるので理論上は落ちるはず。自分で確認してみては?
546デフォルトの名無しさん:2006/11/12(日) 21:01:39
gets(nyuryoku);
if(nyuryoku[0] == '+')
{・・・

という風に、if文での比較対象が半角文字だとこれでいいのですが、
2バイト文字を比較対象にしようと思ったらどうすればいいのでしょうか。
2バイトなのだから

if(nyuryoku[0] == 'あ')

とかじゃいけないってことはわかるのですが・・・。
547デフォルトの名無しさん:2006/11/12(日) 21:09:58
nyuryoku の型は?
548デフォルトの名無しさん:2006/11/12(日) 21:13:35
>>547
char型です。
char nyuryoku[30];
にしてます。
549デフォルトの名無しさん:2006/11/12(日) 21:20:20
strncmp(nyuryoku, "あ", 2) == 0

550デフォルトの名無しさん:2006/11/12(日) 21:34:17
w_char使えばいいと思うよ
551デフォルトの名無しさん:2006/11/12(日) 21:36:30
>>550
なにそれ? 聞いたことないな。
552デフォルトの名無しさん:2006/11/12(日) 21:48:29
C++ です. 以下のような擬似コードについて教えていただきたいと思います。

class A : public B {}
class B : public C {}

void func( boost::shared_ptr<C> val ) {
...
}

void main() {
boost::shared_ptr<C> a( new A() );
boost::shared_ptr<C> b( new B() );
func( a );
func( b );
}

は問題ありませんが,
=================================================
void main() {
boost::shared_ptr<A> a( new A() );
boost::shared_ptr<B> b( new B() );
func( a );
func( b );
}

は型が違うとコンパイルが通りませんでした.
これを問題のないものにするにはどうしたらよいでしょうか?
553デフォルトの名無しさん:2006/11/12(日) 22:00:55
>>552
boost::shared_dynamic_cast だったかな
554デフォルトの名無しさん:2006/11/12(日) 22:10:23
>>552
クラス設計を見直すとよい。
555デフォルトの名無しさん:2006/11/12(日) 22:31:39
デザインパターンを解説した良書を教えて下さい´・ω・`
言語はC++でなくてもokです。。
556デフォルトの名無しさん:2006/11/12(日) 22:39:20
C言語の質問です。

main関数であるファイルX.txtのfopen(),fclose()を行ったとします。
この場合、main関数内で呼び出した関数a()内では、ファイルX.txtに関してfprintf()やfscanf()を行うのは無理なのでしょうか??

というのは、main関数内で呼び出すべき関数が複数あり、また何度も関数を呼び出すので、
そのそれぞれでfprintf()等を使おうとfopen(),fclose()を記述してしまうと、ファイルのオープンとクローズを繰り返すことになるからです・・・

何か良い方法はありませんか?よろしくお願いします。
557デフォルトの名無しさん:2006/11/12(日) 22:44:06
fopenの戻り値を関数に渡しゃええじゃん
558556:2006/11/12(日) 23:07:30
>>557

int main(void)
{
 void a();
 char filename[256];
 FILE *fp;

 scanf("%s",filename);
 fp = fopen( filename, "w" );
 
 a(); 

 fclose(fp);
}

このような場合、fopenの戻り値とはfpのことでしょうか?
a(fp);のようにfpを引数として渡せばいいのでしょうか?
559デフォルトの名無しさん:2006/11/12(日) 23:08:41
>>558
何か不満か?
560デフォルトの名無しさん:2006/11/12(日) 23:29:42
外部変数のように複数の関数から引数無しで直接扱える方法は無いかなと勘違いしていただけです。
答えてくださった方、どうもありがとうございました。
561デフォルトの名無しさん:2006/11/12(日) 23:33:22
じゃあ外部変数にしたらいいんじゃね?
562556:2006/11/12(日) 23:45:51
560は私です。名前抜けてすみませんでした。

561さん、ありがとうございます。
FILE *fp;の一文だけをヘッダに移動させれば、main関数内でfopen()させても、引数を一つ一つ渡さなくても可能となるのでしょうか?
563デフォルトの名無しさん:2006/11/12(日) 23:57:03
なるよ
564556:2006/11/13(月) 00:04:34
>>563 どうもありがとうございました。これでファイル操作について一つ上達できました。
    疑問を解消してもらえる、このようなスレは大変ありがたいです。またの時もよろしくお願いします。
565デフォルトの名無しさん:2006/11/13(月) 00:09:36
グローバル変数使って解決するのは上達って言えないね。
566556:2006/11/13(月) 00:16:21
>>565 何度も顔を出してすみません。
ほかにも良い方法があるのでしょうか?差し支えなければ教えていただきたいです・・・
567デフォルトの名無しさん:2006/11/13(月) 00:21:44
568デフォルトの名無しさん:2006/11/13(月) 00:22:31
無限ループって怖くね?
569デフォルトの名無しさん:2006/11/13(月) 00:26:16
グローバル変数が嫌われる理由って
名前がぶつかる可能性があるから?
メモリ上?にずっと残ってるから?
570556:2006/11/13(月) 00:28:41
>>567 ありがとうございます。
fopen()の返戻値を引数として関数に渡すのが一番なんですね。
main関数内で関数呼び出しが非常に多いので躊躇してしまいました。手抜きはやっぱり駄目ですね。
571デフォルトの名無しさん:2006/11/13(月) 00:30:59
572デフォルトの名無しさん:2006/11/13(月) 00:36:17
よく変数とか関数の戦闘に_(アンダーバー)をつけてるのを見ますが
あれってどういう場合に付けるとかって慣例みたいなものってあるのでしょうか?
573デフォルトの名無しさん:2006/11/13(月) 00:39:21
あるよ
574556:2006/11/13(月) 00:43:25
>>572
自分の参考書には「下線で始まる名前はライブラリルーチンで用いることが多いので、使わない方が良い」と書いてあります。
575デフォルトの名無しさん:2006/11/13(月) 00:47:11
このスレが”初心者歓迎”といっているのは、質問者に対してだけではなく
回答者に対しても歓迎しているという事実を今知った。
576デフォルトの名無しさん:2006/11/13(月) 01:21:33
>>574
使わないほうが良い、ではなく本当に使っては駄目。

下線で始まるグローバルな名前は処理系予約。
また、下線2つあるいは下線に続いて英大文字で始まる名前はいかなる場合でも処理系予約。
それぞれただのユーザは使ってはいけない。
577デフォルトの名無しさん:2006/11/13(月) 03:16:23
w32gui genericというGUIライブラリのイベントハンドラの呼び出される仕組みについて質問です

ttp://www.torjo.com/win32gui/doc/event_handling.html#event_handler_examples
上記のページにサンプルがのっていたのですが
GUI本体がsample_dlgでハンドラがsample_dlg_handlerというのは分かるのですが
二つを結びつけているのがevent_handler<sample_dlg_handler, sample_dlg>のみで
しかもsample_dlg_handlerのオブジェクトが作られていないのにどうやって呼び出されているのか謎です
578デフォルトの名無しさん:2006/11/13(月) 11:32:32
あほな質問だったらごめんなさい

たとえばWM_LBUTTONDOWNメッセージのlParamとかで、
low-order word とhigh-order word にマウスポジションが入ってるのありますよね。

64bit環境の場合でも、やっぱり下位32bitに同じデータが入ってるんですか?
それとも下位32bitがLOWで上位32bitがHIなんですか?
579デフォルトの名無しさん:2006/11/13(月) 11:59:39
そんなこと気にするから互換性が取れなくなる。
MAKEPOINTS or GET_X_LPARAM and GET_Y_LPARAM
が正解。
580デフォルトの名無しさん:2006/11/13(月) 18:10:00
windowsでlibiconv.libを使っているのですけど、errnoが書き換え
られないのです。
わざと不完全なマルチバイト文字列を入力してやると、iconvの返り
値が(size_t)(-1)にはなるのですがerrnoは0のまま。
何故だ?
581デフォルトの名無しさん:2006/11/13(月) 20:00:27
Linux、C++でpopenと同じような働きをする関数とかってありますか?
582デフォルトの名無しさん:2006/11/13(月) 20:15:25
>>581
popen使ったら?
583デフォルトの名無しさん:2006/11/14(火) 06:41:14
JavaでいうところのforName関数(文字列を引数に取って、その文字列と同じ名前のクラスのクラスオブジェクトを返す関数)
のような動きをする関数ってC/C++でありますか?
584デフォルトの名無しさん:2006/11/14(火) 07:36:26
>>583
ない。作るのも無理。
585デフォルトの名無しさん:2006/11/14(火) 08:55:56
下記のプログラムでファイル名が"file_name"の中身を表示させようとすると、
最後にfinから読み取った文字列が2回出力されてしまい困っています.
どこを直せばいいのでしょうか。

string str;
ifstream fin(file_name);

while(!fin.eof()) {
fin >> str;
cout << str << endl;
}
586デフォルトの名無しさん:2006/11/14(火) 09:00:04
while (fin >> str) cout << str << endl;
587デフォルトの名無しさん:2006/11/14(火) 09:03:43
>>586

ありがと!
588デフォルトの名無しさん:2006/11/14(火) 15:41:00
VC++6.0です。配列名って実は配列を記憶しているメモリ領域の先頭の
アドレスを表すポインタだと聞きました。では、以下のようなことが
可能なのでしょうか?
ていうか、できなくて頑張っているんですけど、いい方法ありませんか?
つか、根本的に分かっていないのでしょうか?

==実現したい夢==
・メモリの任意のアドレスを何らかの配列に渡してやる。
・すると、渡したアドレスを先頭にして配列のサイズだけのデータを
 使って配列にデータが入っている。

例えば
void main(){

int *ptr;
int a[10];

&a = ptr;
}

とすると、ptrを先頭にして40バイト分のデータを4バイトずつa[0]〜a[9]に
割り当てて、且つint型で換算して値が入っている、なんて事です。for文で
10回まわしてもいいんですけど。
====

でも配列から配列への参照渡しなんて同じことですよね?
589デフォルトの名無しさん:2006/11/14(火) 15:55:22
>>588
ど初心者の漏れが10円玉の裏表を使って占ってみた
そしたら、出来ないと出たなり、漏れの占いは良くあたるから参考にしてね
590デフォルトの名無しさん:2006/11/14(火) 16:20:14
#include<stdio.h>
int main(void){
 int a;
 if(a=1){}
}

これってif(a=1)の評価どうなってるの?
591デフォルトの名無しさん:2006/11/14(火) 16:25:43
trueだろ
592デフォルトの名無しさん:2006/11/14(火) 16:28:41
代入式は代入した値を返す
そうじゃないとb=a=1とかできなくなる
593デフォルトの名無しさん:2006/11/14(火) 16:52:19
>>588
式の中で配列オブジェクトは、原則としてその先頭要素へのポインタに変換されるというだけ。
594デフォルトの名無しさん:2006/11/14(火) 16:56:23
簡単なプログラムを作っていたんですが、意図しない動作を起こします。
どうやらファイルを開こうとすると、この現象が起こるようです。
しかしそれ以上の原因はわかりません。。。
なぜエラーが起こるかわかりますか?

ソース
ttp://mumei24.run.buttobi.net/cgi-bin/src/up0020.txt

―――――
実行結果
<<>>は入力

1 : ファイル名:<<file1>>
2 : ファイル.\file1を開きます。
3 : le1<<file1>>
4 : ファイル.\file1を開きます。
5 : le1

3行目がおかしい!「ファイル名:」と表示されるはずなのに…。
5行目もなぜか勝手に変な表示が。
読みにくいかもしれないのでこっちにテキストをうpしました。

ちなみにコンパイラはLSIC−86の試食版です。
595デフォルトの名無しさん:2006/11/14(火) 16:59:35
>>588
struct 経由したら? 以下C++ で記述。 多少遠回りすればCでも同じこと書ける(かな?)

 struct TempArray {
  int val[10];
 };
 
 int* ptr;
 int a[10];
 (TempArray&)a = *(TempArray *)ptr;

左辺に若干の怖さがあるけどね…
596デフォルトの名無しさん:2006/11/14(火) 17:05:22
>>594
strcat の第一引数は、連結後の大きさを持ちえるだけの大きさの器が必要
and 文字列リテラル( ソース上の ".\\" のこと)を書き換えることはやっちゃダメ(だったハズ)
597デフォルトの名無しさん:2006/11/14(火) 17:06:22
>>595
TempArrayをstruct TempArrayにするだけでC言語になる予感
598デフォルトの名無しさん:2006/11/14(火) 17:08:19
>>597
左辺のキャストは Cで出来たっけ?
599デフォルトの名無しさん:2006/11/14(火) 17:09:53
>>596
ありがとうございます。
直してみます。
600デフォルトの名無しさん:2006/11/14(火) 17:13:30
>>598
無理
601デフォルトの名無しさん:2006/11/14(火) 17:17:46
>>600
できないのか・・・
無知ですまんかった
602デフォルトの名無しさん:2006/11/14(火) 17:19:33
>>596
できましたorz

"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
したのがいけなかったんですね。
ありがとうございました。
603デフォルトの名無しさん:2006/11/14(火) 17:25:28
質問です
データーがA B C D・・・と大きな分類があり
その個々の例えばAについてa b c とデーターが分類されている場合で
ABCやabcの個数があらかじめ決まっていない場合(増えることがある)
どのようにすればいいのでしょうか?
604デフォルトの名無しさん:2006/11/14(火) 17:30:06
>>603
Cなら、mallocして確保した領域を
データを追加する度にreallocして拡大してみる。
C++なら、Vectorとか、その類のクラスを使ってみる。
605デフォルトの名無しさん:2006/11/14(火) 17:32:26
>>602
>"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
それ以前に文字列リテラルを書き換えたら鼻から悪魔
606デフォルトの名無しさん:2006/11/14(火) 17:43:36
const int a = 10;
const int b = a + 1;
int array[a];

2・3行目がエラーになるんですがどうすればいいでしょう。
事情があってC++にはできません。
名前空間が汚染されるんでなるべくマクロは使いたくありません。
なお、gccです。
607デフォルトの名無しさん:2006/11/14(火) 17:46:19
>>606
配列の要素数の指定に変数は使えない
608デフォルトの名無しさん:2006/11/14(火) 17:52:34
>606
そのような動作をやりたきゃ newを使うかvector使え
609デフォルトの名無しさん:2006/11/14(火) 17:53:40
あ、すまんC++できないのか
じゃmallocを使え
610デフォルトの名無しさん:2006/11/14(火) 17:54:12
事情があってC++はダメとかはまぁいいとして
名前空間が汚染されるからマクロ嫌とか、ワガママじゃの
611デフォルトの名無しさん:2006/11/14(火) 17:55:02
>>589 占いアリガト
>>593 dクス。いろいろな見方を覚えていくことで上達を感じる。素人だけに余計に。
>>595 アイデアをアリガd。こういうアイデアは1年参考書を読み続けても思いつく
   かどうかは分からないからありがたい。感謝します。

もらったキーワードを元にもう一度ググリ旅にでます。謝謝
612611:2006/11/14(火) 17:55:42
あ、漏れは588
613デフォルトの名無しさん:2006/11/14(火) 18:19:06
C99ならできるだろ。
614デフォルトの名無しさん:2006/11/14(火) 18:46:36
DirectXのヘッダーに以下のような記述があるのですが
struct D3DXVECTOR2
{
FLOAT x, y;
BOOL operator == ( D3DXVECTOR2& ) const;
BOOL operator != ( D3DXVECTOR2& ) const;
}
この中身(ソース)はどういう風に記述されているのでしょうか?
FLOATをintに変えたクラスを作りたいのですが、==の多重定義をググっても
上記のようなソースのサンプルがなかなか見つからなくて…

ちなみにDirectX自体はlibのみの提供のようでソースは見つかりませんでした。
615デフォルトの名無しさん:2006/11/14(火) 19:03:14
普通に
BOOL operator == ( D3DXVECTOR2& rhs) const { return (x == rhs.x) && (y == rhs.y); }
BOOL operator != ( D3DXVECTOR2& rhs) const { return !(*this == rhs); }
でいいんじゃないの?
616デフォルトの名無しさん:2006/11/14(火) 19:05:35
ソースが提供されてないのにどういう風に記述されてるのかと聞かれてもな・・・
つか、正確な内容はわからずとも、大まかにどういう処理がされてるかくらいわかるだろ、そのオペレータ見ればよ
617デフォルトの名無しさん:2006/11/14(火) 19:06:30
>>615
おい、なんだその!=はw
618デフォルトの名無しさん:2006/11/14(火) 19:09:50
>>617
615 じゃないけど、変?
ばらして { return (x != rhs.x) || (y != rhs.y); } と書くより間違いが少ないように思うけど。
619デフォルトの名無しさん:2006/11/14(火) 19:16:16
>>615は問題ないかと
そんなことよりrhsがconst修飾されていないのがちょっと
620デフォルトの名無しさん:2006/11/14(火) 19:19:47
まぁぶっちゃけ、ばらして書こうが特に問題なんて起こらんけどな
621デフォルトの名無しさん:2006/11/14(火) 20:02:12
なるほど、そういう感じですか!

C++は初心者なので、後ろについているconst;の意味がよく分から
なかったのです。ググっても
inline friend bool operator==( const Complex & a, const Complex & b )
しか見つからなくて、余計混乱していました。

みなさん、有難うございましたm(__)m
622デフォルトの名無しさん:2006/11/14(火) 20:59:50
まぁ、誰もconstの説明なんてしてないが
あれはそのメソッド内でメンバの値の変更など行わないという意味
読み取り専用
623デフォルトの名無しさん:2006/11/14(火) 22:51:05
>>622
うまいっ!
624デフォルトの名無しさん:2006/11/15(水) 00:40:43
>>611

>>595はめちゃくちゃなので参考にならないよ。
625デフォルトの名無しさん:2006/11/15(水) 02:05:24
C++やP2P技術に卓越したプログラマの方々
宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です

次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
626デフォルトの名無しさん:2006/11/15(水) 08:50:05
スレッドに関して質問です.

class Hoge
{
public:
void * hoge(void *);
};

というクラスがあり、

int main()
{
pthread_t pth;
Hoge h;

pthread_create(&pth, NULL, (void *)h.hoge, NULL);

return 0;
}

みたいなことをやりたいのですが、どうもうまく行きません.
クラスのメンバ関数を別スレッドで実行するにはどうすればよいのでしょうか。
627デフォルトの名無しさん:2006/11/15(水) 09:29:59
>>626
使用する関数の仕様をしっかり把握すること。
無茶なキャストをしないこと。
エラーメッセージを読むこと。
628デフォルトの名無しさん:2006/11/15(水) 11:48:23
内側のブロックでmallocで確保した領域っていうのはfreeしてなければ外側のブロックから使えるんですよね?

int main(void){
int a[10];
int i;
for(i = 0; i < 10; i++){
int *p;
p = (int *)malloc(sizeof(int));
*p = i;
a[i] = (int)p;
}

for(i = 0; i < 10; i++)
printf("%d ", *((int *)(a[i])));
return 0;
}

この時出力は0 1 2 3 4 5 6 7 8 9であることは間違いないんですよね?
629デフォルトの名無しさん:2006/11/15(水) 11:51:07
>>628
それmallocする意味まったく無いが
630628:2006/11/15(水) 12:05:38
>>629
すいませんこれは例のためにかいたんで
*pがintじゃなくてなんかstructだと思ってください
631デフォルトの名無しさん:2006/11/15(水) 14:16:45
ポインタってintにキャストして使っていいんだっけ?
632デフォルトの名無しさん:2006/11/15(水) 14:47:34
>>631
一般的にはダメ。ポインタのほうがintより大きなことがあるから。
intではなくintptr_t/uintptr_tを使う。
633デフォルトの名無しさん:2006/11/15(水) 15:12:41
>>628
(1)使える。
(2)多くの環境ではそうなるだろうだが、int*⇔int間のキャストは結果が処理系定義。
634デフォルトの名無しさん:2006/11/15(水) 15:15:09
>>632
でもそれらの型はoptionalってことになってるからな…
635デフォルトの名無しさん:2006/11/15(水) 15:37:13
void * 使えよ。
636デフォルトの名無しさん:2006/11/15(水) 15:38:23
「(int*)p&~1」みたいなときに使われてる&~ってどういう意味ですか?
637デフォルトの名無しさん:2006/11/15(水) 15:39:32
(int *)p & (~1)
638デフォルトの名無しさん:2006/11/15(水) 15:58:28
ビット反転
639デフォルトの名無しさん:2006/11/15(水) 17:21:36
windows2000/VC++6を使っております。
debugでコンパイル(_DEBUGオプション付きコンパイル?)して
TRACEマクロでデバッグ文を出力しているのですが、
タスクマネージャのパフォーマンスを見ると
メモリの使用量がTRACEする度に増えてしまい困っています。
TRACEを使った後に、何かをしなければいけないのでしょうか?

ソースは以下です
void CTest_servDlg::OnButtonStart()
{
while(1){
TRACE("CTest_servDlg::OnButtonStart(): debug\n")
Sleep(1);
}

}
640デフォルトの名無しさん:2006/11/15(水) 17:49:08
>>634
<boost/cstdint.hpp>
641デフォルトの名無しさん:2006/11/15(水) 17:50:41
そういうもんだ。
大量に吐くんなら、ファイルにでも書けばよろし。
642639:2006/11/15(水) 21:18:02
>>641
そういうもんなんですか・・・
何か対応考えるようにします。ありがとう
643デフォルトの名無しさん:2006/11/15(水) 21:24:24
再帰関数を使用しないハノイの塔って可能ですか?
644デフォルトの名無しさん:2006/11/15(水) 21:36:11
>>643
スタックと局所変数の代わりに配列を使えばいいじゃん
645デフォルトの名無しさん:2006/11/15(水) 22:00:32
cでコンソールアプリ作るんですけど、
コンソールで入力できる最大文字数って取得できますか?
646デフォルトの名無しさん:2006/11/15(水) 23:11:02
>>643 1 から 2 へ 3 を補助領域として用いて移動する手順を求める
#include <iostream>
#include <string>
std::string hanoi(int n) {
  std::string abc, bca, cab, acb, bac, cba;
  for (int i = 0; i < n; ++i) {
    std::string tabc, tbca, tcab, tacb, tbac, tcba;
    tabc = acb + " 1->2 " + cba;
    tbca = bac + " 2->3 " + acb;
    tcab = cba + " 3->1 " + bac;
    tacb = abc + " 1->3 " + bca;
    tbac = bca + " 2->1 " + cab;
    tcba = cab + " 3->2 " + abc;
    abc = tabc;
    bca = tbca;
    cab = tcab;
    acb = tacb;
    bac = tbac;
    cba = tcba;
  }
  return abc;
}
int main() { std::cout << hanoi(5) << std::endl; }
647デフォルトの名無しさん:2006/11/15(水) 23:12:55
>>645
先ずはコンソールアプリとは何かから説明してくれたまえ。
さもなくば、想定している環境を示してくれたまえ。
648デフォルトの名無しさん:2006/11/16(木) 01:56:03
質問です。

#include<iostream.h>

int main(void)
{
cout<<"hello world";

return 0;
}

としてビルドしてもiostreamファイルが開けないとエラーがでます。
これはiostreamファイルがないのでしょうか?

visual C++ 2005 Express Editionを使っています。

アホな質問かもしれませんがお願いします。
649デフォルトの名無しさん:2006/11/16(木) 01:59:31
『.h』イラネ
650デフォルトの名無しさん:2006/11/16(木) 01:59:43
>>648
拡張子は.cppにしてる?
651デフォルトの名無しさん:2006/11/16(木) 02:01:37
>>648
エラーメッセージには "iostream.h" が開けないと書いてあるんじゃないか?
.h 付きの奴は古い C++ の仕様のものだから、 VC++ 2005 には無いんだろう。
652デフォルトの名無しさん:2006/11/16(木) 02:07:58
本当だ
VS2005Pro版SP1だけど、ついに.h付きの古いヘッダー無くなったか。
653デフォルトの名無しさん:2006/11/16(木) 02:08:10
>>648
今のC++には<iostream.h>がない。
現代のC++で書くとこうなる。
#include<iostream>

int main()
{
    std::cout << "hello world";
}

名前空間と言うものがC++の言語仕様に追加され、
標準ライブラリの中身は全て名前空間stdに入れられ、新しい名前のヘッダに収められている。
規格上古いC++のヘッダはなくなった。互換性のため残している処理系もあるが。
従来のCのヘッダはすったもんだの末に残されているものの、非推奨になっているはず。

新しいヘッダの名前は、
C++からのヘッダの場合単に.hをとっただけ(例外があるかもしれない)。
Cからあるヘッダの場合は.hをとって頭にcを付ける。<stdlib.h>→<cstdlib>

654デフォルトの名無しさん:2006/11/16(木) 02:11:08
648はきっと浦島太郎状態なんだろうな。
VC++ 2005を使い出す前には何を使っていたんだろう?
655デフォルトの名無しさん:2006/11/16(木) 02:11:26
まあぶっちゃけ俺はSTLportをVC8に入れてるんで問題ないけどな

古い参考書で勉強したいならSTLportを入れるといいよ
656648:2006/11/16(木) 02:47:23
>>649-655
ありがとうございます。
無事ビルドできました。

Cの勉強をしている時は<stdio.h>でもビルドできていたので特に考えずに書いていました。
657デフォルトの名無しさん:2006/11/16(木) 09:56:24
C++の勉強を始めた元Java屋です。
1つ参照戻し(っていうのが一般的なのかな?)について質問させてください。

今、ArrayList相当のクラスを自作しております。そのクラスの指定されたindex番号の要素
を返す場合に、指定されたindexが要素数を超えていたり、もしくは配列がまだ
初期化されていなかった場合に未定義値(NULL値)を返したいのですが、こういった場合は
参照戻しをせずにポインタを返すべきなのでしょうか?

サンプルコードは以下のものです。

template <class T>
T& ArrayList::get(unsigned int index) {
if(this->length < index || this->list == NULL) {
return NULL;
}

return this->list[index];
}

まぁ、予想通りNULL=0なのでint値は返せませんというコンパイルエラーになってしまいます。。。
もろもろの関係で例外は使えないのですが、このようの場合はやはりポインタ型で
返すしかないのでしょうか?
658657:2006/11/16(木) 10:11:46
ああ。。。。タイポ発見。

× T& ArrayList::get(unsigned int index) {
○ T& ArrayList<T>::get(unsigned int index) {

の間違いです。
659デフォルトの名無しさん:2006/11/16(木) 10:15:21
>>657
その通り
参照を返したのならば、std::out_of_rangeとかを投げる
660657:2006/11/16(木) 10:18:37
>>659
おお。早速のご返答ありがとうございます。
std::out_of_rangeですか。了解しました!
#BR○Wで使えるのかな・・・・・?
661デフォルトの名無しさん:2006/11/16(木) 10:25:50
>>660
分かっててやってるんだろうけど、一応指摘しておくと、
ArrayList相当のコレクションはすでに標準でstd::vector
として存在している。
662657:2006/11/16(木) 10:29:24
げふ。。。。
std::out_of_rangeって例外なのですね。。。。
例外は使えないのです。

>661
BRE○で、std::vector(というかSTL)って使えるのでしょうか?
そもそも、Cの標準関数(mallocとかstrcmpとか)が使えないので、STLも使えないんじゃ
ないのかなぁと勝手に思ってたりします。
663デフォルトの名無しさん:2006/11/16(木) 10:50:51
初めて知った で、
> BREW では、ANSI 標準ライブラリや、STL、Boost などの C++ ライブラリが使えません。ARM コンパイラの組込み関数も使えません。

お疲れ様です。配列の最後に番兵置くかポインタしかないんじゃないかな
664デフォルトの名無しさん:2006/11/16(木) 10:53:23
番兵ってなに?
センティネルのこと?
665デフォルトの名無しさん:2006/11/16(木) 10:55:36
セントリー
666657:2006/11/16(木) 11:20:04
>>663
ぐへ〜。やっぱりその方法しかないみたいですね。
がんばります。ありがとうございました。



∧||∧
(  ⌒ ヽ
 ∪  ノ
  ∪∪
667デフォルトの名無しさん:2006/11/16(木) 11:20:25
WinXP SP2、VC++6.0です。

void *buffer;
long lbytes ;

lbytes = 1024;
buffer = (void *)malloc(lbytes);

で1024バイトのメモリを確保して、既にその中にデータが入っています。

FILE* fp = fopen("C:/test/a.txt", "w");
rc = fwrite(buffer, 4, 256, fp);

で内容をファイルに書き出してバイナリエディタで見てみたら、
正しくデータが格納されているところまでは確認しています。

ここから4バイトずつ切り出して

float a[256];

のa[1]〜a[255]に入れたいのですが、どうしたらよいのでしょうか?
なんかヒントだけでも結構ですので下さい。お願いします。
668デフォルトの名無しさん:2006/11/16(木) 11:32:42
>>667
まずは自分で書いてみろ。
669667:2006/11/16(木) 13:36:48
>>668
実はハナから無理なことをしていて、例えばfloat buffer[256]って宣言し
といてから値をbufferに入れてやるべきなのか、このまま進めて行って
いいのかすら分からなくなってしまって質問しているところなのです。

>>667は初心者が2時間かけて伝わるようにいろいろ書き直した上に書き
上げた質問なので、そのあたりを斟酌していただけませんでしょうか。
670デフォルトの名無しさん:2006/11/16(木) 13:47:19
素朴な疑問なんだが、そのレベルの初心者がよくバイナリエディタでデータが正しいか確認できたな。
32ビット実数なんて、結構検算だけでも難しいと思うのだが。

>>669
それはさておき、1要素分の処理はこう書ける。後はこいつの応用だ。
union {
char b[4];
float f;
} data_t;
data_t foo;
fread(foo.b, sizeof(foo), 1, fp);
printf("%g\n", foo.f); // 確認はこんな感じで
671デフォルトの名無しさん:2006/11/16(木) 13:55:09
>>669
どっちでもできる。castとかでなんとでもなっちゃうのがCのいい所でもあり悪い所でもある。
実行環境があるならまずやってみろって。
で、期待通りに動かなくてわからない時に質問してくれ。ソースを晒して。
672デフォルトの名無しさん:2006/11/16(木) 14:07:34
VC8です。
_beginthreadにクラスのメンバ関数を渡すとフリーズしてしまうんですが、何故ででしょうか。
673デフォルトの名無しさん:2006/11/16(木) 14:12:07
偶然メモリの破損箇所にアクセスでもしたんだろ ('A`)
674デフォルトの名無しさん:2006/11/16(木) 14:16:21
偶然といわれても、いつもフリーズしてしまうんです。
デバッガで確認するとスレッドは実行されてるみたいなんですが、応答無しになってしまいます。
普通の関数を渡すとうまくいくんですが・・・。
675デフォルトの名無しさん:2006/11/16(木) 14:20:16
無茶なキャストはやってはいけません。
676675:2006/11/16(木) 14:24:27
おっと、なんか671までの流れへのコメントに見えちゃうな。

>>674
強引なキャストで渡すな。
googleの使い方くらい覚えろ。
http://www.google.co.jp/search?q=_beginthread+%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0
677667:2006/11/16(木) 14:53:54
>>670-671
freadを使えばよかったのか。いろいろ有難う。
それでできるとわかれば早速リトライです。
ほんとに初心者ですんません。
678デフォルトの名無しさん:2006/11/16(木) 16:15:13
fwrite使っててfread思いつかないってどんなだよw
679デフォルトの名無しさん:2006/11/16(木) 16:27:27
条件文の真は常に1ですか?
680667:2006/11/16(木) 16:29:00
freadのfがファイルのFだと思っていたので、メモリ上のブロックデータに
対してアクセスするのに使えるとはよもや思わんかったと言うことです。
681デフォルトの名無しさん:2006/11/16(木) 16:41:47
ネコジュース吹いたw
682デフォルトの名無しさん:2006/11/16(木) 16:44:30
確かに f??? 系で FILE* の取る位置が一貫してないけどサ…
ちょっと酷くない?
683デフォルトの名無しさん:2006/11/16(木) 17:09:01
Visual C++ 2005 Express Edition で入門書を読みながら勉強しているのですが、

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2952.txt
↑の Form1.h に記述されてる、
>private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
>(中略)
>}
の後に入門書では↓
>Form1.hのコードエディタで、button1_Clickメソッドの下に、
>ShowDiceメソッドを追加するために次のコードを追加する。↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2953.txt

同じく Form1.h に記述されてる、
>diceNumber = randomDice->Next(1,7);
>Debug::WriteLine("変数diceNumberの値は" + diceNumber.ToString() + "です");
の後に入門書では↓
>button1_Clickメソッドの中で一番下に、次のコードを追加する。↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2954.txt

コードの追加後のデバックでどうしてもエラーを起こしてしまい、
出力されるエラーメッセージを読んでも追加する場所が間違ってるのか
追加するコードが間違ってるのか、原因を読み取ることが出来ないために困っています。
どういった原因かわかるでしょうか?
684デフォルトの名無しさん:2006/11/16(木) 17:26:30
>>682
可変個引数のもの以外は全部最後部に統一されてる。
要するにprintf系が例外なだけ。
685デフォルトの名無しさん:2006/11/16(木) 17:39:37
>>684
fseek,f(get|set)pos
686デフォルトの名無しさん:2006/11/16(木) 17:49:41
以下のプログラムで、
定期的にファイルから数値を読み込み、処理を行いたいのですが、
while(1)ループの2回目以降のファイルの読み込みが実行されまん。
どこを修正すればいいのでしょうか。

float loadavg,time;
ifstream fin;

while(1){
  fin.open(file_nam);
  while(fin>>loadavg){
    fin>>time;
    /*loadavgとtimeに関する処理*/
  }
  fin.close();
  sleep(60);
}
687デフォルトの名無しさん:2006/11/16(木) 18:34:42
例えば
#include <stdio.h>
#define BUFFMAX 256
int main()
{
  char buff[BUFFMAX];
  printf("文字列を入力してください:\n");
  scanf("%s", buff);
  return 0;
}
上のプログラムを実行した場合、自分の環境ではscanf("%s", buff);
に対して入力できる文字数が127文字なので確保する領域はBUFFMAXで十分だけど
他の環境でコンパイルしたり実行したりしたら入力できる文字数が違ってくるので
256文字以上入力したら余分なメモリを書き換えてしまいます。
入力に対する文字数の上限が定義されているヘッダとか取得方法ってありますか?
(又は、このbuffに対する十分な領域、ってどれくらいですか?)
688デフォルトの名無しさん:2006/11/16(木) 18:42:15
>>687
その例ならば、scanf("%255s", buff);とすればバッファオーバランは防げる。
#残りを読み捨てるなどの処置も必要ではあるが。
689デフォルトの名無しさん:2006/11/16(木) 18:57:36
C++でポインタ型をconst付きの参照型にキャストするにはどうしたらいいですか?
690デフォルトの名無しさん:2006/11/16(木) 19:07:14
>>689
int* pHoge;
int& rHoge = *pHoge;

だがキャストする必要性を感じない
691デフォルトの名無しさん:2006/11/16(木) 19:13:16
float  data[1024];
void  *data;

同じモジュール内でこんな宣言をした場合ってどうなるの?
floatのdata[1024]とvoidのdataが別々に存在できるの?
692デフォルトの名無しさん:2006/11/16(木) 19:16:54
ファイルaaa.cをコンパイルするのにgmake(gcc?)を使っているのですが、
aaa.c内で使用している関数をbbb.cに記述している場合は
ファイルの中身やコンパイル文のオプションはどうしたらよいのでしょうか?
693デフォルトの名無しさん:2006/11/16(木) 19:22:14
>>691
自分でやってデバッグしてみりゃいいだろ
694デフォルトの名無しさん:2006/11/16(木) 20:03:48
>>692 ヘッダファイル使え。
695デフォルトの名無しさん:2006/11/16(木) 20:21:39
>>672
(非静的な)メンバ関数へのポインタは、通常の関数へのポインタとは別物。
でもテンプレートを使えばどうにでもできる。
#include <boost/bind.hpp>
template<typename T>
void ThreadEntry(void* p)
{
     (static_cast<T*>(p))();
}

template<typename T>
uintptr_t BeginThread(T fn, unsigned stackSize = 0)
{
    return _beginthread(ThreadEntry<T>, stackSize, &fn);
}

struct Foo
{
    void Bar();
};

void Hoge()
{
    Foo obj;
    BeginThread(boost::bind(&Foo::Bar, obj));
}
696デフォルトの名無しさん:2006/11/16(木) 20:24:15
>>695
BeginThread() 抜けたら fn が消えてあぼーん。
697692:2006/11/16(木) 20:38:30
>>694
bbb.cをbbb.hにしてinclude<bbb.h>とすると読み込まれるということでしょうか?
.cファイルのまま使う方法はないのでしょうか?
698デフォルトの名無しさん:2006/11/16(木) 20:40:57
もっと基本的な勉強ができてないようだ
699デフォルトの名無しさん:2006/11/16(木) 20:49:22
>>697 ググレカス
700692:2006/11/16(木) 20:56:08
>>698-699
教えられる知識すらない人間でしたか。失礼^^;
701デフォルトの名無しさん:2006/11/16(木) 20:59:35
構造体についての質問です。
struct HOGE {
int height, flag;
};
struct MOEMOE {
struct HOGE *hoge[10];
struct HOGE hoge0[10];
};

struct HOGE *func_hoge(struct MOEMOE *moemoe)
{
struct HOGE *hoge;
int i;
for (i = 0; i < 10; i++) {
if (moemoe->hoge[i].flag == 0) {
hoge = &moemoe->hoge0[i];
hoge->flag = 1
hoge->height = -1
moemoe->hoge[i]->height = 100;
return hoge;
}
}
return 0
}
という関数があった場合、1.return hogeでhoge0[i]のアドレスが返されるのは、
hogeがポインタだからですよね。構造体タグは構造体のアドレスを返すといった配列みたいな決まりはないですよね。
2.moemoe->hoge[i]->height = 100;はmoemoeのメンバであるhoge(hoge0のアドレスが入っている)のメンバの
height(実質hoge0のheight)に100を代入すると言う意味で良いんですよね。
702デフォルトの名無しさん:2006/11/16(木) 21:03:02
>>701
ソース貼るん前にコンパイルぐらいしとけ。
703デフォルトの名無しさん:2006/11/16(木) 21:03:06
>>692
% cat aaa.c bbb.c > ccc.c
% cc ccc.c
704デフォルトの名無しさん:2006/11/16(木) 21:08:11
>>701
どこにも、MOEMOE::hogeにMOEMOE::hoge0のポインタが保持されてる事実を裏付ける記述が無いが
まぁ保持されているという前提で考えようか

1. func_hoge内で宣言されているhogeがHOGEのポインタを保持するための変数であり
   途中の処理でhogeにhoge0[i]のアドレスが取得されているから、return hogeでhoge0[i]のアドレスが返される
   配列のような動作は構造体にはない

2. moemoeのメンバであるhogeに保持されているアドレスが示すところのHOGE構造体変数のheightメンバに100を代入する
   最初に指摘したように、提示されたコード内にはなんら裏付ける記述がないのでhoge0のheightに代入するかは不明


あと蛇足だが、最後のreturn 0はreturn NULLにしといた方が無難
705デフォルトの名無しさん:2006/11/16(木) 21:09:48
>>704
> あと蛇足だが、最後のreturn 0はreturn NULLにしといた方が無難

んー。なんでかなー?
706デフォルトの名無しさん:2006/11/16(木) 21:11:16
なんでだろうねー。考えてごらんなさい。
707デフォルトの名無しさん:2006/11/16(木) 21:13:40
>>704
NULL なんて使わなくていい。わざわざヘッダのインクルードを確認するのも面倒。
オマエみたいに何かを誤解する奴も増える。
708デフォルトの名無しさん:2006/11/16(木) 22:30:41
質問です。

繰り返し回数の多いループ内では
メンバ変数を呼び出すと処理時間が
遅くなるので、ループの外でいったん
ローカル変数に値を入れるようにして、
ループ内ではローカル変数だけを
使うようにしたほうが、処理時間は
短くなるという話を聞いたんですが
本当でしょうか?
709デフォルトの名無しさん:2006/11/16(木) 22:31:09
>>708 速度は実測が基本。
710デフォルトの名無しさん:2006/11/16(木) 22:32:16
基本すぎて役に立たない回答だな
711デフォルトの名無しさん:2006/11/16(木) 22:33:56
>>708
ようするに*thisから間接アクセスするからって話だろ。
CPUによっても違うし、コンパイラによっても違う。
712デフォルトの名無しさん:2006/11/16(木) 22:34:19
>>708
メンバ変数だと、それが指している先のaliasが存在しないことを
証明するのが非常に困難なので大多数のコンパイラでは遅くなるでしょう。
713デフォルトの名無しさん:2006/11/16(木) 22:38:09
>709-712
ありがとうございました。

1回走らせると時間かかるので
試す前に知ってる人がいたら・・・
と思って質問しました。
面倒がらずにきちんと実測する
ことにします。
714 ◆mI7lo1ZRb6 :2006/11/16(木) 22:42:15
C++やP2P技術に卓越したプログラマの方々
宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です

次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
715デフォルトの名無しさん:2006/11/16(木) 23:02:07
だが断る
716デフォルトの名無しさん:2006/11/16(木) 23:10:02
しかし断りを断られた
717デフォルトの名無しさん:2006/11/16(木) 23:13:23
>C++,mod_perl,P2Pが使えるコーダ
>P2Pが使えるコーダ
>コーダ
小学生からやり直し
718デフォルトの名無しさん:2006/11/16(木) 23:20:11
実はコーダじゃなくてダカーポだったんだな
719デフォルトの名無しさん:2006/11/16(木) 23:34:26
合い言葉は Bee!!
720デフォルトの名無しさん:2006/11/16(木) 23:46:33
>>719
コーダでそれが出てくるとは。懐かしい名前を思い出したよ。
大学時代の友人の部屋には、その手の雑誌がいっぱい転がってたので、いつの間にか覚えてしまってたw
721デフォルトの名無しさん:2006/11/16(木) 23:49:16
質問させてください。

関数の引数に想定外の値が入力さてたとき、
・assert()でチェックするだけでいい。
・assert()でチェック後、正常な値に丸め込んだ方がいい。
と主張して対立する両者がプロジェクトにいるのですが、
どちらが最善なのでしょうか?

私自身は前者が正しいと思っていて、
・丸め込むコードは本来ならば必要がないもの。
・コードが増えればバグが入り込む可能性も増える。
と考えているのですがこの考え方は正しいのでしょうか?

このようなバグに対するコーディングについて
なにか参考になる文献などありますでしょうか?

よろしくお願いします。
722デフォルトの名無しさん:2006/11/16(木) 23:53:02
國府田さんか
もう隠居したかと思ったけどこの後のkanonで名雪やってるのな
723デフォルトの名無しさん:2006/11/16(木) 23:58:13
正常値に丸めるならわざわざassertする意味がないじゃん
724デフォルトの名無しさん:2006/11/17(金) 00:00:21
>>721
俺はプロのプログラマじゃないけど、前者が基本思想じゃないかと思う。
だいたい、assertは異常があったときはプログラムを終了させるだろう?
725デフォルトの名無しさん:2006/11/17(金) 00:02:02
>>721
後者は中途半端だな。実際のコードでチェックして異常があったなら、
処理を続行するべきじゃないだろう。仕様に明記されていなければね。

assert() で済ませていいかどうかは、その入力がプログラム内で
制御可能なものかどうかによるだろう。たとえばユーザー入力に対する
チェックなら assert() では不適切。
726デフォルトの名無しさん:2006/11/17(金) 00:11:58
>>721
その関数のコール元として誰を想定しているかによる。
ユーザから呼ばれる関数なら、ユーザは間違った使い方をする可能性があるから、
エラーを返すとか、丸めるとか。仕様に明記すればいい。
いきなりassertに引っかかってシステムがダウンしたら、ユーザとしては嬉しくない。
システム内部でしか呼ばれない関数なら、正しい引数が渡されなければおかしい。
assert()を使用して、不当な値が渡ってきたときに検知できれば問題が早く発覚する。
727721:2006/11/17(金) 00:14:26
>>723 >>724 >>725
回答ありがとうございます。

assertはデバッグに使用していてリリースの時には無効になっています。
説明が不足していて申し訳ありません。

関数はプロジェクトの外部から呼ばれるようなものではなく
内部だけで使用するものです。
728デフォルトの名無しさん:2006/11/17(金) 00:17:20
>>727
これ以上は何も言うことはない。判断基準は理解しただろうから、あとは話し合って決めろ。
729デフォルトの名無しさん:2006/11/17(金) 00:26:16
assertはあくまで内部デバッグ用だろう。
デバッグモードでユーザ向けににリリースするのはありえない。
よってassertで引っかかってユーザが云々もない。
730デフォルトの名無しさん:2006/11/17(金) 00:34:53
>>726 >>728 >>729
回答ありがとうございます。
正しい方向が見えてきました。
731デフォルトの名無しさん:2006/11/17(金) 02:28:13
独習始めたばかりの、ど初心者です。
何故そうなるかがわからず、お知恵を頂きたいのですが。
charbname[80][80],name[80][80];
voidmain(void)
{
     int sw=0;
printf("enter sw\n");
scanf("%d",&sw);
switch(sw){
case1:{
inti=0;
while(i!=1){
printf("1");
gets(bname[i]);
printf("2");
gets(name[i]);
i++;
}
}
break;
}
}
っで、whileの中の、最初のgets(bname[i])がすっ飛ばされる理由がわからなくて、知りたいのです。
本の答えを見て、scanf("%d",&sw);の部分を、sw=getche()-'0';にすると動くことはわかったのですが、
なぜscanfだといけないのか、また、getche()-'0'の-'0'の部分は、どういった処理をさせるためなのかを教えていただけないでしょうか?
使ってるソフトはvc++6.0、OSはwinxpです。
小汚いソースで申し訳ないですが、どなたかお願いします。
732デフォルトの名無しさん:2006/11/17(金) 02:31:43
>>731
入力バッファにscanf("%d", &sw)で入力したデータのうち改行文字'\n'が
残り、それが次のgets()で読み取られてしまうから。

この問題を解決するには、scanf()系で統一するか、gets()で文字列に
読み込んでからatoi()などで変換するかのどちらか一方にすればよい。
733731:2006/11/17(金) 02:40:54
>>732
素早くわかりやすい回答、ありがとうございます。
このまま頭抱えたまま、朝まで寝られないかと思ってました。
解決策まで頂き、本当にありがとうございました。
734デフォルトの名無しさん:2006/11/17(金) 13:32:07
4bitの型って無いの?
8bitをビットフィールドで4bitにすると4bit無駄になるからやだ。
735デフォルトの名無しさん:2006/11/17(金) 13:35:07
>>731
getcher()-'0' は、getcharで読み込んだ文字(数字)を数値に変換する処理。
文字'0'のもつ値と数値0は異なる。
たとえば文字'5'が入力されたなら、'5'-'0'=5で数値の5を得ることができる。

ただし、これは文字'0'〜'9'に連続した値が割り当てられている文字コードを
使用した場合にしか使えない。まあ普通の環境なら問題ないはず。
736デフォルトの名無しさん:2006/11/17(金) 13:37:45
すいません、実用的なC言語のプログラムの場合あまりscanf関数は使われないと聞いたのですが
本当でしょうか?教えてくださいよろしくお願いします。

http://wisdom.sakura.ne.jp/programming/c/c58.html
それから、scanf関数でぐぐったら上記のサイトが引っかかったのですが、

#include <stdio.h>

int main() {
char yn;
printf("猫耳は好きですか?y/n>");
scanf("%[yn]" , &yn);

printf("入力された値 = %c" , yn);
return 0;

このコードでscanf関数の後に[]が使われているのですがこれはなんですか?

C言語を始めたばかりの初心者なので右も左も分かりませんがよろしくお願いします。
737731:2006/11/17(金) 13:47:44
>>735
getche()のchar型からの変換処理の回答、ありがとうございました。
初心者でも大変わかりやすかったです。
scanf()ともども、色々試して覚えます。
732さん、735さん、本当にありがとうございました。
738デフォルトの名無しさん:2006/11/17(金) 13:53:50
>>734
わがまま言わんの
739デフォルトの名無しさん:2006/11/17(金) 13:56:10
getche()を使うなら他のも
cgets()、cscanf()、cprintf()に統一しろよ。
740731:2006/11/17(金) 14:01:57
>>736
同じく初心者なのですが、知っていることだけを。
scanf("%[yn] は、スキャン集合と呼ばれるもので、この場合はyとn以外のものを取らないんだったと思います。
"スキャン集合"で調べると、詳しい使い方がわかると思います。
もう一つの質問については、初心者のため、わかりません。
741736:2006/11/17(金) 14:05:00
>>740
ありがとうございます。
助かりました。
742731:2006/11/17(金) 14:05:58
>>739
まだ知らない関数です。調べて使ってみます。
ありがとうございます。
743735:2006/11/17(金) 14:07:16
>>737,739
getche()ってgetchar()のtypoかと思ってたら、そういう関数があったのね。
cgets()なども初めて知ったよ。勉強になりました。
744デフォルトの名無しさん:2006/11/17(金) 14:12:08
>>736
>すいません、実用的なC言語のプログラムの場合あまりscanf関数は使われないと聞いたのですが
>本当でしょうか?教えてくださいよろしくお願いします。

どこで言われているのか分からないから想像で答えると、
・そこで言っている実用的なプログラムというのが今時のGUIのものを指しているので、
 CUIの入力はあまり使われない。
・ユーザはこちらが望んだ入力をするとは限らない。(誤って、または意図的に。)
 数値を入力させようと%dを使うと、数字以外が入力されたときにまずい。
 ユーザ入力はfgetsで1行分すべて受け取って、sscanfなどで自分で解析したほうが安全。
745デフォルトの名無しさん:2006/11/17(金) 16:36:52 BE:46585038-2BP(200)
>>736 >>744
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3

C言語の標準入出力関数であるgets関数、scanf関数などはバッファ長のチェックを
行わないで標準入力をバッファに書き込むので、この関数を使う全てのプログラムには、
バッファオーバーランによる不正動作の危険性がある。
746デフォルトの名無しさん:2006/11/17(金) 17:34:53
>>745
そこの説明もなんか香ばしいな。

> fgets(buf, 200, stdin);

これで良くて

> scanf("%.199s", buf);

これで駄目?馬鹿じゃねーの。
747デフォルトの名無しさん:2006/11/17(金) 20:19:20
>735
C/C++では'0'...'9'の文字コードは連続しているという前提を置いて構わない。
748デフォルトの名無しさん:2006/11/17(金) 20:41:00
>747
もし仮に'0'...'9'に不連続な値を割り当てた俺様文字コードを考案したら、
それに対応したCコンパイラを実装しようとしても厳密に規格に合致させることができないってこと?
(もちろん、そんなものを作ろうとは思わないけど。)
749デフォルトの名無しさん:2006/11/17(金) 20:43:14
EBCDICではA〜MとN〜Zが切り離されているけど、0〜9は連続してるな。
750デフォルトの名無しさん:2006/11/17(金) 20:55:40
質問させていただきます。
OnTimer関数を利用する際に、
1度目のカウントでは何も呼び出さず、
2回目のカウントで関数を呼び出すようにしたいのですが
上手く制御できません。

if(nIDEvent ==1)
{
int i=0;
if(i=0)
{
i++;
}
if(i=1){
KillTimer(1);

}
こんな感じにソースを書いてみたのですが上手くいかないのです(´・ω・`)
どうすればよいでしょうか…?
751デフォルトの名無しさん:2006/11/17(金) 21:01:33
>>748
そういうこと。'0'から'9'までは連続していなければならないことを意味する規定が存在する。
もちろん逆順も駄目。

>>750
そのiはそのブロックに入る度に作成され0で初期化される。
staticを付けて、静的変数にしろ。
752デフォルトの名無しさん:2006/11/17(金) 21:03:31
static抜け以外にも、色々間違い過ぎ。
753デフォルトの名無しさん:2006/11/17(金) 21:04:36
>>750
その内容ではカウント用変数「i」が毎度確保しなおされて、永遠に1になることは無いので関数コールに行かない
カウント用変数をメンバ変数にするか、もしくはstatic宣言してみれ
754デフォルトの名無しさん:2006/11/17(金) 21:05:09
さて、俺ら重婚しすぎかね?w
755デフォルトの名無しさん:2006/11/17(金) 21:07:10
>751-753
(´・ω・)!

有難う御座います…;
もう少し勉強してから取り組んでみます。
756デフォルトの名無しさん:2006/11/19(日) 00:55:18
日本語の文章をファイルから読み込んで、
漢字の単語だけを文字列として、文字配列のポインタ配列を作る、なんてことは可能でしょうか?
例えば、
「本日は晴天なり」だったら
「本日」という文字列と
「晴天」という文字列をつくるみたいな。





757デフォルトの名無しさん:2006/11/19(日) 00:57:06
>>756
文字コードがはっきりしてればできる。
わりと面倒な問題だが。
758デフォルトの名無しさん:2006/11/19(日) 11:46:34
シフトJISでなら、一文字ずつ見て漢字のコード(漢字だけに使われている部分があったはず)があったら2バイト読み込みとかで
759デフォルトの名無しさん:2006/11/19(日) 11:47:55
>>758 知ったかぶり消えろ
760デフォルトの名無しさん:2006/11/19(日) 11:52:48
>>759
GJ!
761デフォルトの名無しさん:2006/11/19(日) 11:53:25
まぁ、概ね間違っちゃいないが。
762デフォルトの名無しさん:2006/11/19(日) 12:07:36
iskanji()使えよ
763デフォルトの名無しさん:2006/11/19(日) 12:17:52
>>759
知ったかぶりじゃないところを見せてくれ、君
764デフォルトの名無しさん:2006/11/19(日) 12:27:21
>>757 で FA
765デフォルトの名無しさん:2006/11/19(日) 12:43:35
>>764
いいや、>>759でいい。
>>757の内容をに知ったかぶと言うことは、>>759は何か知ってるからこそそういうふうに言うんだろ
>>759>>756または>>758にアドバイスしてやれよ
>>759は知ってるけど教えない君かな
766デフォルトの名無しさん:2006/11/19(日) 12:56:34
環境依存のコードを書くなって教えじゃないか。
スレタイに環境依存OKと書いてある時点で何かが間違っている気がするが。
767デフォルトの名無しさん:2006/11/19(日) 12:58:02
誰か>>765を日本語に翻訳してくれ
768デフォルトの名無しさん:2006/11/19(日) 12:58:19
素直に「教えてください」って言えよカス
769デフォルトの名無しさん:2006/11/19(日) 13:02:24
まったくだ
770デフォルトの名無しさん:2006/11/19(日) 13:14:56
質問です。
"あいう えお aiu eo" のような文字列を単語ごとに分割したいのですが、次のコードがうまく動きません。
どのように書き直したらよいでしょうか?
#include  < iostream>
#include  < string>
#include  < deque>
#include  < algorithm>
#include  < cctype>
using namespace std;

deque<string> Split_String(const string& str)
{
string::size_type i = 0 , j = 0;
string::size_type max_len = str.length();
deque<string> tmp_deque;

while( i <= max_len ) {
while( i <= max_len && isspace( str[i] ) )
++i;
j = i;
while( j <= max_len && !isspace( str[j] ) )
++j;
if( i != j ) {
tmp_deque.push_back( str.substr(i , j-i) );
i = j;
}
}
return tmp_deque;
}
771770:2006/11/19(日) 13:15:34
続きです

int main()
{
deque<string> d;
string s("multibyte is very difficult.");
d = Split_String(s); //動く
copy( d.begin() , d.end() , ostream_iterator<string>(cout , "\n") );

s = "まるち バイト ha muzukashii.";
d = Split_String(s); //動かない
copy( d.begin() , d.end() , ostream_iterator<string>(cout , "\n") );
}
772デフォルトの名無しさん:2006/11/19(日) 13:45:30
>>770
マンドクセーからちゃんと読んでないが、isspace()のようなctype.hの
マクロ使う時は、何も考えずにsigned charを渡しちゃだめ。
引数が-1(EOF)〜255の範囲にあることが前提になってて、通常は
引数をそのまま配列indexとして使って表参照で判定してるから。

非ASCII文字だと、signed char→intに符号拡張した時に
負値になるような値が入ってるんで、
↑の範囲に収まらずに動作が不定になる。
isspace()に渡す前に、unsigned charにキャストしる。
773デフォルトの名無しさん:2006/11/19(日) 13:50:43
char はデフォルトで unsigned char じゃなかったっけ?
774デフォルトの名無しさん:2006/11/19(日) 13:55:11
>>773
んなこたぁない
775770:2006/11/19(日) 13:57:59
>>772
while( i <= max_len && isspace( str[i] ) )

while( i <= max_len && isspace( (unsigned char)str[i] ) )
に変えたらうまく動きました

どうもありがとうございます
776773:2006/11/19(日) 14:01:47
>>774
辞書見たら不定って書いてあったよ。orz
777デフォルトの名無しさん:2006/11/19(日) 14:14:06
778デフォルトの名無しさん:2006/11/19(日) 14:33:15
>>775
工エエェェ(´ロ`ノ)ノェェエエ工
#include <cctype>
#include <cstdlib>
#include <locale>
using namespace std;
deque<string> SplitMultiByteString(const string& str) {
    deque<string> words;
    int len_char;
    string::size_type first = string::size_type(), last, length = str.length();
    locale previous = locale::global(locale("japanese", locale::ctype));
    while (first < length) {
        while (first < length && (len_char = mblen(&str[first], MB_CUR_MAX)) == 1 && isspace(str[first]))
            first += len_char;
        last = first;
        while (last < length && ((len_char = mblen(&str[last], MB_CUR_MAX)) == 1 && !isspace(str[last]) || len_char > 1))
            last += len_char;
        if (first != last) {
            words.push_back(str.substr(first, last - first));
            first = last;
        }
    }
    locale::global(previous);
    return words;
}
779デフォルトの名無しさん:2006/11/19(日) 14:41:54
>>778
ぶっちゃけASCIIのスペースと被るようなマルチバイトエンコード系を知らんのだが、
あったっけ?
バックスラッシュ等がShiftJISの2byte目と被るのは有名だが。
780デフォルトの名無しさん:2006/11/19(日) 14:42:58
初めまして。書籍を参考にしながら独自コードに直している間につまづきました。
static修飾子について質問させてください。

static修飾子をつけた同じクラスのメンバにアクセスさせると、
コンパイル時にリンクエラーになります。
参考にした書籍にはそのように載っているので、何か条件があるのだと思いますがわかりません。
何から疑っていったら良いでしょうか。
具体的には、下記のようなコードの場合にエラーになります。

class CWindow {
public:
  HWND RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY);
protected:
  static LRESULT CALLBACK _WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  static CWindow* m_static;
};

LRESULT CALLBACK CWindow::_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  CWindow* p = m_static;  // こいつがいけないらしい
}

HWND CWindow::RegistWindow(char* wndName, char* wndTitle, int posXX, int posYY) {
  m_static = this;  // これもいけないらしい
}
781デフォルトの名無しさん:2006/11/19(日) 14:45:20
もうそれ秋田。書き込んだの何スレ目だよ。
782778:2006/11/19(日) 14:54:09
>>779
正直なところ俺も知らない。ただ、マルチバイト文字列の扱いの勉強になるかなと思って。
783デフォルトの名無しさん:2006/11/19(日) 14:58:11
C++では、Javaみたいにオブジェクトを保存/読み込みできるのでしょうか。
784デフォルトの名無しさん:2006/11/19(日) 14:59:41
>>783
Java みたいにはできません。
boost::serialization を使ってみる?
785デフォルトの名無しさん:2006/11/19(日) 14:59:45
先生すいません。
環境変数の設定が出来ません、前にジャバで変数を変えたときがあるんですがそれが原因ですか?
原因だとしたらどーやれば元に戻せますか??
教えてください。。。
786デフォルトの名無しさん:2006/11/19(日) 15:03:00
>>785 OS のマニュアル嫁
787デフォルトの名無しさん:2006/11/19(日) 15:03:59
>>780
m_staticが、宣言しかされていない。実体を定義する必要がある。
どこかのソースファイル(ヘッダ以外)にCWindow* CWindow::m_static;とでも書いとけ。
788デフォルトの名無しさん:2006/11/19(日) 15:06:05
>786 すんません。
OS借り物なのでマニュアルがありませんです。
だめですか???
789デフォルトの名無しさん:2006/11/19(日) 15:06:44
「マイコンピュータ」→「プロパティ」→「詳細」タグ
以下略
790780:2006/11/19(日) 15:15:11
>>781
2スレ目です。
>>787
ありがとうございます。やってみます。
791デフォルトの名無しさん:2006/11/19(日) 15:55:01
借り物っておめぇ・・・
792デフォルトの名無しさん:2006/11/19(日) 16:09:58
盗むことを借りると訳すのはDQNの典型
793デフォルトの名無しさん:2006/11/19(日) 17:22:07
やっぱ天然がたまに見せる切れ味には勝てんわ。
794デフォルトの名無しさん:2006/11/19(日) 17:42:18
C++ソースファイルの拡張子ってどれが正しいんですか?
.C
.cc
.c++
.cpp
.oc
795デフォルトの名無しさん:2006/11/19(日) 17:47:19
>>794
何でもいいよ
796デフォルトの名無しさん:2006/11/19(日) 17:50:24
>>794
cpp意外使うな
797デフォルトの名無しさん:2006/11/19(日) 17:54:29
>>794
つ .cxx なんてどう
798デフォルトの名無しさん:2006/11/19(日) 18:05:10
>>794
標準で定められた拡張子は無い。
.C は Windows で .c と区別できないからやめたほうがいい。
.oc は ObjectiveC じゃないか?
799デフォルトの名無しさん:2006/11/19(日) 18:12:56
.c++ワロタw
800デフォルトの名無しさん:2006/11/19(日) 18:37:55
C#ならどうするつもりなんだろう…
801デフォルトの名無しさん:2006/11/19(日) 18:39:42
802デフォルトの名無しさん:2006/11/19(日) 19:42:35
インライン関数の宣言をヘッダに書いて、定義は別に書くとインライン展開されませんか?
803デフォルトの名無しさん:2006/11/19(日) 19:43:09
書き忘れました。
コンパイラはVC2005です。
804デフォルトの名無しさん:2006/11/19(日) 19:47:13
グローバルな最適化オプションなら、もしかしたらインライン展開されるかも。
いずれにせよ、そうなるかどうかは、関数の評価しだい。
インライン展開しないほうがいい場合もあるし。
805デフォルトの名無しさん:2006/11/19(日) 20:32:35
VisualStudioを買おうと検討しています。
2005 Standardには2003.net相当のものが含まれていると考えてもいいでしょうか?

やりたいことは、
1.ネットワーク上からデータをダウンロード
2.上記ダウンロードデータよりデータベースを作成
3.上記データベースより数値計算をおこなう
というものです。
.netバージョンだとネットワークとのインターフェースのライブラリが
あると聞いたので2005には標準でついているのかどうか知りたいです。

よろしくお願いします。

(スレ違いなら最適なスレに誘導していただけると幸いです。)
806デフォルトの名無しさん:2006/11/19(日) 20:41:13
お前は「Visual Studio」でスレタイ検索かけることも出来んのか?
807805:2006/11/19(日) 20:55:24
i|!| |i┏┓! i!┏┳┓| |||i|!i| ||!i|| |||ii| ||| ||| |i||!|i│i!┏┓i!|
|i|┏┛┗━╋┻┛|i!||!|ii|| i|!i||i|┏━┓ ┏┓i|i| i┃┃i!|
i||┗┓┏┓┃||i┏━━━━┓┗━┛ ┃┃|i||!i┃┃i!|
|i |!|i┃┃┃┃i||┗━━━━┛|i|| || ||||!┃┃i|i| i┗┛!i|
i||i ||┃┃┃┃|! |||i ||i    !|||!|┏━━┛┃|i||!i┏┓i|!
|i!i |!┗┛┗┛i|!i|  / |   / | ┗━━━┛i|i| i┗┛i!|
i| |||i|!i| ||!|i||i!   /,_ ┴─/ ヽ      |!i| ||| |i||!|i|i|||| ||i
|i|| ||i!i||     (_゜.,》.'(_゜,》)ミ ヽ       ! | |!i||!|ii||!|ii|
i|ii        / ,,__,ニ、、 ノ( |           i|i!|i|
|i        | Y~~/~y} `, ~ |  そ、そんなー…   |i
!.          | ,k.,.,!,.,.,r| ,!  く             |
i        / <ニニニ'ノ    \               l
808805:2006/11/19(日) 21:01:45
すんません。浅はかでした。
スレ検索してそちらで聞きます。
809809:2006/11/20(月) 01:43:42
BirthDayクラスはコンパイルできたのですが、IDクラスがコンパイルできません。
ID.cppをコンパイルすると、
BirthDay.h 1: 'BirthDay' の宣言が複数見つかった
BirthDay.h 1: 一つ前の 'BirthDay' の定義位置
とBirthDayクラスのヘッダでエラーがでます。
どうなっているのでしょうか。
ttp://www.geocities.jp/mwada11/index.htm
810デフォルトの名無しさん:2006/11/20(月) 01:49:42
>>809
取り敢えずIDクラスが二回宣言されてるから一回にしろ
811デフォルトの名無しさん:2006/11/20(月) 01:52:21
>>809
いついかなるときも、ヘッダファイルにはインクルードガードを書くクセをつけましょう。
812デフォルトの名無しさん:2006/11/20(月) 02:38:37
>>799 晒しとくかな
マジで知らないらしい
813デフォルトの名無しさん:2006/11/20(月) 12:07:23
>>811

俺は>>809ではないが、助かった。
ありがとう。
814デフォルトの名無しさん:2006/11/20(月) 12:27:05
cppが同じヘッダはスルーするようにすればいいのに。
815デフォルトの名無しさん:2006/11/20(月) 12:58:36
>>811
本当にそうだよね、気が利かないねー
816デフォルトの名無しさん:2006/11/20(月) 13:09:17
特殊仕様が欲しいなら自分で作ればいいのに
817デフォルトの名無しさん:2006/11/20(月) 13:32:03
12分
818デフォルトの名無しさん:2006/11/20(月) 15:47:19
VC8 (2005) を使っています。

自作のライブラリ mylib.lib の中に main 関数があり、そこからユーザー定義の mymain を呼ぶ形になっています。
フレームワーク的に

#include "mylib.h"
int mymain(void) { return 0 ; }

と書いただけのソースをコンパイルし、リンクしようとすると「エントリー ポイントを定義しなければなりません。」と怒られます。
mylib の中にある関数やオブジェクトを参照すればリンクも通るのですが、
プログラムによって使うかどうか分からない関数をフレームワークソースで呼んだりするのもアレな気がします。
この場合どの様にするのがスマートでしょうか?
819デフォルトの名無しさん:2006/11/20(月) 16:26:16
11分
820デフォルトの名無しさん:2006/11/20(月) 16:46:07
>>818
main()をライブラリの中に入れることが根本的に間違い。

> この場合どの様にするのがスマートでしょうか?

・main()が入っているオブジェクトをライブラリから抜き出して「リン
クするときはxxx.objもリンクしてください」とする。

・main()をmylib_main()に改名して「あなたのコードのmain()で
mylib_main()を呼んでね」とする。
821デフォルトの名無しさん:2006/11/20(月) 17:46:58
>>818
VC++ベッタリの方法だが。
#pragma comment()
でどうにかならんか。ヘルプ見てみ。

#pragma comment(linker, /include: シンボル)
で、シンボルを強制的に取り込むことができるはず。
822デフォルトの名無しさん:2006/11/20(月) 20:48:28
質問です。
_itoa_s関数の第四引数にvalue の基数 (2 〜 36 の範囲内で指定する必要があります)。
とあるのですが、意味がよくわかりませんでした。
ここには実際にどのようなデータを入力したらよいのでしょうか?
823デフォルトの名無しさん:2006/11/20(月) 20:52:04
824822:2006/11/20(月) 20:57:14
>>823
どうもです。
825初心者:2006/11/20(月) 22:04:59
C++でハッキングを作るにはどうすればよいですか?

注:私の質問に対して煽りで返す不届き者がいるようですが、
そのような方は発言するだけ無駄ですのでお黙り下さい。
ちなみに私の友達には2ch管理者さえも畏れるハッカーがおり、
あまりにも礼を欠く発言に対してはそれ相応の「処置」をとらせていただくことを
ご承知下さい。なお、質問に対して有意義な答えを下さった方には
感謝します。
826デフォルトの名無しさん:2006/11/20(月) 22:13:04
>>825
きみの友達の方が詳しいからそっちに聞いた方が良いと思うよ。
827初心者:2006/11/20(月) 22:15:05
>>826
やはり自力でやらなければ意味がないのでここで質問しました。
出来ればもっと有意義なレスを期待します。
828デフォルトの名無しさん:2006/11/20(月) 22:16:23
>>827
死ね
829初心者:2006/11/20(月) 22:18:01
もういいです。
皆さんにはそれなりの制裁を下すのでそのつもりでいてください。
830デフォルトの名無しさん:2006/11/20(月) 22:21:22
ふむ、楽しみができた。
831デフォルトの名無しさん:2006/11/20(月) 22:22:43
態度がやけにでかいとおもったらやっぱり朝鮮人か。
祖国に帰れ。
832デフォルトの名無しさん:2006/11/20(月) 22:24:28
>>827
>自力でやらなければ意味がない

いや、だからこそ、その友達に色々聞いて自分でプログラム組めばいいんじゃない?
833デフォルトの名無しさん:2006/11/20(月) 22:24:42
だから釣りだって
834デフォルトの名無しさん:2006/11/20(月) 22:24:45
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
835デフォルトの名無しさん:2006/11/20(月) 22:25:50
愛用していたC++コンパイラに2時間と10分餌を与えないでいたら死んでしまいました。
どうすれば生き返るんでしょうか。
836デフォルトの名無しさん:2006/11/20(月) 22:26:22
あきらめて新しいのもってこい。
837デフォルトの名無しさん:2006/11/20(月) 22:26:23
あきらめて新しいのもってこい。
838デフォルトの名無しさん:2006/11/20(月) 22:26:43
>>835
コンパイラの種類がわからないと答えられません
839836:2006/11/20(月) 22:27:04
>>837
ニヤリ
840デフォルトの名無しさん:2006/11/20(月) 22:29:16
>>835
オマイの愛情次第だ
841837:2006/11/20(月) 22:32:40
>>839
くそうw
842デフォルトの名無しさん:2006/11/20(月) 22:34:25
>>839
>>841
(・∀・)ジサクジエン
843デフォルトの名無しさん:2006/11/20(月) 23:44:15
質問です。
今現在Eclipse+CDTでC++のソフトを作っているのですが
ヘッダーファイルとCPPファイルにクラスの定義と実装を分けて書いています。
コンパイラはGCCを用いています。
そこで、
test.h
class testc
{

int hoge();
};
test.cpp
#include "testc.h"

int testc::hoge(){
return 1;
}

のように書いてコンパイルすると、
first defined here
multiple definition of `testc::hoge()'
と表示され、エラーとなってしまいます。
単語を調べてみたところ多重定義といわれていると思うのですが、C++の入門のHPを見ても上記の様に書かれています。

メソッドの実装方法が間違っているのでしょうか?
ご教授お願いします。
844デフォルトの名無しさん:2006/11/20(月) 23:46:26
そのインクルードしているtestc.hとやらはどこにある?
845843:2006/11/20(月) 23:50:31
>>844
しまった・・・
すいません、書き間違えです。
test.cppはtest.hをインクルードしています。
846デフォルトの名無しさん:2006/11/20(月) 23:51:52
>>825
ハッキングは行為であるから、それに対して作るという表現は適切でないと思う。
847デフォルトの名無しさん:2006/11/20(月) 23:54:44
>>843
ソースもエラーメッセージもコピペしろ。分からないのに勝手に省くな。
848デフォルトの名無しさん:2006/11/21(火) 00:00:28
>>846
スルーしろよ…
849843[1]:2006/11/21(火) 00:01:29
>>847
わかりました。全部書くとこうなります。
行数オーバーしたので2回にわかれます。すいません。
//main.cpp
#include <iostream>
#include "test.cpp"
using namespace std;


int main()
{
testc test(1,1);
cout << "HELLO" << test.hoge() << endl;
return 0;
}

850デフォルトの名無しさん:2006/11/21(火) 00:02:11
//test.h
class testc
{
private:
int a,b;
public:
testc(int x, int y)
:a(x),b(y){}
testc(){}
int hoge();
};

//test.cpp
#include "testc.h"

int testc::hoge(){
return 1;
}


//エラーメッセージ
重大度記述リソースフォルダーロケーション作成時刻ID
2first defined heretestc.cpptest行 32006/11/20 23:47:164426
2multiple definition of `testc::hoge()'testc.cpptest行 32006/11/20 23:47:164425
851デフォルトの名無しさん:2006/11/21(火) 00:03:05
とりあえず、#include "test.cpp" は消しとけ
852843:2006/11/21(火) 00:06:18
>>851
それが・・・
#include "test.cpp"を消すと
重大度記述リソースフォルダーロケーション作成時刻ID
2error: `testc' undeclared (first use this function)test.cpptest行 82006/11/21 0:09:454428
2error: (Each undeclared identifier is reported only once for each function it appears in.)test.cpptest行 82006/11/21 0:09:454429
2error: expected `;' before "test"test.cpptest行 82006/11/21 0:09:454430
2error: `test' undeclared (first use this function)test.cpptest行 92006/11/21 0:09:454431

と、エラーが出ます。
そういうものかと思っていたのですが、ひょっとしてウチの環境がまちがっとるのか・・・
853デフォルトの名無しさん:2006/11/21(火) 00:08:53
ねぇ、リンクって知ってる?
854デフォルトの名無しさん:2006/11/21(火) 00:10:20
>>852
#include "test.cpp"

#include "test.h"
855デフォルトの名無しさん:2006/11/21(火) 00:10:25
>>849
× #include "test.cpp"
○ #include "test.h"

なんのためにヘッダファイル作ったのか、わかってなさそうだな。

で、コピペしたのにやっぱり testc.h があんのか?
そっちはエラーにならないの?
856844:2006/11/21(火) 00:18:48
>>854,855
エラーが消えました。ありがとうございます。

>>855
えっと、正直に申し上げますと
本当はtestc.hというファイル名で保存してあるんです。
で、最初に投稿したときにファイル名を間違えて書いてしまったので、
ややこしくなってはいけないと思い書き込み文はtest.hに修正しようとしたら見事に失敗しますた。。。

最初に間違えたときにそう訂正すべきでした。
浅慮で申し訳ないです。

ヘッダファイルの必要性から勉強し直してきますorz
857デフォルトの名無しさん:2006/11/21(火) 01:14:34
質問です。

double a = 1.234;
_ftprintf(fp, _T("%lf"), a);

上のようにして、double 型をテキストファイルに書き出して
いるのですが、書き込んだファイルを読み込んだとき、
値が完全に復元されないのですが、復元させるような方法が
あるのでしょうか?

数値自体は double の型の有効数字のみです。
開発環境は、WinXP, VS2005 です。

よろしくお願いします。
858デフォルトの名無しさん:2006/11/21(火) 01:21:49
>>857
それじゃ小数点以下6桁までしか出ない。
%.20gにしておけば、大抵は誤差がなくなるはず。
859デフォルトの名無しさん:2006/11/21(火) 01:44:50
>>857
あと、double型は内部的に2進数で小数を表現しているから、
10進表記で切りのいい数値だと思っていても実際には切り捨てられていることもあるよ。
860デフォルトの名無しさん:2006/11/21(火) 07:12:25
>>857
値を完全に復元したいのなら、fwrite等でバイナリ保存するべき
861デフォルトの名無しさん:2006/11/21(火) 07:46:04
環境: vs2005ee c/c++
    マルチバイト文字を使用にチェック済み

int map[4] = {0, 1, 1, 0};

for ( int i=0; i<4; ++i ) {
putchar( "0A"[map[i]] );
}
printf( "\n" );


putchar( "0A"[map[i]] ); を putchar( "□■"[map[i]] ); と表示したいのですが
画面表示をしようとしたのですが文字化けしてしまいます。
マルチバイト文字を表示させるにはどう書けばいいのでしょうか。
862デフォルトの名無しさん:2006/11/21(火) 07:57:14
「マルチ」バイトの意味解ってる?
863デフォルトの名無しさん:2006/11/21(火) 08:00:41
2バイト文字ですよね putwcharでも駄目でした
864デフォルトの名無しさん:2006/11/21(火) 08:00:42
>>861
Shift_JISの漢字は2byte分消費するのでchar一個に収まらん。

変わりにwchar_tを使って
putwchar(L"□■"[map[i]]);
とするか
for (j = 0; j < 2; ++i)
  putchar("□■"[2*map[i]+j]);
とでもするんだな。
865デフォルトの名無しさん:2006/11/21(火) 08:22:27
for( i=0; i<4; ++i )
putwchar(L"□■"[map[i]]);
こっちでは表示されませんでしたが


for( i=0; i<4; ++i ) {
for ( j=0; j<2; ++j )
putchar("□■"[2*map[i]+j]);
}
こっちでは表示されました。

ありがとうございました
866デフォルトの名無しさん:2006/11/21(火) 08:26:19
>>865
putwchar() 使うんなら、
あらかじめ setlocale() 呼んどく必要がある。
867デフォルトの名無しさん:2006/11/21(火) 08:43:08
ありがとうございます。

setlocale (LC_ALL, "Japanese"); を最初に追加し
もう一度やってみましたが、やはり表示されないようです。
868デフォルトの名無しさん:2006/11/21(火) 08:47:20
コンソールで Unicode 表示するのは、何か変なことしないと文字化けした気がする、確か
869デフォルトの名無しさん:2006/11/21(火) 09:29:14
>>867
訳が分からんな。俺の環境(VC7.1だが)では以下が動作するが。
""を"japanese"に変えても同じ。
---------------------------
#include <stdio.h>
#include <locale.h>

main()
{
  setlocale(LC_ALL, "");
  putwchar(L'あ');
}
---------------------------

>>868
putwcharはUnicode文字列をそのままWriteする訳ではないよ。
870デフォルトの名無しさん:2006/11/21(火) 09:39:31
ええ、こっちもわけが分かりません
>>869のでも表示されません。
871デフォルトの名無しさん:2006/11/21(火) 11:03:22
>>865
後者はこれでもいい。
printf("%.2s", "□■"[2 * map[i]]);
872デフォルトの名無しさん:2006/11/21(火) 11:56:54
質問させてください
VC++2005を使っているのですが、マクロ名の衝突を避けるために、今まで#defineで
定義していたマルチバイト、ワイドキャラの切替マクロを名前空間内にconstで定義
しようとしたのですが、下の例の様にtypedefを使わなかった時の定義がうまく
出来ません。
関数ポインタ型そのものを別の場所で使用する予定はないので、できればtypedefを
使わずに行ないたいのですが良い方法はありませんでしょうか?
よろしくお願いします。

namespace Macros{
typedef int (*TYPEPRINTF)(LPCTSTR,...);
#if defined _UNICODE
const TYPEPRINTF Printf1 = wprintf; // OK
const int (*Printf2)(LPCTSTR,...) = wprintf; // error C2440
int (*Printf3)(LPCTSTR,...) const = wprintf; // error C2270
#else
:
#endif
} // namespace
873デフォルトの名無しさん:2006/11/21(火) 12:09:06
>>872
int (* const Printf4)(LPCTSTR,...) = wprintf;
874デフォルトの名無しさん:2006/11/21(火) 12:14:52
JNIでjobject⇔cobjectの変換で楽な方法を教えてください
どーしてもゴリッとしたのしか・・・
875デフォルトの名無しさん:2006/11/21(火) 12:33:29
>>873
ありがとうございます。助かりました
876デフォルトの名無しさん:2006/11/21(火) 14:13:45
>>863
2バイト文字はマルチバイト文字と言えるが
マルチバイト文字即ち2バイト文字ではない
マルチバイト文字=1文字2バイト以上の文字
877デフォルトの名無しさん:2006/11/21(火) 14:17:29
JISコードだと文字列操作が大変。
878デフォルトの名無しさん:2006/11/21(火) 17:02:28
printfみたいに引数の数が任意の関数を作りたいんですが、詳しくはなんてググればいいですか
879デフォルトの名無しさん:2006/11/21(火) 17:04:19
可変引数 va_arg
880デフォルトの名無しさん:2006/11/21(火) 17:04:35
stdarg.h
881デフォルトの名無しさん:2006/11/21(火) 17:41:38
>>861-870
ワイド文字出力がだめなのはVisual C++ 2005のバグ。
ttp://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
882デフォルトの名無しさん:2006/11/21(火) 17:51:43
素直にASCII使っときゃ問題なんて起きないのにね。
883デフォルトの名無しさん:2006/11/21(火) 17:55:28
>>882
Windows NTはUTF-16がネイティブ。
884デフォルトの名無しさん:2006/11/21(火) 18:38:52
ちょwww
885868:2006/11/21(火) 21:15:34
>>881
そうそう、んで、メンバで何かをクリアしたら上手く動いたとかそんな話もあったはず。
あいまいでスマン('A`)
886デフォルトの名無しさん:2006/11/21(火) 22:54:10
標準出力を関数呼び出しに中継することはできますか?

pythonとかrubyとかをプログラムの中から呼び出し
スクリプトが吐く標準出力などを自分で作ったGUIに描写したいです
887デフォルトの名無しさん:2006/11/21(火) 22:56:28
|を使えばいいんじゃね?
888デフォルトの名無しさん:2006/11/21(火) 23:02:16
man popen
889デフォルトの名無しさん:2006/11/21(火) 23:17:24
>>888
マンピーをオープン?
890デフォルトの名無しさん:2006/11/21(火) 23:26:39
VC8でfgetcしたら↑↓で補完できたけど前から出来た?
891デフォルトの名無しさん:2006/11/21(火) 23:27:40
補完じゃねえやヒストリ
892886:2006/11/21(火) 23:34:48
すみません 効率などを考慮し、別プロセスとしてではなく
rubyの場合だとrb_load_fileやrb_eval_stringなど
pythonの場合だとPyRun_SimpleFileやPyRun_SimpleStringなど
を使って実行したスクリプトの標準出力を自分で用意した関数に中継しGUIに描写したいです
893デフォルトの名無しさん:2006/11/21(火) 23:37:44
るぅびぃって言語なの?

HTMLを出力するうんこツールじゃないの?
894デフォルトの名無しさん:2006/11/21(火) 23:38:07
中継するの意味を詳しく
895デフォルトの名無しさん:2006/11/21(火) 23:38:45
同じプロセス空間内で実行すれば効率がいいと思い込んでいるのだろうか。
896886:2006/11/21(火) 23:53:28
void my_stdout(const std::string& s) {
 buf += s;
 // View 更新
}

int main() {
 set_stdout_func(my_stdout);
  ruby_init(...);
  rb_eval_string("print \"Hello from ruby script\"");
 ....
}
set_stdout_func相当を実現したいです
上記の例ではGUIに"Hello from ruby script"と表示されます...

897デフォルトの名無しさん:2006/11/22(水) 00:11:12
>>890
NT系のWindowsならできる。
VC8とか関係ない。キーボードドライバがやってる。
898デフォルトの名無しさん:2006/11/22(水) 00:34:07
error LNK2019: 未解決の外部シンボル "public: char const * __thiscall type_info::name(void)const "
コレって何が原因でつか?
899デフォルトの名無しさん:2006/11/22(水) 00:35:20
>>896
パイプ使えばいいだろ…
900デフォルトの名無しさん:2006/11/22(水) 00:35:39
>>898
type_info::name() が使われてるけど、適切なライブラリがリンカに渡されていない。
901デフォルトの名無しさん:2006/11/22(水) 00:37:23
>>900
どのライブラリか教えてもらえますか?
902デフォルトの名無しさん:2006/11/22(水) 00:47:50
>>901
わかんない。でも↓にいくらか情報があるっぽい。
http://www.google.co.jp/search?q=LNK2019+type_info+name

VS2003 でコンパイルしたのと VS2005 でコンパイルしたの混ぜてない?
903デフォルトの名無しさん:2006/11/22(水) 00:51:53
>>902
一応全部2005でリビルドしてるんですが・・・
元がmsvc6のソースなのが関係してるのでしょうか?
904デフォルトの名無しさん:2006/11/22(水) 00:55:30
>>903
VC6 用にビルドされたライブラリ食わせてたりしない?
905898:2006/11/22(水) 01:04:17
>>904
クリーンからリビルドですし、
VSとPSDKしかみてないのですが・・・

例外部分のログメッセージでのエラー名だったのでコメントにして対処してしまいました。
原因は別で取ってきてるので。
906デフォルトの名無しさん:2006/11/22(水) 01:12:20
RTTI?
907デフォルトの名無しさん:2006/11/22(水) 01:24:07
>>906
RTTIが検索に引っかかったのですがPocketPC周りの情報しか見つからず放置しておりました。
詳しく教えていただけますでしょうか?
908デフォルトの名無しさん:2006/11/22(水) 01:27:37
つ /GR (ランタイム型情報の有効化)
909デフォルトの名無しさん:2006/11/22(水) 01:39:44
>>908
ありがとうございます。
調べましたが/GRはすべてのプロジェクトでついていました。
何が原因なのやら・・・
910デフォルトの名無しさん:2006/11/22(水) 08:39:48
はて、うちのVC7で新規プロジェクト作成してtype_info使ってみたがエラーでなかったなぁ
元がVC6のソースってことだから、何か修正せにゃいけんところを見落としてるとかだろうけど・・・
911デフォルトの名無しさん:2006/11/22(水) 09:08:19
とりあえずコンパイルオプションとリンカオプションコピペしてみ。
プロジェクトのプロパティからC/C++やリンカのコマンドラインって項目に載ってるから。
912デフォルトの名無しさん@質問者:2006/11/22(水) 11:49:44
関数の引数が、const char*であるにも関わらず、コンパイルが通り
書きかえられちゃいます。変更できないと思うんですが、
何か間違っているでしょうか?

※環境は、Visual C++ 2005 Express Edition 日本語版です。

#include <iostream>
using namespace std;

void test(const char* pstr)
{
pstr = "abc";
cout << pstr ;
}

int main()
{
test("ABC");

return 0;
}
913デフォルトの名無しさん:2006/11/22(水) 12:00:15 BE:46584083-2BP(200)
書き換えられるのはpstrであって、pstrが指している文字列定数の中身ではないので
何も問題ないような。
914デフォルトの名無しさん:2006/11/22(水) 12:02:23
>>912
そのコードで問題ないのは正常。

おまいさんがやりたいのはたぶんこっち
>void test(const char* pstr)
        ↓
void test(char* const pstr)
915デフォルトの名無しさん:2006/11/22(水) 12:11:13
つーか、const char * const pstrでいいよ、もう。
916デフォルトの名無しさん@質問者:2006/11/22(水) 12:15:43
>>913
>>914
ありがとうございます。
間違っていました。
上の例では、指しているところを変えただけでしたね。
917デフォルトの名無しさん:2006/11/22(水) 13:20:59
VS2005 VC++ MFCで作ってます。

void Aaaa::bbb()
{
Cccc Dddd;

bool (Cccc::*p_func)(void); ---(1)
p_func = &Cccc::func; ---------(2)
(Dddd.*p_func)(); --------------(3)
}

クラスCcccの関数funcのポインタを取得して実行する動作で、上記のように
した場合問題ありませんが、(1)をクラスCcccに関する記述があるヘッダファイルへ
(2)をCcccのコンストラクタへ記述するとコンパイルで(3)がエラーになります。
(勿論その場合(1)と(2)はコメント)
この場合どうすればいいのでしょうか?
918デフォルトの名無しさん:2006/11/22(水) 16:49:07
(this->*p_func)();で動くというオチ?
919デフォルトの名無しさん:2006/11/22(水) 16:56:17
>>918
どっかのサイトにそれ書いてあってチャレンジしてみましたがダメでした。
何か記述間違ってたのかな?
920デフォルトの名無しさん:2006/11/22(水) 17:27:49
教えて神さま

class A{
//メンバ
 class B;
 ・・・
}

見たいのがあってclass Bを拡張したとき

class C : public B{
・・・・
}

で、Bを拡張したclass Cをメンバに持つclass Dを書きたいんだけど

class D{
//メンバ
class C;
・・・・(ほとんどAといっしょ)
}

なんかすっきり書けないっすかね。。
921デフォルトの名無しさん:2006/11/22(水) 17:47:31 BE:122283397-2BP(200)
>>920
こんな感じで。
class BC {...}
class B : public class BC {...}
class C : public class BC {...}

class AD {
//メンバ
class BC* hoge;
}

class A : public class AD {
//メンバ
class B hoge_b;
A() { hoge = &hoge_b; }
}

class D : public class AD {
//メンバ
class C hoge_c;
D() { hoge = &hoge_c; }
}
922デフォルトの名無しさん:2006/11/22(水) 18:00:32
920

>921
m(_ _)m
なんでc++ってインターフェースないんすかね
923デフォルトの名無しさん:2006/11/22(水) 18:11:33
それだけではわからないが、場合によってはAをクラステンプレートにしたほうがいいかもしれないと思う。
924デフォルトの名無しさん:2006/11/22(水) 18:48:06
>>922
多重継承が出来るから
925デフォルトの名無しさん:2006/11/22(水) 19:05:20
/libpathの指定でProgram Filesみたいな空白のある場合ってどうすればいいのでしょうか?

#pragma comment (linker, "/libpath:\"/Program Files/XXX/lib\" ")
としてみましたがうまく動いていないみたいです

includepathの指定も#pragma でできないのでしょうか?
926デフォルトの名無しさん:2006/11/22(水) 20:34:15
どう見ても、肝心のパス部がクォートされてないんだがな
927デフォルトの名無しさん:2006/11/23(木) 01:00:05
>>921-922
BC に必要なインターフェースをきっちり抽出していれば、
A, D は要らなくて AD だけで済むんじゃないの?
928デフォルトの名無しさん:2006/11/23(木) 01:01:59
>>917 エラーメッセージ貼れ。できればエラーの出るソースもな。
929デフォルトの名無しさん:2006/11/23(木) 10:36:02
>>924
多重継承を使う人は頭が悪いスパゲッティ君
930デフォルトの名無しさん:2006/11/23(木) 10:51:57
Java/C#でもインタフェースの多重継承は認めない人ですか。
931デフォルトの名無しさん:2006/11/23(木) 10:54:22
せ、先生〜!
>>929に馬鹿がいます!
932デフォルトの名無しさん:2006/11/23(木) 10:55:08
せ、先生〜!
スパゲッティが食べたいです!
933デフォルトの名無しさん:2006/11/23(木) 11:15:42
         ,. ‐''三ヾ´彡シ,=`丶、
     /'".:=≡ミ_≧_尨彡三:ヽ、
    //.:;:彡:f'"´‐------ ``'r=:l
    /〃彡_彡′,.=、 ̄ ̄ ,.=、 |ミ:〉
   'y=、、:f´===tr==、.___,. ==、._ゞ{
   {´yヘl'′   |   /⌒l′  |`Y}
   ゙、ゝ)       `''''ツ_  _;`ー‐'゙:::::l{   あきらめたら?
.    ヽ.__     ,ィnmmm、   .:::|!
  ,.ィ'´ト.´     ´`"`"`゙″ .::::;'
イ´::ノ|::::l \         "'   :::/
::::::::::::|:::::l   ヽ、      ..::  .:::/.、
:::::: ::: |:::::ヽ    ヽ、.......::::/..:::/!\\
::::::::::: |::::::::ヽ    ``''‐--ァt''′ |!:::ヽ:::\
:::::::::::::|::::::::::::ヽ、       /i|iト、  |l:::::::ヽ:::::\
:::::::::::::|::::::::::::::/:ヽ、   ∧|i|i|i|〉. ||::::::::::ヽ:::::::\
934デフォルトの名無しさん:2006/11/23(木) 11:16:09
ここで長年の疑問、なぜナポリタンス(ry
935デフォルトの名無しさん:2006/11/23(木) 12:15:13
>>934
ほう。ナポリのタンスか。
936デフォルトの名無しさん:2006/11/23(木) 12:20:56
じゃあ僕はインスタントラーメンちゃん!!
937デフォルトの名無しさん:2006/11/23(木) 13:06:00
Objective-CじゃなくてC++を使う人は頭が悪いスパゲッティ君
938デフォルトの名無しさん:2006/11/23(木) 13:59:53
  __,冖__ ,、  __冖__   / //      ,. - ―- 、
 `,-. -、'ヽ' └ァ --'、 〔/ /   _/        ヽ
 ヽ_'_ノ)_ノ    `r=_ノ    / /      ,.フ^''''ー- j
  __,冖__ ,、   ,へ    /  ,ィ     /      \
 `,-. -、'ヽ'   く <´   7_//     /     _/^  、`、
 ヽ_'_ノ)_ノ    \>     /       /   /  _ 、,.;j ヽ|
   n     「 |      /.      |     -'''" =-{_ヽ{
   ll     || .,ヘ   /   ,-、  |   ,r' / ̄''''‐-..,フ!
   ll     ヽ二ノ__  {  / ハ `l/   i' i    _   `ヽ
   l|         _| ゙っ  ̄フ.rソ     i' l  r' ,..二''ァ ,ノ
   |l        (,・_,゙>  / { ' ノ     l  /''"´ 〈/ /
   ll     __,冖__ ,、  >  >-'     ;: |  !    i {
   l|     `,-. -、'ヽ'  \ l   l     ;. l |D言語| !
   |l     ヽ_'_ノ)_ノ   トー-.   !.    ; |. | ,. -、,...、| :l
   ll     __,冖__ ,、 |\/    l    ; l i   i  | l
   ll     `,-. -、'ヽ' iヾ  l     l   ;: l |  { j {
   |l     ヽ_'_ノ)_ノ  {   |.      ゝ  ;:i' `''''ー‐-' }
. n. n. n        l  |   ::.   \ ヽ、__     ノ
  |!  |!  |!         l  |    ::.     `ー-`ニ''ブ
  o  o  o      ,へ l      :.         |
           /   ヽ      :
939デフォルトの名無しさん:2006/11/23(木) 17:32:47
質問です。
文字列の指定した箇所の文字列だけを比較しようと思ったらどうすればいいのでしょうか。
たとえば、

私は太郎です。

という文字列があったとき、
3,4文字目(2バイトなので5〜8文字目ですが)が「太郎」のとき、
という条件を指定するにはどうすればいいのでしょうか。
940939:2006/11/23(木) 17:36:13
書き忘れました。Cです。
941デフォルトの名無しさん:2006/11/23(木) 17:46:54
比較関数に「太」へのポインタを渡す
942デフォルトの名無しさん:2006/11/23(木) 17:53:15
>>939
if (strlen(s) >= 8 && strncmp(s + 4, "太郎", 4) == 0) {
  ...
}
943デフォルトの名無しさん:2006/11/23(木) 17:58:57
>>941-942
どうもありがとうございました。
944デフォルトの名無しさん:2006/11/23(木) 18:01:29
前段で長さ8以上を保証しているからmemcmp()でもいいね。
945デフォルトの名無しさん:2006/11/23(木) 18:23:04
クラス内でstatic const floatの初期化できないけど、
変わりに良い方法ってないかな
946デフォルトの名無しさん:2006/11/23(木) 18:25:07
static const intなら宣言部で定義可能だが、それ以外の型は
外部で定義するしかない。コンストラクタもstaticには無力。
947デフォルトの名無しさん:2006/11/23(木) 18:25:23
>>945
クラス外に定義するとか。 static メンバ関数をインラインで定義するとか。
948デフォルトの名無しさん:2006/11/23(木) 19:06:59
>>946 >>947
レスありがと。参考にしてみます。
949デフォルトの名無しさん:2006/11/23(木) 19:21:56
質問があります。
拡張子がrtfのファイルに関連するアイコンデータがプログラムから
ひつようなのですが、レジストリエディタで確認すると
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1
になっていました。
このリソースIDは何番にしたらいいですか?ワードパッドみても
リソースIDが一番のアイコンはありませんでした。

よろしくお願いします
950デフォルトの名無しさん:2006/11/23(木) 19:23:42
>>949
すれ違い。悪いが誘導先もわからん。
951デフォルトの名無しさん:2006/11/23(木) 19:29:14
http://pc8.2ch.net/test/read.cgi/tech/1163375772/
ここかな?
あとはWindows板かも
952949:2006/11/23(木) 19:36:42
申し訳ありません。移動します
953デフォルトの名無しさん:2006/11/23(木) 19:50:13
駆け出しです。

char *r = "あいうえお";

として、最初の1文字、2文字を表示させようと思って
printf("%-2s %-4s",r,r);

としたのですが、これではすべてが出力されてしまいます。
どうすれば?
954デフォルトの名無しさん:2006/11/23(木) 19:54:38
char buf[ BUF_MAX ];
で宣言された配列をwhile()ループで回す時に、buf[ BUF_MAX ]へのポインタ
が必要になったのですが、
char *p_buf_end = buf[ BUF_MAX ];
にしてしまうと、p_buf_endという名前が buf[ BUF_MAX -1 ] と紛らわしい
のではないか?と悩んでいます。
この場合、どのような変数名にするのが無難でしょうか?
955デフォルトの名無しさん:2006/11/23(木) 20:00:04
>>953
ドットも忘れないでやってください。
Ex.
"%-.2s"
956デフォルトの名無しさん:2006/11/23(木) 20:01:03
>>954
std::vectorでは、end()とlast()で使い分けている。
957デフォルトの名無しさん:2006/11/23(木) 20:02:36
>>956
参照してみます。ありがとうございました。m(__)m
958デフォルトの名無しさん:2006/11/23(木) 20:05:05
>>956 std::vector に last() なんてないぞ。
959デフォルトの名無しさん:2006/11/23(木) 20:26:57
>>955
できたよ!
どうもありがとうございました。
960デフォルトの名無しさん:2006/11/23(木) 23:25:31
>>954
for(i = 0; i < sizeof buf; i++) {
  buf[i];
}

わざわざポインタ使う必要ないんじゃない?
961デフォルトの名無しさん:2006/11/23(木) 23:29:05
>>960
名前の付け方に関する質問なんだからそのレスは見当違いだろう。
仮に今回はそれでいいとしても配列を超えたとこのポインタが必要になることはないとも限らん。
962デフォルトの名無しさん:2006/11/24(金) 00:00:09
クラス名・変数名に迷ったら書き込むスレ。Part8
http://pc8.2ch.net/test/read.cgi/tech/1154448184/l50
963デフォルトの名無しさん:2006/11/24(金) 02:30:01
p_buf_goal = buf + BUF_MAX
964デフォルトの名無しさん:2006/11/24(金) 03:16:22
loadavgファイルに過去の負荷が1行に1つで、
計10万ほど保存されていて、
下記のようなコードを書いて読み取ろうとしたところ、
はじめの3千から4千行ぐらい(?)まではうまくいくのですが、
途中からファイルから数値をよみこんでくれなく、
同じ数字のみが出力されるようになります。
どのようにすれば全部の数字を読み込んでくれるでしょうか?

#include<fstream>
int i;
float avg,outavg;

ifstream infile("loadavg");
for(i=0;i<60000;i++){
infile>>avg;
outavg=avg/0.02
cout<<outavg<<"\n";
}
965デフォルトの名無しさん:2006/11/24(金) 03:20:56
>>964
- for(i=0;i<60000;i++){
- infile>>avg;
+ while(infine>>avg){
966デフォルトの名無しさん:2006/11/24(金) 03:36:56
>>965
今試してみましたが
8825行目ぐらいまでしか読み込んでくれません。
何事もなかったかのようにwhileループを抜けてしまいます。
967デフォルトの名無しさん:2006/11/24(金) 03:42:13
>>966
8825行目あたりに float として読めない文字があるんじゃないの?

あとは、 #include <cstdio> して while ループ抜けた後
if (!infile.eof()) perror("infile"); ってしとけ。
出入力エラーがあれば、これで表示されるだろう。
968デフォルトの名無しさん:2006/11/24(金) 04:46:57
>>967
ファイルを確認してみたところ特に変わったところはありませんでした
あと、試してみたところ,sucessと表示されました。
969デフォルトの名無しさん:2006/11/24(金) 05:30:34
オーバーフロー
970デフォルトの名無しさん:2006/11/24(金) 07:25:06
>>968
やっぱり途中で止まってるな。 >>967 のとおりだろ。
最後に読み込まれた数値の次にある文字列をファイルの
先頭にコピペすれば、どうせ最初で止まるだろう。
971デフォルトの名無しさん:2006/11/24(金) 11:02:50
Hoge(Foo& foo);
って宣言したコンストラクタがgccでコンパイルとおらない。
error: expected `)' が '&' トークンの前にあります
こういうエラー出してくる。
972デフォルトの名無しさん:2006/11/24(金) 11:20:39
>>971
同じ問題の発生する最小のソースと、コマンドラインを貼ってみろ。
973デフォルトの名無しさん:2006/11/24(金) 11:26:00
Cとしてコンパイルしている落ちとか。
974デフォルトの名無しさん:2006/11/24(金) 11:30:03
>>972
namespace foo
{

class Hoge
{
public:
Hoge(foo::Foo & foo);
virtual ~Hoge() = 0;
virtual void setStereo(bool flag) = 0;
virtual bool isStereo() = 0;
private:
protected:
};

}

/usr/local/bin/i386-mingw32-g++ -fno-exceptions -fno-rtti -I.
975デフォルトの名無しさん:2006/11/24(金) 12:19:02
ステップ実行中ではifstreamがファイルの読み込みに失敗します。なぜですか?
Microsoft Visual C++ 2005 Express Edition + STLPort 5.0.2の環境です。
976デフォルトの名無しさん:2006/11/24(金) 13:07:18
>>974
namespaceのfooとHogeコンストラクタの仮引数のfooが被ってる
977デフォルトの名無しさん:2006/11/24(金) 13:12:12
>>976
仮引数の名前を変えてもエラーが出ます。
978デフォルトの名無しさん:2006/11/24(金) 13:22:05
>>977
namespace foo の中に Foo は解決されてるのか?
最小コードが >>974 だとしたら、foo::Foo なんて型はないぞ
979デフォルトの名無しさん:2006/11/24(金) 13:29:03
>>972
インクルードで解決してる。
980デフォルトの名無しさん:2006/11/24(金) 14:04:13
>>974
こういう情報を小出しにするアホは死んだ方がいい
981デフォルトの名無しさん:2006/11/24(金) 14:22:37
>>980
何が必要十分であるか分からないくせに
自分で勝手に判断して情報を制限・抽象化する。
初心者とはそういうものだ。
初心者歓迎のスレタイ掲げてその台詞はちときつい気がするよ。
982デフォルトの名無しさん:2006/11/24(金) 14:29:15
質問しても良いですか?
メモリの指定範囲で書き込んだ値を調べる関数を作っています。
writeがメモリに書き込んだ値で、違う値が書き込んであったら-1を返します。
int color_false(char *memadd, char write, int sx, int sy)
{
char p;
int x, y;
for (y = sy; y <8; y++){
for (x = sx; x<8; x++){
p = memadd[ y * 320+ x ];
if(write != p)
goto hoge;
}

}
return 0;
hoge:
return -1;
}
まったく逆のメモリに書き込む関数は上手くいったのですが、
書き込んだ値を読み込む関数が上手くいきません。
何故か違う色を書き込んでいるところを指定しても
戻り値が0になってしまいます。
for文をネストしなくてVRAM[100]とかだと、上手く識別してくれます。
基本的に書き込む時と逆の処理しかしていないのですが
何故上手くいかないか分かる方いらっしゃいますでしょうか?
983デフォルトの名無しさん:2006/11/24(金) 14:37:54
>>982
>for (y = sy; y <8; y++){
>for (x = sx; x<8; x++){

何やってんだよ
やりたいことは y < (sy+8) と x < (sx+8) か?

あと if( write != p ) return -1; でいっきに抜けたほうがきれいだぞ
がんがれ
984デフォルトの名無しさん:2006/11/24(金) 14:52:46
>何やってんだよ
>やりたいことは y < (sy+8) と x < (sx+8) か?
違うんです。
p = memadd[ y * 320+ x ];
memadd[0]、memadd[1]、memadd[3]、memadd[320]、memadd[321]・・・
見たいな感じで調べたいんです。
変数を使うと上手くいかないんです。
>あと if( write != p ) return -1; でいっきに抜けたほうがきれいだぞ
>がんがれ
if( write != p ) return -1;って出来ますよねぇ。
何やつっても上手くいかないので、goto文使えばうまくいくかなっと思って
いろいろ試してました。
頑張ります。
985デフォルトの名無しさん:2006/11/24(金) 14:57:48
>>984
違うってことはsy,sxが8以上だと何もせずにチェックが終了することになるが・・・
986デフォルトの名無しさん:2006/11/24(金) 15:05:44
やりたいことはfor (x = 0; x < sx; ++x) だと思うんだがなぁ。
987デフォルトの名無しさん:2006/11/24(金) 16:35:55
>>985
>>986
ナイスな返答有難うございます。
分かりました!
988デフォルトの名無しさん:2006/11/24(金) 16:38:25
エスパーが必要だな。
989デフォルトの名無しさん:2006/11/24(金) 17:15:35
紙ヒコーキ先生に命中
990デフォルトの名無しさん:2006/11/24(金) 17:36:46
ツいてないね
991デフォルトの名無しさん:2006/11/24(金) 17:41:39
テレポーテーショーン
992デフォルトの名無しさん:2006/11/24(金) 18:59:16
Cって関数の引数に構造体使うとコピーされるんでしたっけ?
993デフォルトの名無しさん:2006/11/24(金) 19:04:15
>>992
YES コピーされるよ
994デフォルトの名無しさん:2006/11/24(金) 19:54:07
関数の引数に構造体を指定できない処理系ってありますか?
995デフォルトの名無しさん:2006/11/24(金) 20:28:28
よっぽど古かったりサブセット過ぎたりすると、構造体はポインタでないと渡せなかったり内部で勝手にポインタ渡ししたりする。
996デフォルトの名無しさん:2006/11/24(金) 22:16:35
構造体の値渡しは勘弁してくれ
997デフォルトの名無しさん:2006/11/24(金) 22:23:00
>>996
っ[ldiv]
998:2006/11/24(金) 22:38:07
Windowアプリケーションが作りたくて、Win32 APIについて勉強しています。
その中で、C言語でつくったプログラムを使用したいのですが、どうすればよいのかまったくわかりません。
そもそも、そういうことはできるのですか?
999デフォルトの名無しさん:2006/11/24(金) 22:44:42
1000デフォルトの名無しさん:2006/11/24(金) 22:45:12
ついでに1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。