【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
前スレ
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1478440682/ てかpairなんて変数名使うなよ
誰か頭おかしいやつがusing namespace stdしたらどうすんだよ てか細々とひどいね
こんな短いコードでよくもまぁ無能をここまで晒せるなと思う >>147
意味わからん
ひょっとしてコード読めてない? >>148
なんの問題もないけど?
って思ったらいちゃもんしかつけられない奴かよ w >>151
make_pair知らないの?
なんでコピーコンストラクタ使わないの?
てかemplace知らないの?
ifのステートメントの中がひどい プログラム板ってみんなこんな感じなの?
とりあえずバカにする
みたいな >>146
なぜ?その理由は?
書くならそこまで書けよ無能 >>157
わけわかんないオレオレコードより、テスト済みの標準ライブラリ関数のほうが信頼できるから 安易にライブラリを使うから、パフォーマンスがどんどん悪くなるんだな >>155
自分の知識目一杯使って的はずれなマウンティングしてる奴がいるだけ w あと、自分がコメントできそうな話題になるとここぞとばかりに知識を披露しようとして、
主題からずれたことを言い出したり、
さらにそれに間違いがあって余計なツッコミや攻撃的コメントを呼び込むのも
よく見る風景。 さほど広い範囲を読んでるわけじゃないけど、
C++関連は特に殺伐としてる感じはあるな。 >>159
まずは意図が伝わるようにと言う意味でシンプルに書くことが重要。
標準ライブラリ使用は最低限のマナー。
チーム開発してると、上記を踏まえずオレオレ判断でパフォーマンスガー言っている人が、一番迷惑なんだよね。 仕事だとメモリ効率や実効速度より開発効率が優先されるからな パフォーマンスどうこうで、標準ライブラリ使わなくても許されるのは、mkl開発チームとか、eigenのコミッターレベル >>164
>まずは意図が伝わるように
ならお前、>>133が何してるか説明出来るんだよな? >>167
それが元ネタかー!
すみませんでした _orz
無理っていうか、>>143でおk派ですw >>169
答えられないから回答を逸らすんですねわかります
まさか「あるvalueを持つpairだけを別のmapに移す」なんて言わないことを祈る ん?
でも、よく見たら>>133割りとわかりやすいじゃん?
今、スマホの小さい画面で改行が多いから面食らったけど、2行(かな?)でみれば、とてもシンプルで意図も読み取れるわ。 ちょっとテンパったけど、そのレベルなら正直どっちでも構わないな。
コメントがあれば。 >>144
どう見ても>>133の方が酷いお題改変なのだが
それをさしおいて>>143に指摘とはこれ如何に >>165
どうでも良いことにこだわってるあたり、
開発スピードが速いようには見えないなあ >>127
亀だがバイナリ書き込みは後で読み込むときに構造情報が欠けてることが多いからできれば避けたほうがいい
abcde が可変長になりそうなところとかな 個人的には BENCODE がなかなかいいんじゃないかと思ってる。 >>177
>バイナリ書き込みは後で読み込むときに構造情報が欠けてることが多い
欠けているのは>>177の知能だろ enum EMFType
{
MF_INT, // 符号付き整数
};
// いろいろなデータを1つの関数で表示します
void MultiFunc(EMFType type, unsigned int data)
{
switch(type)
{
case MF_INT : cout << (int)data << endl; break;
}
}
int main()
{
int a = -10;
MultiFunc(MF_INT , a);
return 0;
}
実行結果
-10
unsigned int にマイナスの値を渡してるんですが、そのまま出力されます。
これが仕様だとすると、パラメーターにunsigned int を指定する意味はなんなんでしょうか? >>181
なんでcoutでintにキャストしてんの >>180
MultiFuncを作った人にきけば? >>181
ありがとうございます。コンバイラかバージョンの問題ですかね。
>>182
http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
ここで勉強してたら出てきたんですが、完全には書いてること理解できてないんで何でかはわかりません。 >>180
cout時にintにcastしているからでは? >>185
よく見てくれ,cout << (int)x
の (int) のキャストが問題となっている,なぜ (int) のキャストをしているのかは読み取れないが >なぜ (int) のキャストをしているのかは読み取れないが
ふむふむ、これがイケヌマと言う奴だな これが読み取れない者はC/C++より国語の勉強をした方がよいのではないか 業務ではよくあるよ。
バグか仕様か分らないっての。書いた本人は既にいなくて誰も答えを知らない。 型消し、type eraserだから、データ構造に意味が無ければ、悪い設計だろう。 >>190
で、なぜキャストしてるの?
読み取れた結果を披露してちょ >type eraser
まさか、type erasureのつもりだった!? >>194
パラメーターの型は適当に決めたもので、EMFTypeで指定されたint型で取り出すのが目的だからだろう
「いろいろなデータを1つの関数で表示します」と書かれているのだから
イメージは↓
https://wandbox.org/permlink/WhWaxSM5nHZdAj9n これはきっとロベールさんが知恵を絞って考えた、徐々に発展していく例題だったに違いない
と思って調べたら単なる型変換の説明だった >>187
すいません、よく見てませんでした。
unsigned intでひっくりかえった値はintでキャストしなおすと元に戻るんですね。勉強になります。 int ⇔ unsigned intだからそれ程でもないけど
たかが型変換と思って単純そうに見えて実は深い もしかしてunsigned int a = -10が10だと思ってるじゃ unsigned intとintの変換って戻る保証あったっけ?
教えてエロい人 そうなの?
補数表現が違うと戻らなくなるんだっけ? いつもの
・現実にはダメな処理系はない
けど
・仕様では保証されない
って奴じゃね? この速さなら言える
unsigned intが分からない
少なくともunsignedの-10が10じゃないことは分かった 俺もunsignedに負数を代入した場合
どーなるのかわかってなかったわ
つーか、そんな処理入れる機会なくね?
わざわざバグったコード書いて
どうなるんですかって聞いているようなもん intが32ビットの整数と仮定すると、
-1==0xFFFFFFFF。
これに1を足すと、オーバーフローして
0==0x00000000
となる。
-2は-1==0xFFFFFFFFよりも1だけ小さいので0xFFFFFFFEだ。 処理系依存な内容とそうじゃない内容はちゃんと区別しよう >>209,210
仮にこの範囲の整数を扱える型(X型)があったとすると
-4 -3 -2 -1 0 1 2 3 4
unsigned X型はこの範囲を扱える
0 1 2 3 4 5 6 7 8
X型の-1は-1
unsigned X型の-1は8になる
同じ数だけ(この場合9つ)表現できるのは変わらず
unsignedは最小値が0になる 符号つき(signed)の値の場合、一番上のビット(最上位ビット)を符号として扱う。そういう決まりになっている。
例えば、0x80000000は一番小さい符号つき32ビット整数になり、0x7FFFFFFFは符号つき32ビット整数で一番大きな数になる。 こんなに一生懸命説明してくれてるのにわからない俺…
すんませんした >>214
そんな事は決まってない
そういう処理系が多いってだけ -30は、-1==0xFFFFFFFFよりも29だけ小さい数だ。29==16+8+4+1==0x1Dだから、-30==0xFFFFFFFF - 0x1D==0xFFFFFFE2となる。 意外とハマるのはサイズが拡張される場合で
char ch1 = 0xFF;
unsigned char ch2 = 0xFF;
unsigned int int1 = ch1;
unsigned int int2 = ch2;
int1 と int2 は違った値になりよるよ
VCの処理系依存かもしれんが 1の補数、2の補数、符号ビット+仮数
言語上はこれだけある
トラップ表現があったりもする 自動車やバイクには走行メーターがついているだろう。走行メーターは0〜9の何桁でどのくらい走ったかを表す。
9999の次が0000になる場合、9999を-1、9998を-2、と考えるとメーターで足し算・引き算を考えることができる。各桁が0〜9になるから、メーターの場合は10進数表示になるがね、
コンピュータの場合は2進数や、16進数で考えることが多い。 2進数の場合は各桁が0か1になり、2で次の位に繰り上げ。16進数の場合は各桁が0〜9、A〜Fのいずれかになり、16で次の位に繰り上げ。 >>220
それは10の補数で負数を表す場合でしょ
そういうアーキテクチャもあるだろうけど、それ以外がありえないわけじゃない 1の補数表現ですか,教科書には堂々と載るんですけど,実際には見たことないね‥ auto i = -100;
auto u = static_cast<unsigned>(i);
int i2;
std::memcpy(&i2, &u, sizeof(int));
unsigned intを経由してintを取り出す方法はこれしか思いつかなかった 触るも何も自演だから嵐が過ぎ去るのを黙って見てるしかないぞ 仮想世界の住人たちが全て同一人物の自演に見える病気に名前を付けるとしたら、何にする? 2進数を下の位から4桁ごと区切ると、簡単に16進数に直せるぞ。
2の4乗は16だから、2進数の4桁が16進数の1桁に相当する。 #include <stdio.h>
int main(void) {
int i;
printf("10進数と16進数\n");
for (i = 0; i < 30; ++i) {
printf("%d => 0x%x\n", i, i);
}
return 0;
} C/C++では、2進数出力は少し難しい。ビット演算が必要になる。 void print_binary(int n) {
int i;
for (i = sizeof(int) * 8 - 1; i >= 0; --i) {
if (n & (1 << i)) putchar('1');
else putchar('0');
}
} #include <stdio.h>
int main(void) {
int i;
printf("符号あり => 符号なし => 16進\n");
for (i = -10; i <= 10; ++i) {
printf("%d => %u => 0x%x\n");
}
return 0;
} >>239
訂正。
#include <stdio.h>
int main(void) {
int i;
printf("符号あり => 符号なし => 16進\n");
for (i = -10; i <= 10; ++i) {
printf("%d => %u => 0x%x\n", i, i, i); //訂正。
}
return 0;
} class CManiac {
private: char* m_pc;
public:
virtual ~CManiac() {
cout<<"destr "<< this << " : " << &m_pc << endl;
delete[] m_pc;
}
CManiac() : m_pc(new char[1]) { cout<<"constr "<< this <<endl;}
void getAdrs(){ cout<< this <<" : "<< &m_pc << endl; }
};
int main() {
vector<CManiac> vecmaniac;
vecmaniac.resize(3);
vecmaniac[0].getAdrs();
vecmaniac[1].getAdrs();
vecmaniac[2].getAdrs();
return 0;
}
constr 0x22fe40
destr 0x22fe40 : 0x22fe44
0x3b1678 : 0x3b167c
0x3b1680 : 0x3b1684
0x3b1688 : 0x3b168c
destr 0x3b1678 : 0x3b167c
destr 0x3b1680 : 0x3b1684
destr 0x3b1688 : 0x3b168c
vectorに自作クラスのインスタンスを入れるとき、このコードだとm_pc;が指すアドレスが2重開放になるとかで
デフォルトコンストラクタとコピーコンストラクタとデストラクタの3つが必須だと書いてあったのですが、エラー無しで出力できます。
デストラクタのところで<<m_pc;と書いても、何故か文字化けしてしまうのでアドレスが分からないんですが
本来、resizeを使ってインスタンスを生成したら、m_pc(new char[1])で作った領域は3つとも同じになるということですか?
あと、最初に呼び出されている0x22fe40 は何のインスタンスなんですか?回答宜しくお願いします。 ■ このスレッドは過去ログ倉庫に格納されています