エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/
探検
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
2018/07/01(日) 03:44:53.53ID:4MMF8cDN
379デフォルトの名無しさん
2018/09/08(土) 01:39:35.14ID:j/6nk0eH380デフォルトの名無しさん
2018/09/08(土) 01:56:15.85ID:ejo+9snz381デフォルトの名無しさん
2018/09/08(土) 02:11:10.26ID:j/6nk0eH382はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 02:24:06.10ID:VmsJpbI+ >>380
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。
> int3個とchar一個だから13バイト?
この構造体中の char は MAX_NAME+1 個じゃん。
まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。
sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
int のサイズは処理系依存なので、具体的に何バイトとは言えない。
でもまあ現代的なパソコンなら 4 バイトのことがほとんどだろうね。
さらに言えば仕様上は構造体の要素の間にスキマがあいててもかまわない。
> int3個とchar一個だから13バイト?
この構造体中の char は MAX_NAME+1 個じゃん。
まあそれはそれとして、
sizeof student というのは、 student という配列の大きさを「バイト数で」返してきて、
sizeof *student というのは student 配列の要素ひとつの大きさをバイト数で返してくる。
つまり、配列全体の大きさを配列の要素の大きさで割ったら配列に含まれる要素の個数になる。
この場合は 3 ってこと。
sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
383デフォルトの名無しさん
2018/09/08(土) 02:52:28.11ID:OyJ8jP1h384デフォルトの名無しさん
2018/09/08(土) 02:56:57.12ID:OyJ8jP1h385はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:03:57.30ID:VmsJpbI+386デフォルトの名無しさん
2018/09/08(土) 03:07:29.94ID:ejo+9snz >>382
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
すいません、おかげさまでどういう計算してるのか理解できました
確かにポインタにすると何で要素一つのサイズなのか理屈づけて説明できません…sizeof student/sizeof student[0]とかだと分かりやすいです
ありがとうございます。意味が理解できたので応用して使えそうです
387はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:08:42.91ID:VmsJpbI+ >>384-385
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
私が sizeof *student が分かり難いと述べたのは
配列名に * を付けたものが配列の先頭要素になるルールの背景にある暗黙の型変換が分かり難いって話。
C/C++ を使ってると空気みたいにやっちゃうんだけど、これ実際のところだいぶんアレなルールですよ。
388デフォルトの名無しさん
2018/09/08(土) 03:13:32.57ID:OyJ8jP1h389デフォルトの名無しさん
2018/09/08(土) 03:17:21.63ID:OyJ8jP1h >>387
それも含めてね
それも含めてね
390はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:22:37.80ID:VmsJpbI+ >>388
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。
自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
この場合くらいの小さなサンプルだとあまり気にならないけど、
その変数が何の型であるか知っていなければならないっていうのが、
読むときの負荷が高いと感じてしまう。
自分を信用してないというか、自分がアホだということを信用しているので、
色々忘れて読んでも良いように書きたいと思ってる。
391はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:26:28.66ID:VmsJpbI+ C++ ではもうそんな古代のイディオムなんて忘れて std::extent を使いたい
392はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:28:24.66ID:VmsJpbI+ もう C++17 の時代なんだから std::size の方がいいな
393はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:48:16.76ID:VmsJpbI+ そもそも
for (int i = 0; i < size; ++i) {
Show(student[i]);
}
のところはモダンな C++ では (つまり C++11 以降では)
for (auto& e: student) Show(e);
と書けるので配列の要素数を事前に計算する必要なかったわ。
for (int i = 0; i < size; ++i) {
Show(student[i]);
}
のところはモダンな C++ では (つまり C++11 以降では)
for (auto& e: student) Show(e);
と書けるので配列の要素数を事前に計算する必要なかったわ。
>>380
>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
私は、これはかなり紛らわしいとおもっているので、こういうときには必ず
struct FOO { int n; ..... } array[N];
int n = sizeof(array) / sizeof(array[0]);
としています、こっちの方が好きです
構造体の配列の第一番目を指すポインタ
struct FOO *p;
p = &array[0];
のときに *p は array[0] に入っている「構造体の一つの要素全体」を表します、すなわち *p イコール array[0]
しかし、この表現はすぐに直感的にイメージとして頭に入ってくるわけではなく、何度となく書いたり読んだりしてゆっくり染みこんでくるものだ、と私は経験しています
同様に p->n とか、これと等価な (*p).n とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
>>382
>sizeof *student が配列の要素ひとつを表現しているっていうのがちょっと分かり難いかなぁ。
私は、これはかなり紛らわしいとおもっているので、こういうときには必ず
struct FOO { int n; ..... } array[N];
int n = sizeof(array) / sizeof(array[0]);
としています、こっちの方が好きです
構造体の配列の第一番目を指すポインタ
struct FOO *p;
p = &array[0];
のときに *p は array[0] に入っている「構造体の一つの要素全体」を表します、すなわち *p イコール array[0]
しかし、この表現はすぐに直感的にイメージとして頭に入ってくるわけではなく、何度となく書いたり読んだりしてゆっくり染みこんでくるものだ、と私は経験しています
同様に p->n とか、これと等価な (*p).n とかの表現など
書き続ければ、あるいは読み続ければ、そういうのは、だんだんわかってくるのではないかな、と。
395はちみつ餃子 ◆8X2XSCHEME
2018/09/08(土) 03:59:06.82ID:VmsJpbI+ C を使ってるときは感覚的に理解してて全く不都合なかったけど、
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
C++ のテンプレートやなんやかやを利用するようになると、
やっぱりちゃんとルールを把握せないかんなと思った。
396デフォルトの名無しさん
2018/09/08(土) 08:56:41.97ID:RilhlE4U _countof()
環境考えなくていい(趣味etc)ならこれもある
環境考えなくていい(趣味etc)ならこれもある
397デフォルトの名無しさん
2018/09/08(土) 09:31:57.86ID:obhERXW7 初心者に古い文法を辞めろってよろしくないな
398デフォルトの名無しさん
2018/09/08(土) 10:37:06.40ID:ZUEeKRTR399デフォルトの名無しさん
2018/09/08(土) 11:59:22.19ID:OyJ8jP1h >>398
言われると思った
言われると思った
400デフォルトの名無しさん
2018/09/10(月) 18:57:43.66ID:70yMIW0+ c#から使うクラスライブラリをc++/cliで作っています。
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
クラス変数をoutで渡してメソッド内で値を入れたいのですが、c++側はどんな風に書けばよいでしょうか?
401デフォルトの名無しさん
2018/09/10(月) 22:20:18.13ID:7zqNUn7X402デフォルトの名無しさん
2018/09/11(火) 11:36:04.20ID:EScF+7wZ403デフォルトの名無しさん
2018/09/17(月) 21:49:35.29ID:t753Z4pL ロベール入門の内部リンケージ外部リンケージ云々の下りがちょっとよくわからないんですが
externを付けると別のcppの変数を弄れるってことであってますか?
externを付けると別のcppの変数を弄れるってことであってますか?
404デフォルトの名無しさん
2018/09/17(月) 22:34:28.19ID:t753Z4pL externをつけると別のファイルのグローバル変数、関数を使えてローカル変数は使えないんですか?
405さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 22:40:39.04ID:yTXbMS5S406さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 22:43:11.40ID:yTXbMS5S 関数プロトタイプにexternを付けるのは無意味。
407デフォルトの名無しさん
2018/09/17(月) 23:32:43.22ID:t753Z4pL408さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/09/17(月) 23:41:37.07ID:yTXbMS5S static int a = 0;
...
f(&a);
もしくは、
int& g(void)
{
static int a = 3;
return a;
}
みたいな感じで。
...
f(&a);
もしくは、
int& g(void)
{
static int a = 3;
return a;
}
みたいな感じで。
409デフォルトの名無しさん
2018/09/18(火) 01:22:31.81ID:OdQP9+YI410デフォルトの名無しさん
2018/09/18(火) 01:45:06.12ID:XTp+U7qP そして次のページにて
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
ヘッダファイルに#ifndef#define#endifを定義すると2重定義防止ができると説明があるのですが
これを使えばexternとか関数プロトタイプを使わないで住むということでしょうか。
だとするんであればexternとかプロトタイプ宣言とはどう使い分ければいいんでしょうか;
411デフォルトの名無しさん
2018/09/18(火) 07:22:02.89ID:XTp+U7qP すいません自己解決しました…多分;;
412デフォルトの名無しさん
2018/09/23(日) 16:56:38.50ID:dZPE20Nd 現在利用出来る無償のメモリリーク解析ツールってありますか?プログラム初心者でメモリリークの対策がよくわからないのでどういうところに対策する必要があるのかを知るのに利用したいです
413デフォルトの名無しさん
2018/09/23(日) 17:17:02.47ID:oc2N8BDI >>412
スマートポインタ使えばいいと思うよ
スマートポインタ使えばいいと思うよ
414デフォルトの名無しさん
2018/09/23(日) 18:38:22.45ID:cRG95Xcq vs使えばexpressエディションでも標準装備されてる
415デフォルトの名無しさん
2018/09/23(日) 23:53:10.56ID:nKMJRhW5416デフォルトの名無しさん
2018/09/24(月) 00:23:01.63ID:Kxio7RVg とりあえずこんな感じのコードで軽くお試しできる
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void aho(void) {
void* p = malloc(100);
// free(p);
}
int main(void) {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
aho();
return 0;
}
↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx
あとはもうできるハズだ
デバッグモードで実行するとデバッグコンソールにリークしてるログが出力される
コメントはずしてfree()で解放するとリークしてるログがなくなる
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
void aho(void) {
void* p = malloc(100);
// free(p);
}
int main(void) {
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
aho();
return 0;
}
↓詳細はココみなさい
https://msdn.microsoft.com/ja-jp/library/x98tx3cf.aspx
あとはもうできるハズだ
417デフォルトの名無しさん
2018/09/24(月) 00:32:39.68ID:twbzBaDz https://github.com/KindDragon/vld/wiki/Using-Visual-Leak-Detector
visual leak detector
cで使えるかは試したことないけど、crtdebugより使い勝手はいい。
visual leak detector
cで使えるかは試したことないけど、crtdebugより使い勝手はいい。
418デフォルトの名無しさん
2018/09/24(月) 00:58:58.99ID:qTTELbCs >>417
全然ビジュアルじゃねーなw
全然ビジュアルじゃねーなw
419デフォルトの名無しさん
2018/09/24(月) 07:47:25.22ID:A22Aay1A 入門の+operator演算子で訳わからず詰んでしまったのですが
簡単に分かりやすく解説してるサイトないですか?
簡単に分かりやすく解説してるサイトないですか?
420はちみつ餃子 ◆8X2XSCHEME
2018/09/24(月) 09:09:54.16ID:tUW1+gfS421デフォルトの名無しさん
2018/09/24(月) 10:37:05.34ID:nAcFE6zY422デフォルトの名無しさん
2018/09/24(月) 18:28:47.09ID:A22Aay1A423デフォルトの名無しさん
2018/09/25(火) 00:10:59.63ID:TBXAVCzN424デフォルトの名無しさん
2018/09/27(木) 01:59:28.90ID:HwqzTUAF http://codepad.org/gwutTCie
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
AIUEOを何回も呼び出したいとき、引数のa, b, c, d, eの部分が共通なので
何回もa, b, c, d, eと書かなくても良いようにしようと色々試しましたが中々上手く行きません
別にコピペすればいいのでそんなに気にすることでもないと思うのですが、
こんなときはどのように書いたら良いのでしょうか?
425デフォルトの名無しさん
2018/09/27(木) 02:11:57.91ID:Oj9x/TA+ >>424
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?
void MACRO(int a, int b, int c, int d, int e, int s, int t) {
auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
if (s < 0) {
if (t < 0) binded_AIUEO(-1, -2, -3);
else binded_AIUEO(3, 0, 7);
}
else {
if (s < t) binded_AIUEO(4, 99, 8);
else binded_AIUEO(333, 33, 3);
}
}
意図を把握できてるか自信はないが↓のbinded_AIUEOみたいなことでいいのん?
void MACRO(int a, int b, int c, int d, int e, int s, int t) {
auto binded_AIUEO = [=](int x, int y, int z){ AIUEO(a, b, c, d, e, x, y, z); };
if (s < 0) {
if (t < 0) binded_AIUEO(-1, -2, -3);
else binded_AIUEO(3, 0, 7);
}
else {
if (s < t) binded_AIUEO(4, 99, 8);
else binded_AIUEO(333, 33, 3);
}
}
426はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 02:36:54.70ID:nKTHsEzL std::bind を使う方法もあるな。
427デフォルトの名無しさん
2018/09/27(木) 02:41:01.72ID:/q4lnTfs >>424
struct Args { int a,b,c,d,e;};を引数に使う
struct Args { int a,b,c,d,e;};を引数に使う
428デフォルトの名無しさん
2018/09/27(木) 12:00:19.82ID:QfV3dtaO void foo(int argc, const char *argv[])
{
}
int main(int argc, char *argv[])
{
foo(argc, argv);
return 0;
}
VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
{
}
int main(int argc, char *argv[])
{
foo(argc, argv);
return 0;
}
VC++2008でコンパイルすると、
「error C2664: 'foo' : 2 番目の引数を 'char *[]' から 'const char *{}' に変換できません。」
ってなるんだけどなんで?
constから非constならわかるんだけど。
429デフォルトの名無しさん
2018/09/27(木) 12:27:29.59ID:3irDnMHM type ミスなのかコピペなのか判断に迷うとこだけど
'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
'char *[]' から 'const char *{}' 後者が { } になってるあたりにヒントは無い?
430デフォルトの名無しさん
2018/09/27(木) 12:42:33.07ID:pmYsr/E+ >>428
[]のタイプミスだろうけど、下のページが参考に。
https://stackoverflow.com/questions/45011978/const-causing-incompatible-pointer-type-why-only-for-double-pointers
ようは、fooで argv[0]="abcd"; みたいなことができちゃうから。
でも、const char * const argv[] でもだめな理由は知らない。
[]のタイプミスだろうけど、下のページが参考に。
https://stackoverflow.com/questions/45011978/const-causing-incompatible-pointer-type-why-only-for-double-pointers
ようは、fooで argv[0]="abcd"; みたいなことができちゃうから。
でも、const char * const argv[] でもだめな理由は知らない。
431428
2018/09/27(木) 13:06:59.87ID:QfV3dtaO >>429,430
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。
>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja
ちなみにVC2003では通ってたらしいです。
失礼。428の書き込みがタイプミスで、実際のソースコードは [] なのですが
コンパイルエラーになります。
>>430
なるほど・・・↓にも同じようなことが書いてありますね。
https://social.msdn.microsoft.com/Forums/ja-JP/24cd88de-2159-4e8b-aee7-3fa30d8647db/12509124521253112479123982144229031124343830625968123952819312?forum=vcgeneralja
ちなみにVC2003では通ってたらしいです。
432デフォルトの名無しさん
2018/09/27(木) 14:04:18.04ID:rwW0e8CF433デフォルトの名無しさん
2018/09/27(木) 17:43:51.14ID:HwqzTUAF434はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 18:37:57.80ID:nKTHsEzL >>433
こんな感じかな?
#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}
この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
こんな感じかな?
#define MACRO(a, b, c, d, e, s, t) {\
#define BINDED_AIUEO(x, y, z) AIUEO(a, b, c, d, e, x, y, z) \
if (s < 0) {\
if (t < 0) BINDED_AIUEO(-1, -2, -3) \
else BINDED_AIUEO(3, 0, 7) \
}\
else {\
if (s < t) BINDED_AIUEO(4, 99, 8) \
else BINDED_AIUEO(333, 33, 3) \
}\
#undef BINDED_AIUEO \
}
この事例ではどうしてもマクロじゃなければ駄目という理由はなさそうだけど、
実際の利用シーンでは何か意味があるのかな?
435デフォルトの名無しさん
2018/09/27(木) 19:16:32.64ID:Oj9x/TA+ >>434
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる
可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない
#define packed_MACRO(s, t, ...) {\
if (s < 0) {\
if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
else AIUEO(__VA_ARGS__, 3, 0, 7) \
}\
else {\
if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
else AIUEO(__VA_ARGS__, 333, 33, 3) \
}\
}
#define MACRO(a, b, c, d, e, s, t) {\
packed_MACRO(s, t, a, b, c, d, e) \
}
それできたっけ?と思って試してみたらエラーになった
マクロの中では#は識別子の文字列化になる
可変長マクロを悪用してこんな感じにはできるけれども……おすすめはできない
#define packed_MACRO(s, t, ...) {\
if (s < 0) {\
if (t < 0) AIUEO(__VA_ARGS__, -1, -2, -3) \
else AIUEO(__VA_ARGS__, 3, 0, 7) \
}\
else {\
if (s < t) AIUEO(__VA_ARGS__, 4, 99, 8) \
else AIUEO(__VA_ARGS__, 333, 33, 3) \
}\
}
#define MACRO(a, b, c, d, e, s, t) {\
packed_MACRO(s, t, a, b, c, d, e) \
}
437はちみつ餃子 ◆8X2XSCHEME
2018/09/27(木) 19:59:57.14ID:nKTHsEzL いずれにしても、マクロでやるのはおすすめできないパターンには違いない。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
関数でやってもインライン化されたら定数畳み込みとのコンボで実行コードはだいたい同じような感じになるだろうし。
438デフォルトの名無しさん
2018/09/27(木) 23:31:02.83ID:HwqzTUAF439デフォルトの名無しさん
2018/10/01(月) 09:57:17.34ID:a9wHa9+i MSVC2017+Windows10でレジストリを読み取ろうとしています。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。
具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。
LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。
できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
RegEnumValueW(hKey, 0, name, &nameSize, 0, &type, value, &valueSize)
を実行してtypeがREG_SZのレジストリ入力を読み取ることには成功したのですが、
value先頭のvalueSizeバイトのユニコード文字列をstd::stringに変換する方法が
わからなくて困っています。
具体的にはwindowsのフォント名を読み取っていて、"arial.ttf"に対して
valueの中身を見ていくと、a\0r\0i\0…となっています。
LPBYTEからstringなのでとりあえずwchar_t*にしてからstringにすればよいのかと思ったのですが、
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, (int)(valueSize), NULL, 0));
でサイズ取得してから
MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCCH)value, valueSize, buff, size);
しても要素がchar→wchar_tに変わっただけで、\0も1文字になってしまいます。
できれば日本語にも対応したいので、下位ビットだけ読む、みたいな方法以外の対応を
探しています。ご存知の方いらっしゃらないでしょうか。
441439
2018/10/01(月) 12:06:04.72ID:xWoUpfbZ >> 440
WideCharToMultiByteでできました!
MSDNでunicode文字列を返すと書いてあったのでUTF16LEかと誤解していました。
ありがとうございました。
書き込むかわからないですが、今後は蟻様と呼ばせていただきます。
WideCharToMultiByteでできました!
MSDNでunicode文字列を返すと書いてあったのでUTF16LEかと誤解していました。
ありがとうございました。
書き込むかわからないですが、今後は蟻様と呼ばせていただきます。
442デフォルトの名無しさん
2018/10/01(月) 12:54:37.87ID:6nDzbmUC > UTF16LEかと誤解していました
いやそこは間違ってないと思うよ
wchar_t* -> utf-16 (winに限る)
string -> 8859-1, utf-8, 等
いやそこは間違ってないと思うよ
wchar_t* -> utf-16 (winに限る)
string -> 8859-1, utf-8, 等
443デフォルトの名無しさん
2018/10/01(月) 13:02:42.53ID:+ZRK8JZV utf16って可変長マルチバイトじゃないの?
444さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/01(月) 13:12:24.66ID:4RAZLI0y Win32の用語ではUTF-16はWide Char String.
445デフォルトの名無しさん
2018/10/01(月) 13:13:26.38ID:6nDzbmUC 16bitに収まりきらない場合があるけど、可変長マルチバイトとは呼ばないかな
446デフォルトの名無しさん
2018/10/01(月) 13:22:17.61ID:+kJnoAZi >>444
納得。
納得。
447デフォルトの名無しさん
2018/10/01(月) 19:33:59.25ID:YHT/N1Mv 趣味の自作ゲームでC++を利用しています(多人数開発などは今後も予定なしで、人様のコードは読まない)
Cの「関数へのポインタ」ってC++のポリモーフィズムがあれば理解しなくてもなんとかなりますか?
関数へのポインタが手持ちの書籍だけではわからずにいるのですが、
柴田さんのポインタ本とか買ってまで理解する価値はあるでしょうか?
関数へのポインタの存在理由もわからずにいるので、頓珍漢な事を言っていたらすみません
Cの「関数へのポインタ」ってC++のポリモーフィズムがあれば理解しなくてもなんとかなりますか?
関数へのポインタが手持ちの書籍だけではわからずにいるのですが、
柴田さんのポインタ本とか買ってまで理解する価値はあるでしょうか?
関数へのポインタの存在理由もわからずにいるので、頓珍漢な事を言っていたらすみません
448デフォルトの名無しさん
2018/10/01(月) 19:46:15.36ID:46GwS6ij C++のポリホーリズムの運用が完璧であれば問題ない
が、関数ポインタがその理解の助けになるかもしれない
が、関数ポインタがその理解の助けになるかもしれない
449デフォルトの名無しさん
2018/10/01(月) 20:33:18.13ID:YHT/N1Mv ポリモーフィズム
(基底から派生させた各ザコキャラ(各々別クラス)のインスタンスを同じコンテナに入れて各々のメンバ関数(アクションなど)を実行する)
といったかんじで便利に運用できている(と思う)ので、
関数ポインタは理解しなくても大丈夫そうでしょうか
動的関数実行の他にはどんな用途に利用するものですか?
(基底から派生させた各ザコキャラ(各々別クラス)のインスタンスを同じコンテナに入れて各々のメンバ関数(アクションなど)を実行する)
といったかんじで便利に運用できている(と思う)ので、
関数ポインタは理解しなくても大丈夫そうでしょうか
動的関数実行の他にはどんな用途に利用するものですか?
450デフォルトの名無しさん
2018/10/01(月) 20:39:22.92ID:YHT/N1Mv >>インスタンス
インスタンスではなくインスタンスへのポインタの間違いでした
インスタンスではなくインスタンスへのポインタの間違いでした
451はちみつ餃子 ◆8X2XSCHEME
2018/10/01(月) 21:10:49.05ID:hbafP85H >>447
抽象クラスを活用してるってこと?
それが上手くいっているならほとんどの場合はその方が良いと思う。
ただ、仮想関数ってのは (言語仕様で決まりがあるわけではないが、一般的なコンパイラでは)
オブジェクトが暗黙に仮想関数テーブルへのポインタを持つことで実現されていて、
仮想関数テーブルには関数ポインタが格納されている。
つまり、仮想関数は関数ポインタを辿る処理を自動化したものなので、
メカニズムをよりよく理解したいなら関数ポインタのことも知っておくとわかりやすくなるかもしれない。
仮想関数テーブルの説明は Wikipedia に簡単なものがある。
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
抽象クラスを活用してるってこと?
それが上手くいっているならほとんどの場合はその方が良いと思う。
ただ、仮想関数ってのは (言語仕様で決まりがあるわけではないが、一般的なコンパイラでは)
オブジェクトが暗黙に仮想関数テーブルへのポインタを持つことで実現されていて、
仮想関数テーブルには関数ポインタが格納されている。
つまり、仮想関数は関数ポインタを辿る処理を自動化したものなので、
メカニズムをよりよく理解したいなら関数ポインタのことも知っておくとわかりやすくなるかもしれない。
仮想関数テーブルの説明は Wikipedia に簡単なものがある。
https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
452デフォルトの名無しさん
2018/10/01(月) 21:30:32.77ID:YHT/N1Mv >>仮想関数テーブルには関数ポインタが格納されている。
>>仮想関数は関数ポインタを辿る処理を自動化したものなので、
やはり関数ポインタが使われていたのですか
Cプログラム診断室のホームページを公開されてる藤原博文さんが
関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書かれていたので、初心者から脱したければ勉強すべきかもしれませんね
普通のポインタでも時々間違える事あるし、ポインタ本は買っておこうかな。
お答え頂きありがとうございました!
>>仮想関数は関数ポインタを辿る処理を自動化したものなので、
やはり関数ポインタが使われていたのですか
Cプログラム診断室のホームページを公開されてる藤原博文さんが
関数へのポインタの利用用途がスラスラと言えるレベルで中級
と書かれていたので、初心者から脱したければ勉強すべきかもしれませんね
普通のポインタでも時々間違える事あるし、ポインタ本は買っておこうかな。
お答え頂きありがとうございました!
453デフォルトの名無しさん
2018/10/01(月) 22:10:58.61ID:s5/CkhHO VC++6.0で作っています。 MFCです。
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか
MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です
普通にSDIを作りますが、そこからメニューバー等からダイアログボックスをモードレスで起動します。
すると、ダイアログを起動しながらメインウインドウも触れるようになるのですが、そのフォーカスを
モードレスダイアログとメインウインドウとをマウスを使わずにキーボードで切り替えることって出来ませんか
MSのWindowsOSのAlt+Tabではこれらはひとつとして認識されているようでこれでは切り替えられません
ちなみに、Windows7です
関数ポインタの使い道って…qsort() にて比較関数を指定するくらいしか思い浮かばないのですが…
他の関数に(キャストしまくった)関数ポインタを渡すことはあっても、自分で関数ポインタをコールする (*f)() のはあまりないのです…
他の関数に(キャストしまくった)関数ポインタを渡すことはあっても、自分で関数ポインタをコールする (*f)() のはあまりないのです…
455デフォルトの名無しさん
2018/10/01(月) 22:35:50.82ID:88z5+fOs 関数に関数を渡す関数型っぽいのとオブジェクト指向は根柢から違うんじゃないか?
456デフォルトの名無しさん
2018/10/01(月) 23:51:48.96ID:zfKNS/F/ #include <stdio.h>
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);
typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;
int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }
int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}
int main(int argc, char* argv[]) {
t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };
fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}
C言語の構造体ならコレでいける
コレならバカでもチョンでも分かる
C++の構造体でも同じように書ける
typedef struct tag_baka_t t_baka_t;
typedef int (*baka_func_t)(t_baka_t const* pt_baka);
typedef struct tag_baka_t {
char* text;
baka_func_t function;
} t_baka_t;
int call_baka1(t_baka_t const* ct_baka) { fprintf(stdout, "baka1:%s\n", ct_baka->text); return 1; }
int call_baka2(t_baka_t const* ct_baka) { fprintf(stdout, "baka2:%s\n", ct_baka->text); return 2; }
int call_baka3(t_baka_t const* ct_baka) { fprintf(stdout, "baka3:%s\n", ct_baka->text); return 3; }
int call(t_baka_t const* ct_baka) {
return ct_baka->function(ct_baka);
}
int main(int argc, char* argv[]) {
t_baka_t baka1 = { "boo", call_baka1 };
t_baka_t baka2 = { "foo", call_baka2 };
t_baka_t baka3 = { "woo", call_baka3 };
fprintf(stdout, "called baka1 -> returned %d\n", call(&baka1));
fprintf(stdout, "called baka2 -> returned %d\n", call(&baka2));
fprintf(stdout, "called baka3 -> returned %d\n", call(&baka3));
return 0;
}
C言語の構造体ならコレでいける
コレならバカでもチョンでも分かる
C++の構造体でも同じように書ける
457デフォルトの名無しさん
2018/10/02(火) 00:33:32.81ID:Cp0nvcbE >◆QZaw55cn4c
いつまで荒らし行為を続ける気だ
いつまで荒らし行為を続ける気だ
458はちみつ餃子 ◆8X2XSCHEME
2018/10/02(火) 02:33:55.94ID:wuORmtyC >>454
スクリプト言語の拡張を C で書いたりすると、関数ポインタを使うこともまあまあある。
言語に限らずプラグイン的なものだと関数ポインタのやりとりは結構あるんじゃない?
Regnessem のプラグインを作ったことが有るが、プラグイン側の関数を本体に登録したりする
処理に関数ポインタは使ったぞ。
それはそうと、関係ないけど Lisp Scheme スレに書いてた疑問は解消できたの?
スクリプト言語の拡張を C で書いたりすると、関数ポインタを使うこともまあまあある。
言語に限らずプラグイン的なものだと関数ポインタのやりとりは結構あるんじゃない?
Regnessem のプラグインを作ったことが有るが、プラグイン側の関数を本体に登録したりする
処理に関数ポインタは使ったぞ。
それはそうと、関係ないけど Lisp Scheme スレに書いてた疑問は解消できたの?
459デフォルトの名無しさん
2018/10/02(火) 04:50:47.05ID:Cp0nvcbE これで確認完了
460デフォルトの名無しさん
2018/10/02(火) 05:07:06.87ID:WWljJiuT461デフォルトの名無しさん
2018/10/02(火) 08:31:43.68ID:abMWvZGd >>458
window classを登録するときとか普通に使わない?
window classを登録するときとか普通に使わない?
462デフォルトの名無しさん
2018/10/02(火) 09:46:02.89ID:bn0iLUpp qsort のような、問題先送り系コールバック関数は関数のポインタになっちゃうわね
463デフォルトの名無しさん
2018/10/02(火) 14:02:18.97ID:iqLUFQ6Z465デフォルトの名無しさん
2018/10/04(木) 00:21:59.55ID:C6FTp/Pz windows 10 でmingw5.3使ってて
#include <clocale>
#include <regex>
int main() {
std::setlocale(LC_ALL, "");
std::regex reg("^ [cC]");
return 0;
}
これでbad_allocが発生するんだけど、なんかだめなの?
#include <clocale>
#include <regex>
int main() {
std::setlocale(LC_ALL, "");
std::regex reg("^ [cC]");
return 0;
}
これでbad_allocが発生するんだけど、なんかだめなの?
466デフォルトの名無しさん
2018/10/04(木) 07:26:56.12ID:TASd8bzQ ファイルに書き込みを行うプログラムの章を勉強中なんですが
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD
実行してもtextファイルに変化ありません…
visualstudioと同じフォルダに入れてもなんとも無い
どうすれば書き込み出来るんですか?
http://codepad.org/IJwmFcAD
467さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/04(木) 07:37:56.66ID:MLculXgy468さまよえる蟻人間 ◆T6xkBnTXz7B0
2018/10/04(木) 07:39:02.67ID:MLculXgy テキストエディタが排他ロックをすることがある。
469デフォルトの名無しさん
2018/10/04(木) 07:46:06.55ID:TASd8bzQ >>467
ありがとうございます
確認で…https://gyazo.com/475adc0e6966d65477f0702b17202ab4 これで書き込みできる準備は出来ていますよね?
せっかくなので書き込み出来るようにしてこの章を終えたいんですが(´Д`)
ありがとうございます
確認で…https://gyazo.com/475adc0e6966d65477f0702b17202ab4 これで書き込みできる準備は出来ていますよね?
せっかくなので書き込み出来るようにしてこの章を終えたいんですが(´Д`)
470デフォルトの名無しさん
2018/10/04(木) 09:43:58.74ID:knyldx34 >>469
その指定だと実行ファイルと同じ場所にtxtできてない?
その指定だと実行ファイルと同じ場所にtxtできてない?
471デフォルトの名無しさん
2018/10/04(木) 16:40:22.50ID:TASd8bzQ472デフォルトの名無しさん
2018/10/04(木) 16:45:04.26ID:qnqRQVWC473デフォルトの名無しさん
2018/10/04(木) 17:45:40.20ID:TASd8bzQ 普通にプロジェクトと同じフォルダに出来てました。ありがとうございます
自分で作ったtxtファイルに書き込みがされるのかと思ってました…
自分で作ったtxtファイルに書き込みがされるのかと思ってました…
474デフォルトの名無しさん
2018/10/04(木) 18:52:20.74ID:knyldx34 >>473
それだと同名のファイルが全て上書きされてしまうからな
それだと同名のファイルが全て上書きされてしまうからな
475はちみつ餃子 ◆8X2XSCHEME
2018/10/04(木) 20:10:36.56ID:1wg41Y30 >>465
mingw の setlocale は msvcrt の setlocale で、
空文字で呼出すとシステムにセットされているロケールになるんだけど、
日本語環境だともちろん日本語がセットされる。
で、どうにも std::regex はマルチバイト系の文字符号には対応してないっぽい。
英語、フランス語、ドイツ語とかで試すと問題なかったが、
日本語、中国語、韓国語で試すと bad_alloc になる。
bad_alloc になるのが意図的な動作なのかどうかわかんないけど。
std::wregex を使う分には日本語ロケールでも例外にはらない。
mingw の setlocale は msvcrt の setlocale で、
空文字で呼出すとシステムにセットされているロケールになるんだけど、
日本語環境だともちろん日本語がセットされる。
で、どうにも std::regex はマルチバイト系の文字符号には対応してないっぽい。
英語、フランス語、ドイツ語とかで試すと問題なかったが、
日本語、中国語、韓国語で試すと bad_alloc になる。
bad_alloc になるのが意図的な動作なのかどうかわかんないけど。
std::wregex を使う分には日本語ロケールでも例外にはらない。
476デフォルトの名無しさん
2018/10/05(金) 18:01:44.43ID:X1kF7PG7 クラスの宣言に下記のように書いたらエラーになりました
class test
{
char c[] = "abc";
}
このcという文字列はこのクラスの中でずっと定数として固定で使うのが目的です
class宣言部では宣言できないのでしょうか。どうしたらいいですか
char *c; とだけして、クラスのコンストラクタでnewで作るとか、定数なのでそんなことはしたくないのですが
class test
{
char c[] = "abc";
}
このcという文字列はこのクラスの中でずっと定数として固定で使うのが目的です
class宣言部では宣言できないのでしょうか。どうしたらいいですか
char *c; とだけして、クラスのコンストラクタでnewで作るとか、定数なのでそんなことはしたくないのですが
477デフォルトの名無しさん
2018/10/05(金) 18:17:00.47ID:3qR/q5rp static constexpr char c[] = "abc";
478はちみつ餃子 ◆8X2XSCHEME
2018/10/05(金) 18:21:51.16ID:Cnw78CfH 今どきは必要ないだろうけど、
古い仕様 (C++03) だとこう。
class test
{
static const char c[];
};
const char test::c[] = "abc";
古い仕様 (C++03) だとこう。
class test
{
static const char c[];
};
const char test::c[] = "abc";
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「日本はドイツと違い反省せず」…中国外相、独外相に対日批判 台湾問題で理解求める [少考さん★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」 [ぐれ★]
- 【警視庁】走行中の電車で女性に露出した下半身押しつけたか 無職の男(46)逮捕「チャンスがあればいつでもやる」 [nita★]
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★6 [七波羅探題★]
- 【苺ましまろ】立民衆院議員、人気漫画の水着少女画像を「醜悪」タイ人少女の性搾取事件と関連付け…党内で反発 [少考さん★]
- 「残業キャンセル界隈」若者が増加?「職務放棄」との批判も…“定時退社の権利”どこまで通用するか [七波羅探題★]
- 高市政権「かけてもつながらない。機能していない」防衛当局間のホットライン機能せず [834922174]
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑★2 [931948549]
- あたしゃやだよ
- 【高市悲報】中国軍「公海で空母の発着訓練するって事前通告したのになんで自衛隊機は急接近してきたんだ…?」中国軍困惑 [931948549]
- 30過ぎた大人おじさんが大学生(昔)のままのファッションをする「おじさんキッズコーデ」、炎上して問題視される。 [153490809]
- 俺はきっと"全部"嫌いなんだ。息づく全てが俺を苛つかせるんだ。
