[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net]
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります

コードを貼れる所
codepad.org/
https://ideone.com/

前スレ
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1500329247/

962 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:45:06.66 ID:p8F2e5jx.net]
お前はまずエラーメッセージをちゃんと読め。

963 名前:デフォルトの名無しさん [2018/06/24(日) 14:12:06.73 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[];
clsA(char *name[]);
};

//clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){};

/*だめだが可能性がありそう。 Invalidはでていない。
--error message--
#29 expected an expression
*/

//clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid
/*
Multiple markers at this line
- #2125 invalid initializer for array member
"clsA::m_name"
- #18 expected a ")"
*/

//clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
/*
* Multiple markers at this line
以下省略
*/

964 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:20:47.48 ID:p8F2e5jx.net]
すまん、そっちはエラーメッセージじゃ分からん。
string str1[] = {"abc", "def"}; //error
とか
constexpr char *mes1 = "abc"; //error
とかの話。

965 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:38:12.08 ID:iIKq/Q4Y.net]
string関数の第二引数には何の意味がありますか?
試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが
↓です

string readFile(const char *filename)
{
ifstream ifs(filename);
return string(istreambuf_iterator<char>(ifs),
istreambuf_iterator<char>());
}

https://www.miraclelinux.com/tech-blog/1n4hgx

966 名前:デフォルトの名無しさん [2018/06/24(日) 14:46:22.41 ID:iIKq/Q4Y.net]
すみません自己解決しました>>948

967 名前:デフォルトの名無しさん [2018/06/24(日) 14:58:47.68 ID:8StK2ZXu.net]
>>947
string str2[] = {"abc", "def"}; //okでした。

constexpr 文字列は諦めました。多分相当難しい。
でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。
というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも
Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発
ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。
しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ
には無関心なのだろう。

もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して
マスターしたので簡単には教えたくない。
それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。

いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし
できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか?
多くのファーム開発者は諦めてCで初期化してるのだろうな。

968 名前:デフォルトの名無しさん [2018/06/24(日) 15:43:14.02 ID:zWtoG2OO.net]
配列の初期化の時には()いらないぞ{}だけ
>>941の最後の行の()はずせば通るけどたぶん環境依存じゃないかな
意図してる動作がname使ってm_nameの初期化ならめんどくさそう

969 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:08.57 ID:zWtoG2OO.net]
あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめか

970 名前:なこれ []
[ここ壊れてます]



971 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:30.09 ID:8StK2ZXu.net]
class clsA
{
private:
const char *m_name;
clsA();
};
clsA::clsA() : m_name("Bike"){};

これはOK、しかし配列はできない。

972 名前:sage [2018/06/24(日) 16:24:15.11 ID:zWtoG2OO.net]
class a
{
public:
const char* name[]; ここで非標準だなんだの警告でる

a():name{ "aaa","bbb" }
{
}
};

vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな
配列の数指定しといたほうが無難な気がするけど

973 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 16:39:11.76 ID:Q9QWMZ9P.net]
C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ
コンストラクト時にわかってるじゃないか、って話もあったけど
中身の配列数が変わったらそれは違う型になる
つまりテンプレートが必要になる

配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど

974 名前:デフォルトの名無しさん [2018/06/24(日) 17:24:18.36 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
const char *m_name[2];
clsA():m_name{"aaa","bbbb"}{}
};
これでもエラーします。

975 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 17:42:22.01 ID:zWtoG2OO.net]
なんてエラーでてるの

976 名前:デフォルトの名無しさん [2018/06/24(日) 17:54:03.23 ID:8StK2ZXu.net]
//C++はchar *[]のコンストラクタでの初期化はできるのか?
class clsA
{
private:
char *m_name[10];
clsA();
void init();
};
clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。
/*
Multiple markers at this line
- #66 expected a ";"
- #171 expected a
declaration
- #126 expected a "("
- #176-D expression has
no effect
*/

977 名前:デフォルトの名無しさん [2018/06/24(日) 18:01:33.16 ID:8StK2ZXu.net]
それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。

978 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 18:04:27.08 ID:p8F2e5jx.net]
あなたの使っているコンパイラは、おそらくC++11未対応です。
constexprはC++11の機能なので、そのコンバイラでは使えないか、
使えたとしても標準とは異なる動作をする可能性があります。

979 名前:デフォルトの名無しさん [2018/06/24(日) 18:18:27.13 ID:8StK2ZXu.net]
>>960
あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール
した最近のコンパイラなので当然C++11以上だとおもっていた。
一寸調べてみる。

980 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 18:23:43.69 ID:StWe8jKY.net]
>>961
対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。



981 名前:デフォルトの名無しさん [2018/06/24(日) 18:36:49.63 ID:8StK2ZXu.net]
>>962
おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを
みてもC11++がない。
最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。

982 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 19:43:42.27 ID:G0tizpK6.net]
勘違いしてたらすまないけど↓みたいな事がしたいの?
https://ideone.com/Zm8LO5

