スレを勃てるまでもないC/C++の質問はここで 24at TECH
スレを勃てるまでもないC/C++の質問はここで 24 - 暇つぶし2ch200:デフォルトの名無しさん
16/01/17 20:57:56.42 ZUkPM10Q.net
>>191
コンパイラの不具合
規格では初期化子リストの各要素は左から順に評価されるであってる

201:デフォルトの名無しさん
16/01/18 07:43:20.39 O3Vj0Ahg.net
>>191
これってどのパターンもinitializer_listとして処理されずにただのアグリゲートで直接「A(int a, int b)」が呼ばれるんじゃないの?
initializer_list<int>を引数に取るコンストラクタにしないとただただA(int a, int b)になって副作用複数で動作未定義になると思うんだけど

202:デフォルトの名無しさん
16/01/19 08:25:02.67 pbmLvf11.net
副作用完了点までの間の演算の順序は未定義だと思うよ

203:デフォルトの名無しさん
16/01/19 14:07:47.73 IcGeaXVP.net
クラスについての質問です。(C++)
printf(

204:デフォルトの名無しさん
16/01/19 14:13:54.81 IcGeaXVP.net
文章が途中で切れてしまったので再掲です。
改善しない場合は不具合と思われるのでクローズします。
本文
クラスについての質問です。(C++)
printf("%d,%d,%d",Instance名,Instance名,Instance名);
のように記述すると、クラスのメンバ変数が上から順番に呼び出されることがわかりました。
この機能は、本来の仕様なのでしょうか?また、仕様であるとすれば、名称はありますでしょうか。
ご解説のほどよろしくお願い致します。

205:デフォルトの名無しさん
16/01/19 14:30:34.90 yzf0Ubeh.net
>>200
上から順番にってのがよく分からんが、標準的な実装だと右から順に評価される。
評価順序は仕様上は未定義だった筈。

206:デフォルトの名無しさん
16/01/19 15:00:24.15 XmaCTdxl.net
>>200
可変引数の関数printf()に渡された引数が
たまたま3個のint数と解釈可能になる順序に
スタックに積まれてるだけなんじゃないかしら。
#include <stdio.h>
struct some {
 int a, b, c, d;
};
void main() {
 some ins1 {0, 1, 2, 3};
 some ins2 {10, 11, 12, 13};
 printf("%d, %d, %d\n", ins1, ins2);
}
これで 0, 1, 2 と表示される感じ。
手元の環境では 0, 1, 2 だけど、移植性は全然ないよね。

207:202
16/01/19 15:21:26.58 XmaCTdxl.net
言い訳っぽいけど、普段は >>202 のようなコードは書かないよ。
コンパイラのオプションで書式指定と引数並びを照合してもらう。
今回は、コンパイルと実行ができることと >>200 に書かれたような
出力が得られることを実験しただけね。

208:200
16/01/19 15:40:27.23 IcGeaXVP.net
>>202
ご解説ありがとうございます。
仰る通り、クラスの仕様ではなくprintf関数による現象でした。
ありがとうございました。

209:デフォルトの名無しさん
16/01/19 16:16:36.66 uAThxx94.net
可変個引数の呼び出しだとスタックに積む順序とともに評価順が変わるという話が

210:デフォルトの名無しさん
16/01/19 21:42:47.84 OWcc7WP1.net
未規定
なので鼻から悪魔は出ない模様

211:デフォルトの名無しさん
16/01/19 22:58:57.80 8V+g6swC.net
私の環境だと標準入力の入力文字数制限が4095文字なんだけどこれを取っ払う方法ありますか?
osはwindows7 visual studio 2015使ってます
std::cin >> str みたいなときの話です
ググったんだが他の環境だとこんな制限ないっぽい……

212:デフォルトの名無しさん
16/01/20 03:31:40.09 7T123+WA.net
標準入出力のバッファが4KBだからだろ
Linuxのfind コマンドでも、ファイル数が多いと、
引数リストが長すぎて、コマンドが失敗する
そういう時、パイプで、xargs につなげると、
(4KB毎に?)引数を分割して、実行してくれる
find ~ | xargs ~
バッファが一杯になったら、それを出力して、
バッファを空にする。その後、バッファに読み込む

213:デフォルトの名無しさん
16/01/20 08:16:31.13 UTQHsO+H.net
>>207
setvbuf() って関数でどうにかならんかの。
俺も試したわけじゃないんだけど。

214:デフォルトの名無しさん
16/01/20 09:06:46.12 tlDETzf4.net
>>207
それ実行してもstrに4095バイトしか入らないってことはないと思うけど?

215:デフォルトの名無しさん
16/01/20 10:21:56.43 PU8f41kT.net
>>210
そういう質問じゃないだろ

216:デフォルトの名無しさん
16/01/20 12:33:16.22 tlDETzf4.net
>>211
どういう問題なの?

217:デフォルトの名無しさん
16/01/20 12:35:33.21 zFAeGKrq.net
>>207
手元に実行環境がないから俺の思ってる現象と実際に起きてるそれとが同じかどうか分からんけど
多分ライブラリがクズなのが原因。
文字列読み込みくらいなら自分で書いてみよう
レシピは?
getchして必要ならutf-8をUCS4にする類のデコーディングをして、stringにappendするだけ。簡単だよね?

218:デフォルトの名無しさん
16/01/20 12:39:52.50 zFAeGKrq.net
>>212
「改行が来るまでバッファに貯めこんで、改行が来たら返す関数」と
「その関数を使ってstringを作る関数」みたいな実装になってて、
しかも改行の判定だのeof判定だのループだのをやってないんじゃないかなぁと思ってる

219:デフォルトの名無しさん
16/01/20 14:33:44.70 7Lwquj6u.net
すみません実際にはgetlineで読み込んでいます
std::cin >> strでも同じ問題が起きたのでこのような例にしました。
実際には下のコードを書いています
std::string cmd, token;
while (std::getline(std::cin, cmd))
{
// 入力されたコマンドを入力ストリームとする
std::istringstream ss_cmd(cmd);
// 空白は読み飛ばしながら、tokenに代入
ss_cmd >> std::skipws >> token;
if (token == "")
{
//いろいろな処理
}
else if (token == ...
}

220:207
16/01/20 14:40:09.85 7Lwquj6u.net
このプログラムでgetlineが実行され標準入力からの受付待ちになったとき
コピペしてあった4096文字以上の文字列を標準入力にペーストすると、4096文字目以降が途切れて表示されなくなってしまいます
それ以降キーボードから入力しても何も表示されず、受け付けてくれないようです
標準入力以外(ファイルストリーム)からの入力に変更することは仕様上できないので、なんとか標準入力の制限を取っ払う方法を調べていましたが、見つからずここで質問させていただきました

221:デフォルトの名無しさん
16/01/20 14:57:00.34 +L7kwNqj.net
それってプログラムじゃなくてコマンドプロンプトの制限なんじゃ?

222:207
16/01/20 15:02:48.12 7Lwquj6u.net
>>208 >>209 >>213
教えてくれてありがとう。詳しい状況説明します
GUIと標準入力でやりとりするプログラムを書いています
GUIは将棋所というプログラムでオープンソースではないです
私が作ってるのは将棋の思考エンジンです
これで将棋を指すと807手目くらいで思考エンジンに送る文字列が4096文字を超えてしまい、思考エンジンの動作が止まってしまうようです

223:207
16/01/20 15:08:19.19 7Lwquj6u.net
>>217
コマンドプロンプトを立ち上げて4096文字以上の文字列をペーストしたところちゃんと表示してくれたので、大丈夫なんじゃないかと思ってるのですが……
しかも、以前2000000文字を標準入力から受け取るプログラムを書いたことがあって、そのときは問題なく動いたはずなんです
この問題です→URLリンク(yukicoder.me)

224:デフォルトの名無しさん
16/01/20 15:08:44.03 zFAeGKrq.net
>>216
調べたら、どうもコンソールの制限みたい。
URLリンク(stackoverflow.com)
Linuxにおいでよ。

225:207
16/01/20 15:12:22.18 7Lwquj6u.net
>>220
そうなんですね……ありがとう
連投すみませんでした

226:デフォルトの名無しさん
16/01/20 16:03:06.86 6opntLoI.net
std::string型の "abc"+str のように、
クラスの左側のoperatorを変更したい場合は、どのように記述すれば良いでしょうか。
よろしくお願い致します。

227:デフォルトの名無しさん
16/01/20 16:24:10.25 UTQHsO+H.net
>>222
#include <iostream>
#include <string>
std::string operator+(const char *s1, const std::string& s2)
{
 std::string ret {s1};
 ret += s2;
 return ret;
}
int main() {
 const char *s1 = "C_string";
 std::string s2 {"std::string"};
 std::cout << s1 + s2 << std::endl;
 std::cout << s2 + s1 << std::endl;
 return 0;
}

こんな感じに、クラスのメンバ関数でない形で書くんだと思うが。
関数の引数とか返り値の生存期間とか、あまり自信がないので詳しい方の添削を求む。

228:222
16/01/20 17:58:33.69 6opntLoI.net
>>223
できました!
クラスの外に記述する発想はありませんでした。
ご回答、本当にありがとうございました。

229:uy ◆Qawu9.2l1E
16/01/20 20:56:27.36 xIovtIq7.net
ヌバーン!生き生きとしたこんにゃくをAlien & Friend @ トリなし運用中wに叩きつけたときの音w
【ヌバーン!】ヌバーンから学ぶGoogleのサジェスト汚染の仕組みw
スレリンク(tech板)l50

230:デフォルトの名無しさん
16/01/20 22:13:13.72 arPtyuMt.net
自然数aと列数mを入力として、各行の要素の合計がaとなるnxm行列を作りたいんですがどうしたらいいか教えて下さい
例えばa=2、m=3とすると
2 0 0
1 1 0
1 0 1
0 2 0
0 1 1
0 0 2
という6x3の行列です

231:デフォルトの名無しさん
16/01/20 23:39:56.17 bvuszQOX.net
ええと、別に行列である必要なくない?

232:デフォルトの名無しさん
16/01/20 23:52:10.42 Gr6aoqFK.net
仮に作るとして
行の並びはどうやって決めてるんかね

233:デフォルトの名無しさん
16/01/20 23:56:05.00 arPtyuMt.net
行の並びは、各行に重複がなければ何でもいいです

234:デフォルトの名無しさん
16/01/21 00:02:08.78 yQ7XttE4.net
全パターンって事?
a = 合計 = 2
m = 列数 = 3
2 0 0
0 2 0
0 0 2
1 1 0
1 0 1
0 1 1

235:デフォルトの名無しさん
16/01/21 00:20:37.50 6QaN3bnU.net
>>230
そうです
それでaとmが引数で、それに応じて作られる行列が変わるというモノにしたいです

236:デフォルトの名無しさん
16/01/21 00:45:35.57 yQ7XttE4.net
今はどこまで出来上がってるのかideoneあたりにでも上げてみて

237:デフォルトの名無しさん
16/01/21 01:44:18.71 7s6F6whZ.net
そんなのただの組み合わせ問題でしかないような気はするが

238:デフォルトの名無しさん
16/01/21 05:20:25.85 PqFPWDYj.net
まずC言語で行列をどう定義すれば良いんだろ?
とりあえず6*3の2次元配列に値を格納するとかなら再現出来るけど
やっぱりそれって組合せを羅列してるだけだしなあ

239:デフォルトの名無しさん
16/01/21 07:15:24.30 6QaN3bnU.net
>>234
まさしく組み合わせの列挙と同じです
そういうアルゴリズムはもうありますか?
組み合わせの列挙ができれば行列の表現は自分で適当に定義するので大丈夫です

240:デフォルトの名無しさん
16/01/21 08:12:31.11 7s6F6whZ.net
>>235
そういうアルゴリズムがあるのかは知らないが、例えば再起関数とかでできる
#include <iostream>
#include <vector>
using Vector = std::vector<int>;
void Func(size_t a, size_t m, size_t movingTarget, size_t start, Vector* pbuff, std::vector<Vector>* pdest)
{
if(movingTarget != a){
for(size_t i = start; i < m; ++i){
(*pbuff)[i] += 1;
Func(a, m, movingTarget+1, i, pbuff, pdest);
(*pbuff)[i] -= 1;
}
} else {
pdest->push_back(*pbuff);
return;
}
}
int main() {
size_t a, m;
std::cin >> a >> m;
Vector buff(m, 0);
std::vector<Vector> dest;
Func(a, m, 0, 0, &buff, &dest);
return 0;
}

241:デフォルトの名無しさん
16/01/21 17:50:19.63 AYpDF3p9.net
すみません、質問です。
HBITMAPでハンドルされたビットマップのデータを、
LPBITMAPFILEHEADERのポインタに渡すにはどうしたらいいでしょうか?
HBITMAPのほうは、ARGBで、LPBITMAPFILEHEADERにはRGBで渡したいのですが。
1ピクセルずつ転送するしか方法はないでしょうか?

242:デフォルトの名無しさん
16/01/22 01:15:05.06 G5rv7JJ3.net
>>237
LPBITMAPFILEHEADERはBITMAPFILEHEADER構造体へのポインタなんだけど、
BITMAPFILEHEADER構造体はビットマップファイルのサイズとかデータのオフセットなんかを保持するものであって、
ビットマップの内容を保持するものじゃない。
だからビットマップのデータを渡すことはそもそも不可能。
ビットマップファイルを作ることが目的なら、GetDIBits関数を使えば行けるっぽい。
URLリンク(www.geocities.co.jp)

243:デフォルトの名無しさん
16/01/22 07:20:07.20 KhXVHsnG.net
>>236
vector とかをポインタで渡す奴初めて見た

244:デフォルトの名無しさん
16/01/22 08:04:21.41 mLydxleH.net
>>239
別に普通じゃね?

245:デフォルトの名無しさん
16/01/22 08:42:22.39 0StJWjHm.net
渡した引数が関数内で変更されることを明確にするために
参照でなくポインタを引数に使うって流儀があるな。
呼び出す際に意識できるように。
ただ、この関数の場合vectorの中身を書き換えるのは
関数の目的からして明らかだから、参照でも構わない気もする。

246:デフォルトの名無しさん
16/01/22 09:08:19.22 bim8zuhw.net
>>241
C++ core guidelines だと、
入力専用
 const 参照渡し F(const T&) ただし、int とかは値渡し
出力専用
 return で返す。move を使う。
入出力用
 参照渡し F(T&)
っていうのを推奨してたと思う。
ご指摘の通り、呼び出し側で、const T& とT& の区別が付かないから、const T& とT* で区別するっていう流儀もあって、google の coding guideline もそうなっていたと思う。
一方 fortran は、
intent(in)
intent(out)
intent(inout)
を使うことが出来て、意図がそのものズバリ表せて分かりやすい。

247:デフォルトの名無しさん
16/01/22 23:40:00.14 EmPy3KXO.net
>>238
参考になります。ありがとうございます。

248:デフォルトの名無しさん
16/01/23 07:48:50.85 QkGTEhqA.net
>>236
おーまさしく求めていたモノです
ありがとうございました

249:デフォルトの名無しさん
16/01/23 13:05:07.65 eTMuwGLO.net
すみません質問です。
HBITMAP hBitmap =(作成したビットマップ画像のハンドル)
BITMAP bmp;
GetObject(hBitmap,sizeof(BITMAP),&bmp);
で、bmpにHBITMAPのビットマップ情報を取り出せるようですが、
DIBとして作成したビットマップの、
LPBYTE lpPixel のポインタはどのように取得できるのでしょうか?
bmp.bmBitsPixelとか、bmp.bmBitsとか、bmp.bmPlanesがそうかな?と思ったのですが、RGB値を取得するのに
unsigned char* pix = (unsigned char*)bmp.bmBitsPixel;
Color color( pix[0], pix[1], pix[2] );
では、アクセス違反エラーになるので、よくわかりません。

250:デフォルトの名無しさん
16/01/23 13:46:54.30 BpJ08GBs.net
>>245
質問する前にちょっとはググろうぜ
URLリンク(msdn.microsoft.com)
URLリンク(katahiromz.web.fc2.com)

251:デフォルトの名無しさん
16/01/23 17:35:21.00 8FfjCDv5.net
>>246
ありがとうございます。
bm.bmBitsが、データの先頭ポインタということでいいんですよね?
これを、RGBごとの配列として取得しようとするとアクセス違反が出るのですが、
参考になるサンプルがググっても出てこないので困っています・・・・・・・・・。

252:デフォルトの名無しさん
16/01/23 19:21:25.50 AYxzv3Ol.net
LIBRARY_PATHで指定しても聞いてくれん
-Lとかめんどい

253:デフォルトの名無しさん
16/01/23 19:29:56.09 BpJ08GBs.net
>>247
手元に環境がないのでどんなコード書いて動かんのか分からんのだけど、
>>264の2つ目のリンクに載ってる動くコードは試してみた?
ビットマップの情報(info)とビットマップを構成するピクセルの情報(data)は違うよ。
後者を得るにはGetDIBits関数を使う。

254:デフォルトの名無しさん
16/01/23 19:47:23.84 BpJ08GBs.net
>>248
gcc --print-libgcc-flie-name
で表示されるファイルと同じ場所にあるspecsってファイルを編集する。
デフォルトのファイルが無ければ
gcc -dumpspecs > `dirname $(gcc --print-libgcc-file-name)`/specs
して作る。

255:デフォルトの名無しさん
16/01/23 20:27:45.17 sjR26rme.net
>>249
2つ目のリンクだと、
pBitsに、データ全体を格納できるバッファを確保して、
GetDIBitsで、pBitsに、データ全体を丸ごとコピーしてるという流れでしょうか?
ということは、それだけ時間がかかるわけですよね?
作法はよくわからないのですが、
元データのポインタに直接アクセスするような方法は普通しないということでしょうか?
安全のため?とか?

256:デフォルトの名無しさん
16/01/24 06:35:19.53 LlGxXnUD.net
>>250
gccを上げたのにldが古いままだからか知りませんがうまくいかなかったので諦めて-Lしました

257:デフォルトの名無しさん
16/01/24 11:46:59.00 LHp2Xjej.net
>>251
元データがどんな形式で保持されてるかは分からない。
もしかしたら配列の配列を使った拡張性の高い形式になってるかもしれないし、
もしかしたら1ピクセルに一色あたり10ビット使ってるかもしれないし、
あるいは赤5ビット緑6ビット青5ビットかもしれない。
その内部形式をbitmap形式に変換する必要があるんだから
どっちみちGetDIBitsでデータ全体をbitmap形式で再生成する必要がある。

258:デフォルトの名無しさん
16/01/24 17:01:15.10 LvcqEuFR.net
>>253
わかりました。ありがとうございます。

259:デフォルトの名無しさん
16/01/25 10:22:34.82 1hi7ZmAY.net
ランタイムライブラリ→マルチスレッド(/MT)に設定してるんだけど、
外部のライブラリを、追加の依存ファイルで設定して、
リンクするときに静的にEXEに埋め込めると思ったのですが出来ないんだっけ?
他に設定とかあります?

260:デフォルトの名無しさん
16/01/25 20:36:08.52 Gry0WUO1.net
VCスレ行け

261:デフォルトの名無しさん
16/01/31 00:14:56.28 yeB8Lsmn.net
すみません、C++初心者ですが、質問です。
変数の内容を複数個組み合わせて、別の変数の識別子(名前)にしたいのですが、
良い方法がわかりません・・・どうやったらいいのでしょうか?
具体的には以下のソースのような感じです。
#include <iostream>
#include <string>
using namespace std;
int main() {
string var1 = "a";
string var2 = "01";
string a01 = "表示したい項目1";
string a02 = "表示したい項目2";
string a03 = "表示したい項目...";
if ( var1+var2 == "a01" ) cout << a01 << endl;
// 上記のような条件分岐ではなく、文字列を組み合わせて変数名を変えたい。
// イメージ的には下のような感じで、変数a01の内容を参照したい。
cout << var1+var2 << endl;
}

262:デフォルトの名無しさん
16/01/31 00:24:13.44 rR0u1lvP.net
>>257
<map>じゃあかんか?

263:デフォルトの名無しさん
16/01/31 01:10:39.19 yeB8Lsmn.net
>>258
ありがとうございます。
こんな感じかな?
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
string var1 = "a";
string var2 = "02";
string a01 = "表示したい項目1";
string a02 = "表示したい項目2";
string a03 = "表示したい項目...";
map<string, string> mp;
mp["a01"] = a01;
mp["a02"] = a02;
cout << mp[var1+var2] << endl;
}
かなりやりたいことに近づいたのですが、
新しい項目が出来て、var1とvar2の内容が変わった時に、map部分にも追記しないといけないのがネックだったりします。
この辺は、我慢するしかないのかなorz

264:デフォルトの名無しさん
16/01/31 01:32:33.46 rR0u1lvP.net
>>259
>新しい項目が出来て、var1とvar2の内容が変わった時に
どんな状況か具体的に書いてくれると分かるかも
そもそもvar1とvar2の組合せに特別な意味があるなら(aの01,bの03みたいな)
安易に結合させない方が扱い易い気がする

265:デフォルトの名無しさん
16/01/31 02:13:55.81 yeB8Lsmn.net
>>260
伝わるかわりませんが、
自作のテキストファイル上のスクリプトテキストから、
指定の画像ファイルをDXライブラリを使用して表示するというプログラムを作っています。
スクリプトは拡張性を考えて、「aaa」という種類の画像の「01番目」を表示というように、
「画像表示 , aaa , 01」のようにコンマで分けて記載しており、それをここで言うvar1とvar2に読み取って格納しています。
で、画像のファイルはDXライブラリのLoadGraph関数を使用して、
こことは別の場所でメモリへロード、グラフィックハンドル化しております。
それが「表示したい項目」にあたるもので、aaa01という名前のint型の変数になっています。
cout~endl; の部分は、実際にはDXライブラリの描画関数のDrawGraphを使用するため、引数にグラフィックハンドルを設定します。
スプリプト側である程度画像ファイルをコントロールしたいというコンセプトで作っており、
新しい画像ファイル追加時も極力プログラム側は弄らずに済むようにしたいのです。
あと、明日早いのでもう寝ます、すみませんorz

266:デフォルトの名無しさん
16/01/31 04:23:29.02 +opoo++4.net
>>261
>もう寝ます、すみませんorz
気にすんな、おやすみ
とりあえず書くだけ書いとくと
・変数名はあくまでも人間が変数の役割を見る為の物
・実行時には変数名なんて一部を除き消えてる
・まずLoadGraphする時に片っ端から変数宣言するのを止めるべき
・その為には変数xxx00と画像ファイルにどんな対応関係があるのかを見直す必要がある
(xxx00→img\xxx\00.png等)

267:デフォルトの名無しさん
16/01/31 10:56:19.63 KmNLeza2.net
1.ARGBの24ビットでBITMAPを作り、Aに透明度の値を入れます。
2.GDIで、PNGにセーブします。
3.セーブしたファイルのバイナリを見ると、Aに値が入っています。
4.GDIで、PNGをロードします。
5.GDIのGetPixel、GetAlphaで、Aの透明度の値を取得できます。
PNGでは問題ありませんが、BMPでセーブロードしたとき、
セーブしたBMPファイルのバイナリを見るとAに値が入っているのに、
ロードした後、GetAlphaで、Aの透明度の値を正しく取得できません。Aの値は255になっています。
透明度付きBMPをロードする時に、何か設定が必要だったでしょうか?
透明度付きBMPはロードできないような仕様なのでしょうか?

268:デフォルトの名無しさん
16/01/31 11:10:13.83 wbBrgvcH.net
>>263
何でロードしてるん
ロードでAARRGGBBの所がFFRRGGBBになってるんじゃないの?
FFは0xFFの事な

269:デフォルトの名無しさん
16/01/31 11:22:28.41 KmNLeza2.net
>>263
訂正:24ビットではなく32ビットです。
>>264
GDIの関数です。
bmp = new Gdiplus::Bitmap(LoadFile,PixelFormat32bppRGB);
bmp->GetPixel( x, y, &pixelColor );
alpha = pixelColor.GetAlpha();
これで、PNGの場合はalphaが取得できますがBMPでは取得できません。
バイナリで見ると、BMPファイルにはalpha値が入っています。
たとえば0x88でも、GetAlphaで255になります。

270:デフォルトの名無しさん
16/01/31 11:26:50.86 wbBrgvcH.net
>>265
変更前 PixelFormat32bppRGB
変更後 PixelFormat32bppARGB
でやってみたらどうなる?

271:デフォルトの名無しさん
16/01/31 11:41:21.24 ym0w2q0h.net
mapとか、最近だとエディタの補完ってどこまで効くんだろ

272:デフォルトの名無しさん
16/01/31 11:56:29.04 KmNLeza2.net
>>266
あ~!と思いましたが、変わりませんでしたです。

273:デフォルトの名無しさん
16/01/31 12:03:49.64 wbBrgvcH.net
HBITMAP取ってGetObjectした時のbmBitsPixelは何になってる?

274:デフォルトの名無しさん
16/01/31 12:19:29.18 KmNLeza2.net
>>269
32になってます。

275:デフォルトの名無しさん
16/01/31 12:30:09.27 wbBrgvcH.net
>>270
GetPixel前にpixelColorを0x00000000にしても
0xFFRRGGBBになるの?

276:デフォルトの名無しさん
16/01/31 12:40:44.08 KmNLeza2.net
>>271
pixelColor=0x00000000;
bmp->GetPixel( x, y, &pixelColor );
alpha = pixelColor.GetAlpha();
で、alpha は255になります。
PNGロードは問題なくalphaを取得できるんですが。
いま、LockBitsでロードしたデータの中身を見ようとしてるんですが、
素人なので、取得の仕方から調べてるところです。

277:デフォルトの名無しさん
16/01/31 14:12:49.87 Q+LCs9MU.net
バイナリだとbmpは下の行から格納されるからとかだったりして

278:デフォルトの名無しさん
16/01/31 14:18:47.67 wbBrgvcH.net
>>272
RGBはxyに期待する値取得できる?

279:デフォルトの名無しさん
16/01/31 14:31:16.81 KmNLeza2.net
>>237
>>274
RGBは問題ありません。
LockBitsで見たところ、ロードしたデータのalpha値はすでに255でした。
これって、こちらだけの問題でしょうか?
他の方はalpha値をロードできているのでしょうか?

280:デフォルトの名無しさん
16/01/31 14:32:33.18 KmNLeza2.net
あれ?sageてるのに、なぜか上がってるし?

281:デフォルトの名無しさん
16/02/03 18:07:52.25 tpmWM1rq.net
通りすがりだけど、bmpにalphaなんてないよね?

282:デフォルトの名無しさん
16/02/03 20:54:07.47 uEOUJl1K.net
32bit中8bitをアルファに割り当てるのはよくあると思うけど
APIにそのまま渡せるかは知らない

283:デフォルトの名無しさん
16/02/03 21:27:06.77 cIfP8+z6.net
>>277 あるよ
>>278 渡せるよ(BITMAPV5HEADER)

284:デフォルトの名無しさん
16/02/03 21:37:47.64 +QXRA0Fd.net
非標準なので対応してるアプリ毎に違う

285:デフォルトの名無しさん
16/02/05 16:46:07.97 kz0UWJTh.net
それ言ったらbitmap形式自体がMSのとOS/2のとあるような
標準はいずこへ

286:デフォルトの名無しさん
16/02/06 14:37:10.84 XRyA0EjL.net
BITMAPV5HEADERは Win95 がダメだったから
それを未だに引きずってアプリの対応もイマイチなのよね

287:デフォルトの名無しさん
16/02/06 15:03:17.23 4STRQeN+.net
で,ビットマップの扱いはどうすればいいの,データの32ビット縛りも気が付かないと大変だし,ヘッダの各プロパティにもいろいろこだわりがあるようじゃないか,

288:デフォルトの名無しさん
16/02/06 15:17:27.16 SD/iIwrI.net
GDI+なんか使わないでWICでやる。

289:デフォルトの名無しさん
16/02/06 15:44:14.42 utAdfs60.net
内部形式で処理して、どうしてもbmpで出力したい時に変換すればいいんじゃない?

290:デフォルトの名無しさん
16/02/11 04:53:26.42 pNz7UH/B.net
スレリンク(tech板:564番)
わかる方いませんか?
マルチでごめんなさい。

291:デフォルトの名無しさん
16/02/11 11:44:52.07 vxNioHuU.net
向こうで即レスついてるじゃん。例えば、こういう事だよ。
class Types {
public:
typedef std::uint64_t ValueType;
typedef std::vector<ValueType> Container;
typedef std::string IDType;
static State ClientInitialize(
ICodeBreakerClient*, std::ostream& Logger,
Types::ValueType MaxValue,
Types::ValueType Digit_);
};
class CodeBrakerHost : public Types{
State PlayGame() {
...
Types::ClientInitialize(Client, *pos, Max, Digit);
}
}

292:デフォルトの名無しさん
16/02/11 12:19:09.02 pNz7UH/B.net
>>287
回答ありがとうございます。
一応作業してたら解消したのですが理解はしていません。
いまいちC++のコード規約理解してないのでこういうわなにはまってしまいます。
向こうにアルファ版がおいてあるので暇があったら遊んでみてください。
ありがとうございました。

293:デフォルトの名無しさん
16/02/11 12:32:08.05 vxNioHuU.net
ざっくり言うと、それまでに出現(定義)してない名前は使えない
クラス内メンバーは例外で、後から定義してても使える

294:デフォルトの名無しさん
16/02/11 12:43:42.53 pNz7UH/B.net
>>289
なるほど。参考にします。

295:デフォルトの名無しさん
16/02/11 22:42:24.22 vMQ0aSNq.net
>>187の質問で>>190で以下のような記述で解決したのですが、
#pragma once
#pragma comment(lib, "Gdiplus.lib")
#include <gdiplus.h>
using namespace Gdiplus;
--------------------
Gdiplus::Bitmap * bmp1;
bmp1 = new Gdiplus::Bitmap(hBitmap,NULL);
そのまま別のプロジェクトに移植したとこ�


296:�、 Debugで、「'Gdiplus::GdiplusBase::operator new' : 関数に 3 個の引数を指定できません。」 というエラーが出るようになりました。 が、Releasだと、エラーになりません。 Debugでコンパイルしたときだけエラーが出るような場合の原因として何が考えられるでしょうか?



297:デフォルトの名無しさん
16/02/12 00:33:59.18 Fqxy+b4c.net
ファイルの頭の方にあるこいつがGdiplusと相性悪い。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

298:デフォルトの名無しさん
16/02/12 10:17:01.79 bFgUXSY6.net
>>292
ありがとうございます。削除して上手くいきました。

299:デフォルトの名無しさん
16/02/14 12:46:34.08 VLtYVTYt.net
class Transaction {
public:
Transaction() { logTransaction(); };
virtual void logTransaction() { cout << "Transaction" << endl; };
virtual void logTransaction() const { cout << "const Transaction" << endl; };
};
class BuyTransaction : public Transaction {
public:
BuyTransaction() { logTransaction(); };
void logTransaction() { cout << "Buy" << endl; };
void logTransaction() const { cout << "const Buy" << endl; };
};
int main()
{
const BuyTransaction b;
return 0;
}
と書いた場合、基底&派生クラスともに非constな logTransaction()が呼ばれてしまいます。
const、非constオブジェクトの生成に関して処理を分けることは出来ないのでしょうか?
VS2015 VC++ と Mingw64 g++ 5.3.0 とも同じ動作になりました。

300:デフォルトの名無しさん
16/02/14 19:53:21.40 gzwnh80D.net
>>294
普通の筋で考えるとconstのコンストラクタも作らないと駄目でしよ。
でも、コンストラクタの意味からしてconstのコンストラクタってありえない。
ってあたりから、無理じゃね?

301:デフォルトの名無しさん
16/02/14 20:51:48.95 QinwwQiS.net
そのconstは変数bの属性だと思うんだよ。
クラス側としては
class BuyTransactonConst : public BuyTansaction
とか作れば?

302:294
16/02/14 21:17:33.93 VLtYVTYt.net
直接的に処理を分けることは無理みたいですね。
お察しが付くかもしれませんが、上記ソースコードは
スコット・メイヤーズさんのEffectiveC++第3版の9項からのものです。
説明では基底クラスのTransaction中では void logTranslation() const = 0;
と純粋仮想関数になっているのですが、サンプルソースを適当に変えて挙動を
みていたら、このことに気が付きました。
両名の方、レスありがとうございました。

303:デフォルトの名無しさん
16/02/14 23:45:36.83 aC/U9cwJ.net
質問です。
メンバポインタの必要性ってなんですか?
今メンバポインタについて勉強していますがわかりません。
あると便利なときってどんな時ですか????

304:デフォルトの名無しさん
16/02/15 01:17:40.04 CoPBLH5e.net
普通の関数ポインタじゃ扱えないから、その代用
……とかそういう話なかったっけ?

305:デフォルトの名無しさん
16/02/15 01:25:22.95 FDnCcdJi.net
メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
ちゃんぽんしたかったら一考しないといけない。

306:デフォルトの名無しさん
16/02/15 12:13:19.05 8Os0TVn8.net
>>298
今まで一度も使ったことないし使われてるところを見たこともない

307:デフォルトの名無しさん
16/02/15 21:40:19.82 geRYYYJt.net
>>298
その章は飛ばして先に進みましょう

308:デフォルトの名無しさん
16/02/16 08:52:37.81 ZqCrYcMA.net
必要になった時に学べばいいと思う

309:デフォルトの名無しさん
16/02/16 15:52:46.94 TrNqH2Y5.net
>>301
なんだそれw オワコン・・・・・・?
検索したけど情報量少ないのが困るなぁ
>>302
わかった!ありがと!
>>303
必要になるのがどういう状況下がわからん(´;ω;`)ブワッ

310:デフォルトの名無しさん
16/02/16 18:14:53.19 14idcRCK.net
>>304
テンプレートと組み合わせてイベントハンドラの格納に使える。
もっともC++11以降は std::function があるからそれを使うべき。

311:デフォルトの名無しさん
16/02/16 19:40:50.31 fomhurQ7.net
こんなの必要性以前の問題だろwww


メンバポインタって何だっけ?

312:デフォルトの名無しさん
16/02/16 19:54:01.02 SmCEknBn.net
クラス内で宣言した配列に外で宣言した配列の中身を突っ込むことってできますか

313:デフォルトの名無しさん
16/02/16 23:50:18.80 bGf55uSQ.net
>300にはっきりと答えが書かれてるのに、何故そっちはスルーしたんだ…

314:デフォルトの名無しさん
16/02/17 07:44:04.68 bjhQnNdd.net
>>308
すまぬ、別の人に対して発言したとおもた
>>300
>メンバ関数は暗黙にthisを引数に取るので普通の関数ポインタでは扱えない。
何でそうなるのかわかりません(´;ω;`)ブワッ
まずはそこからです((((((((( (´・ω・`)へ

315:デフォルトの名無しさん
16/02/17 08:50:55.26 4zW8fTVw.net
>>309
自クラスの他関数を呼び出す時にthis->func()って呼べるやろ?
自クラス内でthisを暗黙に取ってないとthisは使えない
自クラス内でもstatic関数はthisを取らない

316:デフォルトの名無しさん
16/02/17 12:36:46.43 ofvCQlRl.net
>>309
f(a, b, c);
って書いたとする。普通の関数はCの機能なので、超大雑把に言うと
コンパイル時にアドレスが分かっている関数のアドレスへgotoする機能と、スタックにaとbとcを積む機能、
そして関数から戻った後に実行される命令のアドレスをスタックに積む機能
の組み合わせとして表現されてる。
関数ポインタもCの機能で、固定のアドレスにgotoするか変数に格納されてるアドレスにgotoするかが違う。
で、クラスのメンバ関数呼び出しはCから見たらC++による拡張が入ってて、
o->f(a, b, c);
って書いたとすると、超大雑把に言えば
aとbとcの他にoもスタックに積んでf


317:を呼び出すようになってる。 これが「暗黙にthisを引数に取る」って事の意味。C風に書くと、f(o, a, b, c);みたいに、暗黙のthisであるoを引数に取ってる。 だからCの機能である「普通の関数ポインタ」では扱えない。



318:デフォルトの名無しさん
16/02/17 15:08:50.48 nUvaCFse.net
クラスAから、クラスBの関数を呼ぶとかに使うの?
クラスA{
 クラスB m_メンバ;
}
クラスB{
hoge();
}
ホゲ()::クラスA{
m_メンバ.hoge();
}

319:デフォルトの名無しさん
16/02/18 02:12:50.53 zoJ8Qqc9.net
自分は使ったことないけど、
基本的には関数ポインタを使う場面で使うんじゃない?
まあ、今のC++で関数ポインタを使う場面があるか?と聞かれても微妙だが。

320:デフォルトの名無しさん
16/02/18 07:46:15.09 nHOTcIDn.net
>>311
.* か ->* を使って書いてくれ

321:デフォルトの名無しさん
16/02/19 08:21:46.75 NhUxYl/M.net
>>313
もともとC#からプログラミングを始めたけど、デリゲートとかにいいんじゃない?
だから、C++だとイベント処理とか

322:デフォルトの名無しさん
16/02/19 17:08:23.26 E/z1CaIk.net
>>315
自分も昔は関数ポインタをよく使ってたけど、
クラス継承、関数オブジェクト、そして今はラムダ式とある中で
そもそもの関数ポインタを使う場面って限られてるんじゃないかって話ね。
そして、そこから更にメンバ関数ポインタを使う機会って考えると
割りと怪しいんじゃないかなって。

323:デフォルトの名無しさん
16/02/20 12:04:55.58 xl4z8Qhr.net
オーバーライドに対応した関数ポインタと考えればいいんだけど
(継承や関数オブジェクト、ラムダ式じゃ当然実現できない)
そういえば使ったことないな

324:デフォルトの名無しさん
16/02/25 22:56:25.67 yuZaonNv.net
質問です。
class personというのをつくります。
std::vectorにそのまま入れて、メンバ変数のidでsortしたいのですが、それなりにpersonのサイズがおおきいのでpersonではなくperson*の配列として扱いたいです。
person->idでsortしたい場合、どのように記述すればよいですか。追加ですが簡単な切り替えでperson->numberでもsort出来るようになっていると有り難いです。

325:デフォルトの名無しさん
16/02/26 00:43:27.52 5tlNRLX1.net
ふたつのperson*を引数にとって
idで大小比較してboolを返す関数/関数オブジェクト/ラムダ式を書いて
sortに渡すだけ

326:デフォルトの名無しさん
16/02/26 00:54:31.33 pNNKrV8l.net
>>319
ありがとうございます。
なんとかできました。
ラムダはまだわからないです。

327:デフォルトの名無しさん
16/03/05 12:06:37.89 XYtyIfXI.net
ポインタの確保する領域って32bitは4byteで64bitは8byteの固定長なんですか??

328:デフォルトの名無しさん
16/03/05 20:17:06.06 t560EV2m.net
固定ではなく環境とコンパイラで変わる

329:デフォルトの名無しさん
16/03/06 11:30:10.04 E+dKwvyv.net
>>322
そうなんだ
コンパイラがポインタのサイズを決めて終わりかと思った。
それ以外に決まる要因って何?

330:デフォルトの名無しさん
16/03/06 11:56:01.08 9dFH7fs4.net
すでに自分で答えを書いてるんでは

331:デフォルトの名無しさん
16/03/06 13:25:23.83 7dbWmFO0.net
>>323
コンパイラが環境によってポインタのサイズを決めて終わり

332:デフォルトの名無しさん
16/03/09 03:26:57.98 UYrrbR23.net
クラスのデストラクタが呼ばれない場合って
継承関係にあるクラスのデストラクタにvirtualを付けなかったとき
abort, exitしたとき以外にどんな場合がありえますか?

333:デフォルトの名無しさん
16/03/09 06:19:35.04 EHNG1aVZ.net
解放しなかった時

334:片山博文MZ ◆T6xkBnTXz7B0
16/03/09 16:43:22.32 j/ofmAyB.net
>>326
newで確保してdeleteで解放しなかったとき

335:デフォルトの名無しさん
16/03/09 17:14:57.11 mZtDFmSo.net
例外中のデストラクタで例外が投げられたとき

336:デフォルトの名無しさん
16/03/10 13:45:15.99 /KMYK0BP.net
本来の目的が何かを明らかにしないと求める答えは得られない

337:326
16/03/10 21:03:11.56 WVxO2Qsv.net
やろうとしてたことがスマポではできなさそうだったので
自分でスマポに変わるクラスを作ろうと思って質問したのですが
よくよく調べてみたらスマポでできたのでそっちを使いました
後学のために他にもデストラクタが呼ばれない場合があったら教えてください

338:デフォルトの名無しさん
16/03/11 00:34:20.06 ZLj/v9UA.net
コンストラクタから例外を外にthrowしたとき

339:デフォルトの名無しさん
16/03/11 00:40:37.01 ZLj/v9UA.net
exitしたときは、静的変数のデストラクタは呼ばれます。

340:デフォルトの名無しさん
16/03/12 01:44:49.90 WNn7QVXF.net
質問です
OpenFrameworksiOSv0.9.3で行き詰ってます。
unsigned char * pixels = grabber.getPixels();にどうしても
『operator unsigned char * is deprecated』とwalningがついてしまいます。
どうしてもピクセルデータを取り出すことが必要なのですが、
どなたかどのように記述すればいいのか教えていただきたいです。

341:デフォルトの名無しさん
16/03/12 09:03:27.72 NuHx+xBn.net
>>334
使った事ないので詳しくないけど
その警告部分に改善策が示されてないかな?
grabberの型が不明なのでエスパー出来ないが
ofPixelsRef pixels = grabber.getPixels();
ofPixels& pixels = grabber.getPixels();
ofPixels_<unsigned char>& pixels = grabber.getPixels();
unsigned char * pixels = grabber.getPixels().getData();
このあたりかな
読み込みだけならconstで。

342:デフォルトの名無しさん
16/03/13 00:06:45.03 Q68izjaV.net
templateを使って、引数をそのまま構造体の要素にするプログラムを書いています。
template<class STR,class ... ARGS>
void event(ARGS ... args){
STR str = {args};
...
}
STRの部分に何かしらの構造体を入れると、関数内のstrに代入されるという代物です。
このSTRの部分にクラスを入れると'エラー C2440 '初期化中': 'initializer list' から 'Stage::TC' に変換できません。'
というエラーを吐きます。何とかクラスで似たような動作をさせられないでしょうか?

343:デフォルトの名無しさん
16/03/13 02:12:46.39 kPqg6a4C.net
{args}ではなく{args ...}にすればクラスだろうと普通に動作するだろ
URLリンク(ideone.com)

344:デフォルトの名無しさん
16/03/13 11:40:24.96 Q68izjaV.net
そういえば、templateをまとめて記述する方法ってないの?
いちいち同じtypenameに対して
template<~>
void func1(){}
template<~>
void func2(){}
template<~>
void func3(){}
ってするの面倒なんだけど

345:デフォルトの名無しさん
16/03/13 12:07:02.45 agB5sXDj.net
長くなるようなら#defineでも使っとけ

346:デフォルトの名無しさん
16/03/15 17:59:57.73 IZ6+yR9m.net
キーボード入力後の改行をなかったことにできますか?
入力されたすぐ右に文字を出力したいのです。
fgets(buf, sizeof(buf), stdin);
printf("\b");
では入力行の右端まで行ってしまいます。
また入力開始位置は可変です。つまり入力された文字列の文字数から行末は算出できないのです。
どこか抜け道はありますか?

347:片山博文MZ ◆T6xkBnTXz7B0
16/03/15 18:04:43.83 zLB+iwEH.net
>>340
コンソール端末の色情報やキャレットの操作は、
ncursesというライブラリを使うとできる。

348:デフォルトの名無しさん
16/03/15 22:06:47.48 hLONNm58.net
ドラッグアンドドロップなんだけど
explorer.exeからD&Dすると [ データ形式(49868) 形式名(Shell IDList Array) ] [ データ形式(CF_HDROP) 形式名(InShellDragLoop) ] だけど
IShellFolder の GetUIObjectOf で IID_IDataObject 指定だと [ データ形式(CF_HDROP) 形式名(Shell IDList Array) ] になる
しかし受け手のほうはいずれも CF_HDROP 形式に対して DROPFILES 構造体の方法で取得できる
CF_HDROPは定数値(15)のはずだし
クリップボードフォーマットとして登録されているはずの形式がなぜ変わってしまっているのですか?
またShell IDList ArrayやInShellDragLoopの内部形式はどうなっているのかわかりますか?

349:デフォルトの名無しさん
16/03/15 23:10:37.50 hLONNm58.net
「またShell IDList ArrayやInShellDragLoopの内部形式はどうなっているのかわかりますか?」
については自己解決した感じです
GlobalLock により取得したメモリをdumpしてみたところすべて中身は同じでした

350:デフォルトの名無しさん
16/03/15 23:16:20.40 hLONNm58.net
ごめんなさい>>343は取り消しですorz

351:デフォルトの名無しさん
16/03/15 23:34:36.66 hLONNm58.net
すみません>>342-344
一旦取り消します
根本的な部分でミスしてました
形式名を表示する部分が間違っていてデータ形式と形式名のペアが一致していないだけでしたorz

352:デフォルトの名無しさん
16/03/15 23:39:00.56 XI218Dpy.net
質問があります
vector<T>同士でそれぞれの要素ごとにtransform関数で演算する2項演算子のテンプレートを作り
T = vector<double>でインスタンス化してtransformからT = doubleでインスタンス化
したものを再帰的に呼ぼうと思ってるのですが
multipliesとdividesではうまく行きますがminusとplusではうまく行きません
もしかしてすでにこの型のオーバーロードがあるのでしょうか?

353:デフォルトの名無しさん
16/03/16 02:23:21.71 /xZFuugQ.net
>>346
plus,minusのオーバーロードが原因ではなく
stdにstd::operator+(operator-)があると(reverse_iteratorやstring用など)
std::plus(minus)からは
自分で書いたグローバルのoperator+(operator-)が隠蔽されて見えなくなるのが原因

354:デフォルトの名無しさん
16/03/16 14:05:43.23 JUYIKEKS.net
>>335
遅れてすみません
ありがとうございました

355:デフォルトの名無しさん
16/03/20 00:48:49.68 Hvn8A5ZD.net
ちょっと質問ですが
class A
{
private:
ULONG RefCount;
public:
A() : RefCount(1){}
~A(){}
ULONG Release()
{
ULONG ret = (ULONG)InterlockedDecrement(&_RefCount);
if(ret == 0){
delete this;
}
return (ULONG)_RefCount;
}
};
この場合、delete this; した後でも メンバ変数の RefCount にアクセスするのは問題ないのでしょうか?

356:デフォルトの名無しさん
16/03/20 00:53:03.96 9URbr6kI.net
>>349
問題あ~る

357:デフォルトの名無しさん
16/03/20 21:17:45.36 Hvn8A5ZD.net
ありがとうございます
やっぱりそうですね
(※下の_RefCountはRefCountの間違いですが)
ULONG Release()
{
ULONG ret = (ULONG)InterlockedDecrement(&_RefCount);
if(ret == 0){
delete this;
}
return ret;
}
というような、delete this;以降にthisを参照するコードを書かなければ問題ないということでOKですよね

358:デフォルトの名無しさん
16/03/21 10:46:27.54 5Pe+8Vgq.net
enumに対して operator== と operator!= を定義する方法ってありますか?
visual studio 2015使ってますが 'operator==があいまいです'というエラーが出てしまいます。
コードはこんな感じにしています
Moveがenum型です
inline Move moveRaw(const Move m) { return Move(m & 0x03ffffff); }
inline bool operator == (const Move m1, const Move m2) { return int(moveRaw(m1)) == int(moveRaw(m2)); }
inline bool operator != (const Move m1, const Move m2) { return !(moveRaw(m1) == moveRaw(m2)); }

359:デフォルトの名無しさん
16/03/21 11:09:44.03 /QOiUUU0.net
伝統的enumはintのエイリアスみたいなものだ。
enum classならできるだろ。

360:デフォルトの名無しさん
16/03/21 12:35:55.65 wdcchfji.net
>>352
そのままできるだろ
URLリンク(codepad.org)
ほかのところがエラーの原因

361:デフォルトの名無しさん
16/03/21 14:26:36.82 PBSyTjzr.net
オーバーロードの中でエラー出してるやろ

362:デフォルトの名無しさん
16/03/21 16:52:02.88 5Pe+8Vgq.net
>>354
ほんとですね。ありがとうございます!
ほかの原因を探してみます。

363:デフォルトの名無しさん
16/03/21 17:05:14.43 5Pe+8Vgq.net
>>354のコードをコピペしてコンパイルしてみましたがやはり同じエラーが出ます
どうやらvisual studio 2015だと出てしまうようです

364:デフォルトの名無しさん
16/03/21 17:30:46.19 tX8tczo7.net
Visual Studio 2015 の専用スレッドがあるみたいだから
そちらで質問すればエラーの理由と対処法が分かるかも。
Part4 が今年になって建てられているようだ。

365:デフォルトの名無しさん
16/03/21 20:11:48.11 5Pe+8Vgq.net
>>358
ありがとうございます。気が向いたらそちらに質問させていただきます
とりあえずoperatorではなく関数で対応するようにしました。

366:デフォルトの名無しさん
16/03/21 20:52:32.91 tZIQ77lC.net
/clrオプションを指定してコンパイルしているとそんな状況でエラーが出ることもあるようだな

367:デフォルトの名無しさん
16/03/21 21:36:35.66 fU37GtsM.net
>>347
遅くなりましたが、ありがとうございます
解決しました

368:デフォルトの名無しさん
16/03/22 15:16:38.18 bNAVuy+v.net
C言語の初心者として、ポインターの仕組みについて勉強をしています。
下記のプログラムはコンパイルできますが、実行すると
segmentation faultになってしまいます。どこを修正
すればよいのでしょうか?よろしくお願いします。
URLリンク(ideone.com)

369:デフォルトの名無しさん
16/03/22 15:21:37.96 idYykKmC.net
ひとまず行番号が紛れ込んでるので
消してから来てくれるといいかも

370:デフォルトの名無しさん
16/03/22 15:27:15.48 IkdBLUXL.net
a = (char**)malloc(sizeof(char*) * 2);

371:デフォルトの名無しさん
16/03/22 16:51:41.03 0b4iocXG.net
*a = (char*)malloc(128 * 2);

372:デフォルトの名無しさん
16/03/22 16:56:04.92 cRV6j0bX.net
もしかして64bitと64バイト間違えてる?

373:デフォルトの名無しさん
16/03/22 22:18:25.75 icYWCtsj.net
>>362
a+1 の領域が確保されてないから 364 のように確保する。

374:362
16/03/22 23:29:49.69 bNAVuy+v.net
みなさんありがとうございました。
分からない警告が出ますが、想定内の実行はできました。
test7.c:7:16: warning: incompatible implicit declaration of
built-in function ‘malloc’
>>367
レスありがとうございます。実行不可の意味が分かりませんでした。
だからsegmetation faultなのですね。

375:デフォルトの名無しさん
16/03/23 00:00:31.86 KYuvKtO/.net
#include <stdlib.h>

376:デフォルトの名無しさん
16/03/30 13:44:09.99 G7ZCwJy+.net
c言語の中級目指しています。
以下のプログラムで3つわからないところがあります。
よろしくお願いします。
1
static void
free_cmd(struct cmd *cmd)
{
free(cmd->argv);
free(cmd);
のところですが、free(cmd)のみでは構造体の領域
開放がおこなわれないのでしょうか?
2
static void*
xrealloc(void *ptr, size_t size)
関数を呼び出す側からみれば、void **ptrにした方が
いいのではないのでしょうか?
3これは根本的に理解できいません。
cmd->argv[cmd->argc] = p;
この構造体のメンバーの配列には、どのような内容が
入力されていくのでしょうか?特に入力順番がわかりません。
アルゴリズムの問題だと思います。自分の実験した小プログラム
でにおいて、配列には’長い文字列のアドレス’から’短い文字列アドレス’の
順に入力されました。
自分はソースコードを読んでるとき逆に読んでました。

377:370
16/03/30 13:45:26.83 G7ZCwJy+.net
すみません。ソースコード貼忘れてました。
URLリンク(lifeloveregret.googlecode.com)

378:片山博文MZ ◆T6xkBnTXz7B0
16/03/30 14:10:56.06 GvtcJfJR.net
>>370
1 cmd->argvとcmdは違うメモリーブロック。解放されない。
2 xreallocは標準関数reallocをまねて作られている。
第一引数がvoid**で戻り値なしなら、エラーが起きた�


379:ニきの扱いがややこしくなる。



380:デフォルトの名無しさん
16/03/30 19:33:40.70 k/+VMgXF.net
>>370
realloc() は使わないほうがいい,エラー処理をまともに実装しようとすると realloc() の存在が悪になる

381:デフォルトの名無しさん
16/03/30 23:34:32.54 jnPwp4pc.net
>>370-371
3
cmdlineを空白文字で単語に区切って左側の単語からその単語へのポインタが入力されていく
例えばcmdlineが

382:374
16/03/30 23:38:15.05 jnPwp4pc.net
あれ途中で消えた?
3
cmdlineを空白文字で単語に区切って左側の単語からその単語へのポインタが入力されていく
例えばcmdlineが”one two three”という文字列へのポインタだった場合
cmd->argv[0]にはoneの先頭のoへのポインタ
cmd->argv[1]にはtwoの先頭のtへのポインタ
cmd->argv[2]にはthreeの先頭のtへのポインタ
が代入される

383:デフォルトの名無しさん
16/03/31 06:33:12.34 sYy1gdjM.net
>>373 の件、もう少し詳しく教えてもらえまいか。
エラー処理において realloc() の存在が害になる状況を
例示してくれれば、その先は自力で考えたいのだけど…。

384:デフォルトの名無しさん
16/03/31 07:47:07.21 X8/ytHGi.net
>>376
realloc() を二回繰り返す動作をサブ関数としてまとめるとする.
realloc()の返り値(正常/異常)もサブ関数から返すとする.
これで考えてみて.
C++ には new/delete しかない.

385:デフォルトの名無しさん
16/03/31 09:44:45.48 90m4Y48w.net
vector内で引数と最初に合致する要素のインデックスを返す関数を作りたくて
template <typename TYPE> int std::vector<TYPE>::find_first(const TYPE element){
 for(int i = 0 ; i < size() ; ++i){
  if(element == at(i)) return i ;
 }
 return -1 ;
}
と書いたのですが、以下のエラーが出ます。
error C2039: 'find_first' : 'std::vector<TYPE>' のメンバーではありません。
テンプレートの文法もちょっと自信なくて、テンプレートが間違っているのか
そもそも外部で新たに定義することはできないのかわかりません。
どうしたら関数を作れますか?

386:デフォルトの名無しさん
16/03/31 10:14:25.72 n/eFTOI8.net
>>378
外部で新たにvectorのメンバ関数を定義することはできない
vectorを引数にとる普通の関数として定義する
template <typename TYPE> int find_first(const std::vector<TYPE> & vec, const TYPE element){
 for(int i = 0 ; i < vec.size() ; ++i){
  if(element == vec.at(i)) return i ;
 }
 return -1 ;
}
vector<int> v;
find_first(v, 100);

387:デフォルトの名無しさん
16/03/31 13:32:36.50 90m4Y48w.net
>>379
vectorも引数にすればよかったんですね
ありがとうございます

388:370
16/03/31 16:30:35.74 82dYqFlv.net
みなさんレスありがとうございました。
>>375
丁寧な説明ありがとうございます。
そのように動くとは思っていましたが理解は
できていませんでした。
次のアルゴリズム実験プログラムで確認できました。
ただprintfの置く行は気をつけないと、とんでもない
結果がおきました。このアルゴリズムの場合printfは
”式の前”に置かないといけないようですね。
URLリンク(ideone.com)
何かコメントがありましたら、お聞かせ下さい。
まだアルゴリズムの理解は足りていないので。

389:デフォルトの名無しさん
16/03/31 17:45:56.41 sYy1gdjM.net
>>381
本当にリンク先のプログラムで動いてるかな。
最初の "*p1=..." に無意味な文字列が表示されないか?
少なくとも20行目と21行目は順番が逆だと思う。元のソースだと、
20行目 printf("*p1=%s\n",p1); に最初に到達したとき
p1が未設定、つまりどのアドレスを指しているか分からない状態で、
かなりマズい、というかCでは絶対に避けるべき状況になってる。

もうひとつ細かいネタ。同じく20行目(修正後21行目)の
printf("*p1=%s\n",p1); を
printf("*p1=[%s]\n",p1); に変えると、
「文字列の先頭/末尾の空白文字」がうっすら見えるようになるよ。

390:デフォルトの名無しさん
16/03/31 18:13:37.14 LEcDKdjY.net
>>377
何が問題だと言ってるの?
reallocを2回以上繰り返しても最後の結果だけ返せばいいでしょ。普通に作れば

391:デフォルトの名無しさん
16/03/31 20:17:50.26 X8/ytHGi.net
>>383
1回成功して1回失敗した場合に適切に作れない

392:デフォルトの名無しさん
16/03/31 21:06:05.74 ScXuRFRf.net
>>384
> 1回成功して1回失敗した場合に適切に作れない
お前個人の話?
なら納得するけど w
どこが難しいのかさっぱりわからん
まさかと思うが、戻り値は一つで両方失敗したことと片方だけ失敗したことを知りたいとかじゃないよな

393:デフォルトの名無しさん
16/03/31 21:13:55.35 X8/ytHGi.net
>>385
いやいや,1回 realloc() に成功すると,realloc() に渡したポインタは無効になる事実が問題なんだよ
realloc() 複数回を一つのサブ関数にまとめたとき,中途半端に成功した事実が呼び出し側で把握できなくなってしまう
呼び出し側で持っていたもともとのポインタがサブ関数で無効になってしまう
(サブ関数で有効な最後のポインタを返してくることにするのも,それはそれで扱いに困る)

394:デフォルトの名無しさん
16/03/31 21:21:26.04 ScXuRFRf.net
>>386
要件ちゃんと書いてくれ
なんか失敗したら元の領域保持しろとか realloc に無理難題押し付けて使えねー
って言ってるとしか思えん

395:デフォルトの名無しさん
16/03/31 21:30:08.92 X8/ytHGi.net
>>387
以下の仕様を満たす関数sub() を記述せよ
char *sub(char *p, int m)
p は malloc() で確保されたナル文字列の先頭へのポインタ
文字列 p の後ろに「2 から数えて m 番目の素数の十進法表現」を接続し,さらにもう一度後ろに p を接続した文字列の先頭を指すポインタを sub() は返す.
sub() の返り値は最終的に free() されることを前提にする.
結局 realloc() を使わないで実装することになる

396:370
16/03/31 21:51:26.90 82dYqFlv.net
>>382
レスありがとうございます。
20行と21行を変えると”表示”は上手くいきませんでした。
おしゃる通り”一回目ののp1”は問題あるので、
結局13行目に
*p1=NULL;
を付け加えました。

397:370
16/03/31 21:55:12.26 82dYqFlv.net
>>389 自己訂正です
*p1=NULL;→ p1=NULL;

398:デフォルトの名無しさん
16/03/31 22:12:46.70 CIggS/vG.net
>>388
なんか持論に合うように無理やりな仕様を持ち出しているような気がする

399:デフォルトの名無しさん
16/03/31 22:20:40.97 X8/ytHGi.net
>>391
そう感じさせるのは悪かった,そうだな,sub() は与えられた asciiz 文字列から新たな asciiz 文字列を作る下請け関数として考えてくれ
失敗したら一律に null を返す,でもいいかもしれないね

400:デフォルトの名無しさん
16/03/31 22:25:59.79 qF1fcJk9.net
すいません、教えてください。
以下Rubyスクリプトと等価なCコードを書こうとおもったらどう書けばいいですか。
特にfとgの型はどう宣言したらいいですか?
g=nil
f=lambda{
print "f";
return g
}
g=lambda{
print "g"
return f
}
a=f
10.times{a=a.call}

401:デフォルトの名無しさん
16/03/31 22:28:43.81 X8/ytHGi.net
>>393
スレリンク(tech板:690番)

402:デフォルトの名無しさん
16/03/31 22:36:47.05 Tq9AKUqv.net
>>388
p が指す文字列の長さはわかるから素数の 10 進表現の領域確保する時に一緒に確保すれば realloc 一回でいいだろ...
プログラミング能力無さすぎるだけじゃん w

403:デフォルトの名無しさん
16/03/31 22:53:29.30 X8/ytHGi.net
>>395
まあ realloc() を複数回実施するときの困難をお題にしたかったんだけどね
次々と 文字列へのポインタが姿をかえて関数�


404:墲スっていくような場合とかね 簡単な記述でrealloc() の問題を指摘できなかったのは残念



405:デフォルトの名無しさん
16/03/31 23:32:54.79 Tq9AKUqv.net
>>396
結局自分では何も困ってなくて、どこかの受け売りで realloc ガー
って騒いでたってオチかよ...

406:376
16/04/01 08:28:39.68 mYua7P08.net
昨日の ID:X8/ytHGi (レス数が多いのでリンクは略) の
「内部で複数回のrealloc()が必要な下請け関数」の議論は
詳しい説明でよく分かったよ。
下請けの途中で(どの段階でも)失敗したら、呼び出し前の状態が
そのまま残っていて欲しいってのは自然な要求だしね。
ただ、内部でのrealloc()が1回で済むように下請け関数を作る、
という対処もありうるよな。それが常に可能かはまた別の問題だけど。

407:デフォルトの名無しさん
16/04/01 10:41:33.52 cPCkQ397.net
論点ずらして突っ込むバカは無視していいよ

408:デフォルトの名無しさん
16/04/01 19:29:06.39 cIUJiKQr.net
>>398
> 下請けの途中で(どの段階でも)失敗したら、呼び出し前の状態が
> そのまま残っていて欲しいってのは自然な要求だしね。
呼び出し前の状態ってなんのことを言ってるのかによるけど、領域の内容の話なら残ってるだろ
>>386 は元々のポインタが無効になるのが問題とか言ってるけど、領域拡張するなら元の領域と違う場所に確保するしかないんだから、無理難題にしか見えない
new/delete ならうまく行って、realloc でダメな例を示してほしいよ

409:デフォルトの名無しさん
16/04/01 19:48:04.22 U/2PmOzZ.net
>>398
どちらにせよrealloc()の仕様を理解していればいいだけの話
これから自分が作ろうとする関数の実装に向かないと思うなら使わなければいいってだけじゃん
悪だとかrealloc() の問題って言っているのは仕様を理解せずに無理にrealloc()を使おうとするからだろ?
realloc() 自体は「メモリアドレスが変わってもいいから、要求されたサイズのメモリ領域を確保して欲しい」という要求には答えている
”元のメモリ領域拡張だけを試みる関数だったら”と言うのもあるが「拡張に失敗するなら元のサイズで良いや」ってのはあまりいないだろう
結局プログラマは、拡張に失敗したなら必要なサイズのメモリ領域を確保し、そこに元のデータをコピーして、古いメモリ領域は開放するだろ?
realloc()の仕様そのまんまじゃん
ならばrealloc()の仕様もまた 自然な要求 に答えただけだよ

410:デフォルトの名無しさん
16/04/02 21:11:02.16 R7MxdGwK.net
C言語の標準入力って結局のところ何がいいのさ

411:デフォルトの名無しさん
16/04/02 21:30:41.88 Tx7DR71P.net
標準入力の良さを語れと言っているの?
標準入力が複数あってどれを選べばいいか聞いてるの?
そもそも何を言っているの?

412:デフォルトの名無しさん
16/04/02 22:55:27.99 EwvTfYNw.net
getchar()とかscanf()とかの話でしょ

413:片山博文MZ ◆T6xkBnTXz7B0
16/04/02 23:07:16.64 k91t9LjX.net
scanfは試験に出るから覚えてるだけで、現実にはfgetsとsscanfをよく使うよ。
しかしfgetsには字数制限があるので、std::getlineに軍配が上がる。
getsはセキュリティ上使っちゃダメ。

414:デフォルトの名無しさん
16/04/03 06:38:51.26 g2YA8l0n.net
標準入力の便利なところはズバリ、
パイプで前段の出力を受け取れることなんだが、
GUIツールを作る人にはピンとこない話かもな。
昔なら「コマンドライン引数として対象ファイルが与えられていたら
そのファイルを処理し、与えられなかったら標準入力を処理する」
という動作をさせたものだが、今ではちょっと気の利いたツールでも
「コマンドライン引数で対象ファイルを指定されなかった場合は
GUIのウインドウを表示する」だよね。

415:デフォルトの名無しさん
16/04/03 08:54:06.50 iMLPYfGS.net
>>405
fgets の字数制限はループにして,はずせばいいよ

416:デフォルトの名無しさん
16/04/03 14:33:51.70 azZmmaKg.net
>>402
コンソールでキーボード入力しても
テキストファイルから読み込んでも
テキストを吐くツールからの出力でも
ネットワークごしに受信したデータでも
みんな同じ処理で取れるからだよ
今時はコマンドコンソールじゃなくてCGIの方がウケると思うけどな

417:デフォルトの名無しさん
16/04/03 15:05:13.67 1hzZ1h9p.net
やっぱり曖昧さを含む文章で質問すると駄目だね

418:デフォルトの名無しさん
16/04/05 02:38:42.14 yVKcFgqN.net
大抵のデバッガはある時点での関数呼び出しの履歴やその関数にどういった値が渡されたかを見ることができますが、このようなプログラムを作るのは難しいですか?

419:デフォルトの名無しさん
16/04/05 02:48:43.79 KWKZQVNf.net
c++で直接定義する関数とクラスメソッドの違いというか扱いの差ってなんですか?
オブジェクト言語から入ってるので直接定義する関数はオブジェクト志向でいうなんとかみたいな感じで説明してもらえるとありがたいです
クラスメソッドと直接定義する関数は普通に呼んだり呼ばれたりできるんでしょうか?

420:デフォルトの名無しさん
16/04/05 06:09:26.93 lqoS60o2.net
苦しんで覚えるC言語て本にscanfは禁止令が出てる会社学校があるとありますが
scanf関連は覚える必要が無いのでしょうか?
初学者の質問ですがお願いします^^;

421:デフォルトの名無しさん
16/04/05 06:29:12.49 zRkYu6zn.net
>>412
自分が完全に支配できるのなら、別に使っても良い
ユーザーの入力なんかの制御できないものには使わぬ方が良い

422:デフォルトの名無しさん
16/04/05 08:38:57.64 +yE88Sty.net
実際には出来る限り使わないようにするけど
scanfわかりません = C言語わかりません と同じ意味だよ
初心者が必ずハマる罠が待ってるし最後でいいから必ずおさえること

423:デフォルトの名無しさん
16/04/05 08:59:32.25 09gKpNs2.net
scanf使ったことないな
そもそもstdio自体ここ何年も使ってない

424:デフォルトの名無しさん
16/04/05 13:16:57.69 vmxwEzAv.net
初学者はscanfを避けるんじゃなく、理解した上で使わないことが重要

425:デフォルトの名無しさん
16/04/05 13:27:37.54 D/kBJTR9.net
>>410
そうしたプログラムを作るには
・より専門的な領域での知識とその領域に限定的な技術を習得する必要がある
・資料の絶対数が少ないうえに専門家向けの物が多い
といったあたりで普通のプログラムを作るときと比べれば難易度は高めといえるな

426:デフォルトの名無しさん
16/04/05 21:01:44.32 LI4Y2V/y.net
>>410
コンパイラーやコンパイルオプションによって渡し方が違ったりするので、きちんと作るのは大変
>>417 の言うようにドキュメントが入手できるとは限らんし
色々決め打ちでいいならなんとかなると思う
ただしアセンブラ使える程度の知識は必須

427:デフォルトの名無しさん
16/04/05 21:04:56.19 LI4Y2V/y.net
>>411
> オブジェクト言語から入ってる
世の中にオブジェクト指向言語がいくつあると思ってるんだよ

428:デフォルトの名無しさん
16/04/05 21:30:56.01 Kw+zELRm.net
>>419
レスありがとうございます。
言語特定した方が説明しやすいのでしょうか?
正確にはas3から学習始めたのですが少しマイナーかなと……
androidJava、objective-cならある程度わかるのでその辺りで説明していただけるとありがたいです。

429:デフォルトの名無しさん
16/04/05 22:59:54.69 +yE88Sty.net
>>410
>クラスメソッドと直接定義する関数は普通に呼んだり呼ばれたり
出来る
C++では非メンバ関数と呼ぶ
といっても大した違いはない
元々Cにクラスを後付して作られた言語だから
古いライブラリはクラスを使ってない
クラス主体がいいならそうすればいい
あえて違いを挙げるならクラスメンバ関数はわずかに遅くなるから
その辺がどうしても許せなければクラスを避けるということもあるけど

430:デフォルトの名無しさん
16/04/06 00:43:46.87 Py7RTr3F.net
Linux上での名前解決のAPI、getaddrinfo()について
質問があります。
関数の形は以下です。
int getaddrinfo( const char *node,const char *service,
const struct addrinfo *hints,struct addrinfo **res)
最後の引数,"struct addrinfo **res"がどうして、
ダブルポンタにしなくてはならないのか、分かりません。
どなたか、簡単に教えてくださらないでしょうか?

431:デフォルトの名無しさん
16/04/06 00:56:07.64 7pIXqQc2.net
質問です。
class Data{int a;int b;int c;
};
std::vector<Data>v;
Data d ={1,2,3};
v.push_back(d);
って感じでvectorにクラスとか構造体をpush_backした時って
要素を全部コピーして新しくメモリにデータを作っているんですか?
だとすると、
Data d;
for(int n=0;n<10;n++)v.push_back(d);
みたいに書いた場合、vのどの要素も同じポインタを示してるんじゃなくて、
push_backする度に別のメモリにデータを作ってるんですか? お願いします。

432:デフォルトの名無しさん
16/04/06 01:08:17.22 74XNtOnL.net
>>422
関数内でメモリを動的に確保してそのポインタを(*res)に代入して返すから

433:デフォルトの名無しさん
16/04/06 01:11:44.36 74XNtOnL.net
>>423
> push_backする度に別のメモリにデータを作ってるんですか?
その通り

434:デフォルトの名無しさん
16/04/06 01:13:31.72 7pIXqQc2.net
>>425
ありがとうございました。これで生きていけます。

435:デフォルトの名無しさん
16/04/06 17:30:37.94 9PDK4V7Z.net
素人ながら将棋ソフト(Apery URLリンク(github.com))のソースコードを読めるようになりたいと思っています
しかし、C++の入門書を読んでから眺めてみても、実物のソースコードは一行に複雑な処理が押し込まれており、何をしているのかなかなか読めません
恐らく一般的な開発手法が身についていないと読むことは到底出来ないのだろうと推測していますが、なにか良い演習教材などがあれば教えて下さい
また、次の理由が理解を遅らせているような気がします
これらの点を個別に身につける方法があれば教えて下さい
・自分が一般的な開発手法が身についていないこと
・ヘッダファイルの中身が入門書レベルでは意味不明なことと
・動かしながら挙動を調べたくてもステップ実行の方法がわからないたこと
よろしくお願いします

436:デフォルトの名無しさん
16/04/06 17:51:42.30 JMybFTpe.net
>>427
すべてわかる必要なし
標準関数、STLですらわかってないのが大半だろ。
たぶん

437:デフォルトの名無しさん
16/04/06 17:54:46.80 /IBevvIO.net
>>427
まず大まかな流れだけ追う
後は1つ1つ気になった所だけ見ていくでいいよ

438:デフォルトの名無しさん
16/04/06 18:09:07.31 goAIGnqr.net
見たいのは手の評価の部分だろうから score で検索して
周辺を見ていくのがいいんじゃないかな
コメントや関数名などを見て必要なさそうな所はバンバン切り捨ててよし

439:デフォルトの名無しさん
16/04/06 19:45:01.60 qohl0JPc.net
>>427
う~ん、将棋ソフトのアルゴリズムに詳しいの?
ならいいけど、そうでないならもっと簡単な奴から始めた方がいいんじゃね?
例えばリバーシ
URLリンク(www.geocities.co.jp)

440:デフォルトの名無しさん
16/04/06 20:43:52.53 l0k4MgTU.net
ざっとしか見てないけどそこまで突飛なコードはないように見える
あとこういうボードゲームはある程度同じようなコードになりやすいからそれに慣れてないだけじゃないか
moveとかposとかもろでしょ

441:デフォルトの名無しさん
16/04/06 20:53:28.86 +DLeHnYt.net
>>427
対戦型のボードゲームのAIアルゴリズムに関する基礎知識があると良いのでは。
オライリーのアルゴリズム クイックリファレンスという本に、ゲーム木のアルゴリズムがいくつか説明されているよ。
ミニマックス法、negmax法、アルファベータ法とか。
ゲーム木以外にも、ソートや最短経路探索とか、いろいろ扱っていて、参考になると思うよ。

442:デフォルトの名無しさん
16/04/06 21:15:57.98 H8hE7WlY.net
コリコリにチューニングされたコードを部外者が読むのは相当しんどいと思うんだが。
長い年月をかけてぐちゃぐちゃになってそう。見てないけど。

443:422
16/04/07 23:15:19.36 Xs8CGXEi.net
>>424
レスありがとうございます。ただ、まだ理解できていません;;
本体のソースは以下の通りです。
URLリンク(lifeloveregret.googlecode.com)
解説図によるとリストを作成し
**resのダブルポインタによって
*res→構造体1→構造体2……
となるようですが、
*resのシングルポインタで
res→構造体1→構造体2……
とはできないのでしょうか?
どなたでもよろしいのでおしえてくださらないでしょうか?

444:デフォルトの名無しさん
16/04/08 00:21:41.46 92gpEbvG.net
>>435
深く考えるな
「作成した文字配列」を返す関数を作ってみろ
ただし return によってそのアドレスを返してはダメだ
これができればおのずと理解できる
ヒントは
「おばあちゃんの家に箱を持っていくとりんごを入れてくれます」 ・・・シングルポインタ
「おばあちゃんの家に行くと箱に入ったりんごをくれます」 ・・・ダブルポインタ
変数というのは何かを入れる箱だと教わった記憶はあるかな?
普通に引数に変数を指定しても「箱」が変わってしまうために、関数で中身を変えても元の箱の中身が変わることは無い
じゃあ箱を用意してその箱を引数に渡そうってのがシングルポインタ
では箱も相手が用意する場合、その箱ごと貰うためにはどうしたらいいか?
箱を入れる箱を用意して、そこに箱ごと入れてもらおうってのがダブルポインタ
typedef を知っているなら「りんごを入れる箱」を定義して、それを入れる箱という意味でシングルポインタとして扱っても良い

445:デフォルトの名無しさん
16/04/08 00:48:39.10 DBhuX0XJ.net
#if LOGOUT
logout("hoge");
#endif
とするといちいち#ifをかかなければいけなくてきたなくなるんですが
なにかかっこいいほうほうありますか?
void logout(const char* str)
{
#if LOGOUT
//なにがし
#endif
}
だと
logout("hoge");の度に無駄に
引数をスタックにpushして
リターンアドレスもpushして
callして・・・
と無駄ですよね

446:デフォルトの名無しさん
16/04/08 01:05:23.41 92gpEbvG.net
>>435
ダブルポインタは「配列を受け取る箱のアドレスを示している」ってのを理解できれば

447:デフォルトの名無しさん
16/04/08 01:57:31.43 DnxxMOIr.net
>>437
最適化で消えるから気にしないってのが一番スマートかと

448:デフォルトの名無しさん
16/04/08 02:14:39.63 LFrj8SRS.net
>>437
元のLOGOUTとlogoutの使い方がよくわからんがな
void logout_impl(const char* str) {...}
#if LOGOUT
#define logout(s) logout_impl(s)
#else
#define logout(s) /*empty*/
#endif

449:デフォルトの名無しさん
16/04/08 02:36:19.83 LFrj8SRS.net
>>435
> *resのシングルポインタで
> res→構造体1→構造体2……
>
> とはできないのでしょうか?
機能的にはそれでもいいんだけどな
でもそれだとリストの最初の要素を使うときには
res.ai_addr
二つめ以降の要素を使うときには
p->ai_addr
と.と->を使い分けるほうが面倒くさくても自然なやり方になってしまう
だったらresもポインタにして
res->ai_addr, p->ai_addr
として自然に一貫したやり方で扱える方がいいだろ
他にもポインタでなく値で返すと
後で解放用の関数に渡してメンバの解放をする必要があることを忘れてしまう
とかの理由もあってそういう設計になっている

450:デフォルトの名無しさん
16/04/08 02:49:08.36 DBhuX0XJ.net
>>440
引数が可変なんですが

451:デフォルトの名無しさん
16/04/08 03:43:08.71 DnxxMOIr.net
>>442
可変長でもマクロにできるよ、古いと対応してないかもしれんが
#define logout(...) logout_imple(__VA_ARGS__)

452:422
16/04/08 18:24:00.80 E6f7kqrG.net
>>436 >>441
レスありがとうございました。
ようやくわかりました!
とくに441さんの説明でわかりました。
恥ずかしい話ですが、理解するまで2日ぐらいかかりました;;
英語のサイトも検索してみました。
C言語とUNIXのAPIは、それなりに難しいのだと痛感して
おります。当たり前でしょうが、
通信プログラムはJavaの方がもっと単純だった記憶があります。

453:デフォルトの名無しさん
16/04/09 14:43:14.34 zLInGFTB.net
構造体のアラインメントについて、結果がすべて256になるよう以下のコードを書いたのですが意図した通りにはいきません。
またideoneとVisual Studio 2015とで異なる結果が得られます。
alignasやaligned_storageを意図通りに(256になるように)働かせるにはどこを直せばよいですか。
URLリンク(ideone.com)
size=4, align=4.
size=4, align=4.
size=4, align=4.
size=256, align=256.
Visual Studio の出力(Win32/x64どちらも同じ)
size=256, align=256.
size=256, align=8.
size=256, align=8.
size=256, align=8.

454:デフォルトの名無しさん
16/04/09 17:33:12.67 zLInGFTB.net
ためしにアラインメントを違う値(64)にしたところideoneの出力はすべて64になりました。
たんに256の値が扱う範囲を超えていたということでしょうか。
ただvisual studioのalign=8は変わらずなので、そっちの理由はわからないままです。

455:デフォルトの名無しさん
16/04/09 17:48:32.72 4XKJWWPC.net
手持ちのgcc 4.8.4じゃalignas(256)は
warning: requested alignment 256 is larger than 128 [-Wattributes]
になるけどな
gcc 5.1じゃwarningも出さないでalignasを無視するのか?変だね

456:デフォルトの名無しさん
16/04/09 18:02:12.81 2iWpFKOA.net
どう見てもパディング関連だろ

457:デフォルトの名無しさん
16/04/09 18:37:23.72 zLInGFTB.net
gccについては使ったことがないのでバージョンごとの違いについてもどうこう言えませんが、
パディング関連とはどういうことでしょうか。もう少し詳しく聞きたいです。

458:デフォルトの名無しさん
16/04/09 19:03:37.37 4XKJWWPC.net
>>449
>>445のideoneのはgcc 5.1だよ

459:デフォルトの名無しさん
16/04/09 19:56:34.24 6R5fzUhl.net
まーだダブルポイタとか言ってる子がいるのか
だれがどこで広めてんだダブルポインタって

460:デフォルトの名無しさん
16/04/09 21:37:21.06 8imgO17J.net
だめなん?

461:片山博文MZ ◆T6xkBnTXz7B0
16/04/09 21:41:12.26 1rUso06b.net
double*と紛らわしいのでダメ。二重ポインタならOK。

462:デフォルトの名無しさん
16/04/09 21:41:12.75 7CkGchmN.net
>>445
構造体のアラインメントは処理系依存なので
同じにしたければパディング部分をダミーのメンバで満たす必要がある

463:デフォルトの名無しさん
16/04/09 21:52:03.38 l8xjVqJC.net
構造体にはalignasが利かないと言っているのか?

464:デフォルトの名無しさん
16/04/09 21:53:15.24 8imgO17J.net
>>453
ああ、言われてみれば確かに

465:デフォルトの名無しさん
16/04/09 21:58:00.60 608RlWes.net
ダブルポイタwww

466:デフォルトの名無しさん
16/04/09 23:23:17.65 6PFUIp35.net
前にもポインタへのポインタのことをダブルポインタって言ってるのがいたな
書いてる人は一般的に通じると思ってるようだけど、何かで使われてる用語なんだろうか

467:デフォルトの名無しさん
16/04/09 23:29:30.54 8imgO17J.net
良いか悪いかは別として、それなりに普及してる語ではあるんじゃないかな
自分も何年も前に聞いたし

どうでもいいけどビット演算に寄るフラグ管理で
foo |= flag; とかfoo &= ~flag; とかやると思うんだけど
なんか使うたびに数秒くらい悩んでしまう。
なんか良い方法ないかな

468:デフォルトの名無しさん
16/04/09 23:35:54.23 5KKi1NYz.net
一旦使われだすと意地でも使う層があるからな
アップキャスト・ダウンキャストとかいう
出典も不明でどこにも定義されてない用語も日本じゃ出回ってる
ウィキペにも乗ってる「型変換」のページに乗ってる(誰が書いてんだあれ)
一方英語のType conversionページには
「In object-oriented programming languages, objects can also
be downcast : a reference of a base class is cast to one of its derived classes.」
とだけ載ってる

469:デフォルトの名無しさん
16/04/10 00:07:34.13 zgMwjdkU.net
>>459
std::bitsetで間に合わないのならtemplateで自前のset/reset/test 関数作っておく。

470:デフォルトの名無しさん
16/04/10 00:31:52.56 F8NTR01v.net
>>451
double pointer でなくて、dual pointerならば
二重のポインタという意味でいいのではないでしょうか。

471:デフォルトの名無しさん
16/04/10 00:37:32.74 R2GJbW+a.net
>>461
std::bitsetか、完全に忘れてたわ。
あとで調べてみよう

472:デフォルトの名無しさん
16/04/10 00:45:38.44 lctucWPJ.net
>>462
dualでもニュアンスに違和感を感じる。
同じオブジェクトを指すポインタが2つある感じ。

473:デフォルトの名無しさん
16/04/10 00:47:53.63 lctucWPJ.net
>>460
流れに乗れない層もどうかと思うぞ。

474:デフォルトの名無しさん
16/04/10 01:05:35.34 cxqu8O/1.net
たんなるポインタへのポインタを特別視して
名前をつけようってのが意味不明で不可解
ひょっとして*と**を別物として認識してんじゃないかって不安になる

475:デフォルトの名無しさん
16/04/10 01:29:31.17 R2GJbW+a.net
int型のポインタのポインタのポインタ、とかまで行くと
流石に言い難いと思うの

476:デフォルトの名無しさん
16/04/10 03:00:57.81 ZAuVeIVa.net
…実は心の中ではptrをぷとらと読んでます

477:デフォルトの名無しさん
16/04/10 08:55:55.24 d/pLUTb8.net
>>460
意地でもウィキペって使うんだな

478:デフォルトの名無しさん
16/04/10 20:20:27.62 a4MI7w0Y.net
「アップキャスト」「ダウンキャスト」って初めて聞いたけど、いかにも和製英語っぽい響きだな

479:デフォルトの名無しさん
16/04/10 20:22:07.80 R2GJbW+a.net
一応、英語っぽいけどね

480:デフォルトの名無しさん
16/04/10 20:35:43.88 8kVuH12a.net
アップキャスト/ダウンキャストは英語圏でもC++の文脈で普通に使われてるから
「用語としておかしい!」とか言い出す困ったちゃんは見たことないなあ
URLリンク(stackoverflow.com)

481:デフォルトの名無しさん
16/04/10 21:44:18.80 engRimKH.net
>>468
そんな奴いない

482:デフォルトの名無しさん
16/04/10 21:59:03.78 Msqh6OQ2.net
falseの読みをいつも忘れてゴモゴモ言って誤魔化してる
…フォルスだよね?
>>472
少なくとも日本語圏では間違いじゃないよね?
和製英語だろうとなんだろうと説明するのに無いと困るわー
特に今は新人教育(入門編)の時期だし

483:デフォルトの名無しさん
16/04/10 22:13:09.08 FNu9TvqZ.net
キャストって明示的な型変換のことでしょ?
アップキャストって
base b = (base)d;
こんな狂ったことすんの?
それとも
base b = d;
この単なる暗黙の型変換のことを「キャスト」とか言い出しちゃうの?

484:デフォルトの名無しさん
16/04/10 22:24:31.71 4zsRISHG.net
そこじゃないだろ

485:デフォルトの名無しさん
16/04/10 22:26:59.47 7Ok+rt99.net
よくわかってないのに一家言もつ人w

486:デフォルトの名無しさん
16/04/10 23:17:10.70 M23QAKIs.net
教科書みたいなコピーコンストラクタの例だな

487:475
16/04/10 23:33:46.85 FNu9TvqZ.net
base *b = (base *)d;
(´・ω・`)最初からこう書いとくべきだったね
書かなきゃ分からん人もいるからね

488:デフォルトの名無しさん
16/04/10 23:50:56.21 Msqh6OQ2.net
>>475
広義の"キャスト"は型変換のことで、
狭義の"キャスト"はキャスト演算子を使った明示的なキャストのこと…あたりかな
英語だとtype castingだからキャストは変換が正しいのかな…
型キャストみたいな言い方もするよね

489:デフォルトの名無しさん
16/04/11 00:40:37.29 i7Hb58ma.net
>>480
広義のとか英語と言われてしまうと不勉強でついていけないけど
狭義のものについていくつか例をあげとく
URLリンク(en.wikipedia.org)
Type conversion
 1 C-like languages
  1.1 Implicit type conversion
  1.2 Explicit type conversion
↑暗黙的・明示的で型変換を分類
In the C family of languages and ALGOL 68, the word cast typically
refers to an explicit type conversion (as opposed to an implicit conversion)
↑さらにこのようにも書かれている
URLリンク(en.wikibooks.org)
C++ Programming
 1 Type Conversion
  1.1 Automatic type conversion
  1.2 Explicit type conversion (casting)
↑自動的・明示的で型変換を分類し、後者をキャストとしている
まぁ参考程度に

490:デフォルトの名無しさん
16/04/11 07:02:43.57 OGyFwqGU.net
>>479
> 書かなきゃ分からん人もいるからね
恥ずかしい奴 w

491:デフォルトの名無しさん
16/04/11 08:01:18.44 rDPJ5tk/.net
>>482
型がbaseなんだから基底クラス派生クラスのポインタってわかったけど・・・

492:デフォルトの名無しさん
16/04/11 08:38:23.10 OGyFwqGU.net
>>483
何を勘違いしてるのか知らんけど
恥ずかしい奴と指摘してる対象は
* をつけ忘れた自分のミスを
> 書かなきゃ分からん人もいるからね
と他人に転嫁しようとしてるアホだぞ w

493:デフォルトの名無しさん
16/04/11 13:25:27.20 8x/NJSRd.net
いやもともと*をつけ忘れたわけじゃないだろ
明示と暗黙の話のようだし

494:デフォルトの名無しさん
16/04/11 19:22:52.69 bDNN4W3Y.net
脱線してるしどうでもいい
どうしてそこまで他人を煽りたがるのか

495:デフォルトの名無しさん
16/04/11 20:39:34.48 lMeZFfb2.net
>>485
だったらそのまま押し通せばいい
>>478 で指摘されて、よくある例にした
って言えばいいだけなのに
> 書かなきゃ分からん人もいるからね
なんて書くからアホって言われる

496:デフォルトの名無しさん
16/04/12 00:08:32.94 8Bg9MMbi.net
base だから派生クラスに対して基底クラスを示しているってのはわかるけど
クラス名を base って書くとそれはポインタの話だってのは暗黙的なことなの?

497:デフォルトの名無しさん
16/04/12 03:01:00.43 0BB0Fz9I.net
まぁぶっちゃけ>>475は最初と最後の2行で話が通じるんで
途中が間違っててもそんなに気にならない

498:デフォルトの名無しさん
16/04/12 06:15:23.10 8wQ28NJb.net
基底クラスへのキャストが狂ったことだと?

499:デフォルトの名無しさん
16/04/12 06:50:47.79 PgTedsFg.net
>>489
最初の行から間違ってるだがw

500:デフォルトの名無しさん
16/04/12 08:54:20.94 xYAotuK9.net
>>488
ポインタのケースが圧倒的に大多数なので、C++ やってる奴なら暗黙的にポインタの話だと理解する
俺なんてポインタの話だと思い込んでスルーしてたぐらいだし

501:デフォルトの名無しさん
16/04/12 09:11:17.93 a9FJA+OX.net
C++だとこの場合はポインタでも参照でもいいんだから
その片方だけを書いてしまうよりは
単に擬似コードとして(base)と書いてんので十分
それ見てコピーコンストラクタだと言い出しちゃう奴が
マジなのかネタなのか分からないが

502:デフォルトの名無しさん
16/04/12 09:56:14.68 Lr8RZIpa.net
メモリポインタの話ならまかせとけ

503:デフォルトの名無しさん
16/04/12 11:20:00.23 szNkUUWQ.net
C++を学びたくてお勧めの書籍を聞いたんですが、オブジェクト指向について理解してなかったら
何の入門書を買っても理解出来ないよって言われてスッキリ分かるjava入門って本をお勧めされたんですが
javaの入門を読んだらC++の理解が簡単になるのでしょうか?javaは特に学ぶ予定は無かったので意味ないなら
C++の入門書を探し続けようと思ってるんですが・・・
因みにプログラミング学習経験は苦しんで覚えるC言語を読んだくらいしかないです

504:デフォルトの名無しさん
16/04/12 11:48:09.28 bUQxXLucO
読んでおいて損はないと思うよ。
Javaのオブジェクト指向はかなり正統派で文法もシンプルなので、
Javaが理解できれば他のオブジェクト指向にも応用できる。

暇も時間も無いならC++の入門書を探したほうが絶対いいけどね。
オブジェクト指向をきちんと解説してるC++の入門書を探すのが一番近道。

505:デフォルトの名無しさん
16/04/12 11:48:56.75 r3xSDNTE.net
>>493
疑似コード w

506:デフォルトの名無しさん
16/04/12 12:11:41.05 JEO3UzSv.net
>>495
自分もまだまだ勉強中だけど、それくらいの段階ならまだCをやった方がいいと思う
Cで作りたいものを5,6個つくるか、作るものが思いつかなければテトリスなどの簡単なゲームを作ったり、
paizaみたいなプログラミングのお題を出してるサイトのをこなすかすればいい。
C++はCをそれなりにやってからいかないとC由来のものとC++がごちゃごちゃになって自分はかなり後悔した
ある程度やってないと、オブジェクト指向の有用性も実感できないだろうし、有用性がわからないものを学ぼうとして理解できない

507:デフォルトの名無しさん
16/04/12 12:55:35.65 szNkUUWQ.net
>>498
ありがとうございます
C++をやりたいならまずはC言語でプログラムの書き方に慣れるといいみたいなこと言われて
C言語の入門書を読み終えたんですけど、ただその時にC言語の癖がついてC++分かりにくくなるみたいなこと言われたんで
早めにC言語は切り上げようと思ってたんですが続けてたほうがいいんですか?
テトリスとか何か簡単なツール作ってみたいのですがオブジェクト指向がなんなのかもまだ分かってないです…

508:デフォルトの名無しさん
16/04/12 13:01:18.82 qMEcfkxr.net
>>495
C++はマルチパラダイム言語って呼び方が適切だと思う
人によって重きを置くとこが違うから、見方も様々なので意見は適当に判断するしかない
オブジェクト指向も昔は仮想関数でポインタがどう使われてるかみたいなことが必須知識だったけど
今は上流な話に終始するのが多いんじゃないかな。知らんけど

509:デフォルトの名無しさん
16/04/12 13:18:24.37 OovY3q37.net


510:="_blank">>>499 テトリスとか簡単なツールとかはCでも作れるから、とりあえずCを続けたらいいんじゃないかな 数年単位で勉強しない限り癖がつくとか気にしなくていいよ



511:デフォルトの名無しさん
16/04/12 14:10:55.99 8gkQd1h0.net
>>499
オブジェクト指向と考えずにまずはやってみたらいいのでは

512:めんどいから@sc
16/04/12 14:40:15.66 mxVZY7duX
ある言語を覚えたいのならばその言語で、その言語のパーサを作ってみるのがよいと思う

513:デフォルトの名無しさん
16/04/12 14:36:45.80 Tzgq3WhP.net
>>499
自分がCで作ったプログラムをC++に移植すb驍フも勉強になb驍
けど麹ナ初からC++でやってればよかったと後悔する可能性もある

514:デフォルトの名無しさん
16/04/12 15:20:46.30 szNkUUWQ.net
ありがとうございます。
柴田望洋の本でも読んでもう少しC言語の知識付けてから考え直したいと思います
苦しんで覚えるC言語もどこまで役にやってるのか分からなくなってきたので…

515:デフォルトの名無しさん
16/04/12 19:10:29.64 wt6IaLl7.net
>>504
移植する必要がない、わざわざ遅くなるように改悪しなくても

516:デフォルトの名無しさん
16/04/12 20:59:55.89 bUQxXLucO
C++って同じコンパイラでもCより早くなるんじゃなかったけ?

517:デフォルトの名無しさん
16/04/12 20:55:59.68 U1PsFxiF.net
C++に移植すると遅くなるって都市伝説じゃないの?

518:デフォルトの名無しさん
16/04/12 22:05:54.73 PiwdcttH.net
クラス使わなければそんなに変わらない

519:デフォルトの名無しさん
16/04/12 22:42:56.39 U1PsFxiF.net
クラス使うと遅くなるって都市伝説じゃないの?
仮想関数使ったなら遅くなるかもだが。

520:デフォルトの名無しさん
16/04/12 22:58:54.88 /GVd1Dbl.net
都市伝説

521:デフォルトの名無しさん
16/04/13 01:30:09.24 L8ByxKIA.net
TMPって必要ありますか?

522:デフォルトの名無しさん
16/04/13 01:37:55.11 jupLzAcR.net
>>506
そんなに差がでるとは思えんが、もし遅くなったら
勉強がてら高速化すればいい

523:デフォルトの名無しさん
16/04/13 01:45:40.72 n3tzn5Jx.net
>>512
自分で必要だと確信できないなら自分で使う必要はないよ

524:デフォルトの名無しさん
16/04/13 08:32:49.65 HJBXPL0B.net
>>506
必要云々ではなく勉強の話してるの
わかる?

525:デフォルトの名無しさん
16/04/13 09:04:37.87 tPE+Hf8q.net
>>510
コンストラクタとデストラクタ走らせなければそんなに変わらないかな

526:デフォルトの名無しさん
16/04/13 22:06:38.04 FRGxTn1f.net
Cでも結局、コンストラクタに準ずる初期化とデストラクタに準ずる後処理は必要だろ。
Cなら速くなるというのは都市伝説。

527:デフォルトの名無しさん
16/04/13 22:49:50.96 OjSMixzY.net
C++を使うと遅くなるか、に関しては、古いがプログラミング作法に書いてある。
例えば、C++のSTLを使ったプログラミングをすると、STLで実装されている
処理を、ユーザーが最適化できない。汎用的に書かれているから。
一方、Cではそれができるから、速くなるみたいなことが書かれていた気がする。

528:デフォルトの名無しさん
16/04/13 22:50:20.80 OjSMixzY.net
まあ古い本だから、今がどうなのかは知らないけど。

529:デフォルトの名無しさん
16/04/13 22:51:25.47 OjSMixzY.net
変だな。
「汎用的に書かれているから。」 は消していいよ。

530:デフォルトの名無しさん
16/04/13 22:58:38.36 ctQ6cU5c.net
クラスを使うと遅くなるってのはRTTIとか型チェックの処理が入ったり
不必要にコピーが発生したりってことで無駄な処理が増えることを言っているでしょ
考えもなしに書いたコードが原因で本来不要な処理が増える
要はプログラマーの実装の問題ってこと

531:デフォルトの名無しさん
16/04/13 23:04:07.34 emBYrQ1B.net
結局のところ、「理論上は遅くなるよね」くらいに思っておけばいいの?

532:デフォルトの名無しさん
16/04/13 23:08:08.58 FRGxTn1f.net
Cで書くよりアセンブラで書いたほうが速い。
というのと同じくらいナンセンス。

533:デフォルトの名無しさん
16/04/13 23:21:13.51 rl8lucUp.net
better Cならメリットの方が圧倒的だと思うけどなー

534:デフォルトの名無しさん
16/04/13 23:31:46.34 COroZlU5.net
>>518
なんか変な話。
STLと同じ処理をCで書いて速くできるなら、C++でも同じことができないわけないと思うが。

535:デフォルトの名無しさん
16/04/14 00:03:57.72 W0ESW1og.net
>>525
確か本は、STLを使う前提でかかれてたよ。
STL使わずにデータ構造を自作すれば、同じだね。

536:デフォルトの名無しさん
16/04/14 00:05:34.96 W0ESW1og.net
速度と引き換えに、STLの利便性が得られる って確か書いてあった気がする。

537:デフォルトの名無しさん
16/04/14 00:40:27.41 GRJi8ey4.net
>>525
他人の書いた汎用的なコードだから無駄が増えるってだけだよ
もちろん自作したものが必ずしもそれより早いとは限らないがw
メモリの確保、データのコピーにエラーチェックと処理
実行するに当たっては必要になる処理だが、本来の処理ではなく付随的な処理でしかない
これらが頻繁に起きればその分速度は遅くなる

538:デフォルトの名無しさん
16/04/14 02:31:50.13 Wu1ZUttN.net
x86ってえっくすはちろくって読んだら笑われたけど、なんて読むのが正解なんですか?

539:デフォルトの名無しさん
16/04/14 07:25:37.14 kbXO


540:Ix/G.net



541:デフォルトの名無しさん
16/04/14 08:14:20.00 Y6Qtie59.net
その笑った当人に聞くべきだったね。
「えっくすはちろく」で意味は通るだろうし
俺は可笑しいと感じないけど、俺は権威筋じゃないから。

542:デフォルトの名無しさん
16/04/14 08:24:42.63 OKKc+//x.net
>>528
それをCとC++の比較に持ち出すのが変なんだろう。同じ条件で比較してないし。

543:デフォルトの名無しさん
16/04/14 08:39:54.10 G2rZAyMq.net
違う言語なんだからそれぞれ得手不得手があるのに、局所的な比較だけするからおかしくなる。
例えば仮想関数呼び出しにしても、それ自体は余分な時間がかかるけど、呼び出し側の分岐が不要になって時間が稼げて、総合的に相殺以上のメリットになる。
ただし実際にはこんなこと以上に記述性が上がって人間の時間が稼げて、最適化したり規模とかを上げれる方がよっぽど良い。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch