【初心者歓迎】C/C++室 Ver.47【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/01/16(水) 15:14:51ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.46【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1198755167/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2008/01/16(水) 15:16:07乙
0003デフォルトの名無しさん
2008/01/16(水) 15:56:00同じ引数で何度も呼び出しても毎回返値が違う可能性がありますよね。
time()とか。
もし、ある関数に対して「同じ引数ならば常に同じ値を返し、かつ副作用が無い」ことをコンパイラに対して表明できれば、
あるケースにおいては最適化に有利だと思うのですが、
何らかの方法でそれをコンパイラに表明することはできますか?
int f(int x){return x+1;} //同じxに対して同じ値を返す
int main(){
for(int i=0; i<f(99); i+=f(0)) printf("%d", f(1)); //最適化可能?
return 0;
}
0004デフォルトの名無しさん
2008/01/16(水) 16:04:20定数を返す関数ならVC8などで関数がインライン化されてしまう
事はあるが、引数によって戻り値が違う場合は難しいかも。
0005デフォルトの名無しさん
2008/01/16(水) 16:05:16副作用がないことの表明にはならないけれど、C++のinlineはコンパイラにインライン展開を促す
00063
2008/01/16(水) 16:11:14たとえ同じ引数に対して常に同じ値を返すとしても、
インライン展開では毎回計算してしまうんですよね?
やはり自分で一時変数を確保しておくのが良いということですか
0007デフォルトの名無しさん
2008/01/16(水) 16:14:01そうでないコンパイラを使うなら、自前でキャッシュを持てばいいだろう。
0008デフォルトの名無しさん
2008/01/16(水) 16:14:41引数の取る数が限られている場合はテーブル展開するのが常識。
引数が実数だとそうは行かないが。
0009デフォルトの名無しさん
2008/01/16(水) 16:17:32出てくるような再帰的な関数の場合、整数のペアをstd::pairに
入れてキーにしてstd::mapに入れれば劇的に速くなる。
0010デフォルトの名無しさん
2008/01/16(水) 16:26:44・グローバル変数を参照しない
・ローカルstatic変数を持たない
・間接参照を用いてローカル変数以外の変数を参照しない
・初期化していない変数の値を返さない
・他の一意的でない関数を呼ばない
こんな感じか
0011デフォルトの名無しさん
2008/01/16(水) 17:01:31memoizeは自分で処理しないといけない
0012デフォルトの名無しさん
2008/01/16(水) 17:04:05プロジェクトをアセンブラにあまり劣らない速度を保ちつつ
開発を可能にしたのがC/C++
他の言語は必ずどこかで速度や効率を犠牲にしている
0013デフォルトの名無しさん
2008/01/16(水) 17:34:410014デフォルトの名無しさん
2008/01/16(水) 18:03:140015デフォルトの名無しさん
2008/01/16(水) 18:32:40__declspec(noalias)とか__attribute__((const))とかないわけではない。
0016デフォルトの名無しさん
2008/01/16(水) 18:45:59zlib.hはたぶん大丈夫だと思います。この前には
zlib.hが見つからないってエラーが出てたんですが
どっかのディレクトリにあったzlib.hを/usr/includeに
持ってきたらエラーは消えて現在に至る、と言うかんじです。
glutが足りないんでしょうか。Synapticで
lib-glut3
lib-glut3-dev
glut3
glut3-dev
freeglut3
freeglut3-dev
とかは入れたのですが。。。まだ他に入れなければいけないパッケージが
あるということでしょうか。
0017デフォルトの名無しさん
2008/01/16(水) 18:50:25glutが使ってるzlibが足りないとみたんだが。
gzFileはzlibで定義されてるはず
0018デフォルトの名無しさん
2008/01/16(水) 18:51:24ちゃんとインストールしてないんじゃないの?
001916
2008/01/16(水) 18:58:46/usr/src/linux-headers-2.6.22-14/include/linux/zlib.h
にあったのでこれを取ってきたのですが・・・
するとエラーが消えたのでこれでいいのかな、と思ったのですが・・
ちゃんとsynapticなりでインストールしなきゃいけないということでしょうか。
0020デフォルトの名無しさん
2008/01/16(水) 19:07:40そのzlib.hの中に gzFile の定義なかったらハズレ。ちゃんとzlibをイ
ンストールしましょう。
そもそも、ヘッダだけコピーしてもライブラリがなきゃリンクできない
じゃない。
002116
2008/01/16(水) 19:20:25とりあえずエラーは消えました。ただ
/tmp/ccqSOFll.o: In function `readfile':
cv109.c:(.text+0xa41d): undefined reference to `gzopen'
cv109.c:(.text+0xa5ce): undefined reference to `gzgets'
cv109.c:(.text+0xa5e4): undefined reference to `gzclose'
というエラーが出てしまって…GLUTのライブラリを読み込めていないということでしょうか。
Synapticで
freeglut3
glut
libglut
関連は入れてるので多分大丈夫だと思うのですが。。。
コンパイルするコマンドは
gcc -lglut -lGLU -lGL cv109.c
でいいのでしょうか?
0022デフォルトの名無しさん
2008/01/16(水) 19:41:500023デフォルトの名無しさん
2008/01/16(水) 19:53:09int main(){
int x = 10;
float f = 5.5;
const int& r = (int)x, &s = (int)f;
x = 8;
f = 1.00;
std::cout << x << ',' << r << std::endl;
std::cout << f << ',' << s << std::endl;
return 0;
}
実行結果
8,8
1,5
同じキャストでも元の型と同じ型にキャストすると変数自体へのリファレンス、
違う型にキャストすると一時値へのリファレンスになります。
(int)xの方は最適化が働いているんだろうと思いますが、
このように同じキャストでも結果が違うのは仕様に準拠したものでしょうか?
コンパイラはbccです。
002416
2008/01/16(水) 20:09:37お手数をお掛け致しましたm(_ _)m
0025デフォルトの名無しさん
2008/01/16(水) 20:48:20処理
if(条件)
構造体の宣言を新しく追加 //例えばkouzoutai hoge[0]、hoge[1]、hoge[2]…
}
ってしたいんだけどどうやって書けばいいの?
0026デフォルトの名無しさん
2008/01/16(水) 20:50:06>>14 の言ってる constexpr ってのが次期 C++ に入る予定。
関数の戻り値をコンパイル時に定数にできる。
ただし、return 文しかない関数じゃないとダメだけど。
あるいは、今でもテンプレート引数と静的メンバ定数を利用して
似たような物を作る事もできる。
複雑な事やろうとしたら再帰するしかない。
制御文も使えないけど、? : は使えるから意外と色々出来るよ。
0027デフォルトの名無しさん
2008/01/16(水) 20:53:38宣言は追加できません。配列の要素数を増やしたいなら、std::vectorでも使えばよろしいかと。
0028デフォルトの名無しさん
2008/01/16(水) 20:56:19同一の型へのキャストはno effectだったという記憶があるような
ないような。
0029デフォルトの名無しさん
2008/01/16(水) 20:57:18ありがとう。そうすることにします
0030デフォルトの名無しさん
2008/01/16(水) 20:57:37つまり最適化ではなく、標準どおりかと
思うような思わないような。
0031デフォルトの名無しさん
2008/01/16(水) 21:04:56入力
string line = "11 22 33 44";
char delim = ' ';
出力
vector<int> v ← 11,22,33,44 (要素4個のベクタ)
という関数をつくろうとして、それはできたのですが、次に
stringからintへ変換するunary_functionを引数で渡して(1)、上記関数内で
transform()に渡そう(2)としたのですが、上手くいきません。前スレで教えてもらって
(1)の引数で渡すところまではできたのですが、(2)のtransformに渡す所でコンパイル
が通りません。どこが間違っているのでしょうか?
vector<int> line2vec2(string line, char delim, unary_function<string,int> func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}
よろしくお願いします。
0032デフォルトの名無しさん
2008/01/16(水) 21:18:07v, v2の型は何だ。
0033デフォルトの名無しさん
2008/01/16(水) 21:21:28一時オブジェクトが作られてるね。一時オブジェクトそのものは仕様にあると思う。
コンパイラの警告レベルを上げると一時オブジェクトを作った警告が出せるコンパイラもあったと思う。
0034デフォルトの名無しさん
2008/01/16(水) 21:29:21ありがとうございます
すっきりしました
>>33
bccでもconstを外すと「一時変数を云々」という旨の警告が出ます。
0035デフォルトの名無しさん
2008/01/16(水) 21:30:11VC++ 2008でも同じ結果。
キャストの結果は右辺値(一時オブジェクト)
これは仕様。ただし、同じ型へのキャストはno effect
だったと思うような思わないような。
メイヤーズかなんかの本でチラっと書いて
あった気がする。
0036デフォルトの名無しさん
2008/01/16(水) 21:30:25ありがとうございます
すっきりしました
0037デフォルトの名無しさん
2008/01/16(水) 21:33:00それは標準準拠してないから。
bccは非constリファレンスでも左辺値以外の値を
参照できてしまう。
0038デフォルトの名無しさん
2008/01/16(水) 22:41:31すいません。
コンパイルエラー
test.cpp:73: instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:936: error: no match for call to
'(std::unary_function<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, int>) (std::basic_string<char, std::char_traits<char>,
std::allocator<char> >&)'
vの型vector<string>
v2の型vector<int>
です。
先の関数はこんな感じ() {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
0039デフォルトの名無しさん
2008/01/16(水) 22:42:34std::for_each(pens.begin(), pens.end(), ここ);
と書くと、「ここ」の関数に
std::pair<wstring, HPEN>
が渡されると思うのですが、
BOOL DeleteObject(HGDIOBJ)なので
都合よくHPENだけ渡す方法はないでしょうか?
0040デフォルトの名無しさん
2008/01/16(水) 22:56:11テキストボックスにリンクを複数貼ってクリックするとフォームが開き
その開くフォームがフォルダダイアログだったりアドレス入力フォームだったりと
一行ずつ異なるリンク付きテキストボックスはどのようにつくればいいのでしょうか?
RichTextBoxで作ろうにもリンクしている文字列が開いたフォームで変えられるので
LinkClickedのリンク文字列で判断は難しく、同名のリンクが複数あった場合などで困っております。
どなたか良い方法を教えてください。
0041デフォルトの名無しさん
2008/01/16(水) 22:59:43ファンクタ
0042デフォルトの名無しさん
2008/01/16(水) 23:03:48unary_function型そのものには関数呼び出しが定義されてないからエラー
そもそもunary_function型はそのように使うことを想定されていない
template <typename T> vector<int> line2vec2(string line, char delim, const T& func)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),func());
tansform(v.begin(),v.end(),v2.begin(),func);
=>両方ともコンパイルは通らなかったです。
return v2;
}
0043デフォルトの名無しさん
2008/01/16(水) 23:06:14コメント残しっぱだし……
template <typename T> vector<int> line2vec2(string line, char delim)
{
色々な処理
tansform(v.begin(),v.end(),v2.begin(),T());
return v2;
}
0044デフォルトの名無しさん
2008/01/16(水) 23:47:030045デフォルトの名無しさん
2008/01/17(木) 01:03:03場合ですが、引き算・掛け算の計算方法を誰か言葉で説明してください!
例えば足し算なら
「下の桁から一桁ずつ足していって10を超えたら次の配列に桁上げしていれる」
となるんですが。。
おねがいします!
0046デフォルトの名無しさん
2008/01/17(木) 01:08:08aとbの掛け算なら、aをb回足し算すればいいと思うよ
0047デフォルトの名無しさん
2008/01/17(木) 01:19:590048デフォルトの名無しさん
2008/01/17(木) 01:30:2450桁の掛け算なんですがそれで大丈夫ですかね?(+_+)
やってみます!
あざす!
>>47
筆算みたいに計算するって書いたら先生にそんな単純に書くなって言われました↓
でもあざす!
0049デフォルトの名無しさん
2008/01/17(木) 09:35:35入れるのがよいのでしょうか?2 となっているコードもあるし
4となっているコードもあります.
0050デフォルトの名無しさん
2008/01/17(木) 09:36:213や5でもいいですよ。
0051デフォルトの名無しさん
2008/01/17(木) 11:44:490052デフォルトの名無しさん
2008/01/17(木) 11:49:01ありがとうございます。
そうすると、unary_function()を引数にもらって、それを内部で使う関数というのは
かけないのですか?
void *のポインタをもらって、内部で適当にキャストして、unary_function()として
使えたりしないのかな。
とりあえずやってみます。
0053デフォルトの名無しさん
2008/01/17(木) 12:13:01b=1/7.90,1/8.12,1/8.23,1/8.56,1/7.97,1/8.68
と仮定する。
for ($i=0; $i<=5; $i++) {
$p1 = (1/$a[$i])**$a * (1-1/$a[$i])**($play-$a);
$p2 = (1/$b[$i])**$b * (1-1/$b[$i])**($play-$b);
$p3 = $p1 * $p2;
$t_ap += $p1; push(@ap,$p1);
$t_bp += $p2; push(@bp,$p2);
$t_abp += $p3; push(@abp, $p3);
}
上記の構文で計算すると分母に差があるのでオーバーフローを起こす・・・と言われました。
**($play-$a);←この部分の計算に問題があるようなのですが、プログラムに疎いので良く判りません><
問題のある部分をどのように記述するべきなのかご指導お願い致します。m(_ _)m
0054デフォルトの名無しさん
2008/01/17(木) 12:18:480055デフォルトの名無しさん
2008/01/17(木) 12:20:36すいませんm(_ _)m
どこで聞けば良いのでしょう?
0056デフォルトの名無しさん
2008/01/17(木) 12:21:39http://pc11.2ch.net/tech/subback.html
0057デフォルトの名無しさん
2008/01/17(木) 12:22:31unary_functionへの参照をもらえばいいんじゃないかね
0058デフォルトの名無しさん
2008/01/17(木) 12:24:01それすら判りません><
0059デフォルトの名無しさん
2008/01/17(木) 12:26:19Perlについての質問箱 34箱目
http://pc11.2ch.net/test/read.cgi/tech/1199977642/
0060デフォルトの名無しさん
2008/01/17(木) 12:26:460061デフォルトの名無しさん
2008/01/17(木) 12:29:49仮想関数になってんの?
0062デフォルトの名無しさん
2008/01/17(木) 12:53:200063デフォルトの名無しさん
2008/01/17(木) 12:54:49じゃあunary_function型で引数を取ること自体が意味無い、だよね
0064デフォルトの名無しさん
2008/01/17(木) 13:02:36M:\>sort3.exe
入力ファイル名:
と表示されて、そこからどうすればいいかわかりません。
ファイル入出力とソートの宿題なのですが、
いかんせん超がつくほどの初心者なので…。
どなたかよろしかったらお願いします。
使っているソフトはVisual C++ 2005 Express Edition です。
0065デフォルトの名無しさん
2008/01/17(木) 13:03:04/* sort3.c */
#include <stdio.h>
struct kamoku { char mei[20];
char kana[10];
int ei;
int koku;
int su;
int sha;
int ri;
}
#define SIZE 30
main(){
struct kamoku seiseki[SIZE], min;
int i,j,m,n;
FILE *input, *output;
char infname[16], outfname[16];
printf("入力ファイル名: ");
scanf("%s",infname);
printf("出力ファイル名: ");
scanf("%s",outfname);
if((input=fopen(infname,"r")) == NULL ){
printf("ファイルがありません\n");
exit(1);
}
if((output=fopen(infname,"r")) == NULL ){
printf("ファイルが作成できません\n");
exit(1);
}
0066デフォルトの名無しさん
2008/01/17(木) 13:06:19入力ファイル名を入力する。
・・・ってかプログラム以前にパソコン教室に通うべきだな。
0067デフォルトの名無しさん
2008/01/17(木) 13:12:05どのようなファイルを入力すべきかがわかりません。
初心者ですみません。
0068デフォルトの名無しさん
2008/01/17(木) 13:15:42鼬害。キーボードの使い方やファイルとは何かと言ったことは
プログラミング以前の知識です。
0069デフォルトの名無しさん
2008/01/17(木) 13:18:13ちゃんと授業にはでようね
0070デフォルトの名無しさん
2008/01/17(木) 13:24:44やってみましたが、ダメなようです。
vector<int> line2vec2(string line, char delim, const unary_function<string,int> &func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<int> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func());
return v2;
}
>>61
仮想関数になっているかどうかはよくわかりませんでしたが、
stlのソースを見ていると、pointer_to_unary_functionというクラスが
ありました。今度はこれで試してみる。
0071デフォルトの名無しさん
2008/01/17(木) 13:40:250072デフォルトの名無しさん
2008/01/17(木) 13:41:27もうなんだかわけがわからなくなってきた。
unary_functionはArgとResのtypedefなんですか?
STLのコンパイルエラーメッセージはやくにたたん。
0073デフォルトの名無しさん
2008/01/17(木) 13:53:510074デフォルトの名無しさん
2008/01/17(木) 14:14:06そもそもunary_functionを引数にしようとした理由は?
普通継承したファンクタ作るよね
0075デフォルトの名無しさん
2008/01/17(木) 14:17:44std::bind2ndなどのアダプタがargument_typeとresult_typeを
必要とするから。
それ以上の意味はない。別にstd::unary_functionを継承しなくても
自分でargument_typeとresult_typeをtypedefしてもいい。
0076デフォルトの名無しさん
2008/01/17(木) 14:33:29template <typename T>
vector<int> line2vec2(string line, char delim, T func) {
transform(v.begin(), v.end(), v2.begin(), func());
}
line2vec2( , , std::ptr_fun(関数ポインタ));
line2vec2( , , 関数オブジェクト());
0077デフォルトの名無しさん
2008/01/17(木) 14:35:18>transform(v.begin(), v.end(), v2.begin(), func());
transform(v.begin(), v.end(), v2.begin(), func);こうだな
0078デフォルトの名無しさん
2008/01/17(木) 15:04:35>>42-43
0079デフォルトの名無しさん
2008/01/17(木) 15:06:07今回のエラーメッセージは割と理解できるものだし、
そもそも何が駄目なのか指摘されてるのに
まるで見当違いの方法を試しているのはお前自身だ
0081デフォルトの名無しさん
2008/01/17(木) 15:45:44おう、こりゃ失礼
0082コンパイルできた
2008/01/17(木) 15:48:16ソースは以下です。
template <class T, typename T2>
vector<T> line2vec2(string line, char delim, T2 func) {
int begin, end;
vector<string> v;
begin = end = 0;
while (line[end]) {
begin = end;
while (line[end] != delim && line[end]) {
end++;
}
v.push_back(line.substr(begin, end-begin));
end++;
}
vector<T> v2(v.size());
transform(v.begin(), v.end(), v2.begin(), func);
return v2;
}
この関数をこんな感じで使う。
string s = "1 2 3 4 5 - 6 7 8 9";
vector<int> v = line2vec2<int>(s, ' ', string2int());
0083コンパイルできた
2008/01/17(木) 15:48:54ちなみにstring2int()は以下のように定義しました。
class string2int : public unary_function<string,int> {
public:
unary_function<string,int>::result_type operator() (unary_function<string,int>::argument_type str) {
if (str == "-")return 0;
else return static_cast<int>(atoi(str.c_str()));
}
};
いやー、すげえ感謝感謝。今回答えてくれた方々には昼飯一回おごってもいいくらいス。
0084デフォルトの名無しさん
2008/01/17(木) 15:57:070085デフォルトの名無しさん
2008/01/17(木) 16:04:00もうちょっと本買って読んだ方がいいな
0086デフォルトの名無しさん
2008/01/17(木) 16:04:23えらく大変だな
0088デフォルトの名無しさん
2008/01/17(木) 20:00:30#include <cstdio>
char ch[10];
int main()
{
while ((cin.getlie(char, 10)) != EOF) {
}
}
これをコンパイルしようとするとwhileの行でエラーが出るのですが、
何がいけないのでしょうか??
008988
2008/01/17(木) 20:02:080090デフォルトの名無しさん
2008/01/17(木) 20:03:38余分なものが付いているk 「ar」 a
0091デフォルトの名無しさん
2008/01/17(木) 20:04:320092デフォルトの名無しさん
2008/01/17(木) 20:04:36分かってるとは思うけど
0093デフォルトの名無しさん
2008/01/17(木) 20:04:38std:: n が足りない
009488
2008/01/17(木) 20:12:05すいません色々抜けていました。。orz
正しくはこれです。
#include <iostream>
#include <cstdio>
using namespace std;
char ch[10];
int main()
{
while ((cin.getline(ch, 8)) != EOF) {
cout << "test";
}
}
これでもコンパイルできないのです。
whileの行でエラー出ます。
0095デフォルトの名無しさん
2008/01/17(木) 20:14:35!= EOFこれが不要。
質問するときはエラーの内容も書いてくれ。
0096デフォルトの名無しさん
2008/01/17(木) 20:14:54#include <iostream>
char ch[10];
int main()
{
while (std::cin.getline(ch, 8)) {
std::cout << "test";
}
}
0097デフォルトの名無しさん
2008/01/17(木) 20:35:00int main()
{
char ch[10];
while (std::cin.getline(ch, sizeof ch)) {
std::cout << "test";
}
}
0098デフォルトの名無しさん
2008/01/17(木) 21:21:43でファイルの更新を検知するプログラムを作りたいのですが、
更新までブロックする関数を教えてください。
if (ファイルの更新までブロック)
{
//更新された
read();
...
}
みたいなカンジです。
ちなみにtailのソースを見てみたのですが、
1秒毎にファイルが更新されたかチェックして処理をしているようです。
何秒毎にチェックするのではなく、更新までブロックできる関数がわかればいいです。
よろしくお願いします。
0099デフォルトの名無しさん
2008/01/17(木) 21:29:340100デフォルトの名無しさん
2008/01/17(木) 21:38:030101デフォルトの名無しさん
2008/01/17(木) 21:42:18FindFirstChangeNotification/FindNextChangeNotification って API があるから
他の OS でもそういう API があるんじゃないかと思う気持ちも分からんでも無い。
0102デフォルトの名無しさん
2008/01/17(木) 21:53:22Linuxなら可能。
dnotify inotify といったキーワードで調べてみて。
0103デフォルトの名無しさん
2008/01/17(木) 22:30:530104デフォルトの名無しさん
2008/01/17(木) 22:35:11いや、国語だろ
0105デフォルトの名無しさん
2008/01/17(木) 22:38:31実際、技術家庭科の時間にVBプログラミングやらされてたし。
0106デフォルトの名無しさん
2008/01/17(木) 22:39:310107デフォルトの名無しさん
2008/01/17(木) 22:45:09哲学っぽいですね。
0108デフォルトの名無しさん
2008/01/17(木) 22:47:06つか、いちいちageんなって。
0109デフォルトの名無しさん
2008/01/17(木) 22:51:45Winだと
tp://www.google.co.jp/search?hl=ja&q=ReadDirectoryChangesW&lr=
みたいな感じで、存在するんだよ。だから、98もそこから、Linuxにも存在すると期待してるんじゃないかな……
ちなみに、俺は知らん。
0110デフォルトの名無しさん
2008/01/17(木) 23:01:49至る所でプログラミング漬けだったけど。時代遅れのw
0111デフォルトの名無しさん
2008/01/17(木) 23:02:50具体的にありがとうございます。
手詰まりだったので、大変助かりました。
ありがとうございました。
>>100
何が言いたいのか分かりません。
0112デフォルトの名無しさん
2008/01/17(木) 23:15:41そういえば親戚に情報基礎の教科書見せてもらったら15年前と大差なくてワロタ
0113デフォルトの名無しさん
2008/01/17(木) 23:17:49実際には授業で何にも使われない BASIC のことか?
0114デフォルトの名無しさん
2008/01/17(木) 23:20:480115デフォルトの名無しさん
2008/01/17(木) 23:23:160116デフォルトの名無しさん
2008/01/17(木) 23:30:52入力・出力・制御・演算・記憶
FFの応用回路・BASIC・CASL
のあたり。
0117デフォルトの名無しさん
2008/01/17(木) 23:46:44それは・・・知らんから何とも言えん。
0118デフォルトの名無しさん
2008/01/17(木) 23:51:090119デフォルトの名無しさん
2008/01/17(木) 23:52:340120デフォルトの名無しさん
2008/01/17(木) 23:56:190121デフォルトの名無しさん
2008/01/17(木) 23:56:28あとMFCがなんか持っていた気がする。
C++/CLIなら当然.NET Frameworkのリフレクションが色々使える。
0122デフォルトの名無しさん
2008/01/18(金) 00:12:51な感じのマクロの場合、それを使うと方を渡さなくて良くなりますか?
0123デフォルトの名無しさん
2008/01/18(金) 00:15:49制御文をマクロ化すると
自分以外に読みづらいので
悪い作法だと言われている。
0124デフォルトの名無しさん
2008/01/18(金) 00:24:10挫折してしまったんですが、例えば
struct hw_pci mr300_pci __initdata = {
.nr_controllers = 1,
.preinit = mr300_pci_preinit,
.swizzle = pci_std_swizzle,
.setup = ixp4xx_setup,
.scan = ixp4xx_scan_bus,
.map_irq = mr300_map_irq,
};
のような struct 宣言が書いてありましたが、
.(dot)var = 値 のような記法って、そのメンバーの初期化という意味になるのでしょうか?
手元のCの文法書に見つからなかったのですが、この記述の説明文献ってありますかね?
0125デフォルトの名無しさん
2008/01/18(金) 00:25:09そのメンバの初期化という意味でおk。
0126デフォルトの名無しさん
2008/01/18(金) 00:26:17http://seclan.dll.jp/c99d/
0127デフォルトの名無しさん
2008/01/18(金) 00:31:360128デフォルトの名無しさん
2008/01/18(金) 00:34:13便利って書いてあるよ。
http://www.jah.ne.jp/~naoyuki/Writings/STL.html
0129デフォルトの名無しさん
2008/01/18(金) 00:41:39BOOST_FOREACH
0130デフォルトの名無しさん
2008/01/18(金) 00:54:48むり
0131デフォルトの名無しさん
2008/01/18(金) 01:05:400132デフォルトの名無しさん
2008/01/18(金) 01:12:380133デフォルトの名無しさん
2008/01/18(金) 01:41:490134デフォルトの名無しさん
2008/01/18(金) 03:06:16チェックボックスつきのツリーコントロールを作りたいと考えています。
チェックボックスでは三つのチェック状態をあらわしたいと思っておりまして、
ちょうど、VCをカスタムインストールする時に出てくるチェック付きツリーコントロールのような物を考えております。
これを実現する簡単なAPIないし、クラスはないでしょうか?
0135デフォルトの名無しさん
2008/01/18(金) 04:20:09emacsよりもイイですか?
0136デフォルトの名無しさん
2008/01/18(金) 04:45:13そもそもIDEとエディタを単純比較するのが間違ってる気がするよ!
気持ちは分かるけど・・・・・・
0137デフォルトの名無しさん
2008/01/18(金) 05:43:59ずっとメモリ確保されたままになるの?
0138デフォルトの名無しさん
2008/01/18(金) 05:45:44って何の略なんですか?
0139デフォルトの名無しさん
2008/01/18(金) 05:46:080140デフォルトの名無しさん
2008/01/18(金) 05:46:38console out
0141デフォルトの名無しさん
2008/01/18(金) 06:06:10ありがとう
再起動するまでずっと無駄に領域とられたままかと思ってたけどOSがどうにかしてるのね
0142デフォルトの名無しさん
2008/01/18(金) 07:08:07console output
0143デフォルトの名無しさん
2008/01/18(金) 07:08:370144デフォルトの名無しさん
2008/01/18(金) 11:36:39emacs が好きなんですが、
class-name.<Tab>とか押すと、method-nameが選択できたり、
method一覧がかんたんに見れたり,そういう環境が羨ましい。
0145デフォルトの名無しさん
2008/01/18(金) 11:49:430146デフォルトの名無しさん
2008/01/18(金) 11:51:240147デフォルトの名無しさん
2008/01/18(金) 11:54:040148デフォルトの名無しさん
2008/01/18(金) 12:20:500149デフォルトの名無しさん
2008/01/18(金) 12:26:530150デフォルトの名無しさん
2008/01/18(金) 16:57:49C++はおざなりってか
0151デフォルトの名無しさん
2008/01/18(金) 17:35:440152デフォルトの名無しさん
2008/01/18(金) 18:59:290153デフォルトの名無しさん
2008/01/18(金) 19:04:38置き換え,マッチング,追跡の大変さを考えたら,
今の IntelliSense ってすげぇとおもうが.
0154デフォルトの名無しさん
2008/01/18(金) 19:06:520155デフォルトの名無しさん
2008/01/18(金) 19:10:49WMessageBoxWにマクロで置換されてると教えてくれるけど。
肝心の引数がプロトタイプが見えないとか。
0156デフォルトの名無しさん
2008/01/18(金) 19:11:350157デフォルトの名無しさん
2008/01/18(金) 19:25:42たいてい関数の末尾にA、W付ければ良いって話だけど
0158デフォルトの名無しさん
2008/01/18(金) 22:36:51まぁ書いてるときじゃなくて見てるだけのときは面倒かもだけど
0159デフォルトの名無しさん
2008/01/18(金) 22:40:28お願いします。
0160デフォルトの名無しさん
2008/01/18(金) 23:19:55template <class T> class templateA {
protected:
T value;
public:
各種メソッド
};
template <class T> class templateB {
protected:
T value;
public:
各種メソッド
}
class child : templateA<templateB<type> >{
追加メソッド
}
以上のようなクラスを作成し、
子クラス内でthis->value.valueでテンプレートクラスB内の値にアクセスしようとしたのですが、protectedの要素にアクセスできないというエラーが出ます。
どこを直せばよいのか分かりません。
どなたかご教示下さい。
宜しくお願いします。
0161デフォルトの名無しさん
2008/01/18(金) 23:30:06childはtemplateBを継承してないんだからtemplateBのprotectedメンバにはアクセスできない
0162デフォルトの名無しさん
2008/01/18(金) 23:31:450163デフォルトの名無しさん
2008/01/18(金) 23:47:240164デフォルトの名無しさん
2008/01/19(土) 00:05:00でも、設計をもうちょっと考える事をまず検討した方がいい気がする。
0165デフォルトの名無しさん
2008/01/19(土) 00:45:04それぞれのテンプレートクラスにgetメソッドを追加して、要素にアクセスできるようにしてみました。
あまり綺麗な方法とは思いませんが、ひとまずこれで妥協しておきます。
C++初学者なので、friend関数の存在は知っていますが、使った事がないので、こちらも少し勉強してみようと思います。
オブジェクト指向が少しずつ理解できるようになってきて、数ヶ月前に作ったクラスのリファインが楽しすぎて困ります。
お陰で研究が全然進まないYO...
0166デフォルトの名無しさん
2008/01/19(土) 00:47:56って順かな。
0167デフォルトの名無しさん
2008/01/19(土) 00:51:39研究とかならいっそstructでもいい気がする
0168デフォルトの名無しさん
2008/01/19(土) 00:57:23決しておすすめはできないという点では確かに似たようなもんだな。
0169デフォルトの名無しさん
2008/01/19(土) 01:01:32getは○〜△というところでしょうか。
一応意図したものにはなったので、取りあえずこれで行ってみます。
>>167
この先数年使う可能性があるので、ある程度しっかりしたものが作っておきたかったのです。
最悪の場合、お上に献上しないといけないものなのでw
リファイン前は各変数毎にgetメソッドとsetメソッドを用意していました。
これではあまりにも酷いと思いまして。
>>168
難しいですね。
自分の知識がついてきたら、またリファインすると思います。
そして無限ループへ…
0170デフォルトの名無しさん
2008/01/19(土) 01:08:37設計に関する知識が無いならC++なんかやってないでそっちの勉強すべきだし
0171デフォルトの名無しさん
2008/01/19(土) 01:32:23class A{
public:
virtual void func(){printf("A::func¥n");};
};
class B :public A{
private:
virtual void func() {printf("B::func¥n");}
};
int main (void)
{
A* b = new B;
b->func(); //B::funcと出力される。privateなのにアクセスできる!?
}
上記のコードについて、ご教授をお願いします。
gcc4.01で試したところコンパイルすることができました。
B::func()はprivateなのになぜコンパイルエラーにならないのでしょうか?
0172デフォルトの名無しさん
2008/01/19(土) 01:33:380173デフォルトの名無しさん
2008/01/19(土) 01:53:13class A の 仮想関数テーブルには
void func(){printf("A::func\n");}
の関数アドレスが配列0番に登録されている。
また、class B の 仮想関数テーブルには
void func(){printf("B::func\n");}
の関数アドレスが同じく配列0番に登録されている。
コンパイル時には静的な型であるAのfunc()が
調べられ、publicゆえにアクセスできることが
確認される。同時に仮想関数ゆえ、func()は
意味的には以下のようにコンパイルされる。
(b->vptr[0])(this);
vptrは仮想関数テーブルへのポインタで、今の
場合、派生クラスBの仮想関数テーブルのアドレス
が格納されている。仮想関数の呼び出しでは
コンパイル時はあくまで静的な型でアクセス可能性
が決定されるのがポイント。
と思う。
0174デフォルトの名無しさん
2008/01/19(土) 01:56:50こういうコードだと分かりやすいと思う。
B の実装なんて知ったこっちゃないのよ。
// a.h
#include <stdio.h>
class A{
public:
virtual void func(){printf("A::func\n");};
};
// b.h
#include "a.h"
A* get_b();
// test1.cpp
#include "a.h"
int main (void)
{
A* a = get_b();
a->func();
}
// b.cpp
略
0175デフォルトの名無しさん
2008/01/19(土) 01:57:24// test1.cpp
#include "b.h"
int main (void)
{
A* a = get_b();
a->func();
}
0176デフォルトの名無しさん
2008/01/19(土) 02:04:01メカニズムで理解しておいたほうがいいんじゃね?
静的な型でアクセス可能性が決まるというのが
真実だと思うが。
0177デフォルトの名無しさん
2008/01/19(土) 02:15:42Final Draft IS に、そのまんまの答えがありました。
http://www.kuzbass.ru/docs/isocpp/access.html#class.access.virt
>静的な型でアクセス可能性が決まるというのが
>真実だと思うが。
そういうことになりますね。
0178デフォルトの名無しさん
2008/01/19(土) 04:15:38int x,y;
}data;
・・・
hogehoge(std::vector<data>dist);
こんな使い方はできるんでしょうか?
また、こんな使い方はトリッキーなんでしょうか?
0179デフォルトの名無しさん
2008/01/19(土) 04:22:37vectorにユーザー型を入れれるのか?
ということであれば、普通に使えます。
その書式はおかしいけどな
0180デフォルトの名無しさん
2008/01/19(土) 04:33:56structかclassつけーや
0181デフォルトの名無しさん
2008/01/19(土) 09:07:21typedef t_a { ... } a;
C++コード上で下の利点ってどういったものがありますか?
0182デフォルトの名無しさん
2008/01/19(土) 09:12:45C でも使えるコードを書くのでなければ特に何の意味もない。
0183デフォルトの名無しさん
2008/01/19(土) 09:21:060184デフォルトの名無しさん
2008/01/19(土) 10:09:32ところがコンストラクタだけの段階で、実行時に
アクセス違反の例外で死にます。なんで?
#include <cstring>
class String {
int len;
char* s;
public:
String (const char* ch_ini) {
len = (int) strlen(ch_ini);
strcpy(s,ch_ini);
}
};
実行は
String k1("kkkkk1");
だけ(作っただけのつもり)。
これで死にまする。
0185デフォルトの名無しさん
2008/01/19(土) 10:12:37char *sの指してる領域はどこなんだよ?
0186デフォルトの名無しさん
2008/01/19(土) 10:13:18そのコードじゃstrcpyで死ぬわ。
char* sはどこを指してるのかね?
0187デフォルトの名無しさん
2008/01/19(土) 10:17:02unsigned char型の変数に入る値はランダムで0〜150くらいの値が入るのですが、大体100以上の値が入ったときに4,294,967,295などの変な値になります。
なんで正しい値が入らないのでしょうか?
0188デフォルトの名無しさん
2008/01/19(土) 10:27:090189184
2008/01/19(土) 10:28:34どーすればよいのでしょうか。
0190デフォルトの名無しさん
2008/01/19(土) 10:29:290191デフォルトの名無しさん
2008/01/19(土) 10:29:53その辺はポインタの基本中の基本なんだから、本でも読んで勉強してくれ。
0192デフォルトの名無しさん
2008/01/19(土) 10:39:07本当に unsigned char なのかね?
符号つきになってないか?
0193デフォルトの名無しさん
2008/01/19(土) 10:44:12正直自作クラスとか以前の問題。
文字列やポインタなどの基本から学び直してからのほうが良い。
0194デフォルトの名無しさん
2008/01/19(土) 10:46:26ソースを晒すんだ
0195デフォルトの名無しさん
2008/01/19(土) 10:53:040196デフォルトの名無しさん
2008/01/19(土) 10:57:220197187
2008/01/19(土) 11:32:13traは0〜255が入ります。
unsigned char tra_undf = 0;
unsigned char tra_buff = 0;
static unsigned long ValuePuls = 0;
void main (void){
while(1){
if (tedgf_tracr == 1)
{tra_buff = tra;
flag_edge = 1;
tedgf_tracr = 0;}
if(tundf_tracr == 1)
{tra_undf++;
tundf_tracr = 0;}
if(flag_edge == 1)
{Sort();
tra_undf = 0;
flag_edge = 0;}
:
}}
void Sort(void){ValuePulse = ((256 * tra_undf) + (255 - tra_buff));}
結果は
tra_undf=189のときにValuePulse=4294950301
tra_undf=234のときにValuePulse=4294961868
念のため+ (255 - tra_buff)の部分を消して見ましたが
tra_undf=223のときにValuePulse=4294958848
でした。
0198デフォルトの名無しさん
2008/01/19(土) 12:01:07何の本読んで勉強してんだ
さらしちまえ
0199デフォルトの名無しさん
2008/01/19(土) 12:49:14コンパイラは?
0200デフォルトの名無しさん
2008/01/19(土) 12:56:100201デフォルトの名無しさん
2008/01/19(土) 13:02:40ソースを晒すんだ
0202デフォルトの名無しさん
2008/01/19(土) 13:09:31>念のため+ (255 - tra_buff)の部分を消して見ましたが
>tra_undf=223のときにValuePulse=4294958848でした。
intが16bitの環境か?
256がintなのでtra_undfがintに格上げされ乗算され0xdf00になるが
これはintでは負数になる。
でunsignd longに代入されると符号拡張され0xffffdf00になる。
これは符号無しだと4294958848になって一致する。
0203デフォルトの名無しさん
2008/01/19(土) 13:52:200204187
2008/01/19(土) 13:57:43ありがとうございます。
NC30というコンパイラを使っているのですが、調べたらintは16bitと書いてありました。
回避方法は256の前に(unsigned)を付けるんで大丈夫ですか?
0205デフォルトの名無しさん
2008/01/19(土) 14:02:100206デフォルトの名無しさん
2008/01/19(土) 14:03:110207206
2008/01/19(土) 14:03:490208デフォルトの名無しさん
2008/01/19(土) 14:06:30別に 256lu にしてもいいとは思うが。
0209187
2008/01/19(土) 14:15:25本当にありがとうございます。
0210デフォルトの名無しさん
2008/01/19(土) 14:20:37無視して進んでも大丈夫ですか?
どんな場合に使うのかなどが把握できていない状況です。
0211デフォルトの名無しさん
2008/01/19(土) 14:26:14それだけの話。
0212デフォルトの名無しさん
2008/01/19(土) 14:26:160213デフォルトの名無しさん
2008/01/19(土) 14:31:330214デフォルトの名無しさん
2008/01/19(土) 14:35:10#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
double pai=3.14159265358979;
int mon=2;
float flt=1.2f;
printf("%5.2hf\n",flt); ←ここだけtypeのプレフィックスの「h」を使っているのか分からないです。
printf("%-5.2f\n",flt);
printf("%05.2f\n",flt);
printf("%+08.2f\n",flt);
printf("%-08.2f\n",flt);
printf("%d\n",mon=3);
printf("%e\n",pai);
printf("%08.2f\n",pai);
printf("%05d\n",mon);
printf("円周率は%fです\n",pai);
printf("円周率は%1fです\n",pai);
printf("もう少し詳しい値は%10.8lfです\n",pai);
printf("もう少し詳しい値は%15.13lfです\n",pai);←ここの2行も「l」が使われていますが何のために使用しているのか分かりません。
printf("もう少し詳しい値は%20.18fです\n",pai)
system("PAUSE");
return 0;
}
見難いと思いますが、現在このような感じで悩んでます。
質問の内容がおかしかったらすみません。
0215デフォルトの名無しさん
2008/01/19(土) 14:44:13それともどうしてそのタイミングで修飾子を使っているのがわからないのか
前者ならprintfでぐぐると一番上に出てくるけど
0216デフォルトの名無しさん
2008/01/19(土) 14:45:01http://www.linux.or.jp/JM/html/LDP_man-pages/man3/snprintf.3.html
長さ修飾子
h 整数変換に対応する引き数が short int か unsigned short int で、
n 変換に対応する引き数が short int へのポインタであることを示す。
そこで h はおかしくね?
0217デフォルトの名無しさん
2008/01/19(土) 14:47:08double を渡す時につい l を付けてしまう人がいるが、
l が必要になるのは scanf の方だけ。
printf の方では l は必要ない。
ただ、l をつける間違いを犯す人が多く、さらにそれをサポートしているコンパイラも多いため、
C99 になって l を付けてもいいことになった。
lf は f と同じ。
0218デフォルトの名無しさん
2008/01/19(土) 14:56:32hf は?
だいたい長さ修飾子に対して浮動少数点数って関係あるの?
上のリンク読む限り関係ないと思えるんだが。
0219デフォルトの名無しさん
2008/01/19(土) 14:57:510220デフォルトの名無しさん
2008/01/19(土) 15:00:18>>216
>>217
せっかくお答え頂いてるのにいまいち理解できないです・・・。すいません。
この「h」も「l」も書かなくても結果には関係しないのですが、
ここでは「h」も「l」も書く意味はないということですか?
0221デフォルトの名無しさん
2008/01/19(土) 15:00:30l (エル)
各変換に対応する引き数が、整数変換では long intか unsigned long int、 n
変換では long long int へのポインタ、 c 変換では wint_t、 s 変換では
wchar_t へのポインタであることを示す。
L
a, A, e, E, f, F, g, G 変換に対応する引き数が long double であることを
示す。 (C99 では %LF を使うことを認めているが、SUSv2 では認められていな
い。)
lfじゃなくてLfのことじゃねえの?上の説明では明らかにlとLは違うし
lの意味を考えるとlfはおかしくね?
0222デフォルトの名無しさん
2008/01/19(土) 15:05:42おれは今の場合だと、lもhも指定する意味が無いと思う。
(コンパイルエラーにはされないみたいだが。)
ありうるとすれば、Lfだが、long doubleの
引数を渡してるわけではない(floatの引数になってるよね)
のでLfも無意味だと思う。
0223デフォルトの名無しさん
2008/01/19(土) 15:07:23http://seclan.dll.jp/c99d/c99d08.htm#dt19991115
0224デフォルトの名無しさん
2008/01/19(土) 15:18:30この場合は特に意味は無いんですね。
引数がいまいち分かっていないので、皆さんの説明を上手く理解することができませんでした。
引数はもっと本の先で解説されているようなので、そこまで進んでまた戻ってみます。
アドバイスを上手く活用できなくてすいませんでした。ありがとうございました。
0225デフォルトの名無しさん
2008/01/19(土) 15:19:38ほほー thx
以下でいいの?
%f doubleを出力
%lf doubleを出力(実質的には今までの%fと同じ)
%Lf long doubleを出力
要は表記を許しただけということか。
0226デフォルトの名無しさん
2008/01/19(土) 15:20:22おい、>>223を見といたほうがいい
0227デフォルトの名無しさん
2008/01/19(土) 15:27:44Yes.
>>226
まあもう少し後でいいんじゃね。
というか、可変個引数の引数の規則とか
先まで進まないとよく分からんと思うし。
0228デフォルトの名無しさん
2008/01/19(土) 15:39:110229デフォルトの名無しさん
2008/01/19(土) 15:56:52float.hのマクロ定数を表示させる文
1.
printf("FLT_MIN = %e\n", FLT_MIN );
printf("FLT_MAX = %e\n", FLT_MAX );
2.
printf("FLT_MIN = %f\n", FLT_MIN );
printf("FLT_MAX = %f\n", FLT_MAX );
としたところFLT_MAXはどちらもまともに表示されるのですが
FLT_MINのほうは2.の方が0.000000という表示になってしまいます
これはなにがまずいのでしょうか?
どなたかお願いします
0230デフォルトの名無しさん
2008/01/19(土) 16:04:550231デフォルトの名無しさん
2008/01/19(土) 16:10:07桁が足りなくて丸められてたのですね
ありがとございました
0232デフォルトの名無しさん
2008/01/19(土) 17:56:540233デフォルトの名無しさん
2008/01/19(土) 18:06:26処理系依存かどうか知らないけど、printfって小数点以下表示桁で四捨五入しないっけ?
0234デフォルトの名無しさん
2008/01/19(土) 18:14:01ですよねぇ
>>232
言われて
気になって確かめてみました
0235デフォルトの名無しさん
2008/01/19(土) 19:08:00%fって%.6fと同じだからこれで合ってるんじゃないの?
0236デフォルトの名無しさん
2008/01/19(土) 19:17:530237デフォルトの名無しさん
2008/01/19(土) 19:23:27切り捨てって丸めの一種なんだけどね。
0238デフォルトの名無しさん
2008/01/19(土) 21:37:55あぁいや、大したこっちゃないんだけど、四捨五入した結果だったら、
表示されてないだけというより丸められてるって方があってるかな、と思っただけ。
実際問題じゃどっちでも良いかな
0239デフォルトの名無しさん
2008/01/19(土) 22:07:23ウィンドウを表示して、その中にMoveTo や LineTo で線を書くことはできました。
そこで、その書いた線上にマウスを持って行くと
マウスポインタが変更できるようにしたいのですが、
どんな感じに作っていけばいいのでしょうか?
マウスの位置を調べる関数があるのですが、
マウスが動くたびにその関数を呼び出して、
その値を、先ほど書いた2点間の線上の一次方程式に入れて判断していくとか、
そんな感じになるのでしょうか?
それとも、もっと簡単な方法とかあるのでしょうか。
教えてください。
0240デフォルトの名無しさん
2008/01/19(土) 22:14:37Win32APIスレの方がいい気もするが。
WM_MOUSEMOVEのlParamを使うなりしてカーソル位置を取得。
特定の方程式があるなら、それに当てはめればいいし、
GetPixel()を使って色で判別とかも出来る。
0241デフォルトの名無しさん
2008/01/19(土) 22:43:31色で判別というのもありますね。
いずれにしても、簡単にはいかないみたいですね。
Win32API スレにも質問してみます。
ありがとうございました。
0242デフォルトの名無しさん
2008/01/19(土) 22:48:030243デフォルトの名無しさん
2008/01/19(土) 23:43:44今実行できる環境がないので、教えてもらえませんか。
<Head.h>で以下のように変数を宣言して、
int var;
<Main.cpp>にインクルードしたら、
#include "Head.h"
何もしないでも<Main.cpp>でvarは使えますか?
それとも<Main.cpp>で"extern int var;"としないといけないんですか?
0244デフォルトの名無しさん
2008/01/19(土) 23:47:58多分何もしないで使えるはず。
0246デフォルトの名無しさん
2008/01/20(日) 00:01:11%fなんか使わずに%gを使っとけ。
0247デフォルトの名無しさん
2008/01/20(日) 00:03:520248243
2008/01/20(日) 00:09:50------------
<Head.h>
extern int var;
<Head.cpp>
int var;
------------
<A.h>
#include "Head.h"
<A.cpp>
#include "A.h"
------------
<B.h>
#include "Head.h"
<B.cpp>
#include "B.h"
------------
これで<A.cpp><B.cpp>共に同じvarを使えるでしょうか?
0249デフォルトの名無しさん
2008/01/20(日) 00:18:25リンケージと宣言、定義について勉強しろ
0250デフォルトの名無しさん
2008/01/20(日) 09:29:33使える。
>>249
もしかしたらそれ以前に、#includeの意味がわかっていない気がしないでもない。
0251デフォルトの名無しさん
2008/01/20(日) 11:03:58本気でがんばるから見ててね
キミらしく夢を語る瞳 宝石だってかなわない
(いちばん) 好きなことで (進める) 道を探そうよ
「大人になることはさみしいことさ」なんて逃げないよ
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
一緒に行こう!
とまらない想いがあるってのに
誰にも言えずに温めてた
これからは話してみたいんだ
キミに会ってわかったよ
(ときどき) 確かめ合う
(希望が) 色あせぬように
「喜びをふたりで何倍にもしよう」いまを楽しくね
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overdive 広がる世界 あしたは無限に続く
最高Trance トキメキながらまた あふれるリズム
何でもできる!?
Overwrite 輝きながら あしたを塗り変えるため
最新Dream ステキな毎日を重ねたいだけ
キミの笑顔と 一緒に行こう!
0252デフォルトの名無しさん
2008/01/20(日) 17:58:42>>250
ありがとうございます。やってみたらできました。
0253デフォルトの名無しさん
2008/01/20(日) 18:04:28例えば下の場合、methodを抜けたら解放しなくても、
bufは自動でなくなるんでしょうか?
void method(){
char buf[100];
int i = 123456;
sprintf(buf,"%d",i);
}
0254デフォルトの名無しさん
2008/01/20(日) 18:06:07解放する必要があるのは malloc やら new やらしたやつ
0255デフォルトの名無しさん
2008/01/20(日) 18:14:190256デフォルトの名無しさん
2008/01/20(日) 18:42:36「+=」
とか
「-=」
ってどんな時使うんですか?(>_<)
0257デフォルトの名無しさん
2008/01/20(日) 18:44:09A = A + 2
でAを2回書くのがめんどくさくなったとき。
0258デフォルトの名無しさん
2008/01/20(日) 18:44:09a += 10;
0259デフォルトの名無しさん
2008/01/20(日) 18:49:12BASIC や FORTRAN あがりの人が書く程度。
0260デフォルトの名無しさん
2008/01/20(日) 22:48:50fopen_sはfopenに比べてどうセキュアなのでしょうか。
0261デフォルトの名無しさん
2008/01/20(日) 22:58:48fopenとfopen_sのソースでも見比べたら?
0262デフォルトの名無しさん
2008/01/20(日) 23:04:45どこにあるんですか?
0263デフォルトの名無しさん
2008/01/20(日) 23:07:54デバッガで動かして、fopenの中にF11キーで入ればいいだろ。
そうすりゃ分かる。
0264デフォルトの名無しさん
2008/01/20(日) 23:10:58最近のVC++は持っていません。
0265デフォルトの名無しさん
2008/01/21(月) 00:16:01さよなら単位
0266デフォルトの名無しさん
2008/01/21(月) 00:37:070267デフォルトの名無しさん
2008/01/21(月) 00:40:28http://mori.eco.to/
0268デフォルトの名無しさん
2008/01/21(月) 00:48:51経歴が恐ろしくしょぼいなwwwwwwwwwww
0269デフォルトの名無しさん
2008/01/21(月) 00:51:04突っ込みどころはここですか?www
0270デフォルトの名無しさん
2008/01/21(月) 00:55:57s付いてるほうは受け渡し用のバッファサイズを指定するようになった。
バッファサイズを超えては読まないようになってる。
0271デフォルトの名無しさん
2008/01/21(月) 00:58:32fopen_sもか?
0272デフォルトの名無しさん
2008/01/21(月) 01:04:11FILE** pFile,
const char *filename,
const char *mode
);
形そのものが違うじゃん
0273デフォルトの名無しさん
2008/01/21(月) 01:12:41パラメータの検証が行われます。
pFile、ファイル名、またはモードが null ポインタの場合には、
「パラメータの検証」に説明されているように、これらの関数は
無効なパラメータの例外を生成します。
あとUnicode のファイル ストリームをサポートします
0274デフォルトの名無しさん
2008/01/21(月) 01:56:43必ずしも内部のアルゴリズムがクイックソートだとは限らないよな?
選択ソートが使われてる気がして仕方ないんだが。
でもぐぐってみるとクイックソートが使われてるって書かれてるし…。
0275デフォルトの名無しさん
2008/01/21(月) 01:59:22O(N logN) でテンポラリバッファ不要のソート法であるという指定はあったと思う。
0276デフォルトの名無しさん
2008/01/21(月) 02:02:460277デフォルトの名無しさん
2008/01/21(月) 02:03:290278デフォルトの名無しさん
2008/01/21(月) 02:07:09ありがとう。
比較関数弄ってみてるものの中々アルゴリズムが特定出来ない…。
O(N log N)だとするとやっぱりクイックソートなのかなぁ。
要素数によって使われるアルゴリズム変わるんですかね。
だとすると新しい発見かも…。
0279デフォルトの名無しさん
2008/01/21(月) 02:20:32BCC5.9.2の実装だと途中で挿入ソートに切り替えている
要素数が10以下になると再帰呼び出しのコストが馬鹿に
ならないからだろう
0280デフォルトの名無しさん
2008/01/21(月) 02:21:470282デフォルトの名無しさん
2008/01/21(月) 02:46:44選択ソートは交換回数が少なくて微妙に速度が違うからそこで判断したのかな。
0283デフォルトの名無しさん
2008/01/21(月) 02:49:250284デフォルトの名無しさん
2008/01/21(月) 03:00:25比較関数で比較対象を出力してみて思っただけなので、
もしかしたら間違ってる可能性もあります。
一応ソースと出力結果貼っておきますね。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5841.txt
------ソート前------
4
5
1
2
3
>要素数:5
-----ソート開始-----
1回目: 5と 4を比較
2回目: 1と 5を比較
3回目: 2と 5を比較
4回目: 3と 5を比較
5回目: 3と 4を比較
6回目: 1と 4を比較
7回目: 2と 4を比較
8回目: 3と 2を比較
9回目: 1と 3を比較
10回目: 1と 2を比較
0285デフォルトの名無しさん
2008/01/21(月) 03:00:53ああ、なるほど。
0286デフォルトの名無しさん
2008/01/21(月) 15:28:11下のプログラムは動作確認済みなのですが、なぜ動作するかがわかりません。
iでfor文を考えているのに、for{}の中にiがなくても、動作するのはどうしてなんでしょうか?
#include<stdio.h>
int main(void){
double a[15]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0};
double *p;
p=a;
for(i=0;i<15;i++){
printf("%f\t%p\n",*p,p); ←例えばこの部分がprintf("%f\t%p\n",a[i],p);とかなら納得なのですが…
p++;
}
return(0);
}
0287デフォルトの名無しさん
2008/01/21(月) 15:36:25ポインタ習ってないの?w
0288デフォルトの名無しさん
2008/01/21(月) 15:46:18ただ、printf("%f\t%p\n",*p,p);にするなら、forの()の中身をpのみで表さないとなんか気持ち悪い気がして…
今までやってきたfor文は()の中の変数が{}の中で必ず使われてきたので…
0289デフォルトの名無しさん
2008/01/21(月) 15:50:57私ならこう書く。
#include<stdio.h>
int main(void)
{
double a[]={-256.0,-128.0,-8.0,-2.0,-1.3,-1.0,-0.5,0.0,1.0,1.3,2.0,8.0,128.0,256.0};
for (unsigned i = 0; i < sizeof(a) / sizeof(* a); ++i) {
printf("%g\n", a[i]);
}
return 0;
}
ポインタを使うならこうなるかな。
for (double * p = a; p - a < sizeof(a) / sizeof(* a); ++p) {
printf("%g\n", * p);
}
return 0;
}
いずれにしろ、定数を生のまま書くのはやめた方がいい。
0290デフォルトの名無しさん
2008/01/21(月) 15:51:24>printf("%f\t%p\n",a[i],p)とかなら・・・
それを言うなら、printf("%f\t%p\n",a[i],&a[i]); だろ?
最後のpがokなら、*pもokだろうに。
0291デフォルトの名無しさん
2008/01/21(月) 15:51:39p=a; //pがaの先頭(-256)を指す
printf("%f\n", *p); //pが現在指してる値(-256)を表示する
p++; //pが次の要素(0)を指す
printf("%f\n", *p); //pが現在指してる値(0)を表示する
p++; //pが次の要素(-128)を指す
printf("%f\n", *p); //pが現在指してる値(-128)を表示する
以下繰り返し
iを使ってるのは、単に繰り返し回数を数えるため
0292デフォルトの名無しさん
2008/01/21(月) 15:56:46みなさんわかりやすい説明をありがとうございます。
なんとか理解できそうです。
0293デフォルトの名無しさん
2008/01/21(月) 18:26:49繰り返し「回数」を明示するためにfor使ってるんじゃね
そのプログラムだとp+iとかp[i]とかでもいいが
ループ回数だけが重要で、何回目のループかはどうでもいいこともたまにある
0294デフォルトの名無しさん
2008/01/21(月) 20:41:090295デフォルトの名無しさん
2008/01/21(月) 20:42:30なんかまずいんですか?
0296デフォルトの名無しさん
2008/01/21(月) 20:44:460297デフォルトの名無しさん
2008/01/21(月) 20:46:48目的はC++を使えるようになることです。
C++の前にC言語勉強した方がいいということで、(どっかのサイトに書いてあった)
今はC言語を勉強中ですが、
一通り勉強したらC++に移ってもいいでしょうか?
それとも、C言語をしっかりやってからの方がいいですか?
0298デフォルトの名無しさん
2008/01/21(月) 20:55:42俺は両者を混同しなければいつ移ったって構わないと思う。
まぁせっかくCやってるんだからポインタあたりまでは勉強したほうがいいかもね。
0299デフォルトの名無しさん
2008/01/21(月) 21:12:43ありがとうございます。
ざっと一通り勉強してから移ります。
0300デフォルトの名無しさん
2008/01/21(月) 21:13:38学習を進めていけば、次に何をしたらいいかくらい
自分で判断できるようになる。
C++の勉強を始めたが最期、Cの勉強には一生戻れない
というわけでもあるまいし。
0301デフォルトの名無しさん
2008/01/21(月) 21:28:36次にやるべきことを判断できるようになるまで
真面目に勉強する気が最初からないと考えるんだ。
0302デフォルトの名無しさん
2008/01/21(月) 21:47:04個人的にはいきなりC++でも全然問題ないと思う。
0303デフォルトの名無しさん
2008/01/21(月) 21:57:41> なんかまずいんですか?
・ふつーint
・差をとったりして負の数が出てくる計算で気分的によろしくない
0304デフォルトの名無しさん
2008/01/21(月) 22:31:29forの初期化のトコで宣言出来るのってC99だっけ?
0305デフォルトの名無しさん
2008/01/21(月) 22:34:460306デフォルトの名無しさん
2008/01/21(月) 22:37:47i < sizeof(a) / sizeof(* a);
の部分で「signedとunsigned比較すんなボケ」という警告が出るから
unsignedにしたんだろう。
だがこれだと、size_t型が符号あり整数として定義されている環境では
逆に警告が出る。
これが嫌な人は(sizeof(a) / sizeof(* a))の方をcastしたりするんだろうけど、
signedなsize_t型なんて聞いたことないからぶっちゃけどーでもいい。
0307デフォルトの名無しさん
2008/01/21(月) 22:52:47for文回すのにunsignedがいけないという理由は
for (unsigned i = 0; i > 0; i--) { ... }
というような回し方をしてたら、unsignedだから結局、
0未満は無いで、知らずに無限ループにハマってしまうからやめろ
とか、そんな理由の奴は聞いた事がある
0308デフォルトの名無しさん
2008/01/21(月) 23:04:27継続条件に < を使うのがおかしい。!=を使え。
0309デフォルトの名無しさん
2008/01/21(月) 23:15:54iteratorならよく見るが、ふつうは不等号じゃね?
0310デフォルトの名無しさん
2008/01/21(月) 23:16:23>だがこれだと、size_t型が符号あり整数として定義されている環境では
そんな環境ありえねー。
>>307
そのループ1回も実行されないぞ。
まずいのは、例えば i を 9, 8, ... 1, 0 としてループしたい時に
for(int i = 9; i >= 0; i--){ ... }
って書いた場合、int を unsigned int にすると、>>307 の言うようにはまる。
でも、最近のコンパイラなら i >= 0 が偽にならないとかの警告が出るものも多いよ。
>>308
ネタだろうが、それはない。
0311デフォルトの名無しさん
2008/01/21(月) 23:20:520312デフォルトの名無しさん
2008/01/21(月) 23:26:40vectorなんかを添え字で単純に回したいとき。
くせというかなんというかw
0313デフォルトの名無しさん
2008/01/21(月) 23:27:01>>308
ネタだろうが、それはない
iteratorでなくとも
Cの場合でもループの不変な表明を考えた場合
!= を使うべきことは非常に多い。
i != NUMS
の場合、ループ終了後はi == NUMS であることが保障される。
が、i >= NUMS だとそうはいかない。
0314デフォルトの名無しさん
2008/01/21(月) 23:30:130315デフォルトの名無しさん
2008/01/21(月) 23:36:47変わらないだろ。
0との比較は速い場合がある。
for(int i=10; i; i--) { ... } // 10回ループ
0316デフォルトの名無しさん
2008/01/21(月) 23:48:010317デフォルトの名無しさん
2008/01/21(月) 23:48:47まさか、Javaでもあるまいし普通のコンパイラは速度差がないコードを吐くと思うぞ。
0318デフォルトの名無しさん
2008/01/21(月) 23:52:24for(unsigned int i=10; i>=0; i--) { cout << i << endl; } →無限ループ
理由、
unsignedの値はmax→→→→→→0→maxになる。
上のループだと偽(i==0)があらわれる。下のループだと常に真だから無限。
おk?
0319デフォルトの名無しさん
2008/01/21(月) 23:53:20お前は少し上のレスも読めないのか
0320デフォルトの名無しさん
2008/01/21(月) 23:55:280との比較はゼロフラグを使えるので、効率が良い。
アセンブラの話な。
もちろん、命令パイプラインの効果で差が無くなるかもしれないが、
「場合がある」ということで。
0321デフォルトの名無しさん
2008/01/21(月) 23:56:48言われて見れば同じ事言ってるw つうか微妙に違う事言ってるのかと思って。
>>319のような言葉でしっかり確信持てることもある。
ということで、言葉は人をなめてるが実は優しい>>319
0322デフォルトの名無しさん
2008/01/22(火) 00:25:21その話を知ってからいろんな環境で実験したけど未だに実感できたことがない。
ハンドアセンブルするような環境ならそりゃ違うけど・・・
0323デフォルトの名無しさん
2008/01/22(火) 00:32:33だって期待できるコード削減量って
ループ1回につき比較命令1つ程度なんだから、
実感は難しいかなあ。
0324デフォルトの名無しさん
2008/01/22(火) 00:40:25CPUの周波数がわかってれば期待できる短縮時間は予測できるじゃん?
んでも、どんだけ回しても測定誤差程度の値しか出ないんだよ・・・逆転も往々にしてあるし。
0325デフォルトの名無しさん
2008/01/22(火) 00:43:080326デフォルトの名無しさん
2008/01/22(火) 00:45:59場合によっては逆順に最適化されることもあると聞いた事あるが。
0327デフォルトの名無しさん
2008/01/22(火) 01:02:26規格でsize_tは符号なしと決まっている。
0328デフォルトの名無しさん
2008/01/22(火) 02:08:21#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
このマクロをもっと圧縮できませんか?
二行くらいに。
0329デフォルトの名無しさん
2008/01/22(火) 02:15:54#define WIDEN(x) L#x
#define __WFILE__ WIDEN(__FILE__)
VC9を持ってないからこれがコンパイル通らなきゃ不可能。
ってか通ったところでほかの環境でも通るとは限らないが。
0330デフォルトの名無しさん
2008/01/22(火) 02:19:000331デフォルトの名無しさん
2008/01/22(火) 02:30:200332デフォルトの名無しさん
2008/01/22(火) 03:03:03高速化を狙って関数ポインタの配列に
するって手があると思うんですが、
ポインタ関数の呼び出しのオーバーヘッドは
case何回くらいに匹敵するんでしょうか?
皆さんだったらcase何回くらいからポインタ関数
配列に換えますか?
0333必要なら実測するのみ
2008/01/22(火) 03:09:58case by case.
0334デフォルトの名無しさん
2008/01/22(火) 03:11:00そういう風に出来る switch は
普通はジャンプテーブルに最適化されるから
気にしなくてもいいぜ。
関数ポインタを使うのは高速化を目的とするものじゃなくて、
実装の利便性やら可読性やらを目的とするもんだ。
0335デフォルトの名無しさん
2008/01/22(火) 03:13:25そうだったのか!w
わざわざ変えてたのは無駄だったんですね。
0336デフォルトの名無しさん
2008/01/22(火) 03:17:030337デフォルトの名無しさん
2008/01/22(火) 03:28:00もし等確率で起こるならcaseの最適化がifより速くなることもあるが
CPUには分岐予測があり、30%くらいを占める分岐があればそれを始めに判定することでかなり速くなる
0338デフォルトの名無しさん
2008/01/22(火) 03:31:04ジャンプテーブルに最適化するかどうか
決めてたりしないのか? コンパイラは。
0339デフォルトの名無しさん
2008/01/22(火) 03:33:00分岐数が100とか1000とかに達するような場合でも
CPUの分岐予測って効果あるんですか?
0340デフォルトの名無しさん
2008/01/22(火) 03:40:54親切な方、どうか助けて下さい。
0341デフォルトの名無しさん
2008/01/22(火) 03:46:180342デフォルトの名無しさん
2008/01/22(火) 05:29:02初期化子に親クラスで定義されている変数を引数として使えないことを知らなかった…
親クラスに少し手を加えて自己解決しました
0343デフォルトの名無しさん
2008/01/22(火) 08:50:360344デフォルトの名無しさん
2008/01/22(火) 10:23:40実装によってはwchar_tのサイズは2byteなようですが、これはサロゲートペアは
どのような扱いになるのでしょうか?
1.サロゲートペアは見なかったことにする。結果サロゲートペアが必要な文字は文字化けする。
2.サロゲートペアも適切に処理。結果文字列の長さが変わる。
0345デフォルトの名無しさん
2008/01/22(火) 11:29:00それの行と列を入れ替えるようなプログラムを考えています。
教科書を見たところ、1次元配列についてはfgets,fgetcを使えばいいという事はわかったのですが
多元配列になると、そもそもfgetsがどういうタイミングで一行を読み取るのかよくわかっていないので
for文の中にどうやって組み込めばいいのかわからず、さらには読み取ったものを
どうやって多元配列になおせばいいのかわかりません。
とりあえず自分で試行錯誤してみたのを張っておきます
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5857.txt
0346デフォルトの名無しさん
2008/01/22(火) 12:18:450347デフォルトの名無しさん
2008/01/22(火) 12:54:320348デフォルトの名無しさん
2008/01/22(火) 12:59:32#define AL2TL(x) TEXT(##x##)
#define __TFILE__ AL2TL(__FILE__)
とか
0349デフォルトの名無しさん
2008/01/22(火) 13:13:53予約語みたいで青くなるんですけど。
.NETの予約語みたいなんで使ってもいいですか?
0350デフォルトの名無しさん
2008/01/22(火) 13:19:14wchar_tの中身がUnicodeとは限らないので、その質問は一般的には無意味。
で、Windows環境は確かにwchar_tは2バイトなんだけど、サロゲートペア
が問題になるかどうかはどういう処理をするかに依存するので、やるこ
とをもっと具体的に書いたほうがいいかも。
0351デフォルトの名無しさん
2008/01/22(火) 13:21:480352デフォルトの名無しさん
2008/01/22(火) 14:18:45合成文字も考えなきゃだめだよね?
もう,ウンコでそう.
0353デフォルトの名無しさん
2008/01/22(火) 15:22:270354デフォルトの名無しさん
2008/01/22(火) 18:39:31whereは予約語になる予定だったが
よく使われていたので却下された。よって使ってよし
0355デフォルトの名無しさん
2008/01/22(火) 19:09:070356デフォルトの名無しさん
2008/01/22(火) 19:38:530357デフォルトの名無しさん
2008/01/22(火) 22:06:55確かに仕様ではwchar_tの中身もサイズも未定義でした。すいません。
やりたいことは、UTF-8のテキストをFreeTypeに突っ込みたいのですが、よくよく考えたら
FT_Get_Char_Indexの引数はFT_ULongで32ビットでした。
サロゲートペア関係ありませんでしたねOTL
0358デフォルトの名無しさん
2008/01/23(水) 15:19:28typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \ ←これ
_x > _y ? _x : _y; } )
上記の4行目だけ良く判りません。
これは、変数_x と _y の格納場所アドレスが同じ場合、
真(1)になるという意味だと思いますが、文がここで終わって
まして、このような場合どのように解釈されるんでしょうか?
0359デフォルトの名無しさん
2008/01/23(水) 15:33:22落とすための仕掛けじゃないかという気がする。確かめたわけじゃ
ないからほんとにそうなるかわかんないけど。
0360358
2008/01/23(水) 15:53:12確かにありの場合だけ
warning: comparison of distinct pointer types lacks a cast
が出ました。なるほどー
ちなみに、_x > _y でも比較を行っていると思うのですが、ここでは弾かれないんですね…
0361デフォルトの名無しさん
2008/01/23(水) 15:55:44ポインタだとそれがない。
0362358
2008/01/23(水) 16:03:060363デフォルトの名無しさん
2008/01/24(木) 13:08:33しかしアーカイバで対応しているものがあります
C言語ではどのようにやればいいのかわかりますか
0364デフォルトの名無しさん
2008/01/24(木) 13:13:150365デフォルトの名無しさん
2008/01/24(木) 13:15:210366デフォルトの名無しさん
2008/01/24(木) 14:25:200367デフォルトの名無しさん
2008/01/24(木) 14:25:380368デフォルトの名無しさん
2008/01/24(木) 14:29:540369デフォルトの名無しさん
2008/01/24(木) 16:00:550370デフォルトの名無しさん
2008/01/24(木) 19:33:000371デフォルトの名無しさん
2008/01/24(木) 19:37:22a + b = (a and b, a xor b)_(2)
ですが32bitはどうすればいいですか
0372デフォルトの名無しさん
2008/01/24(木) 19:41:31ttp://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8#.E8.A4.87.E6.95.B0.E3.83.93.E3.83.83.E3.83.88.E3.81.AE.E5.8A.A0.E7.AE.97.E5.99.A8
0373デフォルトの名無しさん
2008/01/24(木) 19:42:57何も考えずに、一番簡単なやり方でやろうと思えば、64bit整数にキャストして足し算してしまうことだな。
後は(a+b) と aの大小を比較するとか。
0374デフォルトの名無しさん
2008/01/24(木) 19:45:230375デフォルトの名無しさん
2008/01/24(木) 19:48:02C言語は、1bit単位の変数ないし、加算器をソフトウェアで実装すると鈍いです
速い方法ないですか
0376デフォルトの名無しさん
2008/01/24(木) 19:50:15↓
a > INT_MAX - b
0377デフォルトの名無しさん
2008/01/24(木) 19:51:390378デフォルトの名無しさん
2008/01/24(木) 19:53:060379デフォルトの名無しさん
2008/01/24(木) 19:57:070380デフォルトの名無しさん
2008/01/24(木) 19:58:15aとbの符号が異なれば、オーバーフローすることはない。
同符号の場合、aやbの符号とa + bの符号が異なれば、オーバーフローしている。
0381デフォルトの名無しさん
2008/01/24(木) 19:59:570382370
2008/01/24(木) 20:02:29unsigned intだとします 桁上がりが起こるならどちらかの31bit目が1です
2^32からその数を引けばあといくつで桁上がりするかわかります
そこで2の補数を求めてから2つの数を足してみて、31bit目が1なら負なので桁上がりしません
0383デフォルトの名無しさん
2008/01/24(木) 20:03:00xor edx, edx
add eax, b
setc dl
もうこれでええっしょ。
0384370
2008/01/24(木) 20:10:100385デフォルトの名無しさん
2008/01/24(木) 20:10:120386デフォルトの名無しさん
2008/01/24(木) 20:13:440387370
2008/01/24(木) 20:17:58のあとにOFはどうすれば調べられるんですか
0388デフォルトの名無しさん
2008/01/24(木) 20:18:430389デフォルトの名無しさん
2008/01/24(木) 20:21:59これでどうよ?
シフト2回入っちゃうけど。
0390370
2008/01/24(木) 20:27:42下位1bitの桁上がりを求めて、1bitシフトさせたものに加えれば桁上がりがわかりますね
サンクス
0391デフォルトの名無しさん
2008/01/24(木) 20:29:19ちゃんと実測してソースつきで報告よろ。
0392デフォルトの名無しさん
2008/01/24(木) 20:41:430393デフォルトの名無しさん
2008/01/24(木) 20:44:210394370
2008/01/24(木) 20:58:30#include <iostream>
#include <time.h>
using namespace std;
#define N 1000000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[3],s=0;
for(n=0;n<3;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<200;k++){
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"if文の速度 "<<clsum[0]<<endl;
cout<<"if無しの速度1 "<<clsum[1]<<endl;
cout<<"if無しの速度2 "<<clsum[2]<<endl;
}
0395デフォルトの名無しさん
2008/01/24(木) 20:59:260396デフォルトの名無しさん
2008/01/24(木) 21:00:270397デフォルトの名無しさん
2008/01/24(木) 21:00:39条件式だ。
0398デフォルトの名無しさん
2008/01/24(木) 21:08:11#include <iostream>
#include <time.h>
using namespace std;
#define N 10000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[3],s=0;
for(n=0;n<3;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<30000;k++){
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"if文の速度 "<<clsum[0]<<endl;
cout<<"if無しの速度1 "<<clsum[1]<<endl;
cout<<"if無しの速度2 "<<clsum[2]<<endl;
cout<<(s&1);
}
0399デフォルトの名無しさん
2008/01/24(木) 21:13:15#include <time.h>
#define N 10000000
int main() {
unsigned a, b=0;
int k;
int cl, clsum[2] = {0};
for(k=0;k<200;k++) {
cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl;
}
printf("条件式 : %d\n", clsum[0]);
printf("ビット演算: %d\n", clsum[1]);
printf("%u\n", b);
return 0;
}
条件式 : 1004
ビット演算: 1235
1
0400デフォルトの名無しさん
2008/01/24(木) 21:14:47条件式 : 600
ビット演算: 677
MacOSX Core2Duo 2.16GHz gcc -O2
0401デフォルトの名無しさん
2008/01/24(木) 21:17:28#include <time.h>
#define N 10000000
int main() {
unsigned a, b=0;
int k;
int cl, clsum[3] = {0};
for(k=0;k<200;k++) {
cl=clock(); for(a=0;a<N;a++)b+=(a>=(unsigned)-b); clsum[0]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))&0x80000000u; clsum[1]+=clock()-cl;
cl=clock(); for(a=0;a<N;a++)b+=((a>>1)+(b>>1)+(a&b&1u))>>31; clsum[2]+=clock()-cl;
}
printf("条件式 : %d\n", clsum[0]);
printf("ビット演算1: %d\n", clsum[1]);
printf("ビット演算2: %d\n", clsum[2]);
printf("%u\n", b);
return 0;
}
条件式 : 566
ビット演算1: 672
ビット演算2: 701
やっぱり条件式が一番速い。
0402デフォルトの名無しさん
2008/01/24(木) 21:20:42勝手にメンバとか付け足してもいいですか?
たとえばHRESULTとか
0403デフォルトの名無しさん
2008/01/24(木) 21:20:57いかんせん式が複雑すぎたな。
0404デフォルトの名無しさん
2008/01/24(木) 21:21:23お好きにどうぞ
0405デフォルトの名無しさん
2008/01/24(木) 21:21:51という問題が出たんですが。
先生とのメールのやりとり↓
私「筆算の方法で行う」
先「積は和の繰り返しで表すこともできます」
私「最初の数値を次の数値分だけ足し算する
(2×3 = 2+2+2)」
先「桁数が多い場合単純に繰り返すだけではだめです」
どうすればいいでしょうか(:_;)
お願いします
0406デフォルトの名無しさん
2008/01/24(木) 21:22:470407デフォルトの名無しさん
2008/01/24(木) 21:24:431248
1108
1425
となる
BCC5.5では
1931
2878
2160
0408デフォルトの名無しさん
2008/01/24(木) 21:24:430409407
2008/01/24(木) 21:28:38829
1236
1841
同一スペックで>>398を動かしたとき
0410デフォルトの名無しさん
2008/01/24(木) 21:37:26ウチではこうなった。
1245
688
1302
0411デフォルトの名無しさん
2008/01/24(木) 21:38:58ウチではこうなった。
if文の速度 100
if無しの速度1 111
if無しの速度2 107
0412デフォルトの名無しさん
2008/01/24(木) 21:40:17if文の速度 896
if無しの速度1 1008
if無しの速度2 1061
0413407
2008/01/24(木) 21:47:10#include <iostream>
#include <time.h>
using namespace std;
#define N 10000
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
main(){
unsigned int *a=new unsigned int [N];
unsigned int *b=new unsigned int [N];
int n,cl,clsum[4],s=0,t=0;
for(n=0;n<4;n++)clsum[n]=0;
for(n=0;n<N;n++){ a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<30000;k++){
cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"比較演算の速度 "<<clsum[0]<<endl;
cout<<"論理演算の速度1 "<<clsum[1]<<endl;
cout<<"論理演算の速度2 "<<clsum[2]<<endl;
cout<<"単純な論理演算の速度 "<<clsum[3]<<endl;
cout<<(s&t&1);
}
0414407
2008/01/24(木) 21:49:39Nはランダムの2数を確保する数なので大きくすると
純正のメモリ外に書き込まれる可能性が出てきてしまいます
増やすときは、kの繰りかえし数を上げてみて下さい
0415デフォルトの名無しさん
2008/01/24(木) 21:53:01ううん。微妙な結果。
if文の速度 1004
if無しの速度1 996
if無しの速度2 1112
0416デフォルトの名無しさん
2008/01/24(木) 21:58:55#include <iostream>
#include <time.h>
using namespace std;
#define kukikaesi 300000
main(){
#define N 1000
unsigned int a[N],b[N];
int n,cl,clsum[4],s=0,t=0;
for(n=0;n<4;n++)clsum[n]=0;
for(n=0;n<N;n++){
#define rd() (rand()&255)
#define rnd() rd()+(rd()<<8)+(rd()<<16)+(rd()<<24)
a[n]=rnd(); b[n]=rnd();}
for(int k=0;k<kukikaesi;k++){
cl=clock();for(n=0;n<N;n++)t|=a[n]&b[n]&1;clsum[3]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=(a[n]>UINT_MAX-b[n]);clsum[0]+=clock()-cl;
cl=clock();for(n=0;n<N;n++)s+=((a[n]>>1)+(b[n]>>1)+(a[n]&b[n]&1))>>31;clsum[1]+=clock()-cl;
cl=clock();for(n=0;n<N;n++){static unsigned int x=a[n],y=b[n];s+=((x>>1)+(y>>1)+(x&y&1))>>31;}clsum[2]+=clock()-cl;
}
cout<<"比較演算の速度 "<<clsum[0]<<endl;
cout<<"論理演算の速度1 "<<clsum[1]<<endl;
cout<<"論理演算の速度2 "<<clsum[2]<<endl;
cout<<"単純な論理演算の速度 "<<clsum[3]<<endl;
cout<<(s&t&1);
}
0417デフォルトの名無しさん
2008/01/24(木) 22:02:210418デフォルトの名無しさん
2008/01/24(木) 22:04:48VC++2008EE Debugビルド
Vista Athlon Dual 4400+ 2.31GHz
比較演算の速度 2030
論理演算の速度1 2678
論理演算の速度2 1948
単純な論理演算の速度 1817
0419デフォルトの名無しさん
2008/01/24(木) 22:32:23#include <iostream>
int main() {
double a = 3.55;
int n = a * 100;
std::cout << n << std::endl;
return 0;
}
これの出力が354になります。355ではなく354になるのはどうしてなのでしょうか?
0420デフォルトの名無しさん
2008/01/24(木) 22:40:51詳しい解説が読みたければ「浮動小数点 誤差」くらいでぐぐってみれ。
0421デフォルトの名無しさん
2008/01/24(木) 22:42:28回数分足すのはさすがに重いだろ
一桁ずつ掛けて、そのあと和の繰り返しを使うんじゃないのか?
例えば112×235なら
5×112=560
3×112=336
2×112=224
560+3360+22400=26320
とか
まあ俺の力じゃプログラムは作れないけどなw
0422デフォルトの名無しさん
2008/01/24(木) 22:43:32VC++ 2008 では355になる。
0423デフォルトの名無しさん
2008/01/24(木) 22:44:310424デフォルトの名無しさん
2008/01/24(木) 22:45:27a * 100 ではintの100がdoubleに昇格して計算されて結果もdoubleだろ。
355になった後でintに変換されるから関係ないと思うんだが。
0425デフォルトの名無しさん
2008/01/24(木) 22:46:190426デフォルトの名無しさん
2008/01/24(木) 22:47:56おお、そういうことか。あくまでも近似値なんだよな。
0427デフォルトの名無しさん
2008/01/24(木) 22:49:05単に0.75を掛けて少数切捨てするより効率がよくて速度出る計算方法がありますかね
BYTE >> 1 のようなもの(これは1/2ですが…)があれば教えていただけませんか?
0428デフォルトの名無しさん
2008/01/24(木) 22:51:59それ思いっきり筆算じゃね?
>>405
先生が何させたいかさっぱりわからんのだわ。
50桁くらいならFFTとか組むより筆算で十分な速度でる。
多倍長演算なら↓みたいなアルゴリズムのサイトあるけど
さすがにそんなとこまで求めてないと思うんだよな。
http://poset.jp/ompa/index.html
0429デフォルトの名無しさん
2008/01/24(木) 22:56:19コンパイラの最適化に任せる。
整数で処理する(最適化に負けるかもしれない)
int value = 123456;
value = value * 75 / 100;
シフト演算で頑張ってみる(1/2+1/4なので)
int value = 123456;
value = value >> 1 + value >> 2
0430デフォルトの名無しさん
2008/01/24(木) 22:56:25(BYTE)(((WORD)x) * 3 / 4)
0431デフォルトの名無しさん
2008/01/24(木) 22:56:53(BYTE + BYTE << 1) >> 2
0432デフォルトの名無しさん
2008/01/24(木) 22:59:310433デフォルトの名無しさん
2008/01/24(木) 23:00:15おおいろいろ方法があるんですね
みなさんありがとうございます!
早速試してみますね
0434デフォルトの名無しさん
2008/01/24(木) 23:02:56スマン思いっきし筆算だった
0435デフォルトの名無しさん
2008/01/24(木) 23:07:3510 の位 = (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 1 の位
100 の位 = 1 の位と 100 の位の積の 1 の位 + 10 の位の積の 1 の位 + (1 の位と 10 の位の積の 1 の位 + 1 の位の積の 10 の位) の 10 の位
:
:
:
0436デフォルトの名無しさん
2008/01/24(木) 23:08:23俺が思うに
お前の筆算の仕方が間違ってたんじゃないのか
筆算以外にやりようないと思うんだが
0437405
2008/01/24(木) 23:29:58>>421 みたいなやりかたどうやるんですか?
ぼくのだと
「112*235=560+336+224=1120」になっちゃいます
0438デフォルトの名無しさん
2008/01/24(木) 23:31:59つーか、どうせならインド式実装してみたら?
0439デフォルトの名無しさん
2008/01/24(木) 23:34:320440デフォルトの名無しさん
2008/01/24(木) 23:36:15つーか、大抵の場合は std::vector 使っておけば問題ない。
0441デフォルトの名無しさん
2008/01/24(木) 23:36:37嫌になるほど繰り返し質問されていることですが、ありません。
newなんて使わずにstd::vectorを使いましょう。
0442デフォルトの名無しさん
2008/01/24(木) 23:36:460443デフォルトの名無しさん
2008/01/24(木) 23:37:560444デフォルトの名無しさん
2008/01/24(木) 23:38:180445デフォルトの名無しさん
2008/01/24(木) 23:39:02そういう事はむやみに教えると悪い影響与えそうで困る。
0446デフォルトの名無しさん
2008/01/24(木) 23:40:030447デフォルトの名無しさん
2008/01/24(木) 23:40:190448439
2008/01/24(木) 23:40:370449デフォルトの名無しさん
2008/01/24(木) 23:42:03using namespace std;
main(){
vector < int > a(100);
a[0]=1; a[1]=2;
}
0450デフォルトの名無しさん
2008/01/24(木) 23:43:36main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type
lipo: can't figure out the architecture type of: /var/tmp//ccLa7Foj.out
make: *** [debug/main.o] Error 1
0451デフォルトの名無しさん
2008/01/24(木) 23:48:580452デフォルトの名無しさん
2008/01/24(木) 23:52:000453デフォルトの名無しさん
2008/01/24(木) 23:58:430x1234abcd の値をメモリーに格納する際、下位アドレスから順に、cd ab 34 12 と入りますが、
ここで疑問なのが、1バイトの中身のビット列はどのように扱われているのか?という点です。
1バイト8bit分のデータは、エンディアンにかかわらず常に、例えば 0x12 は、00010010 のビット列
が保たれているのでしょうか?
0454405
2008/01/25(金) 00:03:17筆算の問題、
>>421
みたいに全部かけた後にまとめて足すってできるんですか?
それとも2桁ずつ掛け算して足してかないとむり?
例えば123*123だったら
123*3=369
123*2=246
→369+2460=2829
123*1=123
→2829+12300=15129
0455デフォルトの名無しさん
2008/01/25(金) 00:07:35421のやりかたでできるだろ
下のだとめんどくさくないか?
よくわからんのだが
0456デフォルトの名無しさん
2008/01/25(金) 00:21:15エンディアンは多バイトデータの配置の種類
1バイトは関係ない(同じ内容になる)
0457デフォルトの名無しさん
2008/01/25(金) 00:29:571バイトがどのように格納されていようが、
どうせ1バイト単位でしかメモリアクセスできないのだから、
違いは観測できないだろ。
0458457
2008/01/25(金) 00:34:100459デフォルトの名無しさん
2008/01/25(金) 00:40:270460デフォルトの名無しさん
2008/01/25(金) 00:41:05hoge.txtという名前のテキストファイルを作るプログラムで
同じフォルダの中にすでにhoge.txtという名前のテキストファイルがあったら
もともとあったテキストファイルの名前をhoge1.txtとして変えて新しく作るテキストファイルを
hoge.txtとすることはできるでしょうか。
できる場合はどうしたらいいでしょうか。
0461デフォルトの名無しさん
2008/01/25(金) 00:45:23hoge.txtがあるかどうかを調べる
あったらファイル名を変更する
hoge.txtを作る
System("if exist ren hoge.txt hoge1.txt");っていけるのかな?
0462デフォルトの名無しさん
2008/01/25(金) 00:51:48すばやい回答ありがとうございました。
早速とりかかってみたいと思います。
0463デフォルトの名無しさん
2008/01/25(金) 00:54:52とりあえず10桁で作ってやったぞ。わからんとこあったら聞いてくれ。
#define N 10
int main( void )
{
int a[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int b[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210
int result[ N * 2 ] = { 0 }; // 9876543210*9876543210=97546105778997104100
for ( int i = 0; i < N; i++ ) {
for ( int j = 0; j < N; j++ ) {
result[ i + j ] += ( a[ i ] * b[ j ] );
for ( int k = i + j; k < N * 2 - 1; k++ ) {
if ( result[ k ] < 10 ) break;
result[ k + 1 ] += result[ k ] / 10;
result[ k ] %= 10;
}
}
}
for ( int i = N * 2 - 1; i >= 0; i-- ) {
printf( "%d", result[ i ] );
}
return 0;
}
0464デフォルトの名無しさん
2008/01/25(金) 01:30:19#define kosu 4
add(unsigned int *a, unsigned int *b, unsigned int *c){
int ketaagari=0;
for(int n=0; n<kosu; n++){
c[n]=a[n]+b[n]+ketaagari;
ketaagari=a[n]>UINT_MAX-b[n];
}}
seki(unsigned int *a, unsigned int *b, unsigned int *c){
}
0465デフォルトの名無しさん
2008/01/25(金) 01:34:370466デフォルトの名無しさん
2008/01/25(金) 04:44:04これから単語の頻度を求めたいとします どのようにしたらいいでしょうか?
単語は最低4バイトのものを言います
配列でカウントできないし良い方法ありますか
0467デフォルトの名無しさん
2008/01/25(金) 04:46:060468デフォルトの名無しさん
2008/01/25(金) 04:49:00最低4バイトということは200Kバイトの単語がある可能性も考慮しないとだめですか?w
0469デフォルトの名無しさん
2008/01/25(金) 04:56:06厳密に求めなくて良いです 高頻度の単語が抽出出来ればいいです 1単語しかなければもとめなくていいです
0470デフォルトの名無しさん
2008/01/25(金) 05:01:152回目でたとえば100回以上出現したものの後ろ10バイトずつファイルに切り出して
そのファイルごとにしらべればいいか
0471デフォルトの名無しさん
2008/01/25(金) 07:23:25ありがとうございます。なので、
0.55, 1.55, 8.55 =>切り上げなので、上記現象なし
2.55 〜 7.55 =>切り下げなので、上記現象あり
なのですね。
ところで、上記質問をしてから色々調べたのですが、浮動小数点(例えばC言語のdouble)の
仮数部の丸めについて、丁度中間の場合は偶数になるように丸める、というルールが
あるらしいのですが、これは小数点の場合にどういう風に当てはまるのかわかりません。
これって二進数だと全部あてはまってしまうような気が、、、
どうなっているのでせうか
0472デフォルトの名無しさん
2008/01/25(金) 07:36:58いいえ。
0473デフォルトの名無しさん
2008/01/25(金) 11:27:52#include <stdlib.h>
#include <string.h>
void fileread(int,char * []);
int main(int argc ,char *argv[])
{ if(argc!=3){printf("次回から引数を入力してください\n");
return 0; }
if(!strcmp(argv[2],"r")){ fileread(argc,argv);
}
return 0;}
void fileread(int argc,char *argv[]){
FILE *fp;
char *buffer,*str,*n,*s;
fpos_t start_fpos;
int filesize,count=0;
fp=fopen(argv[1],"r");
fgetpos(fp,&start_fpos);
fseek(fp,0,SEEK_END);
filesize=ftell(fp);
fsetpos(fp,&start_fpos);
buffer=(char *)malloc(sizeof(char)*filesize);
str=(char *)malloc(sizeof(char)*1000);
printf("検索する文字列を入力してください\n");
scanf("%s",str);
while(s=fgets(buffer,filesize,fp)){
count++;
n=strstr(buffer,str);
if(n){printf("%d行目 %s",count,s) };
}
free(buffer);
fclose(fp);
}
0474473
2008/01/25(金) 11:30:38csvファイル検索プログラムを作ったのですが、ファイル名にワイルドカードが使えないので
実用性にかけます。上記のプログラムにワイルドカードの組み込むにはどうすればいいでしょうか?
ただし、ファイル名はmain関数の引数で取得いたします。_findfirst,_findnextを使うところまでは
なんとなく理解しました。
0475デフォルトの名無しさん
2008/01/25(金) 11:34:25環境は?
場合によっては wildargs とか使える場合もある
0476473
2008/01/25(金) 11:41:300477デフォルトの名無しさん
2008/01/25(金) 11:56:10そのままだとシェルが勝手に展開しない?
0478デフォルトの名無しさん
2008/01/25(金) 11:57:55またお前か。あちこちおかしなプログラムなのは相変わらずだな。
最低でも、バッファオーバフローの可能性は排除しておけよ。
0479473
2008/01/25(金) 12:20:12*.csvとかですね。
そのままでは無理でした。
>>478
その件については、なんか知らんけどプログラムができあがりました。
あらかじめ指定されている仕様でしか作ったらいけないことになっておりまして、
どのようにすればそのようにできあがるのか悩まされている次第です。
一応さきほどのプログラムは作りましたが、io.hは無いそうで、_findnextも使えないですね。
こういうときそのヘッダファイルをダウンロードしてヘッダファイルがたくさんあるところに放りこめばいけますか
0480デフォルトの名無しさん
2008/01/25(金) 12:37:23通常は、シェルが展開するんだが、、、opendir、readdir使って
正規表現で検索するとかしてみては
0481473
2008/01/25(金) 12:49:24ありがとうございます。
階層を一段間違えておりました。
普通に通りますね。よかった・・・
0482デフォルトの名無しさん
2008/01/25(金) 13:31:29int main() {
double d = 3.55; // ここの数字を変更する
int n = d * 100;
cout << n << endl;
return 0;
}
でも上記プログラムでは、浮動小数点の規格上、
d = 0.55, 1.55, 8.55 =>それぞれ0.5500000....1, 1.55000...1, 8.55000...1
とかになるので、100倍しても減ったように見えたりしない。
d = 2.55, 3.55, 4.55, 5.55, 6.55, 7.55 =>それぞれ2.5499999...などとなるので、
100倍すると、(double)254.99999==>(int)254などとなってしまう。
と理解していたのですが、他の方も書いてくれてたように、Visual C++ 2008でやると
d=3.55の時、355と表示されました。(gccは354)
0483デフォルトの名無しさん
2008/01/25(金) 17:29:42一旦64ビットでメモリに書きだすように仕向けてもやっぱり355になるな。
0484デフォルトの名無しさん
2008/01/25(金) 18:42:42std::vector buffer(1024);
hogefunc(&buffer[0]);
とかくのは違法ですか?
0485デフォルトの名無しさん
2008/01/25(金) 18:47:470486デフォルトの名無しさん
2008/01/25(金) 19:08:510487デフォルトの名無しさん
2008/01/25(金) 19:19:56vectorは生の配列同様、要素の連続性が保証されている。
0488デフォルトの名無しさん
2008/01/25(金) 19:41:51これみたいに。
ttp://msdn2.microsoft.com/ja-jp/library/k1f9b8cy(VS.80).aspx
0489デフォルトの名無しさん
2008/01/25(金) 20:07:37Win32APIスレの誤爆か?
0490デフォルトの名無しさん
2008/01/25(金) 20:51:13{
return __LINE__;
}
呼び出すと戻ってくるのはどこのあれですか?
0491デフォルトの名無しさん
2008/01/25(金) 20:52:040492デフォルトの名無しさん
2008/01/25(金) 20:59:020493デフォルトの名無しさん
2008/01/25(金) 21:01:390494デフォルトの名無しさん
2008/01/25(金) 21:02:180495デフォルトの名無しさん
2008/01/25(金) 21:09:16ectuo\
}{([8
]\@p :
dcdc
dcdcdcfvfv7qa11111111111111111111111111111111
mnbcadcfvghujk,ol9iikurf4ed333333333333333331W2E3TR4G56
0496デフォルトの名無しさん
2008/01/25(金) 21:38:0112w3e4rgt5h6789o0:^\
!"#$G%H&'()~*=~|
とにゅうりょくされます。
こしょうですか?
0497デフォルトの名無しさん
2008/01/25(金) 21:41:140498デフォルトの名無しさん
2008/01/25(金) 21:55:260499デフォルトの名無しさん
2008/01/26(土) 03:17:03Visual C++ Express 2008で英単語印刷ソフトを作っているのですが、
ウインドウに、ネットの検索欄のような入力欄を作ることは可能でしょうか?
それを使って単語の検索機能などを追加したいのですが・・・。
もしよろしければ教授ください。
0500デフォルトの名無しさん
2008/01/26(土) 03:55:070501デフォルトの名無しさん
2008/01/26(土) 09:28:53gccでも、-msse2オプションをつけてコンパイルすると、355を返すバイナリを作れました。
でも、80ビットでも、52ビットでも、切り捨てになるから、どちらでも同じと思うんですが。
なんでだろう。
0502デフォルトの名無しさん
2008/01/26(土) 11:06:09>482のコードだけなら、最適化で定数は事前(≒コンパイル時)計算されるから不思議ではない。
0503デフォルトの名無しさん
2008/01/26(土) 20:29:17以下のコードでも、dに3.55を入力すると、表示は354になりますが、
-msse2でコンパイルすると355になりました。
int main(int ac, char **av)
{
double d;
cin >> d;
int n = d * 100;
cout << n << endl;
return 0;
}
0504デフォルトの名無しさん
2008/01/26(土) 22:23:27関数テンプレートについてなんですが。
template<typename T>
void func(){
hoge = new T();
}
func<HogeClass>();
つう書き方に、何か問題はありますか?
一応BCCでは動いてるようなんですが、
検索しても基本的に引数のために使われていて、
こういう書き方を見つけられなかったので不安なんですが。
0505デフォルトの名無しさん
2008/01/26(土) 22:31:16全然問題ない。それができないならテンプレートの魅力が半減ですよ。
0506デフォルトの名無しさん
2008/01/26(土) 22:48:00どうもです。こういう使い方はやっぱり便利なんですね。
でも、混乱もしそう。使いこなせるよう精進します。
0507デフォルトの名無しさん
2008/01/26(土) 22:59:43手元のgccだとそのコードでも355になるよ。354になるときの値をprintf("%.20g", d * 100)で出してみて。
0508デフォルトの名無しさん
2008/01/27(日) 03:55:57教えてください。
0509デフォルトの名無しさん
2008/01/27(日) 04:19:520510デフォルトの名無しさん
2008/01/27(日) 04:20:230511デフォルトの名無しさん
2008/01/27(日) 04:34:30できれば\nが格納される読み方の例教えていただきたい
0512デフォルトの名無しさん
2008/01/27(日) 04:35:070513デフォルトの名無しさん
2008/01/27(日) 04:38:010514デフォルトの名無しさん
2008/01/27(日) 04:42:08ありがとうございます。
fgetsって\nの手前までしか格納されないかと思ってたけど\nもちゃんと入るんですね
とりあえず色々試してみることにします
0515デフォルトの名無しさん
2008/01/27(日) 04:44:40C++は…誰かお願い。
0516デフォルトの名無しさん
2008/01/27(日) 07:26:38C++のクラスをエクスポートする場合、純粋仮想クラスを利用するようですが、この際、
多重継承は可能なのでしょうか。具体的には以下のようなことをしたいのです。
class IFoo{
public:
virtual void fooFunc() = 0;
};
class IBar: public IFoo{
public:
virtual void barFunc() = 0;
}
class CFooFunc{
public:
virtual void fooFunc(){ /*...*/ }
};
class CBarFunc{
public:
virtual void barFunc(){ /*...*/ }
};
class CExport: public IBar, CFooFunc, CBarFunc{
};
__declspec(dllexport) IBar* createIBar(){
return new CExport();
}
__declspec(dllexport) IBar* deleteIBar( IBar* p ){
delete p;
}
0517デフォルトの名無しさん
2008/01/27(日) 09:21:25istream& istream::get(char& c)
istreambuf_iterator
unsetf ios::skipws and istream_iterator
0518デフォルトの名無しさん
2008/01/27(日) 09:55:57DLL でクラスを公開したいなら COM
0519デフォルトの名無しさん
2008/01/27(日) 12:57:31__declspec(dllexport) と __declspec(dllimport) を使おうぜ。
DLL と EXE で自動的に切り替えるマクロもあったけど忘れた。
0520デフォルトの名無しさん
2008/01/27(日) 14:30:070521デフォルトの名無しさん
2008/01/27(日) 14:33:05# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endif
0522デフォルトの名無しさん
2008/01/27(日) 15:45:56自分で作った方が細かい制御ができていいかもしれん。
0523デフォルトの名無しさん
2008/01/27(日) 17:48:380524デフォルトの名無しさん
2008/01/27(日) 18:11:43IA ← A の機能強化版として IB と B を別途作るとして、
IA
↑ ↑
IB A
↑ ↑
B
こういう継承したいけど無理っしょ?
仮想継承がないから・・・。
0525デフォルトの名無しさん
2008/01/27(日) 18:27:470526デフォルトの名無しさん
2008/01/27(日) 23:15:08ShiftJISに変換してxharに突っ込む処理を
STLだけで書くにはどう書けばいいですか?
0527デフォルトの名無しさん
2008/01/27(日) 23:26:27http://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
にあるけど、UTF16、ShiftJISと指定した
std::codecvtをどう取得するのかは知らない
0528デフォルトの名無しさん
2008/01/27(日) 23:48:39テンプレートは解決策の1つだとは思うけど、
ヘッダファイルに実装するのはどうもね・・・。
コードいじったときのコンパイル範囲が広くなると困るし。
0529デフォルトの名無しさん
2008/01/28(月) 00:07:400530デフォルトの名無しさん
2008/01/28(月) 00:09:31そのIAをIUnknown、Aを適当なインタフェースに置き換えれば、そんな例は山ほどある。
Aの実装をソースコードの形で手に入れられるなら、
普通にIBとAを多重継承して、細かいところを整えればいける。
0531デフォルトの名無しさん
2008/01/28(月) 00:28:36むむっ。詳しくお願いします。
0532デフォルトの名無しさん
2008/01/28(月) 01:31:57要は、本来Bでオーバーライドする必要のない関数も、B内から手動でAの実装を呼ぶようにすればいい。
インタフェースはメンバ変数ないから、キャスト関係くらいしか仮想継承の有無の違いはないといっても過言ではない。
struct IA : IUnknown {virtual HRESULT STDMETHODCALLTYPE FnA() = 0;};
struct A : IA {
virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**) {/*実装*/}
virtual ULONG STDMETHODCALLTYPE AddRef() {/*実装*/}
virtual ULONG STDMETHODCALLTYPE Release() {/*実装*/}
virtual HRESULT STDMETHODCALLTYPE FnA() {/*実装*/}
};
struct IB : IA {virtual HRESULT STDMETHODCALLTYPE FnB() = 0;};
struct B : A, IB {
virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**);
virtual ULONG STDMETHODCALLTYPE AddRef() {return A::AddRef();}
virtual ULONG STDMETHODCALLTYPE Release() {return A::Release();}
virtual HRESULT STDMETHODCALLTYPE FnA() {return A::FnA();} //オーバーライドしない気なら
virtual HRESULT STDMETHODCALLTYPE FnB() {/*実装*/}
};
HRESULT STDMETHODCALLTYPE B::QueryInterface(IID& riid, void** ppv) {
if (ppv == 0) {
return E_POINTER;
} else if (riid == IID_B) {
*ppv = static_cast<IB*>(this);
AddRef(); //直接A::AddRef()でも可
return S_OK;
} else {
return A::QueryInterface(riid, ppv);
}
}
Javaのインタフェースの仕様だとBでのAddRef以下のようなことを書く必要がなかった気がする、ちょっとうらやましい。
0533デフォルトの名無しさん
2008/01/28(月) 01:34:43うーん。委譲のコストが少し気になってしまいますね。
そんなもんなんでしょうか。
0534デフォルトの名無しさん
2008/01/28(月) 13:31:23<と==の2つを定義するのではなく、<=を定義しないとだめだったのですが、
そういうものなのですか?
0535デフォルトの名無しさん
2008/01/28(月) 13:33:46そもそも、'<='が「小なりイコール」であると言う意味から再定義するわけですから。
0536デフォルトの名無しさん
2008/01/28(月) 13:35:16つ[boost::operators]
0537デフォルトの名無しさん
2008/01/28(月) 14:14:23以下は違う関数だからねえ
operator<()
operator=()
operator<=()
<=を使うということはoperator<=()をコールするわけで。
0538デフォルトの名無しさん
2008/01/28(月) 16:23:28ありがとうございます。じゃあ自分クラスについては、なるべく「<=」は使わずに
<と==でなんとかするようにします。
boost::operatorsは、<と==をconst関数で定義して、publicでboost::operatorsを
継承すれば動きました。かなり便利そう。
ありがとうございました。
0539デフォルトの名無しさん
2008/01/28(月) 18:45:01#define TARGET_STRUCT hoge_struct
#define TARGET_STRUCT_STR ????????????
printf("type: %s\n", TARGET_STRUCT_STR );
printf("size: %d\n", sizeof(TARGET_STRUCT) );
表示
type: hoge_struct
size: 40
TARGET_STRUCTにあるhoge_struct部分は、任意の構造体名です。(色々変化します)
TARGET_STRUCT_STRが "hoge_struct" に(文字列)なるようにしたいのですが、
どんなマクロにすればいいのでしょうか?
0540デフォルトの名無しさん
2008/01/28(月) 18:52:07型名であるTARGET_STRUCTを元に、文字列なTARGET_STRUCT_STRを作りたいという意味です。
0541デフォルトの名無しさん
2008/01/28(月) 18:58:470542デフォルトの名無しさん
2008/01/28(月) 19:11:510543デフォルトの名無しさん
2008/01/28(月) 19:28:58なんとかするとかじゃなくて「<」と「==」から「<=」を作ればいいじゃんか。
「<」と「==」が定義されてるならば「<=」は↓のようになる。
return A < B || A == B;
boost::operatorsは内部でそういうことをやってるだけ。
0544デフォルトの名無しさん
2008/01/28(月) 21:53:36項書き換えを行うシステムを作るにあたって、今式の構造を木構造で表すことを考えています。
式は中値記法で書かれているので、基本的には一般的な構文木のように作ろうと思っています。
具体的には、ある内部ノードには演算子を格納し、その左と右の子供に項を格納するような2分木です。
2項演算を表現するのにはこれで十分なのですが、 (X, Y, Z) のような三つ組みも表現しなければならないのです。
子供を3つ持つような木を作って、三つ組みを表現するときだけ3つ目の子供に項を格納すれば表現は可能になるのですが、
頻繁に三つ組みが現れるわけではないので、余分な子供はあまり持たせたくないと思っています。
2分木で三つ組みを表現するうまい方法はないでしょうか。
0545デフォルトの名無しさん
2008/01/28(月) 21:56:16A1
∧
X A2
∧
Y Z
みたいにすればいいんじゃない?
0546デフォルトの名無しさん
2008/01/28(月) 22:00:040547デフォルトの名無しさん
2008/01/28(月) 22:01:13それぞれは、
・自分の子供のひとつ(長男)
・自分のすぐ下の弟
を指すようにすれば2分木でいくらでも子供を持てる。
これは木構造を作るのに定番の方法なので覚えておくといいよ。
0548デフォルトの名無しさん
2008/01/28(月) 22:44:46intみたいに予約語なのかなとも思ったんだけど、特に問題なく動くんですが、青くなるのはなんでなんでしょう?
0549デフォルトの名無しさん
2008/01/28(月) 22:50:10arrayはCLR配列の予約語だからじゃない?
0550デフォルトの名無しさん
2008/01/28(月) 22:59:40即レスありがとうございます!
ほうほう、CLR配列で調べると確かに予約語っぽいですね。でも問題なしと考えてよいんでしょうか。
ついでにうかがいたいんですが、ちょい前までVC++6.0でつくっていたソースコードがあって、関数の引数にbool型をつかっていました。
そのソースを2005でダイアログベースで作っているプロジェクトで利用しようと思ったんですが、チェックボックスのValueがBOOL型になってまして、そのまま関数の引数にぶち込むと、次のように怒られました。
>warning C4800: 'BOOL' : ブール値を 'true' または 'false' に強制的に設定します (警告の処理)
これはどうすればよいんでしょう?
0551デフォルトの名無しさん
2008/01/28(月) 23:02:56とか。BOOLってintだからなー。
TRUE/FALSEの代わりに「エラー値」が入ってたりするし。
0552デフォルトの名無しさん
2008/01/28(月) 23:09:57うわぁお!!
すげー、通りました、感動しています。
しかし6.0から2005にするといろいろ戸惑いますね。作業効率が半分くらいになった感じです。
0553デフォルトの名無しさん
2008/01/28(月) 23:37:08そうですね、こちらでも考えましたが、このような木の構造にするしかなさそうですね。
>>547
アドバイス有り難うございます。
処理系を作るときに、こういう形で構文木を作るとネストされたリストも簡単に表現できるということで、
勉強したことがありました。確かに自分もよく使います。
お二方、どうも有り難うございました。
0554デフォルトの名無しさん
2008/01/29(火) 00:09:406.0から2005だと色々変えないといけないところが出てくるだろうな。
new 失敗した時デフォで NULL 返すような古いコンパイラだからなあ。
まあ、変更が終われば大した違いはなくなると思うぜ。
0555デフォルトの名無しさん
2008/01/29(火) 00:46:03LONG b=適当;
LONG c=適当;
if(a*a + b*b > c*c) {
}
とした時に、
a*a等がLONGに収まる範囲を超えてしまったら、
どうなるのでしょうか?
0556デフォルトの名無しさん
2008/01/29(火) 00:56:45LONGがlongのtypedefなら未定義
0557デフォルトの名無しさん
2008/01/29(火) 01:22:400558デフォルトの名無しさん
2008/01/29(火) 01:23:49gilを使ってください
0559555
2008/01/29(火) 01:32:29Win32APIを使ったプログラムで、
LONGは<windows.h>に定義されているモノです。たぶん。
未定義というのは、どうなるか分からないということですか。
0560デフォルトの名無しさん
2008/01/29(火) 01:33:46http://2chcity.myminicity.com/
ランク 国名 街 人口 (前日比) 前日
--- 1 US1 LUELand 326354 (+211) 326143
--- 2 US2 GoonTown 179482 (+711) .178771
--- 3 Germany1 .isnichwahr.de 119091 (-654) 119745
--- 4 US3 CreateMyCity Forum .87380 (+1982) 85398
--- 5 Poland1 #debian.pl 79594 (+1043) .78551
--- 6 Germany2 upOTia 52443 (+399) 52044
--- 7 France1 Reze'Les Nantes .41960 (+246) 41714
--- 8 Canada1 J-C Satanas & CO .40995 (+721) 40274
--- 9 US4 retromundi .40604 (+788) 39816
--- 10 France2 FanaZ .39902 .(+1268) 38634
2↑ 11 Germany3 deluxebits 38770 .(+3199) 35571
1↓ 12 US5 .isnichwahr.at .38234 (+78) 38143
1↓ 13 France3 gravure-news .37204 .(+765) 36439
2↑ 14 Japan1 2ch_city 35637 .(+1970) 33667
1↓ 15 Spain1 Media-Vida .35205 .(+686) 34519
1↓ 16 France4 Sguy .35083 .(+1456) 33626
2↓ 17 Ireland1 .prapikilty .35067 .(+871) 34196
--- 18 Spain2 benidaver .34505 .(+914) 33591
--- 19 Germany4 directupload ..32490 .(+82) .32408
-↑ 20 Slovakia1 Legionar City 32056
0561デフォルトの名無しさん
2008/01/29(火) 01:36:39そういうことです。
0562デフォルトの名無しさん
2008/01/29(火) 05:15:49SSE2命令で計算するとどうして3.55*100が355になるのか、どうしてもわかりません。
IEEEの仕様どおりの浮動小数点の計算方法だと、レジスタのサイズが52でも80でも128でも
doubleの3.55は実際には2.54999999...となってしまうと思うのですが、、、
gccでSSE2命令を有効にして作成したバイナリの逆アセンブルの結果をみると、
<元ソース>
int main(void) {
double d = 3.55;
int n = d * 100;
printf("%d", n);
}
<続く>
0563デフォルトの名無しさん
2008/01/29(火) 05:17:36<main関数の逆アセンブル結果>
80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx
80483c8: 83 e4 f0 and $0xfffffff0,%esp
80483cb: ff 71 fc pushl -0x4(%ecx)
80483ce: 55 push %ebp
80483cf: 89 e5 mov %esp,%ebp
80483d1: 51 push %ecx
80483d2: 83 ec 24 sub $0x24,%esp
80483d5: dd 05 d8 84 04 08 fldl 0x80484d8
80483db: dd 5d e8 fstpl -0x18(%ebp)
80483de: dd 45 e8 fldl -0x18(%ebp)
80483e1: dd 05 e0 84 04 08 fldl 0x80484e0
80483e7: de c9 fmulp %st,%st(1)
80483e9: dd 5d e0 fstpl -0x20(%ebp)
80483ec: f2 0f 2c 45 e0 cvttsd2si -0x20(%ebp),%eax
<以下はprintfを呼んでいるだけと思うので略>
をみてもなんでこうなるのか全然わかりません。
cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
中でどういう動作をしてるのだろう。誰かご存知ありせんか?
長々とすいませんどうかよろしくお願いします。
0564デフォルトの名無しさん
2008/01/29(火) 05:26:47と書いてあるから3.54になるはずなのに変だねえ。
0565デフォルトの名無しさん
2008/01/29(火) 08:06:51逆アスじゃなく、gccのアセンブリ出力を載せてくれ。0x080484d8なんてアドレス書かれてもなんだか判らん。
0566デフォルトの名無しさん
2008/01/29(火) 09:06:52すいません。Cのコードは先のものと同じです。
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
fldl .LC0
fstpl -24(%ebp)
fldl -24(%ebp)
fldl .LC1
fmulp %st, %st(1)
fstpl -32(%ebp)
cvttsd2si -32(%ebp), %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC2, (%esp)
call printf
<以下略>
0567デフォルトの名無しさん
2008/01/29(火) 09:35:250568デフォルトの名無しさん
2008/01/29(火) 10:46:51> cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに
> コピーします。」という内容らしいので、この動作がキモと思うのですが、これは
> 中でどういう動作をしてるのだろう。誰かご存知ありせんか?
ここまでくるとCPUアーキテクチャマニュアル見ないとわからん。
Intelのサイトにあると思うが、日本語であるかどうかわからん。
0569デフォルトの名無しさん
2008/01/29(火) 11:03:35F2 0F 2C /r xmm/m64 切り捨てを使用して、xmm/m64の 1 つの倍精度浮動小数点値を r32 の 1 つの符号付きダブルワード整数に変換する。
説明
ソース・オペランド(第 2 オペランド)の 1 つの倍精度浮動小数点値を、デスティネーション・
オペランド(第 1 オペランド)の 1 つの符号付きダブルワード整数に変換する。ソース・オペ
ランドは、XMM レジスタまたは 64ビットのメモリ・ロケーションである。デスティネーショ
ン・オペランドは汎用レジスタである。ソース・オペランドが XMM レジスタの場合は、倍精
度浮動小数点値はレジスタの下位クワッドワードに置かれる。
変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。変換の結果が
符号付きダブルワード整数の最大値より大きくなる場合は、整数不定値(80000000H)が返さ
れる。
0570デフォルトの名無しさん
2008/01/29(火) 12:08:40自分もマニュアル見てみました。
結局動作としては、
1)3.55を80bitのレジスタ上で表現する。レジスタ上では3.55よりもわずかに小さい数として存在
2)fmulp命令を使って、1)の結果と100の積を計算する。
3)上の2)の結果をcvttsd2si命令を使ってint型に変換
になると。
>変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。
354.99999..からintへの変換はどう考えても「変換が不正確な場合は、」に該当すると思うのですが、
切り捨てると、354になると思うんですが、、、
0571デフォルトの名無しさん
2008/01/29(火) 12:54:22-msse2付きでコンパイルしても、不正確になってしまうケースがありました。
int main(void) {
double d = 32.55;
int n = d * 100;
printf("%d\n", n);
return 0;
}
あとは、512.55, 513.55とか、8192.55, 8193.55とか。(これ以外にもかなり多い)
SSE2を使ったところで完全ではないようだし、なんだか不毛な感じもしてきた。
3.55については、たまたまSSE2で上手く計算できたケース、ということかな、と。
0572デフォルトの名無しさん
2008/01/29(火) 13:05:19>567
手元の多桁演算処理に喰わせてみようと思うのだが……
0573デフォルトの名無しさん
2008/01/29(火) 13:12:09-O0で354、-O1で355になりました。
コンパイラはg++3.4.5です。
ソースコードをのぞいてみると、-O0は律儀に計算していましたが、
-O1の方はいきなり定数355をロードして終了していました。
0574デフォルトの名無しさん
2008/01/29(火) 13:12:41.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC2:
.ascii "%d\12\0"
LC3:
.ascii "pause\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $16, %eax
call __alloca
call ___main
movl $355, 4(%esp) ←これ
movl $LC2, (%esp)
call _printf
movl $LC3, (%esp)
call _system
movl $0, %eax
leave
ret
.def _system; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
0575デフォルトの名無しさん
2008/01/29(火) 20:52:370576デフォルトの名無しさん
2008/01/29(火) 20:58:180577デフォルトの名無しさん
2008/01/29(火) 22:19:04プログラム関係の職(未経験可)どうしてもやってみたくて
就こうと思ってるんだけど理系学校出てないから無謀かな…
スレ違いだったら凄くすいません…
0578デフォルトの名無しさん
2008/01/29(火) 22:21:270579デフォルトの名無しさん
2008/01/29(火) 22:22:16どんな人も1から覚えるわけだが。
0580デフォルトの名無しさん
2008/01/29(火) 22:26:36勉強できるから、やってみればいいんじゃないか。
難しいかどうかは、人によるからなんとも言えない。
また、理系かどうかは思ったより関係ない。
ただし、数字アレルギーとか英語まったく読む気ないですぅとか言うなら、
やめた方がいいと思う。
0581デフォルトの名無しさん
2008/01/29(火) 23:00:31理系ってのも大事だなあと思う。
0582デフォルトの名無しさん
2008/01/29(火) 23:06:11プログラマ板か…、予備知識無くここにカキコんじゃったからな…
次からそっちで聞いてみます
>>579
まぁそうなんですよね…<どんな人も1から
それを承知で聞いてみたんで
>>580
色々サイト巡りして知識付けようとはしてます
数字アレルギーは全く無いけど、英語が学校成績で常に2付近だったから
それが不安材料でヤバイってのは承知済み…orz
今度からプログラマ板でも行ってカキコしてみます
レスどうもでしたm(__)m
0583デフォルトの名無しさん
2008/01/29(火) 23:12:350584デフォルトの名無しさん
2008/01/29(火) 23:14:29まあ相性と経験次第。
0585デフォルトの名無しさん
2008/01/29(火) 23:44:01理系でもひでー奴はいくらでもいる。
>>582
> 英語が学校成績で常に2付近だったから
>>580 をよく読んでくれ、英語ができないんじゃなくて、
「英語をまったく読む気がない」ならって書いてあるだろ。
君が必要に迫られたら何とかするタイプなら、心配はない。
>>583-584 が言うように、そんなに高レベルの英語が出て
くるわけじゃないし、しかもラッキーなことにここ数年で
機械翻訳がそれなりに進化して、技術文書ならなんとなく
意味が理解できるぐらいなってきたから、あまり心配しな
くても大丈夫だよ。
0586デフォルトの名無しさん
2008/01/29(火) 23:44:45#include <fstream>
#include <TCHAR.h>
#include <string>
#include <sstream>
using namespace std;
class zantei{
private:
// 行動データ構造体
class Action
{
public:
int No; // 行動番号 (無しなら0)
LPTSTR Type; // 行動種類 (無しなら0)
LPTSTR Detail; // 行動詳細 (無しなら0)
int Damage; // ダメージ(無しなら100)
LPTSTR Color; // 色 (無しなら0)
int X; // マルチプレイ用の遠距離行動(無しなら0)
};
Action action[32];
public:
BOOL LoadAction();
};
0587デフォルトの名無しさん
2008/01/29(火) 23:45:15・error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
・以下、変数Typeが認識されないためと思われるエラー他たくさん(24個)
全角スペースや、Typeが実は予約語だったんじゃないかとも疑いましたが、
空白はすべて半角スペースとタブ入力でしたし、TypeをiやNumに変えても同じエラーが出ました。
…ということは、完全に知らないことか、思い至っていないことによるエラーだと思われる、ということまでは考えることはできました。
どなたかご教授いただけないでしょうか。
0588デフォルトの名無しさん
2008/01/29(火) 23:45:50何というコンパイラで、何というメッセージが吐かれたのだい?
0589デフォルトの名無しさん
2008/01/29(火) 23:50:01エラーは、>>587以外もかくとすると…、ちょっと多いので、少々お待ちください。
0590デフォルトの名無しさん
2008/01/29(火) 23:51:06そのコピペは全角だらけやな
0591デフォルトの名無しさん
2008/01/29(火) 23:51:32tchar.h はインクルードしてあるしな・・・。
TCHAR が大文字でも何か起きると思えないし。
0592デフォルトの名無しさん
2008/01/29(火) 23:54:24#include <windows.h>
が無かったりだったりとか?
0593デフォルトの名無しさん
2008/01/29(火) 23:54:26全角が入ってる。間違いない。絶対だ。
0594デフォルトの名無しさん
2008/01/29(火) 23:54:56エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 4 error C4430: 型指定子がありません - int と仮定しました。
エラー 5 error C2146: 構文エラー : ';' が、識別子 'Detail' の前に必要です。
エラー 6 error C4430: 型指定子がありません - int と仮定しました。
エラー 7 error C4430: 型指定子がありません - int と仮定しました。
エラー 8 error C2146: 構文エラー : ';' が、識別子 'Color' の前に必要です。
エラー 9 error C4430: 型指定子がありません - int と仮定しました。
エラー 10 error C4430: 型指定子がありません - int と仮定しました。
エラー 11 error C2146: 構文エラー : ';' が、識別子 'LoadAction' の前に必要です。
エラー 12 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 13 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
警告 14 warning C4183: 'LoadAction': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
これよりしたのエラーは、LoadAction()の実装部分で吐かれているエラーです。
0595デフォルトの名無しさん
2008/01/29(火) 23:55:00そうか。撤回する。
0596デフォルトの名無しさん
2008/01/29(火) 23:55:42全角入りのソースでそれと同じエラーを見たぞ。
0597デフォルトの名無しさん
2008/01/29(火) 23:56:360598デフォルトの名無しさん
2008/01/29(火) 23:57:21それをチェックしてみようぜ。
0599デフォルトの名無しさん
2008/01/29(火) 23:57:31全角半角スペースを表示させても全角はは行っているようにみえないですが…
見落としかもしれないですし
0600デフォルトの名無しさん
2008/01/29(火) 23:57:430601デフォルトの名無しさん
2008/01/29(火) 23:58:03あ、はい、分かりました
0602デフォルトの名無しさん
2008/01/30(水) 00:01:02同じエラーが吐かれました(確認したのは大体のエラーの見た目と数だけですが)
ソースをアップする作業に入りますね
0603デフォルトの名無しさん
2008/01/30(水) 00:01:270604デフォルトの名無しさん
2008/01/30(水) 00:17:01http://www.youlost.mine.nu/html999/upload.php
の、2968.zipです。
うp用に、配置しなおしたら、エラーが増えて涙目になってました(汗
他のアプリケーション用に書いてたものを、エラーはかれていたソースファイルを別プロジェクトでテストしながらなおそうとしたため、
プロジェクト別フォルダから読み込む方式になっています。
ヘッダがプロジェクトに入っていないのは、…えー、ごめんなさい、忘れました、試行錯誤の過程です。
いずれヘッダも戻すつもりではいました。
…ごめんなさい。
0605デフォルトの名無しさん
2008/01/30(水) 00:28:000606デフォルトの名無しさん
2008/01/30(水) 00:29:010607デフォルトの名無しさん
2008/01/30(水) 00:31:11って問題なんですが、プログラム作ってみたけどわかりません
文字数が同じときの結果がめちゃくちゃになりました
誰かこのおしえてください(><)
cout << "文字数a:" << a_count << endl ;
cout << "文字数b:" << b_count << endl ;
if(a_count > b_count){
cout << "a>b" << endl ;
}else if(a_count < b_count){
cout << "a<b" << endl ;
}else if(a_count == b_count){
cout << "文字数が一緒なので一桁ずつ判断します" << endl ;
for(int i=0 ; i < a_count ; i++){
if(a[a_count-i] == b[a_count-i]){
cout << a[a_count-i] << "=" << b[a_count-i] << endl ;
}else if(a[Max_Length-i] != b[Max_Length-i]){
break ;
}
}
if(a[a_count-i] > b[a_count-i]){
cout << "a>b" << endl ;
}else if(a[a_count-i] < b[a_count-i]){
cout << "a<b" << endl ;
}
}
}
0608デフォルトの名無しさん
2008/01/30(水) 00:32:380609デフォルトの名無しさん
2008/01/30(水) 00:33:170610607
2008/01/30(水) 00:34:08#include <iomanip.h>
const int Max_Length = 50 ; // 入力できる文字数の最大値
main()
{
char a[Max_Length] ; // 最初に入力する文字列
char b[Max_Length] ; // あとに入力する文字列
cout << "2つの自然数(最大50桁)を入力し、" << endl ;
cout << "その2数の大小を判定するプログラムです" << endl ;
cout << "数値を入力してください(最大50桁)" << endl ;
cout << "a>>" ;
cin.getline( a , Max_Length ) ;
cout << "b>>" ;
cin.getline( b , Max_Length ) ;
int a_count , b_count ; // 文字カウンタ
int i , j ;
a_count = 0 ;
b_count = 0 ;
i = 0 ;
j = 0 ;
// 文字数をカウントする
while(a[i] != '\n' && a[i] != '\0'){
a_count++ ;
i++ ;
}
while(b[j] != '\n' && b[j] != '\0'){
b_count++ ;
j++ ;
}
0611デフォルトの名無しさん
2008/01/30(水) 00:34:140612607
2008/01/30(水) 00:35:020613デフォルトの名無しさん
2008/01/30(水) 00:35:210614デフォルトの名無しさん
2008/01/30(水) 00:40:170615デフォルトの名無しさん
2008/01/30(水) 00:44:48質問してすぐ風呂に入る予定だったため、
アップロードしてしばらく返事がなかったので、急いでお風呂に入っていたため、反応が遅れました。
申し訳ありません。
>>605-606
ありがとうございます!
セミコロンを直し、game.hをプロジェクトを追加し、gamemain.cppにgame.hをインクルードし、
gamemain.cppのクラス宣言部分をコメントアウトしてコンパイルしましたが、
結局
error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。
がヘッダで吐かれてしまっています…
ここの部分を改善する、考えられるミスはありませんでしょうか…
0616デフォルトの名無しさん
2008/01/30(水) 00:50:24ヘッダファイルは <iostream.h> や <iomanip.h> ではなく
<iostream> や <iomanip> を使用する事が推奨されている。
cout とかが std::cout とかになっちゃうのが嫌なら、
この程度のプログラムなら using namespace std; と書いておけば std:: を略せる。
古いコンパイラなら知らんがね。
最大 50 文字なら、a のサイズは Max_Length + 1 にする。
cout の後 cin をする際には、cout を flush した方がいい。
cout << "a>>" << flush;
でないと、表示されない事もある。
getline は改行文字を格納しない。改行との比較は無駄。
50 文字以上入力したら次の cin.getline が失敗するのは無視してもいいのかな。宿題程度なら。
cin.clear(); して、改行まで読み飛ばすか構わず cin.getline するか・・・。
文字数カウントは strlen で可能だが、まだ習ってないのかな。
i と j という変数を作らなくても、直接 a_count と b_count 使えばいい。
while 文より for 文使った方がすっきりする。
i が 0 〜 a_count - 1 のループでは、
a_count - i は a_count 〜 1 になる。
これは意図する所ではないはず。
そして、a[Max_Length-i] != b[Max_Length-i] で何をやろうとしているのか分からないし、
このあたり全体的にちとおかしいと思う。
もうちょっとよく考えよう。
0617デフォルトの名無しさん
2008/01/30(水) 00:51:00TCHAR.h → tchar.h
0618デフォルトの名無しさん
2008/01/30(水) 00:51:460619デフォルトの名無しさん
2008/01/30(水) 00:53:17風呂の予定なんかどうでもいい。
しかも二回も風呂って書きやがって。
風呂はゆっくり入れ。
0620デフォルトの名無しさん
2008/01/30(水) 00:54:03これだけのヘッダファイルだと BOOL は定義されてなくね?
0621デフォルトの名無しさん
2008/01/30(水) 00:54:56#include <tchar.h>
0622デフォルトの名無しさん
2008/01/30(水) 00:55:17たくさんありがとうございます!
考え直してもういっかい来ます
0623デフォルトの名無しさん
2008/01/30(水) 00:58:12とりあえず windows.h をインクルードしとけ。
0624デフォルトの名無しさん
2008/01/30(水) 00:58:29int main(void)
{
const int max_str = 50 + 1;
char str1[max_str], str2[max_str];
std::cout << "数値a入力>";
std::cin >> str1;
std::cout << "数値b入力>";
std::cin >> str2;
int len1, len2;
for( len1 = 0; len1 < max_str; ++len1 ){
if( str1[len1] == '\0' )
break;
}
for( len2 = 0; len2 < max_str; ++len2 ){
if( str2[len2] == '\0' )
break;
}
0625デフォルトの名無しさん
2008/01/30(水) 00:59:29std::cout << "数値b 文字数:" << len2 << std::endl;
if( len1 == len2 ){
std::cout << "文字数が一緒なので一桁ずつ判断します" << std::endl;
for( int i = 0; i < max_str; ++i ){
if( str1[i] == str2[i] )
continue;
else if( str1[i] > str2[i] )
std::cout << "a > b" << std::endl;
else
std::cout << "a < b" << std::endl;
break;
}
}else if( len1 > len2 )
std::cout << "a > b" << std::endl;
else
std::cout << "a < b" << std::endl;
}
>>612
総書き直しすれば簡単
0626デフォルトの名無しさん
2008/01/30(水) 00:59:38提案ありがとうございます。すみません、でもとおりませんでした
>>618
エディタでトリプルチェックしましたが、やはり全角はありませんでした…
>>619
う…(苦笑)。すみません、お気遣いありがとうです。
>>620
windows.hをインクルードすれば定義されるでしょうか?
>>621
これは、BOOLのヘッダでしょうか。すみません、レスを先にして、試してきます。
0627デフォルトの名無しさん
2008/01/30(水) 01:00:18std::cin >> str1;
バッファオーバーフロー一直線!!!
0628デフォルトの名無しさん
2008/01/30(水) 01:02:38無茶苦茶やな・・・。
0629デフォルトの名無しさん
2008/01/30(水) 01:04:36試してみたら、エラーが13に減りました!
でも、
>>623
windos.hをインクルードしたら、もっと減りました(10)!
あとは、game.hに、using namespace std;をかけば、通りそうな雰囲気です。
ありがとうございました。
一応、最後に通るか確認してきますね。
0630デフォルトの名無しさん
2008/01/30(水) 01:05:22ヘッダファイルで決して using しないと俺と約束してくれ。
0631デフォルトの名無しさん
2008/01/30(水) 01:08:29ごめんなさい。
gamemain.cppの方でした。
そして、通りました!皆さん本当にありがとうございました。そして、お騒がせしました!
ちなみに、ヘッダファイルでusingすると、どんな弊害がおきるのでしょう?
ちょっと考えれば分かるかもしれない気はするので、失礼な質問でしたらすみません。
あと、<TCHAR.h>より、<tchar.h>をお勧めになった理由もお教えいただけないでしょうか?
0632デフォルトの名無しさん
2008/01/30(水) 01:10:41ヘッダで using して、色々インクルードしまくってると、
どこで using されているかさっぱり分からない状態になる。
using されては困る状況が現れた時、どの using が原因で困ってるか分からない。
0633デフォルトの名無しさん
2008/01/30(水) 01:12:450634デフォルトの名無しさん
2008/01/30(水) 01:16:32その名前空間がインクルードしたファイルにもusingされてしまう、ということでしょうか?
それとも、usingされてると、呼び出すときに、どの名前空間に所属しているのが分かりにくくなり、
数が膨大になったときに、エラーからたどりにくくなる、ということでしょうか?
…後者ですよね?
0635デフォルトの名無しさん
2008/01/30(水) 01:17:470636デフォルトの名無しさん
2008/01/30(水) 01:21:19前者も、ということになると、確かに本当にヘッダファイルでusingしてしまう(されてしまう)と、困ってしまいますね。
絶対にヘッダファイルでusingしないと、>>630さんと指きりしてお約束します。
ありがとうございました!
0637デフォルトの名無しさん
2008/01/30(水) 01:24:53#include "hoge.h" // has using directives or declarations
}
using isolate::Hoge; // declared in hoge.h, and want to use in this source
と無理矢理隔離してみたり。
0638デフォルトの名無しさん
2008/01/30(水) 01:28:400639デフォルトの名無しさん
2008/01/30(水) 01:46:320640デフォルトの名無しさん
2008/01/30(水) 01:50:28ATL: Windows でしか使えない
0641デフォルトの名無しさん
2008/01/30(水) 01:54:30ATL: 90%くらいの環境で使える
0642デフォルトの名無しさん
2008/01/30(水) 01:57:430643デフォルトの名無しさん
2008/01/30(水) 03:04:22そうじゃないならSTL。
0644デフォルトの名無しさん
2008/01/30(水) 03:39:230645デフォルトの名無しさん
2008/01/30(水) 05:46:400646デフォルトの名無しさん
2008/01/30(水) 07:02:37char型のを使えるようにするにはどうすればいい?
0647デフォルトの名無しさん
2008/01/30(水) 07:06:10要するに関数内でnewで宣言したcharをグローバル変数みたいな感じで使いたい
0648デフォルトの名無しさん
2008/01/30(水) 07:07:010649デフォルトの名無しさん
2008/01/30(水) 07:16:06ああそうか。それでいけたw
staticみたいなので全範囲で使えるようになるのないかなって探してたよ
ありがとう
0650デフォルトの名無しさん
2008/01/30(水) 07:31:28何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?
0651デフォルトの名無しさん
2008/01/30(水) 15:11:370652デフォルトの名無しさん
2008/01/30(水) 15:12:250653デフォルトの名無しさん
2008/01/30(水) 15:30:11while(fgets(buffer,filesize,fp)){
flug=strstr(buffer,str);
if(flug!=NULL)puts(flug);
}
これでなぜ出力文字列が検索できないのでしょうか。
教えてくださいませんか?
私の頭の中ではまず改行までのファイルの一行をbufferに読み込む。
その後、bufferに格納されている文字列とstr(検索したい文字列)を比較して検索。
その返り値がflugに入るので、NULLポインタ以外(失敗)のflugは出力。
これで検索した値からの文字列が出力されると思っておりました。
0654デフォルトの名無しさん
2008/01/30(水) 15:40:40って文字列を入力させるときに使うの?
普通に50桁の配列に数字を入れたいときって
cin >> a[50]
でいいのかな??
0655デフォルトの名無しさん
2008/01/30(水) 15:43:250656デフォルトの名無しさん
2008/01/30(水) 15:49:42その部分だけじゃわからん。
つーか、その部分に問題は無い。
0657デフォルトの名無しさん
2008/01/30(水) 15:50:58・flugという変数名がキモい
・filesizeは本当にbufferが指すバッファのサイズ?
buffer, filesize, str の宣言や初期化などを詳しく開示しましょう。
0658デフォルトの名無しさん
2008/01/30(水) 17:03:00getlineの使い方(ファイルからの一行単位の読み込み)
string line;
ifstream ifs(filename);
while (getline(ifs, line)) {
lineには一行がはいってる。
}
> cin >> a[50];
これでは配列aの51番目の要素に代入してるだけでは?
0659デフォルトの名無しさん
2008/01/30(水) 18:54:56やっぱりだめなんですね・・
cin>>a[50]
だと50桁も入力できないんです
ありがとうございました
0660デフォルトの名無しさん
2008/01/30(水) 19:19:46関数でnew | malloc した文字列を返して
デストラクタでdelete[] | freeするのはありですか?
0661デフォルトの名無しさん
2008/01/30(水) 19:29:05コードで書いてくれ。
0662デフォルトの名無しさん
2008/01/30(水) 19:47:17catch内で作ったインスタンスでもデストラクタは呼ばれるのか?
ではないかと。
0663デフォルトの名無しさん
2008/01/30(水) 19:59:410664デフォルトの名無しさん
2008/01/30(水) 20:03:22文字列クラス返せば?
0665デフォルトの名無しさん
2008/01/30(水) 21:42:46「桁」が何のことか分からん
配列のサイズのことならfor引数足してまわせばいいだけ
50桁の数値(10の50乗とか)を扱いたいなら普通には無理
0666デフォルトの名無しさん
2008/01/30(水) 21:43:280667デフォルトの名無しさん
2008/01/30(水) 22:27:02エラーメッセージを見るとどこかで定義されてるようなんですが、
クラス内は独立した名前領域で、同じ関数名を使えるのではないのですか?
どなたか、回答をお願いします。
0668デフォルトの名無しさん
2008/01/30(水) 22:29:10windows.h から同名のマクロが include されているのかも知れない
0669デフォルトの名無しさん
2008/01/30(水) 22:32:01windows.hは確かにインクルードしていました。
windows.hをインクルードしないわけにはいかないし、
CreateWindowという名称を使うのはあきらめたほうがよさそうですね。
0670デフォルトの名無しさん
2008/01/30(水) 23:10:41C++言語のソースを読んでいて、疑問に感じた所があります。
struct Hoge{
unsigned Wakeup(void) const { return wakeup_time; }
Hoge(Container& container);
~Hoge();
private:
unsigned int hoge_time;
Container& fuga;
};
これ構造体ですよね?クラスみたいですけど・・・。
本を読んだりしてクラスと構造体はまったく別物と認識していたんですが。
混乱しています。
0671デフォルトの名無しさん
2008/01/30(水) 23:12:12違いはデフォルトのアクセスがpublicな事
0672デフォルトの名無しさん
2008/01/30(水) 23:19:54実装は同じだけど、考え方としては区別したほうが良いんじゃないかな、
0673デフォルトの名無しさん
2008/01/30(水) 23:21:02もうちょい違うっしょ。
0674デフォルトの名無しさん
2008/01/30(水) 23:21:53そうでないのものはクラスに。
そう考えると、自然と構造体を使う状況は限定される。
0675デフォルトの名無しさん
2008/01/30(水) 23:23:22デフォルトで public 継承になる、というやつのことか?
0676デフォルトの名無しさん
2008/01/30(水) 23:30:120677デフォルトの名無しさん
2008/01/30(水) 23:32:360678デフォルトの名無しさん
2008/01/30(水) 23:36:090679デフォルトの名無しさん
2008/01/30(水) 23:38:38ちょっと違うんじゃないか、と。
0680670
2008/01/30(水) 23:43:33ありがとうございました。
0681デフォルトの名無しさん
2008/01/31(木) 00:26:32char *c;
int p=20;
c=new char[p][255];
こんな感じでしたいんだけどこれだとエラーでる
0682デフォルトの名無しさん
2008/01/31(木) 00:26:530683デフォルトの名無しさん
2008/01/31(木) 00:32:46ありがとうございます。原理はよく分からないけどできました
勉強してきます
0684デフォルトの名無しさん
2008/01/31(木) 00:36:46typedef 使うと多少分かりやすいかと。
typedef char BUF[255]; // BUF は char 型 255 要素の配列型
BUF *c = new BUF[p];
やっぱそうでもないか。
0685デフォルトの名無しさん
2008/01/31(木) 00:40:26c[i] とすると i 個目の配列が得られ、
c[i][j] とするとその配列の j 番目の要素にアクセスできる、と。
0686デフォルトの名無しさん
2008/01/31(木) 00:53:06分かり易くありがとうございます。何となく分かったような気がする
とりあえずもう一度newについて再勉強してきます
0687デフォルトの名無しさん
2008/01/31(木) 01:23:020688デフォルトの名無しさん
2008/01/31(木) 04:56:35struct array_str {
T array[N];
T &operator[](int n) {
return array[n];
}
};
int p = 20;
const int ssize = 255;
vector< array_str<ssize,char> > c(p);
として、以下のように使う方法は?
c[1][1];
0689デフォルトの名無しさん
2008/01/31(木) 05:15:040690デフォルトの名無しさん
2008/01/31(木) 05:19:040691デフォルトの名無しさん
2008/01/31(木) 05:37:32this->func<type>(arg); との違いを教えてください。
0692デフォルトの名無しさん
2008/01/31(木) 05:48:03template付けないとエラーでコンパイルできない場合がある。
.演算子、->演算子、::演算子の後ろにメンバテンプレート特殊化の
名前があり、それがテンプレート仮引数に属している場合がそう。
0693デフォルトの名無しさん
2008/01/31(木) 05:52:19テンプレート内で、 this の型がテンプレート引数に依存するとき、前者のように
template を明示しないと、コンパイラは this->func<type という部分を
(this->func) < (type) のような比較式と認識してしまう。
0694デフォルトの名無しさん
2008/01/31(木) 08:21:510695デフォルトの名無しさん
2008/01/31(木) 08:23:28"a\"b"
0696デフォルトの名無しさん
2008/01/31(木) 08:23:510697デフォルトの名無しさん
2008/01/31(木) 08:29:430698デフォルトの名無しさん
2008/01/31(木) 09:05:560699デフォルトの名無しさん
2008/01/31(木) 09:07:00エスケープを "" で表現するのって、どこの文化だっけ?
どっかで見た気はするんだが。
0700デフォルトの名無しさん
2008/01/31(木) 09:46:440701デフォルトの名無しさん
2008/01/31(木) 09:50:260702デフォルトの名無しさん
2008/01/31(木) 10:45:560703デフォルトの名無しさん
2008/01/31(木) 11:36:23下の式を意味が変わらない範囲でカッコを外すとどうなりますか?
a = ( b *= ( ( c+d ) << e ) )
( ( * ( a[b] ) ) . c ) -> d
( a - ( ( b-c ) * d ) ) - e
( + ( ++a ) ) + ( ( b&c ) << ( d+e ) )
( ( ( * ( a.b ) ) . c ) -> d ) ++
あと下の4つは順序を明確にするためにカッコを付ける問題です。
a + b * c - d
a <<= b << c <= d
a = b &= c ==d
* a . b * c
参考になるサイトとかありますか?アドバイスお願いします。
0704デフォルトの名無しさん
2008/01/31(木) 11:39:36高低だけじゃなくて、右左にも注意
0705デフォルトの名無しさん
2008/01/31(木) 13:06:37素直にカッコをつけておくというのはどうだろうか。
前提無視ですね、すみません。
0706デフォルトの名無しさん
2008/01/31(木) 13:40:090707デフォルトの名無しさん
2008/01/31(木) 15:44:34そんなの、K&Rにかいてあるだろ
0708デフォルトの名無しさん
2008/01/31(木) 19:40:400709デフォルトの名無しさん
2008/01/31(木) 20:09:03優先順位がわかりにくいときは括弧つければいいと思うよ。別にかっこ悪くないと思うよ
括弧減らしてもバグが増えたら意味が無いしな。
0710デフォルトの名無しさん
2008/01/31(木) 21:35:35::CreateWindowEx とかスコープ演算子つけた方が良いのですか?
ネットにあるサンプルコードだと、両方見かけますが…
0711デフォルトの名無しさん
2008/01/31(木) 21:42:540712デフォルトの名無しさん
2008/01/31(木) 22:06:34string str("HeLLo");
for (int i = 0; i < str.size(); i++) {
str[i] = tolower(str[i]);
}
cout << str.c_str() << endl;
あまりよろしくないかも。
0713デフォルトの名無しさん
2008/01/31(木) 22:12:350714デフォルトの名無しさん
2008/01/31(木) 22:20:350715デフォルトの名無しさん
2008/01/31(木) 22:30:15// 構造体
struct POI{
int n;
float x;
};
// クラス
class hoge
{
public:
hoge(void ); // コンストラクタ
~hoge( void ); // デストラクタ
private:
POI poi[4];
};
と書き、
hoge.cppの
hogeコンストラクタ上で
poiの初期化を行いたいのですがうまくいきません。
今下のようにやっているのですがどのように直せばいいのでしょうか、どうぞよろしくお願いします。
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
0716デフォルトの名無しさん
2008/01/31(木) 22:30:290717デフォルトの名無しさん
2008/01/31(木) 22:31:24poi[i].n = 1;
poi[i].x = 0.5;
}
0718デフォルトの名無しさん
2008/01/31(木) 22:37:12好きなほうでどーぞ
0719デフォルトの名無しさん
2008/01/31(木) 22:40:15poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
その形式が使えるのは宣言時だけなので
>>717
みたいにしないといけません
0720715
2008/01/31(木) 22:40:59できれば
poi = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
こういう風に一括でやりたいのですがこれは無理なのでしょうか?
0722デフォルトの名無しさん
2008/01/31(木) 22:43:14POI poi_src[] = {
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
{ 1 , 0.5 },
};
std::copy(poi_src, pos_src + sizeof poi_src / sizeof *pos_src, poi);
0723デフォルトの名無しさん
2008/01/31(木) 22:44:45とサイズ指定してた方が安全か。
0724デフォルトの名無しさん
2008/01/31(木) 22:45:240725デフォルトの名無しさん
2008/01/31(木) 22:47:00とした方がいいか。
0726デフォルトの名無しさん
2008/01/31(木) 23:06:46ありがとうございます。でもコンパイル通りません。
下のソースだと、
char my_tolower(char s) {
return tolower(s);
}
int main() {
string s = "Hello world";
transform(s.begin(), s.end(), m.begin(), toupper); // コンパイル通らない
transform(s.begin(), s.end(), m.begin(), my_tolower); // コンパイル通る
下のような結果になります。
test.cpp:14: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*,
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
<unresolved overloaded function type>)'
0727デフォルトの名無しさん
2008/01/31(木) 23:08:32>>714 ということか。
0728デフォルトの名無しさん
2008/01/31(木) 23:10:030729デフォルトの名無しさん
2008/01/31(木) 23:12:44transform(s.begin(), s.end(), m.begin(), static_cast<int(*)(int)>toupper);
0730デフォルトの名無しさん
2008/01/31(木) 23:20:45両方あるんじゃなかったっけ?
0731デフォルトの名無しさん
2008/01/31(木) 23:26:500732デフォルトの名無しさん
2008/01/31(木) 23:46:020733デフォルトの名無しさん
2008/01/31(木) 23:46:410734デフォルトの名無しさん
2008/02/01(金) 00:00:42括弧無くても大丈夫だな。
後ろに ( ) がついてないから。
それにしても、うちの gcc じゃ >>726 みたいなエラーでないんだがなあ。
バージョンが違うのか。
0735デフォルトの名無しさん
2008/02/01(金) 00:11:150736デフォルトの名無しさん
2008/02/01(金) 00:20:070737デフォルトの名無しさん
2008/02/01(金) 00:20:08面倒臭いな。
0738デフォルトの名無しさん
2008/02/01(金) 00:43:560739デフォルトの名無しさん
2008/02/01(金) 00:45:47謎だ
0740デフォルトの名無しさん
2008/02/01(金) 01:22:21Cでは、関数に加えてマクロを用意しても良かったが、
C++だとそれは認められていない。
(JIS X3014:2003では17.4.1.2の6段落目。更に注(159)で明確に指摘されている)
0741デフォルトの名無しさん
2008/02/01(金) 01:28:39double i,imax,n;
double x,y,pi;
n=0.0;
imax=10000000.0;
for(i=0;i<=imax;i++) {
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);
if((x*x+y*y)<1.0) {
n+=1.0;
}
}
pi=n/imax*4.0;
return pi;
}
double px(double t){
double pi=pai();
double x,ans;
ans=exp(-x*x/2t)/sqrt(2*pi*t);
return ans;
}
としたら
エラー E2121 kadai1.c 27: 関数呼び出しに ) がない(関数 px )
と出ましたorz
誰か解決策わかるようでしたら教えてください(;´Д`)
0742デフォルトの名無しさん
2008/02/01(金) 01:34:282t?
0743デフォルトの名無しさん
2008/02/01(金) 01:43:520744デフォルトの名無しさん
2008/02/01(金) 01:44:150745デフォルトの名無しさん
2008/02/01(金) 01:46:26{ int t = 0;}
break;
ブロックで囲めばいいんじゃね
0746741
2008/02/01(金) 01:58:11解決しましたw
あざす!!
0747デフォルトの名無しさん
2008/02/01(金) 03:31:40こっちも解決しました。ありがとう酢。
0748デフォルトの名無しさん
2008/02/01(金) 18:16:42はーい つLSD
0749デフォルトの名無しさん
2008/02/01(金) 19:11:190750デフォルトの名無しさん
2008/02/01(金) 19:24:52よく引数であるchar* pszMessageのpszってどういう意味ですか?
Pointer Stringはわかるんですが、Zがいったいなんなのか・・・
0751デフォルトの名無しさん
2008/02/01(金) 19:27:110752デフォルトの名無しさん
2008/02/01(金) 19:29:520753749
2008/02/01(金) 19:30:060754デフォルトの名無しさん
2008/02/01(金) 19:31:13なるほど・・ゼロでしたか
謎がとけました、ありがとうございます!
0755デフォルトの名無しさん
2008/02/01(金) 21:29:40コンソールからstringを入力させたいのですが、getline()とcinを併用すると
何回目かのcinがユーザの入力待ちにならずにそのまま長さゼロの入力を受け取った
と誤解して処理が先に進んでしまうようです。何かフラッシュとかの処理が必要なので
しょうか?
0756デフォルトの名無しさん
2008/02/01(金) 22:01:29cin.clear(); するまで関数に失敗するが、
そういうわけではなくて?
0757デフォルトの名無しさん
2008/02/02(土) 01:13:420758デフォルトの名無しさん
2008/02/02(土) 01:38:32に問題はありますか?
0759デフォルトの名無しさん
2008/02/02(土) 01:39:47エラーが出るなら問題。
0760デフォルトの名無しさん
2008/02/02(土) 01:41:21c言語でscanfで入力を受けるプログラムをつくりました.
バッチファイルとかシェルスクリプトで入力してやりたいのですが、つまづいています.
要するに、
(実行ファイル)enter(入力)enter
では無く、
(実行ファイル)(入力)enter
のような感じに書く方法がありますか?ということです.
0761デフォルトの名無しさん
2008/02/02(土) 01:46:08でググれ。
0762デフォルトの名無しさん
2008/02/02(土) 01:48:35そのレベルは……ぐぐるとかじゃなくて、本を読んできちんとした知識を身に付けた方が良いよ。
いや、マジで……
0763デフォルトの名無しさん
2008/02/02(土) 01:54:08STLのこんてなにオートポインタの類入れると
0764デフォルトの名無しさん
2008/02/02(土) 01:59:290765デフォルトの名無しさん
2008/02/02(土) 02:37:31実は数値計算だったので簡単に済ませたかったんです.
リダイレクトでパラメータをいれる代わりに、
そのまま数値を書く方法があるのかなと思って質問してみたんですが.
どうやら場違いでした.
0766デフォルトの名無しさん
2008/02/02(土) 03:34:390767デフォルトの名無しさん
2008/02/02(土) 03:49:03std::aut_ptrが例外的にダメなオートポインタで、
大抵のスマートポインタは入れても大丈夫じゃねーの。
0768デフォルトの名無しさん
2008/02/02(土) 12:09:24resize でアサーションエラーが出た。
0769デフォルトの名無しさん
2008/02/02(土) 12:31:21まさにCOMみたいに自前でカウントしてるクラス用のスマポ
0770デフォルトの名無しさん
2008/02/02(土) 12:46:10for_each(string.begin(), string.end(), XXXX);
みたいにfor_eachを使って書けないでしょうか?
0771デフォルトの名無しさん
2008/02/02(土) 12:49:160772デフォルトの名無しさん
2008/02/02(土) 12:50:120773デフォルトの名無しさん
2008/02/02(土) 13:03:58std::list<char> l;
std::copy(string.begin(), string.end(), std::back_inserter(l));
0774デフォルトの名無しさん
2008/02/02(土) 14:48:54または
l.assign(s.begin(), s.end());
だろ。
0775デフォルトの名無しさん
2008/02/02(土) 15:35:03ということですか?
でもこれはコンパイルできなかった。
0776デフォルトの名無しさん
2008/02/02(土) 16:06:20>>773は正しい処理だが、
効率が悪いということじゃないの?
初期化の話だよな?
>>775
そりゃ、あらゆる点で無理だ。
0777デフォルトの名無しさん
2008/02/02(土) 16:16:22まあstd::back_inserterを使うのが最適なわけだが
0778デフォルトの名無しさん
2008/02/02(土) 16:18:570779デフォルトの名無しさん
2008/02/02(土) 16:20:270780デフォルトの名無しさん
2008/02/02(土) 16:51:44それでもダメ。引数の数が一致しない。
せめてbind1stを使えといいたいところだが
ほとんどの実装でunary_functionで参照の参照が
発生してはじかれる。
0781デフォルトの名無しさん
2008/02/02(土) 16:55:14範囲指定のイテレータか
0782デフォルトの名無しさん
2008/02/02(土) 17:07:39面倒くさいのでboost使おう、という話になるw
0783デフォルトの名無しさん
2008/02/02(土) 17:11:230784784
2008/02/02(土) 19:38:53//正規分布を求めるメソッド
float BestFitInfo::norDis(float x, float mean, float var){
return 1 / ( sqrt( 2 * 3.14 ) * sqrt(var) ) *
exp( - (x - mean) * ( x - mean ) / ( 2 * var ) );
}
//BestFitInfoというクラスを作って、
//正規分布を求めるメソッドを書いたところ、
warning C4244: 'return' : 'double' から 'float' への変換です。データが失われる可能性があります。
と言われました。すべて引数は float だし、
exp や sqrt の戻り値もそれに合わせて float のはずなので、
どこで double 型が発生しているのかわかりません。
なぜこのようなエラーとなっているのでしょうか?
分かる方がいらっしゃいましたら教えてください。
よろしくお願いします。
0785デフォルトの名無しさん
2008/02/02(土) 19:45:47>exp や sqrt の戻り値もそれに合わせて float のはずなので、
本当か?
floatのはsqrtfとかexpfじゃないのか?
あと、3.14はdouble型だ。float型リテラルは3.14fと書く。
0786784
2008/02/02(土) 19:59:473.14fと書いたら「データが失われる可能性があります」と言われなくなりました。
sqrtについて調べたところ、
double sqrt(
double x
);
float sqrt(
float x
); // C++ only
long double sqrt(
long double x
); // C++ only
float sqrtf(
float x
);
このように sqrt は多重定義されているようです。
sqrtf はC言語のときの名残のようですね。
解決しました。みなさまありがとうございました。
0787デフォルトの名無しさん
2008/02/02(土) 22:11:07僕はインクルードガードシンボルにuuidを含ませる事があるんですが
Cのプリプロセッサで処理するシンボルは最大何文字までいけるんでしょう?
#define HOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE
ぐらいのものは処理できるならまぁ十分なんですが気になります
あと変数名や名前空間名も何文字までいけるか気になります
ADLバリアを使うと結構文字数増えますし、
もしあまりに少ない文字数(例えば31文字)だったとしたら怖いんで
0788デフォルトの名無しさん
2008/02/02(土) 22:23:36C89までは厳密には識別子は先頭6文字位じゃなかったっけ
C99で32文字になったような気がしないでもない
0789デフォルトの名無しさん
2008/02/02(土) 22:39:22内部識別子は最低32
外部が8くらいだったと思う。6かもしれん。
VC6なんかでは外部256とかで、複雑なtemplateとかで警告が出るね。
0790デフォルトの名無しさん
2008/02/02(土) 22:40:070791デフォルトの名無しさん
2008/02/02(土) 23:21:31C89が31文字で、C99は63文字だったと思う。
0792791
2008/02/02(土) 23:50:16付録のBで内部外部ともに1024文字以上を推奨ってことになってる。(これは一応調べてきた
0793デフォルトの名無しさん
2008/02/03(日) 00:14:520794デフォルトの名無しさん
2008/02/03(日) 00:20:15当たらしく作られた別スレッドで動いてるんですか?このウィンドウプロシージャってやつは
0795デフォルトの名無しさん
2008/02/03(日) 00:26:14有名なのは、UpdateWindowのWM_PAINTなど。
0796デフォルトの名無しさん
2008/02/03(日) 00:32:13Send系で送る場合も同一スレッドなら直接呼ばれる。
0797デフォルトの名無しさん
2008/02/03(日) 00:33:50ああ、なるほど、そういうことですか
そういうパターンをすっかり見落としてました
0798デフォルトの名無しさん
2008/02/03(日) 00:37:05ただの構造体が欲しいときかな。
たとえば
APIにパラメータを渡したいとき。
ハードウェアをアクセスするとき
オフセットをがっちりあわせたいとき
0799デフォルトの名無しさん
2008/02/03(日) 00:37:18しかしだね、
class Hoge { public: int id; double data; };
に対して
hogeInst.id = 1;
hogeInst.data = M_PI;
なんて操作をするのは背筋がぞわぞわしないか?
0800デフォルトの名無しさん
2008/02/03(日) 00:59:29みたいに日本語とアルファベットが混在した文字列の、
文字数を数えるにはどうすればいいのでしょうか?
strlen(str);
とすると7になってしまいます。
環境はWindows XPでWin32APIを使ってプログラミングをしてます。
0801デフォルトの名無しさん
2008/02/03(日) 01:04:38wcslen(str);
0802デフォルトの名無しさん
2008/02/03(日) 01:05:100803デフォルトの名無しさん
2008/02/03(日) 01:12:01そもそも何がやりたいかというと、
char*からwchar_t*への変換をしたいのですが、
char*変数のstrに'L'をつけて、L(str);とするとエラーになってしまいます。
そこで、MultiByteToWideCharで変換しようと思ったのですが、
wchar_t* wstr = new wchar_t[len];
というふうに、変換後文字のためのバッファをとろうとして、
その長さのlenをどう数えたらいいか分からなくなりました。
0804デフォルトの名無しさん
2008/02/03(日) 01:16:44MultiByteToWideCharの仕様をMSDNで良く見直すこと。
とくに戻り値の説明を。
0805デフォルトの名無しさん
2008/02/03(日) 01:22:44ありがとう。構造体で出来るなら構造体で済ました方が楽ってことですね
0806803
2008/02/03(日) 01:25:33ありがとうございます!
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
これで長さがとれました。
0807デフォルトの名無しさん
2008/02/03(日) 01:30:13関数の返り値にvectorやらlistを返すのってありですか?
それとも引数から参照渡しで変更させたほうがよいですか?
0808デフォルトの名無しさん
2008/02/03(日) 01:36:040809デフォルトの名無しさん
2008/02/03(日) 02:08:30要素数一桁だとか、RVOが可能な記述が出来るならともかく。
どうしても戻り値がいい場合はshared_ptrで包む。
0810デフォルトの名無しさん
2008/02/03(日) 02:31:06バイナリ形式で保存したのをメモ帳で開いても普通に出力したのと変らないんだけど
0811デフォルトの名無しさん
2008/02/03(日) 02:53:33C++ にもプロパティがあればいいんだけどね。
拡張機能で用意されてる事もあるが。
0812デフォルトの名無しさん
2008/02/03(日) 02:59:27配列の先頭アドレスを返す、じゃダメなのかな
>>810
普通のっていうのはテキストモードのことだよね
テキストモードだと改行文字をいじったりしてる
詳しく知りたい場合は「fopen テキストモード」とかでググれば出てくると思う
0813デフォルトの名無しさん
2008/02/03(日) 03:15:45そうじゃないとしたら一体どうなってるんでしょうか?
0814デフォルトの名無しさん
2008/02/03(日) 03:21:350815デフォルトの名無しさん
2008/02/03(日) 03:29:27ありがとうございます
「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」みたいな文字化けしたような感じで
書き込まれるのかと思ってたけど違うのね
こんな文字化けしたようなdatファイルとかってどうやって作ってるの?
0816デフォルトの名無しさん
2008/02/03(日) 03:36:580817デフォルトの名無しさん
2008/02/03(日) 03:44:10書きたい内容をそのまま書けばいい。
static const unsigned char data[] = {
0xBF, 0x83, 0xC3, 0x32, 0x3A, 0xCE, 0x53, 0x53,
0xB6, 0xA2, 0x38, 0x8A, 0x49, 0x4D, 0xC0, 0xD7,
0x92, 0x6A, 0xD5, 0xD1, 0xA9, 0x74, 0x6E, 0x8C,
0x7B}; // 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」
FILE* fp = fopen("test.dat", "wb");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);
0818デフォルトの名無しさん
2008/02/03(日) 03:47:54FILE* fp = fopen("test.dat", "w");
fwrite(data, 1, sizeof(data), fp);
fclose(fp);
でも同じ物が書き込まれるがね。
バイナリモードとテキストモードの違いは
メモリ上で 0x0D('\n') となるバイトを
ファイル上でその環境の改行コードに変換するか否かしかない。
0819デフォルトの名無しさん
2008/02/03(日) 08:05:56ありがとう。でも全然分からない
おれにはまだ早かったみたいです
とりあえずテキストとバイナリモードの違いは\nとかが違うだけで文字は変わら
ないんですね
勉強してきます
0820デフォルトの名無しさん
2008/02/03(日) 09:13:33なければ自分で作ればいいじゃん。
俺は処理系非依存のプロパティ変数クラスを作った。
0821デフォルトの名無しさん
2008/02/03(日) 11:00:39結果はメモ帳で見るよりバイナリエディタで見た方が分かりやすいかと思う。
何かバイナリモードとテキストモードでもの凄く違うと考えてるみたいだが、
動作的には大した違いはない。
普通は fprintf はテキストモードで、fwrite はバイナリモードで使うが、
別にそう使わないといけないという決まりはないんで、
バイナリモードとテキストモードで同じ物を書き込んで
それぞれどうなるか実験してみればいい。
0822デフォルトの名無しさん
2008/02/03(日) 11:25:33プロパティリストではなくて、delphiのプロパティ宣言みたいなものが作れるの?
0823デフォルトの名無しさん
2008/02/03(日) 12:01:34初期化が必要なのは面倒臭い。
0824デフォルトの名無しさん
2008/02/03(日) 12:57:16多重に宣言されないように、externの宣言がありますが、
ヘッダファイルに↓みたいな多重インクルードガードをつけたときも、
externは必要なのでしょうか?
#ifndef AAA_H
#define AAA_H
//ヘッダの内容
#endif
0825デフォルトの名無しさん
2008/02/03(日) 13:01:13インクルードガードはコンパイル時の多重宣言を回避するための物。
全く別の物。
0826デフォルトの名無しさん
2008/02/03(日) 13:26:37必要。
0827824
2008/02/03(日) 13:32:45>>826
ありがとうございます。
今は、複数ソースで共有する変数/関数にはextern、
全ヘッダにとりあえずインクルードガードをつけてます。
違いがよくわからず、不安なんですが、
こんなんでいいのでしょうか?
ちなみに、関数の方はexternをつけなくても動きました。
0828デフォルトの名無しさん
2008/02/03(日) 13:42:540829デフォルトの名無しさん
2008/02/03(日) 13:45:220830デフォルトの名無しさん
2008/02/03(日) 13:51:38みたいに、配列を返す関数って定義できますか?
上記はできなかったので、結局int []を持つstructを定義して、それを返すように
したのですが、、
0831デフォルトの名無しさん
2008/02/03(日) 13:54:140833デフォルトの名無しさん
2008/02/03(日) 13:58:36関数でも、関数定義を複数書けばエラーになるよ。
エラーにならないのは関数定義は1つしか書いてなくて、
他は関数プロトタイプしか書いてないから。
0834デフォルトの名無しさん
2008/02/03(日) 14:30:12うそん。
>extern はリンク時の多重宣言を回避するための物。
多重宣言どうこうっていうか、外部結合を明示するだけの物じゃないのか?
そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?
突っ込み入らないってことは俺が誤解してるんだろうか。
0835デフォルトの名無しさん
2008/02/03(日) 14:37:54>そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ?
そのとおりだよ。
extern指定子の無い宣言は仮の宣言。
コンパイル単位に定義が見つかったら、仮の宣言は冗長な定義として
無視される。そうでなければ0で初期化される単一の定義になる。
と思ってる。
0836デフォルトの名無しさん
2008/02/03(日) 14:38:09複数の記憶クラス指定子のない変数宣言があっても大丈夫。
C++ は仮定義が廃止されたので
複数の記憶クラス指定子のない変数宣言があるとエラー。
0837デフォルトの名無しさん
2008/02/03(日) 14:40:39VisualStudio2005でコンパイルしたところ,
エラー 1 error C2143: 構文エラー : '{' が ':' の前にありません。 c:\program files\microsoft visual studio 8\vc\include\cmath 18
エラー 2 error C2059: 構文エラー : ':' c:\program files\microsoft visual studio 8\vc\include\cmath 18
といった無数のエラーが出ました.
ちなみにcmathはインクルードしておらず,
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<complex>
だけです.
どなたかアドバイス頂けませんでしょうか?
0838デフォルトの名無しさん
2008/02/03(日) 14:45:22ありがとうございます。
参照渡しとかですね。
すいません、あと1つ質問させてください。
stringを継承して、[]をつかって[-1]と[サイズ+1]の要素にアクセスに行ったときだけ
動作の異なるクラスを定義できますか?自分でやろうとしたのですが、コンストラクタ
は継承されないから自分で定義しなおさないとダメなのですよね。そうすると、コンストラクタ
を書くのが結構大変なような気がしたので。
0839デフォルトの名無しさん
2008/02/03(日) 14:49:14コンストラクタだけじゃなくて演算子だって定義する必要があるんだぜ。
戻り値の型が変わるから。
at 関数を使うと範囲チェックして out_of_range 例外投げるから
それ使えばいいんじゃね?
0840デフォルトの名無しさん
2008/02/03(日) 14:51:57b.dll から右側では .NET を使いたい。
a.exe → b.dll
このような場合、b.dllをC++/CLIで作成することになるのかしらん?
0841デフォルトの名無しさん
2008/02/03(日) 14:54:13なるほど、それでやってみます。
サンクス!
0842デフォルトの名無しさん
2008/02/03(日) 14:58:05stringは仮想デストラクタを定義していないから
public継承するのはどうかと思うけど、コンストラクタ
の呼び出しに関しては、stringのコンストラクタ
を派生クラスのコンストラクタ初期設定リストで
指定すればいいだけじゃないの。
0843デフォルトの名無しさん
2008/02/03(日) 14:58:47a.exeからC++/CLIでどぞ
0844デフォルトの名無しさん
2008/02/03(日) 15:01:44C#でもVB.NETでもお好きにどうぞ
0845840
2008/02/03(日) 15:16:22a.exeは他所で作ったものだから、漏れはいじれないんだ。
>>844
LoadLibraryでもマネージDLLを呼び出すことができるってこと?
0846デフォルトの名無しさん
2008/02/03(日) 15:31:59返答ありがとうございます
色々とやり様があるみたいですが、c++的にはやはり生の配列を返すよりコンテナを返したほうがよいのでしょうか?
そうするとやはりlistを引数に取る関数に参照渡しが無難なのかなぁ・・・?
0847デフォルトの名無しさん
2008/02/03(日) 15:33:16{
void hatena(void)
{
Hoge2 ht;
ht.nazo(*this);
}
};
class Hoge2
{
void nazo(const Hoge2 &rho){}
};
みたいなのがあって
ht.nazo(*this);のところでエラーになります。
どうす
0848デフォルトの名無しさん
2008/02/03(日) 15:36:10nazo(const Hoge1・・・にす
0849デフォルトの名無しさん
2008/02/03(日) 15:37:130850デフォルトの名無しさん
2008/02/03(日) 15:37:17nazoは引数にHoge2を取るようだが
thisポインタってhoge1のアドレスを示してるんじゃないの?
0852デフォルトの名無しさん
2008/02/03(日) 15:41:310853デフォルトの名無しさん
2008/02/03(日) 15:41:530854デフォルトの名無しさん
2008/02/03(日) 15:42:310855デフォルトの名無しさん
2008/02/03(日) 15:45:110856デフォルトの名無しさん
2008/02/03(日) 15:46:570857デフォルトの名無しさん
2008/02/03(日) 15:51:340858デフォルトの名無しさん
2008/02/03(日) 15:53:170859デフォルトの名無しさん
2008/02/03(日) 15:55:040860デフォルトの名無しさん
2008/02/03(日) 18:14:16#include <stdio.h>
int main(void)
{
int i, j, ln;
printf("何段ですか:");
scanf("%d", &ln);
for (i=1; i<=ln; i++); {
for (j=1; j<=i; j++)
putchar('*');
putchar('\n');
}
return (0);
}
ちなみにOSはVistaです。どこか違っていたら教えてください。
0861デフォルトの名無しさん
2008/02/03(日) 18:19:32これ。
「;」という何の処理もしない文をforでループさせることになってる。
0862デフォルトの名無しさん
2008/02/03(日) 18:21:39正解が何か知らんからわからんが
改行の位置がおかしいんじゃないか?
0863デフォルトの名無しさん
2008/02/03(日) 18:23:03スマソ
そうだね
改行は問題ないわ
0864デフォルトの名無しさん
2008/02/03(日) 18:23:080865デフォルトの名無しさん
2008/02/03(日) 18:25:57>参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます
このスレを見ている人はその参考書のことなんてしらない。
どのような結果を求めているのかを提示しないと、どこが違っているのか答えられないよ。
明らかにおかしいコードだから答えは>>861の通りだろうけど、もうちょっと質問の仕方を考えたほうがいいよ。
0866デフォルトの名無しさん
2008/02/03(日) 18:26:15サンクス
無事実行できました。
0867デフォルトの名無しさん
2008/02/03(日) 18:26:28その下の行の { が足りないことで
たまたま{ }の対応がうまくいってコンパイルは通ってるんだな。
なので2ヶ所修正
0868デフォルトの名無しさん
2008/02/03(日) 18:26:51現在以下のようなプログラムを作ろうと思っています。
0〜65535までの数字をIDとしてユーザに割当てる。
ユーザが割当てられたIDを使わなくなったときはそのIDを返却し、
返却されたIDは回収されて他のユーザに割当てられる。
最も簡単なやり方は、user_id[65536]などの大きな配列を作って、
使用状況を配列の中身の0か1で判断する、といったものかと思います。
しかしこのやり方よりもっと効率的なものはないでしょうか?
このような大きな配列を作るのは実装としてまずいのかな…と感じています。
初心者で申し訳ありませんがアドバイスよろしくお願いします。
0869867
2008/02/03(日) 18:27:59ごめん
0870デフォルトの名無しさん
2008/02/03(日) 18:29:280871デフォルトの名無しさん
2008/02/03(日) 18:29:5664Kなら、オンメモリで処理してもいいんじゃね?
ビットで処理したら、8Kで収まる。
0872デフォルトの名無しさん
2008/02/03(日) 18:31:50更に上限を増やさなければならない可能性があるなら、
別のやり方を考えたほうがいいと思うけど、
それぐらいなら問題ないと思うね。
0873デフォルトの名無しさん
2008/02/03(日) 18:32:16ぜんぜんOK
0874デフォルトの名無しさん
2008/02/03(日) 18:36:59その、配列やり方でいいと思うよ。
ランダムに返却され再利用されるならそれしかない。>>871のようにビットマップで配列は小さくできる。
連続の範囲でとりますとか特徴があれば、それを使って効率的に管理することもできる。
0875デフォルトの名無しさん
2008/02/03(日) 18:37:36この場合、静的メンバ変数は、テンプレート引数ごとに別々の実体が
作られるということで、このことは確認できました。
で、質問なのですが、この静的メンバ変数の初期化は、
いつ行われるのでしょうか?
テンプレート化してない場合は、mainが始まる前ということで、
これは手元の本にも載っているのですが、
テンプレート化した場合、実際にどんなテンプレート引数で
クラスが作られるかわからない段階で初期化ってできるのか、と
思ったものですから。
実際、mainの最初で、静的メンバ変数の値を見てみてみても、
なぜかちゃんと初期化した値が入っているように動きます。
なぜなのでしょうか。
0876デフォルトの名無しさん
2008/02/03(日) 18:41:470877デフォルトの名無しさん
2008/02/03(日) 18:43:13初期化コードも含めてすべて実体化されるだろ。
0878デフォルトの名無しさん
2008/02/03(日) 18:44:51>>877
むむむ、そういうことですかーーー。
考えが至りませんでした。
ありがとうございました。
0879868
2008/02/03(日) 18:56:06アドバイスありがとうございます。
特に問題がないようですので、このやり方で続行します!
0880デフォルトの名無しさん
2008/02/03(日) 19:14:040881デフォルトの名無しさん
2008/02/03(日) 19:20:13手もよくあるパターンではある。
0882デフォルトの名無しさん
2008/02/03(日) 19:23:170883デフォルトの名無しさん
2008/02/03(日) 19:24:46なんでunsigned shortなの?
0884デフォルトの名無しさん
2008/02/03(日) 19:32:590885デフォルトの名無しさん
2008/02/03(日) 19:37:16this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide;
#pragma endregion
private:
の、->、::、#、:、の意味がよくわかりません
調べたいのですが、記号はGoogleで検索できないので、この記号の名称を教えてください
0886デフォルトの名無しさん
2008/02/03(日) 19:42:260887デフォルトの名無しさん
2008/02/03(日) 19:45:390888デフォルトの名無しさん
2008/02/03(日) 19:45:510889デフォルトの名無しさん
2008/02/03(日) 19:46:37というか、そんな変態言語じゃなくて、普通のC++から勉強しろ
0890デフォルトの名無しさん
2008/02/03(日) 19:50:40無料で見れる情報、無料で協力してくれる人だけをあてにして勉強する気?
独学で身につけるだけの基礎的な力をもっているならまだしも、
まったく何も持っていないなら勉強するための最低限の準備くらいはしたら?
0891デフォルトの名無しさん
2008/02/03(日) 19:52:27何でも良いからCの入門書を読んでからにしようぜ
0892デフォルトの名無しさん
2008/02/03(日) 20:00:57TXTファイルの文字列置換ツール作たいんだけどさ
置換箇所だけ更新かけたいんだよ
でもさ、fopenでファイル開くと一箇所変えると全部上書きしないといけないじゃん
置換箇所だけ更新かける方法ない?
0893デフォルトの名無しさん
2008/02/03(日) 20:07:340894デフォルトの名無しさん
2008/02/03(日) 20:07:49その後、元ファイルを削除し、
さっき書き出したファイルの名前を元の名前に変える。
0895デフォルトの名無しさん
2008/02/03(日) 20:08:21上書きすりゃいいじゃん。 ずれるのならご愁傷様。
0896デフォルトの名無しさん
2008/02/03(日) 20:29:30ファイルの途中でサイズが増減しても、局所的な更新だけですむような
ファイルシステムを実装する。
0897デフォルトの名無しさん
2008/02/03(日) 21:08:44> ランダムに返却され再利用されるならそれしかない。
そんなことはないだろ。
組み込み用途だと、8KB なんて言うテーブルなんてとんでもないと言う
こともあるだろうし、PC でも ID を 32bit にしたいとか言われたら、
どうするんだよ。(w
>>868
ID の範囲に比べて、同時使用ユーザ数が極端に少ないなら普通にリニア
サーチして管理することもできるし、同時使用ユーザ数がそれなりで
ID の割り当て・回収の処理コストが問題になるならハッシュとかBツリー
を使うこともできる。
0898デフォルトの名無しさん
2008/02/03(日) 21:09:38Animal &a = animals["cat"];
この時点で、aに入る物は出来ていますか?
0899デフォルトの名無しさん
2008/02/03(日) 21:13:50stlがstdの間違いなら、aは正しく要素を指している。
0900デフォルトの名無しさん
2008/02/03(日) 21:16:27「何」を、リニアサーチするんだ?
0901デフォルトの名無しさん
2008/02/03(日) 21:16:42また組み込み厨がでたよ。
特殊な環境を持ち出して、いちいち反論するヤツ。
0902デフォルトの名無しさん
2008/02/03(日) 21:25:25ランダムに返却されれば、2^65536の組み合わせが発生する。それを記録処理するには65536bit必要になる。すなわち8Kバイトだ。
それ以下にするには、IDの消費が均一ではなく偏らせる必要がある。
たとえば、連続してIDを取得する。そういう特徴があれば、それに応じた処理にして節約すればいい。しかし、それはランダムとは言えない。
0903デフォルトの名無しさん
2008/02/03(日) 21:29:51どこに極端に少ないと書いてある?
0904デフォルトの名無しさん
2008/02/03(日) 21:31:540905デフォルトの名無しさん
2008/02/03(日) 21:33:18いまさらだけど、配列の中身は0か1って書いてあるんだからshortは必要ないだろ
0906デフォルトの名無しさん
2008/02/03(日) 21:34:050907デフォルトの名無しさん
2008/02/03(日) 21:34:51前半は、「パターンがランダムでも、メモリ8KBも取る必要はない」って言ってて、
後半は、「パターンがランダムでなければ、節約する方法がある」みたいな。
0908881=884
2008/02/03(日) 21:37:43初期値として、(65535〜0)を入れとくわけね
で、こうするとO(N)で触れる、ってだけの話。
要求(){ return v.pop_back() }
解放(id){ v.push_back( id ); }
0909デフォルトの名無しさん
2008/02/03(日) 21:41:34解放でデタラメな id 食わされたら死ぬとか言う問題もあるかもね。
0910デフォルトの名無しさん
2008/02/03(日) 21:43:20でたらめなIDって言っても、if文一発で済むでしょう。
同じIDが複数解放されてきたららドナノヨって話は知らない。
0912デフォルトの名無しさん
2008/02/03(日) 22:01:190913デフォルトの名無しさん
2008/02/03(日) 22:04:18もちろん、同時利用者数が最大 65536 と言うなら、ビットマップの方が
効率がいいのは自明だけど、>>868 が「そんな大きな配列」とか書いて
るから同時利用者数はそれほどじゃないのかも知れないと思っただけの
こと。
0914デフォルトの名無しさん
2008/02/03(日) 22:09:430915デフォルトの名無しさん
2008/02/03(日) 22:26:06いいえ違います
ほかの単語は検索すればわかる、だけど記号は検索できないから質問してるの
検索できない単語が他にも沢山あるならまた質問しまくるかもしれませんが
幸い、検索不可能な記号はこれだけのようなので質問しました
>>891
手持ちの入門書には「System::〜と書けばこう動く」という記述はあったが
「::は〜という意味です」という記述はなかった
0916デフォルトの名無しさん
2008/02/03(日) 22:26:54もうちょっとまともな本を買うべきです。
0917デフォルトの名無しさん
2008/02/03(日) 22:30:370918デフォルトの名無しさん
2008/02/03(日) 22:31:15いいから、独習Cと独習C++あたりでも一通り読んできなさい。
0919デフォルトの名無しさん
2008/02/03(日) 22:35:38>>918の言うとおりだが、立ち読みは迷惑なのでちゃんと買おうな。
0920デフォルトの名無しさん
2008/02/03(日) 22:37:490921デフォルトの名無しさん
2008/02/03(日) 22:39:070922デフォルトの名無しさん
2008/02/03(日) 22:39:470923デフォルトの名無しさん
2008/02/03(日) 22:43:09#include <stdio.h>
typedef struct{
char no[6];
char name[21];
int tanka;
}SHOHIN;
void main(void)
{
int i;
SHOHIN shohin[5];
FILE *fp;
if((fp=fopen("shohin.txt","w"))!=NULL);
{
for(i=0;i<LEN;i++){
printf("商品番号、商品名、単価\n");
scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka);
fprintf(fp,"%s",shohin[i].no);
fprintf(fp,"%s",shohin[i].name);
fprintf(fp,"%d\n",shohin[i].tanka);
}
fclose(fp);
}
return;
}
文字化けが起きてうまくいきません
例えば a,a,1と入力すると
a,a,11245072
となってしまいます
単純なミスだと思うのですがどうか教えてください!
コンパイラはbcc55を使用しています
0924デフォルトの名無しさん
2008/02/03(日) 22:46:09<scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka);
>scanf("%s,%s,%d",shohin[i].no,shohin[i].name,shohin[i].tanka);
こうするとどうだ
0925デフォルトの名無しさん
2008/02/03(日) 22:46:48次の二行を削除(もしくはコメントアウト)してみな
fprintf(fp,"%s",shohin[i].name);
fprintf(fp,"%d\n",shohin[i].tanka);
0926デフォルトの名無しさん
2008/02/03(日) 22:48:33同じでした・・・
0927デフォルトの名無しさん
2008/02/03(日) 22:49:370928デフォルトの名無しさん
2008/02/03(日) 22:50:22文字化けが消えました!
どうもありがとうございました!!!
0929デフォルトの名無しさん
2008/02/03(日) 22:52:00将来の拡張のために ID の範囲は余裕を持っておく
ぐらいのことは普通にあるだろ。
0930デフォルトの名無しさん
2008/02/03(日) 22:53:40そうじゃなくて %s でひと続きの文字列として shohin[i].no 以下に格納されてるだけってのを見て欲しい
0931デフォルトの名無しさん
2008/02/03(日) 23:04:56tryの中にほとんどの記述を入れるのでしょうか。
とある本で例外処理の部分を読んでいる初心者ですが、
この章だけは、mainのほとんど(catch以外)を
tryの中に入れてます。だけど、この後の章では
ざっと見た限りほとんど入れてないように思います。
例外をことごとく捕まえたいときには、実際の
現実的なプログラムだとどうなるのでしょうか。
先走っているのかもしれませんが気になるので教えてください。
0932デフォルトの名無しさん
2008/02/03(日) 23:10:06自動変数のデストラクタが走る保証はない。
もしそれで致命的なリソースリークが起こるなら、
例外をキャッチするべきなんだろうな。
0933デフォルトの名無しさん
2008/02/03(日) 23:10:57只只 只只只只
只只 只只只
|
凸
0934デフォルトの名無しさん
2008/02/03(日) 23:13:57mainの処理全体をtryで囲むのは、例外即終了でおkな場合でしょ。
0935デフォルトの名無しさん
2008/02/03(日) 23:15:43mainでキャッチしても、エラーメッセージ出すくらいしか使い道無くないかな
例外でアプリを落としてもいい場合は、キャッチしなくてもいいかな
落としたくない場合は、落としたくない箇所でキャッチすれば良い。たとえばメッセージループとかかな
質問だけど、DLL書いたとき、エントリのところで例外全部キャッチしたほうがいいかな
0936デフォルトの名無しさん
2008/02/03(日) 23:18:34基本は全部囲っておかないと、 catch 漏れが無いか気をつけないといけなくなる。
0937デフォルトの名無しさん
2008/02/03(日) 23:41:16まあ、COM入門で出てくる話だが、「例外はDLL境界
超えられないものとして扱うべき」だな。
0938931
2008/02/03(日) 23:43:24どうもでした。
mainの中で全部っていうのは、
この本の(この章の)説明の都合なんですね。
こういうことでよろしいのでしょうか。
・mainの中でcatchしてもエラーメッセージを出すくらいの
処理しかできないので、基本は処理できるところで捕まえる。
・ただし、catchもれの心配もあるのでmainも全部囲う。
(もしかしてここはプロの方でも人によるとか、、?)
0939デフォルトの名無しさん
2008/02/04(月) 00:12:560940デフォルトの名無しさん
2008/02/04(月) 00:17:20確認させてください。スタックの巻き戻しってのは
例外だろうが何だろうが、スコープを抜けたら
構築済みのローカルオブジェクトは正しくデストラクタ
が呼ばれて解放されるんではないんだっけ?
これがRAIIを使ったリソース管理のメリットだと
思ってたんだけど。throwされた例外は確実にcatch
されないとリークするの?
{
boost::shared_ptr<Widget>(new Widget);
throw Reigai();
}
この場合、例外でスコープを抜けても
どこかでcatchされないとデストラクタ
が呼ばれずに、そのままterminateしてしまう?
0941デフォルトの名無しさん
2008/02/04(月) 00:24:000942デフォルトの名無しさん
2008/02/04(月) 01:15:31そういう規格なんだろうか。
ハーブサッターの本の例外の話は嘘か?
0943デフォルトの名無しさん
2008/02/04(月) 01:17:15throwした時点でterminate呼んでも良いみたいな話?
0944デフォルトの名無しさん
2008/02/04(月) 01:25:56規格に書いてあった。
0945デフォルトの名無しさん
2008/02/04(月) 01:29:13Exceptional C++の例外安全の話
項目13 P53とか
”例外が投げられてスコープから出たときにデストラクタが
呼び出され。。。”
って書いてあるから勘違いしてたかも。
0946デフォルトの名無しさん
2008/02/04(月) 01:49:510947デフォルトの名無しさん
2008/02/04(月) 02:05:31それじゃ、”例外が投げられてスコープから出たときに
デストラクタが 呼び出され。。。” じゃなくて、
「その例外がcatchされたとき、。。。」って書けよなあ。
0948デフォルトの名無しさん
2008/02/04(月) 02:10:42でもわかって良かった。
0949デフォルトの名無しさん
2008/02/04(月) 02:35:220950デフォルトの名無しさん
2008/02/04(月) 02:40:10Stack Unwinding in the Event of an Uncaught Exception
When an exception is thrown and no matching handler can be found for it,
C++ invokes the function terminate(). By default, terminates invokes the
function abort(). (ここまでは規格の話だろうね)
Some compilers guarantee that at this point, the stack
has been unwound, i.e., all local automatic objects have been fully
destructed, streams have been flushed, and open files have been closed.
Other compilers don't unwind the stack in this case. In other words,
whether the stack is unwound in the case of an uncaught exception is
platform-defined. Therefore, you should check your compiler's
documentation to know how it behaves in the event of an uncaught
exception.
0951デフォルトの名無しさん
2008/02/04(月) 04:16:27test::test(){各変数の初期化}というコンストラクタがあった場合
test *p;
p=new test [n];
とした場合も*p[0〜(n-1)]の全てがコンストラクタが実行されて初期化されますか?
0952デフォルトの名無しさん
2008/02/04(月) 04:32:250953デフォルトの名無しさん
2008/02/04(月) 04:36:09ありがとうございます。
かなり時間かけてクラス作ったのにコンストラクタ実行されなかったら泣くところだった
0954デフォルトの名無しさん
2008/02/04(月) 07:36:14本当にそれした方がいいかどうかは分からんね。
どちらにしろ強制的に terminate される状況もあるわけだし、
よほど呼んでもらわないと困る処理は
set_terminate 側で対処した方がいい気もする。
0955951
2008/02/04(月) 10:45:38で追いかけてみたところコンストラクタが実行されてません。
もしかしてvectorで確保した場合はコンストラクタ実行されないんでしょうか?
0956デフォルトの名無しさん
2008/02/04(月) 10:49:29どうやって計算するのが一番よいですか?
自分は、boost::lambdaをつかってるんですが、なんかもっと他の書き方が
ありそうな気がして。(自分的にはboostがインストールされてないとダメなのが
嫌なんだけど、和、積、など他の演算にも対応がしやすくていいと思ってる)
int tmp = 0;
for_each(v.begin(), v.end(), tmp += boost::lambda::_1);
ここのスレの他の人のやり方を見せてください。
0957デフォルトの名無しさん
2008/02/04(月) 10:54:390958デフォルトの名無しさん
2008/02/04(月) 11:24:24そうか、、、。
そういわれると、そういう気もする。
なんだか956が恥ずかしいな。わすれてください。
0959デフォルトの名無しさん
2008/02/04(月) 11:29:25tmp = accumulate(v.begin(), v.end(), 0);
0960デフォルトの名無しさん
2008/02/04(月) 11:44:37コピーコンストラクタ書いてる?
0961デフォルトの名無しさん
2008/02/04(月) 11:45:08どうなるのでしょうか?
それと、ビットシフト演算子が算術シフトか論理シフトになるかどうかは
環境依存であってますか?
0962デフォルトの名無しさん
2008/02/04(月) 11:55:12scanfなどで変数値を入力するプログラムを書いたとき、
事前に表示する「数字を入れてください」などの文章が出ず、
scanfに値を入力する待機状態になってしまいます。
どうしたらよいのでしょうか。
すみません。お教えください。
0963デフォルトの名無しさん
2008/02/04(月) 11:56:551) b - a + (UINT_MAX+1)
2) 左右シフトともに負の値のシフトに関して未定義。
いきなりエラーで落ちても文句は言えない。
C規格の専用スレもあるので活用してください。
0964962
2008/02/04(月) 12:11:12putsなりprintfなりを書いた後、fflush(stdout)をしました。
失礼しました。
0965デフォルトの名無しさん
2008/02/04(月) 12:17:35すばやい回答ありがとうございます。もうひとつ質問がありました。
たびたびすいません。
両方ともunsigned intであるa * bが表現可能な数値の範囲を超える場合、
仕様による動作は未定義であってますでしょうか?
その動作に依存するコードを発見したので、書き直そうかどうか迷ってます。
ただ、画像処理(アルファブレンディング)に関するコードなので、書き直す
と命令数が増大して遅くなってしまうので、躊躇してます。
>C規格の専用スレもあるので活用してください。
初心者お断りと書いてあるのですが、このような質問でも大丈夫
なのでしょうか?
0966デフォルトの名無しさん
2008/02/04(月) 12:20:57a * b % (UINT_MAX+1)
符号なし整数型の算術演算の結果があらわせる範囲を超えた場合はループする
頭の悪いやつがつけたスレタイを気にする必要はない。
0967デフォルトの名無しさん
2008/02/04(月) 12:25:26ループするのですね、ありがとうございます。
コード書き直す必要が無いとわかって助かりました。
今度からこのような質問は規格スレに持っていく事にします。
0968デフォルトの名無しさん
2008/02/04(月) 12:26:25<numeric>ですね。これほとんど使ってなかったんだよな。
恥ずかしいが、自分的にはaccumulateとか知ったからよかったよ。
ありがとう。
0969デフォルトの名無しさん
2008/02/04(月) 14:04:32そもそもαブレンディングでオーバフローするような数字を扱うわけじゃないだろ。
そこを吟味せずにオーバフロー対策なんて意味ないぞ。
例えば、rgb各8ビットの画像から画素の値を取り出す場合は通常0-255の値域を取る。
そこで、unsigned intのr, g, b, ra, ga, baがあるとしたらr * raは何があってもオーバフローしないわけだ。
0970デフォルトの名無しさん
2008/02/04(月) 14:34:430971デフォルトの名無しさん
2008/02/04(月) 17:34:53誤字脱字ありすぎで正直自分が悪いのか本が間違ってるのかコンパイラの問題なのかわからん。
Borland C++ Compiler 5.5
#include <stdio.h>
#include <float.h>
int main()
{
double pai = 3.14159265358979;
int mon = 2;
printf("%d\n", mon = 3);
printf("%e\n", pai);
printf("%05d\n", mon);
printf("%20.18f\n", pai);
return 0;
}
で
3
3.141593e+000
00003
3.141592653589790000
と表示されるらしいのだが、
�@二行目が 3.141593e+00 、四行目が 3.141592653589790007 になる。
�Aコンパイラが警告を出す。('mon'に代入した値は使われていない)
どうしたらいいのか教えてください。
0972デフォルトの名無しさん
2008/02/04(月) 17:46:50正常。浮動小数点演算は丸め込みとかでコンパイラによって結果が若干変わる場合がある
gcc 3.2.2 [FreeBSD]
3
3.141593e+00
00003
3.141592653589790007
bcc32 5.6.4
3
3.141593e+00
00003
3.141592653589790007
cl(VC++) 13.00.9466
3
3.141593e+000
00003
3.141592653589790000
警告はint mon = 2;の後に値を読み出さずに3だを代入してるから出る。基本的に無害。
0973デフォルトの名無しさん
2008/02/04(月) 17:52:22安心した、ありがとうございます。
0974デフォルトの名無しさん
2008/02/04(月) 18:03:21コードは載せられませんが、アルファブレンディングは
alpha*src + (1 - alpha)*dst
になりますが、そのコードでは一時変数を嫌って、
alpha * ( src - dst ) + dst
になってました。
0975デフォルトの名無しさん
2008/02/04(月) 22:20:29クラスのインスタンス名を書いたときに、特定の処理結果を返すようにする方法はありませんか?
具体的には
class ClassA{
int val;
}
ClassA ca;
があったとして
cout<<ca.val;
と書くところを
cout<<ca;
で出来るようにするという事です。
宜しくお願いします。
0976デフォルトの名無しさん
2008/02/04(月) 22:22:42<<演算子をオーバーロードしろよ
0977975
2008/02/04(月) 22:31:18条件式に単独で入れたときにvalの値でboolに変換されるようには出来ませんか?
0978デフォルトの名無しさん
2008/02/04(月) 22:34:31とかじゃだめなん?
0979デフォルトの名無しさん
2008/02/04(月) 22:34:450980デフォルトの名無しさん
2008/02/04(月) 22:39:460981デフォルトの名無しさん
2008/02/04(月) 22:40:270982デフォルトの名無しさん
2008/02/04(月) 22:54:31訳わかんねえことがいっぱい起こるから、やめといた方がいい。
0983デフォルトの名無しさん
2008/02/04(月) 23:00:470984975
2008/02/04(月) 23:19:06そういうものがあるというのは読んだんですが用途まで考えていませんでした…。
>>980の方法で良さそうです。
>>979のoperator void*でも上手くいきましたが
条件式の中身はboolにキャストされると思っていたんですが、
void*でも動くのはどういう意味なのか教えてもらえないでしょうか。
0986デフォルトの名無しさん
2008/02/04(月) 23:26:16void *m = malloc(len);
if( m ) { return m; } else { abort(); }
みたいな処理ってやったことないの?
0987デフォルトの名無しさん
2008/02/04(月) 23:27:42982でも書いたが、operator boolのオーバーロードはやめとけ。
ClassA a, b;
int c = a + b;
int d = abs(a);
みたいのがコンパイル通っちまう。
>>979 が常道。
0988975
2008/02/05(火) 00:02:09条件式に入るクラスは数値かポインタへの変換を持っていれば良くて、
operator void*を定義しておけばそちらに変換されると。
でintからboolよりもintからポインタの方が予期せぬ動作が少ないのでvoid*を使うべきと。
知識が足りてなくてレス読みつつググったりして勉強になりました。
どうもありがとうございました。
0989デフォルトの名無しさん
2008/02/05(火) 00:03:21ポインタはboolへの暗黙の変換がある。
cinもそれを利用してif(cin)を可能にしている。
その方法が>>979の方式だ。
boolへの暗黙の変換はおすすめできない。
0990デフォルトの名無しさん
2008/02/05(火) 00:03:40bool 値として使用したいのならそんなもんじゃね?
そうでないならそもそも演算子オーバーロードで解決すべきじゃないと思う。
0991デフォルトの名無しさん
2008/02/05(火) 00:23:350992デフォルトの名無しさん
2008/02/05(火) 00:31:24bool b = !!a;
0993デフォルトの名無しさん
2008/02/05(火) 00:33:44すごー。でもそのくらいの方が有り難い。
まえに operator bool()を定義してて、コンパイラがブッ壊れたかと思った。
0994デフォルトの名無しさん
2008/02/05(火) 00:44:42つまり、関数呼べちゃうってことか?
メンバポインタとかの方が良くね?
0995デフォルトの名無しさん
2008/02/05(火) 00:48:01メンバ関数ポインタだぜ?
そうそう呼べはしないとおもうが。
0996デフォルトの名無しさん
2008/02/05(火) 00:49:29ならいいが。
0997デフォルトの名無しさん
2008/02/05(火) 01:19:14http://pc11.2ch.net/test/read.cgi/tech/1202141921/
0998デフォルトの名無しさん
2008/02/05(火) 01:20:11http://pc11.2ch.net/test/read.cgi/tech/1202141921/
0999デフォルトの名無しさん
2008/02/05(火) 01:22:101000デフォルトの名無しさん
2008/02/05(火) 01:24:4110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。