【初心者歓迎】C/C++室 Ver.32【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/10/15(日) 15:30:51ただしその場合、質問者は必ず、環境を書きましょう。
※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
0002デフォルトの名無しさん
2006/10/15(日) 15:57:580003デフォルトの名無しさん
2006/10/15(日) 16:00:590004デフォルトの名無しさん
2006/10/15(日) 16:04:170005デフォルトの名無しさん
2006/10/15(日) 16:19:560006デフォルトの名無しさん
2006/10/15(日) 16:27:48ログが見つからないので、知ってる人編集して
↓まとめサイト。
http://ja001.sukiwikiweb.com/candcppkankyouok
0007デフォルトの名無しさん
2006/10/15(日) 16:35:22VC++2005でプログラムの勉強をしています。
結果の表示にはコンソールを使っています。
例えば、円の面積を計算するプログラムをつくったのですが、
半径を入れて計算すると、一瞬ぱっとでてすぐ消えます。
これは普通の文章を表示するプログラムを作った時にもあったので
ネットで検索したら、対応策があり、すぐに解決しましたが、
計算結果の場合はうまくいきません。
半径を入力したあとにenterキーを押すからでしょうか?
うまい方法があったら教えてください。
0008デフォルトの名無しさん
2006/10/15(日) 16:36:010009デフォルトの名無しさん
2006/10/15(日) 16:37:22もう一回getchar()する
0010デフォルトの名無しさん
2006/10/15(日) 16:39:41デバックなしで実行
0011デフォルトの名無しさん
2006/10/15(日) 16:46:35コマンドラインから起動
0013デフォルトの名無しさん
2006/10/15(日) 18:39:02規格では「してもよい」とされているだけなので、
戻り値最適化の条件はコンパイラによる。
コピーコンストラクタや代入演算子の有無で最適化の
可能性に影響するとは思わないので、大丈夫なんじゃないかね。
0014デフォルトの名無しさん
2006/10/15(日) 19:20:24newを使用した場合とvectorを使用した場合で
メモリ量は異なるのでしょうか?
型のサイズを調べると
sizeof(float)は4、sizeof(vector<float>)は12なのに、
cygwin上のtopコマンドで調べると総メモリ量は同じになります。
「配列のサイズ=型のサイズ×配列数」とは限らないのでしょうか?
初歩的な質問ですみません。よろしくお願いします。
0015デフォルトの名無しさん
2006/10/15(日) 19:34:49従ってそのサイズはvectorがどう実装されているかによる。
それからvectorのインスタンスが占めるメモリの大きさと
vectorが持つメモリブロックの大きさには何の関係もない。
001614
2006/10/15(日) 19:44:41なるほど。勉強不足ですみません。
単純に動的配列で使うならnewでもvectorでもメモリ量は同じなんですね。
vectorはメモリを食うからvalarrayを使う方が良いと
どこかで書いてあったのは何だったんだろう…。
もうちょっと勉強します。ありがとうございました。
0017デフォルトの名無しさん
2006/10/15(日) 19:46:250018デフォルトの名無しさん
2006/10/15(日) 20:26:27戻り値最適化が働くとコピーコンストラクタの呼び出し回数が減ると思うんです。
なのでそんなかで副作用のあることしたりしたら最適化されなくなっちゃうのかなと思ったんですよ。
0019デフォルトの名無しさん
2006/10/15(日) 20:33:38戻り値最適化される可能性があるので、呼び出し回数で結果が変わってしまうような
副作用をコピーコンストラクタに持たせるべきではない。
これは C++ プログラマの責任なので、コンパイラがそこまで見て最適化の
有効無効を決めるべきではない。もし、あるコンパイラがそこまで面倒を見てくれて、
それに依存したコーディングをしてしまえば、移植性を失うことになる。
0020デフォルトの名無しさん
2006/10/15(日) 20:40:230021デフォルトの名無しさん
2006/10/15(日) 23:11:2710
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;
}
0022デフォルトの名無しさん
2006/10/15(日) 23:13:160023デフォルトの名無しさん
2006/10/15(日) 23:17:21すこし言葉たりませんでした。
iを型変換してaに代入したいと思います。
0024デフォルトの名無しさん
2006/10/15(日) 23:20:520025デフォルトの名無しさん
2006/10/15(日) 23:23:37char *a="test"; で sprintf() を使うのはどうかと。
0026デフォルトの名無しさん
2006/10/15(日) 23:25:08a = s.c_str();
0027デフォルトの名無しさん
2006/10/15(日) 23:36:260028デフォルトの名無しさん
2006/10/15(日) 23:47:57相談するつもりならソースと症状を晒せ。
0029デフォルトの名無しさん
2006/10/15(日) 23:53:5321で相談していたものです。すみません。
sprintfを使って少し考えてみます。
0030デフォルトの名無しさん
2006/10/16(月) 02:17:25C++プログラムとして認められませんか?
0031デフォルトの名無しさん
2006/10/16(月) 08:55:270032デフォルトの名無しさん
2006/10/16(月) 09:33:26肝心なのは使い方がスマートかどうかだ
0033デフォルトの名無しさん
2006/10/16(月) 12:43:39「C言語を始めよう」でコンパイラの位置を指定し
(C:\borland\bcc55\Bin\bcc32.exe)、実行すると
Error: 外部シンボル 'wWinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32W.OBJ が参照)
と出てきて実行できません。なぜでしょうか?
0034デフォルトの名無しさん
2006/10/16(月) 13:09:310035デフォルトの名無しさん
2006/10/16(月) 15:30:39例えばaと入力すると文字コードaを表す値97が表示されますが
xの型をint型にすると9445729という値が出ます。
Cでは文字定数はint型なのに何がダメなんでしょうか。
char x;
printf("英字入力>>>");scanf("%c",&x);
printf("%d\n",x);
0036デフォルトの名無しさん
2006/10/16(月) 15:40:16char x;
int v;
.....
scanf("%c", &x); v=x;
printf("%d\n",v);
とすればよかろう
003735
2006/10/16(月) 16:02:37そのやり方でint型に変換することで出来るのは分かったのですが、
イマイチ「charと期待して書き込んでいる」という所が分からないので
図々しいようですが詳しい説明をお願いできますか><
上の表示部分を下のように%cにすると正常にaと表示されるということは
不正な操作で誤った値が代入されているということではないということなのでしょうか。
int x;
printf("英字入力>>>");scanf("%c",&x);
printf("%c\n",x);
0038デフォルトの名無しさん
2006/10/16(月) 16:02:53scanfの%cはcharへのポインタが渡されることを前提にしている。
また自動変数を初期化しないと、内容は不定(ごみが入っている)。
だから、int x = 0;のように初期化してやるか、
printf("%d\n", x & 0xff);のように要らないところをマスクしてやれば、
おそらくうまくいく。(ただし規格に照らし合わせて問題ないかはわからない)
0039デフォルトの名無しさん
2006/10/16(月) 16:14:10そのコードだとリトルエンディアンしか通用しないんじゃ?
004035
2006/10/16(月) 16:55:46char型(1バイト)とint型(とりあえず4バイト)を考えると同じ97でも
charだと01100001で、
intだと00000000 0000000 0000000 01100001で表している。
%cで指定したscanfはchar型の8ビット、
この01100001の部分に値を入れるけど他24ビットには何もしない。
そして%cでも同様に8ビットだけ見て、そこで表されている文字を表示する。
その結果正しい文字が表示される。
しかし%dは全32ビットに注目するので残り24ビットを0にしておかないと不定値が出る。
という結論になったのですがこの理解でOKでしょうか?><
0041デフォルトの名無しさん
2006/10/16(月) 17:05:38まだ、そこまでいっていないのなら さしあたり >>40 の認識(間違っているが)でも良いかもしれん。
004235
2006/10/16(月) 17:18:36ポインタは柴田さんの「ポインタの極意」とかも読んだので
基本レベルならとりあえずちゃんと分かってる感じです。
間違っている認識だと気持ち悪いので、
理解できないかもしれませんが分からなかったら自分で勉強してみるので
そのポインタの話伺えますか。
0043デフォルトの名無しさん
2006/10/16(月) 17:25:401) "%c" というヒントをもらった。
2) ポインターで書き込み対象の変数の先頭アドレスだけは分かる。
3) "%c" の指示に従い、2)のポインターから char サイズ分しか値を書き込まない。
こういう動作をする関数に対して無理矢理 int のポインターを渡した。
上記 3) で書き換えた部分はいったい何処に相当するのか? その結果どうなるのか?
○ char ⇔ int の実装上の大きさ、メモリ配置は環境によりばらばら。
004435
2006/10/16(月) 17:37:24あぁなるほど!!
すごい分かりやすい説明ありがとうございます!
やっと理解できました!><
初めこのバグが出たとき完全に意味が分からなくてどうしようかと思いましたorz
文系で周りに聞ける人がいないので本当に助かりました。
本当にありがとうございました><
0045デフォルトの名無しさん
2006/10/16(月) 21:39:56char 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出来ない 理由は何が考えられますか?
0046デフォルトの名無しさん
2006/10/16(月) 21:48:320047デフォルトの名無しさん
2006/10/16(月) 21:50:020048デフォルトの名無しさん
2006/10/16(月) 22:07:19fcloseでfdが無効になった後のfeof, ferrorはダメだろ。
0049デフォルトの名無しさん
2006/10/16(月) 22:28:44NULLを返した直後に実行したら、エラーなし、EOFだったんです。
ちなみに、512を20とかにすると動きました。
これはメモリ枯渇ですかね???
0050デフォルトの名無しさん
2006/10/16(月) 22:32:400051デフォルトの名無しさん
2006/10/16(月) 22:36:030052デフォルトの名無しさん
2006/10/17(火) 11:09:510053デフォルトの名無しさん
2006/10/17(火) 11:45:06Cでは文字定数はint型なのに文字配列にする時にはchar moji[]
とかってなるのは何ででしょうか?
要素はint型なのにchar?
0054デフォルトの名無しさん
2006/10/17(火) 12:04:14VC++6を使っているのですが、使用している関数がスレッドセーフ関数かどうかは
どうやって調べるのでしょうか?
0055デフォルトの名無しさん
2006/10/17(火) 12:08:41何の関数か知らないが、標準関数ならMSDNに書いてあると思う。
005654
2006/10/17(火) 12:14:46標準関数と、WIN32APIです。
MSDNってお金払わないと買えないやつですよね?
VC++6だけでも高いのにMSDNが必要なのか・・・。
誰か持っている奴に見せてもらうしかないかなぁ〜
0057デフォルトの名無しさん
2006/10/17(火) 12:18:380058デフォルトの名無しさん
2006/10/17(火) 12:19:49005954
2006/10/17(火) 12:41:50>>57
オッケー。探してみます。
>>58
オッケー。探して見ます。
ついでに言うと、標準関数だけで、一覧になっているものってないでしょうか?
0060デフォルトの名無しさん
2006/10/17(火) 12:45:26006154
2006/10/17(火) 13:53:09という事で、Web版のMSDNを見てみました。
有名なlocaltimeに関して調べて見たところ、スレッドに関する記述はありませんでした。
ただ、互換性のところを見ると、「ライブラリをLIBCMT.LIBにすれば、マルチスレッド対応になるよ」
的な事が書いてあるので、基本的に全ての関数はLIBCMT.LIBを使う限り、
スレッドセーフと考えてよいのでしょうか?
0062デフォルトの名無しさん
2006/10/17(火) 13:54:07どういう仕組みでしょうか?しかも短い処理分じゃないと使えないそうで・・・
調べたところ、インライン関数を呼び出した所にコードを埋め込むとのことですが、
よくわからなかったのでわかりやすいように説明してくれませんか?
0063デフォルトの名無しさん
2006/10/17(火) 13:56:43Java等で「System.io」と記述するところはC++では「System::io」となるのですか?
また、「System:io」のように「:」を一つだけ記述したり3つ以上記述するようなことはあるのでしょうか
0064デフォルトの名無しさん
2006/10/17(火) 14:09:50:一つは文法上ある。
:::のように三つは文法上ない。
0065デフォルトの名無しさん
2006/10/17(火) 14:13:45例えばこんなコードがあったとする。
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;
}
0066デフォルトの名無しさん
2006/10/17(火) 14:49:37Cの表記でわからなくなったので教えてくれ。
struct s A[10];
memset( A, 0, sizeof(struct s)*10 );
初期化してるだけなんだが、
A
&A
&A[0]
この3つは、同じアドレスを示してる。
本来正しい表記は、どれ?
0067デフォルトの名無しさん
2006/10/17(火) 15:01:04俺はAか&A[0]を使うが。
0068デフォルトの名無しさん
2006/10/17(火) 15:15:00この場合、要求されているのは(void *)だからどれでもいいよ。
006966
2006/10/17(火) 15:18:44&A[0] ・・配列の先頭要素[0]のアドレス
と認識してたんだけど、
&A
の意味はどうなるの?
007062
2006/10/17(火) 15:21:53なんとなく分かりました。
ありがとうございます。
けれど、それならもう一つ不思議なことがあります。
インライン関数は短い処理で使われるそうですが、何故同じように長い処理でも使わないのでしょうか?
同じように最適化したら早くなるのではないのですか?
0071デフォルトの名無しさん
2006/10/17(火) 15:27:38実行ファイルサイズがでかくなるという弊害がある。
でかくなればキャッシュに入らなくなる可能性があり、逆に遅くなる事もある。
007253
2006/10/17(火) 16:16:24文字定数がint型で定義されているのはEOFを
11111111 11111111 11111111 11111111
というようにcharでは表現できない値を表現するため。
文字配列ではEOFを途中で表現する必要がないからメモリの節約のために
charになってるとかそんな感じで良いのでしょうか?
ていうかそもそも文字定数がint型なのは上の理由で良いのですか?
0074デフォルトの名無しさん
2006/10/17(火) 16:38:12短いとは限らないよ。
例えば最近のgccやiccは、一回しか呼ばないようなstaticな関数は仮令長くてもインライン展開してしまうし。
Ex.
static void func()
{
// this function is too long.
}
int main()
{
func();
return 0;
}
但し、・サイズがでかくなる・最適化処理が複雑になりコンパイル時間がかかる、
などの理由からローカル変数を使うだけでインライン展開しないコンパイラもある。
0075デフォルトの名無しさん
2006/10/17(火) 16:39:40概ねその理解でOK。
0076デフォルトの名無しさん
2006/10/17(火) 18:03:11式の中では原則、Aと&A[0]は同じ。Aの先頭要素へのポインタでありstruct s*型。
&Aと書くと、それはAへのポインタ。struct (*s)[10]型。
T型の変数(正確には左辺値)にアドレス演算子を適用するとT*型になる。
これを配列型の変数そのものに当てはめると、そうなる。
0077デフォルトの名無しさん
2006/10/17(火) 18:16:53ボタンを押した瞬間にリストを初期化するためDeleteString
しているんですが、前のデータがなぜか残った状態で
表示されます。なぜでしょうか?
分かる方いましたら解決法を教えてください
開発環境 VS2005 WinXP SP2 MFC
0078デフォルトの名無しさん
2006/10/17(火) 18:25:57これって大丈夫なんでしょうか?
普通に動いているんですが、どうもよく分かりません。
ウインドウプロシージャで使ってるんですが、
参照されるたびに動的に確保されているんでしょうか?
007977
2006/10/17(火) 18:29:090080デフォルトの名無しさん
2006/10/17(火) 18:37:50strの初期化は最初の1回だけ行われる。
0081デフォルトの名無しさん
2006/10/17(火) 19:48:49関数に戻り値に成功、失敗を返すようにするにはどうしたらいいでしょうか?
(なんらかの原因で領域が確保できなかった時のエラー対策をしたい。)
検索すると、下記のような先頭ポインタを返す関数しか見つかりません。
struct list {
int test;
struct list *next;/* 次のデータへのポインタ */
};
//--リストにデータを登録
struct list *add_list(int test, struct list *head)
{
//--リストに追加処理(略)
return head;
}
0082デフォルトの名無しさん
2006/10/17(火) 20:32:45008372
2006/10/17(火) 21:21:12遅レスになってしまったけどありがとうございます。
ホントにそんな感じの理由なんだ><
勉強初めに本の内容よく考えないで丸覚えしてたから
こういう基本的なこと分かってなくてダメだなぁ・・・orz
0084デフォルトの名無しさん
2006/10/17(火) 22:02:06概ねという言葉に気をつけるべし。
stdio.h をエディタで開いて EOF を検索してごらん。
0085デフォルトの名無しさん
2006/10/17(火) 22:18:39#define EOF (-1)
と出たけど、どういう意味で概ねなのでしょう?(´・ω・`)
しばし考えても言葉の裏が読み取れなかったので詳しくお願いできますか?orz
0086デフォルトの名無しさん
2006/10/17(火) 22:26:38008784
2006/10/17(火) 22:33:1375ではないので75の真意は分からんが、
EOFは-1という値に置き換えられるのであって
11111111 11111111 11111111 11111111
じゃないよと言いたかった。
邪魔したな。
0088デフォルトの名無しさん
2006/10/17(火) 22:44:24ただ、いかなるchar型の値とも区別できなければならないと定められていたと思う。
0089デフォルトの名無しさん
2006/10/17(火) 22:44:26あぁ、そういうことでしたか。
2の補数なので例えばchar型なら11111111ですものね。
自分も>>72で「int型が4バイトの場合では」と厳密に書いた方が良かったですね。
どうもありがとうございました><
0090デフォルトの名無しさん
2006/10/17(火) 22:45:19、、、、、成り行きを見守るか、、、
009188
2006/10/17(火) 22:46:35X 3010:2003見たらこう書いてある。(7.19.1)
EOFは、型がintで、負の値を持つ整数定数式に展開する。(以下略)
0092デフォルトの名無しさん
2006/10/17(火) 22:47:59?
EOFは文字定数と区別するためにっていう話でそ?
0093デフォルトの名無しさん
2006/10/17(火) 22:52:35最初の質問とそれに対する説明が引っかかっている。
0095デフォルトの名無しさん
2006/10/17(火) 23:02:140096デフォルトの名無しさん
2006/10/17(火) 23:03:50どっちでもいいよ。伝統的なもんだ。
0097デフォルトの名無しさん
2006/10/17(火) 23:33:57http://pc8.2ch.net/test/read.cgi/tech/1133286541/990/
0098デフォルトの名無しさん
2006/10/17(火) 23:34:43hppは.h+.cppって感じ
定義と実装を両方書くから
0099デフォルトの名無しさん
2006/10/17(火) 23:44:46gets();
を使って入力を読ませようと思っても入力する前に次の入力に飛んでしまうのはなぜでしょうか?
struct entry_word input[160];
int c=0;
FL:
printf("文字列1を入力してください-->");
gets(input->en);
printf("文字列2を入力してください -->");
gets(input->part);
こんな感じなのですが。getsを使うなというのはおいといてください。fgetsもしてみたんですが改行を取るのがめんどくさくてついでに上記の方も直らなかったので。
0100デフォルトの名無しさん
2006/10/17(火) 23:45:08cpp は c の C++ 版。
hpp は h の C++ 版。
0101デフォルトの名無しさん
2006/10/18(水) 04:05:51class 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;
}
0102デフォルトの名無しさん
2006/10/18(水) 04:34:36つーか、そのくらい自分でテストしろよ。
それでも疑問なら「この動作は規格どおりですか」って質問しなよ。
0104デフォルトの名無しさん
2006/10/18(水) 09:23:530105デフォルトの名無しさん
2006/10/18(水) 09:56:30class hoge{
~hoge(){
std::cout << "終了" << endl;
}
void homu(){
...
}
};
こんな感じでhomu()をスレッドとして作って、
スレッドが終わるとデストラクタを呼び出して抜けるって感じにしたいのですが。
0106デフォルトの名無しさん
2006/10/18(水) 10:02:02{
hoge foo;
foo.homu();
return xxx;
}
0107デフォルトの名無しさん
2006/10/18(水) 10:04:28ああなるほど・・・直接呼び出すことにしか頭回ってませんでした・・・
ありがとうございます
0109デフォルトの名無しさん
2006/10/18(水) 12:45:42ほんの6時間前の自分の状態について使っても間違いではないんだが、
慣習的にはなんか違和感があるなw
0110デフォルトの名無しさん
2006/10/18(水) 13:04:000111デフォルトの名無しさん
2006/10/18(水) 13:04:300112デフォルトの名無しさん
2006/10/18(水) 15:25:400113デフォルトの名無しさん
2006/10/18(水) 15:28:53(unix板で反応無かったもので)
aixでC++によるアプリ開発をしていて、DBXでデバッグをしています。
しかしstring型の変数の中身を参照したいのですが上手く出来ません。
printしてもキャストしても期待する値が表示されないんですがどなたか方法をご存知ありませんか?
0114デフォルトの名無しさん
2006/10/18(水) 15:51:45下記の考え方であってますでしょうか?
char *p="abcde";
char **pp=&p;
ppには変数p自体のアドレスが格納されている。
*ppは格納されているpのアドレスの内容表示であり、
その内容は文字列"abcde"の先頭のアドレスである。
よって文字列を表示させるためには
printf("%s",*pp); /* printf("%s",p)と同じ意味 */
とする。
0115デフォルトの名無しさん
2006/10/18(水) 16:53:20ちなみに、boost::shred_ptr<void>は、
元の型のオブジェクトを削除するので、問題なく使える。
>>114
正解。
0116デフォルトの名無しさん
2006/10/18(水) 17:18:09自分で書いたCのファイルをWindows上で動くexeファイルに変換は無料で出来るのでしょうか?
調べてみてVisual C++で出来るのかな?とおもったのですが、
これはC++じゃない普通のCのプログラムもコンパイルできるのでしょうか?
0117デフォルトの名無しさん
2006/10/18(水) 17:21:05もちろんVC++でも出来る。
0118デフォルトの名無しさん
2006/10/18(水) 17:39:010119デフォルトの名無しさん
2006/10/18(水) 17:43:190120116
2006/10/18(水) 17:56:44CygwinでもVC++でもコンパイルしてプログラムを走らせることは出来るようになったのですが、
単純にexeファイルをダブルクリックすると起動できる形にすることができません。
よろしければご教授願います
0121116
2006/10/18(水) 18:14:23先ほどCygwin、VC++ともにコンパイルできるようになったと書きましたが、
配列を使ったプログラムの場合、CygwinではコンパイルできましたがVC++では
「配列または、ポインタでない変数に添字が使われました。」とでてコンパイルできません。
この原因はなんでしょうか?
0122デフォルトの名無しさん
2006/10/18(水) 18:33:380123デフォルトの名無しさん
2006/10/18(水) 18:37:19Cygwinの場合は-mno-cygwinを付けてコンパイルすると、
Cygwinなしで実行できるEXEになる。
0124デフォルトの名無しさん
2006/10/18(水) 19:32:07VC++ならコンパイルオプションでマルチスレッドDLLからマルチスレッドに変更しろ。
0125デフォルトの名無しさん
2006/10/19(木) 12:40:51borland C++コンパイラのIncludeフォルダの中にある「stdio.h」を開いて
「printf」で検索してみたところ、
int _RTLENTRY _EXPFUNC printf(const char * __format, ...);
みたいなのしか見当たらなかったのですが、これがprintfの定義なんでしょうか?
てっきり自分で作る関数みたいに
int printf(const char *xxx,・・・)
{
・・・・・・・
}
みたいな部分があると思ってたのですが、そういうのは無いのですか?
0126デフォルトの名無しさん
2006/10/19(木) 13:00:220127デフォルトの名無しさん
2006/10/19(木) 13:37:05stdio.hに書かれてるのは宣言だけ。
ビルド時にリンクされるCW32(MT).libに実体がある。
TurboC++2006ExpにVCLソース付いてるから一緒にRTLのソースも入ってるんじゃないかな。
0128デフォルトの名無しさん
2006/10/19(木) 16:07:02それはただのプロトタイプ宣言。
0129デフォルトの名無しさん
2006/10/19(木) 22:34:35どうもありがとうございます。
_RTLENTRY _EXPFUNCとか知らないのが入ってるし他に見当たらないから特別な定義の仕方なのかと勘違いしてましたorz
RTLが何かとかよく把握してないレベルなので色々と調べてきます><
0130デフォルトの名無しさん
2006/10/19(木) 22:59:130131デフォルトの名無しさん
2006/10/20(金) 07:35:02#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変数を初期化することは無理なのでしょうか?
0132デフォルトの名無しさん
2006/10/20(金) 07:39:09C++では出来るはずだが。
0133デフォルトの名無しさん
2006/10/20(金) 10:24:20Cではマズイ。C++使うか、 #define のままにしとけ。
0134デフォルトの名無しさん
2006/10/20(金) 12:53:440135デフォルトの名無しさん
2006/10/21(土) 01:07:25環境: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}; みたいに短く書きたいのですが何か手はあるでしょうか。
0136デフォルトの名無しさん
2006/10/21(土) 01:26:04HOGE::HOGE() {
const RECT proto = {0,0,10,10};
std::fill(this->rc, this->rc + 40, proto);
}
0137デフォルトの名無しさん
2006/10/21(土) 01:56:18早速試します。
0138デフォルトの名無しさん
2006/10/21(土) 10:42:06アクセラレータ作成に挑戦してるのですが
メニューの一番上の項目(ファイル(F)や編集(E)など)には
IDがないですよね?
こいつらをAlt+FやAlt+Eで表示できるようにするには
どうすればいいのでしょうか
0139138
2006/10/21(土) 11:24:10Captionにファイル(&F)のように&をつけて指定することで
うまくいきました
0140デフォルトの名無しさん
2006/10/21(土) 11:51:150141デフォルトの名無しさん
2006/10/21(土) 12:44:26今繰り返し計算を行っているのですが
たとえば100万回繰り返し計算をしているときに
あとどれくらいで終わるか知りたいため,(目安で)
1万回ごとに「今○回計算が終了しました」という文章を
DOS画面上に出したいのですがどのようにしたらできるのでしょうか?
教えてください.よろしくお願いします.
0142デフォルトの名無しさん
2006/10/21(土) 12:49:260143デフォルトの名無しさん
2006/10/21(土) 13:32:120144デフォルトの名無しさん
2006/10/21(土) 13:41:46イメージ(JavaのBufferedImageのようなもの)を生成するには
どうすればいいんでしょうか
0145デフォルトの名無しさん
2006/10/21(土) 15:23:130146145
2006/10/21(土) 15:26:270147デフォルトの名無しさん
2006/10/21(土) 17:28:21double型の配列を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つ用意する必要があると思うのですが・・・。
0148アフォルトの名無しさん
2006/10/21(土) 17:34:16javaの例外クラスの階層とC++の例外クラスの階層構造とは完全にはかさならない
ですよね??
C++ではユーザー定義の例外クラスを作ることはできますか?
0149デフォルトの名無しさん
2006/10/21(土) 17:45:46基本的になんでも(組み込み型だろうが、自作のクラスだろうが抽象クラスじゃなきゃ) throw できるよ。
0150デフォルトの名無しさん
2006/10/21(土) 17:47:15例外は型であればなんでもいい。例外クラスを作ることもできる。
階層構造も再現できるだろう。そこまでする意味があるとは思わないけど。
0151デフォルトの名無しさん
2006/10/21(土) 17:48:19本当にスタックにおく必要があるのか?
ヒープで済ませたほうがいいんじゃないか?
0152デフォルトの名無しさん
2006/10/21(土) 18:03:51プロジェクトのプロパティから[リンカ]-[システム]-[スタックのサイズの設定]
俺もヒープに確保したほうがいいとは思うが。
0153アフォルトの名無しさん
2006/10/21(土) 18:30:35try
{
throw new NullPointerException();
}
catch( NullPointerException e )
{
e.printStackTrace();
}
こんな感じのJavaの例外処理をC++に置き換えたいとすれば、
どうなる?C++にNullPointerExceptionってないよね。
NullPointerExceptionに相当するクラスを作って投げなきゃいけないよね。
でも、どんなクラスにすればいいんでしょうか
0154デフォルトの名無しさん
2006/10/21(土) 18:45:58std::exception から派生させたクラスとして、 what() を適当に実装すればいい。
スタックトレースは無理。 throw するときに new しちゃだめ。 catch は const& で受ける。
0155アフォルトの名無しさん
2006/10/21(土) 19:04:41#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
ってでるよ。
0156デフォルトの名無しさん
2006/10/21(土) 19:13:060157デフォルトの名無しさん
2006/10/21(土) 19:32:25>>152
ヒープはよくわからないので。
スタックを増やしたら実行できました。
ありがとうございました。
0158144
2006/10/21(土) 19:34:03回答どうもです
配列から生成したイメージを、DirectXをつかってtextureにしたい
のですが、CreateDIBSectionで可能なんですか?
0159デフォルトの名無しさん
2006/10/21(土) 20:12:480160デフォルトの名無しさん
2006/10/21(土) 20:18:15くだすれDirectX(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1132965206/
0161デフォルトの名無しさん
2006/10/21(土) 20:20:510162デフォルトの名無しさん
2006/10/21(土) 23:15:13テンプレートメソッドパターンの勉強中なんですが、
#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' の宣言を確認してください。
と出てしまいます。
文法的に正しくするとしたら、どうすればいいですか。
0163162
2006/10/21(土) 23:17:22ただのテンプレートでした。
0164デフォルトの名無しさん
2006/10/21(土) 23:20:54エラーメッセージが遠いな。
× template <class T,T>
○ template <class T>
× ave<int,int>(1203, 3344)
○ ave(1203, 3344)
0165162
2006/10/21(土) 23:29:04ありがとうございます。
他の例で、
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>にしないと動かないのですが、
違いはなんででしょうか。
0166デフォルトの名無しさん
2006/10/21(土) 23:35:51cass T だと、どうなる?
0167デフォルトの名無しさん
2006/10/21(土) 23:37:51maxは標準に既に用意されている。
別の名前で試してみ。
0168162
2006/10/21(土) 23:41:21max2にしたら、コンパイル通るようになりました。
試していたのが、max min 等だったので、今まで偶然 標準関数ばかりを
試していたようです。
ありがとうございました。
0169デフォルトの名無しさん
2006/10/22(日) 00:03:34int 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以外使えなくなってマズー
いったいどうすればいいと思いますか?
0170デフォルトの名無しさん
2006/10/22(日) 00:18:44if (!v.empty()) { char* begin = &v[0]; func(begin, begin + v.size()); }
0171デフォルトの名無しさん
2006/10/22(日) 00:44:39お答えありがとうございます。
その方法をとって、以下のようにしました。
void func( char* begin, size_t size );
0172アフォルトの名無しさん
2006/10/22(日) 11:08:40例外処理を丸投げする仕組みはないんでしょうか。
ないとしたら、それを再現するようなうまい方法って知りませんか
0173デフォルトの名無しさん
2006/10/22(日) 11:40:49public:
vector<double> db1;//
vector<double> db2;//
};
class Character1 {
public:
vector<Image1> img;// Image1のデータ
};
vector<Character1> chara1;
0174173続き
2006/10/22(日) 11:42:04for(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;
}
こんな風にした場合は、コメントの中の部分は要る?
あってもなくても正常に動きはしたけど…
0175デフォルトの名無しさん
2006/10/22(日) 11:51:53これらじゃ用件を満たさない?
void f0(){
throw exception();}
void f1(){
try{
throw exception();}
catch(...){
throw;}
0176デフォルトの名無しさん
2006/10/22(日) 11:53:20いらない
0177デフォルトの名無しさん
2006/10/22(日) 12:25:01C++にもJavaのthrowsのようなものはあるにはあるが、
コンパイル時にチェックされるわけではないなどの理由から原則使わない。
使わなくても全ての例外はJavaのRuntimeExceptionの如く自動的に呼び出し元へ伝わる。
0178アフォルトの名無しさん
2006/10/22(日) 12:49:11throw;って投げるエラーかかないと何のエラーがどこに投げられるの?
0179デフォルトの名無しさん
2006/10/22(日) 13:46:46catch の中で実行された場合は、現在処理中の例外を外に投げる。
それ以外の場合は死ぬ。
0180デフォルトの名無しさん
2006/10/22(日) 13:49:07catch文の中で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として受け取ることができる。
0181アフォルトの名無しさん
2006/10/22(日) 14:24:490182デフォルトの名無しさん
2006/10/22(日) 15:08:48#include <limits>
//#include <windows.h> //このコメントはずすとエラー
#include <iostream>
int main(){
std::cout << std::numeric_limits<int>::max() << std::endl;
return 0;
}
0183182
2006/10/22(日) 15:17:06すみません、ググったらでてきました
#define NOMINMAXをwindows.hの前に定義すると
うまくいきました
0184デフォルトの名無しさん
2006/10/22(日) 16:53:06処理をさせているときに突然勝手にウィンドウが閉じて
終了します。何が主な原因でしょうか?
0185デフォルトの名無しさん
2006/10/22(日) 16:56:37エスパーで解答すると、
ウインドウプロシージャの中で使っているswitch文のbreakを書き忘れているとか。
まあ、超エスパーの降臨を待てよ。
0186デフォルトの名無しさん
2006/10/22(日) 17:03:03別スレッドに移すことか。
HKEY_CURRENT_USER\Control Panel\Desktop\AutoEndTasksの値が1だったら、
一定時間応答のないアプリケーションを自動的に強制終了する。
とはいっても、これデフォで0だから違うだろうけど。
0187デフォルトの名無しさん
2006/10/22(日) 18:15:09あなたが作っているのはコンソールプログラムと見た。
int main(){
略
sleep(10); /*ここを追加*/
return 0; }
でコンパイルしてみ。
0188184
2006/10/22(日) 18:57:10ウィンドウズソフトです。コンソールプログラムではありません
さっきパフォーマンスモニタを観察していたら、強制終了される処理の部分で
Handle Countが異様に増えていきました。ファイルハンドル解放わすれかな
と思いましたので、調べてみます
0189デフォルトの名無しさん
2006/10/22(日) 20:06:06中止となります。また、それに伴いましてクリスマスイヴやプレゼント交換会
も中止となります。ご了承下さい
http://2chart.fc2web.com/2chart/2007kurichuusi.html
また、昨年お伝えしましたように、2006年のクリスマスも中止です。
http://2chart.fc2web.com/2chart/2006kurisumasuchuushi.html
毎年、各所でこのような楽しいクリスマスの風景が見られましたが
自粛でお願いします。
http://2chart.fc2web.com/2chart/tanosiikurisumsu.html
0190デフォルトの名無しさん
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だけを実行させても動きません。
0191デフォルトの名無しさん
2006/10/22(日) 20:35:42「動きません」って、どうなるんだ?
list4b.c もコンパイルしてリンクしないとダメだよ。
0192デフォルトの名無しさん
2006/10/22(日) 20:40:32それってどうすればできますか?
とりあえずそれぞれ.objっていうのが出来たんですが。
0193デフォルトの名無しさん
2006/10/22(日) 20:43:070194デフォルトの名無しさん
2006/10/22(日) 20:47:500195デフォルトの名無しさん
2006/10/22(日) 20:48:41環境くらいかけよ
大抵のコンパイラはhoge.c foobar.cのようにファイル名並べてやればうまくやってくれる
.obj作れたんなら自分でリンカでなんとかできるはず
0196デフォルトの名無しさん
2006/10/22(日) 20:59:58できました。
bcc32 hoge.c foobar.c で。
どうもありがとう。
0197デフォルトの名無しさん
2006/10/22(日) 23:00:360198デフォルトの名無しさん
2006/10/23(月) 00:41:13コンパイル済みの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
0199デフォルトの名無しさん
2006/10/24(火) 18:55:44ステータスバーを追加。
起動して、マウスでウィンドウを小さく(タイトルバーだけにする)と下の部分の描写がおかしくなります。
InvalidateRectやUpdateWindowをステータスバーに指定しても変わりません。
どうしたらいいのでしょうか。。。?それともメインウィンドウにWS_CLIPCHILDRENを指定してはいけないのですか?
0200デフォルトの名無しさん
2006/10/24(火) 23:44:28それだけじゃわからん
0201デフォルトの名無しさん
2006/10/24(火) 23:46:20スコープはグローバル変数と関数は全てのファイルで通用、ただし両方ともstaticをつけるとスコープは内部リンゲージになる。
ローカル変数はブロック内でstaticをつけると内部リンゲージになる。
ただしグローバル変数に関して別のファイルの無指定のグローバル変数を利用するときは(staticをつけない場合のことです)
externという指定をつけたヘッドファイルを読み込んでコンパイルしないと正しく使うことができない
という理解でよろしいでしょうか?
分かりにくい文章でごめんなさい
0202デフォルトの名無しさん
2006/10/25(水) 01:42:34ちょっとおかしい。
×リンゲージ
○リンケージ
×ヘッドファイル
○ヘッダファイル
ローカル変数は( extern を付けて宣言しない限り)リンケージなし。
static を付けた場合、記憶クラスが変わる。
0203デフォルトの名無しさん
2006/10/25(水) 02:36:45もともと頭おかしかったみたいだし。
0204デフォルトの名無しさん
2006/10/25(水) 10:40:37Create時に指定するのではなく動的に変更する場合
どのようにしたらいいでしょうか?
0205204
2006/10/25(水) 10:46:580206201
2006/10/25(水) 19:16:08すいませんw ちょっと疲れてたので書き間違いをしてしまいました
リンケージとヘッダファイルですね。
ローカル変数はexternをつけると別のファイルでも通用する
staticをつけるとそのファイルのみ通用する
何もつけないとブロック内のみ通用する
これで完璧ですか?
0207デフォルトの名無しさん
2006/10/25(水) 20:34:320208デフォルトの名無しさん
2006/10/25(水) 20:39:270209デフォルトの名無しさん
2006/10/25(水) 20:41:34外で宣言したのと同じくグローバル変数の宣言になる。
(ただしそれが見えるスコープはそのブロック内限定)
0210デフォルトの名無しさん
2006/10/25(水) 21:03:23そのスコープ内で(ファイル・関数)一回だけ初期化し、その後領域を保持しつづけてくれる
エクス y=ー( ゚д゚)・∵.ターン
誰かが外に造っているはずと期待し本体の置き場は(基本的に)他ソースにあることを想定
0211デフォルトの名無しさん
2006/10/27(金) 12:33:43レベル低くて申し訳ないんですが教えてください。
scanf("%s",str)で^zを判断する方法が知りたいです
おねがいします
0212デフォルトの名無しさん
2006/10/27(金) 12:43:53>>211
DOS系OSならscanf()の戻り値を判断せよ。入力が閉じられている筈だから変換に失敗したことになるので0のはずだ。
Unix系OSなら単純に収容されるからstrchr(str, '\x1a')でもするってところかな。
0213デフォルトの名無しさん
2006/10/27(金) 12:51:16ありがとうございます。
先ほど私もその方法を試してみたのですが
scanfの戻り値の型がわからず代入時にエラーがでてしまいます
int chk;
chk = scanf("%s",str);
if (chk == 0){
〜〜
おかしいでしょうか?
0214デフォルトの名無しさん
2006/10/27(金) 13:01:03おまけにエラーが出たと言いつつエラーメッセージも張らないし。
先ずはコミュニケーションのレベル上げから始めた方がいいんでない?
0215デフォルトの名無しさん
2006/10/27(金) 13:11:16すいませんでした><
環境はbcc5.5.1 + DOS です
エラーメッセージは出ず異常終了します
0216デフォルトの名無しさん
2006/10/27(金) 13:44:15ヘッダファイル見れば?
scanfでぐぐれば?
確かEOFが返った気がする
0217デフォルトの名無しさん
2006/10/27(金) 13:51:530218デフォルトの名無しさん
2006/10/27(金) 14:05:22に反応しただけです。
0219デフォルトの名無しさん
2006/10/27(金) 14:53:010220デフォルトの名無しさん
2006/10/27(金) 15:24:47クラスが巨大なので、クラスを書いたファイルとmainのあるファイルを別にしたのですが、
どうすればmainのあるファイルで、別ファイルにあるクラスが使えるようになるんでしょうか。
ただの関数なら共通ヘッダにプロトタイプを書けば良いというのは分かるんですが。
0221デフォルトの名無しさん
2006/10/27(金) 15:33:08クラスのインターフェースだけをヘッダファイルに書く。
実現部は別ファイルでよい。
0222デフォルトの名無しさん
2006/10/27(金) 15:35:41ありがとうございました。
0223デフォルトの名無しさん
2006/10/27(金) 17:46:42ダイアログで日付と時刻を表示するプログラムを作っています。
日付と時刻が連結された状態で入ってくるのですが、下記のような
コードを記述したところ
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));
0224デフォルトの名無しさん
2006/10/27(金) 17:58:06その関数には、バッファの「文字数」を指定する必要がある。
バッファの「バイト数」ではない。
char型の場合は、文字数はバイト数と同じだが、
wchar_tの場合は違う。
TCHAR str[256] ;
size_t number_of_chars = sizeof(str) / sizeof(TCHAR) ;
そもそも_tcsとつくのは、マクロで置き換わるわけだから、
wchar_tを直接使うのであれば、wcscpy_s()を直接呼んだほうがいいと思うのだけれど。
0225デフォルトの名無しさん
2006/10/27(金) 18:11:08出来ました。
すごく分かりやすい解説をありがとうございました。
0226デフォルトの名無しさん
2006/10/27(金) 19:57:310227デフォルトの名無しさん
2006/10/27(金) 21:27:27とりあえず何か本でも買って一通り勉強した方がいいよ
0228デフォルトの名無しさん
2006/10/27(金) 22:35:26C++ではメソッドのシグニチャだ。
0229デフォルトの名無しさん
2006/10/27(金) 22:58:190230デフォルトの名無しさん
2006/10/28(土) 03:55:32何段階も継承してるけど、あそこまでやる必要あるの?
0231デフォルトの名無しさん
2006/10/28(土) 07:21:36歩かせるのに指の動作から指示し直してたら効率悪いってことだろ。
納得行かなければ自分で改良してやんな
0232デフォルトの名無しさん
2006/10/28(土) 09:26:54・オブジェクト指向と言えば継承な時代だった(包含しない)
0233デフォルトの名無しさん
2006/10/28(土) 16:12:060234デフォルトの名無しさん
2006/10/29(日) 17:26:02iostreamから1行getlineをしてstringを得たいのですが、途中でchar[128]などのバッファを使わず、一気にstringをとる方法はありますか?
string s = stream.getline(); のようなものを期待しています。
0235デフォルトの名無しさん
2006/10/29(日) 17:31:360236234
2006/10/29(日) 17:33:01fstream >> string
0237デフォルトの名無しさん
2006/10/29(日) 17:34:16それだと空白で途切れるよ。
0238デフォルトの名無しさん
2006/10/29(日) 17:49:54>>237の言うとおりだ。std::getline使え。
0239デフォルトの名無しさん
2006/10/30(月) 00:53:21fgets(buf, sizeof(buf), stdin);
という記述を良く見かけますが、
sizeof(buf)は256なので、もし256文字分入力されたら
bufの最後の\0が入らなくてよろしくない結果になったりしないのですか?
0240デフォルトの名無しさん
2006/10/30(月) 01:01:050241デフォルトの名無しさん
2006/10/30(月) 02:37:051分で自己解決できることをなぜ質問するのか、理解に苦しむ。
0242デフォルトの名無しさん
2006/10/30(月) 03:01:170243デフォルトの名無しさん
2006/10/30(月) 03:16:530244デフォルトの名無しさん
2006/10/30(月) 03:39:360245デフォルトの名無しさん
2006/10/30(月) 15:54:46int *a,
int b=100;
*a=&b;
printf("%d",*a);
char *a="a"
printf("%c",*a);
char *a="abcde";
printf("%s",a);
文字や数字を表示させる時は*をつけるのに、文字列の場合は*をつけないのはなぜですか?
文字の場合は値の内容なのに、文字列の場合はアドレスで文字表示ができるのが
理解できません。何て言えばいいのかよく分からないので、
質問が解りにくくてすみません。
よろしくお願いします。
0246デフォルトの名無しさん
2006/10/30(月) 16:05:40Cの文字列は'\0'で終端するcharの配列だからだよ。
配列の内容を参照するだけなら、直接渡すのではなく
先頭アドレスを渡すことで事足りる。
だからオブジェクトじゃなくて先頭を示すポインタを渡してる。おわり。
0247デフォルトの名無しさん
2006/10/30(月) 16:09:31ってエラーはどういうことでしょうか・・・?
msxmlをimportしようとして、VCならいけるんですが
Solarisではコンパイルエラーになってしまいます。
どなたか救いの手を…。
よろしくおねがいします。
0248247
2006/10/30(月) 16:10:46でした。
よろしくおねがいします。
0249デフォルトの名無しさん
2006/10/30(月) 16:36:31#importはVC++独自拡張。他のコンパイラには存在しない。
0250デフォルトの名無しさん
2006/10/30(月) 16:56:53Solarisに移植ですか・・・xmlライブラリ探してそれ使う所は自分で書かなきゃだね。
0251デフォルトの名無しさん
2006/10/30(月) 17:07:280252250
2006/10/30(月) 17:44:300253デフォルトの名無しさん
2006/10/30(月) 18:22:06プログラムをUNICODE対応に変更したのですが
char型の配列に格納した文字列をListBoxに
AddStringするところでキャストエラーが発生したため、
(wchar_t*)でキャスト変換したところ、リスト内の文字が
文字化けしてしまいました。
原因がお分かりになる方いらっしゃいましたら
お教え下さい。お願いいたします。
wstring wstr = (wchar_t*)m_tagtestDat->testStr;
0254253
2006/10/30(月) 18:23:41間違って入ってしまいましたorz
上記の記述は無視してください。
0255デフォルトの名無しさん
2006/10/30(月) 18:40:31そんな化けるようではUNICODE対応したと言わないだろ。
それはともかく、そのchar型の配列をTCHARにするか、
それができないならUNICODEとしてコンパイルするときにはchar配列をワイド文字列に変換するようにしろ。
VC++ならATLのATL::CA2TだかA2Tで簡単に変換できる。
UNICODEだけに対応するならTではなくWだがな。
0257デフォルトの名無しさん
2006/10/31(火) 02:01:07#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;
}
強制終了になるんですがどこがおかしいのでしょうか??
0258デフォルトの名無しさん
2006/10/31(火) 02:02:410259デフォルトの名無しさん
2006/10/31(火) 02:04:290260259
2006/10/31(火) 02:05:200261257
2006/10/31(火) 02:18:36でもこの場合bufってabcdeの先頭のアドレスが入るんではないんですかね?
なぜ入らないんですか?
0262デフォルトの名無しさん
2006/10/31(火) 02:35:47期待通りに値は入っている。それを free() に渡すから落ちる。
free() の引数には malloc() の戻り値を渡さないといけない。
0263デフォルトの名無しさん
2006/10/31(火) 18:40:16それぞれのデータ型が使うメモリを調べてみようとして、
char c
int i
double d,e
のアドレスを表示させたら
0012FF8B
0012FF84
0012FF7C
0012FF74
と、表示されたんですが、
cは8B番地の1バイト分のメモリを使っているぽいのは分かるんですが、
iとdとeはそれぞれ何番地から何番地までのメモリを
使っているんですか?
0264デフォルトの名無しさん
2006/10/31(火) 18:57:10sizeof(int)とsizeof(double)
0265デフォルトの名無しさん
2006/10/31(火) 19:30:01アライメント ってやつだ。
sizeof(char)=1, sizeof(int)=4, sizeof(double)=8 として
4バイトアライメントがかかると
cxxxiiiiddddddddeeeeeeee (1文字が1バイト xはゴミ)
のようなことになる。
0266デフォルトの名無しさん
2006/10/31(火) 21:28:34>>263のアドレスからすると、先頭番地が 0012FF74H で、
eeeeeeeeddddddddiiiixxxc
dとeはどっちが先かは環境依存だと思うけど、こんなかんじじゃないか?
0268デフォルトの名無しさん
2006/11/02(木) 02:24:05C++で書かれた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ビットであるという前提において、ですが。
このような定義をしているということは、自分の考えが間違っているとおもうので
その辺りを教えていただけませんでしょうか。
0269デフォルトの名無しさん
2006/11/02(木) 02:25:240270デフォルトの名無しさん
2006/11/02(木) 04:57:23std::vector<int> a,b;
b.push_back(1);
a = b;
とかやると挙動が変で。
配列と違ってそういう事できるものだと思ってた。
0271デフォルトの名無しさん
2006/11/02(木) 05:31:430272デフォルトの名無しさん
2006/11/02(木) 10:49:20「挙動が変」じゃぁわからん。
期待した動作と、それに対する結果を言えるか?
おおかた >>270 のミスなんだろうけど。
0273デフォルトの名無しさん
2006/11/03(金) 02:56:14動作はおおむね期待どうりだけど不安なので
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;
}
}
細かい所間違ってるかもしれないけどこういうの書いた。
これで大丈夫。
0274デフォルトの名無しさん
2006/11/03(金) 03:07:34Win2Kのプロンプト上ではエスケープシーケンスでの文字色の
変更などができませんでした。
何か使いやすいモジュール(と言うのでしょうか?)は
ないでしょうか。
使っているコンパイラはフリーのBorland C++です。
よろしくお願いします。
0275デフォルトの名無しさん
2006/11/03(金) 09:27:29警告を回避するためだけにそんなことするかよ。
>>274
使いやすいかどうかは別として、Windows APIでそういうことはできる。
0276デフォルトの名無しさん
2006/11/03(金) 10:20:12int _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文字しか出ません。
なぜなのでしょうか
0277デフォルトの名無しさん
2006/11/03(金) 10:28:05Unicode文字列をascii文字列として出力しようとしているから。
詳しくはVSスレなりどこへでも。
0278デフォルトの名無しさん
2006/11/03(金) 10:53:40VC++2003では出ないが、どんな環境なんだ?
std::vectorにはoperator=があるんだし、わざわざそんなことする必要無いと思うが。
0279デフォルトの名無しさん
2006/11/03(金) 11:20:04出来ました
ありがとうございます。
0280デフォルトの名無しさん
2006/11/03(金) 11:45:13プライマリモニタでしかフルスクリーン表示できなくて
0281デフォルトの名無しさん
2006/11/03(金) 12:34:590282デフォルトの名無しさん
2006/11/03(金) 19:32:24HDC をラップする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以降。
0283デフォルトの名無しさん
2006/11/03(金) 19:42:220284デフォルトの名無しさん
2006/11/03(金) 19:53:30本当に必要じゃないんなら reset() も release() も消しとけ。
0285デフォルトの名無しさん
2006/11/03(金) 20:13:11普段は MFC 使うことのほうが多いクセにまったく思いつかんかった・・・orz
サンクスです!
>>284
いや、インターフェイスを最小限にってのはわかるけど、一応どっちも必要なんす。
DCが不要になった時点でさっさと reset しないとなんかキモチワルイし、
release (または Detach)がないと、戻り値とか引数として使えなくなっちゃうし。
0286デフォルトの名無しさん
2006/11/03(金) 21:48:17それをprivate継承して、所有権を持つクラスを作ると思う。
ATL::CDCでは、releaseではなく、Detachという名前で同様のものを持っていたはず。
もちろんその逆のAtatchもある。
0287デフォルトの名無しさん
2006/11/04(土) 00:25:22自分の場合、単なる関数ラッパークラスにはあんまり魅力を感じとらんのです。
結局それって DeleteDC(dc); が dc.DeleteDC(); と書けるくらいの違いですよね?
それで HDC を引数にとるAPIを片っ端からメンバにしようとするとメンバ関数が膨大になるし、
かといって「よく使うやつだけ」とかやると、どれがメンバでどれが非メンバか覚えとくのが大変だし。
小さな具象クラスに留めておきたいから、継承とかもあんまりやりたくないし。
ただ、 if (...) return FALSE; のたびにオブジェクトを忘れず解放ってのはめど過ぎるし、
自分のケツくらいはオブジェクト自身で拭いて欲しいなと。
0288デフォルトの名無しさん
2006/11/04(土) 00:50:52WinXP 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);
}
0289デフォルトの名無しさん
2006/11/04(土) 00:52:45*fp=fopen(filename,"w");
fprintf(*fp, "test\n");
}
main(){
file *fp
a(&fp);
fclose(fp);
}
0290デフォルトの名無しさん
2006/11/04(土) 00:52:59void a(FILE **fpp) {
*fpp = fopen(filename, "w");
fprintf(*fpp, "test\n");
}
main(){
FILE *fp;
a(&fp);
fclose(fp);
}
0291デフォルトの名無しさん
2006/11/04(土) 00:54:05うお、思い切りかぶったw
0292288
2006/11/04(土) 01:04:00ありがとう
あーそうか
ファイルポインタのアドレスが入った場所のアドレスを送らないといけないのか
で受け取った先は↑のせいで**になるのか
0293デフォルトの名無しさん
2006/11/04(土) 01:07:300294デフォルトの名無しさん
2006/11/04(土) 01:43:10同じように**を使ってポインタ変数を書き換える部分を書いたら
**を見た瞬間に「初期化が」「NULLを参照すると」とか言い出す奴が湧いて来たっけ。
お前らはint*を受けて整数を代入するコードでも同じ事を言うのか、と。
いや、本当に必要があるなら、NULLチェックするのも当然だとは思うけどね。
0295デフォルトの名無しさん
2006/11/04(土) 01:47:30あとでライブラリ的に再利用する予定(または可能性)があるコードなら、
それの外部インタフェースとなる関数では入力値のチェックはしたほうがいいかもね。
ユーザ(他人や将来の自分)が間違った使い方をしてもいいように。
内部的な関数でコール元から適切な値が渡ってくることを前提にできる関数なら
いちいちチェックする必要は無いと思う。
0296288
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);
}
0297デフォルトの名無しさん
2006/11/04(土) 02:16:22*fp=fopen(filename,"w");
fprintf(*fp, "test\n");
aa(fp);
}
でいいよ。二回目以降の呼び出しはわざわざ &*ってしなくてもいい
0298デフォルトの名無しさん
2006/11/04(土) 02:17:06読むだけの関数は値渡しで頼む。
0299デフォルトの名無しさん
2006/11/04(土) 02:18:09孫以降というよりも、
FILE *fp = <なんか> のようなポインタの書き換えを伴うやつ(fopen だな)だけ
引数では FILE ** で受けて 呼び出し側は FILE *fp; foo(&fp) のように &付きで渡す。
あとは素直に FILE * で受けてれば問題無い。
0300デフォルトの名無しさん
2006/11/04(土) 02:26:240301デフォルトの名無しさん
2006/11/04(土) 02:30:09それは fp 自身ではなく fp が指す FILE構造体の内容を書き換えるんでない?
0302デフォルトの名無しさん
2006/11/04(土) 02:33:50fseek() は fp の実体内部を書き換えるだけで fp そのものは書き換えられないだろ?
その証拠に FILE* を戻さないし、FILE** で受けてない
# fwrite() fprintf() も fp の実体内部を書き換えてるぞ
0303デフォルトの名無しさん
2006/11/04(土) 02:34:20**fpで呼び出さないと戻ってきた時fpの中身が食い違ってしまう
0304デフォルトの名無しさん
2006/11/04(土) 02:35:42アホか。
0305デフォルトの名無しさん
2006/11/04(土) 02:35:52それやったら、fseek()をした直後にfread()をやっても影響を受けないと
言うのか?読み出す場所が違ってくるだろ。
0306デフォルトの名無しさん
2006/11/04(土) 02:39:00あれ? fwrite, fprintf は書き換えずに別管理で現在位置を保持してるのか?
0307デフォルトの名無しさん
2006/11/04(土) 02:40:040308デフォルトの名無しさん
2006/11/04(土) 02:41:43いや、*fpだけでもFILE構造体を指す事はできる。しかしfopenは
FILE構造体へのポインタを返すので、**でないといけないんだろう。
0309デフォルトの名無しさん
2006/11/04(土) 02:46:261.FILE構造体へのポインタを受け取って代入する関数は**で呼び出す。
2.それ以外は*だけでよい。
1.はfopen()、freopen()
2.はそれ以外
ってとこかな
0310デフォルトの名無しさん
2006/11/04(土) 02:47:26foo(int **a) { *a = malloc(...); }
bar(int *a) { *a = ...; } // fseek に相当
hoge(int *a) { ... = *a; } // その他参照のみ
{
int* a;
foo(&a);
bar(a);
hoge(a);
}
別に bar() hoge() 間で問題おきないよな。
0312デフォルトの名無しさん
2006/11/04(土) 02:53:130313273
2006/11/04(土) 03:46:45BCB5。
別件で別スレに質問したらRogueWaveのバグの可能性があると言われた。
これもそうかも。
ちなみにpush_back()やらないと何もいってこないのでひょっとすると浅いコピーやってるのではと思ってる。
普通は=使えると聞いてほっとした。
0314デフォルトの名無しさん
2006/11/04(土) 03:50:34STLport4.6.3なら入るからそれ入れたら?
0315デフォルトの名無しさん
2006/11/04(土) 03:51:07clear() + insert() よりも assign(right.begin(), right.end()) がお勧め。
0316デフォルトの名無しさん
2006/11/04(土) 11:54:14ANSI−Cを使ってWinXP上にウインドウを出すには
何をそろえればいいんでしょうか?
VC++5.0持ってますけど・・・これじゃなきゃ駄目?
0317デフォルトの名無しさん
2006/11/04(土) 11:56:58ANSIの規格内ではGUIに関する操作は一切出来ない。
0318デフォルトの名無しさん
2006/11/04(土) 11:57:11ANSI-C準拠の処理系
> これじゃなきゃ駄目?
いいえ
0319デフォルトの名無しさん
2006/11/04(土) 11:58:02コマンドプロンプトも窓だろ。
0320デフォルトの名無しさん
2006/11/04(土) 11:59:25問題を単純化した例を下記に挙げます。
#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つに分けるしか手がないでしょうか?
0321デフォルトの名無しさん
2006/11/04(土) 12:02:14コマンドプロンプトはCUIだ
0322デフォルトの名無しさん
2006/11/04(土) 12:08:02それはショートサーキットという動作。
ショートサーキット無しの論理演算をしたければ、2つに分けるのが正解。
そうでなければ、たとえば Test1() & Test2() ならショートサーキットは起こらない。
volatile は関係ない。
0323デフォルトの名無しさん
2006/11/04(土) 12:19:35式1 && 式2
という演算では、式2より先に式1が評価されるのが保障されている。
そして、式1が偽(=0)なら式2は評価されないことが保障されている。
0324>323
2006/11/04(土) 12:23:080325デフォルトの名無しさん
2006/11/04(土) 12:26:17副作用と判定を混ぜてるからそうなる。
0327デフォルトの名無しさん
2006/11/04(土) 13:21:53>>316にGUI/CUI云々は書かれてないぜ。
ウィンドウが出さえすれば要件を満足するはずだ。
0328デフォルトの名無しさん
2006/11/04(土) 14:23:23いやあの、GUIです…
ないんですか?
ANSI−C準拠の処理系ってどんなのがあるんですか?
0329デフォルトの名無しさん
2006/11/04(土) 14:35:58前にも書かれているようにC言語自体にウィンドウ表示する機能はない
Windows環境でウィンドウを出したいのならWin32APIを使う必要がある。
そのためにはPlatform SDKが必要だが、VC++5.0持ってるなら必要ない。
でも今さら5.0使うよりかはVS2005Expressを使ってみるのもいいかもね。
0330デフォルトの名無しさん
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;
}
0331330
2006/11/04(土) 16:13:320332デフォルトの名無しさん
2006/11/04(土) 16:48:48どうもありがとうございます。
UNIXには、turtle.hとかってありましたよね…
あの頃が懐かしい
0333デフォルトの名無しさん
2006/11/04(土) 18:06:100334デフォルトの名無しさん
2006/11/04(土) 18:29:39それ多分gccの拡張だから
teststruct(int in_mem1, double in_mem2) : mem1(in_mem1), mem2(in_mem2) {}
teststruct() {}
って書けよ
0335デフォルトの名無しさん
2006/11/04(土) 18:30:03○>>330
0336デフォルトの名無しさん
2006/11/04(土) 19:03:47VC++ 6の問題だと思う。
VC++ 7.1/8ではコンパイルできるし、
そんなをできないようにする理由もないはず。
0337秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 19:19:11乱数で0が出るまでの回数をtemp[]配列に記憶しておき,それを1万回試行してtemp[]の平均を求める。
http://ipoko.skr.jp/ransuu.cpp.txt
というプログラムを考えたのですが,なぜか最初の1回だけランダムな数字が出て
残りの9999回は全部0になってしまいます。
何故でしょうか?誰か教えてくださいm(__)mペコ
0338デフォルトの名無しさん
2006/11/04(土) 19:25:580339秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 19:27:43アッー!
なるほど、どうもありがとうございましたw
0340デフォルトの名無しさん
2006/11/04(土) 19:27:59覚えないと。
0341秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 19:29:30テンプレートってのをはやく覚えたいです頑張ります
0342秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 19:31:28CとC++の違いがまだ分からないです。
勉強に当たって何に気をつければいいとかありますか?
0343デフォルトの名無しさん
2006/11/04(土) 19:35:160344デフォルトの名無しさん
2006/11/04(土) 19:42:320345秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 19:43:292ch暦6年です
0346デフォルトの名無しさん
2006/11/04(土) 19:48:08アホウ!
初期化に関数を使えるようにしたら、
関数の呼び出し順序によって結果が変わることがありえる。
その関数の場合は副作用が無いから問題ないが、
よく考えてものを言え。
0347デフォルトの名無しさん
2006/11/04(土) 19:55:12しかし規格上できることになっていることに変わりはない。
0348デフォルトの名無しさん
2006/11/04(土) 19:59:09規格のセクション貼れよ。どこにそんな事が書いてある。
0349デフォルトの名無しさん
2006/11/04(土) 21:04:30君はunary function以外認めない気かw
8.5.12
0350デフォルトの名無しさん
2006/11/04(土) 21:18:19§8.5.12なんてねーぞ。8.5.1.12も違う内容だし
0351デフォルトの名無しさん
2006/11/04(土) 21:33:37unary 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;
}
0352デフォルトの名無しさん
2006/11/04(土) 21:36:16って書かないで構造体の宣言できるんですか?
いつも定義で
typedef struct {
// any code
} teststruct ;
0353デフォルトの名無しさん
2006/11/04(土) 21:38:02>>349みたいな出鱈目書かないで
0354デフォルトの名無しさん
2006/11/04(土) 21:41:17lintで構文チェックするのは常識ですか。
0355デフォルトの名無しさん
2006/11/04(土) 21:45:18最近のコンパイラは賢い。
あやしいところの警告もちゃんとしてくれる。
gccやvcなみのコンパイラを使ってるならlintは不要。
0356デフォルトの名無しさん
2006/11/04(土) 21:46:03-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;
0357デフォルトの名無しさん
2006/11/04(土) 21:47:43JIS X3014:2003より。
8.5の1節では、初期化子節に代入式が挙げられている。
代入式とは関数呼出式を含んでおり、
実際同2節には、関数で初期化できることも書かれている。
0358デフォルトの名無しさん
2006/11/04(土) 21:48:59の12か
0359デフォルトの名無しさん
2006/11/04(土) 21:49:27たぶんもう分かってると思うけど
それはもう配列に限った話じゃなくて未定義だ
0360秋葉の大学生♂&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
0361デフォルトの名無しさん
2006/11/04(土) 21:52:36配列に限ったことじゃないし。
どんな言い訳してくれるか楽しみ
0362秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 21:55:47解決済みですm(__)mペコ
0363デフォルトの名無しさん
2006/11/04(土) 21:58:08>>351は>>336の「そんなをできないようにする理由もないはず。」に対する反論なんだとオモタ
0364デフォルトの名無しさん
2006/11/04(土) 21:58:49ありがとうございます。そうすると lint は一つ前の世代のものなんですか。
書き込みが早いですね。
0365秋葉の大学生♂&rlo;望志んさ屋トフソ
2006/11/04(土) 23:00:09http://ipoko.skr.jp/ransuu.cpp.txt
int型の配列を25000個なら確保できるけど,
30000個以上だとプログラム実行させても強制終了しちゃいます
int temp[3万以上]; としたソースをコンパイルして実行させると強制終了しちゃいます。
これの原因は何でしょうか?
0366デフォルトの名無しさん
2006/11/04(土) 23:01:38マルチ
0367デフォルトの名無しさん
2006/11/04(土) 23:08:40初心者の人が虫食い状態のソースを埋めて完成させる簡単な課題を丸投げしていたのですが…
わざと理解できないように難しく書き直したり、きちんとお礼を言っている質問者に対して『この程度の事が分からないのはやる気がないだけ、そんな人間にお礼を言われる筋合いもないし、虫酸が走る』とまで書いていました…。
分かる人には大した事の無いことだったとしても、分からない人にはそうでないのですから、もう少し常識ある態度が取れないのかな…と思った訳です。
0368デフォルトの名無しさん
2006/11/04(土) 23:09:28こういうのを見た後に、ここのサイトにやってきたので、余計に素晴らしいなと思ったんですよね(笑)
私の拙い知識でも役に立つ人がいるのならば…と、今後を驕ることなく書き込みしていきたいと思ってますよ(^-^)
0369デフォルトの名無しさん
2006/11/04(土) 23:10:120370デフォルトの名無しさん
2006/11/04(土) 23:11:53表層的に丁寧な言葉を使ってても、
あからさまに解く気が無いのはとても失礼な態度だと思う。
それで罵倒されたからってここで書くのもどうかと思う。
0371デフォルトの名無しさん
2006/11/04(土) 23:22:25人が多いから、たまにとても親切な人も来るというだけ。
あなたが退会してきたそこも、別にひどい場所じゃないだろう。
そういう考えの人がいるのは別に不思議じゃない。ここにだっている。
0372デフォルトの名無しさん
2006/11/04(土) 23:46:01Ku○○○○○eがいないかどうか確かめて、もしいたらそこには
何も書き込まない事だな。
0373デフォルトの名無しさん
2006/11/05(日) 00:08:33その人は管理人じゃないから、catっぽい名前の人だと思う。
ちなみに自分も耐えられなくて逃げてきた。何かをけなされたわけではないが。
0374デフォルトの名無しさん
2006/11/05(日) 00:56:07最近の子供はコンピュータがブラックボックス化してしまたせいで
コンピュータの仕組みについては何も知らない
MS-DOS?Windows3.1?コマンドライン?(謎)って感じ
昔に比べて自分でプログラム作る必要は無くなったし
自作する必要も無くなった(自作PCと既製PCの値段の差が無くなってきている!)
(まぁインターネットサーフェインやHP作成はちょっと昔の子供より出来そう?だが)
商業高校の掲示板とかスレとか見てみ?
情報をたくさん勉強してるはずなのに何も知らないよ?
資格もワープロ検定やパソコン検定などエンドユーザ側の試験ばかり(それはそれで悪くはない・・?)
0375デフォルトの名無しさん
2006/11/05(日) 02:54:37そりゃ、スタックオーバーフローだろうな。
temp配列の領域をスタックに置いているから、ある程度以上のインデックスを超えると
リンカで用意しているスタック領域を超えて、メモリ領域を壊しまくる。か、MMUによってアクセス例外が起きる。
普通ある程度大きな領域を必要とする場合は、ヒープ領域にとる。
int* temp = new int[1000000]; //領域確保
... 処理
delelte[] temp; //使い終わったら必ず領域開放
0376デフォルトの名無しさん
2006/11/05(日) 02:55:040377デフォルトの名無しさん
2006/11/05(日) 03:00:10なくならない。
0378デフォルトの名無しさん
2006/11/05(日) 04:16:19ハ ┌( ;/ ト, ,、 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 )ハ
ヽ ) (( )ノ /
ノ/ ') _/
0379秋葉の大学生&rlo;望志んさ屋トフソ
2006/11/05(日) 04:20:07ありがとうございました。
スタックがそんなところに存在して
あの場所で宣言すると勝手にリンカのスタックに入ってしまい
しかもゴチャゴチャした制約があったなんて知りませんでした
勉強になります
0380デフォルトの名無しさん
2006/11/05(日) 11:42:45晒し
Kusakabe
id=1277347
耐性のない初心者はこの基地外のいるコミュニティに書き込むべからず
0381デフォルトの名無しさん
2006/11/05(日) 13:25:56ただ同じことを繰り返してるだけなので、
試行が終わるたびにテキストで出力すればあとは手作業で済ませます。
どうすれば、試行の度に出力することができますか?
ファイル名をその度に変える必要があるんどえしょうか?
0382デフォルトの名無しさん
2006/11/05(日) 15:00:060383デフォルトの名無しさん
2006/11/05(日) 15:14:17マルチか嵐か?
誘導されてきた積もりなのなら、誘導元に断り書きすることとこちらにもその旨を書くこと。
つーか、誘導元でソースを貼れと言われただろ。
0384デフォルトの名無しさん
2006/11/05(日) 17:12:12リストボックスで複数行(8行)そして、複数列(256列)表示させたいのです。
表示内容は2次配列を用いて、処理中に書き換え可能としたいのです。
質問は複数列表示についてですが、基本的なところでどうすれば複数列設定ができるのでしょうか?
お願いします。
0385デフォルトの名無しさん
2006/11/05(日) 18:16:11素直にFlexGridでも使っとけ。VC6ならついてるぞ。
0386384
2006/11/05(日) 19:11:47FlexGridの方が素直ですか。
明日から考えてみます。
0387デフォルトの名無しさん
2006/11/05(日) 20:34:30先日、フリーのCコンパイラを試そうといろいろ入れたんです。
�@ Cygwin
�A VisualC++2005ExpressEdition + Platform SDK
�B Borland C++Builder
と、みっつ連続でインストールしたのですが、�@のCygwinしか正常にコンパイルを行うことが出来ません。
�A�Bどちらも解説サイトの手順に沿ってインストールを行い、全てデフォルトの位置に入れました。
環境変数の Path Include Lib への追記も済んでいるので問題なくコンパイルできなければいけないはずなのですが…
�AのVCはMSVCR80.dllにまつわるエラーらしき警告がたくさん出て終了、�BのBCCは大量のエラーがずらずらと流れて終了、というありさまです。
これらのコンパイラは共存できないものなんでしょうか?これでは使い勝手を試しようがありません。
OSはWindows2000SP4です。どなたか解決方法をご教授ください orz
0388デフォルトの名無しさん
2006/11/05(日) 20:44:44何をしてどんなエラーが出たか書いてもらわないことには何とも言えない
0389デフォルトの名無しさん
2006/11/05(日) 21:06:57VC2005 って、Win2000 対応してたっけ?
0390デフォルトの名無しさん
2006/11/05(日) 21:07:340391デフォルトの名無しさん
2006/11/05(日) 21:18:44上記3件全てのコンパイル用ファイルが梱包されていたathenaというプログラムを比較用サンプルに使用しました。
Cygwinでは手順どおりに行えばコンパイルが完了してexeをちゃんと吐き出しました。
VC・BCC共に環境変数及びbatファイル内のPass・Include・Libそれぞれをインストール先に書き換え、
batのダブルクリックとコマンドプロンプトからの実行をそれぞれ行いました。
VCは「プロシージャ エントリ ポイント __security_error_handler がダイナミック リンク ライブラリ MSVCR80.dll から見つかりませんでした。」
という警告ウィンドウが連続発生して処理終了。BCCはE2000番台やW8000番台のエラーが数百行近く流れ続けて処理終了。
どちらも結局exeを吐き出すことはありませんでした。
とりあえず正常に動く環境にしたいのですが、どうすればよろしいでしょうか…
0392デフォルトの名無しさん
2006/11/05(日) 21:18:53p84にある
int main()
{
Expr t=Expr("*", Expr("-",5),Expr("+",3,4);
cout << t << endl;
のExpr("*", Expr("-",5),Expr("+",3,4);
の部分がよくわかりません。
Exprは型名だと思うのですが
Expr hoge("*", Expr("-" 〜
ではなく
Exprのすぐあとに括弧で引数をわたしているのはどういうことなんでしょうか?
0393デフォルトの名無しさん
2006/11/05(日) 21:22:03まずコンパイラの動作確かめるならHello, Worldにしよう
0394デフォルトの名無しさん
2006/11/05(日) 21:27:30ttp://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>がおかしいって事はかろうじて分かったんですけど、どう対処すればいいのでしょうか?
0395デフォルトの名無しさん
2006/11/05(日) 21:29:02vector<Hoge> vi;
vi.push_back(Hoge(...));
名無しの一時オブジェクトができる
0396デフォルトの名無しさん
2006/11/05(日) 21:50:020397392
2006/11/05(日) 21:56:37今回の例のようなSTLに格納するわけではない場合
一時オブジェクトをつくるのにどんなメリットがあるんでしょうか?
Expr t("*",Expr("-",5),Expr("+",3,4));
と書いたほうがスッキリしていると思うんですが
0398デフォルトの名無しさん
2006/11/05(日) 22:25:47Cからある初期化構文を使うんで、理解されやすいかもしれない。その程度。
0399デフォルトの名無しさん
2006/11/06(月) 00:06:49どっちかって言ったらデメリットの方が大きい気がするなぁ
0400デフォルトの名無しさん
2006/11/06(月) 14:24:44デベロッパ側の勉強は工業高校の方じゃね?
0401デフォルトの名無しさん
2006/11/06(月) 15:24:27終了している箇所がライブラリの奥深くで、どこの呼出が原因なのかまったく分かりません。
exit()で正常終了されてしまうのでgdbでwhereとかも出来ないんですが、
これを調べる良い方法はありませんでしょうか?
printfデバッグしかないんでしょうか。
0402デフォルトの名無しさん
2006/11/06(月) 15:26:57exitにブレークポイントしかけて実行して、bt
0403デフォルトの名無しさん
2006/11/06(月) 17:29:32「free/deleteしたポインタを操作する危険な命令」ですか?
0404デフォルトの名無しさん
2006/11/06(月) 17:35:28いいえ。
free/delete した後もそのポインタが指す内容を参照すること = 「free/deleteしたポインタを操作する危険な命令」
delete p;
*p = .... とか hoge = *p; 等
delete p; p=NULL; としておけば、上記 *p = ... 等で不正書き込みとして検出できる。
0405デフォルトの名無しさん
2006/11/06(月) 17:42:440406デフォルトの名無しさん
2006/11/06(月) 21:30:51とは限らない。
0407デフォルトの名無しさん
2006/11/06(月) 23:14:07「変数」と「値」の違いを理解すること
0408デフォルトの名無しさん
2006/11/07(火) 00:01:59{
public:
hoge()
{
cout << "test" << endl;
}
};
上のようなクラスを定義して
int main()
{
hoge hoge1;
hoge hoge2();
return 0;
}
とやるとhoge1のときだけコンストラクタが呼ばれるみたいなんですが
どうしてhoge2のときはコンストラクが呼ばれないでしょうか?
0409デフォルトの名無しさん
2006/11/07(火) 00:08:49> hoge hoge2();
引数を取らずhoge型を返す関数hoge2の宣言。
0410デフォルトの名無しさん
2006/11/07(火) 00:29:00よくわかりました。ありがとうございます
0411デフォルトの名無しさん
2006/11/07(火) 00:57:41bool isEven(int i)
{
return !(i%2);
return false;
}
というコードがあったんですが
下のreturn false;が実行される事はあるんでしょうか?
0412デフォルトの名無しさん
2006/11/07(火) 01:06:58そんな本投げ捨てろ
0413デフォルトの名無しさん
2006/11/07(火) 01:15:270414デフォルトの名無しさん
2006/11/07(火) 01:20:580415デフォルトの名無しさん
2006/11/07(火) 01:35:05取得する方法ってあるかな? たとえばdirで出したディレクトリ構造とかとか。
0416デフォルトの名無しさん
2006/11/07(火) 01:49:15CMD.EXEを起動して引数に渡せばいいんじゃね?
0417デフォルトの名無しさん
2006/11/07(火) 02:26:26popen
0418デフォルトの名無しさん
2006/11/07(火) 02:39:020419デフォルトの名無しさん
2006/11/07(火) 02:51:46商業出身でも工業出身でもないが、ハードや仕組み、(工業高校のみ)BASIC(VBA)は今の高校の情報の教科書に乗っている。
ただ睡眠学習しているだけ。
0420デフォルトの名無しさん
2006/11/07(火) 06:15:40vc2005EEで 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"
と、なったり
0421420
2006/11/07(火) 06:17:09moji[0] = "@"
moji[1] = "□"
moji[2] = "."
moji[3] = "0"
moji[4] = "a"
moji[5] = "b"
moji[6] = "c"
と、なってしまいます。
HOGE hogeをファイル内で一度のみ使うようにすると一応正常に動くようで
class名 {メンバ変数名 = [アドレス]""} となっていました。
そこで、問題の箇所を確かめようと、別にHOGEクラスのファイルを付けただけの
プロジェクトファイルを作り、HOGE hoge を複数の関数で使ってみたのですが
正常に動いてしまいました。
どうやら、問題の起こっているプロジェクトの方で何か不味い事をしてしまった様だ
という事は分かるのですが、そこから先の検討の付け方が分かりません。
0422デフォルトの名無しさん
2006/11/07(火) 06:40:370423415
2006/11/07(火) 07:29:560424デフォルトの名無しさん
2006/11/07(火) 14:22:14とてもサイズが大きいクラスBigAがあったとします。
で、vectorみたいなコンテナを作ったとして
vector<BigA> bigAvec;
BigAオブジェクトをどんどん格納していきたいんですが
bigAvec.pusu_back(BigA());
ってやると、BigAが重たいコンストラクタで生成されて、
さらにpush_backされる時にコピーコンストラクタでコピーされますよね。
いきなりvector内のコンテナの中でBigAオブジェクトを生成したりとかできないんでしょうか。
0425デフォルトの名無しさん
2006/11/07(火) 14:31:490426デフォルトの名無しさん
2006/11/07(火) 14:32:47ポインタ格納すれば?
0427デフォルトの名無しさん
2006/11/07(火) 15:57:47連続したメモリにbigAオブジェクトを隙間無く並べたいという都合があるので、
ポインタ格納はやりたくないんです・・・。
あるいは、普通の配列にbigAオブジェクトを格納して並べて、
それらへのポインタをvectorとして管理すればいいんでしょうか。
0428デフォルトの名無しさん
2006/11/07(火) 16:30:28今思いつきましたが、
BigAのメンバ変数を全てpublicにしてしまえば、
vector<BigA> bigAvec(1000);
bigAvec[0].valueA = 9.9; //BigAのメンバ変数
bigAvec[0].valueB = 2.9;
.....
のようにすれば>>424のボトルネックは解消できますよね。
あ、でもこの場合、
vector<BigA> bigAvec(1000);
でBigAのデフォルトコンストラクタが呼ばれるのでしょうか?
0429デフォルトの名無しさん
2006/11/07(火) 17:24:390430デフォルトの名無しさん
2006/11/07(火) 18:22:25fgetcでfpの指示位置が遷移して、fputcで書き込まれる?
それとも
まるっきりコピー?
0431デフォルトの名無しさん
2006/11/07(火) 18:42:340432デフォルトの名無しさん
2006/11/07(火) 18:47:230433デフォルトの名無しさん
2006/11/07(火) 18:49:28これってどうなる?
0434デフォルトの名無しさん
2006/11/07(火) 18:52:18dcba
WinXP BCC 5.51
0435デフォルトの名無しさん
2006/11/07(火) 19:08:25>>432
>>432
>>432
0436デフォルトの名無しさん
2006/11/07(火) 19:44:42間にseek系挟まずにread系,write系はアウト
0437デフォルトの名無しさん
2006/11/07(火) 20:24:41fgetcがfputcより先に呼ばれるのは確実だからfgetcでポインタが進んでからfputcで書き込まれるだろ
もしかして俺、勘違いしてる?
0438デフォルトの名無しさん
2006/11/07(火) 20:33:31dcba
WinXPSP2 VC6SP6
0440デフォルトの名無しさん
2006/11/07(火) 21:04:520441デフォルトの名無しさん
2006/11/07(火) 21:17:16>436
0442430
2006/11/07(火) 21:19:18a=fgetc(fp);
fseek(fp, -1, SEEK_CUR);
fputc(a,fp):
正直にこうした方がいいのかな
0443デフォルトの名無しさん
2006/11/07(火) 21:26:400444デフォルトの名無しさん
2006/11/07(火) 22:39:37演算子の左辺側の値を取得しようとしたら
クラス定義の際に使えるthisポインタ以外に方法はありませんよね?
0445デフォルトの名無しさん
2006/11/07(火) 22:43:330446デフォルトの名無しさん
2006/11/08(水) 17:34:130447デフォルトの名無しさん
2006/11/08(水) 18:46:370448デフォルトの名無しさん
2006/11/08(水) 20:10:15関数の戻り値・名前・引数をあらかじめ宣言しておき、
呼び出される以前に関数の内容が定義されていなくてもいいようにするため。
と自分では理解しています。
main()は必ず最初に呼び出されるので書かなくてもいいんですよね?
http://www1.cts.ne.jp/~clab/index.html
このサイトではmain()のプロトタイプ宣言をしていたので不思議に思い質問しました。
0449デフォルトの名無しさん
2006/11/08(水) 20:24:05普通に関数本体のところのプロトタイプ宣言に当る部分を読んでくれないのかね?
何でわざわざユーザーに書かすのかが分からん
0450デフォルトの名無しさん
2006/11/08(水) 20:46:21上から1回だけスキャンすればいいから。
0451デフォルトの名無しさん
2006/11/08(水) 20:52:52そのためだけに1回スキャンしても一瞬で終わるじゃん
0452デフォルトの名無しさん
2006/11/08(水) 20:54:54仕事でプログラムをしなくてはいけなくなりまして。
VC6.0でプログラムされたものを改造しています。
関数の途中でアプリケーションを終了する方法を探しています。
exitやabortだとアプリケーションがフリーズした状態になるだけでした。
終了するコマンドってありますか?
すみませんが、どなたか教えてください。
0453デフォルトの名無しさん
2006/11/08(水) 21:05:38ソースがスキャンしたくないくらいに長いとき、ソースとヘッダを
分離するメリットくを考えるとそういう仕様になってるのが納得できるよ。
0454デフォルトの名無しさん
2006/11/08(水) 21:08:08>453
言いたい事はわかるが、コンパイラがスキャンしたくないようなレベルの長さってどうよ
0455デフォルトの名無しさん
2006/11/08(水) 21:12:02ClassA::ClassA (ClassB* p) : v( p)
{
……
}
本に載ってたサンプルでこんなのがあったんですけど
これってどういう構文なんでしょうか。
継承ではなさそうだし、デフォルト引数でもないし。
0456デフォルトの名無しさん
2006/11/08(水) 21:20:46引数としてClassBへのポインタを取り、vにそれを代入する
0457デフォルトの名無しさん
2006/11/08(水) 21:23:39ありがとうございます。
0458デフォルトの名無しさん
2006/11/08(水) 21:24:490459デフォルトの名無しさん
2006/11/08(水) 21:37:530460デフォルトの名無しさん
2006/11/08(水) 22:16:12関数定義が必ずしも同じソース内に無くていいってのもあるんじゃない?
aaa.cから呼び出している関数定義がbbb.cにあるとき、
aaa.cのコンパイルでbbb.cまでスキャンしなきゃならないなんてコンパイラには知りようがない。
0461デフォルトの名無しさん
2006/11/08(水) 22:48:43非MFCのウィンドウアプリケーションならメインのウィンドウへWM_CLOSEをSendMessageで送る。
ウィンドウを表示しないアプリケーションならexitで問題ないはず。
MFCは知らない。
0462デフォルトの名無しさん
2006/11/08(水) 23:14:370463デフォルトの名無しさん
2006/11/09(木) 03:23:21警告出てないか?
もしくは警告レベルを低く設定していないか?
0464そうべえ
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
0465そうべえ
2006/11/09(木) 07:30:47Date.h�@とInitAsign.cpp�AとDate.cpp�Bです。
よろしくお願いします!
/*�@■■■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; } // 日を返却
};
0466そうべえ
2006/11/09(木) 07:32:09#include <iostream>
#include "Date.h"
using namespace std;
int main()
{
Date x(); // テスト
cout << "X = "
<< x.Year() << "年" << x.Month() << "月" << x.Day() << "日\n";
return 0;
}
0467そうべえ
2006/11/09(木) 07:33:08#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;
}
以上です。(「改行が多すぎます!」ってのが出たため分割しました)
0468デフォルトの名無しさん
2006/11/09(木) 07:48:400469そうべえ
2006/11/09(木) 08:18:47>>408の方のように、理解できません。
hoge hoge1; → 正しい
hoge hoge2(); → 間違い
ということでしょうか?
括弧は必要だと思うのですが...
0470デフォルトの名無しさん
2006/11/09(木) 08:19:52あるいは
Date x = Date();
0471デフォルトの名無しさん
2006/11/09(木) 08:22:38だから後者は関数の宣言だろうがカス。
0472そうべえ
2006/11/09(木) 08:40:590473デフォルトの名無しさん
2006/11/09(木) 09:55:26マルチ氏ね
0474デフォルトの名無しさん
2006/11/09(木) 14:01:37hoge* hoge1 = new hoge;
と
hoge* hoge2 = new hoge();
の違いを知りたかったのか。
PODかそうでないかで、前者と後者の動きが違う。
PODの時は前者は領域を確保するのみ、後者は0フィルされる。
PODでない時は前者と後者で差はない。デフォルトコンストラクタが呼び出される。
0475デフォルトの名無しさん
2006/11/09(木) 14:15:21エスパーする前にちゃんと前後のレスを読め
0476デフォルトの名無しさん
2006/11/09(木) 15:28:29int 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
0477デフォルトの名無しさん
2006/11/09(木) 15:39:53コンパイラの吐き出すアセンブラ次第だろうね。
if 内部の等価比較のコードに左右されそうに思う今日このごろ
0478デフォルトの名無しさん
2006/11/09(木) 15:42:05returnがないときに何が戻るかと言う質問と言うことで宜しいか?
だとしたら、x86用の私の知っているコンパイラなら0になることは先ず有り得ない。
勿論1になるか2になるか、或いは他の何が戻されても不思議ではないが。
0479デフォルトの名無しさん
2006/11/09(木) 15:55:49478
そうそうreturnで値を返してない時の動作ッス
ふむ、やっぱり不定値って事だよねぇ
0480デフォルトの名無しさん
2006/11/09(木) 16:36:55killed
って表示されてそこで止まったんですが、これは何なんでしょうか?
ぐぐってもわからなかったorz
0481デフォルトの名無しさん
2006/11/09(木) 17:35:570482デフォルトの名無しさん
2006/11/09(木) 19:48:28これはdev-cpp用mingのincludeとlibファイルがパッケージになっているものですが
怪しいブツだと思います。
使い方解る方いらっしゃいますか?
0483デフォルトの名無しさん
2006/11/09(木) 21:39:33.NET無しで作りたかったので、「共通ランタイムサポート」を
「共通言語ランタイム サポートを使用しない」に設定したところ、
「error C2653: 'System' : 識別子がクラス名でも名前空間名でもありません。」
みたいなエラーがたくさん出力されました。
「共通ランタイムサポート」を「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」にすると、
正常にコンパイルできることは確認しております。PSDKもインストールしております。
どなたかスレ違いでなければ、どうすればコンパイルエラーをなくすことができるか教えていただけませんでしょうか?
0484デフォルトの名無しさん
2006/11/09(木) 21:41:38System が含まれている共通言語ランタイムのサポートを使用するといいよ。
0485デフォルトの名無しさん
2006/11/09(木) 21:45:25そうですか…
どうもありがとうございました。
0486デフォルトの名無しさん
2006/11/09(木) 21:59:370487デフォルトの名無しさん
2006/11/10(金) 01:03:10名前空間Systemにあるものは全て.NET Frameworkのクラスライブラリ。
.NET無しで作るとは、これらを全く使わないということ。
(名前空間Microsoft以下も同様)
0488デフォルトの名無しさん
2006/11/10(金) 06:03:29eaxレジスタにごみが入っていればごみが戻り値になる
0489デフォルトの名無しさん
2006/11/10(金) 06:51:50AIXだからx86系のCPUとは限らんのとちゃう?
0490デフォルトの名無しさん
2006/11/10(金) 07:11:110491デフォルトの名無しさん
2006/11/10(金) 11:01:46fprintfでファイルに書き込む際に、OSの書き込みバッファは使われるのでしょうか?
それとも、バッファを自分でプログラムする必要があるのでしょうか?
あるいは、これは、OSに依存するのでしょうか?
一文字ごとに出力するのと、100文字まとめて出力するのでは、
処理速度に大きな違いが出るので、自作プログラムから書き込みバッファがどのように使われるのか知りたいのですが。
0492デフォルトの名無しさん
2006/11/10(金) 11:26:34setbuf, fflush を調べてみよう
0493デフォルトの名無しさん
2006/11/10(金) 22:20:13まずはfputc,fputs,fwriteあたり試したほうがいいような。
試したことないけど。
0495デフォルトの名無しさん
2006/11/11(土) 00:54:55int _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...と表示させたいんですが、
頭の一文字目しか表示されません。何を間違えてるんでしょうか・・・?
0496デフォルトの名無しさん
2006/11/11(土) 01:13:350497デフォルトの名無しさん
2006/11/11(土) 01:55:49for(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]に入れてるのに、なぜ全部の要素に一つのアドレスが
入ってしまうのでしょうか?
0498デフォルトの名無しさん
2006/11/11(土) 02:25:13↓
wcsncpy(t[i],buf,MAX);
とか
0499デフォルトの名無しさん
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になる理由がわからない。
ポインタ難しい。
0500デフォルトの名無しさん
2006/11/11(土) 03:30:54こんなん書いてりゃ当たり前じゃん
0501デフォルトの名無しさん
2006/11/11(土) 09:48:11for(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
なぜですか?
0502デフォルトの名無しさん
2006/11/11(土) 10:10:00class foo{
static const int var0=1000;
static const double var1=0.123;//コンパイルエラー
};
なぜ整数型しか初期化してはいけないんですか。
0503デフォルトの名無しさん
2006/11/11(土) 10:12:060504デフォルトの名無しさん
2006/11/11(土) 10:19:47> {
> 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はまったく出来てないよ。
0505デフォルトの名無しさん
2006/11/11(土) 10:19:57>t[i] = (wchar_t*)malloc(sizeof(wchar_t)*MAX);
>t[i] = buf;
もしかして、mallocで確保した領域にbufの内容をコピーしているつもりか?
上の式ではそんなことをしていない。
mallocで確保した領域のアドレスはt[i]にいったん格納しているが、
そのあとに、それをすててbufのアドレスで上書きしているだけ。
ついでに言うと、bufはfor文のブロックの中で宣言されている。
for分のブロックを抜けたあとには参照してはいけない。
参照しても、以前自分が設定していた値が入っているとは限らないし、
更新すれば他で使用しているメモリ領域を壊すことになる。
全部test9が入っていたのはたまたま10階のループですべて同じ領域を指しており、
最後にループを抜けたとあとにもそこが壊されていなかっただけ。
0506デフォルトの名無しさん
2006/11/11(土) 10:22:07エラー : C2864
整数型は初期化できてもそれ以外が初期化できないのはどうしてだろうという疑問。
0507デフォルトの名無しさん
2006/11/11(土) 10:36:490508デフォルトの名無しさん
2006/11/11(土) 10:43:310509デフォルトの名無しさん
2006/11/11(土) 10:48:46-pedantic つけると通らない。
あとVC6だとintもダメ。
0510507
2006/11/11(土) 12:03:40さんくす。
0511デフォルトの名無しさん
2006/11/11(土) 12:10:550512デフォルトの名無しさん
2006/11/11(土) 12:13:25本当に初心者来たらからかって終わりじゃん
プログラマとここの回答者はみんな死ねばいいのに
0513デフォルトの名無しさん
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])とかすると落ちます。
やはり最初の一行目は間違ってるんでしょうか。
でもこれをつけないと表示にすら届きません。
0514デフォルトの名無しさん
2006/11/11(土) 13:08:12しかも1個だけしか確保してないし。
0515デフォルトの名無しさん
2006/11/11(土) 15:25:19初心者のうち、やる気があり且つそれが文章から伝わる場合のみ歓迎。
0516デフォルトの名無しさん
2006/11/11(土) 17:49:02すぐ下で「初心者」がちゃんと会話を成立させてるあたり
512のピエロっぷりが際立っててグー。
0517デフォルトの名無しさん
2006/11/11(土) 21:00:100518デフォルトの名無しさん
2006/11/11(土) 21:23:59俺はこう思っている。
そもそも導入されたきっかけが、#defineの置き換えを意図しているため。
だから、整数型さえその場で定義できれば十分だ(実際そうなっている)。
0519デフォルトの名無しさん
2006/11/11(土) 21:32:23#define による定数の定義は浮動小数点型でも文字列リテラルでも可能だったわけだが。
0520デフォルトの名無しさん
2006/11/11(土) 21:37:300521デフォルトの名無しさん
2006/11/11(土) 21:45:59#ifdef DEBUG
if(hoge)
return false;
#endif
return true;
}
int main(){
if(func())
hogehoge;
}
このような関数の場合、DEBUGが定義されていない時は、
最適化されてfunc自体が呼び出されないことを期待できるのでしょうか?
0522デフォルトの名無しさん
2006/11/11(土) 21:49:17#define func() (!hoge)
#else
#define func() true
#endif
のほうが最適化してくれる可能性が高そう
0523デフォルトの名無しさん
2006/11/11(土) 21:51:50期待はできる。
0524デフォルトの名無しさん
2006/11/11(土) 22:01:47ISO C++ に M_PI は定義されていません。
とりあえず #define が削除されたわけじゃないんで、
C で定義されていた定数は互換性のためにそのまま
残っています。
"Standard value" とされて "Standard macro" とは
分離されているので、マクロとするかどうかは処理系が
自由に決めていいのかもしれません。
0525デフォルトの名無しさん
2006/11/11(土) 22:01:50レスありがとうございます
とりあえず>>522の方法でいってみようと思います
0526デフォルトの名無しさん
2006/11/11(土) 22:39:51t[0]〜t[9]に値を格納したいなら、tは10個分の(wchar_t*)が格納できるサイズで確保すること。
freeで落ちたのは、t[1]〜t[9]に書き込んだ際に、壊してはいけない領域を壊したため。
0527デフォルトの名無しさん
2006/11/11(土) 23:37:41switchの動作が理解不能な動作してて困ってるんですが
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に行かないんでしょう?
0528デフォルトの名無しさん
2006/11/11(土) 23:49:32hogeの値は本当にBか?
まさかhogeとかBが文字列だったりしないよな
0529デフォルトの名無しさん
2006/11/11(土) 23:50:060530デフォルトの名無しさん
2006/11/11(土) 23:52:08Bです
値Bは0x8002で、hogeはshort型で中身も0x8002なのデバッガで確認しました
>>529
省いてますが
元の文にはちゃんと書いてます
0531デフォルトの名無しさん
2006/11/11(土) 23:56:250532デフォルトの名無しさん
2006/11/12(日) 00:03:32#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;
}
0533デフォルトの名無しさん
2006/11/12(日) 00:05:06#define HOGE 0x8002
で、case HOGE: というような定数式で書いてます
0534デフォルトの名無しさん
2006/11/12(日) 00:06:05一方、0x8002 と書くと int なので 32770 として解釈される。
従って異なる値として処理される。
hoge を unsigned short にすれば解決するはず。
0535デフォルトの名無しさん
2006/11/12(日) 00:07:23ということは、「#define HOGE ((short)0x8002)」でもいけそうですね
どうもありがとうございました
0536デフォルトの名無しさん
2006/11/12(日) 01:21:450537デフォルトの名無しさん
2006/11/12(日) 08:26:00というか、片方がsigned intで処理されてるのにunsigned shortで値だけ無理やり合わせるのは良くない
そんなことをすれば、定数値が0xffffを越えた時に絶対に一致しなくなる
>>535のは定数値の方を変数と同じsigned shortに合わせるから値範囲の違いが是正できて現実的
少しは頭使えよカス
0538デフォルトの名無しさん
2006/11/12(日) 10:18:570539デフォルトの名無しさん
2006/11/12(日) 10:50:34「unsigned」で統一するのが常ってもんだろ
0540デフォルトの名無しさん
2006/11/12(日) 11:13:400541デフォルトの名無しさん
2006/11/12(日) 12:11:070542デフォルトの名無しさん
2006/11/12(日) 13:03:01char x[]={'a','b','c'};
ですが、同じように、文字列{"abc","def","ghi"}を格納するにはどのように書けばよいのでしょうか?
0543デフォルトの名無しさん
2006/11/12(日) 13:09:590544デフォルトの名無しさん
2006/11/12(日) 14:17:59一般論では「そうかもしれない」。具体的な環境も書かずに正しい回答が得られると思ったら大間違い。
0545デフォルトの名無しさん
2006/11/12(日) 20:05:26型変換してるので理論上は落ちるはず。自分で確認してみては?
0546デフォルトの名無しさん
2006/11/12(日) 21:01:39if(nyuryoku[0] == '+')
{・・・
という風に、if文での比較対象が半角文字だとこれでいいのですが、
2バイト文字を比較対象にしようと思ったらどうすればいいのでしょうか。
2バイトなのだから
if(nyuryoku[0] == 'あ')
とかじゃいけないってことはわかるのですが・・・。
0547デフォルトの名無しさん
2006/11/12(日) 21:09:580548デフォルトの名無しさん
2006/11/12(日) 21:13:35char型です。
char nyuryoku[30];
にしてます。
0549デフォルトの名無しさん
2006/11/12(日) 21:20:200550デフォルトの名無しさん
2006/11/12(日) 21:34:170551デフォルトの名無しさん
2006/11/12(日) 21:36:30なにそれ? 聞いたことないな。
0552デフォルトの名無しさん
2006/11/12(日) 21:48:29class 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 );
}
は型が違うとコンパイルが通りませんでした.
これを問題のないものにするにはどうしたらよいでしょうか?
0553デフォルトの名無しさん
2006/11/12(日) 22:00:55boost::shared_dynamic_cast だったかな
0554デフォルトの名無しさん
2006/11/12(日) 22:10:23クラス設計を見直すとよい。
0555デフォルトの名無しさん
2006/11/12(日) 22:31:39言語はC++でなくてもokです。。
0556デフォルトの名無しさん
2006/11/12(日) 22:39:20main関数であるファイルX.txtのfopen(),fclose()を行ったとします。
この場合、main関数内で呼び出した関数a()内では、ファイルX.txtに関してfprintf()やfscanf()を行うのは無理なのでしょうか??
というのは、main関数内で呼び出すべき関数が複数あり、また何度も関数を呼び出すので、
そのそれぞれでfprintf()等を使おうとfopen(),fclose()を記述してしまうと、ファイルのオープンとクローズを繰り返すことになるからです・・・
何か良い方法はありませんか?よろしくお願いします。
0557デフォルトの名無しさん
2006/11/12(日) 22:44:060558556
2006/11/12(日) 23:07:30int main(void)
{
void a();
char filename[256];
FILE *fp;
scanf("%s",filename);
fp = fopen( filename, "w" );
a();
fclose(fp);
}
このような場合、fopenの戻り値とはfpのことでしょうか?
a(fp);のようにfpを引数として渡せばいいのでしょうか?
0559デフォルトの名無しさん
2006/11/12(日) 23:08:41何か不満か?
0560デフォルトの名無しさん
2006/11/12(日) 23:29:42答えてくださった方、どうもありがとうございました。
0561デフォルトの名無しさん
2006/11/12(日) 23:33:220562556
2006/11/12(日) 23:45:51561さん、ありがとうございます。
FILE *fp;の一文だけをヘッダに移動させれば、main関数内でfopen()させても、引数を一つ一つ渡さなくても可能となるのでしょうか?
0563デフォルトの名無しさん
2006/11/12(日) 23:57:030564556
2006/11/13(月) 00:04:34疑問を解消してもらえる、このようなスレは大変ありがたいです。またの時もよろしくお願いします。
0565デフォルトの名無しさん
2006/11/13(月) 00:09:360566556
2006/11/13(月) 00:16:21ほかにも良い方法があるのでしょうか?差し支えなければ教えていただきたいです・・・
0567デフォルトの名無しさん
2006/11/13(月) 00:21:440568デフォルトの名無しさん
2006/11/13(月) 00:22:310569デフォルトの名無しさん
2006/11/13(月) 00:26:16名前がぶつかる可能性があるから?
メモリ上?にずっと残ってるから?
0570556
2006/11/13(月) 00:28:41fopen()の返戻値を引数として関数に渡すのが一番なんですね。
main関数内で関数呼び出しが非常に多いので躊躇してしまいました。手抜きはやっぱり駄目ですね。
0571デフォルトの名無しさん
2006/11/13(月) 00:30:59http://www.google.co.jp/search?q=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
0572デフォルトの名無しさん
2006/11/13(月) 00:36:17あれってどういう場合に付けるとかって慣例みたいなものってあるのでしょうか?
0573デフォルトの名無しさん
2006/11/13(月) 00:39:210575デフォルトの名無しさん
2006/11/13(月) 00:47:11回答者に対しても歓迎しているという事実を今知った。
0576デフォルトの名無しさん
2006/11/13(月) 01:21:33使わないほうが良い、ではなく本当に使っては駄目。
下線で始まるグローバルな名前は処理系予約。
また、下線2つあるいは下線に続いて英大文字で始まる名前はいかなる場合でも処理系予約。
それぞれただのユーザは使ってはいけない。
0577デフォルトの名無しさん
2006/11/13(月) 03:16:23ttp://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のオブジェクトが作られていないのにどうやって呼び出されているのか謎です
0578デフォルトの名無しさん
2006/11/13(月) 11:32:32たとえばWM_LBUTTONDOWNメッセージのlParamとかで、
low-order word とhigh-order word にマウスポジションが入ってるのありますよね。
64bit環境の場合でも、やっぱり下位32bitに同じデータが入ってるんですか?
それとも下位32bitがLOWで上位32bitがHIなんですか?
0579デフォルトの名無しさん
2006/11/13(月) 11:59:39MAKEPOINTS or GET_X_LPARAM and GET_Y_LPARAM
が正解。
0580デフォルトの名無しさん
2006/11/13(月) 18:10:00られないのです。
わざと不完全なマルチバイト文字列を入力してやると、iconvの返り
値が(size_t)(-1)にはなるのですがerrnoは0のまま。
何故だ?
0581デフォルトの名無しさん
2006/11/13(月) 20:00:270582デフォルトの名無しさん
2006/11/13(月) 20:15:25popen使ったら?
0583デフォルトの名無しさん
2006/11/14(火) 06:41:14のような動きをする関数ってC/C++でありますか?
0584デフォルトの名無しさん
2006/11/14(火) 07:36:26ない。作るのも無理。
0585デフォルトの名無しさん
2006/11/14(火) 08:55:56最後にfinから読み取った文字列が2回出力されてしまい困っています.
どこを直せばいいのでしょうか。
string str;
ifstream fin(file_name);
while(!fin.eof()) {
fin >> str;
cout << str << endl;
}
0586デフォルトの名無しさん
2006/11/14(火) 09:00:040587デフォルトの名無しさん
2006/11/14(火) 09:03:43ありがと!
0588デフォルトの名無しさん
2006/11/14(火) 15:41:00アドレスを表すポインタだと聞きました。では、以下のようなことが
可能なのでしょうか?
ていうか、できなくて頑張っているんですけど、いい方法ありませんか?
つか、根本的に分かっていないのでしょうか?
==実現したい夢==
・メモリの任意のアドレスを何らかの配列に渡してやる。
・すると、渡したアドレスを先頭にして配列のサイズだけのデータを
使って配列にデータが入っている。
例えば
void main(){
int *ptr;
int a[10];
&a = ptr;
}
とすると、ptrを先頭にして40バイト分のデータを4バイトずつa[0]〜a[9]に
割り当てて、且つint型で換算して値が入っている、なんて事です。for文で
10回まわしてもいいんですけど。
====
でも配列から配列への参照渡しなんて同じことですよね?
0589デフォルトの名無しさん
2006/11/14(火) 15:55:22ど初心者の漏れが10円玉の裏表を使って占ってみた
そしたら、出来ないと出たなり、漏れの占いは良くあたるから参考にしてね
0590デフォルトの名無しさん
2006/11/14(火) 16:20:14int main(void){
int a;
if(a=1){}
}
これってif(a=1)の評価どうなってるの?
0591デフォルトの名無しさん
2006/11/14(火) 16:25:430592デフォルトの名無しさん
2006/11/14(火) 16:28:41そうじゃないとb=a=1とかできなくなる
0593デフォルトの名無しさん
2006/11/14(火) 16:52:19式の中で配列オブジェクトは、原則としてその先頭要素へのポインタに変換されるというだけ。
0594デフォルトの名無しさん
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の試食版です。
0595デフォルトの名無しさん
2006/11/14(火) 16:59:35struct 経由したら? 以下C++ で記述。 多少遠回りすればCでも同じこと書ける(かな?)
struct TempArray {
int val[10];
};
int* ptr;
int a[10];
(TempArray&)a = *(TempArray *)ptr;
左辺に若干の怖さがあるけどね…
0596デフォルトの名無しさん
2006/11/14(火) 17:05:22strcat の第一引数は、連結後の大きさを持ちえるだけの大きさの器が必要
and 文字列リテラル( ソース上の ".\\" のこと)を書き換えることはやっちゃダメ(だったハズ)
0597デフォルトの名無しさん
2006/11/14(火) 17:06:22TempArrayをstruct TempArrayにするだけでC言語になる予感
0598デフォルトの名無しさん
2006/11/14(火) 17:08:19左辺のキャストは Cで出来たっけ?
0599デフォルトの名無しさん
2006/11/14(火) 17:09:53ありがとうございます。
直してみます。
0600デフォルトの名無しさん
2006/11/14(火) 17:13:30無理
0601デフォルトの名無しさん
2006/11/14(火) 17:17:46できないのか・・・
無知ですまんかった
0602デフォルトの名無しさん
2006/11/14(火) 17:19:33できましたorz
"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
したのがいけなかったんですね。
ありがとうございました。
0603デフォルトの名無しさん
2006/11/14(火) 17:25:28データーがA B C D・・・と大きな分類があり
その個々の例えばAについてa b c とデーターが分類されている場合で
ABCやabcの個数があらかじめ決まっていない場合(増えることがある)
どのようにすればいいのでしょうか?
0604デフォルトの名無しさん
2006/11/14(火) 17:30:06Cなら、mallocして確保した領域を
データを追加する度にreallocして拡大してみる。
C++なら、Vectorとか、その類のクラスを使ってみる。
0605デフォルトの名無しさん
2006/11/14(火) 17:32:26>"aaa"は4バイト分しかメモリが無いのにその後に連結しようと
それ以前に文字列リテラルを書き換えたら鼻から悪魔
0606デフォルトの名無しさん
2006/11/14(火) 17:43:36const int b = a + 1;
int array[a];
2・3行目がエラーになるんですがどうすればいいでしょう。
事情があってC++にはできません。
名前空間が汚染されるんでなるべくマクロは使いたくありません。
なお、gccです。
0607デフォルトの名無しさん
2006/11/14(火) 17:46:19配列の要素数の指定に変数は使えない
0608デフォルトの名無しさん
2006/11/14(火) 17:52:34そのような動作をやりたきゃ newを使うかvector使え
0609デフォルトの名無しさん
2006/11/14(火) 17:53:40じゃmallocを使え
0610デフォルトの名無しさん
2006/11/14(火) 17:54:12名前空間が汚染されるからマクロ嫌とか、ワガママじゃの
0611デフォルトの名無しさん
2006/11/14(火) 17:55:02>>593 �dクス。いろいろな見方を覚えていくことで上達を感じる。素人だけに余計に。
>>595 アイデアをアリガ�d。こういうアイデアは1年参考書を読み続けても思いつく
かどうかは分からないからありがたい。感謝します。
もらったキーワードを元にもう一度ググリ旅にでます。謝謝
0612611
2006/11/14(火) 17:55:420613デフォルトの名無しさん
2006/11/14(火) 18:19:060614デフォルトの名無しさん
2006/11/14(火) 18:46:36struct D3DXVECTOR2
{
FLOAT x, y;
BOOL operator == ( D3DXVECTOR2& ) const;
BOOL operator != ( D3DXVECTOR2& ) const;
}
この中身(ソース)はどういう風に記述されているのでしょうか?
FLOATをintに変えたクラスを作りたいのですが、==の多重定義をググっても
上記のようなソースのサンプルがなかなか見つからなくて…
ちなみにDirectX自体はlibのみの提供のようでソースは見つかりませんでした。
0615デフォルトの名無しさん
2006/11/14(火) 19:03:14BOOL operator == ( D3DXVECTOR2& rhs) const { return (x == rhs.x) && (y == rhs.y); }
BOOL operator != ( D3DXVECTOR2& rhs) const { return !(*this == rhs); }
でいいんじゃないの?
0616デフォルトの名無しさん
2006/11/14(火) 19:05:35つか、正確な内容はわからずとも、大まかにどういう処理がされてるかくらいわかるだろ、そのオペレータ見ればよ
0617デフォルトの名無しさん
2006/11/14(火) 19:06:30おい、なんだその!=はw
0618デフォルトの名無しさん
2006/11/14(火) 19:09:50615 じゃないけど、変?
ばらして { return (x != rhs.x) || (y != rhs.y); } と書くより間違いが少ないように思うけど。
0619デフォルトの名無しさん
2006/11/14(火) 19:16:16そんなことよりrhsがconst修飾されていないのがちょっと
0620デフォルトの名無しさん
2006/11/14(火) 19:19:470621デフォルトの名無しさん
2006/11/14(火) 20:02:12C++は初心者なので、後ろについているconst;の意味がよく分から
なかったのです。ググっても
inline friend bool operator==( const Complex & a, const Complex & b )
しか見つからなくて、余計混乱していました。
みなさん、有難うございましたm(__)m
0622デフォルトの名無しさん
2006/11/14(火) 20:59:50あれはそのメソッド内でメンバの値の変更など行わないという意味
読み取り専用
0623デフォルトの名無しさん
2006/11/14(火) 22:51:05うまいっ!
0624デフォルトの名無しさん
2006/11/15(水) 00:40:43>>595はめちゃくちゃなので参考にならないよ。
0625デフォルトの名無しさん
2006/11/15(水) 02:05:24宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です
次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
0626デフォルトの名無しさん
2006/11/15(水) 08:50:05class Hoge
{
public:
void * hoge(void *);
};
というクラスがあり、
int main()
{
pthread_t pth;
Hoge h;
pthread_create(&pth, NULL, (void *)h.hoge, NULL);
return 0;
}
みたいなことをやりたいのですが、どうもうまく行きません.
クラスのメンバ関数を別スレッドで実行するにはどうすればよいのでしょうか。
0627デフォルトの名無しさん
2006/11/15(水) 09:29:59使用する関数の仕様をしっかり把握すること。
無茶なキャストをしないこと。
エラーメッセージを読むこと。
0628デフォルトの名無しさん
2006/11/15(水) 11:48:23int 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であることは間違いないんですよね?
0629デフォルトの名無しさん
2006/11/15(水) 11:51:07それmallocする意味まったく無いが
0631デフォルトの名無しさん
2006/11/15(水) 14:16:450632デフォルトの名無しさん
2006/11/15(水) 14:47:34一般的にはダメ。ポインタのほうがintより大きなことがあるから。
intではなくintptr_t/uintptr_tを使う。
0633デフォルトの名無しさん
2006/11/15(水) 15:12:41(1)使える。
(2)多くの環境ではそうなるだろうだが、int*⇔int間のキャストは結果が処理系定義。
0634デフォルトの名無しさん
2006/11/15(水) 15:15:09でもそれらの型はoptionalってことになってるからな…
0635デフォルトの名無しさん
2006/11/15(水) 15:37:130636デフォルトの名無しさん
2006/11/15(水) 15:38:230637デフォルトの名無しさん
2006/11/15(水) 15:39:320638デフォルトの名無しさん
2006/11/15(水) 15:58:280639デフォルトの名無しさん
2006/11/15(水) 17:21:36debugでコンパイル(_DEBUGオプション付きコンパイル?)して
TRACEマクロでデバッグ文を出力しているのですが、
タスクマネージャのパフォーマンスを見ると
メモリの使用量がTRACEする度に増えてしまい困っています。
TRACEを使った後に、何かをしなければいけないのでしょうか?
ソースは以下です
void CTest_servDlg::OnButtonStart()
{
while(1){
TRACE("CTest_servDlg::OnButtonStart(): debug\n")
Sleep(1);
}
}
0640デフォルトの名無しさん
2006/11/15(水) 17:49:08<boost/cstdint.hpp>
0641デフォルトの名無しさん
2006/11/15(水) 17:50:41大量に吐くんなら、ファイルにでも書けばよろし。
0642639
2006/11/15(水) 21:18:02そういうもんなんですか・・・
何か対応考えるようにします。ありがとう
0643デフォルトの名無しさん
2006/11/15(水) 21:24:240644デフォルトの名無しさん
2006/11/15(水) 21:36:11スタックと局所変数の代わりに配列を使えばいいじゃん
0645デフォルトの名無しさん
2006/11/15(水) 22:00:32コンソールで入力できる最大文字数って取得できますか?
0646デフォルトの名無しさん
2006/11/15(水) 23:11:02#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; }
0647デフォルトの名無しさん
2006/11/15(水) 23:12:55先ずはコンソールアプリとは何かから説明してくれたまえ。
さもなくば、想定している環境を示してくれたまえ。
0648デフォルトの名無しさん
2006/11/16(木) 01:56:03#include<iostream.h>
int main(void)
{
cout<<"hello world";
return 0;
}
としてビルドしてもiostreamファイルが開けないとエラーがでます。
これはiostreamファイルがないのでしょうか?
visual C++ 2005 Express Editionを使っています。
アホな質問かもしれませんがお願いします。
0649デフォルトの名無しさん
2006/11/16(木) 01:59:310650デフォルトの名無しさん
2006/11/16(木) 01:59:43拡張子は.cppにしてる?
0651デフォルトの名無しさん
2006/11/16(木) 02:01:37エラーメッセージには "iostream.h" が開けないと書いてあるんじゃないか?
.h 付きの奴は古い C++ の仕様のものだから、 VC++ 2005 には無いんだろう。
0652デフォルトの名無しさん
2006/11/16(木) 02:07:58VS2005Pro版SP1だけど、ついに.h付きの古いヘッダー無くなったか。
0653デフォルトの名無しさん
2006/11/16(木) 02:08:10今のC++には<iostream.h>がない。
現代のC++で書くとこうなる。
#include<iostream>
int main()
{
std::cout << "hello world";
}
名前空間と言うものがC++の言語仕様に追加され、
標準ライブラリの中身は全て名前空間stdに入れられ、新しい名前のヘッダに収められている。
規格上古いC++のヘッダはなくなった。互換性のため残している処理系もあるが。
従来のCのヘッダはすったもんだの末に残されているものの、非推奨になっているはず。
新しいヘッダの名前は、
C++からのヘッダの場合単に.hをとっただけ(例外があるかもしれない)。
Cからあるヘッダの場合は.hをとって頭にcを付ける。<stdlib.h>→<cstdlib>
0654デフォルトの名無しさん
2006/11/16(木) 02:11:08VC++ 2005を使い出す前には何を使っていたんだろう?
0655デフォルトの名無しさん
2006/11/16(木) 02:11:26古い参考書で勉強したいならSTLportを入れるといいよ
0656648
2006/11/16(木) 02:47:23ありがとうございます。
無事ビルドできました。
Cの勉強をしている時は<stdio.h>でもビルドできていたので特に考えずに書いていました。
0657デフォルトの名無しさん
2006/11/16(木) 09:56:241つ参照戻し(っていうのが一般的なのかな?)について質問させてください。
今、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値は返せませんというコンパイルエラーになってしまいます。。。
もろもろの関係で例外は使えないのですが、このようの場合はやはりポインタ型で
返すしかないのでしょうか?
0658657
2006/11/16(木) 10:11:46× T& ArrayList::get(unsigned int index) {
○ T& ArrayList<T>::get(unsigned int index) {
の間違いです。
0659デフォルトの名無しさん
2006/11/16(木) 10:15:21その通り
参照を返したのならば、std::out_of_rangeとかを投げる
0660657
2006/11/16(木) 10:18:37おお。早速のご返答ありがとうございます。
std::out_of_rangeですか。了解しました!
#BR○Wで使えるのかな・・・・・?
0661デフォルトの名無しさん
2006/11/16(木) 10:25:50分かっててやってるんだろうけど、一応指摘しておくと、
ArrayList相当のコレクションはすでに標準でstd::vector
として存在している。
0662657
2006/11/16(木) 10:29:24std::out_of_rangeって例外なのですね。。。。
例外は使えないのです。
>661
BRE○で、std::vector(というかSTL)って使えるのでしょうか?
そもそも、Cの標準関数(mallocとかstrcmpとか)が使えないので、STLも使えないんじゃ
ないのかなぁと勝手に思ってたりします。
0663デフォルトの名無しさん
2006/11/16(木) 10:50:51> BREW では、ANSI 標準ライブラリや、STL、Boost などの C++ ライブラリが使えません。ARM コンパイラの組込み関数も使えません。
お疲れ様です。配列の最後に番兵置くかポインタしかないんじゃないかな
0664デフォルトの名無しさん
2006/11/16(木) 10:53:23センティネルのこと?
0665デフォルトの名無しさん
2006/11/16(木) 10:55:360667デフォルトの名無しさん
2006/11/16(木) 11:20:25void *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]に入れたいのですが、どうしたらよいのでしょうか?
なんかヒントだけでも結構ですので下さい。お願いします。
0668デフォルトの名無しさん
2006/11/16(木) 11:32:42まずは自分で書いてみろ。
0669667
2006/11/16(木) 13:36:48実はハナから無理なことをしていて、例えばfloat buffer[256]って宣言し
といてから値をbufferに入れてやるべきなのか、このまま進めて行って
いいのかすら分からなくなってしまって質問しているところなのです。
>>667は初心者が2時間かけて伝わるようにいろいろ書き直した上に書き
上げた質問なので、そのあたりを斟酌していただけませんでしょうか。
0670デフォルトの名無しさん
2006/11/16(木) 13:47:1932ビット実数なんて、結構検算だけでも難しいと思うのだが。
>>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); // 確認はこんな感じで
0671デフォルトの名無しさん
2006/11/16(木) 13:55:09どっちでもできる。castとかでなんとでもなっちゃうのがCのいい所でもあり悪い所でもある。
実行環境があるならまずやってみろって。
で、期待通りに動かなくてわからない時に質問してくれ。ソースを晒して。
0672デフォルトの名無しさん
2006/11/16(木) 14:07:34_beginthreadにクラスのメンバ関数を渡すとフリーズしてしまうんですが、何故ででしょうか。
0673デフォルトの名無しさん
2006/11/16(木) 14:12:070674デフォルトの名無しさん
2006/11/16(木) 14:16:21デバッガで確認するとスレッドは実行されてるみたいなんですが、応答無しになってしまいます。
普通の関数を渡すとうまくいくんですが・・・。
0675デフォルトの名無しさん
2006/11/16(木) 14:20:160676675
2006/11/16(木) 14:24:27>>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
0677667
2006/11/16(木) 14:53:54freadを使えばよかったのか。いろいろ有難う。
それでできるとわかれば早速リトライです。
ほんとに初心者ですんません。
0678デフォルトの名無しさん
2006/11/16(木) 16:15:130679デフォルトの名無しさん
2006/11/16(木) 16:27:270680667
2006/11/16(木) 16:29:00対してアクセスするのに使えるとはよもや思わんかったと言うことです。
0681デフォルトの名無しさん
2006/11/16(木) 16:41:470682デフォルトの名無しさん
2006/11/16(木) 16:44:30ちょっと酷くない?
0683デフォルトの名無しさん
2006/11/16(木) 17:09:01http://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
コードの追加後のデバックでどうしてもエラーを起こしてしまい、
出力されるエラーメッセージを読んでも追加する場所が間違ってるのか
追加するコードが間違ってるのか、原因を読み取ることが出来ないために困っています。
どういった原因かわかるでしょうか?
0684デフォルトの名無しさん
2006/11/16(木) 17:26:30可変個引数のもの以外は全部最後部に統一されてる。
要するにprintf系が例外なだけ。
0685デフォルトの名無しさん
2006/11/16(木) 17:39:37fseek,f(get|set)pos
0686デフォルトの名無しさん
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);
}
0687デフォルトの名無しさん
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に対する十分な領域、ってどれくらいですか?)
0688デフォルトの名無しさん
2006/11/16(木) 18:42:15その例ならば、scanf("%255s", buff);とすればバッファオーバランは防げる。
#残りを読み捨てるなどの処置も必要ではあるが。
0689デフォルトの名無しさん
2006/11/16(木) 18:57:360690デフォルトの名無しさん
2006/11/16(木) 19:07:14int* pHoge;
int& rHoge = *pHoge;
だがキャストする必要性を感じない
0691デフォルトの名無しさん
2006/11/16(木) 19:13:16void *data;
同じモジュール内でこんな宣言をした場合ってどうなるの?
floatのdata[1024]とvoidのdataが別々に存在できるの?
0692デフォルトの名無しさん
2006/11/16(木) 19:16:54aaa.c内で使用している関数をbbb.cに記述している場合は
ファイルの中身やコンパイル文のオプションはどうしたらよいのでしょうか?
0693デフォルトの名無しさん
2006/11/16(木) 19:22:14自分でやってデバッグしてみりゃいいだろ
0694デフォルトの名無しさん
2006/11/16(木) 20:03:480695デフォルトの名無しさん
2006/11/16(木) 20:21:39(非静的な)メンバ関数へのポインタは、通常の関数へのポインタとは別物。
でもテンプレートを使えばどうにでもできる。
#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));
}
0696デフォルトの名無しさん
2006/11/16(木) 20:24:15BeginThread() 抜けたら fn が消えてあぼーん。
0697692
2006/11/16(木) 20:38:30bbb.cをbbb.hにしてinclude<bbb.h>とすると読み込まれるということでしょうか?
.cファイルのまま使う方法はないのでしょうか?
0698デフォルトの名無しさん
2006/11/16(木) 20:40:570699デフォルトの名無しさん
2006/11/16(木) 20:49:220701デフォルトの名無しさん
2006/11/16(木) 20:59:35struct 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を代入すると言う意味で良いんですよね。
0702デフォルトの名無しさん
2006/11/16(木) 21:03:02ソース貼るん前にコンパイルぐらいしとけ。
0703デフォルトの名無しさん
2006/11/16(木) 21:03:06% cat aaa.c bbb.c > ccc.c
% cc ccc.c
0704デフォルトの名無しさん
2006/11/16(木) 21:08:11どこにも、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にしといた方が無難
0705デフォルトの名無しさん
2006/11/16(木) 21:09:48> あと蛇足だが、最後のreturn 0はreturn NULLにしといた方が無難
んー。なんでかなー?
0706デフォルトの名無しさん
2006/11/16(木) 21:11:160707デフォルトの名無しさん
2006/11/16(木) 21:13:40NULL なんて使わなくていい。わざわざヘッダのインクルードを確認するのも面倒。
オマエみたいに何かを誤解する奴も増える。
0708デフォルトの名無しさん
2006/11/16(木) 22:30:41繰り返し回数の多いループ内では
メンバ変数を呼び出すと処理時間が
遅くなるので、ループの外でいったん
ローカル変数に値を入れるようにして、
ループ内ではローカル変数だけを
使うようにしたほうが、処理時間は
短くなるという話を聞いたんですが
本当でしょうか?
0709デフォルトの名無しさん
2006/11/16(木) 22:31:090710デフォルトの名無しさん
2006/11/16(木) 22:32:160711デフォルトの名無しさん
2006/11/16(木) 22:33:56ようするに*thisから間接アクセスするからって話だろ。
CPUによっても違うし、コンパイラによっても違う。
0712デフォルトの名無しさん
2006/11/16(木) 22:34:19メンバ変数だと、それが指している先のaliasが存在しないことを
証明するのが非常に困難なので大多数のコンパイラでは遅くなるでしょう。
0713デフォルトの名無しさん
2006/11/16(木) 22:38:09ありがとうございました。
1回走らせると時間かかるので
試す前に知ってる人がいたら・・・
と思って質問しました。
面倒がらずにきちんと実測する
ことにします。
0714 ◆mI7lo1ZRb6
2006/11/16(木) 22:42:15宜しければ一度で良いので拝見して頂きたいです
当企画の成立には貴方の力が必要です
次世代コミュニティ製作 C++,mod_perl,P2Pが使えるコーダ、グラフィッカ募集中
http://pc8.2ch.net/test/read.cgi/tech/1163349367/
0715デフォルトの名無しさん
2006/11/16(木) 23:02:070716デフォルトの名無しさん
2006/11/16(木) 23:10:020717デフォルトの名無しさん
2006/11/16(木) 23:13:23>P2Pが使えるコーダ
>コーダ
小学生からやり直し
0718デフォルトの名無しさん
2006/11/16(木) 23:20:110719デフォルトの名無しさん
2006/11/16(木) 23:34:260720デフォルトの名無しさん
2006/11/16(木) 23:46:33コーダでそれが出てくるとは。懐かしい名前を思い出したよ。
大学時代の友人の部屋には、その手の雑誌がいっぱい転がってたので、いつの間にか覚えてしまってたw
0721デフォルトの名無しさん
2006/11/16(木) 23:49:16関数の引数に想定外の値が入力さてたとき、
・assert()でチェックするだけでいい。
・assert()でチェック後、正常な値に丸め込んだ方がいい。
と主張して対立する両者がプロジェクトにいるのですが、
どちらが最善なのでしょうか?
私自身は前者が正しいと思っていて、
・丸め込むコードは本来ならば必要がないもの。
・コードが増えればバグが入り込む可能性も増える。
と考えているのですがこの考え方は正しいのでしょうか?
このようなバグに対するコーディングについて
なにか参考になる文献などありますでしょうか?
よろしくお願いします。
0722デフォルトの名無しさん
2006/11/16(木) 23:53:02もう隠居したかと思ったけどこの後のkanonで名雪やってるのな
0723デフォルトの名無しさん
2006/11/16(木) 23:58:130724デフォルトの名無しさん
2006/11/17(金) 00:00:21俺はプロのプログラマじゃないけど、前者が基本思想じゃないかと思う。
だいたい、assertは異常があったときはプログラムを終了させるだろう?
0725デフォルトの名無しさん
2006/11/17(金) 00:02:02後者は中途半端だな。実際のコードでチェックして異常があったなら、
処理を続行するべきじゃないだろう。仕様に明記されていなければね。
assert() で済ませていいかどうかは、その入力がプログラム内で
制御可能なものかどうかによるだろう。たとえばユーザー入力に対する
チェックなら assert() では不適切。
0726デフォルトの名無しさん
2006/11/17(金) 00:11:58その関数のコール元として誰を想定しているかによる。
ユーザから呼ばれる関数なら、ユーザは間違った使い方をする可能性があるから、
エラーを返すとか、丸めるとか。仕様に明記すればいい。
いきなりassertに引っかかってシステムがダウンしたら、ユーザとしては嬉しくない。
システム内部でしか呼ばれない関数なら、正しい引数が渡されなければおかしい。
assert()を使用して、不当な値が渡ってきたときに検知できれば問題が早く発覚する。
0727721
2006/11/17(金) 00:14:26回答ありがとうございます。
assertはデバッグに使用していてリリースの時には無効になっています。
説明が不足していて申し訳ありません。
関数はプロジェクトの外部から呼ばれるようなものではなく
内部だけで使用するものです。
0728デフォルトの名無しさん
2006/11/17(金) 00:17:20これ以上は何も言うことはない。判断基準は理解しただろうから、あとは話し合って決めろ。
0729デフォルトの名無しさん
2006/11/17(金) 00:26:16デバッグモードでユーザ向けににリリースするのはありえない。
よってassertで引っかかってユーザが云々もない。
0730デフォルトの名無しさん
2006/11/17(金) 00:34:53回答ありがとうございます。
正しい方向が見えてきました。
0731デフォルトの名無しさん
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です。
小汚いソースで申し訳ないですが、どなたかお願いします。
0732デフォルトの名無しさん
2006/11/17(金) 02:31:43入力バッファにscanf("%d", &sw)で入力したデータのうち改行文字'\n'が
残り、それが次のgets()で読み取られてしまうから。
この問題を解決するには、scanf()系で統一するか、gets()で文字列に
読み込んでからatoi()などで変換するかのどちらか一方にすればよい。
0733731
2006/11/17(金) 02:40:54素早くわかりやすい回答、ありがとうございます。
このまま頭抱えたまま、朝まで寝られないかと思ってました。
解決策まで頂き、本当にありがとうございました。
0734デフォルトの名無しさん
2006/11/17(金) 13:32:078bitをビットフィールドで4bitにすると4bit無駄になるからやだ。
0735デフォルトの名無しさん
2006/11/17(金) 13:35:07getcher()-'0' は、getcharで読み込んだ文字(数字)を数値に変換する処理。
文字'0'のもつ値と数値0は異なる。
たとえば文字'5'が入力されたなら、'5'-'0'=5で数値の5を得ることができる。
ただし、これは文字'0'〜'9'に連続した値が割り当てられている文字コードを
使用した場合にしか使えない。まあ普通の環境なら問題ないはず。
0736デフォルトの名無しさん
2006/11/17(金) 13:37:45本当でしょうか?教えてくださいよろしくお願いします。
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言語を始めたばかりの初心者なので右も左も分かりませんがよろしくお願いします。
0737731
2006/11/17(金) 13:47:44getche()のchar型からの変換処理の回答、ありがとうございました。
初心者でも大変わかりやすかったです。
scanf()ともども、色々試して覚えます。
732さん、735さん、本当にありがとうございました。
0738デフォルトの名無しさん
2006/11/17(金) 13:53:50わがまま言わんの
0739デフォルトの名無しさん
2006/11/17(金) 13:56:10cgets()、cscanf()、cprintf()に統一しろよ。
0740731
2006/11/17(金) 14:01:57同じく初心者なのですが、知っていることだけを。
scanf("%[yn] は、スキャン集合と呼ばれるもので、この場合はyとn以外のものを取らないんだったと思います。
"スキャン集合"で調べると、詳しい使い方がわかると思います。
もう一つの質問については、初心者のため、わかりません。
0741736
2006/11/17(金) 14:05:00ありがとうございます。
助かりました。
0742731
2006/11/17(金) 14:05:58まだ知らない関数です。調べて使ってみます。
ありがとうございます。
0743735
2006/11/17(金) 14:07:16getche()ってgetchar()のtypoかと思ってたら、そういう関数があったのね。
cgets()なども初めて知ったよ。勉強になりました。
0744デフォルトの名無しさん
2006/11/17(金) 14:12:08>すいません、実用的なC言語のプログラムの場合あまりscanf関数は使われないと聞いたのですが
>本当でしょうか?教えてくださいよろしくお願いします。
どこで言われているのか分からないから想像で答えると、
・そこで言っている実用的なプログラムというのが今時のGUIのものを指しているので、
CUIの入力はあまり使われない。
・ユーザはこちらが望んだ入力をするとは限らない。(誤って、または意図的に。)
数値を入力させようと%dを使うと、数字以外が入力されたときにまずい。
ユーザ入力はfgetsで1行分すべて受け取って、sscanfなどで自分で解析したほうが安全。
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関数などはバッファ長のチェックを
行わないで標準入力をバッファに書き込むので、この関数を使う全てのプログラムには、
バッファオーバーランによる不正動作の危険性がある。
0746デフォルトの名無しさん
2006/11/17(金) 17:34:53そこの説明もなんか香ばしいな。
> fgets(buf, 200, stdin);
これで良くて
> scanf("%.199s", buf);
これで駄目?馬鹿じゃねーの。
0747デフォルトの名無しさん
2006/11/17(金) 20:19:20C/C++では'0'...'9'の文字コードは連続しているという前提を置いて構わない。
0748デフォルトの名無しさん
2006/11/17(金) 20:41:00もし仮に'0'...'9'に不連続な値を割り当てた俺様文字コードを考案したら、
それに対応したCコンパイラを実装しようとしても厳密に規格に合致させることができないってこと?
(もちろん、そんなものを作ろうとは思わないけど。)
0749デフォルトの名無しさん
2006/11/17(金) 20:43:140750デフォルトの名無しさん
2006/11/17(金) 20:55:40OnTimer関数を利用する際に、
1度目のカウントでは何も呼び出さず、
2回目のカウントで関数を呼び出すようにしたいのですが
上手く制御できません。
if(nIDEvent ==1)
{
int i=0;
if(i=0)
{
i++;
}
if(i=1){
KillTimer(1);
}
こんな感じにソースを書いてみたのですが上手くいかないのです(´・ω・`)
どうすればよいでしょうか…?
0751デフォルトの名無しさん
2006/11/17(金) 21:01:33そういうこと。'0'から'9'までは連続していなければならないことを意味する規定が存在する。
もちろん逆順も駄目。
>>750
そのiはそのブロックに入る度に作成され0で初期化される。
staticを付けて、静的変数にしろ。
0752デフォルトの名無しさん
2006/11/17(金) 21:03:310753デフォルトの名無しさん
2006/11/17(金) 21:04:36その内容ではカウント用変数「i」が毎度確保しなおされて、永遠に1になることは無いので関数コールに行かない
カウント用変数をメンバ変数にするか、もしくはstatic宣言してみれ
0754デフォルトの名無しさん
2006/11/17(金) 21:05:090755デフォルトの名無しさん
2006/11/17(金) 21:07:10(´・ω・)!
有難う御座います…;
もう少し勉強してから取り組んでみます。
0756デフォルトの名無しさん
2006/11/19(日) 00:55:18漢字の単語だけを文字列として、文字配列のポインタ配列を作る、なんてことは可能でしょうか?
例えば、
「本日は晴天なり」だったら
「本日」という文字列と
「晴天」という文字列をつくるみたいな。
0757デフォルトの名無しさん
2006/11/19(日) 00:57:06文字コードがはっきりしてればできる。
わりと面倒な問題だが。
0758デフォルトの名無しさん
2006/11/19(日) 11:46:340759デフォルトの名無しさん
2006/11/19(日) 11:47:550760デフォルトの名無しさん
2006/11/19(日) 11:52:48GJ!
0761デフォルトの名無しさん
2006/11/19(日) 11:53:250762デフォルトの名無しさん
2006/11/19(日) 12:07:360763デフォルトの名無しさん
2006/11/19(日) 12:17:52知ったかぶりじゃないところを見せてくれ、君
0764デフォルトの名無しさん
2006/11/19(日) 12:27:210765デフォルトの名無しさん
2006/11/19(日) 12:43:35いいや、>>759でいい。
>>757の内容をに知ったかぶと言うことは、>>759は何か知ってるからこそそういうふうに言うんだろ
>>759、>>756または>>758にアドバイスしてやれよ
>>759は知ってるけど教えない君かな
0766デフォルトの名無しさん
2006/11/19(日) 12:56:34スレタイに環境依存OKと書いてある時点で何かが間違っている気がするが。
0767デフォルトの名無しさん
2006/11/19(日) 12:58:020768デフォルトの名無しさん
2006/11/19(日) 12:58:190769デフォルトの名無しさん
2006/11/19(日) 13:02:240770デフォルトの名無しさん
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;
}
0771770
2006/11/19(日) 13:15:34int 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") );
}
0772デフォルトの名無しさん
2006/11/19(日) 13:45:30マンドクセーからちゃんと読んでないが、isspace()のようなctype.hの
マクロ使う時は、何も考えずにsigned charを渡しちゃだめ。
引数が-1(EOF)〜255の範囲にあることが前提になってて、通常は
引数をそのまま配列indexとして使って表参照で判定してるから。
非ASCII文字だと、signed char→intに符号拡張した時に
負値になるような値が入ってるんで、
↑の範囲に収まらずに動作が不定になる。
isspace()に渡す前に、unsigned charにキャストしる。
0773デフォルトの名無しさん
2006/11/19(日) 13:50:430774デフォルトの名無しさん
2006/11/19(日) 13:55:11んなこたぁない
0775770
2006/11/19(日) 13:57:59while( i <= max_len && isspace( str[i] ) )
を
while( i <= max_len && isspace( (unsigned char)str[i] ) )
に変えたらうまく動きました
どうもありがとうございます
0777デフォルトの名無しさん
2006/11/19(日) 14:14:06http://mixi.jp/view_bbs.pl?id=12516056&comment_count=150
0778デフォルトの名無しさん
2006/11/19(日) 14:33:15工エエェェ(´ロ`ノ)ノェェエエ工
#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;
}
0779デフォルトの名無しさん
2006/11/19(日) 14:41:54ぶっちゃけASCIIのスペースと被るようなマルチバイトエンコード系を知らんのだが、
あったっけ?
バックスラッシュ等がShiftJISの2byte目と被るのは有名だが。
0780デフォルトの名無しさん
2006/11/19(日) 14:42:58static修飾子について質問させてください。
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; // これもいけないらしい
}
0781デフォルトの名無しさん
2006/11/19(日) 14:45:200783デフォルトの名無しさん
2006/11/19(日) 14:58:110784デフォルトの名無しさん
2006/11/19(日) 14:59:41Java みたいにはできません。
boost::serialization を使ってみる?
0785デフォルトの名無しさん
2006/11/19(日) 14:59:45環境変数の設定が出来ません、前にジャバで変数を変えたときがあるんですがそれが原因ですか?
原因だとしたらどーやれば元に戻せますか??
教えてください。。。
0786デフォルトの名無しさん
2006/11/19(日) 15:03:000787デフォルトの名無しさん
2006/11/19(日) 15:03:59m_staticが、宣言しかされていない。実体を定義する必要がある。
どこかのソースファイル(ヘッダ以外)にCWindow* CWindow::m_static;とでも書いとけ。
0788デフォルトの名無しさん
2006/11/19(日) 15:06:05OS借り物なのでマニュアルがありませんです。
だめですか???
0789デフォルトの名無しさん
2006/11/19(日) 15:06:44以下略
0791デフォルトの名無しさん
2006/11/19(日) 15:55:010792デフォルトの名無しさん
2006/11/19(日) 16:09:580793デフォルトの名無しさん
2006/11/19(日) 17:22:070794デフォルトの名無しさん
2006/11/19(日) 17:42:18.C
.cc
.c++
.cpp
.oc
0795デフォルトの名無しさん
2006/11/19(日) 17:47:19何でもいいよ
0796デフォルトの名無しさん
2006/11/19(日) 17:50:24cpp意外使うな
0797デフォルトの名無しさん
2006/11/19(日) 17:54:29つ .cxx なんてどう
0798デフォルトの名無しさん
2006/11/19(日) 18:05:10標準で定められた拡張子は無い。
.C は Windows で .c と区別できないからやめたほうがいい。
.oc は ObjectiveC じゃないか?
0799デフォルトの名無しさん
2006/11/19(日) 18:12:560800デフォルトの名無しさん
2006/11/19(日) 18:37:550801デフォルトの名無しさん
2006/11/19(日) 18:39:420802デフォルトの名無しさん
2006/11/19(日) 19:42:350803デフォルトの名無しさん
2006/11/19(日) 19:43:09コンパイラはVC2005です。
0804デフォルトの名無しさん
2006/11/19(日) 19:47:13いずれにせよ、そうなるかどうかは、関数の評価しだい。
インライン展開しないほうがいい場合もあるし。
0805デフォルトの名無しさん
2006/11/19(日) 20:32:352005 Standardには2003.net相当のものが含まれていると考えてもいいでしょうか?
やりたいことは、
1.ネットワーク上からデータをダウンロード
2.上記ダウンロードデータよりデータベースを作成
3.上記データベースより数値計算をおこなう
というものです。
.netバージョンだとネットワークとのインターフェースのライブラリが
あると聞いたので2005には標準でついているのかどうか知りたいです。
よろしくお願いします。
(スレ違いなら最適なスレに誘導していただけると幸いです。)
0806デフォルトの名無しさん
2006/11/19(日) 20:41:130807805
2006/11/19(日) 20:55:24|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
0808805
2006/11/19(日) 21:01:45スレ検索してそちらで聞きます。
0809809
2006/11/20(月) 01:43:42ID.cppをコンパイルすると、
BirthDay.h 1: 'BirthDay' の宣言が複数見つかった
BirthDay.h 1: 一つ前の 'BirthDay' の定義位置
とBirthDayクラスのヘッダでエラーがでます。
どうなっているのでしょうか。
ttp://www.geocities.jp/mwada11/index.htm
0810デフォルトの名無しさん
2006/11/20(月) 01:49:42取り敢えずIDクラスが二回宣言されてるから一回にしろ
0811デフォルトの名無しさん
2006/11/20(月) 01:52:21いついかなるときも、ヘッダファイルにはインクルードガードを書くクセをつけましょう。
0812デフォルトの名無しさん
2006/11/20(月) 02:38:37マジで知らないらしい
0813デフォルトの名無しさん
2006/11/20(月) 12:07:23俺は>>809ではないが、助かった。
ありがとう。
0814デフォルトの名無しさん
2006/11/20(月) 12:27:050815デフォルトの名無しさん
2006/11/20(月) 12:58:36本当にそうだよね、気が利かないねー
0816デフォルトの名無しさん
2006/11/20(月) 13:09:170817デフォルトの名無しさん
2006/11/20(月) 13:32:030818デフォルトの名無しさん
2006/11/20(月) 15:47:19自作のライブラリ mylib.lib の中に main 関数があり、そこからユーザー定義の mymain を呼ぶ形になっています。
フレームワーク的に
#include "mylib.h"
int mymain(void) { return 0 ; }
と書いただけのソースをコンパイルし、リンクしようとすると「エントリー ポイントを定義しなければなりません。」と怒られます。
mylib の中にある関数やオブジェクトを参照すればリンクも通るのですが、
プログラムによって使うかどうか分からない関数をフレームワークソースで呼んだりするのもアレな気がします。
この場合どの様にするのがスマートでしょうか?
0819デフォルトの名無しさん
2006/11/20(月) 16:26:160820デフォルトの名無しさん
2006/11/20(月) 16:46:07main()をライブラリの中に入れることが根本的に間違い。
> この場合どの様にするのがスマートでしょうか?
・main()が入っているオブジェクトをライブラリから抜き出して「リン
クするときはxxx.objもリンクしてください」とする。
・main()をmylib_main()に改名して「あなたのコードのmain()で
mylib_main()を呼んでね」とする。
0821デフォルトの名無しさん
2006/11/20(月) 17:46:58VC++ベッタリの方法だが。
#pragma comment()
でどうにかならんか。ヘルプ見てみ。
#pragma comment(linker, /include: シンボル)
で、シンボルを強制的に取り込むことができるはず。
0822デフォルトの名無しさん
2006/11/20(月) 20:48:28_itoa_s関数の第四引数にvalue の基数 (2 〜 36 の範囲内で指定する必要があります)。
とあるのですが、意味がよくわかりませんでした。
ここには実際にどのようなデータを入力したらよいのでしょうか?
0823デフォルトの名無しさん
2006/11/20(月) 20:52:040825初心者
2006/11/20(月) 22:04:59注:私の質問に対して煽りで返す不届き者がいるようですが、
そのような方は発言するだけ無駄ですのでお黙り下さい。
ちなみに私の友達には2ch管理者さえも畏れるハッカーがおり、
あまりにも礼を欠く発言に対してはそれ相応の「処置」をとらせていただくことを
ご承知下さい。なお、質問に対して有意義な答えを下さった方には
感謝します。
0826デフォルトの名無しさん
2006/11/20(月) 22:13:04きみの友達の方が詳しいからそっちに聞いた方が良いと思うよ。
0828デフォルトの名無しさん
2006/11/20(月) 22:16:23死ね
0829初心者
2006/11/20(月) 22:18:01皆さんにはそれなりの制裁を下すのでそのつもりでいてください。
0830デフォルトの名無しさん
2006/11/20(月) 22:21:220831デフォルトの名無しさん
2006/11/20(月) 22:22:43祖国に帰れ。
0832デフォルトの名無しさん
2006/11/20(月) 22:24:28>自力でやらなければ意味がない
いや、だからこそ、その友達に色々聞いて自分でプログラム組めばいいんじゃない?
0833デフォルトの名無しさん
2006/11/20(月) 22:24:420834デフォルトの名無しさん
2006/11/20(月) 22:24:45>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
>ハッキングを作る
0835デフォルトの名無しさん
2006/11/20(月) 22:25:50どうすれば生き返るんでしょうか。
0836デフォルトの名無しさん
2006/11/20(月) 22:26:220837デフォルトの名無しさん
2006/11/20(月) 22:26:230838デフォルトの名無しさん
2006/11/20(月) 22:26:43コンパイラの種類がわからないと答えられません
0840デフォルトの名無しさん
2006/11/20(月) 22:29:16オマイの愛情次第だ
0842デフォルトの名無しさん
2006/11/20(月) 22:34:25>>841
(・∀・)ジサクジエン
0843デフォルトの名無しさん
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を見ても上記の様に書かれています。
メソッドの実装方法が間違っているのでしょうか?
ご教授お願いします。
0844デフォルトの名無しさん
2006/11/20(月) 23:46:260846デフォルトの名無しさん
2006/11/20(月) 23:51:52ハッキングは行為であるから、それに対して作るという表現は適切でないと思う。
0847デフォルトの名無しさん
2006/11/20(月) 23:54:44ソースもエラーメッセージもコピペしろ。分からないのに勝手に省くな。
0848デフォルトの名無しさん
2006/11/21(火) 00:00:28スルーしろよ…
0849843[1]
2006/11/21(火) 00:01:29わかりました。全部書くとこうなります。
行数オーバーしたので2回にわかれます。すいません。
//main.cpp
#include <iostream>
#include "test.cpp"
using namespace std;
int main()
{
testc test(1,1);
cout << "HELLO" << test.hoge() << endl;
return 0;
}
0850デフォルトの名無しさん
2006/11/21(火) 00:02:11class 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
0851デフォルトの名無しさん
2006/11/21(火) 00:03:050852843
2006/11/21(火) 00:06:18それが・・・
#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
と、エラーが出ます。
そういうものかと思っていたのですが、ひょっとしてウチの環境がまちがっとるのか・・・
0853デフォルトの名無しさん
2006/11/21(火) 00:08:530854デフォルトの名無しさん
2006/11/21(火) 00:10:20#include "test.cpp"
↓
#include "test.h"
0855デフォルトの名無しさん
2006/11/21(火) 00:10:25× #include "test.cpp"
○ #include "test.h"
なんのためにヘッダファイル作ったのか、わかってなさそうだな。
で、コピペしたのにやっぱり testc.h があんのか?
そっちはエラーにならないの?
0856844
2006/11/21(火) 00:18:48エラーが消えました。ありがとうございます。
>>855
えっと、正直に申し上げますと
本当はtestc.hというファイル名で保存してあるんです。
で、最初に投稿したときにファイル名を間違えて書いてしまったので、
ややこしくなってはいけないと思い書き込み文はtest.hに修正しようとしたら見事に失敗しますた。。。
最初に間違えたときにそう訂正すべきでした。
浅慮で申し訳ないです。
ヘッダファイルの必要性から勉強し直してきますorz
0857デフォルトの名無しさん
2006/11/21(火) 01:14:34double a = 1.234;
_ftprintf(fp, _T("%lf"), a);
上のようにして、double 型をテキストファイルに書き出して
いるのですが、書き込んだファイルを読み込んだとき、
値が完全に復元されないのですが、復元させるような方法が
あるのでしょうか?
数値自体は double の型の有効数字のみです。
開発環境は、WinXP, VS2005 です。
よろしくお願いします。
0858デフォルトの名無しさん
2006/11/21(火) 01:21:49それじゃ小数点以下6桁までしか出ない。
%.20gにしておけば、大抵は誤差がなくなるはず。
0859デフォルトの名無しさん
2006/11/21(火) 01:44:50あと、double型は内部的に2進数で小数を表現しているから、
10進表記で切りのいい数値だと思っていても実際には切り捨てられていることもあるよ。
0860デフォルトの名無しさん
2006/11/21(火) 07:12:25値を完全に復元したいのなら、fwrite等でバイナリ保存するべき
0861デフォルトの名無しさん
2006/11/21(火) 07:46:04マルチバイト文字を使用にチェック済み
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]] ); と表示したいのですが
画面表示をしようとしたのですが文字化けしてしまいます。
マルチバイト文字を表示させるにはどう書けばいいのでしょうか。
0862デフォルトの名無しさん
2006/11/21(火) 07:57:140863デフォルトの名無しさん
2006/11/21(火) 08:00:410864デフォルトの名無しさん
2006/11/21(火) 08:00:42Shift_JISの漢字は2byte分消費するのでchar一個に収まらん。
変わりにwchar_tを使って
putwchar(L"□■"[map[i]]);
とするか
for (j = 0; j < 2; ++i)
putchar("□■"[2*map[i]+j]);
とでもするんだな。
0865デフォルトの名無しさん
2006/11/21(火) 08:22:27putwchar(L"□■"[map[i]]);
こっちでは表示されませんでしたが
for( i=0; i<4; ++i ) {
for ( j=0; j<2; ++j )
putchar("□■"[2*map[i]+j]);
}
こっちでは表示されました。
ありがとうございました
0866デフォルトの名無しさん
2006/11/21(火) 08:26:19putwchar() 使うんなら、
あらかじめ setlocale() 呼んどく必要がある。
0867デフォルトの名無しさん
2006/11/21(火) 08:43:08setlocale (LC_ALL, "Japanese"); を最初に追加し
もう一度やってみましたが、やはり表示されないようです。
0868デフォルトの名無しさん
2006/11/21(火) 08:47:200869デフォルトの名無しさん
2006/11/21(火) 09:29:14訳が分からんな。俺の環境(VC7.1だが)では以下が動作するが。
""を"japanese"に変えても同じ。
---------------------------
#include <stdio.h>
#include <locale.h>
main()
{
setlocale(LC_ALL, "");
putwchar(L'あ');
}
---------------------------
>>868
putwcharはUnicode文字列をそのままWriteする訳ではないよ。
0870デフォルトの名無しさん
2006/11/21(火) 09:39:31>>869のでも表示されません。
0871デフォルトの名無しさん
2006/11/21(火) 11:03:22後者はこれでもいい。
printf("%.2s", "□■"[2 * map[i]]);
0872デフォルトの名無しさん
2006/11/21(火) 11:56:54VC++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
0873デフォルトの名無しさん
2006/11/21(火) 12:09:06int (* const Printf4)(LPCTSTR,...) = wprintf;
0874デフォルトの名無しさん
2006/11/21(火) 12:14:52どーしてもゴリッとしたのしか・・・
0875デフォルトの名無しさん
2006/11/21(火) 12:33:29ありがとうございます。助かりました
0876デフォルトの名無しさん
2006/11/21(火) 14:13:452バイト文字はマルチバイト文字と言えるが
マルチバイト文字即ち2バイト文字ではない
マルチバイト文字=1文字2バイト以上の文字
0877デフォルトの名無しさん
2006/11/21(火) 14:17:290878デフォルトの名無しさん
2006/11/21(火) 17:02:280879デフォルトの名無しさん
2006/11/21(火) 17:04:190880デフォルトの名無しさん
2006/11/21(火) 17:04:350881デフォルトの名無しさん
2006/11/21(火) 17:41:38ワイド文字出力がだめなのはVisual C++ 2005のバグ。
ttp://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
0882デフォルトの名無しさん
2006/11/21(火) 17:51:430883デフォルトの名無しさん
2006/11/21(火) 17:55:28Windows NTはUTF-16がネイティブ。
0884デフォルトの名無しさん
2006/11/21(火) 18:38:520886デフォルトの名無しさん
2006/11/21(火) 22:54:10pythonとかrubyとかをプログラムの中から呼び出し
スクリプトが吐く標準出力などを自分で作ったGUIに描写したいです
0887デフォルトの名無しさん
2006/11/21(火) 22:56:280888デフォルトの名無しさん
2006/11/21(火) 23:02:160889デフォルトの名無しさん
2006/11/21(火) 23:17:24マンピーをオープン?
0890デフォルトの名無しさん
2006/11/21(火) 23:26:390891デフォルトの名無しさん
2006/11/21(火) 23:27:400892886
2006/11/21(火) 23:34:48rubyの場合だとrb_load_fileやrb_eval_stringなど
pythonの場合だとPyRun_SimpleFileやPyRun_SimpleStringなど
を使って実行したスクリプトの標準出力を自分で用意した関数に中継しGUIに描写したいです
0893デフォルトの名無しさん
2006/11/21(火) 23:37:44HTMLを出力するうんこツールじゃないの?
0894デフォルトの名無しさん
2006/11/21(火) 23:38:070895デフォルトの名無しさん
2006/11/21(火) 23:38:450896886
2006/11/21(火) 23:53:28buf += 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"と表示されます...
0897デフォルトの名無しさん
2006/11/22(水) 00:11:12NT系のWindowsならできる。
VC8とか関係ない。キーボードドライバがやってる。
0898デフォルトの名無しさん
2006/11/22(水) 00:34:07コレって何が原因でつか?
0899デフォルトの名無しさん
2006/11/22(水) 00:35:20パイプ使えばいいだろ…
0900デフォルトの名無しさん
2006/11/22(水) 00:35:39type_info::name() が使われてるけど、適切なライブラリがリンカに渡されていない。
0901デフォルトの名無しさん
2006/11/22(水) 00:37:23どのライブラリか教えてもらえますか?
0902デフォルトの名無しさん
2006/11/22(水) 00:47:50わかんない。でも↓にいくらか情報があるっぽい。
http://www.google.co.jp/search?q=LNK2019+type_info+name
VS2003 でコンパイルしたのと VS2005 でコンパイルしたの混ぜてない?
0903デフォルトの名無しさん
2006/11/22(水) 00:51:53一応全部2005でリビルドしてるんですが・・・
元がmsvc6のソースなのが関係してるのでしょうか?
0904デフォルトの名無しさん
2006/11/22(水) 00:55:30VC6 用にビルドされたライブラリ食わせてたりしない?
0905898
2006/11/22(水) 01:04:17クリーンからリビルドですし、
VSとPSDKしかみてないのですが・・・
例外部分のログメッセージでのエラー名だったのでコメントにして対処してしまいました。
原因は別で取ってきてるので。
0906デフォルトの名無しさん
2006/11/22(水) 01:12:200907デフォルトの名無しさん
2006/11/22(水) 01:24:07RTTIが検索に引っかかったのですがPocketPC周りの情報しか見つからず放置しておりました。
詳しく教えていただけますでしょうか?
0908デフォルトの名無しさん
2006/11/22(水) 01:27:370909デフォルトの名無しさん
2006/11/22(水) 01:39:44ありがとうございます。
調べましたが/GRはすべてのプロジェクトでついていました。
何が原因なのやら・・・
0910デフォルトの名無しさん
2006/11/22(水) 08:39:48元がVC6のソースってことだから、何か修正せにゃいけんところを見落としてるとかだろうけど・・・
0911デフォルトの名無しさん
2006/11/22(水) 09:08:19プロジェクトのプロパティからC/C++やリンカのコマンドラインって項目に載ってるから。
0912デフォルトの名無しさん@質問者
2006/11/22(水) 11:49:44書きかえられちゃいます。変更できないと思うんですが、
何か間違っているでしょうか?
※環境は、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;
}
何も問題ないような。
0914デフォルトの名無しさん
2006/11/22(水) 12:02:23そのコードで問題ないのは正常。
おまいさんがやりたいのはたぶんこっち
>void test(const char* pstr)
↓
void test(char* const pstr)
0915デフォルトの名無しさん
2006/11/22(水) 12:11:130916デフォルトの名無しさん@質問者
2006/11/22(水) 12:15:43>>914
ありがとうございます。
間違っていました。
上の例では、指しているところを変えただけでしたね。
0917デフォルトの名無しさん
2006/11/22(水) 13:20:59void 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)はコメント)
この場合どうすればいいのでしょうか?
0918デフォルトの名無しさん
2006/11/22(水) 16:49:070919デフォルトの名無しさん
2006/11/22(水) 16:56:17どっかのサイトにそれ書いてあってチャレンジしてみましたがダメでした。
何か記述間違ってたのかな?
0920デフォルトの名無しさん
2006/11/22(水) 17:27:49class A{
//メンバ
class B;
・・・
}
見たいのがあってclass Bを拡張したとき
class C : public B{
・・・・
}
で、Bを拡張したclass Cをメンバに持つclass Dを書きたいんだけど
class D{
//メンバ
class C;
・・・・(ほとんどAといっしょ)
}
なんかすっきり書けないっすかね。。
こんな感じで。
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; }
}
0922デフォルトの名無しさん
2006/11/22(水) 18:00:32>921
m(_ _)m
なんでc++ってインターフェースないんすかね
0923デフォルトの名無しさん
2006/11/22(水) 18:11:330924デフォルトの名無しさん
2006/11/22(水) 18:48:06多重継承が出来るから
0925デフォルトの名無しさん
2006/11/22(水) 19:05:20#pragma comment (linker, "/libpath:\"/Program Files/XXX/lib\" ")
としてみましたがうまく動いていないみたいです
includepathの指定も#pragma でできないのでしょうか?
0926デフォルトの名無しさん
2006/11/22(水) 20:34:150927デフォルトの名無しさん
2006/11/23(木) 01:00:05BC に必要なインターフェースをきっちり抽出していれば、
A, D は要らなくて AD だけで済むんじゃないの?
0928デフォルトの名無しさん
2006/11/23(木) 01:01:590929デフォルトの名無しさん
2006/11/23(木) 10:36:02多重継承を使う人は頭が悪いスパゲッティ君
0930デフォルトの名無しさん
2006/11/23(木) 10:51:570931デフォルトの名無しさん
2006/11/23(木) 10:54:22>>929に馬鹿がいます!
0932デフォルトの名無しさん
2006/11/23(木) 10:55:08スパゲッティが食べたいです!
0933デフォルトの名無しさん
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|〉. ||::::::::::ヽ:::::::\
0934デフォルトの名無しさん
2006/11/23(木) 11:16:090935デフォルトの名無しさん
2006/11/23(木) 12:15:13ほう。ナポリのタンスか。
0936デフォルトの名無しさん
2006/11/23(木) 12:20:560937デフォルトの名無しさん
2006/11/23(木) 13:06:000938デフォルトの名無しさん
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 :. |
/ ヽ :
0939デフォルトの名無しさん
2006/11/23(木) 17:32:47文字列の指定した箇所の文字列だけを比較しようと思ったらどうすればいいのでしょうか。
たとえば、
私は太郎です。
という文字列があったとき、
3,4文字目(2バイトなので5〜8文字目ですが)が「太郎」のとき、
という条件を指定するにはどうすればいいのでしょうか。
0940939
2006/11/23(木) 17:36:130941デフォルトの名無しさん
2006/11/23(木) 17:46:540942デフォルトの名無しさん
2006/11/23(木) 17:53:15if (strlen(s) >= 8 && strncmp(s + 4, "太郎", 4) == 0) {
...
}
0943デフォルトの名無しさん
2006/11/23(木) 17:58:57どうもありがとうございました。
0944デフォルトの名無しさん
2006/11/23(木) 18:01:290945デフォルトの名無しさん
2006/11/23(木) 18:23:04変わりに良い方法ってないかな
0946デフォルトの名無しさん
2006/11/23(木) 18:25:07外部で定義するしかない。コンストラクタもstaticには無力。
0947デフォルトの名無しさん
2006/11/23(木) 18:25:23クラス外に定義するとか。 static メンバ関数をインラインで定義するとか。
0948デフォルトの名無しさん
2006/11/23(木) 19:06:59レスありがと。参考にしてみます。
0949デフォルトの名無しさん
2006/11/23(木) 19:21:56拡張子がrtfのファイルに関連するアイコンデータがプログラムから
ひつようなのですが、レジストリエディタで確認すると
"%ProgramFiles%\Windows NT\Accessories\WORDPAD.EXE",1
になっていました。
このリソースIDは何番にしたらいいですか?ワードパッドみても
リソースIDが一番のアイコンはありませんでした。
よろしくお願いします
0950デフォルトの名無しさん
2006/11/23(木) 19:23:42すれ違い。悪いが誘導先もわからん。
0951デフォルトの名無しさん
2006/11/23(木) 19:29:14ここかな?
あとはWindows板かも
0952949
2006/11/23(木) 19:36:420953デフォルトの名無しさん
2006/11/23(木) 19:50:13char *r = "あいうえお";
として、最初の1文字、2文字を表示させようと思って
printf("%-2s %-4s",r,r);
としたのですが、これではすべてが出力されてしまいます。
どうすれば?
0954デフォルトの名無しさん
2006/11/23(木) 19:54:38で宣言された配列をwhile()ループで回す時に、buf[ BUF_MAX ]へのポインタ
が必要になったのですが、
char *p_buf_end = buf[ BUF_MAX ];
にしてしまうと、p_buf_endという名前が buf[ BUF_MAX -1 ] と紛らわしい
のではないか?と悩んでいます。
この場合、どのような変数名にするのが無難でしょうか?
0955デフォルトの名無しさん
2006/11/23(木) 20:00:04ドットも忘れないでやってください。
Ex.
"%-.2s"
0956デフォルトの名無しさん
2006/11/23(木) 20:01:03std::vectorでは、end()とlast()で使い分けている。
0957デフォルトの名無しさん
2006/11/23(木) 20:02:36参照してみます。ありがとうございました。m(__)m
0958デフォルトの名無しさん
2006/11/23(木) 20:05:050959デフォルトの名無しさん
2006/11/23(木) 20:26:57できたよ!
どうもありがとうございました。
0960デフォルトの名無しさん
2006/11/23(木) 23:25:31for(i = 0; i < sizeof buf; i++) {
buf[i];
}
わざわざポインタ使う必要ないんじゃない?
0961デフォルトの名無しさん
2006/11/23(木) 23:29:05名前の付け方に関する質問なんだからそのレスは見当違いだろう。
仮に今回はそれでいいとしても配列を超えたとこのポインタが必要になることはないとも限らん。
0962デフォルトの名無しさん
2006/11/24(金) 00:00:09http://pc8.2ch.net/test/read.cgi/tech/1154448184/l50
0963デフォルトの名無しさん
2006/11/24(金) 02:30:010964デフォルトの名無しさん
2006/11/24(金) 03:16:22計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";
}
0965デフォルトの名無しさん
2006/11/24(金) 03:20:56- for(i=0;i<60000;i++){
- infile>>avg;
+ while(infine>>avg){
0966デフォルトの名無しさん
2006/11/24(金) 03:36:56今試してみましたが
8825行目ぐらいまでしか読み込んでくれません。
何事もなかったかのようにwhileループを抜けてしまいます。
0967デフォルトの名無しさん
2006/11/24(金) 03:42:138825行目あたりに float として読めない文字があるんじゃないの?
あとは、 #include <cstdio> して while ループ抜けた後
if (!infile.eof()) perror("infile"); ってしとけ。
出入力エラーがあれば、これで表示されるだろう。
0968デフォルトの名無しさん
2006/11/24(金) 04:46:57ファイルを確認してみたところ特に変わったところはありませんでした
あと、試してみたところ,sucessと表示されました。
0969デフォルトの名無しさん
2006/11/24(金) 05:30:340970デフォルトの名無しさん
2006/11/24(金) 07:25:06やっぱり途中で止まってるな。 >>967 のとおりだろ。
最後に読み込まれた数値の次にある文字列をファイルの
先頭にコピペすれば、どうせ最初で止まるだろう。
0971デフォルトの名無しさん
2006/11/24(金) 11:02:50って宣言したコンストラクタがgccでコンパイルとおらない。
error: expected `)' が '&' トークンの前にあります
こういうエラー出してくる。
0972デフォルトの名無しさん
2006/11/24(金) 11:20:39同じ問題の発生する最小のソースと、コマンドラインを貼ってみろ。
0973デフォルトの名無しさん
2006/11/24(金) 11:26:000974デフォルトの名無しさん
2006/11/24(金) 11:30:03namespace 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.
0975デフォルトの名無しさん
2006/11/24(金) 12:19:02Microsoft Visual C++ 2005 Express Edition + STLPort 5.0.2の環境です。
0976デフォルトの名無しさん
2006/11/24(金) 13:07:18namespaceのfooとHogeコンストラクタの仮引数のfooが被ってる
0977デフォルトの名無しさん
2006/11/24(金) 13:12:12仮引数の名前を変えてもエラーが出ます。
0978デフォルトの名無しさん
2006/11/24(金) 13:22:05namespace foo の中に Foo は解決されてるのか?
最小コードが >>974 だとしたら、foo::Foo なんて型はないぞ
0979デフォルトの名無しさん
2006/11/24(金) 13:29:03インクルードで解決してる。
0980デフォルトの名無しさん
2006/11/24(金) 14:04:13こういう情報を小出しにするアホは死んだ方がいい
0981デフォルトの名無しさん
2006/11/24(金) 14:22:37何が必要十分であるか分からないくせに
自分で勝手に判断して情報を制限・抽象化する。
初心者とはそういうものだ。
初心者歓迎のスレタイ掲げてその台詞はちときつい気がするよ。
0982デフォルトの名無しさん
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]とかだと、上手く識別してくれます。
基本的に書き込む時と逆の処理しかしていないのですが
何故上手くいかないか分かる方いらっしゃいますでしょうか?
0983デフォルトの名無しさん
2006/11/24(金) 14:37:54>for (y = sy; y <8; y++){
>for (x = sx; x<8; x++){
何やってんだよ
やりたいことは y < (sy+8) と x < (sx+8) か?
あと if( write != p ) return -1; でいっきに抜けたほうがきれいだぞ
がんがれ
0984デフォルトの名無しさん
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文使えばうまくいくかなっと思って
いろいろ試してました。
頑張ります。
0985デフォルトの名無しさん
2006/11/24(金) 14:57:48違うってことはsy,sxが8以上だと何もせずにチェックが終了することになるが・・・
0986デフォルトの名無しさん
2006/11/24(金) 15:05:440987デフォルトの名無しさん
2006/11/24(金) 16:35:55>>986
ナイスな返答有難うございます。
分かりました!
0988デフォルトの名無しさん
2006/11/24(金) 16:38:250989デフォルトの名無しさん
2006/11/24(金) 17:15:350990デフォルトの名無しさん
2006/11/24(金) 17:36:460991デフォルトの名無しさん
2006/11/24(金) 17:41:390992デフォルトの名無しさん
2006/11/24(金) 18:59:160993デフォルトの名無しさん
2006/11/24(金) 19:04:15YES コピーされるよ
0994デフォルトの名無しさん
2006/11/24(金) 19:54:070995デフォルトの名無しさん
2006/11/24(金) 20:28:280996デフォルトの名無しさん
2006/11/24(金) 22:16:350997デフォルトの名無しさん
2006/11/24(金) 22:23:00っ[ldiv]
0998の
2006/11/24(金) 22:38:07その中で、C言語でつくったプログラムを使用したいのですが、どうすればよいのかまったくわかりません。
そもそも、そういうことはできるのですか?
0999デフォルトの名無しさん
2006/11/24(金) 22:44:42http://www.kumei.ne.jp/c_lang/index_sdk.html
1000デフォルトの名無しさん
2006/11/24(金) 22:45:1210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。