1read 100read
2011年10月1期プログラム【初心者歓迎】C/C++室 Ver.77【環境依存OK】 TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
新言語を開発したい
C#, C♯, C#相談室 Part69
Git 3
COM


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


1 :11/12/12 〜 最終レス :12/01/09
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.76【環境依存OK
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。
【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)

2 :
>>999
型キャストがビットシフトの前に行われるのって
言語仕様でしたかね?

3 :
JISX3010によると、
6.5.7 ビット単位のシフト演算子 意味規則 整数拡張を各オペランドに適用する。
らしいです。

4 :
>>2
算術演算子の優先順位
ttp://www.bohyoh.com/CandCPP/C/operator.html
キャスト演算子の方がシフト演算子より優先順位高いですね。

5 :
>>2,4 優先順位とか関係なくね?

6 :
>>4
「暗黙の」型変換というところに引っ掛かりを覚えるのだが・・・
さらに言えば、ビットシフトとブール演算が右辺で複合的に行われた場合、それらのビットシフトやブール演算より先に
左辺の型を見て右辺の数をのこらず自動型変換って、期待していいものなのか?当てにしているとあぶなくないか?

7 :
>>5
型変換が行われないと、桁あふれで右辺は0になる

8 :
汎整数拡張
ttp://ja.wikipedia.org/wiki/%E6%B1%8E%E6%95%B4%E6%95%B0%E6%8B%A1%E5%BC%B5

9 :
ん?>>3に書いてあるとおりじゃないか^^
c<<16の段階で、両辺が整数型にキャストされてる。
左辺 i が整数であるかどうかはまったく関係ない。
double d = c << 16;
のごとく書いても、cは整数型にキャストされるし
char s = c << 16;
のごとく書いても、cは整数型にキャストされる。
(そして結果はchar型にキャストされて面白い事になる)。

10 :
>>7 整数拡張は演算子じゃないから、優先順位とか関係ないぜ。

11 :
左辺をuint64_tにして右辺で4バイト超えるとこまでシフトしても、うまいことキャストするみたいなんだが・・・環境依存?
(単に整数型にするだけなら桁あふれでゼロ)

12 :
>>9
intはint型と書いてくれよ。char型だって整数型なんだから。

13 :
>>6-10
すんません。偉そうに教える程の知識は無いんですが、、、
「暗黙」だろうが「明示」だろうが、優先順位は変わらないと思います。
そして、式内では「精度の高い型」に変換されるので
i = c<<16;
は、うちは64bitOS(linux)
(1)16はint型とみなされる。
(2)c<<16 で右辺の16はint型なので、cは暗黙的にint型にキャストされる。
(3)i = c<<16 で左辺の(unsigned int)にキャストされる。
ってな感じだと思っていたのです。
・・・って、みなさんの言う、整数拡張ってwikiって見たら、
確かに演算子ではないですね。ということは、無条件に行われるから
優先順位が一番高いとも言えるのかな。
すっかり、ミイラ取りがミイラになっています。
とりあえず、多分、前スレ>>999さんは
unsigned char c;
unsigned int i;
c = 0xff;
i = (unsigned char)(c<<(unsigned char)(16));
printf("c: %x\n", (unsigned int)c);
printf("i: %x\n", i);
を期待されていたのでしょう。

14 :
あ、アンカ間違えた
× 前スレ >>999
○ 前スレ >>997

15 :
http://img.pics.livedoor.com/012/d/6/d6f87fce733d70932354-1024.png
http://mamorenihon.files.wordpress.com/2011/09/kao-demo1.jpg
http://blog-imgs-34.fc2.com/d/e/l/deliciousicecoffee/201108040637592d3.jpg
http://tantawan.blog.so-net.ne.jp/_images/blog/_13f/tantawan/E88AB1E78E8BE4B88DE8B2B7-18690.jpg
http://stat.ameba.jp/user_images/20110820/18/lisa-w-paz/07/00/j/o0500032111430159404.jpg
http://livedoor.blogimg.jp/news30over/imgs/c/3/c3860b80.jpg

