スレを勃てるまでもないC/C++の質問はここで 5
■ このスレッドは過去ログ倉庫に格納されています
過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
0459デフォルトの名無しさん
2009/01/03(土) 15:39:52英和辞書引け、でいいのに。
0460デフォルトの名無しさん
2009/01/03(土) 15:40:21そう
0461デフォルトの名無しさん
2009/01/03(土) 15:40:44基本的にはそうだが、
アラインメントされてないと
データを読めない CPU もある。
0462デフォルトの名無しさん
2009/01/03(土) 15:40:57手動でやる場合もある
0463デフォルトの名無しさん
2009/01/03(土) 15:41:000で割るってどういうことか知ってる?
0464デフォルトの名無しさん
2009/01/03(土) 15:41:49宇宙の法則が乱れる
0465デフォルトの名無しさん
2009/01/03(土) 15:42:150466デフォルトの名無しさん
2009/01/03(土) 15:44:34visual stdioが破壊されるってことだろ。
素直にオープンソース使えって。
無理するな。
0467デフォルトの名無しさん
2009/01/03(土) 15:45:39アラインメントをキーワードにググってみた。
説明ありがとー
0468デフォルトの名無しさん
2009/01/03(土) 16:21:15おいっ、絡まれてまともにレス出来ないなら、お前がレスしなきゃ良くね?
だってここ、誰もお前個人を特定、指定してレスを求めているわけじゃないんだが
言うからには自分の発言に責任を持っているんだろうな?
ほれ、鏡を見ろよ。醜い酷い面が映っただろ?誰だよそれ?
そう、お・ま・え・だよ?分かる?それが現実。自分が見たものはどうこう言うくせに
自分で自分を見られる唯一の手段、何か姿を映し出すものを見た時
己の醜さを目の当たりにするのさ。今のあんたみたく。
あんたの発言、第三者から見れば、きんもぉ〜★だぜ?
0469デフォルトの名無しさん
2009/01/03(土) 16:22:56以下のようにvectorに追加する前のインスタンス
とvector内のインスタンスでprint()を実行したのですが、
addr=0x804b008
addr=0x804b018
と別のアドレスになります。
同じになると思っていたのですが、
これはvectorに登録する時点でインスタンスが
コピーされていると考えればいいのでしょうか?
またその場合オーバーヘ%8
0470デフォルトの名無しさん
2009/01/03(土) 16:23:26#include <vector>
using namespace std;
class MyClass {
public:
MyClass() {};
~MyClass() {};
void print() {
cout << "addr=" << this <<endl;
}
};
int main(int ac, char *av[])
{
vector<MyClass> vec;
MyClass *my = new MyClass();
vec.push_back(*my);
my->print();
vec.at(0).print();
delete my;
return 0;
}
0471469
2009/01/03(土) 16:24:46以降の続き
またその場合オーバーヘッドが気になるんですが、
皆さんどう対処してらっしゃいますか?
お願いします。
0472デフォルトの名無しさん
2009/01/03(土) 16:27:46ただ、
vector<MyClass*> vec;
vec.push_back(my);
みたいにアドレスをコピーする分には
インスタンスのコピーは発生しない。
ただ、メモリ管理を自分でしないといけなくなってしまう。
boost::ptr_vector を使うという手もある。
0473デフォルトの名無しさん
2009/01/03(土) 16:29:50で初期化される (記憶があいまいなのでちょっと違うかも)
で、言うとおりコピーはされる。ポインタのコピーに比べれば
効率は悪いけど、実際そんな小さなことが問題になることはほとんどない。
よっぽどでかいデータ構造をソートしまくるとかでない限り。
0474デフォルトの名無しさん
2009/01/03(土) 16:31:56コピーコンストラクタの実装がマズくて
問題が発生しないかチェックする方が重要だったりするよね。
0475デフォルトの名無しさん
2009/01/03(土) 16:47:54それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、
ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。
自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。
大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて
いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても
もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて
いくらでもある。ただ・・・
while(代入式) は不適切だ。
0476デフォルトの名無しさん
2009/01/03(土) 16:50:59「いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、
ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。
自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。
大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて
いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても
もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて
いくらでもある。」
ここまでそっくりそのままお前に返すよwww
0478デフォルトの名無しさん
2009/01/03(土) 16:59:49while(代入式)が不適切だろうがなんだろうが正しいんだから。
0479デフォルトの名無しさん
2009/01/03(土) 17:08:53コンパイルできて規格合致であることは誰も否定していない。
0480デフォルトの名無しさん
2009/01/03(土) 17:11:38まぁ確かに。
言いたかったのは、そこまで熱くならんでもいいんじゃね?ってこと。
0481デフォルトの名無しさん
2009/01/03(土) 17:13:34478みたいな書き方だとまた話を蒸し返されそうな雰囲気だから勘弁してくれ。
0482デフォルトの名無しさん
2009/01/03(土) 17:13:44いや、否定してる奴が約一名いるぞ
>>442 とか>>475 とか
0483デフォルトの名無しさん
2009/01/03(土) 17:15:22失礼した。
書き方に気をつける。
0484デフォルトの名無しさん
2009/01/03(土) 17:16:04linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、
経験積んだらそういうソースにも慣れると良い
0485デフォルトの名無しさん
2009/01/03(土) 17:33:250486デフォルトの名無しさん
2009/01/03(土) 17:42:19呂布かいでし
0487デフォルトの名無しさん
2009/01/03(土) 17:44:550488デフォルトの名無しさん
2009/01/03(土) 19:17:030489デフォルトの名無しさん
2009/01/03(土) 19:59:08そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。
0490デフォルトの名無しさん
2009/01/03(土) 20:05:450491デフォルトの名無しさん
2009/01/03(土) 20:58:12if(hoge()!=0)...
とか?
あるいは、if((x<y)!=0)...
ということだろうか?
0492デフォルトの名無しさん
2009/01/03(土) 21:00:050493デフォルトの名無しさん
2009/01/03(土) 21:05:04真理値型の無い言語だぞ?
巣に帰れよ。
0494デフォルトの名無しさん
2009/01/03(土) 21:16:20前屈みになって腕を横に挙げるやつ
0495デフォルトの名無しさん
2009/01/03(土) 21:18:090496デフォルトの名無しさん
2009/01/03(土) 21:19:330497デフォルトの名無しさん
2009/01/03(土) 21:32:53処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、
if(hoge()){・・・}
if(hoge()==TRUE){・・・}
とか。
0498デフォルトの名無しさん
2009/01/03(土) 22:01:46お前の頭はC89止まりか。
0499デフォルトの名無しさん
2009/01/03(土) 22:07:12と
左辺が右辺以上の時
って何が違うんでしょうか?
>これと>=を使い分けたりすることってあるのでしょうか?
0500デフォルトの名無しさん
2009/01/03(土) 22:09:23ちゅうがっこう から やりなおせば
わかると おもいます。
0501デフォルトの名無しさん
2009/01/03(土) 22:11:25それいぜんに にぽーんごの もんだいかと
おもわれまっしゅる
0502デフォルトの名無しさん
2009/01/03(土) 22:12:31\丶\\ ////
|・\ _____ /・> ///
/ ̄ ̄ ̄ ̄\,, ミ\.\ヽ|||liiiii||/ /./彡 ////
|・\ /_____/・> /\.\|||iii||l//彡 ノ(
ミ \.\ヽ|||liiiii||/ /./ノ( / / (,-、 ,:‐、 ) \ ⌒ヽ
\.\|||iii||l// | ⌒ .|/ ─////─ ヽ |
|(,-、 ,:‐、 ) 6 l |. ////── | .| \\\
. ////Vヽ ,-′ ////'VVVヽ | l
////ェ∧/_ /ヽ . //// γ l / /
//// |/\/ l ^ //// i∧ェェェ∧/ / /
//// | |//// l━━(t)━━━━┥
0503デフォルトの名無しさん
2009/01/03(土) 22:28:36左辺==右辺の時に真になるか偽になるかの違い。
必要に応じて>と>=のふさわしい方を使う。
0504デフォルトの名無しさん
2009/01/03(土) 22:30:48xが12以上の時
より・・以上・・そこにある違い・・それが問題ってことですよね?
0505デフォルトの名無しさん
2009/01/03(土) 22:30:520506デフォルトの名無しさん
2009/01/03(土) 22:32:36x >= 10 == x > 10
は偽になるってことでしょうか?
0507デフォルトの名無しさん
2009/01/03(土) 22:34:120508デフォルトの名無しさん
2009/01/03(土) 22:42:07x==10のときだけ偽、それ以外は真。
0509デフォルトの名無しさん
2009/01/03(土) 22:42:370510デフォルトの名無しさん
2009/01/03(土) 22:44:32優先順位知らないんなら口出すなw
0511デフォルトの名無しさん
2009/01/03(土) 22:47:210512デフォルトの名無しさん
2009/01/03(土) 22:59:32そ・・そうか!!
やっと理解できました!!!!
x < 10は10もは含まれないってことですよね!?
だから
int a;
cin>>a;
if("x < 10"){
cout<<”真"<<endl;
はxが10より小さいってことで
つまり10と入力しても偽になるわけだ!!!!!!!!!
0513デフォルトの名無しさん
2009/01/03(土) 23:16:33はどうなりますか?
0514デフォルトの名無しさん
2009/01/03(土) 23:17:470515デフォルトの名無しさん
2009/01/03(土) 23:17:500516デフォルトの名無しさん
2009/01/03(土) 23:18:130517デフォルトの名無しさん
2009/01/03(土) 23:25:240518デフォルトの名無しさん
2009/01/03(土) 23:27:070519デフォルトの名無しさん
2009/01/03(土) 23:30:13条件式じゃないと暴れだす奴がくるぞw
0520デフォルトの名無しさん
2009/01/03(土) 23:34:54そのアイデア貰った
0521デフォルトの名無しさん
2009/01/03(土) 23:43:250522デフォルトの名無しさん
2009/01/03(土) 23:43:49while("無限ループ")
{
/* なんか */
}
まあ、しないけど
0523デフォルトの名無しさん
2009/01/03(土) 23:44:49さすがにお前の粘着ぶりがキモイ
0524デフォルトの名無しさん
2009/01/03(土) 23:46:13基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。
0525デフォルトの名無しさん
2009/01/03(土) 23:49:410か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく
代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・
0526デフォルトの名無しさん
2009/01/03(土) 23:51:040527デフォルトの名無しさん
2009/01/03(土) 23:53:390528デフォルトの名無しさん
2009/01/03(土) 23:55:300529デフォルトの名無しさん
2009/01/04(日) 00:00:53>while文の括弧の中は、
>本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、
>それに対して条件式にあう措置をとるべき。
0530デフォルトの名無しさん
2009/01/04(日) 00:03:01ファビョってるのは「while文の中は、条件式が適切なのに、代入式で…」うんぬん
いってる>>442だろ
ながれ読めよ
>>525
>>456 で結論出てるのにいつまでやってんの?
0531デフォルトの名無しさん
2009/01/04(日) 00:04:48>>524=>>442で本人だからしょうがないんだよw
0532デフォルトの名無しさん
2009/01/04(日) 00:15:460533デフォルトの名無しさん
2009/01/04(日) 00:29:140534デフォルトの名無しさん
2009/01/04(日) 00:29:510535デフォルトの名無しさん
2009/01/04(日) 00:30:160536デフォルトの名無しさん
2009/01/04(日) 00:37:35この文の * が意味することがまったくわかりません
*の後に文字もないのですが、ポインタとしてありえなくないでしょうか?
0537デフォルトの名無しさん
2009/01/04(日) 00:38:300538デフォルトの名無しさん
2009/01/04(日) 00:51:54それは「私は子供ではない」と誇示したいからである。
では、「私は大人だ」と主張する人間が「大人」なのだろうか。
答えは否、断じて否である。
0539デフォルトの名無しさん
2009/01/04(日) 00:56:570540536
2009/01/04(日) 00:57:57sockaddr構造体のポインタとしてあつかうってことでしょうか?
まったく何をしているか理解できないのですが
0541デフォルトの名無しさん
2009/01/04(日) 00:58:580542デフォルトの名無しさん
2009/01/04(日) 01:00:57その通りの事をやっている。
sockaddr_in 構造体を sockaddr 構造体であるかのように
無理矢理見なして渡している。
sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、
かつ、こうやってキャストしてもいいと問題ないとされている。
0543デフォルトの名無しさん
2009/01/04(日) 01:02:07そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。
0544536
2009/01/04(日) 01:03:51見なす理由がわからないのです。
sockaddr_inのほうが入ってる情報というか入力する情報は多いし
その情報はconnectする際に必要だと思います。
なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません
0545デフォルトの名無しさん
2009/01/04(日) 01:07:27int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
2番目の引数の型には、const struct sockaddr *が”必要”
0546536
2009/01/04(日) 01:08:58ていうか、入れてしまっては前述した疑問がわいてしまって
0547デフォルトの名無しさん
2009/01/04(日) 01:10:08connect()を作った人間がそういう風に作ったから。
0548デフォルトの名無しさん
2009/01/04(日) 01:11:16なんというか……
0549デフォルトの名無しさん
2009/01/04(日) 01:12:22総称的な型として sockaddr を用意して、
connect は sockaddr* を受け取る汎用的な形にしておいて、
より詳細な構造体として sockaddr_in を用意し、
それをキャストして渡す、という風になってんじゃないのかね。
場合によっては sockaddr_in 以外のものも作るつもりだった、
あるいは将来作れるように、そういう風にしてんじゃない?
void* でいいような気もするけど、
それだと何でもキャスト無しに渡せちゃうから、
渡していい構造体なのかどうか注意して指定させるように、
キャスト無しでは渡せないようにしているんだと思う。
まあ、全部推測だけどね。
0550536
2009/01/04(日) 01:13:40しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、
アドレスないから接続できなくないのでは?ということです。
0551デフォルトの名無しさん
2009/01/04(日) 01:14:33現状が正しい前提で理由を付けなくてもいいと思うけど。
頭いいひとにありがちだよね。
0552デフォルトの名無しさん
2009/01/04(日) 01:16:41結局改造なんてしなかった、
ってこともよくある話で。
互換性のために、とかもよくある話。
0553デフォルトの名無しさん
2009/01/04(日) 01:18:58int connect(int sockfd, const void *addr, socklen_t addrlen);
なら、キャストする必要はないが、connect の第二引数が struct sockaddr である以上、
キャストする必要がある。
ここではキャストする型が重要なのではなく、socket作成時に指定したプロトコルファイミリーが重要。
プロトコルファミリーごとにconnectに必要な情報量は異なり、
kernelでもプロトコルファミリーごとに呼ばれるconnecが異なる。
kernelではaddrlen分ユーザー空間からメモリをコピーし、
所望の処理を行うので、struct sockaddr が重要なのではない。
0554デフォルトの名無しさん
2009/01/04(日) 01:20:44ああ、そういうことか。
sockaddr_inはsockaddrをIPv4に特化したもの。
sockaddr_inを使うのはIPv4だけだ。
connect()はIPv4以外でも使われる。
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html
AF_INETの他に
AF_APPLETALKとかあるだろ。
0555536
2009/01/04(日) 01:26:58socketでAF_INETを指定しているのですが、
この場合だとIPv4でconnectしてるということでは?
0556デフォルトの名無しさん
2009/01/04(日) 01:34:20そう。
sockaddr_inを使うのはsockaddrを使うより便利だから。
IPv4を使う場合でもsockaddrにアドレスを設定してもいいよ。でも面倒だよ。
ともかく、connect()が必要とするのはsockaddr_inではなくsockaddrなの。
/usr/include/sys/socket.h にstruct sockaddrとstruct sockaddr_inの定義があるから見比べてみてよ。
0557デフォルトの名無しさん
2009/01/04(日) 01:36:55sockaddrとしてもsa_familyが読み取れる。
そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。
ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。
>>549
そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。
0558デフォルトの名無しさん
2009/01/04(日) 01:39:57sockaddr::sa_family だけでよかった気もする。
■ このスレッドは過去ログ倉庫に格納されています