983 名前:デフォルトの名無しさん [2018/06/24(日) 22:24:29.32 ID:8StK2ZXu.net]
>>964
凄い!!。まさにそれです。こちらでもコンパイル通りました。
難しいなー。
もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ
ど、それを丁重に拝借いたします。ありがとう。

984 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 22:30:41.96 ID:EmcxYm71.net]
借りるってことは返すんだよね

985 名前:デフォルトの名無しさん [2018/06/24(日) 23:08:30.10 ID:8StK2ZXu.net]
>>966
もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が
わかりますか?
clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};

(const char* const []){"mike","tetu",nullptr}
これは何を意味してるの?

986 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 23:09:16.86 ID:chBT6m1a.net]
「c++ constexpr 文字列」で検索すれば?

987 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 00:15:08.68 ID:RQXh1ivn.net]
void func1(int a) { printf("%d\n", a); }
void func2(int a, int b) { printf("%d,%d\n", a, b);}

template<?????>
class Test
{
public:
void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) }
private:
int a;
in b;
};
のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして
記述したいのですが、うまくいきません。どうすれば良いでしょうか?
例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が
表現出来ません。

988 名前:デフォルトの名無しさん [2018/06/25(月) 01:49:02.18 ID:Gwlgg6/B.net]
class class1 {
private: int m_a;
public:
class1(int a) : m_a(a) {}
class1(class1 const& rhs) { m_a = rhs.m_a; }
void method(void) { printf("%d\n", m_a); }
};
class class2 {
private: int m_a;
int m_b;
public:
class2(int a, int b) : m_a(a), m_b(b) {}
class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; }
void method(void) { printf("%d,%d\n", m_a, m_b); }
};

template<class _Myclass> class Test {
private: _Myclass m_myClass;
public:
Test(_Myclass myClass) : m_myClass(myClass) {}
void method(void) { m_myClass.method(); }
};

int main() {
Test<class1> x(class1(1));
Test<class2> y(class2(2, 3));
x.method();
y.method();
}
意味があるのか分からないがとりあえずコレで
もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない
まずなにがやりたいのか分からないからテキトーに書いてやったぞ

989 名前:デフォルトの名無しさん [2018/06/25(月) 03:37:15.06 ID:3f3crQyZ.net]
const char *[]の初期化だけれども

clsA(const char* const name[]) : m_name(name) {};
これはまあ何となく意味が解る。m_name <−−nameってことだよね。

clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {};
しかしこれはどういう意味だろうか?
clsA <−− (const char* const []){"mike","tetu",nullptr}
ラムダ関数?かとおもったが、前半はcastだろうか?
m_name <−−name
clsA <−− {"mike","tetu",nullptr}
この二つがセットで意味を持つんだろうな。
const char *[] の初期化が3つくらいあったらどうするんだろうね。
まるでクイズを解いてるみたいだよ。
いくらなんでも言語仕様としてやはり不味いよね。

990 名前:デフォルトの名無しさん [2018/06/25(月) 04:00:03.54 ID:3f3crQyZ.net]
わかった。コンストラクタに引数がないディフォールトでは
clsA <−− {"mike","tetu",nullptr}
そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。
引数を持つ場合は
clsA(const char* const name[]) : m_name(name) {};
m_name <-- name;
になる。

じゃあconstのメンバ変数が二つある場合はどうするんだろうか?
clsA:clsA( {"xxx"}),clsA({"yyy"})
{}
とは書けない。変数を明示しないといけないから、、、
clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){}
必然的にとなる。
じゃあ最初から
clsA:m_name1( {"xxx","abc"}){}
こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。



991 名前:デフォルトの名無しさん [2018/06/25(月) 04:04:26.64 ID:3f3crQyZ.net]
class clsA{
private:
const char* const* m_name1;
const char* const* m_name2;
public:
clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {};
clsA(const char* const name[]) : m_name1(name) {};
void put(){
for(const char* const * p=m_name1; *p!=nullptr ;++p ) {
printf(*p);
}
};
virtual ~clsA() {};
};
実験したみたが、コンパイルは通った。

992 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 05:56:57.36 ID:MAmRCfEQ.net]
>>964のソースをclangでビルドしたら最初の結果が文字化けする。
環境依存で動作が変わるようなソースコードを参考にしてはいけない。

993 名前:デフォルトの名無しさん [2018/06/26(火) 09:01:37.25 ID:6tjGTw22.net]
>>969
template<class ... args>
class clsTest {
public:
void func1(int dt) {}
void func1(int dt1, int dt2) {}
void func2(args...) {

}
};
int main()
{
clsTest<int, int, int> a;
clsTest<int, int, char *> b;

a.func2(2, 3, 4);
b.func2(5, 6, (char *)"test");

a.func1(2);
a.func1(2, 3);

return 0;
}

994 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 10:37:33.14 ID:dRU/pr3A.net]
c++です
LNK2005 DllMain は既に vstplugmain.obj で定義されています
1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。