16 :
http://www.bohyoh.com/CandCPP/C/operator.html
今まで何の疑問も持たずに見過ごしてきたけど、順位が間違ってるね。
配列の添字[]は関数呼び出し()より順位が高いですよ・・・

17 :
>>16
どんな式でその二つの優先順位の違いが問題になるの?

18 :
C/C++の宿題片付けます 154代目
ttp://hibari.2ch.net/test/read.cgi/tech/1322562648/
のスレを見て、他人のプログラムを見て色々と勉強させてもらっているのですが、
そのスレの、>>258 が質問し、>>259 が解答したプログラム(元コード ttp://ideone.com/BRXCl)があるのですが、
そのプログラム中にある、
char *roman_nums[] = {"XI", "XII", "XIV", "XVIII", "XXIV", "XLIII", "XCIX", "CDXCV", "MDCCCLXXXVIII", "MCMXLV", "MMMCMXCIX"};

for (i = 0; i < sizeof(roman_nums)/sizeof(*roman_nums); i++) {
という文の、sizeof(roman_nums) / sizeof(*roman_nums) ところが分かりませんでした。
前(分子)のsizeofと後ろ(分母)のsizeofが何なのかがわかりません。割るとどういうことになるのでしょうか。
前の方は、roman_numsは配列なので&roman_nums[0]ってことでしょうか??
自分の理解が大分足りてないようで、どなたか解説をお願いできませんか。よろしくお願いします。

19 :
配列の数がわかる
いちいち割らなくても_countofという便利なものもあるけど

20 :
>>19
ほんとですね。
今自分で試したのですが確かに配列の数がピッタリでますね。
どうしてこうなるのでしょうか・・・

21 :
sizeof(roman_nums)で配列全体の大きさがわかって
sizeof(*roman_nums)で配列1個の大きさがわかるから
*roman_numsが難しかったらroman_nums[0]と読み替えてもいい

22 :
>>21
>*roman_numsが難しかったらroman_nums[0]と読み替えてもいい
ああ!そういえばそうですよね。すっかり忘れてました。
お陰ですっきりしました!!
ほんとありがとうございます!

23 :
Win7 64+GCC(on MinGW)で・・・・
これはゼロになる
unsigned char c;
uint64_t i;
c = 0xff;
i = c<<63;
-----------------------------------------
これならMSBにビットが残る
unsigned char c;
uint64_t i;
c = 0xff;
i = (uint64_t)c<<63;
-----------------------------------------
暗黙の型変換でやってくれるのは、int(機種依存の?)まで?
それはそうと、
:-] ←ドヤ顔

24 :
>>23
そそ、暗黙の型変換は左辺に何があるかは知らない。

25 :
>>23
整数拡張だったら大きい方で計算されるんじゃね?
unsigned charとintならint、uint64_tとintならuint64_t

26 :
>>16
こっちの方が良かったかな?
ttp://www.cppreference.com/wiki/jp/operator_precedence
でも、添字[]と関数呼び出し()の優先順は同じはずですよ。あとは、結合の順番だけのはず。たしか・・・・。
>>17
たぶん、関数ポインタあたりを使うと書ける(問題になる)んじゃない?書いたこと無いけど。

27 :
for文を使う、配列を使わないやり方でお願いします。
10個の数値を入力
入力された各々の数値を二倍して表示するプログラム。

28 :
>>27
for(i=0;i<10;i++){scanf("%d",&n);printf("%d ",2*n);}

29 :
表示は入力の度ではなくまとめてでお願いします。

30 :
条件小出しにしないで、宿題スレ行ったら?

31 :
むりじゃね?w
ってか釣りか

32 :
int x2(int i){int n;for(;i;)printf("%d\n",x2(--i));scanf("%d",&n);return 2*n;}
x2(10);

33 :
>>27
#include<stdio.h>
#include<stdlib.h>
int main(){
int i, n;
char s[1000] = "", *p = s;
for (i = 0; i < 10; i++) {
printf("%d. ", i + 1);
scanf("%d", &n);
sprintf(p, "%d ", 2 * n);
while (*p)p++;
}
printf("%s", s);
return 0;
}

34 :
以下のような_allocaをラップした関数を作りたいのですが
Debugでは意図通りに出力されません。
template<typename T> T *aloca(size_t t){
return (T*)_alloca(sizeof(T) * t);
}
int _tmain(int argc, _TCHAR* argv[]){
int *a = aloca<int>(1); *a = 1;
int *b = aloca<int>(1); *b = 2;
int *c = aloca<int>(1); *c = 3;
printf_s("*a = %d\t", *a);
printf_s("*b = %d\t", *b);
printf_s("*c = %d\t", *c);
return 0;
}
Debug出力
*a = 3  *b = 1  *c = 1
Release出力
*a = 1  *b = 2  *c = 3
やはりalocaを抜けた時点で_allocaが確保したメモリは解放されてしまうのでしょうか?
だとするとReleaseで動いているように見える理由は?
どうすればDebugでも動くようにできるでしょうか?

35 :
>>34
http://msdn.microsoft.com/ja-jp/library/wb1s57t5%28v=vs.80%29.aspx
_alloca は、プログラム スタックから size バイトを割り当てます。
割り当てられた領域は、単に割り当てがスコープ外になる場合ではなく、
呼び出し関数が終了する場合に、自動的に解放されます。
このため、_alloca から返されたポインタ値を引数として free に渡さないでください。

36 :
_alloca()は実装にも拠るけど関数じゃないからね。

37 :
#define MYALLOCA(type, count) ((type *)_alloca(count * sizeof(type)))

38 :
おっと、カッコで囲まなきゃ。
#define MYALLOCA(type, count) ((type *)_alloca((count) * sizeof(type)))

39 :
なるほどマクロならいけそうですね。
名前空間に入れられないのがつらいけど
それでいこうと思います。
ありがとうございました。

40 :
マクロを使うとお先真っ黒ってね

41 :
>>40
まっ、苦労するのは確かだな。

42 :
在日の戦略にひっかかり、全ての間違いが始まった2009年 夏
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 < 民主になればこの世はバラ色、政権交代!
        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| | 在 反 | '、/\ / /     
     / `./| | 日 日  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      |   ┬    |それでも懲りない日本人、韓国民団総理支持率35%w早く目を醒まそう!

43 :
visualstudio2008で開発を行っているのですが、デバッグでは発生せずリリースでのみ発生する不具合があって困っています。
プログラムとしては別スレッドで受信したデータをファイルに記録とウィンドウに表示するものなのですが、20分ほどするとJITのウィンドウが開いてプログラムがフリーズしてしまいます。
その際にVSを立ち上げて落ちた箇所を調べるとfwriteの実行で落ちているようで、書き込むデータのサイズが定数を使用しているにも関わらずfwriteの内部で値が全く違う大きな値になっていました。
このような現象の原因についてご存じもしくは思い当たるふしがあれば教えていただけないでしょうか?
よろしくお願いします。

44 :
volatile修飾子に関係があるかもしれない
何故そう思ったかというと、つい数日前俺が勉強したばかりだからだ

45 :
>>44
C/C++のvolatilはjavaやC#とちがってメモリバリアもアトミックも
保証されていないぞ

46 :
C++で、クラスポインタを0で初期化するようなプログラムを頻繁に見るんですか、いいんですか?
間違って、初期値のままポインタの参照先の値を書き替えてしまうと、かなり危険なきがするんですが。

47 :
>>46
間違って書き換える方が悪い、という考えで作られているのがC++。

48 :
class A{...};
A * p = NULL;
*p = hogehoge;
みたいなことを言ってるの?
余裕で落ちるから大丈夫

49 :
C++で
class CHoge;
CHoge* p_test = NULL;
p_test = new CHoge();
↑の処理は、
一番上はクラスの宣言、
二番目はCHogeを入れるためのp_testという名前の箱を用意してやる、
一番下はコンストラクタを呼び出して、実態を与えてやる
といった処理でしょうか?

50 :
宣言しただけじゃnewできんぞ

51 :
>>46
よく気がついたな
かなりヤバイコードだから絶対に真似しちゃイカンぞ

52 :
CHoge* p_test = NULL;
/*スタック領域にクラスのポインター型変数を確保*/
p_test = new CHoge();
/*ヒープ領域にクラスに必要なメモリを確保した後、
 そのクラスのコンストラクタを呼び出し、
 そのポインタをp_testに代入*/

53 :
RAIIのひろーい原則に従えば、ポインタにNULLを突っ込む余地はないはずなんだけどね
確保の直後に初期化されなければならないし、破棄は(コード的に)確保と隣接した場所で行われるから
要するに無効なまま運ばれる区間は限りなく短くなってるはずなので

54 :
なに得意そうにswitchさんデスっての?

55 :
前スレ>>782
>namespace manko {
> extern "C" {
>  #include <Windows.h>
を見て、へーこんなことできるんだと思って試してみた。
namespace Impl{
struct impl_struct{ char c[8]; };
extern "C" void externCtest(impl_struct *a){
for(int t = 0; t < 8; ++t) printf_s("%d ", a->c[t]);
printf_s("\n");
}
}
namespace Decl{
struct decl_struct{ int a, b; };
extern "C" int externCtest(decl_struct *a);
}
void externCtest(){
Decl::decl_struct a = { 1, 2 };
printf_s("externCtest ret = %d\n", Decl::externCtest(&a));
printf_s("&Decl::externCtest = %x\n", (int (*)(Decl::decl_struct*))Decl::externCtest);
printf_s("&Impl::externCtest = %x\n", (void (*)(Impl::impl_struct*))Impl::externCtest);
}
extern "C"をつければ、どのnamespaceで定義しても
どのnamespaceで宣言しても、引数や戻り値がでたらめでも
名前と引数のサイズとかが合ってれば動くみたいなんだけど
これってちゃんと仕様に沿ってるの?

56 :
呼ばれる関数は同じだがオーバーロード(?)すらできた。
using Impl::externCtest;
using Decl::externCtest;
Impl::impl_struct a = { 3, 4, 5, 6, 7, 8, 9, 10 };
Decl::decl_struct b = { 1, 2 };
externCtest(&a);
auto bret = externCtest(&b);

57 :
>>52
ありがとうございmす

58 :
DLL内の関数名の前につく
__imp__

__imp_
の違いってなに?

59 :
気分

60 :
エスパーすると区切る場所が違う
__imp___func -> __imp__ + _func
__imp__func -> __imp_ + _func
ではなく
__imp___func -> __imp__ + _func
__imp__func -> __imp__ + func
_func と func の違いは呼出規約(stdcallかcdeclか)の違い

61 :
インプ君思い出した

62 :
class Hoge
{
 [型] hoge(bool var);
}
↑のような関数があるとき、
Hoge hoge;
bool foo = true; // どちらでもいいので初期化
hoge.hoge(foo); // (1). bool型の変数指定
hoge.hoge(true); // (2). trueの定数指定
hoge.hoge(false); // (3). falseの定数指定
と出来ますが、
(3)以外のパターンでコンパイルエラーにしたいのですが、可能でしょうか?
falseしか指定できないenumを作るしかありませんか?

63 :
そもそも引数なんか必要ないんじゃないか?
ちなみにC++0xなら、右辺値参照を使えば(1)をコンパイルエラーにできる。
hoge(bool &&var);

64 :
プロトタイプ宣言の関数の引数に書かれる「rhs」は何の略です?

65 :
>そもそも引数なんか必要ないんじゃないか?
申し訳ありません。
この例を見ると確かにそのとおりです。言われて気がつきました。
簡単に示そうとして、情報が欠落してしまいました。
Hogeのコンストラクタとして3つ、
 Hoge hoge;
 Hoge hoge(false);
 Hoge hoge = false;
 hoge.無効化メソッド(false);
のを許して、以下を許さない
 Hoge hoge(true);
 Hoge hoge = true;
 Hoge hoge(bool foo = false); 
ものを考えていました。
boost::optionalのintだけのようなものをライブラリなしでつかいたいな、と。
class Hoge{public: bool 有効化フラグ_; int hoge_};を使って。
おとなしくenumします。
右辺値参照初めて知りました。少し勉強します。

66 :
×hoge.無効化メソッド(false);
○hoge.無効化メソッド();

67 :
>>64
lhs < Left Hand Side (左辺)
rhs < Right Hand Side (右辺)

68 :
>>62
template<bool p> struct c_bool
{
static bool const value = p;
};
struct Hoge
{
void hoge(c_bool<false> const & p);
};
Hoge h;
bool p;
h.hoge(p); // error
h.hoge(c_bool<true>()); // error
h.hoge(c_bool<false>()); // ok

69 :
C++でコルーチンはどうやれば書けるの?

70 :
std::stringで数値を文字にする時に
int 123 →"00123"
int 1234→"01234"
みたいに0で桁数を揃えるフォーマットにするにはどうしたらいいですか?

71 :
>>70
#include <sstream>
#include <iomanip>
std::string to_str(int x, int d)
{
std::ostringstream oss;
oss << std::setw(d) << std::setfill('0') << x;
return oss.str();
}

72 :
>>71
ありがとうございます!

73 :
string str = "123";
std::cout << (boost::format("%05d") % str).c_str();
だったかな。(うろ覚え)
std::cout << boost::str(boost::format("%05d") % str);
とか。(うろ憶え)

74 :
>>73
%dとstd::stringは、激しくマズイ気がするが気のせいだったらすまない。

75 :
>>70
>みたいに0で桁数を揃えるフォーマットにするにはどうしたらいいですか?
絶対ないというならいいけど、int 123456 の時に "23456" か "123456" の
どっちになって欲しいか書いたほうがいいと思う。

76 :
class A
{
 enum B {aaa, bbb, ccc}
}
int main(){
 A::B b = A::aaa; // ※1
return 1;
}
「※1」の右辺に、凄い違和感があって、
「A::B.aaa」か「A::B::aaa」ってなるのが妥当に思えるのですけど、
何でcの仕様がこうなっていて、
何に私が悩んでいるのか解決できるようなエスパーがいたら、
助言をして欲しいです。よろしくお願いします。

77 :
禿がenum嫌いだから

78 :
64です。
>>67
ありがとうございます。スッキリ出来ました。

79 :
>>76
俺も初めは違和感だったな
それにC#ではA.B.aaaとなるし
考え方だがCでは整数に名前が付いてるだけ、
くらいの認識と考えれば、その言語仕様も少し納得しやすいかもしれない

80 :
Aのなかにデロ〜ンとaaa bbb cccが漏れてるからそうなるわけで

81 :
C++11でenum classが導入されてちゃんとクラススコープに入ったenumがつけるようになるんだったけか。

82 :
namespace ENUM{int aaa(){return 0;}int bbb(){return 1;}int ccc(){return 2;}}
typedef int(*ENUM)(); // これで全て解決だ!

83 :
>Aのなかにデロ〜ンとaaa bbb cccが漏れてるからそうなるわけで
つまり、enum自体はc++的なものではなくてc的なものなので、グローバルに展開されてしまうってことですね。
ただし、c++なので、クラス内や名前空間内に限定することは可能になっている、と。
納得できました。
ありがとうございます、>>79,>>80,>>81

84 :
>>83 もありがとうございます。

85 :
×>>83
>>82
スレ汚し失礼しました。

86 :
質問
C++で、GLSLのnoise関数のような関数はありますか?
つまり、ある値を入に対し、決まった、予想の付かない値を返す関数なのですが

87 :
コピーコンストラクタ・operator=に関して一件教えてください。
コピーコンストラクタを用意する際には、
operator=も用意するように、
と教えていただいたので、そのようにしてました。あるとき、
そのoperator=の最後に記述する「return *this;」を忘れていました。
ところが、特に問題が出ていませんでした。
これは記述する必要がないのでしょうか?

88 :
>>86
適当なhash関数はいかが?MD5/SHA-1/2(256) とか。

89 :
>>88
ありがとうございます
検索してみるとhttp://www.studyinghttp.net/md5このページを見つけました
しばらく見て参りますが、他に良い解説サイトなどありましたらご紹介くださいませ

90 :
>>87
下に示すような記述をする為には、自身を返す必要があるから。
従って、代入した結果を必要としないのなら問題にならない。
--
YourClass foo, bar, baz;
foo = bar = baz;

91 :
「codepad」でエラーになる理由を教えていただけませんか?
http://codepad.org/VybcCvXY
http://ideone.com/WA7TG

92 :
http://ideone.com/WA7TG
ttp://www.geocities.jp/ky_webid/cpp/library/027.html
関数のプロトタイプ宣言で、throw(ココ)に書く内容でどのような変化があるのか調べています。
↑のページの「std::bad_exception」の説明に関して試しています。
178行目の「i2 = hoge5;」において、54行目の関数が呼ばれています。
このとき、
プロトタイプ宣言で、54,55,56のパターンや、
throwする例外オブジェクトで、60,61,62の内容を試すのですが、
「std::bad_exception」がthrowされません。
どこを修正すると説明の通り、「std::bad_exception」がthrowされるか教えていただけませんか?
よろしくお願いします。

93 :
あと、
 「eclipseのc++」や「ideone.com」で試した際と、
 「Visual c++」で試した際と、
の間に挙動の違いがあって、205行目が、
 前者で実行されない
 後者で実行される
のですが、何故なのでしょうか?
 gccでは、宣言以外の例外発生の後に即terminate();
 visual c++では、プロトタイプ宣言のthrow()を無視している
のでしょうか?
http://ideone.com/qqqhp ※60行目、178行目、205行目

94 :
最後に、(いろいろ問題出そうですが、)
158行目の
「hoge5」
とした場合に、問答無用で、
 「(int)hoge5」
 「int(hoge5)」
とした場合と同じにすることは可能でしょうか?
可能であれば教えてください。
(型の指定がない場合は、int(T)としたい。が、代入先がboolの場合はbool。「.」や「->」など他のoperatorも残したい。)

95 :
>>60
ありがとう

96 :
>>91
エラーの理由をみるにcodepadでは(その警告を出すなら)警告もエラー扱いする設定になってる。
そしてそのソースに対してはクラス定義でのメンバの宣言順とコンストラクタでのメンバ初期化子の順序が違うと警告がでてるからエラーになる。

97 :
>>96
なるほど。理解できました。ありがとうございます。
エラーの内容が続くwarningで示されていたとは。
独立しているのだと勘違いして、warningは無視していました。
http://codepad.org/lTFa56Ar
動きました。

98 :
>>90
>foo = bar = baz;
{
 bar = baz;
 foo = bar;
}
これと等価だと思っていました。わかりやすい説明ありがとうございます。

99 :
何度も失礼します。
http://codepad.org/OuxHRqHa
で、41行目にエラーがあり、その内容は、
「定義されていない変数(名)へのアクセスがある」
といったものなのですが、
Visual c++ 2010 Expressで試すと、素通りされてしまいました。
利用していないメソッドの場合も確認してくれるようにするには、どのような設定をすればよいのでしょうか?
Visual c++のスレは一週間くらい人大杉で書き込めませんでした。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
新言語を開発したい
C#, C♯, C#相談室 Part69
Git 3
COM