左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが
両方vstplugmain.objで困ってます
どのようにすれば解決できるでしょうか?

995 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:09:44.92 ID:9ql/FcZD.net]
自動でリンクしてるライブラリと明示的にリンカに渡

996 名前:してるパス違いの同じライブラリで衝突してんんじゃないの?
知らんけど
[]
[ここ壊れてます]

997 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:44:03.03 ID:dRU/pr3A.net]
検索してみたのですが
vstplugmain.objは一つしか無いようです

998 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 12:06:53.39 ID:dRU/pr3A.net]
もしかしたら関係あるのかもしれないので参考までに記述します
以下のようなエラーも同時に発生しています

vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。
LNK2001 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))"
(?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 Dll6 source\repos\Dll6\Dll6\vstplugmain.obj 1


よろしくおねがいします

999 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 17:14:50.29 ID:hh115pnF.net]
エラーログの上から順番に解決するようにしたらいい

1000 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 09:50:56.72 ID:8ZX2E7EU.net]
無事解決しました
ありがとうございました



1001 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 10:22:32.55 ID:h8zo0ENm.net]
>>981
そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。

1002 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:16.69 ID:OiiVA+37.net]
ロベールのC++の本の typedef の説明ですが、よく分かりません。

typedef int* IntPtr;

int n = 0;
const IntPtr p = &n;
IntPtr const q = &n;

はどちらも、

int* const p;
int* const q;

の意味になるそうです。

分からないのは、ロベールさんの解釈の部分です。

const int* p; → 「const の右側にあるものが const になる」
int* const q; → 「const の右側にあるものが const になる」

と解釈すればよいと説明してます。

この解釈が

const IntPtr
IntPtr const

の場合にも通用するというのです。

1003 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:56.86 ID:OiiVA+37.net]
const IntPtr = const int*
IntPtr const = int* const

ではないのでしょうか?

1004 名前:デフォルトの名無しさん [2018/06/29(金) 10:55:12.72 ID:OiiVA+37.net]
const IntPtr p = &n;
IntPtr const q = &n;

↑「const の右にあるのは p や q なので、 p や q が const になるのです。」

と説明していますが、これが意味不明です。

1005 名前:デフォルトの名無しさん [2018/06/29(金) 10:56:58.22 ID:OiiVA+37.net]
>>985
の論法を↓に適用すれば、

const の右にあるのは p や q なので、 p や q が const になるのです。

となってしまいますが、 p は const ではないですよね。
q は const ですが。

const int* p;
int* const q;

1006 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 11:34:56.01 ID:rwm1MJ+D.net]
>>983
マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど
typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る
const int と int const もどちらも const の int であるのと同じように
int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ

1007 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:00:29.81 ID:nFp4wdEK.net]
i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char ifname[] ="i.csv";
int a,b,c;
char name[30][100];
int sum[30];
int i;

FILE *ifp;

ifp=fopen(ifname,"r"); /*読み込み込みモードでopen*/
if(ifp==NULL){
printf("ファイルが開けない");
exit(1);
}

for(i=0;i<=29;i++){
if(fscanf(ifp,"%s%d%d%d",name[i],&a,&b,&c)==EOF)
break;
else
sum[i]=a+b+c;
printf("%s %d %d %d %d\n",name[i],a,b,c,sum[i]);
}
fclose(ifp);
}

1008 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:06:09.83 ID:nFp4wdEK.net]
10行ではなく30行でした、すみません

1009 名前:デフォルトの名無しさん [2018/06/29(金) 12:10:17.92 ID:OiiVA+37.net]
>>987
ありがとうございました。

1010 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:40:26.79 ID:nFp4wdEK.net]
988ですが自力で解決出来たので大丈夫です



1011 名前:デフォルトの名無しさん [2018/06/29(金) 14:45:38.42 ID:+YHimQiw.net]
Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。
どのように設定すればいいでしょうか?
VisualStudio2017/C++

1012 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:50:24.25 ID:+YHimQiw.net]
何がしたいかというと、カレンダーを表示させたいです。

1013 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:52:35.06 ID:+YHimQiw.net]
小出しですみません。カレンダー機能はMFCで作成済みです。

1014 名前:デフォルトの名無しさん [2018/06/29(金) 22:49:34.96 ID:DjTQOr6S.net]
無理でしょうか?

1015 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 23:03:37.60 ID:DjTQOr6S.net]
C#ですが、方法が見つかったので自力でやってみます。
https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus

1016 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:10.80 ID:UA/DrxK6.net]


1017 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:30.62 ID:UA/DrxK6.net]


1018 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:47.85 ID:UA/DrxK6.net]


1019 名前:小倉優子 mailto:sage [2018/07/01(日) 01:15:06.26 ID:UA/DrxK6.net]
  ∧,,,∧ 
 (  ・∀・) 1000ならジュースでも飲むか
  (    ) 
  し─J 

1020 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 238日 8時間 41分 31秒



1021 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef