2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

スレを勃てるまでもないC/C++の質問はここで 23

1 :デフォルトの名無しさん:2015/01/04(日) 22:51:08.99 ID:BvikwYSt.net
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
01 http://pc11.2ch.net/test/read.cgi/tech/1167476845/
02 http://pc11.2ch.net/test/read.cgi/tech/1178503366/
03 http://pc11.2ch.net/test/read.cgi/tech/1187521676/
04 http://pc11.2ch.net/test/read.cgi/tech/1221633708/
05 http://pc11.2ch.net/test/read.cgi/tech/1230516307/
06 http://pc11.2ch.net/test/read.cgi/tech/1231564903/
07 http://pc11.2ch.net/test/read.cgi/tech/1232983248/
08 http://pc12.2ch.net/test/read.cgi/tech/1235921779/
09 http://pc12.2ch.net/test/read.cgi/tech/1240022781/
10 http://pc12.2ch.net/test/read.cgi/tech/1242300936/
11 http://pc12.2ch.net/test/read.cgi/tech/1245059383/
12 http://pc12.2ch.net/test/read.cgi/tech/1248010352/
13 http://pc12.2ch.net/test/read.cgi/tech/1260842197/
14 http://pc12.2ch.net/test/read.cgi/tech/1269273471/
15 http://pc12.2ch.net/test/read.cgi/tech/1273368706/
16 http://hibari.2ch.net/test/read.cgi/tech/1279285647/
17 http://hibari.2ch.net/test/read.cgi/tech/1285115590/
18 http://hibari.2ch.net/test/read.cgi/tech/1291571263/
19 http://hibari.2ch.net/test/read.cgi/tech/1308106024/
20 http://toro.2ch.net/test/read.cgi/tech/1316013463/
21 http://toro.2ch.net/test/read.cgi/tech/1342285511/
22 http://peace.2ch.net/test/read.cgi/tech/1399911167/

2 :デフォルトの名無しさん:2015/01/04(日) 23:21:56.13 ID:AZoVKcHR.net
前スレ999さんありがとうございました。

3 :デフォルトの名無しさん:2015/01/06(火) 20:38:52.39 ID:hpet63Tg.net
1乙です

質問宜しいでしょうか?
Linux用で変数が変化するまで待機するプログラムはsyscall、SYS_futexで出来ますでしょうか?
出来るならどのように書けば良いのか教えてください

4 :デフォルトの名無しさん:2015/01/07(水) 01:03:17.52 ID:9/4UCKaT.net
みんな構造体の宣言とかって毎回ググってる?
manとかで見れると便利だなあって思ったんだけどコマンドなんかない?

5 :デフォルトの名無しさん:2015/01/07(水) 01:20:06.74 ID:IbCBqkxU.net
manよりも、infoの方が情報が新しいらしい

6 :デフォルトの名無しさん:2015/01/07(水) 10:33:44.42 ID:Jika4sDC.net
VS2013で cout があいまいですというメッセージが出ます。
ビルドや実行は出来るのですが、何が原因でしょうか?

7 :デフォルトの名無しさん:2015/01/07(水) 17:50:37.22 ID:DIYY1wPV.net
ERROR: 質問があいまいです

8 :デフォルトの名無しさん:2015/01/07(水) 20:27:25.12 ID:ArlGb+1Q.net
>>4
何を検索しているんだ?

9 :デフォルトの名無しさん:2015/01/08(木) 15:17:38.02 ID:eBsSYFBf8
99の表を表示する関数maku_kukuを作成。引数としてnをうけとりnの倍率は表示しない
このプログラムをよければおしえてください

10 :デフォルトの名無しさん:2015/01/12(月) 04:40:49.46 ID:Pgt9wbS9.net
メモリの動的確保について質問です
たとえばCではmallocで確保した変数をfreeで
解放しないといけないのは理解できます
ですが二重解放をしてはいけないというのが理解できません
理解というよりはどういう仕組みになっているか気になります
なぜ解放してあるかをチェックしないのでしょうか

11 :デフォルトの名無しさん:2015/01/12(月) 07:42:35.80 ID:0gHWSTX6.net
>>10
後でそのメモリ空間が再びmallocされたら、それを誤ってfreeすることになる。

12 :デフォルトの名無しさん:2015/01/12(月) 08:29:34.28 ID:JDGRgzhV.net
p = malloc();
・・・
free(p)
free(p)
の事だろ二重解放って

13 :9:2015/01/12(月) 10:34:49.47 ID:Pgt9wbS9.net
freeを2回以上した場合、内部的にどういう状態になるのか気になります
処理系によるとは思いますが、一般的な環境(Unix系、Windows等)ではどうなるのでしょうか

14 :デフォルトの名無しさん:2015/01/12(月) 11:16:54.23 ID:plV1fcgm.net
無効か別に利用されてるアドレスの開放になってどうなるかは未定義なんだろ。

15 :デフォルトの名無しさん:2015/01/12(月) 12:02:21.69 ID:dz9wpGuy.net
>>13
たとえばヒープ領域とかヒープメモリで検索するといろいろと出てくるよ
http://www.atmarkit.co.jp/ait/articles/1408/28/news010.html など

余談だけど、むかしfjのC言語グループで
プログラムが終了する際にmallocした領域をイチイチfreeする奴は馬鹿だ、という情報工学の先生がいたなー
こんなセンセーに教育された学生はうちの会社にはいらないw

16 :デフォルトの名無しさん:2015/01/12(月) 12:32:51.93 ID:plV1fcgm.net
>>15
そんな高級なことでなく、C/C++の規定で無効なアドレスに対する動作が決められてないだけだろ。

17 :デフォルトの名無しさん:2015/01/12(月) 12:39:09.45 ID:plV1fcgm.net
存在しないファイルをオープンしたとき、Cはエラーメッセージを出してくれない状況と同様かと。
コンパイラは「ファイルが存在しません」「メモリはすでに開放されています」と出そうとしたら可能だろうが
パフォーマンスと互換性からそうしないんだろう。

18 :デフォルトの名無しさん:2015/01/12(月) 13:03:16.87 ID:Pgt9wbS9.net
>>15
なるほど
もしこのように実装されていたら(実際はもっと複雑なんでしょうけど)
一度目の解放後に双方向リストのリンクが変わっていたり、
確保していたアドレスに別の変数のメモリを確保していたら、
もう一度解放するとリンクが滅茶苦茶になる可能性がありますね

>>14, >>16-17
そういう可能性もありますか…

自分でも調べてみます
ありがとうございました

19 :デフォルトの名無しさん:2015/01/12(月) 13:39:05.94 ID:dz9wpGuy.net
>>17
> 存在しないファイルをオープンしたとき、Cはエラーメッセージを出してくれない状況と同様かと。

#include <string.h>
char *strerror(int errnum);

#include <errno.h>
errno

エラーメッセージを出すように組まなきゃ出ないのは当たり前だが

20 :デフォルトの名無しさん:2015/01/12(月) 15:35:19.43 ID:GOoAet7L.net
式を選択した後ニュートン法で解を求めるプログラムなのですが、最後のpfのとこに波線が現れ「関数型(もしくはpointer to object型)である必要がありますとでてエラーになります。
どこが間違っているか教えていただけるととても助かります
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define max 1000 //最大繰り返し回数
#define eps 1.0e-5 //収束条件

double f1(double x);
double f2(double x);
double f3(double x);
double df(double x,int pf,int j);
void newton(void);


int main()
{
newton();

return 0;
}

void newton(void)
{
int(*pf[])() = { f1, f2, f3 };
int i,j;
double a=1, na;
printf("equation NO.\n");
printf("0: 3cos(x2)-sin(x)\n");
printf("1: x3-x2-x-3\n");

21 :デフォルトの名無しさん:2015/01/12(月) 15:36:39.01 ID:GOoAet7L.net
printf("2: x*sin(x)+log(x)\n");
printf("which equation:");
scanf("%d", &j);

if ((j < 0) | (j > 2)) return 0;
for (i=0;i<max+1;i++) {

na = a - (*pf[j])(a)/df(a,pf,j);
if (fabs(na - a)<eps) break;

a = na;

if (i== max) {
printf("収束しませんでした。\n");
exit(1);
}
}

printf("解は%fです\n", na);

}

22 :デフォルトの名無しさん:2015/01/12(月) 15:37:16.70 ID:GOoAet7L.net
double f1(double x)
{
return 3*cos(x*x)-sin(x);
}

double f2(double x)
{
return x*x*x - x*x - x - 3;
}

double f3(double x)
{
return x*sin(x) + log(x);
}

double df(double x,int *pf,int j)
{
return ((pf[j])(x+eps)-f(x))/eps;
}

23 :デフォルトの名無しさん:2015/01/12(月) 16:03:47.42 ID:NYq12SDF.net
> if ((j < 0) | (j > 2)) return 0;
if (...)
{
  fprintf(stderr, "error: equation number is invalid\nplease input 0, 1 or 2\n");
  exit(1);
}

24 :デフォルトの名無しさん:2015/01/12(月) 16:39:30.74 ID:KGNTKkPE.net
エラーメッセージの通り。typedef した方が楽。

25 :デフォルトの名無しさん:2015/01/13(火) 09:17:24.80 ID:p5zUoyxu.net
int(*pf[])() の宣言ってあってる?
double (*pf[])(double)
じゃないのかな?

26 :デフォルトの名無しさん:2015/01/13(火) 13:28:46.37 ID:Xd+ASo4R.net
関数ポインタがガバガバだからちゃんと勉強した方がいい

27 :デフォルトの名無しさん:2015/01/13(火) 17:23:23.52 ID:p5zUoyxu.net
>>26
すまん(_ _) 精進するわ orz

28 :デフォルトの名無しさん:2015/01/15(木) 05:04:37.22 ID:sN1/S68L.net
fstreamで
ファイルの長さを短くするには
どうしたらできますか?

29 :デフォルトの名無しさん:2015/01/15(木) 09:03:31.24 ID:+X0UBnJQ.net
>>28
ストリームなのにサイズを小さくできるわけないだろいい加減にしろ
強いて言えばftruncate

30 :デフォルトの名無しさん:2015/01/15(木) 11:20:21.19 ID:lMW8kkLc.net
UNREFERENCED_PARAMETER()
を警告対策で入れまくっているのですが、こんな長い文字列がソースの中の
至る所にあると目ざわりなので
UP() とか短い名前で定義しなおすみたいな小細工は、馬鹿でしょうか?
お勧めな方法を教えれ。

31 :デフォルトの名無しさん:2015/01/15(木) 11:32:12.55 ID:mt3DJv6M.net
そもそもそんなに使わない気がするんだが。

32 :片山博文MZ ◆T6xkBnTXz7B0 :2015/01/15(木) 14:57:44.01 ID:OiYOltU9.net
>>30
//#1
void func(int param) {
...
param = param;
}

//#2
void func(int /*param*/) {
...
}

33 :デフォルトの名無しさん:2015/01/15(木) 18:26:35.10 ID:lMW8kkLc.net
>>32
アドバイスありがとうございました。
#2で行こうかなと思います。これをマクロで
#define  コメント(a)     /* a */
みたいなのが定義出来たら、
void func(int コメント(param)){
みたいに書けるかなと思ったのですが、こんなマクロは作れないでしょうか?
単なる興味です。

34 :デフォルトの名無しさん:2015/01/15(木) 18:45:31.21 ID:Fnh8Qa/J.net
作れません

35 :デフォルトの名無しさん:2015/01/15(木) 23:25:56.38 ID:7CYyJ2nZ.net
>>33
#define  コメント(a)

でいいじゃん

36 :デフォルトの名無しさん:2015/01/17(土) 13:12:48.82 ID:46CXHtx0.net
>>558
超余裕w

37 :sage:2015/01/19(月) 12:55:39.27 ID:0l2kTrnM.net
STL のコンテナの内容をデバッグ中に表示させたいのだが
gdb の pretty printer というやつがどうやってもうまく有効化できん。。
(gcc 4.8.4, gdb 7.8.1)

同じようなことできているひといますか?

38 :デフォルトの名無しさん:2015/02/01(日) 07:06:55.66 ID:RggaqYXQ.net
Linux + gstreamer-1.0 + C++の質問はここでも宜しいですか?
問題が有るようなら誘導をおねがいします。

filesrc -> decodebin -> audioconvert -> appsink
appsinkからデータを取り出して弄ってappsrcに入れる
appsrc -> audioconvert(動かないので入れてみた) -> autoaudiosink
で音が出ません(gstreamer-0.10では動いていた)

gst_buffer_map( buffer, &info, GST_MAP_WRITE );
info.dataにデータを入れて(ここまでは入っているようです)
gst_app_src_push_buffer( GST_APP_SRC(appsrc), buffer );
gst_element_set_state( playpipe, GST_STATE_PLAYING );
で再生しています。(bufferが1秒に満たない場合は再生を止めてbufferがたまるまで待ちます)
ネットをあさってみたのですが、どうもbufferがわたっているのか設定が必要なのか再生時に問題が発生しているのか
よく分かりませんでした。なにかヒントを頂けると嬉しいです。
返信レスは遅れると思いますが、よろしくお願い致します。

39 :デフォルトの名無しさん:2015/02/03(火) 00:49:09.47 ID:O9Z5gBA+.net
助けて下さい

<stdio.h>をインクルードして、
getcとputcを使った箇所でエラーが出ました。引数が少ないとか言われたけど、
何を追加するかわからないし、そもそも本の通りにやったのに・・・何故エラー?

linux.c: In function ‘LoadMapData’:
linux.c:37:7: error: too few arguments to function ‘_IO_getc’
Map[x][y] = getc();
In file included from /usr/include/stdio.h:74:0,
from linux.c:1:
/usr/include/libio.h:434:12: note: declared here
extern int _IO_getc (_IO_FILE *__fp);
linux.c: In function ‘SaveMapData’:
linux.c:53:21: error: macro "putc" requires 2 arguments, but only 1 given
putc(Map[x][y]);

//37: Map[x][y] = getc();
//53: putc(Map[x][y]);

40 :デフォルトの名無しさん:2015/02/03(火) 01:05:40.03 ID:hgFb4HHg.net
>>39
本の通りってどんな本使ってんだよ

41 :デフォルトの名無しさん:2015/02/03(火) 01:36:23.06 ID:QU1jdhII.net
なんでファイルポインタがいるんだよ
getc()の実態が何になってるか見てみて

42 :デフォルトの名無しさん:2015/02/03(火) 02:45:00.34 ID:O9Z5gBA+.net
実態ってこんな感じの?
http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c03.html

実践 linux システムプログラミング C for Linux って本500P弱あるんだけど
19Pのそれで止まってもう動けない泣きたいww

43 :デフォルトの名無しさん:2015/02/03(火) 03:26:42.31 ID:QU1jdhII.net
ideoneにソース載せてみて

44 :デフォルトの名無しさん:2015/02/03(火) 03:46:21.13 ID:O9Z5gBA+.net
そういうサイトの存在を初めて知りました!
勉強になります。

これで見れますかね?
http://ideone.com/iRHNDJ

45 :デフォルトの名無しさん:2015/02/03(火) 04:06:55.61 ID:yGwE0+2u.net
>>39
ほんとうに本のとおりか?
なおすとすれば http://ideone.com/sPoJJs だがあまり意味の感じられない内容だ

46 :デフォルトの名無しさん:2015/02/03(火) 04:33:33.26 ID:O9Z5gBA+.net
>>45
有り難うございます。できました!!
先を見ると、これを元にどんどん拡張していく感じのようです。

ガンガン進めてみます!

47 :デフォルトの名無しさん:2015/02/03(火) 04:38:48.15 ID:GMpj9RJ2.net
誘導されてきました。

質問です。
抽象クラス(親クラスとする)を継承した派生クラス(子クラスとする)を
親クラスの型のメンバー変数に子クラス型でnew()し、抽象化して保持してます。


このメンバーをdelete してすぐNULLを代入しても、参照が残ってるみたいで
エラーがでる場合があります。

抽象化しているオブジェクトの削除の、お作法みたいなものってありますでしょうか。

48 :デフォルトの名無しさん:2015/02/03(火) 05:04:38.61 ID:yGwE0+2u.net
>>47
>参照が残ってるみたいでエラーがでる場合があります。
なぜそう判断した?

49 :デフォルトの名無しさん:2015/02/03(火) 05:19:50.66 ID:yGwE0+2u.net
>>47
仮想デストラクタ

50 :デフォルトの名無しさん:2015/02/03(火) 05:24:28.94 ID:GMpj9RJ2.net
>>48
deleteしたはずの親クラスに定義している純粋仮想関数への
アクセスをしているようで、アクセス違反でメモリリークを起こしています。

自分なりに調べて、親クラスのデストラクタをVirtualにするなど今試みていましたが、
だめでした。

http://shnya.jp/moin/C++%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4#A.2BfRR8i07uYPOVomVwMG5.2FYA-
こちらのサイトの
純粋仮想関数の罠

の項の

しかし……私は嘘をつきました。抽象クラスのインスタンスを構築することはできるのです。
継承された具体クラスを構築している時に、一瞬ですが基底クラスは存在します。 継承されたクラスのコンストラクタが呼ばれる前に、純粋仮想関数が呼ばれた場合、プログラムは不正終了します。

が原因に近しいのはないかと踏んでいますが、具体的な対策が見出せません。
というのが恐らく一番近い原

51 :デフォルトの名無しさん:2015/02/03(火) 07:10:28.26 ID:GMpj9RJ2.net
自己解決しました。

親クラスのコンストラクタかデストラクタが呼ばれるタイミングで
仮想関数が呼ばれていると pure virtual method called になるようで、

純粋にその場面では仮想関数を呼ばないように工夫することで解決しました。
>>48さん、お付き合い頂きましてありがとうございました。

52 :デフォルトの名無しさん:2015/02/03(火) 09:26:12.35 ID:orcEUXbE.net
不思議な解決方法だな…
そもそも親クラスのコンストラクタ・デストラクタが純粋仮想関数を呼ぶように作られているというのが不思議だ。
もしかして最初から作り方を間違えていたのを、直し方を間違えたまま、現象だけ解決してるんじゃないか?

53 :デフォルトの名無しさん:2015/02/03(火) 10:08:38.01 ID:415X5y7P.net
そもそも抽象クラスとは関係なく
コンストラクタ内での仮想関数呼び出しはいつもと同じようには機能しない
c++ コンストラクタ内での仮想関数呼び出し
でぐぐって勉強しとけや

54 :デフォルトの名無しさん:2015/02/03(火) 10:27:16.30 ID:vbeiF6Sp.net
全然理解できないけど、理解しないで良い知識だと思った

55 :デフォルトの名無しさん:2015/02/03(火) 17:29:43.02 ID:QU1jdhII.net
>>47
親コンストラクタ
子コンストラクタ
子デストラクタ
親デストラクタ
の順番怪しくないの?

56 :デフォルトの名無しさん:2015/02/08(日) 02:05:07.87 ID:BueC27lR.net
ポインタを返す関数の戻り値を受けるのにautoで書くとき、
auto x = func();
と書くのと
auto * x = func();
と書くのは同じなんでしょうか。
下の例のxはポインタのアドレスになってしまうんでしょうか。

57 :デフォルトの名無しさん:2015/02/08(日) 02:09:34.75 ID:JJBPIwXc.net
下はコンパイル通りません

58 :デフォルトの名無しさん:2015/02/09(月) 12:16:48.66 ID:oe5uzBMp.net
>>56
そこで宣言するのがx一つならどちらも同じでxはただのポインタ
宣言するのが二つ以上のときに違いがでる

// xとyは同じ型。どちらもポインタ
auto x = func(), y = func();

// エラー
// xはポインタだけどyは違うので初期化できない
// int *x = a, y = b;のときと同じようなこと
auto * x = func(), y = func();

59 :デフォルトの名無しさん:2015/02/10(火) 17:29:32.16 ID:6CiTLKPy.net
cの経験は少しあって最近c++始めたんですが、vectorとstringだけでも十分便利
何ですが、この後何を覚えると
良いでしょうか?

60 :デフォルトの名無しさん:2015/02/10(火) 17:32:54.26 ID:wTvHI6bs.net
unique_ptr shared_ptr

61 :デフォルトの名無しさん:2015/02/10(火) 17:51:16.45 ID:Igj7O7oB.net
ところでvectorとstringってC++なの?

62 :片山博文MZ ◆T6xkBnTXz7B0 :2015/02/10(火) 17:55:47.93 ID:ZZYSwCjN.net
std::vectorとstd::stringはC++のクラスだよ。

63 :デフォルトの名無しさん:2015/02/10(火) 18:00:25.33 ID:fc6wBG1e.net
Cではないことは確か

64 :デフォルトの名無しさん:2015/02/10(火) 19:48:17.76 ID:NjPy1BDR.net
>>59
map
あとコンパイラが対応してるなら楽できる便利機能として
auto や range based for あたり

65 :デフォルトの名無しさん:2015/02/10(火) 23:20:53.99 ID:6CiTLKPy.net
>>64
レス有難うございます。
mapって言うのは少し知っているのですが
どういう状況で使ったらどんなメリット
が有るのかよく分かりません。

66 :デフォルトの名無しさん:2015/02/10(火) 23:31:36.48 ID:Aoer/888.net
配列のインデックスに文字列がつかえる。
そんなもんAWK, Perlにもある。

mapがなかったら…
2本の配列を用意して、一方に文字列(Cなら2次元配列)、もう一方に数字をいれます。
おなじインデックスで、文字列および数値をとりだす。
たいへんだぁ(?)
それでできますが、mapなら
文字列 → 数値
が一発でできる

67 :デフォルトの名無しさん:2015/02/10(火) 23:38:54.44 ID:Aoer/888.net
STLのmapは、二進木で管理されていて、検索しやすい
find
もう用意されている
イテレータもある

68 :デフォルトの名無しさん:2015/02/10(火) 23:42:56.56 ID:6CiTLKPy.net
>>66
配列のインデックスに文字列が必要に
なる状況が思いつかないのですが、
どんなアプリを作るとそういう状況に
なりますか?

69 :デフォルトの名無しさん:2015/02/10(火) 23:49:02.93 ID:Aoer/888.net
人間は、文字列を入力します
数字も文字列だ

名前
住所
年齢は、数字(数字を数値に変換すればいいが、数字のままでもいける)
性別は、2値でいい。これも文字列のままでいける

70 :デフォルトの名無しさん:2015/02/10(火) 23:56:47.79 ID:7yL7ZV6a.net
>>68
文字列に限らずデータの対応付けぐらい普通にやるだろ
JSONとか知らない?

71 :デフォルトの名無しさん:2015/02/10(火) 23:59:30.85 ID:MwNGRsKL.net
特定の文字列に特定の数値なり構造体なりを割り当てたいときとかあると思うんだが
文字列じゃなくても連番ではない特殊な数値を関連付けに利用してもいいわけだし

72 :デフォルトの名無しさん:2015/02/11(水) 00:14:07.04 ID:vLqody7u.net
多言語なら辞書とか連想配列とか呼ばれてるものと同じようなもの
C++のはキーに任意の型が使える

73 :デフォルトの名無しさん:2015/02/11(水) 00:58:31.53 ID:D/QOH335.net
人工知能の情報関連付けの処理で活躍してそうだな

74 :デフォルトの名無しさん:2015/02/11(水) 01:11:41.68 ID:oz4RTyK1.net
>>68
配列の中身を検索するときいちいち全部ループで回すのか

75 :デフォルトの名無しさん:2015/02/11(水) 04:44:28.19 ID:aYb/ZX4Z.net
map はポインタをキーとして使われることも多いよ。
キー側データにメンバを追加できないとき、あるいは
非破壊的に値を保持したい時などに使う。

76 :デフォルトの名無しさん:2015/02/11(水) 04:44:37.16 ID:ZlZsHmR5.net
>>68
処理速度重視か作成効率かどちらを取るかで考え方が変わるね
Cでとことん処理速度に拘ってた人は抵抗あるかも知れない
CPUやらハードの性能が上がれば、速度なんて後でついてくる位の気持ちになることが大事

77 :デフォルトの名無しさん:2015/02/11(水) 04:52:35.15 ID:aYb/ZX4Z.net
チューニングするときにはプロファイルとりつつ
「ここは高々数件だから配列に入れて検索した方が速いか」とかするとしても、
まずは map や unordered_map で実装しとくのがいいよね。

78 :デフォルトの名無しさん:2015/02/11(水) 05:32:39.62 ID:X7wVt/Fu.net
There is an apple.
This apple is red.

word = "apple"
words[word] += 1

空白区切りで、すべての単語を取り出し、
それらの使われた回数を数える
is, appleは2回

79 :デフォルトの名無しさん:2015/02/11(水) 09:09:02.61 ID:yrYT/hzd.net
>>78
どういうふうに入力されるかわからないしアドバイスしようがないな。
宿題片付けたいだけなら宿題スレへ。

80 :デフォルトの名無しさん:2015/02/12(木) 00:39:49.32 ID:mbIhPfz6c
C++初心者です
最近template学んだんだけど

template<class T> T plus5(T value) {
   return (value + 5);
}

関数plus5をこんな感じで定義しました
このときTがintなら何も問題ない
だけどTがfloatやdoubleだったとき、定数項が5.0fか5.0である必要があります

キャストする以外の方法で定数項をTと対応させるにはどうすればいいか教えて下さい

81 :デフォルトの名無しさん:2015/02/15(日) 17:50:17.20 ID:B1xPkbHY.net
class Hoge{

private:

Hoge &operator=(const Hoge &hoge){}
};



Hoge &Hoge::operator=(const Hoge &hoge){}

は同じなのでしょうか?
互換性があるかどうか調べるためにまず上を宣言してから、
下に書き換えるべくいじくったらこれでエラーが出なくなったのですが

82 :デフォルトの名無しさん:2015/02/15(日) 18:35:49.01 ID:auAw66hR.net
>>81
クラス定義の中でメンバ関数の定義を書けば暗黙的にinlineになる

違いはそれだけなので
> 下に書き換えるべくいじくったらこれでエラーが出なくなったのですが
は気がついていなかったミスが書き換えてるうちに勝手に修正されただけだろう

83 :デフォルトの名無しさん:2015/02/15(日) 21:37:37.08 ID:cBAJ0xmb.net
型名 クラス名::変数名で静的メンバ変数を宣言しつつ初期化することはできないのですか?

84 :デフォルトの名無しさん:2015/02/15(日) 22:23:37.30 ID:oIrwp9Au.net
>>83
すればいいだろ
https://ideone.com/b2UMf5
クラス定義に書いてない変数を
クラス定義の外で定義したいのであれば無理

85 :デフォルトの名無しさん:2015/02/15(日) 22:59:17.65 ID:cBAJ0xmb.net
あー…やっぱりクラス宣言の時にsatatic定義しないとstaticとして初期化できないんですか
static 型名 クラス名::変数名のように書いて一気にこなそうと思ったんですが、
その際にストレージクラスは宣言できないって怒られちゃって
当初考えていた通りヘッダの宣言で定義しておくことにします ありがとうございました

86 :デフォルトの名無しさん:2015/02/16(月) 12:07:40.11 ID:vGSFacHj.net
coutをclose出来ますか?

close(1);する前に
fclose(stdout);みたいな事がしたいのです。

87 :デフォルトの名無しさん:2015/02/16(月) 12:22:35.58 ID:DWHkwfYs.net
flushじゃいかんのか?

88 :bti:2015/02/16(月) 12:45:55.99 ID:KKpFX0J7.net
ビットコインをはじめよう
このリンクからビットコイン購入・販売所bitFlyerにご登録すると
1000円分のビットコインがもらえます!

https://bitflyer.jp/gift/fn0tlipl

話のネタに、とにかく一応もらっておくといいです。
間もなく終了するようです。

89 :デフォルトの名無しさん:2015/02/16(月) 13:01:04.61 ID:vGSFacHj.net
>>87
回答ありがとうございます。

cout.flush();close(1);

で大丈夫でしょうか?
処理の途中で標準出力をクローズしたいのです。

90 :デフォルトの名無しさん:2015/02/17(火) 18:52:31.46 ID:FQU0SBpo.net
double d1 = DBL_MIN;
double d2 = DBL_MIN;
double d3 = 1.0;
とした時に
if(d1==d2)
if(d1==d3)
みたいな比較をしても良いのでしょうか?

91 :デフォルトの名無しさん:2015/02/17(火) 20:23:53.31 ID:WP6LEt4U.net
プリプロセッサの仕様を思い出してみるといい

92 :デフォルトの名無しさん:2015/02/17(火) 22:04:02.88 ID:p0gP7/RW.net
#define DBL_MIN 1.0ならok

93 :デフォルトの名無しさん:2015/02/17(火) 22:10:55.98 ID:y95d2Nc1.net
訊きたいのは
if (d1 == DBL_MIN)
の成立が保証されてるかじゃないのか?

94 :デフォルトの名無しさん:2015/02/18(水) 00:21:05.39 ID:CW9ZV6LJ.net
質問の意図もC++も分からないけど
「DBL_MINはdouble型で表現可能な最小な正数」だから
1.0ではないんじゃね?
ググったけど
2.225074e-308
みたいな値だろ?

等号での比較は「偽」だろうけど比較をする事自体は問題無いよ。
答えになってるかな?

95 :デフォルトの名無しさん:2015/02/18(水) 00:23:35.03 ID:CW9ZV6LJ.net
double型での等価の比較はあまりオススメ出来ないとか
そんな答えを求めているのかな。

96 :デフォルトの名無しさん:2015/02/18(水) 12:24:16.22 ID:cxgRNEsa.net
うちだとdoubleやfloat変数を==で比較してる時点で社内レビューではねられるな。例外は即値が整数のときだけ

97 :デフォルトの名無しさん:2015/02/18(水) 13:16:02.61 ID:492Iwxk8.net
DBL_MIN==DBL_MIN を気にしてるんか? どこにフォーカスしてるのか

98 :デフォルトの名無しさん:2015/02/18(水) 13:38:50.13 ID:9GHJc1N/.net
>>90
しても構わないが浮動少数では誤差が出るから正確な答えがでない可能性は高いよ

99 :デフォルトの名無しさん:2015/02/18(水) 16:30:13.29 ID:UnM/2wIq.net
最大値や最小値が揺れるってのは概念としては考えづらいんだけど、
コンパイラや仕様によって起きるのだろうか 気になる

100 :デフォルトの名無しさん:2015/02/18(水) 20:56:44.33 ID:wgfycviw.net
そりゃ
double d1 = DBL_MIN;
この時点で値が変わってるだろ

101 :デフォルトの名無しさん:2015/02/18(水) 21:07:49.24 ID:s5Vrc8eg.net
doubleで表現できる最小な正数値なのにdoubleに代入しただけで値が変わるとはいかに

102 :デフォルトの名無しさん:2015/02/19(木) 13:19:57.14 ID:PwGKmnLr.net
浮動小数点の誤差って、演算後の話で、代入だけしかしてなければ == で判定してもきっちり判定できるよね?

103 :デフォルトの名無しさん:2015/02/19(木) 14:34:52.84 ID:fdKBoaCS.net
>>102
同じ型同士で同じ値を代入しただけなら==でも判定できそうな気がするけど(詳細は知らん)
以下のような場合は判定できないと思った方がよいと思うよ
doubleに代入した時点で厳密に1000ではなくなるから
int i = 1000;
double d = 1000;
if ( i == d )

実際に1000だとうまくいくかは試してない

104 :デフォルトの名無しさん:2015/02/19(木) 14:43:34.31 ID:7oFSdK4O.net
>>103
どっちもint(1000)がdoubleに暗黙で変換されてるから一緒だろ

105 :デフォルトの名無しさん:2015/02/19(木) 15:09:24.04 ID:IU8xWBqQ.net
>>103
等号が成立しなくなる理由はいくつかあって、

a)循環少数になる場合
b)基数が10でない為正確な数値を表現出来ない事
c)桁落ち

a)は数値で計算してる為の丸め誤差
b)はC++のdoubleなんかの小数点以下の数値の表現の問題。
c)はC++のdoubleなんかの有効桁が固定されている為の問題。

でおそらくb)の説明だよね。
であるなら整数であればたぶん大丈夫なはず。

106 :デフォルトの名無しさん:2015/02/19(木) 16:03:16.25 ID:MTWKGuO0.net
>>102
計算機イプシロンより絶対値の小さい値a,bがあるとして
数学上はa≠bでも、変数に格納して両者を比較するとプログラムの動作ではa=bとなってしまう
だから「==」できっちりと判定できるとは限らない
まぁこれを逆手にとって、たとえば、二つの浮動小数点数の差の絶対値が計算機イプシロンより小さければ
「==」とみなす‥というコーディングをしたりします

107 :デフォルトの名無しさん:2015/02/19(木) 16:19:57.40 ID:PwGKmnLr.net
なるほど… dです

整数を扱っているうちは大丈夫、小数点下も同じ値を代入した直後なら多分大丈夫、と
計算機イプシロンのほうはぴんとこないけど。

doubleの内部的な動きがいまいちぴんとこないから、double避けて書いてる…使う用事がないことを祈りつつ

108 :デフォルトの名無しさん:2015/02/19(木) 16:30:34.07 ID:7oFSdK4O.net
IEEE754でググれ
JavaとかC#とかの多くの言語で採用されてる方法だから
固定長の浮動小数点型でこれ以外の方法で実装されてる環境を探す方が難しいぐらい

109 :デフォルトの名無しさん:2015/02/19(木) 16:32:53.74 ID:MJrK0vGE.net
まあ浮動小数点演算ユニットからしてIEEE754に最適化されてるだろうしな

110 :デフォルトの名無しさん:2015/02/19(木) 17:28:23.19 ID:GY4p95fn.net
>>107
ゲームでの座標計算って大抵floatかdoubleじゃね
理由は主に斜め移動などの少数になる演算

キャスト使って全部無理やりintにはできるけど

111 :デフォルトの名無しさん:2015/02/19(木) 18:43:58.71 ID:x3p0g+OH.net
>>107
double使うなら基礎知識として浮動小数点誤差は知っておくべき

112 :デフォルトの名無しさん:2015/02/21(土) 20:03:43.80 ID:l44iTosq.net
自作のWindowsアプリが連続で何時間も動かすとタスクマネージャで
メモリの使用量が徐々に増えていくのですが、それをグラフに書きたい
のですが、自分でメモリ使用量調べるのは面倒なので、何か簡単なツールで
特定のプロセスIDを指定したら、そのプロセスのメモリ使用量を
10分ごととかでファイルに保存してくれるようなそんなツール無いでしょうか?
あれば教えてください。

113 :デフォルトの名無しさん:2015/02/21(土) 20:06:47.17 ID:g1tTND+u.net
それは知らないがメモリリークしてるだろ。そっちは無視か。

114 :片山博文MZ ◆T6xkBnTXz7B0 :2015/02/21(土) 20:09:37.81 ID:swM6o0zc.net
Visual Studioのデバッグ機能を使えばメモリーリークくらい余裕でわかるだろ。

115 :デフォルトの名無しさん:2015/02/21(土) 20:28:23.41 ID:l44iTosq.net
>>114
コツを教えてください。

116 :片山博文MZ ◆T6xkBnTXz7B0 :2015/02/21(土) 20:33:54.74 ID:swM6o0zc.net
>>115
「VC デバッグ メモリーリーク」で検索

117 :デフォルトの名無しさん:2015/02/21(土) 20:36:49.08 ID:MtQcH0ET.net
>>115
その質問が出るレベルなら、newをプロジェクトから検索、deleteを検索
数が合ってたら、
Createとreleaseで同じように
でも増えていくメモリの大きさから大体見当つくだろ

118 :デフォルトの名無しさん:2015/02/21(土) 20:42:14.17 ID:qCqW+14K.net
new と delete (malloc() と free()) が同じ数とはかぎらないだろう‥
個人的にはラッパ(new/delete のオーバーロード)できっちり把握する
メモリ以外のリソースも同様に

119 :デフォルトの名無しさん:2015/02/21(土) 20:47:14.92 ID:78/Ireu0.net
deleteしててもその型が基底クラスだったりしたら場合によってはリークするしな

120 :片山博文MZ ◆T6xkBnTXz7B0 :2015/02/21(土) 20:52:12.85 ID:swM6o0zc.net
C++11以降は生ポ使うな、スマポ使え

121 :デフォルトの名無しさん:2015/02/21(土) 21:35:37.29 ID:MtQcH0ET.net
質問のレベルに合わせないと更なる質問を産む事になる

122 :デフォルトの名無しさん:2015/02/21(土) 23:32:02.44 ID:Ujipb/FI.net
shred_ptrやweak_ptrは煩わしいあれこれからマを解放するために生み出された物なので、
知らない人がいたらどんどん教えていくべき

なお物によっては使えなかったり結局明示的なdeleteに近い処理を書く必要がある模様

123 :デフォルトの名無しさん:2015/02/21(土) 23:41:25.44 ID:Ujipb/FI.net
aが抜けてるよaが…shared_ptr

124 :デフォルトの名無しさん:2015/02/22(日) 00:27:11.07 ID:qWw/awps.net
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14142251704

この問題がわからないんですが

125 :デフォルトの名無しさん:2015/02/22(日) 00:35:44.08 ID:0njaRTk3.net
宿題はこっちのスレに投げるべし
http://peace.2ch.net/test/read.cgi/tech/1408962564/

126 :デフォルトの名無しさん:2015/02/22(日) 12:28:56.04 ID:2HG+oh7E.net
if (::_stricmp(foo->bar(j).ToCStr(), "hoge") == 0)

みたいな文の :: (コロン2個)って何の意味がありますか?
初めて見たのですが。

127 :デフォルトの名無しさん:2015/02/22(日) 12:31:08.64 ID:RFHyaT+D.net
なんか他人のソースに書いてあってカッコいいのでマネしてみました
意味はよくわかっていません

128 :デフォルトの名無しさん:2015/02/22(日) 12:37:32.41 ID:2HG+oh7E.net
いやいや、ほんとに教えて下さい。

129 :デフォルトの名無しさん:2015/02/22(日) 12:44:15.66 ID:vG1FeYAO.net
C言語とJAVA比べた時出力処理ってどっちのほうが長いの?
JAVAの出力処理が長すぎて萎えたんだけどwwww

130 :デフォルトの名無しさん:2015/02/22(日) 12:47:28.45 ID:J+2bP69K.net
>>128
名前解決演算子(name resolution operator)で調べてこい。
C++で_stricmpがグローバル名前空間の_stricmpであることを明示するために使用

int v;
namespace N1 {int v;}
int j = ::v; // 一行目のvを指す

131 :デフォルトの名無しさん:2015/02/22(日) 12:47:38.44 ID:TRUNFqhM.net
>>126
名前空間の指定だよ、この場合はグローバル名前空間を指す

132 :デフォルトの名無しさん:2015/02/22(日) 12:52:37.49 ID:2HG+oh7E.net
>>130-131

なるほど分かりました。
ありがとうございます。

133 :デフォルトの名無しさん:2015/02/22(日) 13:58:32.00 ID:+D+VdwAu.net
つまり、この外側にこの変数が所属する名前空間自体の定義があるはずなんだが、
一部分のみを見てしまったためわからなくなってしまったという

134 :デフォルトの名無しさん:2015/02/22(日) 15:59:14.17 ID:i2HJL1En.net
変数じゃなくて関数っぽくね

135 :デフォルトの名無しさん:2015/02/23(月) 17:05:50.97 ID:pMjCWY3N.net
int i_g;
void func(int &i){
  i_g = i;
  i_g = 777;
  i = i_g;     // この行無しで
}
void main()
{
  int i = -1;
  func(i);
  printf("i = %d\n", i);    // 777
}
これ実行すると、777と出力出来るのですが、[この行無しで]の代入無しでも
同じ結果にすることは可能でしょうか?
つまり、funcの中で,i_gに何らかの値を代入するだけで、main()に戻った時にもその
値がiに戻って来るように出来ますか?

136 :デフォルトの名無しさん:2015/02/23(月) 17:10:10.02 ID:Su9wFgfT.net
代入してないのに値が変わったらミラクルだわ
printf("i = %d\n", i_g);
じゃダメなのか

137 :デフォルトの名無しさん:2015/02/23(月) 17:10:11.68 ID:zZTzM7Nf.net
>>135
int &i=i_g;
i_g=777;
とりあえず、そんな糞コード書く前にポイントとか参照の基礎を学べ

138 :デフォルトの名無しさん:2015/02/23(月) 17:17:56.49 ID:pMjCWY3N.net
>>136
mainは変更しない前提でお願いします。

139 :デフォルトの名無しさん:2015/02/23(月) 17:21:00.06 ID:Su9wFgfT.net
スタックを書き換える方法を聞いてるのか?
どちらにしろiに代入するしか方法はないが

140 :デフォルトの名無しさん:2015/02/23(月) 17:26:42.80 ID:pMjCWY3N.net
>>139
説明不足ですみません。
int i_gではなく
int *p_g
としてfunc内で
p_g=&i
とすれば
*p_gに代入した値はmainに戻せますが
ポインタ変数を使わずに実現出来ますか?
参照だけで出来ますか?

141 :デフォルトの名無しさん:2015/02/23(月) 17:27:41.57 ID:zZTzM7Nf.net
>>138
void func(int &i_g){
i_g=777;
}
はい、要件満たしてやったぞ。

142 :デフォルトの名無しさん:2015/02/23(月) 17:28:43.79 ID:Su9wFgfT.net
参照なら>>135でいいだろ

143 :デフォルトの名無しさん:2015/02/23(月) 17:30:54.02 ID:pMjCWY3N.net
>>141
i_gはグローバル変数でお願いします。

144 :デフォルトの名無しさん:2015/02/23(月) 17:32:14.07 ID:zZTzM7Nf.net
>>143
グローバル変数である必要がありません。

145 :デフォルトの名無しさん:2015/02/23(月) 17:33:22.68 ID:pMjCWY3N.net
>>144
私には必要なんです

146 :デフォルトの名無しさん:2015/02/23(月) 17:33:31.85 ID:Su9wFgfT.net
グローバル変数は参照にできないから不可能

147 :デフォルトの名無しさん:2015/02/23(月) 17:46:15.63 ID:zZTzM7Nf.net
>>145
ポインタにしたとしてどう使うんだよそのグローバル変数は

148 :デフォルトの名無しさん:2015/02/23(月) 17:47:44.44 ID:RAjknDke.net
  i = i_g;     // この行無しで

この行を削らないといけない理由は?

149 :デフォルトの名無しさん:2015/02/23(月) 23:57:52.51 ID:pMjCWY3N.net
>>148
そんなに深い理由はないのですが、
削っても出来るかなという素朴な疑問でした。

150 :デフォルトの名無しさん:2015/02/23(月) 23:59:40.53 ID:cWkGfwjm.net
>>149
君の頭と貴重な時間を削ってもできるかな

151 :デフォルトの名無しさん:2015/02/24(火) 03:22:23.24 ID:G4iqMc1S.net
>>149
ろくに答えもしない人はたいがい「なんでそんな事をするのか」だから答えなくていいよ

152 :デフォルトの名無しさん:2015/02/24(火) 06:25:16.30 ID:RxQOhZJD.net
そういうやつは一生糞みたいなコード書いてればいいよ。
間違っても仕事にすんなよまわりが迷惑するから。

153 :デフォルトの名無しさん:2015/02/27(金) 02:32:04.08 ID:GOSdj3hN.net
uint16_t data[] = {0,1,2,3,4,5,6,7};
int skip = 4;
auto p = reinterpret_cast<uint16_t (*)[skip]>(data);
printf("%d %d %d\n", p[0][0], p[0][1], p[0][2]); // => 0 1 2
printf("%d %d %d\n", p[1][0], p[1][1], p[1][2]); // => 4 5 6

こうやって変数で配列のサイズを指定するのって、
c++11 でも規格ではなく GCC独自拡張でしょうか?

154 :デフォルトの名無しさん:2015/02/27(金) 02:34:29.96 ID:Iu53F2aP.net
自分はわからないが、危険だとおもったら文法的に安全な方法で。

155 :デフォルトの名無しさん:2015/02/27(金) 09:54:11.83 ID:MHy9s9iY.net
>>153
cでならc99で規格化されてるがc++では(今のところ)コンパイラの独自拡張

156 :デフォルトの名無しさん:2015/02/27(金) 10:19:22.37 ID:vnP6fImO.net
>>153
https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length

157 :デフォルトの名無しさん:2015/03/02(月) 22:17:43.11 ID:j/CocTLkG
>>153

きたねえ糞コードだなあ

158 :デフォルトの名無しさん:2015/03/09(月) 03:55:55.20 ID:oMflzd71.net
char buff1[定数];
char buff2[定数];
if(strcmp(buff2,"++")==0){
buff2 = buff1 +1;
}

という式を書いたのですがbuff2は変更不可能というエラーが出てしまいます。ポインタなのが問題らしいのですがポインタでなくbuff2に入っている文字列の数値を計算して書き換えるにはどう修正すればいいのでしょうか?
buff2の中身が"++"の時はbuff1(数値)に1加えた数値をbuff2に代入するという式を書きたいです。

159 :デフォルトの名無しさん:2015/03/09(月) 04:16:20.53 ID:UEMwm/ZM.net
>>158
ポインタとアドレス、配列アドレスと配列バッファを混同してる
buff1とbuff2の値を見て見るべき
ついでにヒントとしてbuff1[0]とbuff2[0]の値もね

160 :デフォルトの名無しさん:2015/03/09(月) 04:47:05.93 ID:C8nwOi6u.net
>>158
int num=atoi(buff1);
num=num+1;
sprintf(buff2,”%d”,num);

161 :デフォルトの名無しさん:2015/03/09(月) 05:46:16.97 ID:d8cjeDnQ.net
>>158
if(strcmp(buff2, "++") == 0) {
sprintf(buff2, "%d", atoi(buff1) + 1);
}

162 :デフォルトの名無しさん:2015/03/09(月) 07:47:02.31 ID:N0bMeNoe.net
vector<int> test;
vector<int>::iterator begin,end;

2行目の::はなんですか??
名前空間に属している事を示す::と、クラスのメソッドである事を示す::しか知らないのですが
iteratorはvectorクラスのどういうものなんですか?

163 :デフォルトの名無しさん:2015/03/09(月) 08:00:26.85 ID:lCvEf7bM.net
>>162
:: はスコープ指定演算子で、iterator は vector のネストされた内部のクラス

164 :デフォルトの名無しさん:2015/03/09(月) 08:18:41.90 ID:N0bMeNoe.net
>>163
ご返答ありがとうございました

165 :デフォルトの名無しさん:2015/03/09(月) 17:29:38.15 ID:b0X+6jZ8.net
C++でクラスがconstなメンバ変数を持つと代入演算子が生成できない
みたいなエラーが出ますが、対策としては自前で代入演算子を定義する
など有るみたいですが、そんなことしなくても、const以外のメンバ変数は
普通に代入して、constメンバは何もしないみたいな処理を勝手にやってくれる
ような楽ちんな方法はありませんか?VS2013です。

166 :デフォルトの名無しさん:2015/03/09(月) 18:19:22.31 ID:Z3OokkBM.net
>>165
static

167 :デフォルトの名無しさん:2015/03/09(月) 18:37:06.07 ID:b0X+6jZ8.net
>>166
うまく行きました。ありがとうございました。

168 :デフォルトの名無しさん:2015/03/09(月) 22:50:27.46 ID:AQB4uEfR.net
>>159-161
ありがとうございました。おかげで無事できました。
javascript齧ってた程度なのでポインタやアドレスはイマイチわからない……C系は難しい

169 :デフォルトの名無しさん:2015/03/10(火) 02:54:49.84 ID:J40sdYqt.net
>>168
Javascriptも文字列のまま四則演算とか出来ないでしょ。
Cの文字列は色々面倒だからC++のstd::string使った方がいいよ

170 :デフォルトの名無しさん:2015/03/10(火) 10:30:47.33 ID:Zsa8IBTe.net
void* operator new(size_t size, const char* file, int line) {
return std::malloc(size);
}
void operator delete(void* p, const char* file, int line) {
std::free(p);
}

こんな感じでnew/deleteをオーバーロードしたとき、
オブジェクト作成は
  Hoge* p = new (__FILE__, __LINE__) Hoge;
のように記述できますが、破棄は
  p->~Hoge();
  ::operator delete(p, __FILE__, __LINE__);
のようにしなければならないようで若干面倒です。
こちらも例えば
  delete (__FILE__, __LINE__) p;
のように記述する文法は用意されていないのでしょうか?

171 :デフォルトの名無しさん:2015/03/10(火) 12:46:26.98 ID:Zt65CvSc.net
用意されていない

172 :デフォルトの名無しさん:2015/03/12(木) 13:38:06.69 ID:bakilSIy.net
マクロでなんとかしる

173 :デフォルトの名無しさん:2015/03/14(土) 00:04:39.33 ID:rKRQmeKw.net
udpパケットを16進数で受け取るにはどうすればいいんですか?
受信したパケットを
AA BB CC
みたいな感じで表示させたいです。
また、パケットの先頭から何bitまで抽出するにはどうしたらいいですか?

174 :デフォルトの名無しさん:2015/03/14(土) 00:08:03.77 ID:OeJNA3gM.net
>>173
お前は通信の前に基礎を勉強しろ

175 :sage:2015/03/14(土) 07:48:45.98 ID:heK9BCvf.net
>>166
テキトーなこと教えんな
氏ね

176 :デフォルトの名無しさん:2015/03/14(土) 10:29:23.78 ID:PbzhoJJP.net
>>175
mutable

177 :デフォルトの名無しさん:2015/03/14(土) 10:36:07.35 ID:ulb+QBES.net
>>173
パケット内容をダンプするのが目的なのか、ネットワークプログラミングを学習するのが目的なのか
前者ならWireSharkというツールが既にありますし、後者ならトランスポート層に直接アクセスする必要があるのでSocketでは無理。たぶんドライバレベルの知識が必要でしょう

178 :デフォルトの名無しさん:2015/03/14(土) 12:55:42.34 ID:PbzhoJJP.net
「後者なら」の意味がわからんが、データリンクへのアプローチだったらLinuxならソケット、BSDならBPFでいけるんでねぇの。
トランスポート以前でモニタ・加工ってことな。

179 :デフォルトの名無しさん:2015/03/14(土) 13:01:04.16 ID:rKRQmeKw.net
>>177
パケットの 内容をそのままダンプしたいだけですね。
確かにワイヤシャークなどのツールがありますが、勉強のために簡単なものを
自分で作ってみようとおもいました。

180 :デフォルトの名無しさん:2015/03/14(土) 13:43:04.34 ID:ulb+QBES.net
>>178
SOCK_RAWを使えばできそうですね。失礼しました

181 :デフォルトの名無しさん:2015/03/14(土) 13:47:33.07 ID:ulb+QBES.net
途中送信申し訳ない...
>>179
こちらが参考になるかも
http://www.whiteboard.ne.jp/~admin2/index.php?Linux%20socket%20%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2F%A5%D1%A5%B1%A5%C3%A5%C8%A5%E2%A5%CB%A5%BF%A5%EA%A5%F3%A5%B0%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0

182 :デフォルトの名無しさん:2015/03/14(土) 23:00:02.68 ID:rKRQmeKw.net
raw_socketならできそうです。
ありがとうございました。

183 :デフォルトの名無しさん:2015/03/15(日) 05:23:07.02 ID:NNq1Z6It.net
静的な多次元配列をクラスメンバの動的配列にコンストラクタで引き渡す(コピー)するにはどうすればいいですか?

184 :デフォルトの名無しさん:2015/03/15(日) 06:03:16.60 ID:NNq1Z6It.net
すいません解決しました

185 :デフォルトの名無しさん:2015/03/16(月) 17:42:14.07 ID:c3Hz1edW.net
特定のポート番号のみのパケットを受信しようとしてもうまくいきません。
どうすれば、良いですか?

//ソケット作成
sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

memset(&amp;sll, 0xff, sizeof(sll));
sll.sll_family = AF_PACKET; /* allways AF_PACKET */
sll.sll_protocol = htons(ETH_P_ALL);
sll.sll_ifindex = interface_index;
bind(pd, (struct sockaddr *)&amp;sll, sizeof sll);

htons(ETH_P_ALL)というところの設定を変えたりしました。

186 :デフォルトの名無しさん:2015/03/16(月) 19:16:48.91 ID:rl2BM/P0.net
プログラム以外の所に原因があるケースが多い
ポート開放でググって先に原因と対策を調べるべき

187 :デフォルトの名無しさん:2015/03/16(月) 20:35:43.27 ID:c3Hz1edW.net
>>186
ありがとうございます。確かにiptablesの設定で弾いているかもしれませんね。
htons()何ですが、htons(80)と指定することでポート80番にパケットのみひろうと
いう解釈でよろしいでしょうか?

188 :デフォルトの名無しさん:2015/03/16(月) 22:20:36.45 ID:bhsTaUEk.net
ネットワーク上はビッグエンディアンで扱うから Host TO Network byte order, Short してる。
アプリケーションレベルで通信相手を特定するならconnet(2)
どのOSかしらんけど。

189 :デフォルトの名無しさん:2015/03/16(月) 22:23:26.66 ID:bhsTaUEk.net
データグラムを recvfrom したまま応答なし、メインのシェルがブロックされたままだとキー受け付けないとかあるからお気をつけあそばせ〜。

190 :デフォルトの名無しさん:2015/03/22(日) 17:07:18.49 ID:fw6k4Nmy.net
ポインタを上書きしてしまうと前のポインタが示すデータはどうなるんですか?
ずっとどこかに残ったままですか?

191 :デフォルトの名無しさん:2015/03/22(日) 17:13:02.17 ID:CvAUvH6J.net
どうもしませんよ

192 :デフォルトの名無しさん:2015/03/22(日) 18:01:42.39 ID:KcTTsKQ+.net
>>190
スマポじゃなきゃメモリーリークになる

193 :デフォルトの名無しさん:2015/03/28(土) 16:48:23.64 ID:NmdYaBEp.net
初歩的な質問で恐れ入ります。

http://www.slideshare.net/herumi/cmovmaxps

ここの資料を見てたら

unsigned int a, b, x;
if( a<=x && x<=b ) {...}

上記の条件式を下記に書き換えれば、(条件)分岐は1回で済む、と紹介されてました。

if( (x-a) <= (b-a) ) {...}

でもこの書き換えって等価なんでしょうか?
たとえば a=70; b=90; x=60; だとおかしいような‥

194 :デフォルトの名無しさん:2015/03/28(土) 16:55:40.06 ID:zJiPBq01.net
つねにxがa以上を仮定すれば上下の成立条件は同じと見た。

195 :デフォルトの名無しさん:2015/03/28(土) 16:56:30.64 ID:LZ/SArZZ.net
unsigned前提だからだろ

196 :デフォルトの名無しさん:2015/03/28(土) 17:00:21.01 ID:NmdYaBEp.net
>>194
でもつねにxがa以上なら、この部分を記述する必要はないのではないでしょうか?
if( /* a<=x && */ x<=b ) {...}

197 :デフォルトの名無しさん:2015/03/28(土) 17:02:43.46 ID:zJiPBq01.net
a>x とすると、つねに上は不成立だが。
このときx-aが非常に大きい正数(b-aよりも)であると仮定すれば
下も不成立だな。

198 :デフォルトの名無しさん:2015/03/28(土) 17:16:02.53 ID:zJiPBq01.net
a=70; b=90; x=60; でMを扱える最大数とすると、

(x-a) <= (b-a)は、-(M-9) < 20で不成立。前者も不成立でこの場合は同じ分岐だな。

つねに一致するにはbとxに条件がいる気がするが。

199 :デフォルトの名無しさん:2015/03/28(土) 17:17:46.86 ID:NmdYaBEp.net
最初の条件式はxがa〜bの範囲内(両端含む)かどうかを調べるということですよね。
x<aの時も、そうでない時も、両方のケースを想定している条件式なんじゃないでしょうか。

200 :デフォルトの名無しさん:2015/03/28(土) 17:19:36.35 ID:NmdYaBEp.net
アンカー忘れ、すみません。196は194へのレスでした。

201 :デフォルトの名無しさん:2015/03/28(土) 17:46:19.84 ID:NmdYaBEp.net
ideoneで試したらx<aのケースだと下記のifも不成立でした。私のミス、すみません。
unsigned intの計算途中で負数になった際の取り扱いを勉強し直します。
レス下さった方々、ありがとうございました。

202 :デフォルトの名無しさん:2015/03/28(土) 18:00:54.63 ID:p+oUvV+T.net
>>193
リンク先をみてもよくわからなかったが

>if( a<=x && x<=b ) {...}
>上記の条件式を下記に書き換えれば、(条件)分岐は1回で済む、と紹介されてました。
>if( (x-a) <= (b-a) ) {...}

ここだけ抜き出して論じるのであれば、これは明らかにおかしい
なぜって不等式
x - a <= b - a
を解けばいい、両辺 a を足して
x <= b

a と x に関する条件がぬけてしまっている

203 :デフォルトの名無しさん:2015/03/28(土) 18:38:44.19 ID:NmdYaBEp.net
>>202
printf("%u\n",(x-a));
で4294967286となるので、「変数がunsignedで計算途中で負数が生じた時の挙動」が
追加の条件(情報?)になるのではないでしょうか。
数学的には-10だから両方の条件式は矛盾しますよね。

204 :デフォルトの名無しさん:2015/03/28(土) 19:32:54.67 ID:LZ/SArZZ.net
条件というか、変更した式は数学的には

mod(N+x-a,N) <= mod(N+b-a,N) (ただし 0 <= a,b,x < N)

なので、両辺にaを足しても

x <= b

にはならない。

205 :デフォルトの名無しさん:2015/03/28(土) 20:48:16.14 ID:p+oUvV+T.net
>>203
ほーなるほど‥

206 :デフォルトの名無しさん:2015/03/29(日) 00:33:59.85 ID:nF1Ol+9b.net
>>193
それは、xがa以上b以下であるかどうかを判定しようとしている式だろうから
a < b が暗黙の前提になっていると思われる。
あとは、>>195 が言うように unsigned ということ考えれば、成立する

a=70, b=90, x=60 の場合、(intが32bitすると)
x - a = 2^32 - 10 = 4294967286
b - a = 20
で false になり、 a <= x && x <= b と一致する。

207 :デフォルトの名無しさん:2015/03/29(日) 00:54:33.44 ID:nF1Ol+9b.net
数直線に a と b があって、その間に x がある条件をイメージすれば
直感的に (x - a) <= (b -a) になると思う

-----+----+-----+--------->
    a    x    b

x < a の場合は a - x がラップして b - a より大きくなることを使ってるので
最初の式の第1項は a <= x じゃなければならないね

208 :デフォルトの名無しさん:2015/03/29(日) 02:14:17.08 ID:PjXq8DMp.net
そういうことだな。a<=xなら常に一致。
a>xならb-aが(2の補数などで一回転しない)正数だったら一致。

209 :デフォルトの名無しさん:2015/03/29(日) 10:42:27.27 ID:L3D4TSkJ.net
重箱のスミで申し訳ない
unsigned int a, x; a=70; x=60; ※intは32bit
だとして
x - a == 4294967286
が成り立つことは規格で保証されているんだろうけど
ネット上で探しても文献が見つけられない
知ってる方がいたらリンクとか具体的記述とか教えてもらえればありがたいです

210 :デフォルトの名無しさん:2015/03/29(日) 10:51:01.31 ID:Lkr8cLwC.net
#define CURVEP_BEZIER (1<<0)
#define CURVEP_CORNER (1<<1)
#define CURVEP_LOCKED_Y (1<<2)

フラグの定義ですけど
この二重の不等号みたいなのって、何の意味というか、どんな動作をしますか?
intに格納されるみたいですが。

211 :デフォルトの名無しさん:2015/03/29(日) 10:58:28.09 ID:gR6bL9ge.net
シフト演算子と言うものだ
教科書を入手するとこを推奨する

212 :デフォルトの名無しさん:2015/03/29(日) 11:02:43.36 ID:PjXq8DMp.net
>>209
そんな保証はないはず。
CPUなどハードウェア的に1の補数や2の補数という仕組みがあったり
コンパイラによってもちがったりするだろう。

213 :デフォルトの名無しさん:2015/03/29(日) 11:06:38.80 ID:PjXq8DMp.net
符号付数値表現 - Wikipedia
http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE

コンピュータの数値表現 - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE

2の補数 - Wikipedia
http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0

加算器 - Wikipedia
http://ja.wikipedia.org/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8

214 :デフォルトの名無しさん:2015/03/29(日) 11:15:29.16 ID:XfQU9N1R.net
>>209
https://www.jpcert.or.jp/sc-rules/c-int30-c.html

嘘に騙されないようにね

215 :デフォルトの名無しさん:2015/03/29(日) 11:30:08.22 ID:PjXq8DMp.net
それは初めて知った。
騙すつもりはないんだが。
しかしC11(ISO/IEC 9899-2011)だからそれ以前のコンパイラは違うかもしれない。

216 :デフォルトの名無しさん:2015/03/29(日) 11:48:18.40 ID:PjXq8DMp.net
はじめからなのかわからないが。符号なしではオーバーフローが未定義ではないということは、符号あり計算のほうが速度が出る可能性はあるってことだな。



Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと

符合なし整数型のオーバーフローは、2の補数になる(wrapする)ことが保証されていて、これは常に活用できることを指摘しておく。
符号つき整数のオーバーフローの振る舞いを定義するコストとしては、これらの最適化が全く使えなくなることがある。
(たとえば、よくある症状としては64bitプラットフォームでのループ内で大量に符号拡張をしなくてはならなくなる。)
ClangもGCCも "-fwrapv" フラッグをサポートしており、これをつけると、符号付き整数のオーバーフローを定義済みの挙動とするようにコンパイラに強制できる。
(ただし、INT_MINを-1で割った場合のみ、依然として未定義となる)

http://blog-ja.intransient.info/2011/05/c-13.html

217 :デフォルトの名無しさん:2015/03/29(日) 12:02:18.59 ID:GySB0qzL.net
1行目の結論が意味わからん
符号なし以上に早くなるようには思えないんだけど

>しかしC11(ISO/IEC 9899-2011)だからそれ以前のコンパイラは違うかもしれない。
ちなみに符号なしでオーバーフローしないってのはC90からすでにあったはず
少なくともC99にはある

JISX3010:2003(C99) P.25 6.2.5 型
符号無しオペランドを含む計算は,決してオーバフローしない。
すなわち,結果を符号無し整数型で表現できないときは,その型で表現しうる最大値より1 だけ大きい数を法とする剰余を結果とする。

218 :デフォルトの名無しさん:2015/03/29(日) 12:05:40.70 ID:PjXq8DMp.net
>>217
CPUの加算や減算の機能に丸投げが最速だろう。リターン値を規定しまうとそのチェックが必要となる。
同様のことはたとえば浮動小数点数でもありえる。詳細は知らないが。

219 :デフォルトの名無しさん:2015/03/29(日) 12:09:29.93 ID:PjXq8DMp.net
CPUに丸投げしたら規定通りの動作をするCPUならそのままでよく、
規定通りには動作しないCPUで実行した時、規定通りになるように修正する部分を組み込まないといけないので
遅くなり得るということ。

220 :デフォルトの名無しさん:2015/03/29(日) 14:05:28.70 ID:GySB0qzL.net
それでなぜ符号なしよりも早くなりえるの?
最大でも同じにしかならんくない?

221 :デフォルトの名無しさん:2015/03/29(日) 14:18:06.94 ID:5KSECsA5.net
ばかか。

>規定通りには動作しないCPUで実行した時、規定通りになるように修正する部分を組み込まないといけない

こういうハードでは、

>符号あり計算のほうが速度が出る可能性はあるってことだな。

222 :206:2015/03/29(日) 14:53:51.16 ID:L3D4TSkJ.net
>>214
資料のご提示、感謝します まさに私が探していた情報です

223 :デフォルトの名無しさん:2015/03/29(日) 15:08:53.09 ID:L3D4TSkJ.net
>>219
> 規定通りには動作しないCPUで実行した時、規定通りになるように修正する部分を組み込まないといけないので遅くなり得るということ。

いまの話の流れで、ハードウェアの正常動作が保証されないことを含めて
C/C++の規格や動きを議論しても無意味ではないだろうか
フォールトトレラント系の話がしたいのなら話題を明示的に区別するべき

224 :デフォルトの名無しさん:2015/03/29(日) 15:16:48.68 ID:GySB0qzL.net
符号なし計算については何かしら修正処理が必要だけど
符号ありについてはオーバーフローを無視してよければ修正処理が必要ないようなハードウェアなら
という前提か
いったいどんなアーキテクチャなんだ

225 :デフォルトの名無しさん:2015/03/29(日) 17:53:11.97 ID:PjXq8DMp.net
コンパイラ側で応答を規定したら、ハードウェア動作の差を埋める必要があるだろ。



ビッグエンディアンとリトルエンディアン - ソフトウェアエンジニアリング - Torutk
データ交換で困ること
リトルエンディアンとビッグエンディアンの間でメモリの内容を交換する場合は、メモリの内容を正しく解釈するためにはどちらかがバイト順番を並び替える必要があります。
インターネットでは「ネットワークバイトオーダー(ビッグエンディアン)」とすることが多いです。
http://www.torutk.com/projects/swe/wiki/ビッグエンディアンとリトルエンディアン


ARMの浮動小数点演算
Floating Point Emulation (FPE)
浮動小数点命令を含んだコードを生成し、それを浮動小数点演算コプロセッサを持たないハードウェアで実行した場合、未定義命令例外や不当命令例外が発生します。
その例外をキャッチして、浮動小数点演算をソフトウェアでエミュレートし、もとのコンテキストに復帰する方法です。
Linuxシステムでは、ユーザランドで実行されるアプリケーションコードが浮動小数点命令を含んでいた場合、Linuxカーネルが例外をキャッチしてFPEをおこないます。
浮動小数点演算コプロセッサを持っていても、持っていなくても同じコードが使用できるのは、ソフトウェアライブラリを使用する場合と同じですが、
浮動小数点演算コプロセッサを持っているハードウェアの場合、高速に演算を実行できます。
一方で、浮動小数点演算コプロセッサを持っていない場合、毎回例外とコンテキストスイッチが発生するため、非常に遅くなります。
http://www.oidon.net/linux/arm-floating-point


インテルR XeonR プロセッサーとインテルR Xeon Phi? コプロセッサーの浮動小数点演算の違い | iSUS
最も大きな違いは浮動小数点例外の処理です。インテルR Xeon Phi? コプロセッサーのベクトル浮動小数点ユニットはフラグをセットしますが、
浮動小数点例外のトラップはサポートしません。VXCSR レジスターの対応するビットは保護されています。このビットを変更しようとするとセグメンテーション・フォルトが発生します。
http://www.isus.jp/article/mic-article/differences-in-floating-point-arithmetic/

226 :デフォルトの名無しさん:2015/03/29(日) 20:06:36.91 ID:GySB0qzL.net
>符号なしではオーバーフローが未定義ではないということは、符号あり計算のほうが速度が出る可能性はあるってことだな。
これへのつながりが全く分からんので符号ありと符号なしで何の差がでるのかをもう少し解説してほしい

227 :デフォルトの名無しさん:2015/03/29(日) 20:14:32.88 ID:PjXq8DMp.net
たとえば、文字列・バイト列データはビッグエンディアンに限ると言語で規定してしまえば、
直接ハードウェアから受け渡しされるデータはリトルエンディアンの可能性もありえるから
それを修正する部分を組み込まないといけないだろ。

228 :デフォルトの名無しさん:2015/03/29(日) 20:49:37.61 ID:L3D4TSkJ.net
いや、だから「たとえば―」ではなくて、直接に、符号無し整数データや符号付き整数データが操作されるときに
データの流れやCPUのどんなインプリが速度に影響を与える‥とか、そういう内容で説明しないと
無駄にわかりにくいだけだろう

229 :デフォルトの名無しさん:2015/03/29(日) 20:53:05.25 ID:PjXq8DMp.net
なにが理解されないのかが理解できない。
CPUの四則演算を直接利用すると、CPUの四則演算を演算前後で補正かけて利用するとき
前者のほうが高速動作するだろう。
前者はリターン値はハードウェア依存で、後者は言語で規定。

230 :デフォルトの名無しさん:2015/03/29(日) 20:54:35.06 ID:fSK0AMUw.net
signed で負数が1の補数でCが動いている、という話もきかないし、signed/unsigned それぞれのために1の補数と2の補数が共存している系もきいたことがないし
考えてもしかたがないことじゃないか?

231 :デフォルトの名無しさん:2015/03/29(日) 21:31:13.91 ID:GySB0qzL.net
>>229
すまんね なんか一番最初の前提を読み間違えていたようだ
符号付きでもオーバーフローを定義済みの挙動とすると符号無しよりはやくなる
と読んでしまっていた

説明してくれていたのは
仕様で未定義の部分が多ければ、その方が実装の自由度が大きい
だから符号付きはオーバーフロー時の動作はHWが自由にできるから速くできる可能性があるってことね
やっとわかりましたありがとう

232 :デフォルトの名無しさん:2015/03/29(日) 22:12:51.04 ID:L3D4TSkJ.net
【符号無し整数データの演算】
(言語仕様に適合するように)オーバーフロー発生時の処理をソフトでインプリしなければならず
そのオーバーヘッドのために処理速度が遅くなる可能性がある

【符号付き整数データの演算】
CPUが備える命令の実行結果を直接に利用すればよいので処理速度が速い

要点だけで説明すればこういうことが言いたかったのか、と想像

233 :デフォルトの名無しさん:2015/03/29(日) 23:14:25.00 ID:PjXq8DMp.net
自分は言語仕様に詳しかったり拘っていなかったので。
なんとなくunsignedのほうが高速動作するんじゃないかと思っていたが。
ループで0以上しか扱わないのに添字intを使うのもよくあるがこれには言語仕様による根拠があるのかもしれないと思った。
ほとんど場合で影響なくても遅くなりうる可能性があるからなあ。

234 :デフォルトの名無しさん:2015/03/30(月) 00:09:04.02 ID:Cu+BvQPL.net
そもそも符合無しのオーバーフローのために余分なコードを入れなきゃならないCPUなんて無いだろう
可能性だけの話なんて無意味

235 :デフォルトの名無しさん:2015/03/30(月) 01:18:06.07 ID:vd5gzrat.net
unsigned はラップアラウンドする。
8bitなら、255の次は、0になる

タイマーなどに使うか、特殊なビット演算用で、
普通の4則演算では使わない

配列の[i]インデックスなどには、
普通に、signed intを使う

236 :デフォルトの名無しさん:2015/03/30(月) 03:21:22.92 ID:AKJsrmAN.net
インデックスにsignedを使うって事は
if(i < 0) {・・・}
なんてフェイルセーフ入れてんの?

237 :デフォルトの名無しさん:2015/03/30(月) 03:32:57.95 ID:Ee2yddLD.net
配列のindexはsize_tって決まってたと思うんだけど

238 :232:2015/03/30(月) 06:06:09.41 ID:vd5gzrat.net
size_t だったか

239 :デフォルトの名無しさん:2015/03/30(月) 06:34:10.29 ID:srztvLsH.net
メモリアクセスは正負は関係なく同一ビット列なら同じ参照先だろ?

240 :デフォルトの名無しさん:2015/03/30(月) 12:23:42.35 ID:vamG2xl1.net
急に何言ってるの
新しい質問なの?

241 :デフォルトの名無しさん:2015/03/30(月) 23:23:44.69 ID:/CgEMBWR.net
>>239
int a[256]; char s = -1; unsigned char us = (unsigned char) s;
printf("--\n");
printf("%p <-- &a[ 0]\n", &a[ 0]);
printf("%p <-- &a[ -1]\n", &a[ -1]);
printf("%p <-- &a[255]\n", &a[255]);
printf("--\n");
printf("%p <-- &a[%d]\n", &a[s], s);
printf("%p <-- &a[%d]\n", &a[us], us);

を実行したら
> --
> 0xbf9fd180 <-- &a[ 0]
> 0xbf9fd17c <-- &a[ -1]
> 0xbf9fd57c <-- &a[255]
> --
> 0xbf9fd17c <-- &a[-1]
> 0xbf9fd57c <-- &a[255]
となった

242 :デフォルトの名無しさん:2015/03/31(火) 09:41:15.05 ID:IugrT7n6.net
>>241
流れがよくわからんけど、やりたいのはこう?
main()
{
char a[256];
unsigned char s = -1;

printf("%p a[255]\n", &a[255]);
printf("%p a[-1]\n", &a[s]);
}

/*
* ./a.out
* 0x7fffcd9f0e6f a[255]
* 0x7fffcd9f0e6f a[-1]
*/

243 :デフォルトの名無しさん:2015/03/31(火) 11:06:46.46 ID:HeIxUMFm.net
>>242
その場合
&a[256]はおkだけど&a[-1]は未定義だった気がする

244 :デフォルトの名無しさん:2015/03/31(火) 21:15:25.81 ID:NYpgTAud.net
少し上で、unsignedの演算で結果がオーバーフローした時の処理が問題になってましたが。
リンク先の規格に、

〜 結果を符号無し整数型で表現できないときは、
その型で表現しうる最大値より1だけ大きい数を法とする剰余を結果とする。

ってありますから、計算結果がオーバーフローしたら、アセンブラレベルでは
Carryを無視して32bitだけを取り出せばよいわけですから(int:32bit時)
そんなに煩雑な処理を追加する必要はないと思います。
CPUによるだろうけど、たかだか数命令くらいではないかな?

0xFFFFFFFF + 0xFFFFFFFE = 0x1FFFFFFFD
よって0x100000000を法とする剰余0xFFFFFFFDを返せばOK

245 :デフォルトの名無しさん:2015/03/31(火) 21:50:03.26 ID:meXl7bV+.net
誰も処理の絶対量は気にしてない 相対量の話をしていた
しかもあくまで可能性の話だけだったので実際存在する処理系やHWでどうだというのは関係ない

まあだからこそ大した意味のない話だったともいえるが

246 :デフォルトの名無しさん:2015/04/01(水) 09:00:37.99 ID:3aukNige.net
>>244
carryを無視して32bit取り出せばいいcpuは、もともと問題にしてない
上の>>216はそうならないcpuがある場合の話。はっきりい言って無意味

247 :デフォルトの名無しさん:2015/04/01(水) 15:21:58.49 ID:SQPSJK5O.net
>>246
> >>244
> carryを無視して32bit取り出せばいいcpuは、もともと問題にしてない
話が進むと後付けで条件をだしてくる奴?
「もともと問題にしてない」というなら、どのレスの、どの書き込みでそう書かれてるか示してみ

248 :デフォルトの名無しさん:2015/04/01(水) 15:29:30.25 ID:IHXA7IXr.net
>>219がまんまそれを言ってるんじゃないの

249 :デフォルトの名無しさん:2015/04/01(水) 19:16:36.38 ID:SQPSJK5O.net
>>248
216は「(言語の)規格通りの動作をする(しない)CPU」って書くべきだよな
その後のレス読んで、規定通りに動作しないというH/Wのトラブルの話と思ってたわ
サンクス!

>>244
このオーバーフロー時の動作って
特定のアーキテクチャ(x86とかSPARCとか)の話なの?それとも一般的なCPUの動作?
マシン語に疎くてスマン

250 :デフォルトの名無しさん:2015/04/03(金) 04:59:57.72 ID:EdqVb1x3.net
しかし、この話は本当によく出るな
データ型の曖昧な規格に悩まされる人がいかに多いかがよくわかる

251 :デフォルトの名無しさん:2015/04/06(月) 20:55:14.70 ID:TiB43yfl.net
あれは失敗だったな。とくにサイズ。
charは8bit、shortは16bit、intは32bit、longは64bit、と明確に決めておくべきだったな。
その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。

252 :デフォルトの名無しさん:2015/04/06(月) 20:56:14.78 ID:GsXEUmUF.net
いやいや型が実装されてない方が困るだろ

253 :デフォルトの名無しさん:2015/04/06(月) 21:15:01.21 ID:MS5/fcmB.net
別に困らないと思うけど?(´・ω・`)
どんな時に困るの?(´・ω・`)

254 :デフォルトの名無しさん:2015/04/06(月) 21:16:07.54 ID:GsXEUmUF.net
型を使おうとしたときに困る

255 :デフォルトの名無しさん:2015/04/06(月) 21:32:07.49 ID:PTrbisMT.net
どの型も実装されていない可能性があるなんていったら
可搬性を確保するのが今より更に面倒になりそう

256 :デフォルトの名無しさん:2015/04/06(月) 21:34:16.17 ID:Vdk88DGT.net
UNIXやCが育ったPDPシリーズには12、18、36bitなどのバリエーションもあり
K&Rではintはマシンの自然な処理サイズとだけ規定されていた
(さらに言えばcharが8bitとも限らない)
そういう歴史の上で書かれたCのソースコードに対して、いきなりintを32bitしか認めないと切り捨ててしまうと
あちこちで互換性の問題が噴出するだろう
ソフト資産継承の点から無理な相談ではないかな?

257 :デフォルトの名無しさん:2015/04/06(月) 21:35:00.81 ID:1b9kLnNh.net
intが32bitなんて今だから言える話だし
20年以上も前から存在する言語だからそこらへんはね

258 :デフォルトの名無しさん:2015/04/07(火) 09:16:39.14 ID:hBeZALFs.net
>>254
charとintで処理できない場合って、そんなにあるかな?(´・ω・`)

>>255
まあ、浸透してしまったから仕方ないけど、そんなにCに拘らなくても
いいんじゃないかな?(´・ω・`)

259 :デフォルトの名無しさん:2015/04/07(火) 09:22:50.66 ID:pdohDM9u.net
そのintやcharすらない可能性を考慮しないのか

260 :デフォルトの名無しさん:2015/04/07(火) 13:38:08.70 ID:hBeZALFs.net
charとintがない?それはCじゃないから、気にしなくてもいいんじゃないかな?(´・ω・`)

261 :デフォルトの名無しさん:2015/04/07(火) 14:42:12.15 ID:Tt/PIfub.net
>>260
>>>251
>> その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。

262 :デフォルトの名無しさん:2015/04/07(火) 17:13:21.18 ID:hBeZALFs.net
>>251 が何か言ったからってCが変になる訳じゃないよね?(´・ω・`)
charとintがないなら、それはCじゃない(キリッよね?(´・ω・`)

263 :デフォルトの名無しさん:2015/04/07(火) 17:54:24.00 ID:i6pEMRTg.net
>>262
>>254-255,256はCが今と違い全ての型の実装有無がコンパイラ依存とした場合に(>>251)困る例は何があるか(>>252-253)
という話への回答でしょ?レス指定したから順番に落ち着いてもう一回レス読み直してみてね?

264 :デフォルトの名無しさん:2015/04/07(火) 19:37:42.24 ID:djs4Gk4G.net
非現実的な定義をしておいて、「エヘン!俺様の勝ちぃ〜!!!」て
言うのが流行ってるの?(´・ω・`)

265 :デフォルトの名無しさん:2015/04/07(火) 19:52:07.90 ID:/U9ZAOiy.net
>>264
memset() で double やポインタを初期化しているつもりなのも、十分非現実的だよ

266 :デフォルトの名無しさん:2015/04/07(火) 19:57:02.89 ID:djs4Gk4G.net
その初期化が、いずれはその値を演算によって望むものに変えたいというなら
間違っている可能性もあるけど、単純に「まだ、何も入れていない」という状態を
設定していて、いずれは新たな値を上書きする、という意味での初期化なら100%
正しい初期化だよね?(´・ω・`)

267 :デフォルトの名無しさん:2015/04/07(火) 19:58:41.36 ID:/U9ZAOiy.net
>>266
そんな初期化をする必要があるのか?

268 :デフォルトの名無しさん:2015/04/07(火) 20:14:26.00 ID:djs4Gk4G.net
君は経験が乏しくてやったことがないだろうけど、普通のプログラマなら
大抵は経験してるよ?(´・ω・`)

269 :デフォルトの名無しさん:2015/04/07(火) 21:03:19.76 ID:i6pEMRTg.net
ただの無駄なうえ
意味のない値にもかかわらず初期化しているように見えてしまう可能性があるので害悪

270 :デフォルトの名無しさん:2015/04/07(火) 21:26:52.72 ID:/U9ZAOiy.net
free() する直前でも、つかわなくなったらその構造体のメンバに NULL を入れるようには書いてしまうなぁ‥

271 :デフォルトの名無しさん:2015/04/08(水) 00:11:05.08 ID:bms3DTdi.net
>charは8bit、shortは16bit、intは32bit、longは64bit、と明確に決めておくべきだったな。
>その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。

これにたいして、特定のコンパイラで
charやintが無ければ動かなくなるから困るというが、
動かなくてかまわないんだよ。
そのマシンでは扱えない型なんだから。
むしろ、むりして動くほうが困る。
intが16bitか32bitか64bitか分かりません、のほうが困る。
どうせ移植性がない。

272 :デフォルトの名無しさん:2015/04/08(水) 01:31:11.34 ID:qnslIA4C.net
厳密に何ビットの型が欲しいとかなら
int64_tとか環境で用意されてるtypedefされた型使うでしょ

273 :デフォルトの名無しさん:2015/04/08(水) 07:56:10.79 ID:Ll2kXDCr.net
>>271
Cプログラマとして言えば、その環境で自然なコードが生成されるのが望ましい
からそういう発想にはならない
稀にbit数に依存するコードも書くけど、そうでない場合は圧倒的に多いから

274 :デフォルトの名無しさん:2015/04/08(水) 08:17:10.01 ID:3GDRMldd.net
各型の上限or下限は決まってるんだからそれを考慮したうえでコード書くのが普通だろう
もちろんintが16bitのものは対象外 とか前提にすることもあるだろうがつまりちゃんと考慮してるってこと
intのサイズが可変だから移植性がないというのは書いたコードが悪いだけだろう

275 :デフォルトの名無しさん:2015/04/08(水) 08:23:05.99 ID:rJ1QxPv7.net
まあ普通はintN_tだよな
intなんか使わないし悩む意味がわからん

276 :デフォルトの名無しさん:2015/04/08(水) 10:32:04.08 ID:QLYO7z6z.net
移植性/可搬性はなくてよい、処理系依存で構わないっていうプログラマが世の多数派だったなら
ANSI(だっけ?)もCの規格化・標準化は行わなかっただろう

277 :デフォルトの名無しさん:2015/04/08(水) 18:54:41.74 ID:TrrKWYIM.net
変数のサイズに依存するのだったら、assert() で明示することにしている

278 :デフォルトの名無しさん:2015/04/09(木) 06:47:12.43 ID:LgkcGWd6F
テンプレート関数の部分特殊化が分かりません

279 :デフォルトの名無しさん:2015/04/10(金) 06:49:08.30 ID:nHOYt1IP.net
static_assert

280 :デフォルトの名無しさん:2015/04/10(金) 17:05:30.82 ID:nxaXc56W.net
クラスで質問です
クラスのメンバ関数で色々な関数内で頻繁に呼び出して使うようなものがあるとします

その場合、面倒なのでグローバルにしちゃうのは良くないんでしょうか
その都度インスタンス化して呼び出すのか普通なんでしょうか

281 :デフォルトの名無しさん:2015/04/10(金) 19:03:54.95 ID:6mfRBVMy.net
>>280
ポリシー次第だけど、純粋な関数ならグローバルでいい

282 :デフォルトの名無しさん:2015/04/10(金) 20:11:07.25 ID:D6HkliCl.net
>>281
純粋という意味がわからなかったですが、オブジェクトをグローバルにしちゃって
メンバ関数を呼びやすくしても、別にいいってことですよね
趣味でやってるのであまり気にしないことにします、ありがとう

283 :デフォルトの名無しさん:2015/04/10(金) 20:18:07.34 ID:78c5foiz.net
.NET(VC++)の質問です。スレチの場合は誘導頂けると助かります。

フォームを並べてイベントをコピーしようとしているのですが、
元のイベント関数のハンドラが取れず、上手く行きません。
解決策があれば教えてください。

やりたいこと:
チェックボックス等のフォームをデザイナで指定し、イベント関数もデザイナで指定します。
プログラムでこのチェックボックス等を10個ほどにコピーし、並べます。
このときにプロパティ等はコピーできますが、イベント関数がコピーできません。

デザイナで頭1つだけ指定するのは、位置決めが楽だからです。
ついでにイベントもそこに書いて、これをコピーしようとしています。
ところがEventInfo::GetRaiseMethodではnullが返ってきてしまいます。
ハンドラさえ取れれば以下と組み合わせて上手く行くはずです。
https://msdn.microsoft.com/ja-jp/library/ms228976%28v=vs.110%29.aspx

284 :デフォルトの名無しさん:2015/04/10(金) 20:18:38.92 ID:D6HkliCl.net
>>281
申し訳ない勘違いしてました、純粋の意味わかりました
確かに拘らなくてもいいかもしれないですね

285 :デフォルトの名無しさん:2015/04/10(金) 20:25:38.08 ID:AgT+3q87.net
>>280
その都度インスタンス化って事はクラス外の関数からも頻繁に呼ばれてるって事だろうから
その関数を独立させる

286 :279:2015/04/11(土) 19:55:43.05 ID:rfVEU9W7.net
ちなみにVC#だと以下でいけるのですが、VC++だと何故か駄目です。
http://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time

前から困っている点で、とらいえずいちいち書いて対応していますが、
見ていて汚いので書き直したいと思っています。
気長に待っていますので、どなたか対策をご存じの方はレスよろしくお願いします。

287 :デフォルトの名無しさん:2015/04/11(土) 19:58:29.32 ID:ijD8XqjA.net
>>286
あなたが使ってるのはC++ではなくC++/CLIです
http://peace.2ch.net/test/read.cgi/tech/1268613679/
こちらへ移動を

288 :279:2015/04/11(土) 20:54:16.24 ID:rfVEU9W7.net
>>287
了解しました。>>283,282は取り下げます。
CUDA関連スレかと思っていましたが、中身は完全にVC++のようです。
向こうで質問し直します。ありがとうございました。

289 :279:2015/04/12(日) 03:42:43.11 ID:DBf5x0AF.net
>>287
向こうで質問した結果、即答され、解決しました。
ありがとうございました。

290 :デフォルトの名無しさん:2015/04/13(月) 23:13:16.49 ID:yWe3L8ho.net
最近はプレインクリメントよりポストインクリメント使うべきなの?

291 :デフォルトの名無しさん:2015/04/13(月) 23:16:55.31 ID:gGrqgMm6.net
まともな処理系なら、ちゃんと最適化してくれるからプリでもポストでもお好きなように?(´・ω・`)

292 :デフォルトの名無しさん:2015/04/15(水) 00:36:50.19 ID:9YI/hGho.net
printfでダブルクォーテーションを含む文字列を出力したいのですが、どうすればいいか教えて欲しいです

例としては
「あ"あ"あ"」と出力したいという感じです

293 :片山博文MZ ◆T6xkBnTXz7B0 :2015/04/15(水) 00:41:01.23 ID:Be/6smJn.net
"あ\"あ\"あ\""

294 :デフォルトの名無しさん:2015/04/15(水) 00:41:06.52 ID:LX/U9UXu.net
\"

295 :デフォルトの名無しさん:2015/04/15(水) 00:41:38.59 ID:Mlfw56xY.net
printf("あ\"あ\"あ\"");

296 :片山博文MZ ◆T6xkBnTXz7B0 :2015/04/15(水) 00:44:13.93 ID:Be/6smJn.net
\に続く文字に特別な意味を持たせる、エスケープシーケンスってやつだな

297 :デフォルトの名無しさん:2015/04/15(水) 00:53:30.96 ID:9YI/hGho.net
>>293-296
ありがとうございます!
助かりました

298 :デフォルトの名無しさん:2015/04/15(水) 23:43:39.85 ID:Obn4k40R.net
創価/学会
草加/せんべい
相加/相乗平均
-
人間の書き手でも難しい「そうか」の書き分けを難なくこなすATOK2010
素晴らしいじゃないか!
これならあと5年は使えるな

299 :294:2015/04/15(水) 23:44:29.44 ID:Obn4k40R.net
すみません
誤爆しました

300 :デフォルトの名無しさん:2015/04/15(水) 23:52:34.27 ID:/EekHbuv.net
そうか

301 :デフォルトの名無しさん:2015/04/16(木) 21:49:21.30 ID:9rYj+myM.net
草加

302 :デフォルトの名無しさん:2015/04/17(金) 20:22:53.99 ID:MoAcY3k3.net
C++ではマクロじゃなくてテンプレート使えって言われますが、
マクロも併用した方がいい場合もあるんでしょうか?
マクロでクラスや関数を作るとDoxygenで見えないのが困るんですよね...

303 :デフォルトの名無しさん:2015/04/18(土) 15:33:17.56 ID:Cuf4FohB.net
コンパイラの機能の足りない時代の遺物なので極力使わない

304 :デフォルトの名無しさん:2015/04/18(土) 17:25:13.10 ID:c7W+WDWi.net
>>303
そうなんですか
これからスクラッチ開発するC++はマクロを極力使わないようにします
ありがとうございました

305 :デフォルトの名無しさん:2015/04/21(火) 17:10:39.11 ID:uO4aFmSl.net
さすがにインクルードガードくらいは使うけどね

306 :デフォルトの名無しさん:2015/04/24(金) 03:46:18.20 ID:bw7JRcc7u
このプログラムを実行するとなぜか8回目以降から計算結果(熱交換量)がおかしくなります。
今の自分の知識ではなぜそうなるか理解できません。もしわかる方がいらっしゃいましたらご教授ください。
パスは1234です。よろしくお願いします
ttp://www.dotup.org/uploda/www.dotup.org279734.txt.html

307 :デフォルトの名無しさん:2015/04/29(水) 13:39:06.86 ID:jpNn2fx2.net
>>302
__FILE__、__LINE__とかを仕込むのはマクロじゃないと出来ない
そういう特殊なの除いたらマクロはなるべく使わない方がいい

308 :デフォルトの名無しさん:2015/05/15(金) 01:59:34.69 ID:xhvpicim.net
C++の質問なのですが、ムーブコンストラクタを基底クラスのものから委譲することはできないのでしょうか?
http://ideone.com/xeOWCM

baseでは何かリソースを管理していて、ctor/copy/move/dtorを手書きしなければならないとします。
caseA(18行目)において、特殊メンバ関数は全てdefaultですが、これらは自動的に基底クラスの特殊メンバ関数を呼び出しています。
これならいいのですが、sthでもctor/copy/move/dtorを手書きしなければならなくなった場合を考えました。

caseB(23行目)では自分で定義を書きましたが、自動的にコンストラクタが委譲されることはなく、基底クラスは全てデフォルトコンストラクタで初期化されています。
それでは困るので、caseC(34行目)では基底クラスのコンストラクタや代入演算子を委譲してあげることにしました。
しかし、caseCでは、基底クラスにmoveで委譲してしまったので、派生クラスが自分にmoveできなくなってしまいました。(47, 53行目)

基底クラスで使われてないメンバ変数がムーブによって破壊されたとは考えにくいですが、
基底クラスの部分がごっそり破壊された後の派生クラスがまともに動くことは期待できませんし、規格によればムーブ後の変数の中身は未定義です。
お知恵をお貸しいただけるとうれしいです。

309 :デフォルトの名無しさん:2015/05/15(金) 02:03:53.73 ID:kZ3YQu1b.net
Swap

310 :デフォルトの名無しさん:2015/05/16(土) 02:48:21.46 ID:ghTgVRCT.net
解決しました。
N3337 17.6.5.15 Moved-from state of library types
N3337 17.3.26 valid but unspecified state
失礼しました。

311 :デフォルトの名無しさん:2015/05/18(月) 01:21:45.24 ID:5SH9kz+R1
gcov+lcovでカバレッジ取るとき

class Foo {
public:
  Foo();
private:
 std::string foo() const;
};

Foo::Foo() {
}

std::string Foo::foo() const {
 return bar();
}  // ここ

↑コメントつけたとこの行が「0%」って判定されるんだけど、
直し方とかそういうのあるかな?
最適化オプションは-O2でも-O0でも同じ。
-fno-elide-constructors 付けても付けなくても同じ。
コンストラクタの閉じ括弧には0%とも100%とも出ない。

312 :デフォルトの名無しさん:2015/05/19(火) 19:24:52.24 ID:N5/GZYgz.net
どがつくほどの初心者です。AndroidStudioについての質問なのですが、
クラスファイルにプログラムを書く。 → 後々翻訳とか色々できるようにxmlに文字列を書く。 この認識であっているでしょうか?

313 :デフォルトの名無しさん:2015/05/20(水) 21:25:37.12 ID:PX1Z5WVW.net
C++で、private変数をクラスの後方に置く風潮なのはなぜでしょう?
private,protected,publicの方が、private変数がどういう役割をしているとかいうのがコメントで書かれてるので理解しやすいとおもうのですが・・・

314 :デフォルトの名無しさん:2015/05/20(水) 22:11:13.74 ID:2T6/P0Lm.net
>>313
そんな流儀があるのか!あるのか?

315 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/20(水) 22:23:13.32 ID:TMa82PCT.net
>>313
外側からブラックボックスなインターフェイスとして見たときは、
publicなメンバーを先に注目した方が分かりやすい。
実装と仕様の分離。

316 :デフォルトの名無しさん:2015/05/20(水) 22:43:12.96 ID:hnOxWP9iB
>>313
クラスの利用者にとってはどんなprivate変数があるかなんてどうでもいいから。
電子レンジはボタン押して動いてくれたらそれでいいだろ。
中身の部品がどうなってるかなんて普通気にしない。
内部状態が変化するかどうかはメソッドのconst/非constでわかる。

317 :デフォルトの名無しさん:2015/05/20(水) 22:43:08.99 ID:f7ZuyK4S.net
座標が格納された配列またはVectorがあります。
座標は(−3000,-3000)から(3000,3000)の範囲でランダムで分布されています。
1点の座標の半径10以内にある他の座標は平均をとり、1つにまとめます。
このロジックをクールに作られる方おられますでしょうか。

318 :デフォルトの名無しさん:2015/05/20(水) 23:26:07.76 ID:BLE7pvKi.net
>>313
private なものを人目に触れる所に置いとくのはおかしい

319 :デフォルトの名無しさん:2015/05/21(木) 01:29:32.85 ID:ZhKmhhGS.net
privateメンバを完全に隠したいならPimplイディオムを使えばよい

320 :デフォルトの名無しさん:2015/05/21(木) 09:19:46.24 ID:xlNH4UEy.net
>>313
クラスの後方かどうかより、スコープが広い順に書くだろ

321 :デフォルトの名無しさん:2015/05/21(木) 10:04:24.42 ID:d9D99tdd.net
確実に使用するprivateメンバを一番上
protected, publicの順にしてるわ

322 :デフォルトの名無しさん:2015/05/21(木) 18:17:30.52 ID:GUG56MZT.net
CRTPって一つの基底クラスに対して
派生クラスが一つに定まるじゃないどすか?
virtualの代わりに使うと速くなるみたいな説明しかないのどすけど
基底クラスから一つしか派生できないのならvirtualの代わりに使う意味が
ないと思うのどすが、どんな役に立つのかおしえてください。

323 :デフォルトの名無しさん:2015/05/21(木) 18:24:08.91 ID:ZnRk/DYk.net
派生クラスは何種類でも作れるだろ
何を勘違いしてるんだ

324 :デフォルトの名無しさん:2015/05/21(木) 18:27:56.13 ID:GUG56MZT.net
あなたの方こそ勘違いしているのでは

325 :デフォルトの名無しさん:2015/05/21(木) 18:37:01.91 ID:ZnRk/DYk.net
ttp://ideone.com/mJJDpH
こういうことじゃないの?
Super1をさらに継承するパターンのことを言ってるのか?
CRTPはコンパイル時に呼び出し先が一意に決まるものにしか使えないぞ

326 :デフォルトの名無しさん:2015/05/21(木) 18:43:30.77 ID:GUG56MZT.net
だからCRTP<Super2>とCRTP<Super1>が別物なのに
virtualの代わりに使えても意味ないだろといっているのどすよ

327 :デフォルトの名無しさん:2015/05/21(木) 18:58:37.73 ID:ZnRk/DYk.net
virtualの代わりではないな
あくまでコンパイル時の静的な多態だから

328 :デフォルトの名無しさん:2015/05/21(木) 19:07:24.46 ID:WhiRQ/oN.net
あれか。
ATLみたいなやつか。

329 :デフォルトの名無しさん:2015/05/23(土) 11:05:41.37 ID:oljntYsR.net
int rc1 = func1();
int rc2 = func2();
int rc3 = func3();
int rc4 = func4();
int rc5 = func5();

if(rc1 == rc2 == rc3 == rc4== rc5 == 0){
  // こういうif判定したいんですが、
  // これだとエラーします。
}
最もスッキリした書き方教えて下さい。

330 :デフォルトの名無しさん:2015/05/23(土) 11:48:26.58 ID:UM9/stbq.net
int rc = func1();
rc |= func2();
rc |= func3();
rc |= func4();
rc |= func5();
if (rc == 0) { }

331 :デフォルトの名無しさん:2015/05/23(土) 13:23:16.67 ID:LC8CFkrw0
std::unique_ptr<Hoge> func() {
  std::unique_ptr<Hoge> hoge(new Hoge());
  return hoge;
}
std::unique_ptr<Hoge> func() {
  const std::unique_ptr<Hoge> hoge(new Hoge());
  return hoge;
}

auto fuga = func(); とやるとき
下のconst付きの方だとコンパイルエラーになるのってなんでですか?
VC2012です。

332 :デフォルトの名無しさん:2015/05/23(土) 14:24:37.13 ID:oljntYsR.net
レスありがとうございます。
利用させていただきます

333 :デフォルトの名無しさん:2015/05/23(土) 20:44:53.50 ID:oljntYsR.net
wchar_t c = 'A';
wchar_t c = L'A';
どちらも行けるんですが、どっちが正しいのでしょうか?

334 :デフォルトの名無しさん:2015/05/23(土) 20:45:50.21 ID:ojXlCtK2.net
した

335 :デフォルトの名無しさん:2015/05/23(土) 20:53:26.57 ID:oljntYsR.net
>>334
レスありがとうございます。
下ですか。上でも同じ結果になるんですが、なぜでしょうか?
良く分かりません。

336 :デフォルトの名無しさん:2015/05/23(土) 20:56:52.32 ID:ojXlCtK2.net
ANSIとUnicodeで同じコードの文字の場合、上でも下でもOK。

337 :デフォルトの名無しさん:2015/05/23(土) 20:59:13.97 ID:N5mcUzwL.net
'A' = 0x41
L'A' = 0x0041

338 :デフォルトの名無しさん:2015/05/23(土) 23:39:40.09 ID:3og+zCpJ.net
どのクラスでも同じ Context オブジェクトを参照し処理を行う場合に、
Context の受け取り方(参照の仕方)を考えると次の 2 つが思いつきました。

1. クラスに const Context* 型のメンバを用意し、適当な場所で SetCtx() でコンテキストをセットする。
 つまり、実際の処理を行うメソッドでは自クラスのメンバから Context にアクセスできる。
2. クラスメソッドの引数に const Context& を用意してメソッド内で Context にアクセスできるようにする

選択の基準としてそれぞれのメリット、デメリットを挙げてみました。
1. はデメリット無し?あえて言えば const Context* を保持しているクラスで破壊されるリスクがある?
 でもそれって shared_ptr で持たせればリスクではない?
2. はデメリットとしてメソッドにいちいち const Context& を用意しないといけない。
 メリットは Context にアクセスできる範囲が狭い。(1.は Context を使用しないメソッドでも
 Context にアクセスできる)

1. 2. どちらを選択するかの決め手が分かりません。ご教授頂けたらと思います。

339 :デフォルトの名無しさん:2015/05/23(土) 23:42:37.10 ID:pR56aZiN.net
シングルトンでもモノステートでもお好きに

340 :デフォルトの名無しさん:2015/05/24(日) 07:55:36.02 ID:hp4TWV5c.net
>>336>>337
解説ありがとうございました。
よく理解できました。

341 :デフォルトの名無しさん:2015/05/26(火) 11:49:56.88 ID:WpucxMlI.net
ダイアログを表示してEDITTEXTで入力した文を別のダイアログに作った表に表示させたいんだけどどんなふうにかけばいいですか?

342 :デフォルトの名無しさん:2015/05/26(火) 16:28:19.71 ID:UK6dK39h.net
>>341
ttp://peace.2ch.net/test/read.cgi/tech/1428570962/

343 :デフォルトの名無しさん:2015/05/27(水) 19:12:21.15 ID:YLAut6HO.net
Visual Studio Community 2013を使ってるのですが
デバッグビルドするとSTLのチェック機能やら他のいろいろな理由で実行速度が遅くなりますよね
デバッグ時でも、プログラムの部分的な箇所については速度の低下を抑えるという方法はありますか?

具体的には、自分の場合、ひとつのファイルからデータを読み込んで処理するのに
Debug版で800ミリ秒、Rlease版で40ミリ秒かかっていて、
ある処理の実行には20個ほどのファイルが必要で20秒程余分に時間がかかります。
なのでこのデータ読み取り部分の速度をデバッグ版でも高めたい、ということです。

344 :デフォルトの名無しさん:2015/05/27(水) 19:28:04.63 ID:fEfNE1Dn.net
デバッグは追加情報入れてるんだから遅くて当然。
速いかデバッグかの一択。

345 :デフォルトの名無しさん:2015/05/27(水) 19:42:11.04 ID:nCq7jW/A.net
4月からcを始めた大学生です。講義でお釣りの枚数を数えるプログラムを作ったのですが


int onedan = 1234, shiharai = 10000;
int sa, amari;

/******************************* scanf */

printf("Price? => ");scanf("%d",&amp;onedan);
printf("Payment? => "); scanf("%d",&amp;shiharai);
printf("----\n");

/******************************* balance */
amari = shiharai3 - onedan;
printf("price = %d, ",onedan);
printf("payment = %d, balance = %d\n",shiharai3,sa);
printf("----\n");

ここで amari  の部分に sa と入力すべきだったのを間違えてしまいました。
結果として、出力したデータでは、balance = の部分の数字が1555315592
、1563462560と乱数の様に表示されています。

一体何が行われているのか皆目検討もつきません。どなたかよろしくお願いいたします

346 :デフォルトの名無しさん:2015/05/27(水) 19:46:26.75 ID:fEfNE1Dn.net
saが未初期化なだけだろ。
メモリ確保時点で必ずしもゼロで初期化されない。

347 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/27(水) 19:48:35.58 ID:bhmZkUHl.net
>>345
saは初期化されてないのでゴミデータが入ってた

348 :デフォルトの名無しさん:2015/05/27(水) 19:49:17.16 ID:nCq7jW/A.net
>>346すみません。未初期化とはいったいなんでしょうか…?

349 :デフォルトの名無しさん:2015/05/27(水) 19:50:41.62 ID:nCq7jW/A.net
>>347ゴミデータとは一体…?ランダムでデータが入るのでしょうか?

350 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/27(水) 19:59:57.94 ID:bhmZkUHl.net
記憶媒体がデータを記憶する領域は、要らなくなったら再利用される。
領域が使用中かどうかやサイズなどの情報は別のどこかに記録されている。

351 :デフォルトの名無しさん:2015/05/27(水) 20:03:26.43 ID:nCq7jW/A.net
>>350ということはどこかの要らなくなった数列が利用されたということですか…?

352 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/27(水) 20:12:16.93 ID:bhmZkUHl.net
自動変数の値はCPUのレジスタか、スタック領域に格納される。
スタック領域は山を積み上げたり崩したりするように何度も再利用されている。
なので、ゴミデータが紛れ込むこともある。

353 :デフォルトの名無しさん:2015/05/27(水) 20:14:46.25 ID:nCq7jW/A.net
>>352ありがとうございます。自動変数になってしまった上に、安定しないデータなのでこの出力になったのですね。ありがとうございます

354 :デフォルトの名無しさん:2015/05/27(水) 21:18:29.51 ID:YLAut6HO.net
>>344
たとえば翻訳単位で、追加情報を必要としないということを宣言等できないものですか
必要のないところにチェックを課したり情報を追加したりして、結果人間が不便を被っても
それが当たり前、当然というのはあまり腑に落ちません。

デバッグするにしても、最初から全体を見ていくよりは、
対象を絞り込んでその周辺から徐々に視野を広げていくのが一般的でしょうし、
それに適したやり方っていうのは見つからないものですかね。

355 :デフォルトの名無しさん:2015/05/27(水) 21:32:52.03 ID:20GZswGl.net
初期化しないとゴミが入るの?
なんだこのクソ言語

356 :デフォルトの名無しさん:2015/05/27(水) 21:37:03.20 ID:smb5wI/6a
>>354
MT or MD,release or debug, 32 or 64...
の組み合わせた環境を網羅するのがMS流

357 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/27(水) 21:39:06.29 ID:bhmZkUHl.net
>>355
初期化にもコストがかかるからね

358 :デフォルトの名無しさん:2015/05/27(水) 21:46:06.10 ID:smb5wI/6a
>>355
不要なケースでやられても無意味でしょ
初期化にもコストがかかるからね
グローバルやstaticは起動時の一回で済むから暗黙的にやってやるか
自動変数は何回呼ばれるか分からないのでコストがかかるから無理だな
という一貫性のなさが糞だなーとは心底思う

359 :デフォルトの名無しさん:2015/05/27(水) 21:47:21.21 ID:smb5wI/6a
> 初期化にもコストがかかるからね
丸かぶり
なんか怖いわ

360 :デフォルトの名無しさん:2015/05/27(水) 21:42:49.68 ID:x5rosGcz.net
ゴミが入るんじゃないゴミだった領域を再利用するエコな言語なんだよ

361 :デフォルトの名無しさん:2015/05/27(水) 21:48:58.32 ID:jSIsBLLL.net
そういや翻訳単位でデバッグ情報いれるとどうなんるんだっけ?

362 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/27(水) 22:17:58.44 ID:bhmZkUHl.net
>>361
ランタイムライブラリが違う

363 :デフォルトの名無しさん:2015/05/27(水) 22:23:37.78 ID:jSIsBLLL.net
malloc/freeするとおかしくなるとかだっけ?
よくわからん。

364 :デフォルトの名無しさん:2015/05/28(木) 00:01:48.28 ID:m+TyS5r+.net
>>355
直前に使用されてた値がそのまま残ってるだけ

365 :デフォルトの名無しさん:2015/05/28(木) 00:12:14.53 ID:2DLv23cc.net
リリースビルドでデバッグ情報を付加することも可能だろ。

366 :デフォルトの名無しさん:2015/05/28(木) 00:15:27.48 ID:Xmw848ss.net
デバッグ情報入ってたらビルド名がリリースなだけ。

367 :デフォルトの名無しさん:2015/05/28(木) 00:16:06.78 ID:AnQe6xX7.net
>>343
20秒くらいなら気にすんな

368 :デフォルトの名無しさん:2015/05/28(木) 00:18:17.88 ID:Xmw848ss.net
デバッグで速度が苦になるなら、リリースビルドして
必要部分だけifとprintfで自前デバッグしたらいい。

369 :デフォルトの名無しさん:2015/05/28(木) 00:52:13.58 ID:uZXtou76f
>>365
方便だなー

370 :デフォルトの名無しさん:2015/05/28(木) 00:57:53.24 ID:CuNSMS4U.net
リリース ビルドをデバッグするには
https://msdn.microsoft.com/ja-jp/library/fsk896zz.aspx

これでいける

371 :デフォルトの名無しさん:2015/05/28(木) 05:37:24.02 ID:yUFQMWm3.net
#define f(x)
#ifdef x
a(x, #x)
#else
b(x, #x)
#endif

みたいなことってできますか

372 :デフォルトの名無しさん:2015/05/28(木) 05:46:43.57 ID:HB8xXEuW.net
#elseのときxは定義されていないから
b(x, #x)なんてできないぞ

373 :デフォルトの名無しさん:2015/05/28(木) 06:22:46.40 ID:/5YfYo57.net
失礼しました b(#x) です

374 :デフォルトの名無しさん:2015/05/28(木) 08:01:00.89 ID:B9gnu8yA.net
b(#x)の#xはfの引数のつもり?
fの引数のスコープは1行分しかないと思うが。

375 :デフォルトの名無しさん:2015/05/28(木) 08:02:19.13 ID:B9gnu8yA.net
IDがgnu

376 :デフォルトの名無しさん:2015/05/28(木) 11:45:52.12 ID:7WYWs3lt.net
#define check(MACRO)
#ifdef MACRO
std::cout << #MACRO << " is defined as " << MACRO << std::endl;
#else
std::cout << #MACRO << " is not defined" << std::endl;
#endif

みたいなことがしたかったんですが無理でしょうか
上記を吐くコードは書けたので問題ありませんが

377 :デフォルトの名無しさん:2015/05/28(木) 13:29:51.58 ID:RdBy8InI.net
「みたいな」がはっきりしないが、まあ無理

378 :デフォルトの名無しさん:2015/05/28(木) 15:10:02.66 ID:QEZThiJ2.net
しばらくC#に行ってて、C++は0xの頃で時間止まってるんだけど
今どうなってんの?
boostとかまだあるん?

379 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/28(木) 15:20:57.24 ID:BPOchcgZ.net
>>378
g++やVSでのサポートでC++11がだいぶ普及してきている。
右辺値参照とか初期化リストとかラムダとか。

380 :デフォルトの名無しさん:2015/05/28(木) 15:23:25.27 ID:AnQe6xX7.net
c++からヘッダーファイルと言う
物が無くなれば物凄くやり易く
なると思う。

381 :デフォルトの名無しさん:2015/05/28(木) 15:26:04.02 ID:BPOchcgZ.net
>>380
それはあり得ない

382 :デフォルトの名無しさん:2015/05/28(木) 15:47:31.06 ID:otFcwpTV.net
C++からヘッダーをなくしたのが、C#でありJavaだな。
importやusingが必要な時点であんま変わらんけど、
これらは省略のためで必須ってわけでもないし微妙だな。

383 :デフォルトの名無しさん:2015/05/28(木) 16:25:44.63 ID:BS3T4776.net
うむ 今さらC/C++をいじくるより Java+ とか D- とかを進めるのが賢明

384 :デフォルトの名無しさん:2015/05/28(木) 16:51:03.32 ID:ttn+1yST.net
C++17でモジュールがどうたらって話あるみたいだけど具体的にどういう形になんの?

385 :デフォルトの名無しさん:2015/05/28(木) 17:19:15.30 ID:CtCSkEBs.net
ヘッダーファイルがなくなるってのは、要するにこうか
工程表から材料リストがなくなればものすごくやりやすくなる

???

386 :デフォルトの名無しさん:2015/05/28(木) 19:57:17.98 ID:uGepSntc.net
>>376
とりあえず#defineは改行したらそこで終了な

387 :デフォルトの名無しさん:2015/05/28(木) 21:42:18.31 ID:gCuhL1rI.net
頭がくらくらしてくるな。

388 :デフォルトの名無しさん:2015/05/29(金) 04:36:20.44 ID:QmBB8Gwr.net
>>386
\を忘れてるだけじゃないのか

389 :デフォルトの名無しさん:2015/05/29(金) 04:43:17.37 ID:ru3QOXEM.net
#ifdef MACRO \
なんてできるの?

390 :デフォルトの名無しさん:2015/05/29(金) 08:21:49.91 ID:VcfS7+TO.net
プリプロが2パスならいけそう

391 :デフォルトの名無しさん:2015/05/29(金) 15:32:15.71 ID:Efq5+4ix.net
#include <functional>

class Item {
public:
static void use();
static void use( Character* target );
static void drop();
};

int main (){
//すべてOK
void ( *pUse1 )() = Item::use;
void ( *pUse2 )( Character* ) = Item::use;
void ( *pDrop )() = Item::drop;

//エラー
std::function< void ( void ) > fUse1 = Item::use;
//エラー
std::function< void ( Character* ) > fUse2 = Item::use;
//OK
std::function< void ( void ) > fDrop = Item::drop;
}

オーバーロードしたstatic変数を代入したいのですが、std::functionに代入できません。
同じ型の関数ポインタには入れられます。
何が間違っているのでしょうか。

392 :デフォルトの名無しさん:2015/05/29(金) 17:05:56.31 ID:0BflXGeZv
>>391
http://stackoverflow.com/questions/10111042/wrap-overloaded-function-via-stdfunction

393 :デフォルトの名無しさん:2015/05/29(金) 18:46:53.04 ID:gXnjRwZ6.net
useの名前がぶつかってんのかなぁ?
片方名前変えてみたら?

394 :デフォルトの名無しさん:2015/05/30(土) 00:26:33.80 ID:qC/pm06Q.net
>>391
キャストすれば入るよ
ラムダ式はさんでもいいけど

395 :デフォルトの名無しさん:2015/05/30(土) 20:34:59.91 ID:h4Yx63EK.net
>>394
まじでキャストで行ける?
やり方がわからん。
ソースプリーズ

396 :デフォルトの名無しさん:2015/05/31(日) 02:29:37.40 ID:jd6mwSd4l
>>395
>>392

397 :デフォルトの名無しさん:2015/05/31(日) 16:10:45.18 ID:456RRL4M.net
初歩的ですみません配列の質問です


const int N =100;
double* K = new double[2 * N];

for (int n = 0; n < N; n++){
K[2 * n] = -2
K[2 * n + 1] = 1
}


Kは2行N列の配列ですよね?後、下のfor文でどのように数値を格納しているのか教えてください><

398 :デフォルトの名無しさん:2015/05/31(日) 16:14:18.96 ID:SZ/HavyK.net
1ループ内で偶数と奇数に分けて代入してる

399 :デフォルトの名無しさん:2015/05/31(日) 16:29:02.30 ID:456RRL4M.net
>>398
ありがとうございます
続けてお願いします
例えば、三重対角行列の格納なんですけど

for (int i = 0; i < N; ++i){
for (int j = 0; j < N; ++j){
if (j == i - 1) K[j*N + i] = 1.0 ;
if (j == i) K[j*N + i] = -2.0 ;
if (j == i + 1) K[j*N + i] = 1.0;
}
}

これは対角成分が-2、その上下が1になると分かってるんですが、for文の中のK[j*N +i]ってどういう意味なんですか?

400 :片山博文MZ ◆T6xkBnTXz7B0 :2015/05/31(日) 16:40:31.40 ID:t8jPrrOm.net
0≦i,j<Nのとき、f(i,j)=j*N + iで定義される写像f:[0,N)×[0,N)→[0,N×N)が全単射になることを
利用している。一次配列を多次配列のように使うテクニックだね。

401 :デフォルトの名無しさん:2015/05/31(日) 17:04:30.79 ID:2zIxob7P.net
>for文の中のK[j*N +i]ってどういう意味なんですか?
配列Kのj*N +i番目の要素だろ。

402 :デフォルトの名無しさん:2015/05/31(日) 17:41:00.83 ID:456RRL4M.net
385です
ありがろうございました、変な勘違いしてました

403 :デフォルトの名無しさん:2015/06/07(日) 18:05:23.63 ID:lDA49rz+.net
オブジェクト思考の設計の話なんですが、

データを同じ詰め方(set)ができる、数種類のクラスがあったとして、
それぞれに共通のI/Fを持たせたい

素直に考えると、それらの親クラスにI/Fを持たせるのだと思うのだけど、
それら複数のクラスより親を作ることができない制約がある

その場合、どこにI/Fを用意して、どこに実装したらいいですか?

当方、C言語に毛が生えた程度の使い方しかしてこなかったので、
仮装関数用意するとかやったことなく、
どうすればスマートなのかなと

404 :デフォルトの名無しさん:2015/06/07(日) 18:08:28.47 ID:xCcw73lL.net
Facadeパターンでは?

405 :デフォルトの名無しさん:2015/06/07(日) 18:43:03.25 ID:IR8285sC.net
TECHSCOREのFacadeパターンの例を見るたびに
中村くんへの丸投げで中村君が高負荷で倒れないか心配になる

406 :デフォルトの名無しさん:2015/06/10(水) 21:04:07.34 ID:EVVFhxwz.net
委譲をされたクラスって解放されるタイミングはいつになる?
委譲したクラスを解放するとデストラクタが呼ばれて
ちゃんと解放される?

407 :デフォルトの名無しさん:2015/06/10(水) 23:07:32.55 ID:hIQNRZvl.net
されなきゃ困る

408 :392:2015/06/11(木) 00:28:55.17 ID:phbL6DGJ.net
なんどもすまないが
ポインタで委譲しても当然同じく解放されるよね?

409 :デフォルトの名無しさん:2015/06/11(木) 00:33:38.30 ID:ESr81XRP.net
されるわけねーだろ

410 :392:2015/06/11(木) 00:42:19.12 ID:phbL6DGJ.net
deleteいる?

411 :デフォルトの名無しさん:2015/06/11(木) 00:43:08.55 ID:wPKRrOhd.net
なぜいらないと思ったのか

412 :デフォルトの名無しさん:2015/06/11(木) 03:45:48.27 ID:KWkffMj/.net
最少構成で試してみたらいいのに

413 :デフォルトの名無しさん:2015/06/11(木) 03:48:02.27 ID:daO6fC9u.net
それ言ったらほとんどが試してみろで済んじゃう…

414 :デフォルトの名無しさん:2015/06/11(木) 03:49:45.65 ID:ESr81XRP.net
実際それで済む

415 :デフォルトの名無しさん:2015/06/11(木) 04:12:46.18 ID:xl+1bn71.net
>>413
試してわからないなら聞くのが普通

416 :デフォルトの名無しさん:2015/06/11(木) 10:12:44.12 ID:MCnGDuRk.net
このレベルで試して検証なんて無理だべ

417 :デフォルトの名無しさん:2015/06/11(木) 23:40:16.41 ID:phbL6DGJ.net
C++における宣言と定義と生成の
意味を教えて下さい

418 :デフォルトの名無しさん:2015/06/12(金) 09:26:21.74 ID:L7aZuwN6.net
なんで「C++相談室」で聞かないの?(´・ω・`)

419 :403:2015/06/12(金) 11:29:09.30 ID:ZzMiSOW4.net
ここで聞いても良いじゃないか(´・ω・`)

420 :デフォルトの名無しさん:2015/06/12(金) 12:55:42.13 ID:Qvm3BcbJ.net
何で調べないの?

421 :デフォルトの名無しさん:2015/06/12(金) 16:53:56.75 ID:GqZkqTHr.net
なんで教えてくれないの?

422 :デフォルトの名無しさん:2015/06/12(金) 21:47:39.48 ID:ju6p67Z1.net
>>417
宣言と定義はともかく生成というのはなんだろう?instantiate?

423 :デフォルトの名無しさん:2015/06/12(金) 21:58:17.50 ID:sUePbdZr.net
せめて入門書読んでから言語触ろうよ…
掲示板で聞くまでもない質問スレじゃないんだぞ

424 :デフォルトの名無しさん:2015/06/12(金) 22:35:35.27 ID:GqZkqTHr.net
あほかそれじゃスレが伸びないだろ。

425 :デフォルトの名無しさん:2015/06/12(金) 23:44:10.07 ID:mLuCQ1ez.net
別に伸ばすためのスレじゃないしな

426 :デフォルトの名無しさん:2015/06/13(土) 01:13:45.28 ID:05Jv17Sn.net
おるわおるわw
「じゃあこのスレいらないよね?」ってやつw

いらないから自分で調べてね^^

427 :デフォルトの名無しさん:2015/06/15(月) 02:24:44.83 ID:YoDUUVOd.net
////////////main.cpp
#include <iostream>
#include "singltonClass.h"
#include "TestClass.h"

int main()
{
singltonClass* test = singltonClass::Instance();
test->setAtai(1000);
printf("%d\n" , test->getAtai());

TestClass &singleton = TestClass::getInstance();
singleton.setAtai(2000);
printf("%d\n" , singleton.getAtai());

return 0;
}

428 :デフォルトの名無しさん:2015/06/15(月) 02:27:53.55 ID:YoDUUVOd.net
////////////singltonClass.cpp
#include "singltonClass.h"

singltonClass::singltonClass()
{
printf("sinngltonClass 生成\n");

atai = 0;
}
singltonClass::~singltonClass()
{
printf("sinngltonClass 解放\n");
}

singltonClass* singltonClass::Instance()
{
static singltonClass* instonce;
return instonce;
}

void singltonClass::setAtai(int atai)
{
this->atai = atai; //ここで落ちる
}
int singltonClass::getAtai()
{
return atai;
}

429 :デフォルトの名無しさん:2015/06/15(月) 02:29:40.06 ID:YoDUUVOd.net
////////////singltonClass.h
#include <iostream>

class singltonClass
{
private:
singltonClass();
~singltonClass();

public:
static singltonClass* Instance();
int atai;
void setAtai(int atai);
int getAtai();
};

430 :デフォルトの名無しさん:2015/06/15(月) 02:30:11.52 ID:TWn3hn91.net
>static singltonClass* instonce;
落ちるに決まってんだろ
それにinstonceってなんだよ

431 :デフォルトの名無しさん:2015/06/15(月) 02:32:50.12 ID:YoDUUVOd.net
//////////////TestClass.cpp
#include "TestClass.h"

TestClass::TestClass()
{
printf("TestClass 生成 \n");

atai = 0;
}
TestClass::~TestClass()
{
printf("TestClass 解放 \n");
}

TestClass &TestClass::getInstance()
{
static TestClass instance;
return instance;
}

void TestClass::setAtai(int atai)
{
this->atai = atai;
}
int TestClass::getAtai()
{
return atai;
}

432 :デフォルトの名無しさん:2015/06/15(月) 02:35:02.91 ID:YoDUUVOd.net
//////////////TestClass.h
#include <iostream>

class TestClass
{
private:
TestClass();
~TestClass();

int atai;

public:
static TestClass &getInstance();

void setAtai(int atai);
int getAtai();
};

433 :デフォルトの名無しさん:2015/06/15(月) 05:30:01.88 ID:cIly8SrJ.net
>>432
これはどうなったんだ

【初心者歓迎】C/C++室 Ver.94【環境依存OK】(c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1417257762/679
679 名前:デフォルトの名無しさん[age] 投稿日:2015/06/11(木) 23:44:32.66 ID:phbL6DGJ
// main.cpp
#include "TestClass.h"
// TestClass.cpp
#include "TestClass.h"
// TestClass.h
mainでTestClassを生成した場合
main.cppがTestClass.hを認識出来るのは分かるけど
TestClass.cppはどうやって認識しているの?

434 :デフォルトの名無しさん:2015/06/15(月) 07:23:10.09 ID:YoDUUVOd.net
こんな感じでシングルトンクラスを作ってみて
TestClassは大丈夫なんだけど
singltonClassで値を入れようとするとアクセス違反で落ちる・・・
詳しく理由を教えてほしい

435 :デフォルトの名無しさん:2015/06/15(月) 08:00:52.13 ID:stx1FStm.net
>>430

436 :デフォルトの名無しさん:2015/06/15(月) 08:41:04.40 ID:P9xXTUaw.net
instonce の値が 0 だからじゃない?

437 :420:2015/06/15(月) 11:40:03.70 ID:mHyo0Y7D.net
>>430
だからなぜそれだと落ちるのか聞いてるんだYO

438 :デフォルトの名無しさん:2015/06/15(月) 12:07:59.32 ID:x90+VGun.net
static singltonClass instonce;これはインスタンス
static singltonClass* instonce これは ぬるぽ
ぬるぽ呼んだら落ちるに決まってるだろ

439 :デフォルトの名無しさん:2015/06/15(月) 12:14:08.76 ID:x90+VGun.net
コードそのままで修正するなら
static singltonClass* instonce = new singltonClass;

440 :デフォルトの名無しさん:2015/06/15(月) 12:17:05.18 ID:x90+VGun.net
つかなんだこの板…
いくら何でも質落ちすぎだろ

441 :デフォルトの名無しさん:2015/06/15(月) 12:30:17.60 ID:HDA/Cn6G.net
そういう受け皿も必要

442 :420:2015/06/15(月) 13:48:45.29 ID:mHyo0Y7D.net
TestClass &TestClass::getInstance()
singltonClass *singltonClass::Instance()
ってなにが違うの? &と*って同じじゃないの?
これが分かれば疑問が解けそう

443 :デフォルトの名無しさん:2015/06/15(月) 13:56:54.34 ID:HDA/Cn6G.net
>>442
そっちじゃなくて、何を返してるのかだよ

singltonClass instonce;
の &instance と
singltonClass * instonce = new singltonClass();
の instance がほぼ同等
newしてないやつは実体がないだろ。

444 :デフォルトの名無しさん:2015/06/15(月) 13:58:49.85 ID:P9xXTUaw.net
同じ意味なら記号変えるとかただの無駄な件

445 :420:2015/06/15(月) 14:25:07.45 ID:mHyo0Y7D.net
ありがとう
このままだとMULLだからnewで生成する必要があるのは分かった

最後に知りたいのが & の意味で
& を外すとエラーになるのが理解できない

あと & と * って同じじゃないの?

446 :デフォルトの名無しさん:2015/06/15(月) 14:44:00.83 ID:P9xXTUaw.net
ポインタと参照について要勉強だな

447 :デフォルトの名無しさん:2015/06/15(月) 15:15:27.32 ID:HDA/Cn6G.net
参照を返すかポインタを返すかの違いで実質は同じ、、とも言える
演算子としての&と参照としてのそれと混乱してる?

448 :デフォルトの名無しさん:2015/06/15(月) 15:16:58.79 ID:cIly8SrJ.net
>>445
int i = 10, *p;
p = &i;

この状態で*p = i = 10

449 :420:2015/06/15(月) 15:50:47.14 ID:mHyo0Y7D.net
ごめん

TestClass &TestClass::getInstance()
{
static TestClass instance;
return instance;
}

singltonClass *singltonClass::Instance()
{
static singltonClass Instance;
return Instance;
}

の違いが分からない・・・
TestClass::getInstanceでは何が起こっているの?

450 :デフォルトの名無しさん:2015/06/15(月) 15:57:14.24 ID:P9xXTUaw.net
何も起こってない

むしろsingltonClass::Instance()のコンパイル通る方が深刻

451 :デフォルトの名無しさん:2015/06/15(月) 16:03:25.21 ID:P9xXTUaw.net
>>448のレスに倣えばこういうこと

int x = 0;
int& q = x;
q = 10; // x = 10

452 :420:2015/06/15(月) 16:11:31.47 ID:mHyo0Y7D.net
TestClass &TestClass::getInstance()
{
static TestClass instance;
return instance;
}

これだと正常に動作して

TestClass TestClass::getInstance()
{
static TestClass instance;
return instance;
}

こんな感じで & を外すと
main.cppでTestClassを生成しようとするとコンパイルエラーになる
ごめん、これが分からない・・・

453 :デフォルトの名無しさん:2015/06/15(月) 16:14:51.03 ID:P9xXTUaw.net
コンストラクタ/デストラクタがprivateだからじゃないの?

454 :420:2015/06/15(月) 16:42:12.89 ID:mHyo0Y7D.net
& をつけるとコンストラクタ/デストラクタがprivateでも大丈夫な理由を教えて下さい
何度もすみません、ここが分からないんだ

455 :デフォルトの名無しさん:2015/06/15(月) 16:49:19.72 ID:HDA/Cn6G.net
単に外したらインスタンスのコピーが渡されるから、デストラクタが外から呼ばれることになるべ

456 :420:2015/06/15(月) 17:08:37.28 ID:mHyo0Y7D.net
そういうことか分かったぁぁぁぁぁぁ!!!
関数のアドレスを渡してるから
関数を実行しているのはTestClass本体ってことか!!!
だからprivateでも問題ないと!!!!
ありがとbfヴぃbfdgb!!!

457 :420:2015/06/15(月) 17:11:26.95 ID:mHyo0Y7D.net
何度も質問してからこんなこと聞くものあれなんだけど
一般的にシングルトンってTestClassのやりかたが主流?
他になんか良いやり方がある?

458 :デフォルトの名無しさん:2015/06/15(月) 18:29:21.08 ID:ks4U7BG0.net
>>457
ググれアホ

459 :デフォルトの名無しさん:2015/06/15(月) 19:02:51.79 ID:FZwBA5EA.net
適当なCかC++入門サイト開いて、
ポインタについてしっかり頭に叩き込んでからまたおいで

460 :デフォルトの名無しさん:2015/06/19(金) 12:26:01.40 ID:ybHitNmNK
クラスAがクラスBのインスタンスbの参照をconst付きで持つことは出来ませんか?
やりたいことはこんな感じです
class A {
public:
A(const B& b) { inst = b };
const B& inst;
};

461 :デフォルトの名無しさん:2015/06/19(金) 12:49:50.65 ID:q7REsHeZf
>>460
「C++ コンストラクタ 参照 初期化子」でggrks
ちなみに const は関係ない。
エラーメッセージ出てるよな。質問するときにはメッセージ貼りなされ。

462 :デフォルトの名無しさん:2015/06/23(火) 19:12:27.44 ID:coxulpee.net
教えてください。
typedef vector<int> v1;
typedef vector<v1> v2;
typedef vector<v2> v3;

typedef vector<vn-1> vn;

みたいなことやりたいんですが、テンプレートでうまくまとめられませんか。

463 :デフォルトの名無しさん:2015/06/23(火) 21:47:23.20 ID:qkxeTacg.net
>>462
一体nはどれくらいの値を想定している?
vectorをあんまり沢山入れ子にすると訳分からない状態になるぞ。

464 :デフォルトの名無しさん:2015/06/23(火) 21:54:26.48 ID:coxulpee.net
>>463
実を言うと本当はvectorの入れ子じゃなくて自作のクラスの入れ子なんですけど、
自作クラスの説明が面倒くさいからvectorに置き換えました。
nは10位ですかね。

465 :デフォルトの名無しさん:2015/06/23(火) 22:00:49.15 ID:qkxeTacg.net
参考までに聞きたいのだが、どういう用途のアプリで、そういうデータ構造が必要になるの?

466 :デフォルトの名無しさん:2015/06/23(火) 22:03:13.38 ID:qkxeTacg.net
vectorを10個入れ子にして、どうやってデータを取り出す?

467 :デフォルトの名無しさん:2015/06/23(火) 22:06:36.66 ID:coxulpee.net
いや、完全に趣味のコードなんですけどw
整数型2つメンバにもって多倍長整数にするクラスを作ろうとしてる。

template<class T>
class doubleInt
{
T hi,lo;
...
};

typedef duobleInt<unsigned int> Int64;
typedef doubleInt<Int64> Int128;
typedef doubleInt<Int128> Int256;


みたいな感じ。

468 :デフォルトの名無しさん:2015/06/23(火) 22:15:43.63 ID:qkxeTacg.net
>>467
それなら、わざわざややこしい入れ子にしなくても、10倍長計算に必要な領域を
配列か何かで int work[10] みたいに確保しておいて、それ使って計算すればいいんじゃないか?

469 :デフォルトの名無しさん:2015/06/23(火) 22:18:38.19 ID:qkxeTacg.net
ああ、work[10]じゃあ足りないか。

470 :デフォルトの名無しさん:2015/06/23(火) 22:23:15.99 ID:coxulpee.net
>>468
そこはロマンというかw
テンプレート使える俺かっこいい的なw

471 :デフォルトの名無しさん:2015/06/23(火) 23:57:56.03 ID:/nLjrxmH.net
これ明らかに使わないだろ

template<template<class...> class Container, class Type, size_t num> struct NestContainer {
typedef Container<typename NestContainer<Container, Type, num - 1>::type> type;
};
template<template<class...> class Container, class Type> struct NestContainer<Container, Type, 0> {
typedef Type type;
};

/*
template<class Type> using MyVector = std::vector<Type, std::allocator<Type>>;
template<size_t num> using VInt = typename NestContainer<MyVector, int, num>::type;
*/
template<size_t num> using VInt = typename NestContainer<std::vector, int, num>::type;

int main() {
using namespace std;
VInt<0> i; //int
VInt<1> a1; //vector<int>
VInt<2> a2; //vector<vector<int>>
i = 100;
a1.push_back(0);
a1.push_back(10);
a2.push_back(a1);
cout << i << endl;
for(auto &it : a2) for(auto &it2 : it){
cout << it2 << endl;
}
return 0;
}

472 :マ○コデラックス:2015/06/23(火) 23:59:17.67 ID:bwjeXC/X.net
スレ立てるまででもない質問ってどんなの?

473 :デフォルトの名無しさん:2015/06/24(水) 11:52:28.38 ID:67aeQTeE.net
趣味で作る多倍長計算プログラムか‥ いいねぇ πとか計算するのかな?
今はGMPとかあるからなー
良い時代になったもんだ

474 :QZだ信じれ:2015/06/27(土) 14:03:24.53 ID:KcwTZCGl.net
足し算だけで力尽きた‥
いつか割り算を実装してから『素数』を数えて落ち着くんだ‥

475 :デフォルトの名無しさん:2015/06/27(土) 15:13:43.86 ID:07vULyYd.net
>>474
素数の計算だけでしたら、エラトステネスのふるい法でどうでしょうか。
unsigned int 形の配列を生成し、先ず最初にその整数型のなかに頭から1を
埋め込み、これを3から始まる奇数と考えます。そうすると、例えば3ビット目は7
となるわけです。
こうして置いて3の倍数に当たるビットを0にする、5の倍数に当たる
ビットを0にする、……
として於いて、必要な桁数だけ終了したら、1のビットの位置を計算して
その値を出力すれば、素数表ができると思います。
例:
        3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33
最初の状態  :1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1....
3の倍数を消す:1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1...
5の倍数を消す:1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1
以下同様

もっと効率のよい方法としては、
『電子計算機のための数値計算法』II(山内二郎・森口繁一・一松信、培風館)

「第5章 Eratosthenesのふるいによる素数の計算」
をご覧いただければと思います。
とんでもない思い違いをしているかもしれません。その節はご容赦
をお願いいたします 

476 :デフォルトの名無しさん:2015/06/27(土) 21:13:58.41 ID:v21lmC3z.net
しょうもない質問ですいません

char *AA="hello world";
int n=sizeof(AA)/sizeof(AA[0]);

これを実行するとnには4が必ず入ってしまうのですがなぜなのでしょうか
実行環境はVisual C++ 2010 Expressです

477 :デフォルトの名無しさん:2015/06/27(土) 21:19:14.85 ID:K06hVkJE.net
>>476
多分、4/1を計算しているからだと思う。

478 :デフォルトの名無しさん:2015/06/27(土) 21:20:38.90 ID:JzcDXnUr.net
>476
32ビットアプリですね?
ポインタのサイズをchar のサイズで割るから当たり前です。

479 :デフォルトの名無しさん:2015/06/27(土) 21:27:09.14 ID:K06hVkJE.net
>>476
それにしても
char *AA
なんて変数名付ける奴初めて見たわ。
何で大文字なんだよ?
何でAA何だよ?
見れば見るほど変だぞ。

480 :デフォルトの名無しさん:2015/06/27(土) 21:28:36.30 ID:oXqh0l6v.net
大文字はマクロだと決まってる

481 :デフォルトの名無しさん:2015/06/27(土) 22:26:08.63 ID:v21lmC3z.net
>>477
なぜ*AAのアドレスのサイズが4byteなのでしょうか・・・

482 :デフォルトの名無しさん:2015/06/27(土) 22:31:26.25 ID:e2zMBxYg.net
ポインタのサイズだからだろ
sizeof(char*)は32bit環境だと大体4だろ

483 :デフォルトの名無しさん:2015/06/27(土) 22:47:11.23 ID:9MGfZNNc.net
charでもintでも、32bitの環境ならそのアドレスはどちらも4byte

484 :デフォルトの名無しさん:2015/06/27(土) 23:02:33.19 ID:++FZGhMS.net
ひょっとして12になることを期待(予想)してたのかなぁ

485 :デフォルトの名無しさん:2015/06/28(日) 00:58:59.21 ID:IZhI7buf.net
むしろ11になることを期待していたと予想

486 :デフォルトの名無しさん:2015/06/28(日) 03:48:23.85 ID:YhCvVIgA.net
>>475
その方法だと,最初から求めたい地点まですべて「オンメモリ」なのが辛いところです.
といって試し割り素朴法は計算が遅い
そこで,そのハイブリッドを考えています
オンメモリの素数を調べる部分は先端だけで十分だと思うのです

487 :デフォルトの名無しさん:2015/06/28(日) 07:57:05.85 ID:q4v0PqzP.net
>>479
本題以外で突っ込むとか変だぞ

488 :デフォルトの名無しさん:2015/06/28(日) 08:46:19.67 ID:EIkqw89x.net
>>486
前述の「電子計算機のための数値計算法 II』には
求めた素数を一旦外部記憶装置に記憶させておいて、
その値を使って新しくチェックする云々と書いてあります。
入出力に時間がかかりますが、これだとたしかにメモリーの
消費が少なくなりますが……
是非一度、上記の書籍の該当箇所をご覧ください。
小生の生半可な説明よりは、ずっとよいと思いますので。
ご検討をお祈りしております。
結果のご報告をお待ちしております。

489 :デフォルトの名無しさん:2015/06/28(日) 10:22:05.93 ID:Z3SmjTo/.net
>>489
ご紹介いただいた書籍には「素数を外部装置に記録する」方法と
エラトステネスの篩とを併用する方法は紹介されていますか?
そうでなければ興味はわきません

490 :デフォルトの名無しさん:2015/06/28(日) 10:23:14.25 ID:M4OFumRq.net
>>486
試し割り素朴法を使うにしても、無駄を省くために平方根の多倍長計算ルーチンは実装しておきたいところですよね。
除算や平方根を楽に(?)計算するNewton-Raphson法というのがあるようです。ご参考までに。
http://円周率.jp/method/newton.html

>>487
> >>479
> 本題以外で突っ込むとか変だぞ
話し合ってる問題の本質と無関係なところで揚げ足をとって騒ぐ
こういうバカは、会社でも一定数存在するな。たいてい会議が無駄に長引く元凶。

491 :デフォルトの名無しさん:2015/06/28(日) 10:37:39.95 ID:Z3SmjTo/.net
>>490
試し割り素朴法では、平方根の計算は実は必要ありません。
試し割りの商と割数とを比較すればいいからです。
それにニュートンラプソンは実装が面倒な浮動小数点が必須、わざわざややこしい世界に手を広げる必要はありません。

素数を数えておちつくんだ!

492 :デフォルトの名無しさん:2015/06/28(日) 11:13:06.74 ID:2/AXk5Qq.net
クラス内のvectorってダメ?
ただの二成分量のクラスを作ったんだが
vectorにすると急に遅くなった(g++ -O3)

493 :デフォルトの名無しさん:2015/06/28(日) 12:21:10.02 ID:rotd9Dcd.net
>>492
それだけの情報で答えるなんて適当なことしか言えないよ
プロファイル取って何が問題になってんのか調べな

494 :デフォルトの名無しさん:2015/06/28(日) 14:29:17.61 ID:l/YNGXJW.net
時代に付いていこうとスマートポインタ勉強してるんだけど
クラスのメンバに持ってる std::unique_ptr の参照をゲッターで外に出すのって普通?
std::shared_ptr をメンバに持って std::shared_ptr<T> Class::Getter() の方が良いの?

495 :デフォルトの名無しさん:2015/06/28(日) 15:41:33.49 ID:Iw80ONOH.net
スマポなんてとっくに時代遅れだろ
今はガベコレが主流だよ

496 :デフォルトの名無しさん:2015/06/28(日) 16:17:14.22 ID:l/YNGXJW.net
C++にGCないやん……Boehm?
というかそのGCを趣味で実装しようとしてるのでGCは使えないのです

生ポインタ使うよりはモダンかなと思ってたんだけどどうなのかな
使ってみるとスマポと生ポインタが混在してるのが気持ち悪くなっちゃって
どうにかスマポか参照に置き換えようとしてる

497 :デフォルトの名無しさん:2015/06/28(日) 16:21:16.22 ID:OeLQkQMR.net
スマポ便利って言うけど今までナマポで不便感じた事ないしこれからもナマポで行くかな。

498 :デフォルトの名無しさん:2015/06/28(日) 16:34:44.44 ID:UiBucRXh.net
つalloca

499 :デフォルトの名無しさん:2015/06/28(日) 16:38:40.66 ID:OeLQkQMR.net
>>498
malloc/freeじゃあ駄目なのか?

500 :デフォルトの名無しさん:2015/06/28(日) 16:41:21.52 ID:l/YNGXJW.net
スマポの話だったから解放処理書かなくてすむmallocの代替品ってことなのでは?>alloca
でもヒープメモリが欲しいんや……

501 :デフォルトの名無しさん:2015/06/28(日) 17:12:47.69 ID:Iw80ONOH.net
CoTaskMem使おうよ

502 :デフォルトの名無しさん:2015/07/06(月) 17:46:05.01 ID:Bbdz7Dci.net
遺伝的アルゴリズムで調べてたら
wikiの手順説明には
・選択
・交叉
・突然変異
・コピー
(下3つはそれぞれ設定された確率で起こる)
みたいにあるけど生物界では必ず交叉起こるはずだよな?

・選択(重複無し)
・交叉(必ず起こる)
・突然変異(低確率で起こる)
・コピー(起こらない)
にした方がいいと思うんだが

503 :デフォルトの名無しさん:2015/07/06(月) 18:55:53.85 ID:QWNNDY2V.net
それでいい結果が得られるんならそうすれば

504 :デフォルトの名無しさん:2015/07/06(月) 19:17:47.96 ID:L4KLNmyL.net
別に生物界の遺伝をシミュレートしてるわけじゃないだろこのスットコドッコイ

505 :デフォルトの名無しさん:2015/07/06(月) 19:39:45.55 ID:Bbdz7Dci.net
>>504
腑に落ちたありがとう

506 :デフォルトの名無しさん:2015/07/08(水) 05:54:43.37 ID:8R+nhtCy.net
visual studio で組み込み開発

ターゲットはwindows8タブレット


ターゲットのexeに対してvisual studioからクロスコンパイル環境でデバッグしたいのだが上手くいかない。

対象アプリケーションはexeを叩いて直接起動するのではなく
サービスをスタートする事でexeが立ち上がる仕組み。
visual studioでそこにアクセスする為にはプロセスにアタッチするしかないのかなとみている。
プロセスにアタッチだとクロスコンパイルできないですよね?

今はソースを変えると
→いちいちサービス止めて
→ホストでビルドしてできあがったexeを手動でリモートに送り
→またサービスを立ち上げて
→リモートのプロセスにアタッチ

みたいな事やってるけど、超面倒。
こんな事やってられないけど、これ以外に手段ないですよね?

507 :デフォルトの名無しさん:2015/07/08(水) 09:40:39.03 ID:P1nDZAUb.net
VC、MS環境の組み込みは経験ないけど、
OSが同じなら、一旦セルフ環境でデバッグ済ませてしまえば?と思うのだが

まぁアタッチしないといけない理由は他にありそうな気もするが

508 :デフォルトの名無しさん:2015/07/08(水) 10:04:25.40 ID:PAkk6Hqa.net
>>506
良く知らんがそのexeがデバッグビルドして有ったら、アタッチした時点で自動的にソースコードが読み込まれて普通にデバッグ出来るんちゃうか?

509 :デフォルトの名無しさん:2015/07/08(水) 10:08:37.12 ID:PAkk6Hqa.net
>>508
ああ、exeはリモートで動くから駄目だな。
そのリモートのタブレットにVisual Studioのリモートデバッガーはインストール出来ひんのか?
リモートデバッガーなら行けるかも。
根拠の無い勘ですが。

510 :デフォルトの名無しさん:2015/07/08(水) 11:44:06.43 ID:ac7mf5QU.net
VisualStudio使ったこと無いけどデバッグ実行前に実行するコマンド書けるでしょそれで転送とかサービスの起動を自動化すればいいんじゃないの

511 :デフォルトの名無しさん:2015/07/08(水) 11:48:34.67 ID:PAkk6Hqa.net
>>510
それをリモートデバッガーと言うと思うよ。
開発環境でビルドして、実行はリモート環境。実行に必要なexeやその他のファイルは、設定しておけば実行時に自動的にリモート側にコピーされる。そしてデバッガーが起動する。

512 :デフォルトの名無しさん:2015/07/08(水) 12:45:47.21 ID:xsPPpspE.net
>>506
環境依存度が高すぎるから VisualStrdio 系のスレで質問し直すのが吉。
そのときはせめて、 VS のバージョンくらい書けよ。
サービスからの起動じゃないと動かない(工夫すれば動かないことも無いと思うが)のならば、
そのことも書いた方がいいな。

ちなみに、サービスの起動/停止については、 net start/stop コマンドでできるから、
バッチファイルでも書いておけ。
net stop 〜
copy \\〜 c:\〜
copy \\〜 c:\〜
net start ~
こんな感じか。これで多少はやらなきゃならないことは減るだろ。

あと、プロジェクトのプロパティ「デバッグ」のところについて
しっかり調べるともっと楽できるかもな。
よさげな方法が見つかったら教えてくれ。

513 :デフォルトの名無しさん:2015/07/08(水) 18:07:32.75 ID:yzj4SMDb.net
VS諦めてICE使え

514 :デフォルトの名無しさん:2015/07/08(水) 18:11:20.27 ID:PAkk6Hqa.net
>>506
その後どうなったんだよ?気になって寝られないよ。
それとも、2ch見る暇も無いくらい虎ブってんのか?

515 :デフォルトの名無しさん:2015/07/13(月) 15:39:26.65 ID:y8DQeBHSQ
C言語で入力した文字列を暗号化させる、
またはモザイクをかける関数等はあったりしますか?

516 :デフォルトの名無しさん:2015/07/13(月) 15:40:46.44 ID:y8DQeBHSQ
博識の皆さんどうかお教えいただければ幸いです。m(_ _*)m

517 :デフォルトの名無しさん:2015/07/16(木) 20:25:08.45 ID:8PKWst4d.net
class Parent {
private:
  string str = "Parent";
public:
  string func() { return str; }
};

class Child : public Parent {
private:
  string str = "Child";
};

int main(void) {
  cout << Child().func() << endl;
}

これVisualStudio2013で動かすと"Parent"って出るんですが仕様動作ですか?
"Child"って出す方法はありますか?

518 :デフォルトの名無しさん:2015/07/16(木) 20:42:33.89 ID:97AdtI1Z.net
funcをバーチャルにするんじゃだめかな?
確かめてないけど。

519 :デフォルトの名無しさん:2015/07/16(木) 20:44:43.18 ID:0HInDZYo.net
>>517
func()をvirtualにするか、単にオーバーライドするか

520 :デフォルトの名無しさん:2015/07/16(木) 20:48:22.58 ID:8PKWst4d.net
virtualにしたら継承する子クラスごとに実装が必要になりますよね?
全部共通の挙動を記述したいのに、ポリモーフィズムになってないような…
継承したときの挙動がJavaとだいぶ違うんですね…

521 :デフォルトの名無しさん:2015/07/16(木) 20:51:22.83 ID:0HInDZYo.net
ちゃんと共通の挙動になってるじゃん
"Parent"を表示するという共通の挙動に

522 :デフォルトの名無しさん:2015/07/16(木) 21:07:12.81 ID:8PKWst4d.net
ポリモーフィズムという言葉の使い方が論理で言う裏の意味になってしまっていましたが、
挙動が異なる部分は個別で書いても、
共通の部分は1か所で書いてほしいという意味です。

523 :デフォルトの名無しさん:2015/07/16(木) 21:12:17.89 ID:0HInDZYo.net
>>522
ちょっと言ってる事が分からないんで最小限の"Javaならこんな動作をするんだけど"って
コードをideoneにでも上げてみてくれ

524 :デフォルトの名無しさん:2015/07/16(木) 21:26:39.68 ID:8PKWst4d.net
あれ?私がアホだったようです。今までどうやってたんだろう?

525 :デフォルトの名無しさん:2015/07/16(木) 21:31:31.63 ID:97AdtI1Z.net
Childでstr定義しなけりゃいーんじゃね
コンストラクタで値設定してやるとか

526 :デフォルトの名無しさん:2015/07/16(木) 21:32:02.23 ID:97AdtI1Z.net
privateも変えなきゃダメか。

527 :デフォルトの名無しさん:2015/07/16(木) 21:38:42.38 ID:8PKWst4d.net
コンストラクタは試しましたが駄目でした
Javaも同じ挙動なので正統な仕様っぽいですね

528 :デフォルトの名無しさん:2015/07/16(木) 21:57:38.31 ID:97AdtI1Z.net
staticでないメンバ変数って宣言と一緒に初期化できないんじゃ?

529 :デフォルトの名無しさん:2015/07/16(木) 22:04:39.16 ID:97AdtI1Z.net
c++11だと出来るのか?

530 :デフォルトの名無しさん:2015/07/16(木) 22:07:20.68 ID:CJJ7/fpC.net
できるよ

531 :デフォルトの名無しさん:2015/07/16(木) 22:20:20.71 ID:97AdtI1Z.net
まあ、ParentとChildで同じ名前だが別々の変数になってるのが悪いんだろ要は

532 :デフォルトの名無しさん:2015/07/16(木) 23:25:09.92 ID:y0fv9fm6.net
Parent単体で使わないならCRTP使えばいいよね

533 :デフォルトの名無しさん:2015/07/17(金) 02:38:25.17 ID:s3h+5IcC.net
Childに変数strじゃなくprotected関数でparentのstrに"Child"とやるんじゃないの?

534 :デフォルトの名無しさん:2015/07/17(金) 13:12:55.27 ID:OTxNgdvH.net
overrideキーワードでなんとかならんか

535 :デフォルトの名無しさん:2015/07/17(金) 13:36:11.16 ID:q0tTJLJ/.net
あれは名前の間違いを防ぐためのもんだろ

536 :デフォルトの名無しさん:2015/07/17(金) 19:32:30.17 ID:lKYO5bRui
# gcc --version
gcc (GCC) 4.9.3

でビルドをして
エラー: ‘weak_ptr’ in namespace ‘std’ does not name a template type
が出ました

どこが怪しそうかありましたらお願いします

537 :536:2015/07/17(金) 19:33:50.74 ID:lKYO5bRui
あと
#g++ --version
g++ (GCC) 4.9.3
です

538 :デフォルトの名無しさん:2015/07/17(金) 20:13:44.47 ID:RYUK7ODzO
-std=c++11

539 :536:2015/07/17(金) 20:23:32.70 ID:lKYO5bRui
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
していて
unrecognized command line option -std=c++11
が出ていたのを解消してます

これだけではオプションが指定できてないでしょうか・・

540 :デフォルトの名無しさん:2015/07/18(土) 00:22:47.35 ID:VAadIoCMs
日本語でおk

541 :デフォルトの名無しさん:2015/07/18(土) 01:27:59.36 ID:+dYah9PS.net
515が正解だろうな

542 :デフォルトの名無しさん:2015/07/18(土) 02:26:19.56 ID:bSmobx4N.net
>>520,506
俺はCしかやったことないから、間違っているかもしれないが。

> 仮想関数には、派生クラスで再定義できる、という利点があります。
> 【Java では】Java では、クラスのすべてのメソッドは仮想関数です。
Javaだとメソッドは全部上書きできる。
C++はvirtualを宣言しないと出来ないが、基底クラスに指定しておけばデフォルトにはなる。
http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/virtual.html

ただしstrはメンバ変数(フィールド)なので、virtual指定は出来ない。
俺も515が正解だと思う。

543 :デフォルトの名無しさん:2015/07/18(土) 03:14:55.63 ID:YrpuCTOJ.net
http://ideone.com/kasXIK

こういう風に書くもんだと思ってたけどな

544 :デフォルトの名無しさん:2015/07/18(土) 03:24:51.92 ID:YrpuCTOJ.net
http://ideone.com/P22ci3

結果だけ同じにしたいのならこっちの方がシンプルかも

545 :デフォルトの名無しさん:2015/07/18(土) 04:20:59.92 ID:bSmobx4N.net
>>544
いや520は駄目だろ、521はいいけど。
515は日本語が若干アレだが、521に近くて、

class Parent {
protected: string str = "Parent";
public: Parent(){} // 空なので省略可
以外同じ
}

なのだと思う。
文法的にどうなのかはちょっと怪しいが、通るのならいいのでは。

546 :デフォルトの名無しさん:2015/07/19(日) 21:05:38.46 ID:C0eKKOJs.net
日本語的にちょっとアレでも意味が通るだけまだマシ

>文法的にどうなのかはちょっと怪しい

さらに
>通るのならいいのでは
というスタンスの方がよっぽど怖い

547 :デフォルトの名無しさん:2015/07/19(日) 21:36:02.86 ID:4AVebAB2.net
なんで?
意味的には問題ない。だからコンパイルが通ればいい。
C++11なら通るし、昔のC++なら通らないだけだろ。

520と521は本質的に違っていて、
それを同じだと思っているやつに言っても意味ないとは思うが。

当たり前だけど、コンパイルが通りさえすれば全ていいといっているわけではない。
一般的に、改訂されるときは、過去に記述が面倒だったものが簡潔に書けるようになる。
C++11でいい環境ならそれでいいし、駄目ならコンストラクタで初期化する記述を書くしかないだけだろ。

548 :デフォルトの名無しさん:2015/07/19(日) 23:44:07.89 ID:M/uggKZR.net
なんでプログラマって日本語があれの人が多いの?

549 :デフォルトの名無しさん:2015/07/19(日) 23:54:00.89 ID:i+qdcRrk.net
「こいつ、プログラミング言語より母国語をちゃんと学習するべきだろ!」って感じる書き込みは、このスレにも散見されるな

550 :デフォルトの名無しさん:2015/07/20(月) 00:02:02.31 ID:B6aaQcuY.net
自然言語でのお喋りは難しいよね
リアルタイムに構文チェックできないのがツライ

551 :デフォルトの名無しさん:2015/07/20(月) 00:12:57.65 ID:Zt6Jwc5S.net
日本語は流し読みするのに向いてないような気がしてきた。
述語が最後に来たり、「てにをは」を読み飛ばすと意味が反対になったり。
論理的な記述よりも時系列に沿った記述に向いているので、小説には向いているのかも知れんが、
技術的な議論を展開するのは難しいのかも。
結論を後回しにするので、ウソを付くのには向いている言語かも。
これのせいで世の中が混乱する。玉虫色言語。
小学生から英語を学習するのに賛成だ。
例えば上記の文章一つとってもいつも迷う。
「小学生から英語を学習するのに賛成だ。」・・・時系列重視
「英語を小学生から学習するのに賛成だ。」・・・目的語重視
はたしてどちらが読みやすく、意味が正確に伝わりやすいのだろうか。
何故こんなことで悩まなくてはならないのだろう。

552 :デフォルトの名無しさん:2015/07/20(月) 00:15:46.01 ID:1Qy7XHWg.net
>>551
君は日本語の良さを全く分かっとらん!

553 :デフォルトの名無しさん:2015/07/20(月) 00:17:09.46 ID:B6aaQcuY.net
良い年した大人が小学生に英語を教わるなんて恥ずかしいよ

554 :デフォルトの名無しさん:2015/07/20(月) 00:24:55.57 ID:NxNLCFO0.net
>>553
for (int i=0;i<3;i++) printf("w");

555 :デフォルトの名無しさん:2015/07/20(月) 00:28:42.11 ID:Zt6Jwc5S.net
あと、日本人は縦割り行政で利権が大好きでOOP脳なので、
自分の立場に立ったり、相手の立場に立ったり、
思いやりだとか、なんとか、主体がかなりいい加減。
例えば次の文はどっちでも通る。
「小学生から英語を学習するのに賛成だ。」
「小学生から英語を学習させるのに賛成だ。」
なんとかしてほしい。もやもや

556 :デフォルトの名無しさん:2015/07/20(月) 00:51:14.45 ID:Zt6Jwc5S.net
述語や動詞というのは「機能」なんです。
と言うことはこれが前に来る言語を使っている人たちは、ひとえに機能主義なんです。
機能主義は立場よりも横のつながりを重視します。
一方で思いやりに欠けます。しかし、そこに拘るのは男らしくないという考え方です。
こういう何らかの感覚的な違いが、結構重要な何かなんじゃないかと最近ひしひし。

557 :デフォルトの名無しさん:2015/07/20(月) 01:27:14.66 ID:Zt6Jwc5S.net
われわれはどうして、機能主義なことを、皆こぞって「風通しが良い」って詩的な表現で言うんですかね。
こういう曖昧な表現を使うと、毛の壁さんのような人が、独自の解釈をして、勘違いして、変な展開になる可能性が。
わざとなんですかね。一定以上の知能が無い人には真意が伝わらないようにするっていう。
二重の会話。凄い技術ですね。

558 :デフォルトの名無しさん:2015/07/20(月) 02:12:16.93 ID:ERLwMp/J.net
>>551
それは論理的に日本語で記述しない側の問題,
あるいはもともと論理的でない内容だったという話なのでは?

>>555
ヨーロッパ諸語でも格変化の残っている屈折語ならば,主語の省略は普通ときいている.

>>556
昔やったドイツ語では動詞が最後に来る場合があった,この場合動詞が半分にちょん切れると辞書が引けず困った.

英語でも分詞構文はかなりあいまいで読み手が内容を推察しないといけないかと
憲厳密性の必要なはずの法律・条文に割合に多い
https://en.wikisource.org/wiki/Constitution_of_Japan#The_Constitution_of_Japan

559 :デフォルトの名無しさん:2015/07/20(月) 02:32:06.60 ID:Zt6Jwc5S.net
風通しの良い社風ですってPRってどうなんだろうね。
風通しが良すぎて、要らなくなったらはいサヨナラだったりして。
機能主義って結構厳しいわけで。
分かりやすく、風通しが良い==公務員の正反対の社風と考えると、疑問がわくよね。
今の時代、「わが社は市役所の様な社風です」ってPRしたほうが人気出るんじゃね。

560 :デフォルトの名無しさん:2015/07/20(月) 02:55:37.94 ID:Zt6Jwc5S.net
あと、風通しが悪そうな業種と言えば、
医者とか大学教授とか政治家とか。
余裕の有る業種は機能的になる必要が無いので風通しが悪くなる。
余裕の無い業種は機能的にならざるを得ないので風通しが良くなる。
それに、普通に考えて、働く上で、風通しが良くて、何か得することがあるだろうか。
そりゃ会社は得するだろうが、従業員的にはリスクの方が大きいような。
派遣とか有る意味最高に風通し良いよな。会社の垣根すら越えているわけだから。

561 :デフォルトの名無しさん:2015/07/20(月) 03:16:13.69 ID:Zt6Jwc5S.net
OOPはメンバ変数を大切に保護する、とても思いやりに溢れた発想。
日本的で良いではないか。Matzも喜ぶ。
裏を返せば縦割り行政で利権主義とも。

562 :デフォルトの名無しさん:2015/07/20(月) 03:30:39.42 ID:Zt6Jwc5S.net
あと、OOPは各オブジェクトがコミュニケーションをとりながら協調動作するあたりも、
非常に日本的といえるね。
それがたとえ機能的じゃなかったとしても、そういう風に振舞うことが美徳とされている。
デザインパターンとかいった様式美も時代劇みたいでいいね。

563 :デフォルトの名無しさん:2015/07/20(月) 04:07:18.07 ID:exWjJYka.net
なにこの独壇場(;^ω^)

スレタイの日本語と空気も読めるようになっとけよ?

564 :デフォルトの名無しさん:2015/07/20(月) 12:07:06.33 ID:B6aaQcuY.net
ドキュメント記述に最適なOOP自然言語開発しようぜ

565 :デフォルトの名無しさん:2015/07/20(月) 21:50:13.92 ID:4CXi8vOi.net
スレ立てて勝手にやれよ

566 :デフォルトの名無しさん:2015/07/22(水) 23:52:29.80 ID:1Ae0pJ+D.net
質問です

あるOSSの関数を動的ロードしたいのですが、ヘッダを見ると
単なるマクロでした
#define macro_func(a)  hoge_func(a,b,c)

hoge_funcを動的ロードするのは、macro_funcの中身が今後どう変わるか
分からないので極力避けたいです
どうすればmacro_funcを動的ロードできるか教えてください

567 :デフォルトの名無しさん:2015/07/23(木) 00:01:59.37 ID:CfJH8He2.net
>>566
どうみても関数hoge_funcの実体がないとmacro_funcは動作しない。
動的・静的ロード、コード全体の埋め込みに関わらず、hoge_funcがないと無理。

568 :デフォルトの名無しさん:2015/07/23(木) 01:21:06.57 ID:65Ur3bjf.net
というQZの妄想が始まった

569 :デフォルトの名無しさん:2015/07/24(金) 11:05:32.19 ID:+CDH8aof.net
昔から疑問なんですが、
文字列扱う場合、エスケープってやるじゃないですか。
"\"あいうえお\""
こんな感じ。これ見辛いし面倒だし
""あいうえお""
でええやん?って思うんですが。どうですか?

570 :デフォルトの名無しさん:2015/07/24(金) 11:15:53.69 ID:OLl6qPEd.net
それは釣りか?
""あいうえお""
これは、
"<空の文字列>"あいうえお"<空の文字列>"
と解釈されるぞ。

571 :デフォルトの名無しさん:2015/07/24(金) 11:25:05.67 ID:+CDH8aof.net
>>570
いや、だからそのcやc++の仕様を拡張してエスケープ無しで行けるようにしたら良いんじゃないかと…

572 :デフォルトの名無しさん:2015/07/24(金) 11:26:49.57 ID:yzOD5LHX.net
R("あいうえお")";

573 :デフォルトの名無しさん:2015/07/24(金) 13:11:20.49 ID:otR8/vJ5.net
拡張って、それ区別できんやろ

574 :デフォルトの名無しさん:2015/07/24(金) 13:58:41.01 ID:LT/1nm8p.net
>>571
http://ideone.com/VU0Ru9

575 :デフォルトの名無しさん:2015/07/24(金) 14:15:50.67 ID:+CDH8aof.net
>>574
なるほど。
区別出来ないのか。だったら"や'では無くてasciiコードに1文字新しい記号を割り当てて例えば''' トリプルクオーテーション
みたいなの定義して文字列はこの記号で囲う。この記号自身は文字列に使ってはいけないとか言う仕様にするのはどうかな?

576 :デフォルトの名無しさん:2015/07/24(金) 14:19:59.16 ID:yzOD5LHX.net
Raw string literalsでいいじゃん

577 :デフォルトの名無しさん:2015/07/24(金) 14:34:24.73 ID:OLl6qPEd.net
>>529
こんな小難しい例を挙げなくても、
"";int i;"";
これで十分。このコード、コンパイルは通ります。

>>575
それって今と同じ状況じゃないですか。
再帰的にどんどん増やしていくんですか?

578 :デフォルトの名無しさん:2015/07/24(金) 18:15:33.40 ID:7eFkrdf6.net
asciiコードに自分の考える文字追加とかどんだけドリーミーなんだよ

579 :デフォルトの名無しさん:2015/07/24(金) 20:46:34.43 ID:B25T497v.net
被曝してるのにオリンピックとかやっちゃう脳をもった国ですからね
何やってもおかしくない

580 :デフォルトの名無しさん:2015/07/24(金) 20:52:37.92 ID:eC0qtT6i.net
ASCIIコード体系はC/C++だけの為にあるわけじゃないのに
今からそれを変更するのはあまりにも影響が大きすぎるでしょう
「\"」の見栄えのためだけにとんでもないコストを払うのは現実的ではないとおもうよ

581 :デフォルトの名無しさん:2015/07/24(金) 21:01:28.24 ID:OLl6qPEd.net
今更ASCIIコード変更とか逝かれてる発想だけど、
過去にはバックスラッシュを\マークにすると言う離れ業をやってのけたわけだがね。
もともとの話は、
"\"あいうえお\""
が見にくいって話だったけど、\マークだから余計に見にくいってのも有るね。
変なところで話がつながった。おしまい

582 :デフォルトの名無しさん:2015/07/24(金) 23:30:32.86 ID:M2zLZm11.net
C#だと
@"""あいうえお""";
となるな。

583 :デフォルトの名無しさん:2015/07/25(土) 09:38:50.40 ID:swByAiFJ.net
ああ " を2つ並べるエスケープも見ずらいよな〜

584 :デフォルトの名無しさん:2015/07/25(土) 11:23:13.05 ID:O+qig66a.net
asciiに文字を増やしてみたとして
結局そのうちその文字自身を文字列に入れたくなることが出てきていたちごっこ

585 :デフォルトの名無しさん:2015/07/25(土) 11:31:14.17 ID:bLirGUmg.net
じゃあ、見た目は同じだけれど
asciiコードが異なる"を二種類定義してだなあ、文字列定義で使う一つ目の"で文字列を囲って、文字列の中身は二つ目の"を使えば
"あ"い"う"
"""
""""""""
など何でもOK。俺って天才だろ

586 :デフォルトの名無しさん:2015/07/25(土) 11:31:15.57 ID:BM2K7hmS.net
asciiとか半角256パターンなのにどうすんだべ

587 :デフォルトの名無しさん:2015/07/25(土) 11:58:32.89 ID:O+qig66a.net
見た目が同じでコードが違うとかプログラマの嫌がる王道パターンじゃないか

588 :デフォルトの名無しさん:2015/07/25(土) 14:48:08.13 ID:xrZjcDNk.net
文字列リテラルは連結できるんだから、文字定数を文字列リテラルと連結できるルールがあればいいんだな。
'"' "あいうえお" '"'

589 :デフォルトの名無しさん:2015/07/25(土) 15:27:06.34 ID:SkX3Z7YG.net
好きな書式を選びたまえ by D

"\"abc\""
`"abc"`
q{"abc"}
q"["abc"]"

# ほんとは この倍くらい記法の種類がある

590 :デフォルトの名無しさん:2015/07/25(土) 19:10:08.76 ID:kRwC234a.net
それよりテンプレートのテンプレートで>が連続で書けないのが不満

昔VCだと通っていたが

591 :デフォルトの名無しさん:2015/07/25(土) 19:13:50.43 ID:9SEykvB/.net
C++11に対応してるコンパイラなら書けるだろ?

592 :デフォルトの名無しさん:2015/07/25(土) 20:13:53.13 ID:bLirGUmg.net
>>590
テンプレートのテンプレートなんて使ったら、後で自分で見返しても何してる処理かわからなく成りませんか?

593 :デフォルトの名無しさん:2015/07/25(土) 20:22:52.03 ID:9SEykvB/.net
std::vector<std::pair<a,b>>←これのことでしょ

594 :デフォルトの名無しさん:2015/07/25(土) 20:32:50.55 ID:HTRLB0UZ.net
昔は通らなかったが最近は通るようになったんじゃなかったか

595 :デフォルトの名無しさん:2015/07/25(土) 20:45:06.07 ID:FjYNChri.net
>>592
そんな事ねぇよ
だいたいvectorで二次元配列書こうとするだけで必要になるでしょうが

596 :デフォルトの名無しさん:2015/07/25(土) 20:48:37.93 ID:bLirGUmg.net
>>595
vectorのvectorなんか使わなくても
普通に二次元配列とか、自前のlist構造みたいなの使う方がやり易く無いですか?

597 :デフォルトの名無しさん:2015/07/25(土) 20:59:22.38 ID:FjYNChri.net
>>596
途中で列方向に伸ばしたり行方向に伸ばしたくなる事がたまにある
そういう時はvectorが便利

598 :デフォルトの名無しさん:2015/07/25(土) 21:00:03.73 ID:FjYNChri.net
なーんか釣りっぽいけど
listなんか糞遅くて使えるか

599 :デフォルトの名無しさん:2015/07/26(日) 09:22:04.99 ID:Kcbwho8L.net
エディター作ろうと思ったらlist<vector<char>>かなんかを使うだろ。

600 :デフォルトの名無しさん:2015/07/26(日) 10:29:47.10 ID:CCJoGOlFX
試作段階で使う事に反対はしないけど
処理の最内周で多重ポインタ引っこ抜きアクセスは
アナライザ回した時点で切除すべき癌になる
だから一見面倒に見えても最初からカプセル化して
ユニット組んどいたほうが楽になる

c++が言語に選ばれる状況はこーいう状況が多いんじゃないかな

601 :デフォルトの名無しさん:2015/07/26(日) 15:03:16.44 ID:kbQtFiQ+.net
エディタもvector< vector< char > * >でよくね?

602 :デフォルトの名無しさん:2015/07/26(日) 16:47:25.24 ID:P7wSwPkX.net
エディタは一行削除したり数行まとめて移動・挿入したりの頻度が高いので
行方向がvectorでは遅くなる

603 :デフォルトの名無しさん:2015/07/26(日) 17:41:01.90 ID:vMGDFyGs.net
計算量の理屈では挿入削除はリストのほうが効率がいいが、
実測ではlistよりvectorが速くなることってめったにない気がするんだよなぁ。
俺個人の感想だが。

604 :デフォルトの名無しさん:2015/07/26(日) 17:41:53.36 ID:vMGDFyGs.net
逆だった。vectorよりlistが速くなるのが滅多にない。

605 :デフォルトの名無しさん:2015/07/26(日) 18:02:19.78 ID:P7wSwPkX.net
体感ではなくベンチマークすべきだな、そこまで言うなら

100000行位のテキストを想定して、ランダムにカット&ペーストを繰り返す

606 :デフォルトの名無しさん:2015/07/26(日) 18:25:36.24 ID:iQP3uV6G.net
>>603
処理のやり方にもよるからね。
毎回挿入位置までリストをたぐる操作をやっていたりしたら計算量もたいして有利じゃないし。

607 :デフォルトの名無しさん:2015/07/26(日) 20:39:58.99 ID:kABshWn7.net
ベンチマークプログラム難しそうだな
コピペのブロック指定中は既に先頭のイテレータを取得した状態だという事だし、そこから
splice()を実行するのならlistの方が遥かに速いだろうけど、イテレータを取得するのは
vectorの方が圧倒的に速い

608 :デフォルトの名無しさん:2015/07/26(日) 22:36:35.84 ID:kbQtFiQ+.net
普通に考えてvectorの方が良いだろ。
行の変更があるのは、改行した時とか、限定的。
ユーザの入力があったときしか、行の変更は無い。
なので、一秒間に何十回もそういう操作があるわけではない。
一方再描画は頻繁に発生する。滑らかなスクロールをするためには、
一秒間に60回の描画が発生するかもしれない。
それなのにlistはランダムアクセスが出来ません。
ランダムアクセスができないと言うことは、ほかにも色々な制限をもたらします。
たとえばクイックソートは絶望的。とにかく面倒。素直にvector使っておけばよい。
ここで、vectorを使う場合を考える。
ポインタ一つ4バイトとして、100000行だと、400KB。
これのmemmoveに何msかかるか考えてみろ。
画像で言えば32bitで1000x100のビットマップ程度の大きさに相当して、
これは、フルハイビジョンの1/20の面積しかない。
この程度の処理がもたつくようでは、面積20倍、それも複雑なデコード処理が必要な
フルハイビジョン動画の再生は困難なわけで、問題になりえるか、考えるまでも無い。

609 :デフォルトの名無しさん:2015/07/27(月) 01:29:16.53 ID:nrCiDIHC.net
だから言葉では何とでも言えるからベンチマーク取るしかないんだよ

行のイテレータはadvance()で取るとして、erase()やinsert()と、splice()を
使って行の長さを適当に変化させて、advance()が勝つかinsert()が勝つか
実測するしかない

610 :デフォルトの名無しさん:2015/07/27(月) 07:24:58.31 ID:oo3Jt8Wj.net
vector がお手軽に使えるようになったせいで,
vector の不利な点―削除前詰はコストが高い―を取り落とす人が出てきたようだ

611 :デフォルトの名無しさん:2015/07/27(月) 11:39:00.18 ID:KH8d/GA1.net
何で測定する必要があるんだよ。
高々400KBのmemmoveの実行時間を調べてどうするんだよ。
今のPCのメモリ帯域は、理論値で21GB/sもあるのに、一体一秒に何千回改行する気だよwww
こんなものいちいち測定するなら、ありとあらゆる物を測定しなきゃならん。

大体、時たま発生する400KBのmemmoveがもたつく環境で、テキストエディが満足に動くはずが無い。
画面サイズを1024x768と小さめに見積もっても4MB、つまり400KBの10倍あるのに、
滑らかな描画が出来るわけが無い。まず問題視するならそっち。
そういう意味で破綻しているし、考える意味が無い問題と言える。

今のPCの能力では、テキストエディタの行を保持するのに、listを使ってもvectorを使っても
問題ない速度で動く。それはわかりきっているわけで、測定する意味が無い。
問題になるとしたら、描画関係。そっちを優先したデータ構造にすべし。
どちらを使ってもいいのなら、わざわざランダムアクセスが出来ないlistを選ぶ意味は無い。
面倒なだけ。何も考えずにvectorを使えばいい。

612 :デフォルトの名無しさん:2015/07/27(月) 11:47:35.16 ID:KH8d/GA1.net
もう一度書いておくと、問題になりえるとしたら描画関係なわけで、
描画に都合の良いデータ構造を採用するべきなんだよ。
行の変更は頻繁に起こるわけではないし、
たかだか400KBのmemmoveなんぞ、描画の重さに比べれば、無いも同然なわけで。
そんなものを測定して早い遅い言っても何の意味も無い。描画を中心に考えるべし。
描画に適したデータ構造と言う意味では、ランダムアクセスの出来るvecotrの方が
使いやすいといえる。丁寧に書いてあげるのなら、listでも構わない、が、
し・か・し、わざわざランダムアクセスの出来ないlistを使う意味は無いので、vectorでよい。
listだと、ソートするだけでも鬱陶しい。

613 :デフォルトの名無しさん:2015/07/27(月) 12:15:48.73 ID:KH8d/GA1.net
ついでに書いておくと、4K解像度だと、画面のビットマップサイズは30MB近くになる。
これだけの量をレスポンスを損なうことなくリアルタイムにレンダリングしなければならないのに、
たかだかたまに起こる400KBのmemmoveに拘っている暇は無い。
実際に、4K解像度で、何も考えずに、アンチエイリアス効かせて、DrawTextで全面描画すると、
カクカクになって、まるで使い物にならない。たぶん1FPS位になる。
実際、7のエクスプローラも、4K解像度で最大化すると、選択ツールがカクカクになる。
7のエクスプローラにとって4K解像度は想定外ということ。
更新のあった場所だけレンダリングするなり、DirectWrite使うなり、何らかの対策が必要。
お前らが過去に作ったツールも、4K解像度で滑らかに動くかどうか、一度確認してみたほうが良い。
特に遅いのが、アンチエイリアスの効いた文字の描画。FHD解像度では問題なくても、4Kだとカクカクになる。
これからのプログラムは4Kに対応しなくちゃね。

614 :デフォルトの名無しさん:2015/07/27(月) 13:31:05.37 ID:KH8d/GA1.net
あと、挿入や入れ替えの事ばかり気にしているようだけど、
実際には削除の方が問題になる。
memmoveは単純なアルゴリズムだしSSE化されているので高速だけど、
freeやdeleteは空き領域を結合したりと、複雑なアルゴリズムでとても遅いから。
加えてデストラクタも走るし。
しかも、vectorを使った場合でもlistを使った場合でも、
本体とバッファで、一行に付き2回のdeleteが走る。
経験則だけど、10万行を一気に削除すると、多分1秒ぐらい固まる。もっとかかるかも。
スレッド立ち上げておいて、バックグラウンドで遅延deleteすると良いかも。
こういう問題を放っておいて、挿入時間がどうとか、馬鹿げてるね。
根本的に目の付け所がおかしいんだよ。
それでも描画の方がもっと問題だが。

615 :デフォルトの名無しさん:2015/07/27(月) 13:33:17.24 ID:L+84gj0A.net
http://ideone.com/JIBJGe

ほれ
Nを適当にいじって手持ちの環境で走らせてみ
listはある範囲の終点のイテレータを取得するのにも順繰りにたどるしかないんで
いくらinsertが速いと言ってもvectorの約3倍ほど時間が掛かるようだ

616 :デフォルトの名無しさん:2015/07/27(月) 19:42:02.36 ID:8jkVFbGd.net
コンテナの無駄を語る前に、自分の文章の無駄を省くことを勧める

新機軸の考察を交えた、高尚な意見を語るのならともかく

617 :デフォルトの名無しさん:2015/07/27(月) 20:59:48.12 ID:9agqNJ/2.net
クドくてわかりにくい、冗長なコードを書きそうだよなw

618 :デフォルトの名無しさん:2015/07/27(月) 21:59:34.50 ID:kF5kcc0V.net
三行で読むのをやめた

619 :デフォルトの名無しさん:2015/07/27(月) 22:24:31.49 ID:b0q7AFFp.net
いくら口が達者でも肝心のプログラムが一つも書けないんじゃム板では相手にされないよ
それに口が達者というより井の中の蛙って感じだね
仕事してないっしょ?

620 :デフォルトの名無しさん:2015/07/27(月) 22:30:32.68 ID:DuLbgldQ.net
こんな文章書く奴が口達者でたまるかwww

621 :デフォルトの名無しさん:2015/07/27(月) 22:38:24.99 ID:KcMXEwaZ.net
>>615
俺の環境ではvectorのほうがちょっと速いくらいで3倍の差はつかなかった。
最適化してないからかもしれん。
最適化オプション付けたらなぜか完走しない。
原因はよくわからん。

622 :デフォルトの名無しさん:2015/07/27(月) 22:50:41.69 ID:sgwB7yTG.net
listは確かにinsert()は速いけど、そのinsertする場所を求めるのに時間がかかり、また
複数の要素をinsertするとその度にポインタを辿って一個ずつしか挿入出来ないのな

普通リスト操作と言うとつながったリストの先頭と最後尾だけを指定すればポンと挿入
出来るはずなのにそうなってない
C++11で改良されたかと思ったけど駄目だった

でも>>615は改良の余地があるね
挿入もsplice()を使うべき

623 :デフォルトの名無しさん:2015/07/27(月) 23:05:02.49 ID:Mi01ZGiW.net
文章盛ってるだけで言ってる事は同じとかそれこそ無駄

624 :デフォルトの名無しさん:2015/07/27(月) 23:18:01.27 ID:KcMXEwaZ.net
リストとツリーの遅さはガチ

625 :デフォルトの名無しさん:2015/07/27(月) 23:40:10.31 ID:eqeml5nf.net
deque()でいいじゃん。

626 :デフォルトの名無しさん:2015/07/27(月) 23:48:22.48 ID:pp6uoCzE.net
VS2015のパフォーマンスエクスプローラーで分析してみた
予想どおりstd::nextだけで全体の73%もの時間を消費してる
これじゃあベンチマークの意味ないよ
ランダムに挿入するのが裏目に出てる

627 :デフォルトの名無しさん:2015/07/27(月) 23:50:30.57 ID:pp6uoCzE.net
ちなみにstd::vectorのstd::erase()とstd::insert()を足しても全体の25%にしかならない
もう少しベンチマークプログラムのアルゴリズムを考えるべきだろこれ

628 :デフォルトの名無しさん:2015/07/28(火) 00:08:57.30 ID:WNbWyPpf.net
しかしstd::nextに73%かかるのがひょっとしたら実アプリに近いのかもしれない。
わからんけど。

629 :デフォルトの名無しさん:2015/07/28(火) 08:24:07.21 ID:tsfiL0l/.net
insertする場所は「今キャレットがある位置」で明確だから
テキストエディタでは探索コストは問題にならないのでは?

630 :デフォルトの名無しさん:2015/07/28(火) 11:50:55.62 ID:dCM9/1ij.net
スクロール先頭のイテレータも保存して、
キャレット位置のイテレータも保存して、
マウスカーソル直下のイテレータも保存して、
と、どんどん保存するイテレータが増えていくわけですね。
面倒になってきて、そのうちイテレータキャッシュを作り始めると・・・
で、そこまでするメリットは?

631 :デフォルトの名無しさん:2015/07/28(火) 12:35:30.16 ID:tsfiL0l/.net
回答を聞く気がないなら最初から質問なんかしなさんな

632 :デフォルトの名無しさん:2015/07/28(火) 12:42:23.90 ID:tsfiL0l/.net
ああ、質問口調なのは自分も同じだった。今のは撤回するね、ごめん。

633 :デフォルトの名無しさん:2015/08/06(木) 08:00:13.21 ID:f8gvnJE6.net
VisualStudio2015のC++11対応状況を知りたいがなかなか情報にヒットしない。

誰か知ってたら教えていただきたきそうろう

634 :デフォルトの名無しさん:2015/08/06(木) 08:38:20.05 ID:BM+A+5/Q.net
つ[msdn]

635 :デフォルトの名無しさん:2015/08/19(水) 23:31:20.42 ID:8uw32tI0.net
C言語の初心者なのですが、ある文字列を分割する方法を検討しており、strtokにたどり着きました。
分割したい文字列はhttpリクエストに入っている/aaaa.js/などの値です。
# 今回は拡張子を取得したくstrtokで.を使っ

て分割しようとしています。

ただ、このstrtokは元の文字列を破壊してしまうようで、元の文字列は破壊したくなく思っています。
そこで、以下のページを発見しました。適合コード部分を参考にしようと思っています。
@https://www.jpcert.or.jp/sc-rules/c-str06-c.html

マロックを使って、別の文字列にコピーしましょうね、ということなんですが、
マロックに詳しくなく、上記でメモリリークや不具合等が起きないか/問題ないのか気になっています。
マロックについて、調査したところ、以下のページの諸注意を見つけました。
Ahttp://www.geocities.co.jp/SiliconValley-Bay/7437/c/malloc.html
>>buffの値を変更するというのは別に構わないのですが、freeに渡す前に元の値に戻す必要があります。
この文言を見た限り、@に記載されてるfree(copy);ではちゃんとfreeされないのでは、と懸念しています。
そう思ってるのはcopyはstrtokによって破壊されており、元の値と異なってしまってると思ってるからです。

私の考えは正しいのでしょうか。。。それとも@の書き方で問題ないのでしょうか。
C言語に詳しい方いらっしゃればご教授頂きたいです、m(__)m

636 :デフォルトの名無しさん:2015/08/19(水) 23:37:00.42 ID:KWfiCcWC.net
マロックに気をとられて内容が読み取れなかったw

637 :デフォルトの名無しさん:2015/08/19(水) 23:43:19.12 ID:8uw32tI0.net
>>636
ああ、ごめんなさい。
文字列を別の箱にコピーしたら元の文字列を破壊しなくて済むよね、
という発想で、別の箱にコピーする方法を探してました。
すると@のページが出てきてなれないマロックとかいうものが出てきて困惑したという感じです。
マロックがよくわからないので、@のfreeなどが適切なのかわからず。。。

638 :デフォルトの名無しさん:2015/08/19(水) 23:46:23.94 ID:8uw32tI0.net
>>636

そして@の最後でcopy=NULLとしてるのもなんでだろう、、とおもっており。
freeだけだとまずいんですかね。

639 :デフォルトの名無しさん:2015/08/19(水) 23:52:19.21 ID:KWfiCcWC.net
いや、マロックじゃなくてmallocと正確に書きましょう。
英単語を日本語で発音したものを日本語文字で書き起こしたものなんてさ

640 :デフォルトの名無しさん:2015/08/19(水) 23:58:08.57 ID:KWfiCcWC.net
で、mallocでググってみると、メモリの動的割り当てだの説明ページが出てくると思うんだが。

普通に配列を宣言する場合って、ソースコードを書く時点でサイズが決まってしまうけど、
そうじゃなくて任意の長さの文字列に対して配列を確保したい場合はmallocを使うもの
と考えておけばいい。

641 :デフォルトの名無しさん:2015/08/20(木) 00:29:51.57 ID:hK7dURUd.net
>>640
ああ、それはわかります。動的に確保したいからって意味だと思います。
よくわからないのがfree関係のところです。

642 :デフォルトの名無しさん:2015/08/20(木) 00:58:54.12 ID:iXzlVX06.net
ああ済まない全然読んでなかったw

copy自体は確保されたメモリの先頭アドレスが格納されている。

特にそのアドレス値自体は変更してないので、freeで問題無く開放される。
変更されているのは、copyのアドレスが指し示すメモリに格納されている値。

あと、NULLを入れるのは、そうしておくとこれは確保されたメモリなのか、
開放したけどそのまま放置されているものなのか分かるようにする方法。
freeした後でcopyを再び再利用するとかでさ。

643 :デフォルトの名無しさん:2015/08/20(木) 01:18:46.57 ID:hK7dURUd.net
>>642
なるほど。freeはアドレス値に対して解放するものなので、
格納されてる値が変わったとしても関係ないわけですね。

NULLを入れるのは目印的なもの?って感じなんですね。

644 :デフォルトの名無しさん:2015/08/20(木) 06:50:00.21 ID:iXzlVX06.net
はい

645 :デフォルトの名無しさん:2015/08/20(木) 09:23:26.67 ID:7wC+DvH0.net
その目的なら、strchr()が無難だと思う。

646 :デフォルトの名無しさん:2015/08/20(木) 09:39:44.94 ID:83vcvbQR.net
その目的なら_tsplitpath_s()かな?

647 :デフォルトの名無しさん:2015/08/20(木) 11:57:47.23 ID:mELjCRuD.net
>>645
少し調べてみます。

後、ちょっと気になったんですが、上記の様なケースでmallocは絶対つかわないといけないもんなんですかね。
逆にmallocにかんする部分をコメントアウトしたりして使わない場合はどうなるんでしょう。エラー?

648 :デフォルトの名無しさん:2015/08/20(木) 12:10:26.88 ID:XXXu8/KU.net
つまり >>641 は全くのウソ

649 :デフォルトの名無しさん:2015/08/20(木) 12:26:07.32 ID:mELjCRuD.net
自己解決しましたが新たななぞが。。
mallocがないといわゆるセグメンテーション違反になるんですね。よく意味はわかってませんが。

そして、apacheモジュール開発のためにrequest_rec構造体のuriというのを上記の方法を用いて分割しようとしています。r->uriで参照してます。
しかし、リクエストを受け付けておそらくmalloc時にセグメンテーション違反のエラー文言が、、

*copy=(char *)malloc(strlen(r->uri)+1);
上記が悪いまでは推測できてるのですが、
これの何が悪いのかがわかりません、、
ちなみに推測したのはこれを加えた時点で、リクエスト受けた時にエラーログにセグメンテーションフォウルトと出るからです。
よくわからないのは、uriの長さ取れてて、その+1ならちゃんと領域確保されてそうなのに、だめなんだ、、ってので混乱してます。
うーん。

650 :デフォルトの名無しさん:2015/08/20(木) 12:36:47.32 ID:mELjCRuD.net
自己解決しましたが新たななぞが。。
mallocがないといわゆるセグメンテーション違反になるんですね。よく意味はわかってませんが。

そして、apacheモジュール開発のためにrequest_rec構造体のuriというのを上記の方法を用いて分割しようとしています。r->uriで参照してます。
しかし、リクエストを受け付けておそらくmalloc時にセグメンテーション違反のエラー文言が、、

*copy=(char *)malloc(strlen(r->uri)+1);
上記が悪いまでは推測できてるのですが、
これの何が悪いのかがわかりません、、
ちなみに推測したのはこれを加えた時点で、リクエスト受けた時にエラーログにセグメンテーションフォウルトと出るからです。
よくわからないのは、uriの長さ取れてて、その+1ならちゃんと領域確保されてそうなのに、だめなんだ、、ってので混乱してます。
うーん。

651 :デフォルトの名無しさん:2015/08/20(木) 12:38:03.31 ID:mELjCRuD.net
とおもったら、
*copyとしてたのをcopyにしたらなおりました、、
書き方間違えてたっぽいですが、なんか理由は不明のままに。

652 :デフォルトの名無しさん:2015/08/20(木) 12:42:22.66 ID:q4vIrycP.net
こんな人が開発したapacheのモジュールとか怖いな
ぜひ公開しないで欲しい
まぁ演習かなんかだろうが

653 :デフォルトの名無しさん:2015/08/20(木) 12:57:42.09 ID:C0zkB6yz.net
初歩の初歩が分かってないから、コーディングしても無駄
一旦筆を止めて入門書のポインターあたりから勉強しなおすべき

654 :デフォルトの名無しさん:2015/08/20(木) 15:50:17.76 ID:LQ4KOo8K.net
怖えー
ポインタすらわかってない奴がC開発なんてすんなよ

655 :デフォルトの名無しさん:2015/08/20(木) 16:55:54.98 ID:dJVl2eol.net
まぁ確かにstrtokの仕様は、直感的に分かりにくいしちょっと気持ち悪いよな
余談だけど、Cの標準関数で与えたパラメータの中身を関数コールで勝手に破壊するものって他にあったっけ?

656 :デフォルトの名無しさん:2015/08/20(木) 21:30:07.36 ID:Amgj5mKY.net
C言語の記述する対象となるコンピュータの構造はシンプルだ。実際にはメモリページとかプロセス分岐とかあるかもしれないが、C言語では意識しなくてもいい
それほど多くないレジスタとメモリ、環境による出力の手続きさえ覚えればこんなにラクな言語はないと思うが
逆にVMとかフレームワークに支配される言語の方が難しい。
そういえば昔、アセンブラは出来るがBASICは出来ないという技術者がいたな。

657 :デフォルトの名無しさん:2015/08/20(木) 21:46:06.11 ID:d5r4dVNc.net
>>655
ニュアンスは違うけど、time()も引き数がNULLじゃなければ書き換えるね。
strncpy()やstrncat()の振る舞いも分かり難いし。

658 :デフォルトの名無しさん:2015/08/20(木) 21:48:41.17 ID:d5r4dVNc.net
そうそう、printf()系も出力だけだと思い込んでいると%nでポイント先を書き換えますな。

659 :デフォルトの名無しさん:2015/08/20(木) 21:54:30.48 ID:q4vIrycP.net
そもそも、strtokはマルチスレッド環境で・・・だったから
いまどきは大丈夫なんだけど、誰も使わないんだ

660 :デフォルトの名無しさん:2015/08/20(木) 23:29:24.59 ID:dJVl2eol.net
>>657
うん、それはまぁそうなんだけど‥
timeは「ここへ書き込んでね」のポインタ、strtokは「これを調べて頂戴」の元データなんだよね

元データは書き換えるし、関数内部で"状態"を保持してて、関数コールの度にそれが遷移する挙動が呼び出し側から見えないし→strtok (>_<)
素直に「元データ」「デリミタ」「トークンの位置」「トークンのコピー先ポインタ」を引数で渡して
取り出したトークンをコピー先に書き込んでくれた方が分かりやすい希ガス
で、関数戻り値はコピーできた文字数で、コピーできないエラーがあったら-1とか‥ たとえばね

661 :デフォルトの名無しさん:2015/08/21(金) 00:45:01.87 ID:pYz5qGfR.net
それなんてsscanf()w

662 :デフォルトの名無しさん:2015/08/21(金) 07:02:32.53 ID:ALerSfbe.net
asctimeとか
マルチスレッドでの利用禁止になってるやつとか

663 :デフォルトの名無しさん:2015/08/22(土) 14:49:35.32 ID:mr0xWKbe.net
ターミナル系のソフトを書いていて、createprocessでcmd.exeを起動してそのあとそのプロセスの標準入力に文字を送り込む方法がわからん
誰か助けてくれ

664 :デフォルトの名無しさん:2015/08/22(土) 16:05:22.03 ID:TdiPFjxM.net
自プロセスの出力ハンドルを起動したプロセスの標準入力を繋いで……
popen()のソースでも見たら?w

665 :デフォルトの名無しさん:2015/08/22(土) 16:28:29.39 ID:nrIOmrw7.net
プロセス間通信じゃあダメなん?

666 :デフォルトの名無しさん:2015/08/22(土) 16:57:57.04 ID:kXIlr7qG.net
受信動作をcmdに埋め込めと?

667 :デフォルトの名無しさん:2015/08/25(火) 21:24:02.58 ID:L16aGoEed
std::shared_ptr<void>(malloc(size));
これをstd::mapに入れてデータコンテナを作成しているのですが
これって所有者がいなくなった時にfreeしてくれますか?

668 :デフォルトの名無しさん:2015/08/26(水) 17:14:26.26 ID:m14uiM4v.net
ttp://racanhack.osdn.jp/rhdoc/coderect.html
Cをjavaに書き直したいがCの勉強が先か。

669 :デフォルトの名無しさん:2015/08/26(水) 19:17:39.07 ID:YgutvNxC.net
あるコードをVisualStudio6.0からVisualStudio2003に変更してソフトは起動するのですが、
GetCurrentDirectory関数の動きがおかしいです。
下の処理を通る時、よくソフトが落ちます。
6.0で生成したexeではおきない現象です。

GetCurrentDirectoryを使わずに。定数の文字列をつかったら落ちませんが、
できれば、GetCurrentDirectoryかそれに近い関数を使いたいです。
原因と対策がわかる方教えて下さい。

ーーーーーー//グローバル
    char szAppPath[] ;
// アプリケーション起動パス確保
GetCurrentDirectory( MAX_PATH, szAppPath ) ;//<ここは問題ない

ーーーーーー//ここの関数でカレントに全角があるとよく落ちる
      //デフォルトカレントだとたまーに落ちる
      //半角のみの任意のファルダもたまに落ちる

CString strModuleDir = szAppPath;

GetCurrentDirectory( MAX_PATH, strModuleDir.GetBuffer( 0 ) ) ;

670 :片山博文MZ ◆T6xkBnTXz7B0 :2015/08/26(水) 19:19:25.37 ID:FI4yoOkF.net
char szAppPath[] ; をchar szAppPath[MAX_PATH] ; にする

671 :デフォルトの名無しさん:2015/08/27(木) 01:23:41.97 ID:B/17Cww9.net
typeinfoのことをググってたら以下のサイトにこんな例がありました

http://cpplover.blogspot.jp/2014/10/ctypeidtypeinfotypeindex.html

struct Base { virtual void p() = 0 ; } ;
struct Cat : Base { } ;
struct Dog : Base { } ;

std::string get_name( Base & ref )
{
decltype(auto) ti = typeid(ref) ;
if ( ti == typeid(Cat) )
return u8"猫" ;
else if ( ti == typeid(Dog) )
return u8"犬" ;

return u8"謎" ;
}

コンパイルしてみると expected primary-expression before 'decltype' とエラーになります
そもそも decltype(auto) という書き方自体は正しいんでしょうか?

672 :デフォルトの名無しさん:2015/08/27(木) 01:47:35.95 ID:Hj8yQhv+.net
>>669
GetCurrentDirectory( MAX_PATH, strModuleDir.GetBuffer( MAX_PATH ) ) ;
にしないとまずいんじゃない?領域が確保されないでしょ

673 :デフォルトの名無しさん:2015/09/06(日) 08:18:00.15 ID:o5btW5BW.net
>>671
同じ人のページに情報があった。
decltype(auto) はC++14で追加された(or 追加される予定の)機能みたいね。

ttp://cpplover.blogspot.jp/2013/08/decltypeauto.html

674 :デフォルトの名無しさん:2015/09/09(水) 06:58:06.36 ID:MfaLsueu.net
Linuxのbashでこんな感じのスクリプトを書きました。

for i in `seq 1 2000000`
do
while :;
do
RND=0から65535までの数字を格納。

case $RND in
条件1)
echo hogehohe
break;;
条件2)
echo aaaaaaaa
esac

done
done

forの中で、whileをぶんまわすというだけの簡単なスクリプトを書きました。
これをforで二百万回回したいのですが、1時間に5000回ぐらいしか回せません。

できる限り早くこういうのをぶんまわしたいのですが、
コンパイラ言語?っていうんですかね、ソース書いて、実行ファイルを作るタイプの言語。

@コンパウラ言語?的なものなら、もっと早く実行できますか?
Aこういうのに適した比較的習得が簡単な言語って何かありませんか?
  やりたいことは、ぱちんこの抽選シミュレーションてきなものです。
ある知識は、bsahで簡単なスクリプトをかくぐらいです、よろしくお願いします。

675 :デフォルトの名無しさん:2015/09/09(水) 10:01:58.42 ID:/MxCO9yi.net
遅いのはechoしてるからだろ
ファイルか/dev/nullにリダイレクトしたらどのくらいで終わる?

676 :デフォルトの名無しさん:2015/09/09(水) 10:10:34.57 ID:/MxCO9yi.net
あと C/C++ のスレで聞いてるんだからC++使いたいんだと思うけど
スクリプトでもいい気がする、、まあHelloWorldからやってみては

677 :デフォルトの名無しさん:2015/09/09(水) 10:27:59.50 ID:c9DyEDAo.net
>>674
そもそもやりたいことと合ってるの?

先頭のforは時間とメモリを食うから、
for((i=1 ; i < 2000000 ; i++))
とかでないと始まるまで時間かかるし、そもそも乱数が条件に
一致したときしか次のループに進まないから、早さは乱数次第だし

678 :デフォルトの名無しさん:2015/09/09(水) 10:39:29.79 ID:UbDBGCr0.net
>>674
パチンコの抽選なんて人為的なもんだろ
純粋な乱数の訳がない

679 :デフォルトの名無しさん:2015/09/09(水) 12:15:52.21 ID:AK7tGDzj.net
RNDが偏ってて終了条件になかなか合わないんだけじゃないの?

680 :649:2015/09/09(水) 19:03:24.05 ID:MfaLsueu.net
>>675
>>677
forの書き換えと、echo 先を変えたらかなり速くなりました。
進みにムラがあるのですが(条件に一致するまで時間がかかるとかだと思います)
3倍にはなった感じです。

まずは御礼申し上げます。

>>678
これだけでパチンコってわかるってすごいですね。

>>676
>>679
質問しなおさせていただきます。

681 :デフォルトの名無しさん:2015/09/09(水) 19:04:25.80 ID:M9IJrk25.net
自分でぱちんこって書いてるじゃん

682 :649:2015/09/09(水) 19:17:35.51 ID:MfaLsueu.net
パチンコのシミュレーションをするために、
プログラムを勉強しようと思います。
プログラミング言語は、CかC++を使用しようと思います。

 @パチンコの抽選をシミュレーションするのに、bashで簡単に書いて見たのですが、
   実行速度が遅い(できれば、当たり10万回引いて数分〜1時間とかそういうのにしたい)。

   >当たり10万回引いて数分〜1時間程度とかそういうのにしたい
   というのは、識者の皆さまから見ても難しいというレベルでしょうか。

 Aスクリプト(bash)と、Cで似たようなコードを書いて、コンパイルしたものって
   超がつくほど明らかな、実行速度の違いってありますでしょうか。
   それとも「実行を早くする工夫を重ねないと、たいして速度はかわらない」もんでしょうか。
   勝手なイメージですが、スクリプトとコンパイルが必要なものを比べると、
   コンパイルしたものの方が、実行速度がすごく早いってイメージがあります。

 B今手元に、「やさしいC」と「ねこでもわかるC」という本が2冊ありますが、
   お勧めの「ド素人はこれから読め」みたいな名著ってありますでしょうか。
   ちなみに古本屋の100円コーナーにあったので、買っただけで1ページも読んでません。


>>681
うわーお恥ずかしいです・・・。申し訳ありません。

683 :デフォルトの名無しさん:2015/09/09(水) 19:27:05.49 ID:7ZaI5L5+.net
とりあえず実装するだけなら
やりたい事を1つ1つネットで調べるだけでおk

684 :デフォルトの名無しさん:2015/09/09(水) 19:29:16.87 ID:+quVusLF.net
そもそもパチンコの抽選シミュレーションがわからん。どんな動きをするのか。

685 :デフォルトの名無しさん:2015/09/09(水) 20:13:46.40 ID:4DuqUcJJ.net
アルゴリズムに関わる質問じゃないんだから、そこはノータッチでいいだろ

686 :デフォルトの名無しさん:2015/09/09(水) 20:18:16.39 ID:/MxCO9yi.net
シェルスクリプトじゃなくてPythonとかRubyとかさ
まあそこにgccも入ってるだろうからいきなり試せるよ
条件がわからんけどほぼそのまま移行できる、置き換えいるけど

687 :デフォルトの名無しさん:2015/09/09(水) 20:28:15.38 ID:luIXYWNp.net
>>682
>買っただけで1ページも読んでません。
聞く前にまず読め
んで試せ
どうせ言われて買ってもよまねぇだろw

688 :デフォルトの名無しさん:2015/09/09(水) 20:42:45.10 ID:UbDBGCr0.net
>>682
パチンコ何てやめとけ。
ギャンブルは競馬の三連単がオススメ。

689 :デフォルトの名無しさん:2015/09/09(水) 21:25:07.11 ID:V9adpqxF.net
パチンコは攻略法を発見して乗り込むと出入り禁止になるんだろ?

690 :デフォルトの名無しさん:2015/09/09(水) 21:39:20.31 ID:cP17XdT8.net
>>682
シェルスクリプトでは、10万行のループ処理にかかる時間は、
whileでは5秒、forでは9分かかる

それらを、awkとperlに書き直せば、0.1秒。
たぶん、Python, Rubyでも同じくらいだろう

特にbashは、dashよりもずっと遅い。
シェルスクリプトでは一々、
コマンド(プロセス)を起動するから遅い。
しかも外部コマンドは、組み込みコマンドよりも、さらに遅い

一般的に速い順番は、
C/C++, Java > スクリプト言語 > シェルスクリプト

Python, Ruby が比較的、簡単なのでおすすめ。
C/C++にはポインタという地獄があるので、
君の学力では無理

691 :デフォルトの名無しさん:2015/09/09(水) 21:46:28.99 ID:+quVusLF.net
なんの目的でするのかとおもった。実機の再現ができるわけないし。
もしゲームづくりに使うなら再現性よりもインチキ麻雀みたいのでもいい。
設定資料が手に入ってて、プログラムするだけなのか?

692 :デフォルトの名無しさん:2015/09/09(水) 21:52:57.11 ID:cP17XdT8.net
まあ、プログラミングコンテストでも、

C/C++, Java で、1秒間に、
100万回の計算量なら楽勝で、
500万回までで見積もる

693 :デフォルトの名無しさん:2015/09/09(水) 23:37:42.99 ID:iPfr8Kps.net
シェルでいいならシェルで
間に合わないならPerl系
でもだめなら C/C++
が通常のUnix/Linux屋の流れです。

まぁデイリなバッチならシェルで十分かと。

694 :デフォルトの名無しさん:2015/09/10(木) 09:30:34.07 ID:0F4QMyo/.net
>>689
カジノもな

695 :デフォルトの名無しさん:2015/09/12(土) 21:09:12.76 ID:LSgZsaGc.net
「猫でもわかる」はおすすめできない。
サンプルコードにまともなエラーチェックが無いからだ。
たとえばこんなサンプルコードがある。

while (p != 999) {
printf("点数(999で終了)---");
scanf("%d", &p);
if (p != 999) {
sum = sum + p;
n++;
}
}

このサンプルコードの scanf に間違えて英字を入力したら何が起きるだろうか。
scanf の値をチェックするということを教えてもらっていない読者はどうすればいいだろうか。
ちなみにサンプルコードだけでなく練習問題の解答もこんな調子だ。

696 :デフォルトの名無しさん:2015/09/12(土) 22:07:15.72 ID:2fh0eLdu.net
教えてもらっていない読者は「自分で調べる」ということをすればいいんじゃないか?

697 :デフォルトの名無しさん:2015/09/12(土) 22:26:19.03 ID:shptMOS6.net
というか《何を》説明するために掲載されたサンプルコードなんだ?
その説明コンテクストの中でscanfの例外処理云々は本質的に説明に関係するのか?

698 :デフォルトの名無しさん:2015/09/12(土) 23:17:57.19 ID:0C2xMlx4.net
scanfはバッファから読み出してエラーだったらバッファに残す よって・・・

699 :デフォルトの名無しさん:2015/09/12(土) 23:32:28.62 ID:Y0QkDcDu.net
>>695
エラーチェックが一々書いてあったら、
何の処理を説明しているのか、
わからなくなるので読むのが面倒

普通はソースコードの7割は、エラーチェックなので、
それを書くと、本のほとんどがエラーチェックで埋まり、
その本を買う価値がなくなる

700 :デフォルトの名無しさん:2015/09/12(土) 23:57:17.62 ID:JUZlHW5G.net
大体そんな本は エラー処理は考慮してないって書いてるもんね。

701 :デフォルトの名無しさん:2015/09/13(日) 00:01:49.26 ID:9Xvo2tPa.net
昔、ある本で、scanfを使うな。getsを使えと書いてあったね。
getsで入力を受け取ってそれをatofとかatoiで変換するほうが、安全だと書いてあった。
たしかにそうだと思ったという記憶がある。
いまでは、C++のcinとかcoutを使っている。

702 :デフォルトの名無しさん:2015/09/13(日) 00:49:11.00 ID:12WRp03/.net
getsはバッファオーバーフローの危険がある
fgetsを使う

703 :デフォルトの名無しさん:2015/09/13(日) 01:02:58.51 ID:M0wiS1Aa.net
二次元ベクトル場の演算結果を表示したいのですがどのような方法を使えば出来ますか?
言語はC++とC#くらいしか書けません

704 :デフォルトの名無しさん:2015/09/13(日) 01:38:19.05 ID:q3JnkdTU.net
よくしらんけど、Gnuplotとかは?

705 :デフォルトの名無しさん:2015/09/13(日) 01:43:29.35 ID:M0wiS1Aa.net
描画速度が速い方が良いです

706 :デフォルトの名無しさん:2015/09/13(日) 01:48:19.73 ID:HfSTz78x.net
教科書に従って一つ一つ計算していくしかないが?

707 :デフォルトの名無しさん:2015/09/13(日) 01:59:04.97 ID:q3JnkdTU.net
リアルタイムに描画したいんなら、
WindowsならDirect2DかGDI+かかな

708 :デフォルトの名無しさん:2015/09/13(日) 09:55:27.28 ID:iqWIwAuh.net
>>701
もし670が、while文の使用例を読者に分かってもらうために掲げられたサンプルなら、
「scanfは危険だから―」なんて本題からはずれた話題を一緒くたに提供すると主題がぼやけるだろ。
while文の動作を理解することとscanfがエラーに脆弱であることとは何の関係もない。
そんな話は別の章(例外処理とかエラー対策とか)で解説するべきなんだよ。
そもそも "C言語やプログラミングそのものがまったく初めてという方を対象にした入門書" にどこまで求めているんだよ?って話。

709 :デフォルトの名無しさん:2015/09/13(日) 10:23:29.26 ID:iqWIwAuh.net
すまん、アンカーミスと本文ミス
--
誤: >>701
正: >>695

誤: while文の動作を理解することとscanfがエラーに脆弱であることとは何の関係もない。
正: while文の動作を理解することとscanfがエラーに脆弱であると理解することとは何の関係もない。

710 :デフォルトの名無しさん:2015/09/13(日) 13:07:17.47 ID:llmGp1Am.net
まぁ突っ込むとしたら
今は別のやり方で置き換えられてる
っていう但し書きがほしい部分があるくらいかな

711 :デフォルトの名無しさん:2015/09/13(日) 17:28:05.59 ID:/NF5k7PN.net
>>701
できれば書名か著者を知りたい
昔から入門書は入門者が書いてるような変なのが多いし

712 :デフォルトの名無しさん:2015/09/13(日) 17:58:30.83 ID:12WRp03/.net
それは入門書が入門者のために書かれているからだろ
お前のような玄人からすれば変なものに見えても
入門者からすればそんなことを理解するだけでいっぱいいっぱいなんだ

713 :デフォルトの名無しさん:2015/09/13(日) 20:42:36.34 ID:9Xvo2tPa.net
>>711
探してみたらかなり古い本(1989年発行)でした。
小川優介・西田雅昭著『プログラミングお作法』(技術評論社)
です。
この中に
「函数scanf()は、キャリッジリターン・コードの取扱方が言語仕様として定義されていないため、
処理系によっては副作用が発生します。そのため、処理系によっては予期せぬ振舞いをする場合があります。
このような副作用を考慮する必要のない標準文字列入力函数にgets()があります。函数gets()は標準入力
すなわちキーボードから1行(キャリッジリターンまで)を文字列として読み込み、このとき改行コードをヌル
コードに置き換えます。」
と書いてありました。
いまでは、Cも標準化が進んでいるようで、処理系による違いとかは無いかもしれませんが、
scanf()の書式仕様を指定する場合に間違えやすいこともあって、この本を読んでいら、gets()を
使っています。
しかしどなたがが指摘されていたように、fgets()を使うのがよりよいかもしれません。

714 :デフォルトの名無しさん:2015/09/14(月) 09:10:41.03 ID:T1dWA9Ek.net
>>713
fgets()がよりよいのではなくて、
gets()がダメなの。
新しいcでは最早deplicatedだ。

715 :デフォルトの名無しさん:2015/09/14(月) 09:52:28.85 ID:MZSqhosU.net
deprecated?

716 :デフォルトの名無しさん:2015/09/14(月) 12:58:07.90 ID:12ng6EG6.net
>>713
予期せぬ振る舞いってなんだろう。
よく言われるscanfが初心者向けでない理由は改行が空白と扱われることだけど、K&R(翻訳)のscanfの節でも、
「復改も空白文字であるから、これは、scanfで複数行に渡る読み込みも可能だということを意味している。」
とあるから処理系依存ではないだろうし

717 : ◆QZaw55cn4c :2015/09/14(月) 21:34:52.10 ID:aQticbJR.net
scanf() なんてきれいさっぱり忘れて
fgets() + sscanf() とか適当なトークン解析とかに徹したほうが幸せだよ…

718 :デフォルトの名無しさん:2015/09/15(火) 15:48:43.84 ID:RjhaFYE3.net
VC++で自作でMFCでアプリを作りました。ファイルをたくさん処理してそれぞれを吐き出すものですが
たくさんやると、タスクマネージャーやリソースモニタで見ていると、
利用可能メモリ(=スタンバイメモリ+空きメモリ)が減っていくのです
もともとアプリを走らせた起動後は空きメモリが2GB以上あったのが、500MBくらいまで減っていきメモリ不足のメッセージが出ます
メモリリークを入れてしまっているのかと思ってVC++デバッガで確認したのですが
アプリを終了させてもそれらしいリークは見つかりません。VC++のことはさておき、
タスクマネージャーのメモリなのですが、
メモリのワーキングセット、メモリのプライベートワーキングセット、コミットサイズ
ページプール非ページプールをみていてもファイル処理をいくらしても全く増えて行きません
唯一増えていくのは、ページフォルトですが、でもこれはFirefoxとかは2ケタも大きな値になっていて
関係ないと思います。
にもかかわらず、空きメモリはどんどん減っていくのです
どうなっているのでしょうか
タスクマネージャーの空きメモリとこれらワーキングセット等の関係を教えてください

719 :デフォルトの名無しさん:2015/09/15(火) 16:04:20.23 ID:XyyEatel.net
空きメモリは気にしなくていいけど、デバッグでリーク出ないのは
ずっと確保しっぱなしで終了処理の時に初めて開放するのかもよ?

720 :デフォルトの名無しさん:2015/09/15(火) 16:15:12.97 ID:DGAx56Up.net
アプリを終了しちゃったらメモリ解放されて
リークしてるかどうかわからないだろ

721 :デフォルトの名無しさん:2015/09/15(火) 18:19:40.31 ID:Or0Sr6DS.net
先人のお言葉:
最初っからreleaseで作れ。

722 :デフォルトの名無しさん:2015/09/16(水) 09:10:34.81 ID:nf18HxN0.net
>>718
端的に言うと、空きメモリはシステム全体、ワーキングセットは特定プロセス
アプリを終了させたらアプリのリソースリークは解消するのでデバグ方法がおかしい

723 :デフォルトの名無しさん:2015/09/16(水) 10:06:19.24 ID:knfsespo.net
リークをVCが見つけてくれるという思い込みは誤り
タスクマネージャに反映されるタイミングが大幅にズレている可能性がある
ツールに頼る以前の問題

Javaとかスクリプトで悪い癖がついちゃったかね
自分でアロケートしたメモリを開放してないとか
オブジェクトをnewして返す関数なんかを呼んで後始末してないとか
そんな根本的な話じゃろ

724 :デフォルトの名無しさん:2015/09/16(水) 10:26:27.52 ID:+5AYCL9d.net
>>718
とりあえず_CrtSetDbgFlag

725 :デフォルトの名無しさん:2015/09/16(水) 10:41:46.16 ID:7sbTeZHX.net
まあ開放しないで終了させるとデバッグログにズラズラと出るんだけど
ずっと保持してて終了前には開放してるから出てないのかと

726 :デフォルトの名無しさん:2015/09/16(水) 13:34:19.60 ID:knfsespo.net
なんか違う気がしてきた
グローバルなゴッドオブジェクトに全部ぶら下げてるというオチか

727 :デフォルトの名無しさん:2015/09/16(水) 15:33:41.78 ID:a5qJ/F/3.net
タスクマネージャに表示される自アプリのメモリ使用量を増やすことなく
こっそりとメモリを使う方法が有る
この方法を使うとタスクマネージャで確認できるPC全体のメモリ使用量は増えるが
アプリ単体のメモリ使用量は増えない

728 :デフォルトの名無しさん:2015/09/19(土) 22:00:51.68 ID:ppmJVZuM.net
エンディアンについて疑問というか不安なのですが
エンディアンはソフトを使う側のCPUに依存するのでしょうか?
もしそうだとすると、ソフトの設定をファイルに保存する時にパラメータをまとめた構造体を fwite() で保存して、
そのファイルを他のPCに移動させると、エンディアンが違っていたら誤った値がロードされるのでしょうか?

対策としては2バイト以上の値をすべて1バイトに分解して自分で順番を決めてファイルに書き込むしかないのでしょうか?
readmeに「マシンを超えて設定ファイルを移動させるな」と書くのは最終手段でなるべく避けたいです

729 :デフォルトの名無しさん:2015/09/19(土) 22:06:48.11 ID:ISETQD0O.net
>>728
心配しなくてもえんでぃやん?

730 :デフォルトの名無しさん:2015/09/19(土) 22:15:19.62 ID:MCsx1TIA.net
ソフトの設定ぐらいだったらテキストにすればいい
xmlとかwindowsのiniファイルとか正にそうだよな?

731 :デフォルトの名無しさん:2015/09/19(土) 23:10:36.91 ID:4Q4PjKSm.net
心配ならhtonlしとけ

732 :デフォルトの名無しさん:2015/09/19(土) 23:19:03.51 ID:ISETQD0O.net
>>731
何やそれ?

733 :デフォルトの名無しさん:2015/09/20(日) 00:07:17.31 ID:5Bd4L2CtP
>>728
boost::serialization

734 :デフォルトの名無しさん:2015/09/20(日) 00:35:30.67 ID:Insv9mJ4.net
>>728
そういう設定ファイル使う場合、その設計時点でどっちのエンディアンを使うか
決めるでしょ普通。それに合わせて実装すれば問題は出ない

735 :デフォルトの名無しさん:2015/09/20(日) 02:14:38.18 ID:SoWNA795.net
>>728
基本的にはエンディアンが違うCPUで同じソフトは動かないから
移植することになったら読み書きを修正すればいいだけで
とりあえずは気にしなくていいよ

736 :デフォルトの名無しさん:2015/09/20(日) 02:39:52.78 ID:Oy+vde1J.net
WIN32_FIND_DATA を用いてファイルを列挙し、ifstream から読みこもうとしています
その際にread 関数へ渡すファイルサイズ情報として、nFileSizeHigh,nFileSizeLow を得ました

nFileSizeLow はそのまま一回で扱えるので問題無いのですが、
nFileSizeHigh の値を利用する場合、手動でサイズ計算して複数回に分けて読み込むしかありませんか?

737 :デフォルトの名無しさん:2015/09/20(日) 06:13:05.69 ID:SoWNA795.net
そんな大きなサイズを一気に読み込むの?

738 :デフォルトの名無しさん:2015/09/20(日) 23:03:50.54 ID:DWK3Vubo.net
64bitアプリなら一気にいけるかもしれないが32bitアプリなら無理なので小分けするしかない

739 :デフォルトの名無しさん:2015/09/21(月) 22:46:34.73 ID:yAF/qNFv.net
メモリマップドファイルとか?

740 :デフォルトの名無しさん:2015/09/21(月) 23:58:16.62 ID:DTNjasVP.net
ありがとうございます、大人しく小分けにします

>>737
言われてみればご尤もなので、
適当なサイズを上限に小分けして読み込む処理で統一する事にします

741 :デフォルトの名無しさん:2015/09/24(木) 15:34:21.58 ID:l6wjQdp1.net
>>732
socket.h とか winsock2.h とか
要は外に出るときはネットワークバイトオーダーに統一すると

最初から複数の環境に対応させるならこうだけど、
通常は最初に作ったやつに合わせる
フォーマットだけ提供するならバイトオーダーマークを入れる手も

742 :デフォルトの名無しさん:2015/09/25(金) 13:24:21.54 ID:cJmaZWu4.net
>>703
二次元ベクトルなら、XY座標系なんだし
C++でもC#でも、オペレーター使えるから
XY座標系のベクトルを管理、処理する行列クラス作れば
良いんじゃない?
XY座標系だから、二行一列の行列処理だし

743 :デフォルトの名無しさん:2015/09/30(水) 14:17:26.63 ID:r5ugZ70O.net
g++ -std=c++11で以下のコードでエラーが出るのですが、
int main(int argc, const char *argv[]){
int array[12] = { 1234 };
int* p = array;
int pi;

pi = reinterpret_cast<int>(p);
}

main.cpp:12:31: error: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
pi = reinterpret_cast<int>(p);
^
make: *** [main.o] エラー 1

reinterpret_castはこのコンパイラでは使えないという事ですかね?

744 :デフォルトの名無しさん:2015/09/30(水) 14:37:40.72 ID:lHbG4YHv.net
>>743
そのpiには、何が入ってるのが期待値なんだ?

745 :デフォルトの名無しさん:2015/09/30(水) 14:37:59.43 ID:rddxCA32.net
>>743
それLP64かLLP64じゃないの?
ポインタは常に64bitでもLP64とLLP64ではintは32bitしかない

746 :デフォルトの名無しさん:2015/09/30(水) 15:05:10.92 ID:r5ugZ70O.net
>>744-745
なるほど、bitの上限の問題でしたか。
longでcastしたらarray[0]のアドレスを取り出せました。
このままでは移植性が0ですね。
有難う御座いました。

747 :デフォルトの名無しさん:2015/10/07(水) 15:28:03.37 ID:GRynzwR1.net
if (no % 2 )

この条件式の意味を教えて下さい

748 :片山博文MZ ◆T6xkBnTXz7B0 :2015/10/07(水) 15:32:19.55 ID:Xf/Hcqsc.net
>>747
noを2で割ったときの余りが0でなければ

749 :デフォルトの名無しさん:2015/10/07(水) 16:08:48.59 ID:jyxNZJK8.net
noの肩が何で%がオーバーライドされていない事が確認できないので
そのコードだけでは結論は下せない…

750 :デフォルトの名無しさん:2015/10/07(水) 16:35:31.65 ID:CCbM2RdR.net
>>747
そんなコード書くな

751 :デフォルトの名無しさん:2015/10/07(水) 16:43:06.75 ID:M6BIJhgd.net
意味がわからないってことは自分で書いたわけじゃないのに書くなと言われてもなあ

752 :デフォルトの名無しさん:2015/10/07(水) 17:13:43.05 ID:Kru1mWVv.net
奇数かどうか見てるんじゃね

753 :デフォルトの名無しさん:2015/10/08(木) 20:12:40.58 ID:VJW9Q5b7.net
>>748
ありがとうございます
理解できました

754 :デフォルトの名無しさん:2015/10/09(金) 19:12:37.26 ID:EoDzitTg.net
struct gps {
float lat;
float lng;
};
vector<gps> gps1;
vector<gps> gps2;

gps1とgps2は大量の緯度経度情報を保存してあります。
このgps1,gps2の各緯度経度が一番近いものの情報を取得したいのですが
いい方法はないでしょうか?

755 :片山博文MZ ◆T6xkBnTXz7B0 :2015/10/09(金) 19:21:36.52 ID:W40lUqcY.net
>>754
二点間の距離を定義せよ

756 :片山博文MZ ◆T6xkBnTXz7B0 :2015/10/09(金) 19:53:27.88 ID:W40lUqcY.net
地球はほぼ球体であり、緯度経度情報から球面上の点の
位置座標が定まる。二点の位置座標と三平方の定理から
距離を求めることができる。距離が最小になる点が答えになる。

757 :デフォルトの名無しさん:2015/10/09(金) 20:16:27.11 ID:yuaYKRBS.net
球面三角法の問題ですね。
球面状の距離は大圏コース上の長さで定義されます。
1と2との経度と緯度をそれぞれ、Lo1, Lo2、La1, La2
とすると、角距離dは
cos d =sin La1 sin La2+cos La1 cos L2 cos(La1-La2)
で与えられます。
但し、この式は、dが0度あるいは、180度に非常に近い時は
cos dが1に非常に近い値になり、その変化が緩やかだからです。

758 :デフォルトの名無しさん:2015/10/09(金) 20:35:01.57 ID:3Zfy8nsh.net
GPSに特殊相対理論が使われてる事を説明出来れかい?
俺はなんとなく説明出来るぞ。へへん

759 :デフォルトの名無しさん:2015/10/09(金) 21:10:36.44 ID:JqWJKO83.net
WG84だっけ?なんか楕円体が決まってたよな

760 :デフォルトの名無しさん:2015/10/09(金) 21:37:04.44 ID:oggkbSfr.net
>>754
説明が分からん

761 :デフォルトの名無しさん:2015/10/09(金) 22:46:25.91 ID:W7w78kvP.net
double使えよ

762 :デフォルトの名無しさん:2015/10/09(金) 23:22:02.20 ID:nLFgz/u9.net
とりあえず、素朴な実装をコードで示してもらおうか。
最適化するのはその後だ。

763 :デフォルトの名無しさん:2015/10/10(土) 02:50:43.20 ID:9JPBBcF9.net
煽ればサンプルコードが出て来ますよ

764 :デフォルトの名無しさん:2015/10/10(土) 15:40:47.88 ID:Ver+0xRf.net
731です
緯度経度とかいてしまったのが間違いだったのかもしれません

gpsを持って同じ道を二回歩いてみて各gpsデータにおける一番近い点を取得したかった
だけなので厳密な計算方法を利用しようとは考えていませんし数mオーダーの計算は困難と
聞いております

なので一回目二回目ともに10歩歩いた時のGPSの情報、20歩歩いた時のGPSの情報、30歩、40歩、、、、
と取得していく中で何歩目が一番近いか知りたいと考えています

765 :デフォルトの名無しさん:2015/10/10(土) 19:15:39.34 ID:aygA5MQe.net
doubleの0は真のゼロですか?
==0比較が失敗することがあるんですよね
2の倍数じゃない数が正しく表現されないのは知ってるんですが
でもゼロはゼロですよね?
その辺の仕様がわかる人いますか?

766 :デフォルトの名無しさん:2015/10/10(土) 19:56:19.64 ID:kfeAURAL.net
>>765
表示上0であっても内部的に0になっているとは限らないね
doubleの0ってのが具体的にどういうもの(状況)を示しているのかちょっとわからないけど

double x=0;
x = x+ 0.3;
x = x- 0.2;
x = x- 0.1;
if(x==0) func();

これ計算すると答えは0なので関数 func(); は実行されると思いきや実行されない

767 :デフォルトの名無しさん:2015/10/10(土) 20:07:45.80 ID:aygA5MQe.net
struct A{ double a;}
A aa ={0};
こんな感じので
aa.a==0が失敗することがあるんです
比較部分はどのみちなおしますが
ただDLL作成しての呼び出しなのでバグがあるなら切り分けしたいと質問した次第でして

768 :デフォルトの名無しさん:2015/10/10(土) 20:09:43.87 ID:wZWPBuKi.net
0を表す場合は符号部、仮数部、指数部のすべてのビットを0とすると都合が良いことからそのようにされることが多い。
またその場合は+0.0で、浮動小数点では他に符号部が負をあらわし他が0の-0.0という0もあることがある。
たとえば正の数を負の無限大で割ったり、負の数を正の無限大で割ったりすると-0.0になる。

これはWikiの転載だけど、どうして自分でGoogleで検索しないの?
Google知らないの?Wiki知らないの?

769 :デフォルトの名無しさん:2015/10/10(土) 20:12:12.18 ID:wZWPBuKi.net
どうしてデバッガを使わないの?

770 :デフォルトの名無しさん:2015/10/10(土) 20:20:22.61 ID:vT1N9X7j.net
計算後の float, dobule で == が通らないのは常識だけど、誰もが一度は通る道でもあるだろ

771 :デフォルトの名無しさん:2015/10/10(土) 20:26:00.08 ID:kfeAURAL.net
>>767
初期化直後に比較するのか?

772 :デフォルトの名無しさん:2015/10/10(土) 20:44:06.40 ID:Bz6ayOgj.net
年寄りだと実数即値は0.0て書くんだろうか‥?

773 :デフォルトの名無しさん:2015/10/10(土) 21:00:20.87 ID:aygA5MQe.net
>>757
DLLで初期化して呼び出しもとで比較。ライブラリがおかしな事してなければ途中計算いっさいなし
だから気になった
>>754
んなことわかってるってーの
俺より知識のある奴はいなそうなんでもういいです

774 :デフォルトの名無しさん:2015/10/10(土) 21:07:47.17 ID:wZWPBuKi.net
ほら、まじめに相手して損したでしょう

775 :デフォルトの名無しさん:2015/10/10(土) 21:26:53.42 ID:LXdnro1p.net
>>765
インド人に聞け

776 :デフォルトの名無しさん:2015/10/10(土) 21:36:36.79 ID:vT1N9X7j.net
> ライブラリがおかしな事してなければ途中計算いっさいなし
それならバグの可能性の方が高いと思うが。
一応IEEEではビットフォーマットまでは規定していなかったはずだが、現実的にほぼ全てのマシンで同じだったはず。
それ以前に通常は同一マシン上だからビットフォーマットは当然同じ。

777 :デフォルトの名無しさん:2015/10/10(土) 21:39:39.21 ID:kfeAURAL.net
呼び出し元とDLLとでアライメントが違ってるとか

>>772
0 との比較(初期化)だと整数型からの実数型へのキャストで正確な0ではなくなるってヤツだっけ?

778 :デフォルトの名無しさん:2015/10/10(土) 21:44:17.12 ID:aygA5MQe.net
やっぱバグすかー哀しいなあ
どうもー

779 :デフォルトの名無しさん:2015/10/10(土) 22:02:45.81 ID:wZWPBuKi.net
二回連続で平気でアンカを間違うような人だからね(>>773)
注意散漫、プログラムもバグってるんでしょう

780 :デフォルトの名無しさん:2015/10/10(土) 23:01:50.02 ID:Bz6ayOgj.net
>>776
> 一応IEEEではビットフォーマットまでは規定していなかったはずだが、
おいおい、これこそが浮動小数点規格の眼目だろう
https://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#IEEE.E6.96.B9.E5.BC.8F.EF.BC.88IEEE_754_.E5.BD.A2.E5.BC.8F.EF.BC.89

>>777
> 0 との比較(初期化)だと整数型からの実数型へのキャストで正確な0ではなくなるってヤツだっけ?
たしかK&Rの初版では、整数値でも実数として処理したいばあい、コンパイラへ指示するために
明示的に .0 を付けろとか‥ 除算結果のキャストに効いてくる、とかなんとか
そのクセが染みついてる人は.0を付けたがるのかな?とw

781 :デフォルトの名無しさん:2015/10/11(日) 01:27:33.90 ID:IkPUsRem.net
それは交換形式ね。
https://ja.wikipedia.org/wiki/IEEE_754
https://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E5%80%8D%E7%B2%BE%E5%BA%A6%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

782 :デフォルトの名無しさん:2015/10/11(日) 06:18:57.29 ID:SxbzA5C5.net
ソースはウィキ

783 :デフォルトの名無しさん:2015/10/12(月) 09:31:45.35 ID:Cb4Ih0Jl.net
>>765
doubleに限らず、0は偽
0以外が真
って答えるとアスペっぽいな。

そもそも浮動小数点数型は近似値しか扱えないので
やっぱ閾値を決めて近似判定するか
ざっくり整数型にキャストして比較しちゃえば?

784 :デフォルトの名無しさん:2015/10/12(月) 10:12:05.03 ID:mWUWwMlc.net
0.1とかどうすんだ

785 :デフォルトの名無しさん:2015/10/12(月) 11:09:39.37 ID:PwRq9lmF.net
一昨日のネタにレスしてるけど意味不明だな
しかも
>浮動小数点数型は近似値しか扱えない
とか断言しちゃってるし

786 :デフォルトの名無しさん:2015/10/12(月) 12:00:37.90 ID:DSHcQooM.net
ただし、0.0には+0.0と-0.0が有るという

787 :デフォルトの名無しさん:2015/10/12(月) 13:04:46.12 ID:C+jvtDQK.net
+0.0と-0.0は比較の時にどちらも0にマッチすると思ったけど。

788 :デフォルトの名無しさん:2015/10/12(月) 15:54:34.14 ID:FoiyBQVb.net
for(int i = 0; i < 4; ++i){

このループはi=1,i=2,i=3
となるので、3回ループが実行されるということでよろしいのでしょうか?

789 :片山博文MZ ◆T6xkBnTXz7B0 :2015/10/12(月) 15:59:59.64 ID:f2n17VdL.net
>>788
i == 0を含む四回。

790 :デフォルトの名無しさん:2015/10/12(月) 16:04:27.73 ID:oCa7NkmO.net
forループカウンタを
i++
++i
は好き好きですか?

791 :デフォルトの名無しさん:2015/10/12(月) 16:06:08.48 ID:mWUWwMlc.net
for文の3つ目(変化式)は本文が実行された後で呼ばれるし
インクリメントが前置でも後置でも結果は同じ

792 :デフォルトの名無しさん:2015/10/12(月) 16:11:48.51 ID:VZXXCjAT.net
++iもi++も同じなんですか
ありがとうございました

793 :デフォルトの名無しさん:2015/10/12(月) 16:13:16.58 ID:oCa7NkmO.net
++i++
と書くと2増えますか?

794 :デフォルトの名無しさん:2015/10/12(月) 16:23:03.13 ID:iier02gv.net
>>793
http://codepad.org/OKjNAgct

795 :デフォルトの名無しさん:2015/10/12(月) 17:17:25.37 ID:08WVOaLv.net
>>790
i++ と ++iは戻り値が違う。単に整数型なら戻り値を気にしないのなら同じだが
これがクラスのオーバーロードされた演算子だと i++ は処理を終えるまで最初の値を
保持しなければならないので戻り値を取らないなら保持が無駄になる。
そういう無駄を省きたいなら普段から ++i を使いたくなるということ。

今のPCで違いなんか出るか!と言われればそれまでだが

796 :デフォルトの名無しさん:2015/10/14(水) 20:35:17.54 ID:Qq/D9jsd.net
それ以前にコンパイラがなんとかしちまうな。副作用のある関数をオーバーロードしてたら別だが。

797 :デフォルトの名無しさん:2015/10/21(水) 20:50:31.85 ID:4OC5hcF4.net
プリプロセッサか何かで、このソースは32bit環境としてコンパイルすること(-m32を付けてコンパイルしろ)、みたいな指令を
ソース中に埋め込む事ってできますか?

コンパイラはLinuxのgcc4とgcc3を併用してます

798 :デフォルトの名無しさん:2015/10/22(木) 06:50:43.75 ID:VleKFdIY.net
GCC5が出たというのに…

799 :デフォルトの名無しさん:2015/10/22(木) 14:21:39.41 ID:DwxkcuZk.net
C++でクラス内のクラスのメンバ関数から1つ上のクラスの変数にアクセスすることはできますか?

class c_Master{
 int val ;

 class c_Slave{
  void func() ;
 } ;

}

func()の中で val = 1 ; のようにvalの値を変えたいです
c_Masterのインスタンスは複数作りたいのでstaticをつけることはできません

800 :デフォルトの名無しさん:2015/10/22(木) 14:40:47.00 ID:MPE/iy9W.net
privateってことはc_Slaveはc_Masterの中からしか使わんのだろ?
だったらc_Slaveのコンストラクタでthisを渡せばいいじゃない

801 :デフォルトの名無しさん:2015/10/22(木) 15:16:14.49 ID:DwxkcuZk.net
c_Slaveの中に
c_Master* p_Master
のようなポインタを作って
p_Master->val = 1 ; という風にアクセスするということでしょうか?
それならできそうですありがとうございます

802 :デフォルトの名無しさん:2015/10/22(木) 15:22:52.34 ID:7evvohY8.net
C++の場合、Java のようなInner クラス/Outer クラス関係は無いからね。

803 :デフォルトの名無しさん:2015/10/23(金) 17:24:09.90 ID:xtwbcN6R.net
protectedじゃいかんのか?

804 :デフォルトの名無しさん:2015/10/23(金) 17:25:09.58 ID:xtwbcN6R.net
クラス内クラスか継承してるんじゃないのね。

805 :デフォルトの名無しさん:2015/10/30(金) 12:53:47.45 ID:evAKCgDF.net
初心者です
unsigned long a = b->c;
だとうまくいくのですが
unsigned long a;
a=b->c;
だとコンパイルはできるのですがbusエラーが出てしまいます
何か考える原因はないでしょうかご教授お願いします。

806 :デフォルトの名無しさん:2015/10/30(金) 14:49:29.04 ID:rNHBRIIu.net
>>805
連続した行じゃなくて、実際には間に何か処理が入っているんじゃねーの?
で、その処理スタック壊しているとか。

807 :デフォルトの名無しさん:2015/10/30(金) 14:51:21.53 ID:W7b3aTEp.net
busエラってなんだ?

808 :デフォルトの名無しさん:2015/10/30(金) 15:11:34.11 ID:rNHBRIIu.net
std::string Format(const char* fmt, ...);
的な関数を作った。
で、書式文字列しかない時には、fmt を書式文字列として扱わず、そのまま返すだけにしたいので、
std::string Format(const char* fmt);
というものを追加したが、これだと引数が一つの時、あいまいだといわれエラーになる。

そこで、
std::string Format(const char* fmt, ...); をやめて、
template<typename T>
std::string Format(const char* fmt, T dmy, ...) {
  va_list args;
  va_start(args, fmt);
  std::string rest = VFormat(fmt, args);
  va_end(args);
  return rest;
}
としたところ、フツーの Windows7 では動くが 本来のターゲットの XP embedded 環境だと
まともに動かない(これ自体は動くが、スタックを壊すらしく、後の処理が怪しくなる)。
そもそも C++ 的にこういうことはやっちゃいけないことなのか、ターゲットの環境がおかしいのか、
はたまたどうすればまともに動くようになるのか、わかる人がいたら教えておくれ。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


809 :782:2015/10/30(金) 15:19:28.97 ID:rNHBRIIu.net
おっと忘れていた。
ビルド環境は VS2010 です。

810 :デフォルトの名無しさん:2015/10/30(金) 15:20:43.27 ID:evAKCgDF.net
レスありがとうございます
趣味で今更ながらPSPむけにコンパイルしているのでコンパイラ側の問題かもしれません
busエラーについては私もどういうエラーなのかはよく存じないのですがWikipediaによると
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B9%E3%82%A8%E3%83%A9%E3%83%BC
要約するとメモリへのアクセスの失敗のようです。
また、いろいろいじくってみた結果わかったことが一つあって
関数内でaを宣言した時は問題なしなのですが
ヘッダ内もしくはグローバル変数の時の時に失敗するみたいです。

811 :デフォルトの名無しさん:2015/10/30(金) 15:29:00.20 ID:3PTV2iIj.net
>>805
ただ単に
unsigned long a;
って定義してる?
何かの構造体の中だったりしないか?

812 :782:2015/10/30(金) 15:52:07.16 ID:rNHBRIIu.net
>>808
間にレスが挟まるとわかりにくくなるからアンカ打とうぜ。
一々 ID 見るのもめんどくせーし。

#pragma packed(1)
struct T {
  unsigned long l;
  char c;
} g[10];

void func() {
  g[1].l = 1; // NG
  struct T t;
  t.l = 1; // OK
}
こんな感じ?

813 :782:2015/10/30(金) 15:55:00.87 ID:rNHBRIIu.net
>>812
落ち着けよ俺
>>810
で、 >> 785 の話はこういうことかなと。

814 :デフォルトの名無しさん:2015/10/30(金) 16:18:57.61 ID:evAKCgDF.net
>>806>>807>>811>>812さんすみませんそしてありがとう>>805です、
いろいろ試行錯誤して原因が判明しました
unsigned long a;
a=b->c;
-----別の関数--------
for(int i=0;i<a;i++)
ここでエラー発生
aに0を代入した時だけうまくいったために気づきました
・・・プログラムが肥大しすぎてつらい、どこでどんな処理をしてるか自分でも把握できてない

815 :デフォルトの名無しさん:2015/10/30(金) 22:05:24.15 ID:XZwfZSuT.net
>>814
機能別に分け!
}

816 :デフォルトの名無しさん:2015/10/31(土) 19:42:54.91 ID:23sVEfSr.net
困難は分割せよ

817 :デフォルトの名無しさん:2015/10/31(土) 19:53:22.22 ID:F017Euy3.net
人類の工学5000年の知恵:分割統治
それが分科の学となって科学となった。

818 :デフォルトの名無しさん:2015/11/03(火) 13:35:41.07 ID:fim1V6dp.net
C++初心者です。
下記Aのプログラムのif部分をBへと変更したいのですが、
エラー「これらのオペランドと一致する演算子 "||" はありません」
と表示が出てしまいます。
これを実現するには、オーバーロードという処理をしないといけないのでしょうか?
それともなにか、string型の比較用に使える関数でもあるのでしょうか?

■A
string a="文字列";
string b="文字列";
int x=0;

if (a == "文字列" ) x++;
else if (b == "文字列" ) x++;

■B
if( (a || b) == "文字列" ) x++;

819 :デフォルトの名無しさん:2015/11/03(火) 13:45:06.06 ID:kfNzP733.net
>>818
そういう簡略化記法はない
if( (a == "文字列" || b == "文字列" ) x++;
とでもするしかない

820 :デフォルトの名無しさん:2015/11/03(火) 13:55:56.16 ID:i649bMmf.net
bool AorBequals(a, b, "文字列")

こうやって使える関数を作ればいい

まあ条件分岐はとにかくバグが入り込みやすいので
あまり込み入ったことをせずベタに書いたほうが後々楽

821 :デフォルトの名無しさん:2015/11/03(火) 13:59:02.87 ID:fim1V6dp.net
>>819
ありがとうございました。
単純な文法ミスでしたね・・・失礼しましたorz

822 :デフォルトの名無しさん:2015/11/03(火) 14:04:54.96 ID:fim1V6dp.net
>>820
bool型で関数作成もわかりやすそうですね!
ありがとうございます。

823 :デフォルトの名無しさん:2015/11/05(木) 23:04:17.94 ID:nUM8ca/H.net
static じゃないメンバ変数を自クラスからアクセスするのにクラス名つけるのってありですか?

CHoge::mVal = 0; 見たいに書く。

824 :デフォルトの名無しさん:2015/11/05(木) 23:09:25.24 ID:Rl0ElxiZ.net
多重継承で同じ名前があるのかな?と思う

825 :デフォルトの名無しさん:2015/11/06(金) 00:38:00.62 ID:ykiXGTEN.net
定数の定義について質問です。

連番の定数を定義する時には、enumを使いますが、
これで作られるのは全部変数で、各定数ごとにメモリを確保しているんですよね?

メモリを消費したくない場合、enumを使わず、#defineを行ったほうがいいのでしょうか?

826 :デフォルトの名無しさん:2015/11/06(金) 00:52:10.14 ID:eLeZ0/m6.net
定数じゃなかったっけ?

827 :デフォルトの名無しさん:2015/11/06(金) 03:06:29.77 ID:2no8hc5C.net
enum自体はメモリ消費しないよ

828 :デフォルトの名無しさん:2015/11/06(金) 08:22:06.66 ID:nauUzqH5.net
windows上でopenCVってのを使いたいと思って居ます。

使用OSがwindowsなのでダウンロードするopenCVはwindows版で良いとしても、コンパイラはvc++になるのでしょうか?
ご教示頂けたら幸いです。

※後にJavaにてGUIを生成して、JNIで上記を呼び出したいと思って居ます。

829 :デフォルトの名無しさん:2015/11/07(土) 08:41:45.90 ID:WJci58Ju.net
コンパイラなんて何でもいいと思うけど
というかjava版のOpenCV使えば?

830 :デフォルトの名無しさん:2015/11/07(土) 14:08:38.72 ID:aJXYP9QX.net
>>829
公式なら使うのですが、確か非公式だった様な。

vc を使う事にしました、ありがとうございます。

831 :デフォルトの名無しさん:2015/11/08(日) 11:36:04.59 ID:RpsuGr6i.net
>>825
定数だよ。
ついでに言えば、連番に限らないよ。
例えば、enum RelativeDays {Tommorow = 1, Yesterday = -1}なんてのもできなくはない。

832 :デフォルトの名無しさん:2015/11/08(日) 12:47:29.54 ID:vx6yITef.net
>>825
> これで作られるのは全部変数で、各定数ごとにメモリを確保しているんですよね?
> メモリを消費したくない場合、enumを使わず、#defineを行ったほうがいいのでしょうか?
このenumの理解度からして闇が深そうだな。

enum tag {e1, e2, e3, …};
e○ごとにメモリを確保してるわけじゃないよ。単に列挙型要素を宣言してるだけでまだ実態はない。

enum tag val1, val2, val3, …;
実際にメモリを確保するのは変数のval○を定義するとき。

まあ他に、#defineじゃなくてenumを使えば、コンパイル時にチェックしてくれるとか利点はある。

833 :デフォルトの名無しさん:2015/11/08(日) 13:50:53.72 ID:2JTWdxT9.net
enumのメモリ消費気にするってw
どんだけたくさん使う気だよ

834 :デフォルトの名無しさん:2015/11/08(日) 15:43:20.16 ID:rgUuUfPG.net
C++デーモン小暮「グハハハハ! お前もカプセル化してやろうか」

835 :デフォルトの名無しさん:2015/11/08(日) 17:29:06.95 ID:Kfq1KjrF.net
ファイルに書き込みができない
解決策を教えてほしいです

#include <stdio.h>

int main(void){
int i;
int n = 4;
double x;
double y;
double data_x[4] = { 0.8, 1.8, 2.8, 3.8 };
double data_y[4] = { 0.7174, 0.9738, -0.6119, -0.4646 };
FILE *output;
errno_t error;
if ((error = fopen_s(&output, "output.dat", "w")) == NULL){
printf("Can't opne file\n");
}
else{
fprintf(output, "%f,%f\n", data_x[0], data_y[0]);
fclose(output);
printf("Completed\n");

}
return 0;
}

836 :デフォルトの名無しさん:2015/11/08(日) 17:35:45.22 ID:FJ7EwzEm.net
>>835
戻り値
正常終了した場合は 0 を返します。
失敗した場合はエラー コードを返します。
これらのエラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。

だから fopen_s 正しくはこっちじゃね?

if ((error = fopen_s(&output, "output.dat", "w")) != NULL){

837 :デフォルトの名無しさん:2015/11/08(日) 17:43:23.07 ID:Kfq1KjrF.net
>>836
なるほど,解決したわ

ありがとう

838 :デフォルトの名無しさん:2015/11/08(日) 19:21:46.97 ID:gczgyzuS.net
0を返すってんだから0と比較しろって。
NULLが0じゃない環境も今時珍しいけど

839 :デフォルトの名無しさん:2015/11/08(日) 20:08:14.33 ID:zLvmLdPT.net
それはおかしい
NULLは内部でどういう数値を使っているかにかかわらず
ソースコード上ではNULLはdefineで0と定義してあるのではないかね
だからどうであれソースコード上で0に置き換わるのでは?
しかし((void *)0)と定義して有る場合はコンパイルエラーになるね

840 :デフォルトの名無しさん:2015/11/08(日) 20:13:55.15 ID:rhG8pOkx.net
最終的に置き換わるからって問題じゃなくね
そんなソース引き継ぎたくないわw

841 :デフォルトの名無しさん:2015/11/08(日) 20:22:17.19 ID:krAhSW9o.net
環境によっては-1のこともあると大昔に聞いた気がする。だからNULLと書かなきゃいけないと
今はnull_ptrがあるけど

842 :デフォルトの名無しさん:2015/11/08(日) 20:56:58.16 ID:zLvmLdPT.net
それはない
ヌルポの内部表現が-1だったとしてもソースコード上では0がヌルポ
ポインタが出ててくる事が期待される箇所に0が出現したら
コンパイラはヌルポインターを生成するとCの仕様で決まっている

843 :デフォルトの名無しさん:2015/11/08(日) 21:33:04.75 ID:qUw9KKbb.net
0と比較しろって書いてるんだろ?

844 :デフォルトの名無しさん:2015/11/08(日) 21:42:38.26 ID:RpsuGr6i.net
NULLが0じゃない、0がNULLなんだ。

つー話はさておき、今時詰め込むメリットないから代入と評価は分けようぜ。

845 :デフォルトの名無しさん:2015/11/08(日) 21:44:47.09 ID:zLvmLdPT.net
>NULLが0じゃない、0がNULLなんだ。

いやそれはおかしい

846 :デフォルトの名無しさん:2015/11/08(日) 21:47:30.04 ID:rhG8pOkx.net
>>845
お前否定しかしてないけどお前が間違ってるっていうw

847 :デフォルトの名無しさん:2015/11/08(日) 21:53:37.80 ID:zLvmLdPT.net
#define NULL 0
と定義して有るんだからNULLが0であって、0がNULLなわけではないし
0がヌルポインタなんだ、の言い間違えだったとしても
ヌルポではない普通の整数の0の場合も有るから
常に0がヌルポなわけでもない

848 :uy ◆Qawu9.2l1E :2015/11/08(日) 22:03:50.38 ID:hjGS9Lf9.net
良いじゃんC言語なんてテキトーに書いて動いた終わり。で
もう使われる事もないその程度の言語なんだから

849 :デフォルトの名無しさん:2015/11/08(日) 22:05:12.79 ID:SGCCwhdk.net
ヌル論争なんて聞き飽きた。
ヌルはゼロだと思っていても全く問題ない。

850 :デフォルトの名無しさん:2015/11/08(日) 22:22:50.58 ID:vx6yITef.net
ま、エラーの条件判断に「==NULL」と書いてるところから推理すると、fopenとfopen_sをごちゃ混ぜにしちゃったんだろうね。
最初から次のブログのコードをパクって書いていれば問題なかったのに…
http://blog.livedoor.jp/mrcom511/archives/51270788.html

851 :デフォルトの名無しさん:2015/11/09(月) 06:47:17.94 ID:imWJY0W/.net
>>839
>しかし((void *)0)と定義して有る場合はコンパイルエラーになるね

この実装しか見たことない

852 :デフォルトの名無しさん:2015/11/09(月) 07:13:22.33 ID:fyLz/sBu.net
C++の場合は#define NULL 0
Cの場合は#define NULL ((void *)0)
理由は考えろ。

853 :デフォルトの名無しさん:2015/11/09(月) 07:35:26.18 ID:u4Kl1uhV.net
頑なにNULL論争を続けようとする人はなんなの?
なんで実装を気にしてプログラム書くの?
NULLかnullptr使うと死ぬの?

854 :デフォルトの名無しさん:2015/11/09(月) 08:35:16.46 ID:giUW2w8g.net
>>848
それは ruby であって C/C++ ではない

855 :デフォルトの名無しさん:2015/11/09(月) 16:54:52.45 ID:xDt2hEwv.net
>>847>>852
NULLがどう定義されてるかは処理系依存で、
実際0x80000000や0xffffffffで定義された処理系も存在するのよ

実際、C++の2012年のドラフト(www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)には
The macro NULL is an implementation-defined C++ null pointer constant in this International Standard.
って書いてある。要約するとNULLマクロの実体は処理系依存だって事。
お前らの環境でどう定義されてるかなんざ知らん。

一方でC99の仕様書(www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf)には
An integer constant expression with the value 0, or such an expression cast to type
void *, is called a null pointer constant.
って書いてあって、つまりC99-TC2準拠の処理系なら確実に
#define NULL 0
と書かれてるはずで、そうじゃない処理系は知ったこっちゃない

856 :デフォルトの名無しさん:2015/11/09(月) 17:13:45.53 ID:xDt2hEwv.net
ちなみに何故お前らのNULLが0で定義されてるかというと、
言語としてはそこにアクセス出来ないことになってるので
そこにアクセスしたら確実にセグメンテーションフォールトが発生するようなアドレスの一つが0だから、
というのが正しいんだけど実はこれOS依存。

x86系で動くモダンなOSを仮定するなら、
アドレス0への参照をプログラムが要求
→論理アドレス0を含むページが物理アドレスに載っていないのでページフォールト例外が発生(ディスクリプタがどうとかいう話は省略)
→OSがそれを検出
→プログラムがアクセスしようとしたアドレスが0x00000000-0x00001000番地に含まれている事をOSが認識して、SEGVを発送
→プログラムに処理が戻り、SEGVを検出
→デフォルトハンドラを読みに行って正常に異常終了する
といった流れになる。

これがCPUが違えば、例えばアドレスの最上位ビットが立ってるからだとか、
アドレスのアラインメントが取れてないからだとか、
他の方式によって検出して最終的にセグメンテーションフォールトで落とす感じになる。
なので自然とNULLが意味する値は処理系依存になる。

857 :デフォルトの名無しさん:2015/11/09(月) 18:30:01.88 ID:GSrDHzaU.net
fopen_s
https://msdn.microsoft.com/ja-jp/library/z5hh6ee9.aspx
> 戻り値
> 正常終了した場合は 0 を返します。失敗した場合はエラーコード(errno)を返します

と書いているのでNULLじゃなく 0で判定する(必要とあらばerrnoも)以外に無いと思うんだが

858 :デフォルトの名無しさん:2015/11/09(月) 19:23:27.14 ID:hqP7pMYo.net
>>855-856
C言語でヌルポインターのソースコード上での表現は0と決まっている
内部表現が0x80000000だろうが0xffffffffだろうが、ソースコード上では0と決まっている
大昔に作成されたCのFAQにもそう書いてある
>http://www.kouno.jp/home/c_faq/c5.html#0
>Q: どうやればプログラムの中でヌルポインターを得ることができるのか。
>A: ポインターを書くべきところに現れた定数0は、 コンパイル時にヌルポインターに変換される
>Q: ヌルポインターの内部表現に0でないビットパターンを使っているマシンでは、NULLはどう定義するべきかか。
>A: ほかのどんなマシンとも同じである。0 (または((void *)0))と定義 されている。
>Q: でも0よりはNULLを使うほうが、NULLの値が将来代わることを考えると、特にヌルポインターの内部表現が0でないマシンについては優れているのでは。
>A: いや。(マクロNULLを使うことは好ましいかもしれないが、上の理由 からではない。)
   マクロを使って数を書くべきところをシンボルに置 き換えることは、値が将来変わるかもしれないから、
   よくやるけど、 これはNULLを0の代りに使う理由じゃない。もう一度説明しよう。
   C言 語は、ソースコード上の0が(ポインターを使う場面では)ヌルポイン ターを作り出すことを保証している
一部抜粋してみたが、もっと詳しく知りたければ上記URLを参照のこと

859 :デフォルトの名無しさん:2015/11/09(月) 19:25:42.20 ID:hqP7pMYo.net
Cプログラマーは、昔から自分の書いたプログラムが走るマシンの実 装に関して必要以上に知りたがる。
ヌルポインターがたいていのマシ ンで、ソースコード上も多くの内部表現上も0であることが、保証さ れない仮定を招いている。
マクロ「NULL」を使うことで、その値が将 来変化するかもしれないことや、妙なマシン上では0でないことを指 しているように思えるかもしれない。
「if(p==0)」と書くと、比較す る前に0をポインター型に変換するというよりは、pを整数型に変換す ることを必要とすると解釈されがちである。
最後に(上の質問5.13で 記述した)「ヌル」という言葉は、文脈によって異なる意味を持つの に、違いを大目に見がちである。 混乱を避けるよい方法は、
C言語にはキーワードがあって(Pascalの nilのような)、それを使ってヌルポインター定数を要求すると考える ことである。
コンパイラはソースコードから型が決定できるときは、 "nil"を正しい型のヌルポインターに変換することができるし、でき ないときは苦情を出す。
実際にはヌルポインターのC言語のキーワー ドは"nil"ではなく「0」である。0は"nil"とほとんど同じ働きをする。
違いは、ポインター以外が必要な状況ではキャストされていない0に はエラーメッセージを出す代りに整数の0を作り出すことである。
キャ ストされていない0をヌルポインターのつもりで使うと、そのコード はうまく動かないかもしれない。

860 :デフォルトの名無しさん:2015/11/09(月) 19:37:07.11 ID:fyLz/sBu.net
>>855
4.1 Pointer conversions [conv.ptr]
1 A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t.

どこにも「0x80000000や0xffffffff」でも良いなんて書いてない。
無知自慢しなくても良いぞ。

861 :デフォルトの名無しさん:2015/11/09(月) 19:46:58.51 ID:xDt2hEwv.net
>>858-859
fopen_sなんて関数使ってるから「仕様に完全に準拠してるわけではないC++」についての話題だと思ってたよ。
C言語に関しては、仕様に準拠してりゃ確かにそれが正しい。

俺の発言の要点は、
・変な処理系もあるよ!
・C++ではNULLの見かけ上の値すら未定義(なので便利で適当な値が使われる)。
・Cの処理系では0(仕様通りなら)。
の3つであって、なんで噛みつかれたのかさっぱり分からんのだが。

862 :デフォルトの名無しさん:2015/11/09(月) 19:51:21.75 ID:xDt2hEwv.net
>>860
null pointer constantは整数0か、又はstd::nullptr_t型の値(要はnullptr)だって事だろ。
nullptrを整数に(正確にはビット列に)した時の値については何も言ってないのよ。

863 :デフォルトの名無しさん:2015/11/09(月) 20:10:28.11 ID:hqP7pMYo.net
誰もヌルポインターの内部表現の話なんかしてねーよ

864 :デフォルトの名無しさん:2015/11/09(月) 20:28:36.21 ID:fyLz/sBu.net
>>862
バカめ
> NULLがどう定義されてるかは処理系依存で、
> 実際0x80000000や0xffffffffで定義された処理系も存在するのよ
実際に存在するとは、どの処理系だ? それが存在するなら、それは規格を満たしていない。

これ以上、無知の上塗りせずに、間違いを認めて引っ込んだ方が良いぞ。

865 :デフォルトの名無しさん:2015/11/09(月) 20:51:17.62 ID:xDt2hEwv.net
触れたのがあまりに昔で名前は出てこないけど、当時NULLが0だと思ってて嵌ったことは覚えてる。
今は規格に準拠してりゃCでもC++でも0なのか。

866 :デフォルトの名無しさん:2015/11/09(月) 20:58:09.57 ID:eC7QTO9C.net
何時の時代の話かは分からんのだが、
NULLが-1になってた処理系に遭遇したって都市伝説は耳にしたことがあるな

867 :デフォルトの名無しさん:2015/11/09(月) 21:01:16.83 ID:fyLz/sBu.net
根拠として「C++の2012年のドラフト」をあげているんだから、その言い訳は通用しない。
まだ、恥の上塗り続けるつもりか?

868 :デフォルトの名無しさん:2015/11/09(月) 21:05:08.74 ID:xDt2hEwv.net
NULLが0じゃないこともあるって知識を元に適当に仕様をググッて斜め読みしたらそう読めたんで
そう書いたって話。
誤解させてごめんよ。

Cの仕様でNULLが0だって決まってる方がむしろ驚いてる。

869 :デフォルトの名無しさん:2015/11/09(月) 21:32:53.50 ID:J1dkkwNY.net
内部表現が0とは限らない,というだけの話だろう
いずれにしてもポインタが期待されるところで 0 と書けば,それはヌルポインタであることには変わりない

870 :デフォルトの名無しさん:2015/11/09(月) 21:33:59.13 ID:NTgR53a+.net
>>866
俺も聞いたことがある
30年くらい前
まだマシン毎にコンパイラが乱立してた頃

871 :デフォルトの名無しさん:2015/11/09(月) 22:28:11.83 ID:GSrDHzaU.net
実装が
#define NULL 0
だろうがなんだろうが fopen_s は「成功は == 0 で判定しろ」ってんだからさ
NULLで判定しても良いなんてガキみてぇなことグチャグチャ言ってないで
ちゃんと 0 で判定しろよガキ

872 :デフォルトの名無しさん:2015/11/09(月) 22:28:25.78 ID:fyLz/sBu.net
>>870
ANSIでCの規格が制定される前は規格がなかったからね。

873 :デフォルトの名無しさん:2015/11/09(月) 22:42:43.69 ID:fyLz/sBu.net
>>871
それはそのとおり。
ヌルポがオール0以外な環境だったら、判定が間違う可能性があるからね。

874 :デフォルトの名無しさん:2015/11/09(月) 22:49:48.54 ID:hqP7pMYo.net
確かに整数を返すのだから0と判定したほうが良いのは確かだが

>ヌルポがオール0以外な環境だったら、判定が間違う可能性があるからね。

この根拠はおかしい
NULLはどの環境でも内部表現に関わらずソースコード上では0に置換されるから
ただし、((void*)0)に置換される環境では整数の0のつもりでNULLを使うとコンパイルエラーになるが

875 :デフォルトの名無しさん:2015/11/09(月) 22:59:02.41 ID:ZbpKjgrs.net
>ソースコード上では0に置換される
ちがくない?0はNULLポインタになるけどただし以降に書いてるとおりNULLは0になるかどうかわからんでしょ

876 :デフォルトの名無しさん:2015/11/09(月) 23:07:52.73 ID:kUB8xo8u.net
俺も>>838>>843>>871あたりが正論と思うね
>>839からの流れがおかしい
NULLが0と等しいか、などと議論すべき事柄じゃない
そもそもfopen_sの解説からしてリテラル0と比較するのが理に適っている
それをわざわざNULLマクロというワンクッションを挟んで記述する合理的理由がない

877 :デフォルトの名無しさん:2015/11/09(月) 23:18:15.81 ID:fyLz/sBu.net
>>874
int x;
x == (void *)0;
これ警告は出るけどエラーにならないでしょ。

878 :デフォルトの名無しさん:2015/11/09(月) 23:45:30.61 ID:eIzs0U/u.net
NULLはゼロだと思っておけば良い。

879 :デフォルトの名無しさん:2015/11/10(火) 01:09:51.87 ID:0bGxannp.net
思うのは勝手だがNULLをゼロの代わりに使ってはいけない

880 :デフォルトの名無しさん:2015/11/10(火) 02:14:04.89 ID:YWed6J6d.net
struct Location {
int x;
int y;
int z;
};
って
Position pos = {1, 2, 3};
みたいに宣言出来るのにLocationを引数をとる関数にGetValue({1, 2, 3})みたいに出来ないのはなぜですか?

881 :デフォルトの名無しさん:2015/11/10(火) 02:15:23.33 ID:YWed6J6d.net
PositionはLocationの間違いです

882 :uy ◆Qawu9.2l1E :2015/11/10(火) 02:16:33.56 ID:rHJUCiJo.net
どのみち環境依存の関数使って書いてるのにNULLだけこだわるアホ

883 :デフォルトの名無しさん:2015/11/10(火) 02:34:08.03 ID:co6NjOXk.net
>>880
出来るが

struct location_t{ int x, y, z; };

void func( location_t pos ){} //OK;
void func( location_t &pos ){}; //NG
void func( location_t &&pos ){}; //OK

884 :デフォルトの名無しさん:2015/11/10(火) 02:39:07.56 ID:YWed6J6d.net
struct location_t{ int x, y, z; };

void func( location_t pos ){} //OK;
これに対して
func({1,2,3});
とするとE2188構文エラーが出ました

885 :デフォルトの名無しさん:2015/11/10(火) 03:04:26.38 ID:co6NjOXk.net
環境は?
こっちはVS2013で試したけど動いたよ

886 :デフォルトの名無しさん:2015/11/10(火) 07:52:52.72 ID:3CFe6hEs.net
>>880
Position pos = {1, 2, 3};
これの右辺は初期化子という構文要素、
GetValue({1, 2, 3})
これのカッコ内は式という構文要素。
使用出来る形式が異なる。

887 :デフォルトの名無しさん:2015/11/10(火) 07:57:59.40 ID:/JKv2M44.net
NULLは今は0かも知れないが、0が常にNULLと同じ意味を持っている訳ではないってことだろ
#define FOPEN_S_OK (0)
とでもやっておけよ

888 :デフォルトの名無しさん:2015/11/10(火) 07:59:17.49 ID:3CFe6hEs.net
ちなみに後者はC99のコンパウンドリテラルという書式で、
GetValue((struct location_t){1, 2, 3})と記述出来る。
C++(11?)ならGetValue(location_t{1, 2, 3})

889 :デフォルトの名無しさん:2015/11/10(火) 08:42:35.36 ID:1JfD7fk6.net
コンストラクタでいいだろ

890 :デフォルトの名無しさん:2015/11/10(火) 08:42:47.62 ID:xDrjxquL.net
c++ならstd::initializer_listで貰ってイテレータ回しながら関数内で初期化出来たり。

int GetValue(std::initializer_list l) {
for (auto it = l.begin(); it != l.end(); ++it) {
// do something
}
}

GetValue({1,2,3}) // OK

891 :デフォルトの名無しさん:2015/11/10(火) 08:48:41.86 ID:xDrjxquL.net
天ぷらが抜けた

892 :デフォルトの名無しさん:2015/11/10(火) 08:58:57.20 ID:uEihdd6c.net
C++から離れて舞い戻ったらnullptrてあるんだな。
浦島太郎状態

893 :デフォルトの名無しさん:2015/11/10(火) 09:10:00.14 ID:3CFe6hEs.net
void *からの暗黙変換できないからね。崩れかけてるトランプタワー。

894 :デフォルトの名無しさん:2015/11/10(火) 09:26:37.61 ID:2PTLdG6J.net
>>885
Borland C++ 5.5.1です

>>888
調べてみたところどうやらこのコンパイラはその規格に対応してなかったようです
このコンパイラで引数のところに{}で指定する方法はないですか?

895 :デフォルトの名無しさん:2015/11/10(火) 09:32:51.25 ID:3CFe6hEs.net
>>894
無理だね。

896 :デフォルトの名無しさん:2015/11/10(火) 09:33:46.06 ID:eBvt9LNV.net
orland C++ 5.5.1からLLVM/Clangへ移行

897 :デフォルトの名無しさん:2015/11/10(火) 09:38:04.56 ID:2PTLdG6J.net
>>895-896
ありがとうございます
このコンパイラでは駄目なようですね

898 :デフォルトの名無しさん:2015/11/10(火) 18:01:22.35 ID:XNBaBHgi.net
写真は、文字列を関数に渡して逆順にして返す、という問題の解答ですが、疑問があります。

char *s = "文字列"
これは文字列リテラルのアドレスを渡しているので書き換えができるかは処理系依存という理解でいいでしょうか?

899 :デフォルトの名無しさん:2015/11/10(火) 18:02:25.06 ID:XNBaBHgi.net
画像貼り忘れました。。

http://i.imgur.com/4mqb1BM.jpg

900 :デフォルトの名無しさん:2015/11/10(火) 18:28:45.77 ID:xgXHwxle.net
>>898
どうなるかは処理系依存。

The effect of attempting to modify a string literal is undefined.
って書いてあった。

char s[] = "This is a test.";
が正しいと思うのです。

901 :デフォルトの名無しさん:2015/11/10(火) 18:45:03.85 ID:0bGxannp.net
>>899
'\n' がキモいな。 endlだろうI like C++ならw

902 :デフォルトの名無しさん:2015/11/10(火) 19:19:58.99 ID:3CFe6hEs.net
C++なんて破綻したのをlikeな地沼って存在するのか?

903 :デフォルトの名無しさん:2015/11/10(火) 19:23:43.03 ID:37NidK9w.net
>>898
余り詳しいわけではないけど、俺は処理系非依存だと思う。(常に書き換えできる)
charとstd::stringは別物だろ。

904 :デフォルトの名無しさん:2015/11/10(火) 20:36:58.14 ID:c0uHB6kx.net
みなさんありがとうございます。
これは独習c++という本ですが、第3版14刷とかなり版を重ねていて他の説明などは分かりやすく書かれているので少し気になりました。

905 :デフォルトの名無しさん:2015/11/10(火) 20:59:32.52 ID:1JfD7fk6.net
>>903
文字列リテラルがROMに配置されてたら書き換え不能じゃね?

906 :デフォルトの名無しさん:2015/11/10(火) 21:18:58.96 ID:XNBaBHgi.net
>>903

非依存と書かれていたのですね。見落としてました。
私の環境では
vs2015 実行時強制終了
g++ コンパイル時にエラー
borland 書き換え可能
となっています。

907 :デフォルトの名無しさん:2015/11/10(火) 21:45:36.71 ID:YYcxvMD9.net
endlはフラッシュ処理が入るから若干遅い

908 :デフォルトの名無しさん:2015/11/10(火) 21:51:28.42 ID:FYErR5Mx.net
endlにフラッシュ処理が入る…

909 :デフォルトの名無しさん:2015/11/10(火) 22:12:49.13 ID:1JfD7fk6.net
フラッシュ処理の遅延気にするってw
どんだけ出力する気なんだよw

910 :デフォルトの名無しさん:2015/11/10(火) 22:36:41.93 ID:37NidK9w.net
>>905-906
処理系依存だった。
> 同じ文字列リテラルが区別されるかどうかは処理系での定義による。
> 文字列リテラルを変更しようとするプログラムのふるまいは不定である。
> K&R第2版P236(A2.6)、ただしその後の変更があった場合は知らない
ちなみに記憶クラスはstaticで定数扱いだから、ROM領域においてもいいらしい。

以下ページだと
char s_l* = "literal'; // リテラルを指す
char s_a[] = "literal"; // 自動変数を指す
みたいな感じだね。つまり>>900も正解。
http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01077.html

911 :デフォルトの名無しさん:2015/11/10(火) 23:15:02.95 ID:xDrjxquL.net
ポインタを表すべき場所での0がヌルポインタになるのは分かったんだけど、
もし本当にアドレス0のデータを読み書きしたくなったらどう書くのが正解なの?

volatile int8_t* text_screen = 0xb8000;
text_screen[0] = 'a';
text_screen[1] = 7;
でアドレス0xb8000に0x0761が書かれると仮定して。

912 :uy ◆Qawu9.2l1E :2015/11/10(火) 23:42:57.79 ID:0FN92oKT.net
C/C++で書かないのが正解

ゴミ言語

913 :デフォルトの名無しさん:2015/11/10(火) 23:48:09.40 ID:3CFe6hEs.net
>>911
ヒント
ポインタを表すべき場所での「定数 0」がヌルポインタコンスタント

914 :デフォルトの名無しさん:2015/11/11(水) 00:03:15.97 ID:kzShUi9X.net
>>911
アドレス指定で読み書きする必要があるような環境向けの処理系ならやりかたが用意されてるだろ。
そのコンパイラのマニュアル嫁

915 :デフォルトの名無しさん:2015/11/11(水) 00:32:08.54 ID:iOpec/0o.net
>>911
ptrdiff_tとのunion作って0をぶち込んどけ

916 :uy ◆Qawu9.2l1E :2015/11/11(水) 01:09:50.86 ID:uYSp+fPE.net
NULL == 0 とか単なるモンキーパッチ

917 :デフォルトの名無しさん:2015/11/11(水) 01:44:08.78 ID:X7TkVs/Y.net
>>911
0(NULL)でありえないアドレスと判断してるのであって、
アクセスしてはダメってわけじゃないし、できないわけではない

0番地にアクセスが必要、つまり安全ってわかってるなら、
判断の必要もなくアクセスすりゃあいい

918 :uy ◆Qawu9.2l1E :2015/11/11(水) 03:23:51.63 ID:uYSp+fPE.net
そういう判断でやってるとNULLでエラーチェックやってる場所でバグるんだよね

NULLにアクセスしてんのと同じだもん
NULLを -1 に定義しなおすのが正解

C使わないのが大正解

919 :デフォルトの名無しさん:2015/11/11(水) 03:37:46.04 ID:YjEvuyTw.net
まぁそんな状況はないって事ですよ。

920 :デフォルトの名無しさん:2015/11/11(水) 07:24:41.78 ID:mKuF2Y4X.net
>>917
いや、ダメだよ。
ヌルポインタコンスタントを、ポインタタイプに変換したものが、ヌルポインタ。
ヌルポインタは如何なるオブジェクトへのポインタとも等しく無い事が保証されている。
NULLが何かを指しているのはこれと矛盾。

921 :デフォルトの名無しさん:2015/11/11(水) 07:30:43.33 ID:/esTl/Qt.net
>>917
アクセスしちゃダメってマニュアルに書いてあるCPUもあるよ

922 :デフォルトの名無しさん:2015/11/11(水) 07:45:21.32 ID:HaR9EPgA.net
CPUからアドレス0を読み書きできるように設計したCPUがあったら
大いなる仕様設計ミスでしかない

923 :デフォルトの名無しさん:2015/11/11(水) 08:27:12.80 ID:X7TkVs/Y.net
>>922
電源入れたらゼロ番地にアクセスするCPUは設計ミスなのか?

924 :デフォルトの名無しさん:2015/11/11(水) 08:28:14.91 ID:dnGEiVDn.net
>>922
普通に読み書きできるよ、アドレス0にはね by Z80, i80x86

925 :デフォルトの名無しさん:2015/11/11(水) 08:51:55.79 ID:bkM6Jmzo.net
0番地が普通にアクセス可能な環境があるなら
その時には処理系がNULLに別の(特殊な)定数を割り当てようとするんじゃないかな?
ぎゃくにNULLマクロを使ってコードを書いていれば、そんな環境の違いをプログラマは意識する必要はないよね

926 :デフォルトの名無しさん:2015/11/11(水) 09:05:54.23 ID:mKuF2Y4X.net
>>925
x86(64も含む)は0番地にアクセス可能だよ

927 :デフォルトの名無しさん:2015/11/11(水) 09:20:54.95 ID:pvIjWuQG.net
論理アドレス空間と物理アドレス空間の区別がつかないなら黙ってろ。

928 :デフォルトの名無しさん:2015/11/11(水) 09:29:38.15 ID:bkM6Jmzo.net
>>926
私の言葉足らずで済みません。「プログラムから見て」R/W可能か?というつもりでした(o_ _)o

929 :デフォルトの名無しさん:2015/11/11(水) 09:34:37.50 ID:iOpec/0o.net
>>917
それだとNULLの内部表現によってはアドレス0にアクセスしたことにならない。

>>925
ソースコード上のヌルポインタコンスタントはヌルポインタの内部表現に置き換わることに注意しなきゃいけない。
つまり単に*((*int)0) = 0;等とやると実際に何が行われるかが処理系依存ということになる。

930 :デフォルトの名無しさん:2015/11/11(水) 09:42:23.33 ID:F3g6v2f+.net
>>929
ヌルポインタのデリファレンスは未定義じゃない?

931 :デフォルトの名無しさん:2015/11/11(水) 09:45:32.67 ID:iOpec/0o.net
>>930
未定義だっけ?
処理系依存って書いちゃったけど。

932 :デフォルトの名無しさん:2015/11/11(水) 12:31:12.42 ID:dnGEiVDn.net
>>925
NULL マクロなんか不要だよ、NULL って書かずに 0 って書いて全く問題ない

>処理系がNULLに別の(特殊な)定数を割り当てようとする
たぶんハードウェアのアドレス空間上にそのような特別な場所はないと思うよ

933 :デフォルトの名無しさん:2015/11/11(水) 12:56:10.74 ID:mKuF2Y4X.net
>>932
可変個数引数関数やプロトタイプが無い関数で困る。
後者は死ねで済むが。

934 :デフォルトの名無しさん:2015/11/11(水) 14:21:46.94 ID:WDtG518P.net
可変長引数の場合はキャストが必要
でもこれは良く考えれば一般的にそうだ
単に0と書いたとき、charなのかintなのかlongなのかlong longなのか
usngiendなのかsigneldなのか何なのか分らないではないか

935 :デフォルトの名無しさん:2015/11/11(水) 14:36:22.22 ID:iOpec/0o.net
va_startしてva_argすればそれ以上キャストは要らんだろ。
何言ってんの?

多分、可変長引数個数関数の最後の引数はNULLにしてねって書いてある
GTKなんかのライブラリで困るって言いたいんだと思う。

936 :デフォルトの名無しさん:2015/11/11(水) 14:38:17.18 ID:m8XjY7WS.net
スタックに積むときのサイズはコンパイラはわかってるだろ
取り出す方で判別する必要があるだけだ
リテラルの0はintだろ?

937 :デフォルトの名無しさん:2015/11/11(水) 14:41:58.95 ID:iOpec/0o.net
どうでもいいけどリテラルの0って八進数だっけ?

938 :デフォルトの名無しさん:2015/11/11(水) 14:44:02.88 ID:WDtG518P.net
君が何言ってるの?
int32とint64でサイズが違うけど
単に0と書いただけでは判断つかない
期待される型が分っている場合ならコンパイラが適切に変換してくれる
(0をヌルポインターに変換するのと同じように)

しかし可変長引数やプロトタイプの無い関数の場合は
コンパイラは期待される型がわからないから
int64のつもりで0と書いていても、コンパイラはintの0を生成するだろう
キャストするかサフィクスをつけなければならない
(ちょうど(void *)0と書かなければならないのと同じようにな)

939 :デフォルトの名無しさん:2015/11/11(水) 14:48:05.91 ID:m8XjY7WS.net
>コンパイラはintの0を生成するだろう

自分で答え書いてるじゃんw

940 :デフォルトの名無しさん:2015/11/11(水) 14:49:33.05 ID:m8XjY7WS.net
>>937
どっちでも同じだから気にしないことにしてるw

941 :デフォルトの名無しさん:2015/11/11(水) 14:49:47.71 ID:iOpec/0o.net
判別付くよね?
int32のつもりでゼロと書きたいなら単に0と、
int64のつもりでゼロと書きたいなら0lって書くけど。

942 :デフォルトの名無しさん:2015/11/11(水) 14:50:12.44 ID:WDtG518P.net
可変長引数やプロトタイプ宣言の無い関数で
受け取り側がint64のつもりで受け取っていたら
呼び出し側もint64を渡さなければならない、当たり前
しかし、単に0と書いただけではintになるから
intが32bitの環境ならスタックフレームが壊れて即座にクラッシュする
だから受け渡し側はサフィクスかキャストをして渡さなければならない
これはちょうどヌルポを渡すときに(void *)0とキャストが必要なのと同じこと
もちろん、プロトタイプ宣言があってコンパイラが関数の型を分っているなら
適切に変換されるわけだがな

943 :デフォルトの名無しさん:2015/11/11(水) 14:53:48.57 ID:m8XjY7WS.net
スタックフレームは壊れないっしょ
積んだ奴がスタックポインタを戻すcdeclだからできることではあるが

944 :デフォルトの名無しさん:2015/11/11(水) 14:54:02.25 ID:WDtG518P.net
だから可変長引数やプロトタイプの無い関数で
ヌルポインターを渡すときに(void *)0とキャストが必要というのは
数値のリテラル一般にも、そういうことだということ
特別な事じゃない
元々そういうもの

945 :デフォルトの名無しさん:2015/11/11(水) 14:55:01.00 ID:WDtG518P.net
スタックフレームは確かに壊れんなスマソ
しかしプログラムはバグるがな

946 :デフォルトの名無しさん:2015/11/11(水) 15:01:43.04 ID:iOpec/0o.net
>>942
ちょっと待って。
確認なんだけど、プロトタイプ宣言が無い関数を呼んだ時って
呼び出し側がどう書こうがintにキャストされるんじゃなかったっけ?
古いCの仕様で。

それと、君はキャストをどの意味で使ってる?
俺は(呼ばれる側が、引数の型を既に判明してる引数の情報から推測できる場合には)
reinterpret_castが必要ないって意味で言ってるんだけど。

947 :デフォルトの名無しさん:2015/11/11(水) 15:13:38.70 ID:iOpec/0o.net
ところでさ。

確かx86/x64上のCだと、32bit以下の型をスタック使って引数として渡す場合にも
スタックポインタって1引数あたり丁度32bit分ズレたと思うんだけど。

つまり、doubleだのint64_tだのを渡さない限り、可変長引数個数関数のva_argはどんな32bit以下の型に対しても
同じように上手く動く筈なんだけど、違ったっけ?

948 :デフォルトの名無しさん:2015/11/11(水) 15:31:07.69 ID:WDtG518P.net
むしろfloatはdoubleに拡張されるんじゃなかったっけか?

949 :デフォルトの名無しさん:2015/11/11(水) 15:36:59.98 ID:iOpec/0o.net
>>948
補足ありがとう。なんか忘れてる気がしてた。
それでscanfとprintfの書式に対称性がなくなるんだった。

950 :デフォルトの名無しさん:2015/11/11(水) 16:24:58.75 ID:YjEvuyTw.net
なんだかわからんが、NULLを使えばいんですよね
という当たり前の事に帰着するのであった。

951 :デフォルトの名無しさん:2015/11/11(水) 17:05:05.87 ID:mKuF2Y4X.net
NULLなんか使っちゃダメに決まってんだろ。アホウ。

952 :デフォルトの名無しさん:2015/11/11(水) 17:18:00.97 ID:YjEvuyTw.net
だから 実際問題となるケース出せ ぼけが

953 :デフォルトの名無しさん:2015/11/11(水) 17:18:55.85 ID:hcWNQVA+.net
>>937
8

954 :デフォルトの名無しさん:2015/11/11(水) 17:40:41.92 ID:Ye3Cp2LR.net
>>929
× > *((*int)0) = 0;
○ > *((int*)0) = 0;

955 :デフォルトの名無しさん:2015/11/11(水) 17:59:41.08 ID:iOpec/0o.net
>>954
なんか変だとは思ってた。
サンクス

956 :デフォルトの名無しさん:2015/11/11(水) 19:36:27.59 ID:mKuF2Y4X.net
>>952
もう一回言ってやる。
NULLなんか使っちゃダメに決まってんだろ。アホウ。

957 :デフォルトの名無しさん:2015/11/11(水) 19:45:11.77 ID:mKuF2Y4X.net
>>952
お前、致命的にバカそうだから、指摘してやろう。
NULLを使えと言い出したのはこのスレではお前がはじめてだ。

958 :デフォルトの名無しさん:2015/11/11(水) 19:59:15.39 ID:YjEvuyTw.net
だからお前はプロなのかどうなんだ。
それだけ言え。この馬鹿素人が。

959 :デフォルトの名無しさん:2015/11/11(水) 20:15:23.16 ID:iOpec/0o.net
とりあえずs/NULL/nullptr_t/gを手作業でやったことにして
明日もサボろう

960 :デフォルトの名無しさん:2015/11/11(水) 20:15:34.95 ID:mKuF2Y4X.net
プロだよ。バカ。

961 :デフォルトの名無しさん:2015/11/11(水) 20:37:39.07 ID:WOIGmI6i.net
>>921
ないと思うよ‥

962 :デフォルトの名無しさん:2015/11/11(水) 20:42:08.76 ID:WOIGmI6i.net
>>933
可変長引数では,(void *)0 ってキャストして書けばいいよ
キャストなしで,とか変な縛りはやめようね

963 :デフォルトの名無しさん:2015/11/11(水) 21:27:09.67 ID:mKuF2Y4X.net
「キャストすんな」はバカを調教する時にすごく重要
あいつら「キャストしないとコンパイラエラーが取れない」とか、真顔で言いだすから。

964 :デフォルトの名無しさん:2015/11/11(水) 22:43:57.99 ID:kzShUi9X.net
>>925
NULLをデリファレンスしたら何が起きるかわからないんだから、そのときに0番地に
アクセスすることになってもしょうがない。わざわざNULLの内部表現を変える必要なんてない。
アドレス指定のダイレクトアクセスが必要なら処理系がライブラリ用意するのが筋だろう。

965 :デフォルトの名無しさん:2015/11/12(木) 02:02:07.91 ID:vfLy0hrq.net
C言語はオワコン

966 :デフォルトの名無しさん:2015/11/12(木) 04:39:55.43 ID:X3qMcYPf.net
元々戻り値の話だったのによく飽きないな

967 :デフォルトの名無しさん:2015/11/12(木) 05:00:57.49 ID:+TRt+Sln.net
NULL使えなんて言いだして引っ張る道化が現れるから

968 :デフォルトの名無しさん:2015/11/12(木) 06:54:33.73 ID:Rz9ctgf7.net
成功時NULLと、成功時0と、成功時1以上が
混ざってるとクッソめんどい

969 :デフォルトの名無しさん:2015/11/12(木) 08:28:00.26 ID:X3qMcYPf.net
0, 1以上, NULLを同列で考えてるから混ざってると感じるだけ

970 :デフォルトの名無しさん:2015/11/12(木) 08:39:19.46 ID:Titn/2xe.net
成功時にNULLを返す関数ってどんなのがあったっけ。

971 :デフォルトの名無しさん:2015/11/12(木) 08:46:28.02 ID:0/9agn9x.net
戻り値の型が整数型なら0は返せても、NULLは返せないからな。
ポインタ型を返す関数なら、正常時に意味のあるポインタを返したいだろうからNULLを返すなんて無意味な仕様にしないだろうし。

972 :デフォルトの名無しさん:2015/11/12(木) 09:04:13.80 ID:Rz9ctgf7.net
ああすまん、最後は失敗時NULLだな

973 :uy ◆Qawu9.2l1E :2015/11/12(木) 12:11:32.58 ID:YKGP90Ph.net
経験が無いのをバレないように会話していくスレw

974 :デフォルトの名無しさん:2015/11/12(木) 12:21:56.59 ID:FMRhjNH0.net
それはお前だけ

975 :デフォルトの名無しさん:2015/11/12(木) 12:22:55.06 ID:9l61Vk4V.net
>>973
面白そうだから立てたww
http://peace.2ch.net/test/read.cgi/tech/1447298537/

976 :デフォルトの名無しさん:2015/11/13(金) 12:04:58.17 ID:P+x1lmAA.net
CのstaticとC++のanonymous namespaceってどう違うんだっけ?

977 :デフォルトの名無しさん:2015/11/13(金) 15:57:23.37 ID:cTzYhkFo.net
>>976
Cのstaticはそのファイルでのみ有効
C++ anonymous namespaceでは知らん
基本C++では宣言とコードは別ファイル
cpp側で書けば、そのファイルでのみ有効なんじゃ無い?
そんなコード書いたこと無いけどさ

978 :デフォルトの名無しさん:2015/11/14(土) 17:35:20.56 ID:Ngo/6AAy.net
>>976
staticは名前の通り記憶クラス指定子。静的寿命を持つという宣言。
関数の外でstatic宣言するとファイルスコープになるのはどっちかというと副作用。

namespaceには記憶クラスを指定する機能は無い。

979 :デフォルトの名無しさん:2015/11/14(土) 19:02:05.68 ID:iwAmPq2+.net
副作用じゃねーよ
Cは予約語をケチるため、一つの予約語を使い回す

980 :デフォルトの名無しさん:2015/11/14(土) 20:04:03.27 ID:MSvtHxf5.net
externできなくない?

981 :デフォルトの名無しさん:2015/11/14(土) 21:42:00.07 ID:5MMaz5Qo.net
>>978
>namespaceには記憶クラスを指定する機能は無い。

うそつけ

>http://exlight.net/devel/cpp/unnamed_namespace.html
>名前の有効範囲をファイルスコープに制限したい場合に利用する.
>次のように名前空間名を指定せずにnamespaceで囲むと,同一ファイル内からは見えるけど,
>他のファイルからは見えないグローバル変数などをつくることができる.
>staticじゃないの?
>文脈によって意味が変わってきてわかりにくいところが不評で,C++ではstaticではなく無名名前空間を使うようになっている.

982 :デフォルトの名無しさん:2015/11/15(日) 02:02:58.45 ID:YRBdjGon.net
いや、記憶クラスではないだろ。

namespace
{
 int g_count;
}

こうすると、コンパイラが勝手に、

namespace XYZ@20151115
{
 int g_count;
}
using namespace XYZ@20151115;

みたいな解釈をして、定義されたファイルの利用者は、namespaceを指定せずに利用できる。
が、他のファイルからはXYZ@20151115を知らないとアクセスできないので、結局アクセスできないというだけ。

983 :uy ◆Qawu9.2l1E :2015/11/17(火) 19:15:42.80 ID:f2qjXPcC.net
load "fileA.rb" , true

984 :デフォルトの名無しさん:2015/11/17(火) 21:38:05.76 ID:of/WOUg/.net
>>982
実装は関係なくね?
外から見る手段がないなら内部リンケージ以外の何者でもないだろ

985 :デフォルトの名無しさん:2015/11/24(火) 22:35:37.02 ID:RCu8tHgV.net
static int* p=0;

static int* p;
って動作違うんすか?
差し替えたら動作変わったんすけど何がどう変わったのかわからんので思い当たる節があったら教えてほしい

986 :デフォルトの名無しさん:2015/11/24(火) 22:54:27.18 ID:AGfVRi14.net
んー差し替えたのホントにそこだけ?

987 :デフォルトの名無しさん:2015/11/24(火) 23:32:05.85 ID:RCu8tHgV.net
本当にこの一文というか「=0」の二文字だけっす
ポインタの使い方が正しくないだけならともかく同じ意味のはずなのに動作自体が変わるのはおかしいなあと思って

988 :デフォルトの名無しさん:2015/11/24(火) 23:34:08.02 ID:ORfHMd4J.net
printfデバッグできるような状況でもないのかしら

989 :デフォルトの名無しさん:2015/11/24(火) 23:57:41.51 ID:XeCWO9iV.net
>>987
せめてどう変わったのかを教えて欲しい

990 :デフォルトの名無しさん:2015/11/25(水) 00:04:51.49 ID:KJ2R+Cik.net
nullptrでいいやん

991 :デフォルトの名無しさん:2015/11/25(水) 02:10:04.22 ID:VZbixYb2.net
>>988
>>989
関数の頭にこれを書いたのですが、
起動時に一度だけ0で初期化して、以降は関数内で値を保持し続けるという(静的変数にしてほしい)挙動をするのは
static int* p;
の方

static int* p=0;
だと関数を呼び出したときにたまにp=0を実行し直しているような挙動をするようです

992 :デフォルトの名無しさん:2015/11/25(水) 07:18:22.03 ID:YbqZzFFd.net
>>991
規格上の呼び方は知らんけど、C++のstatic変数の初期化のタイミングは、その宣言文が初めて実行される時と思えば良い。
宣言文が実行と言うのもおかしな表現だが。

993 :デフォルトの名無しさん:2015/11/25(水) 09:53:50.83 ID:VZbixYb2.net
>>992
ありがとう、でもstaticの機能については理解しています(staticの仕様について質問していると勘違いされそうなので具体的な挙動の違いを書くことを渋っていた)
聞きたいのは
static int* p

static int* p=0
で現に挙動が変わるのでこの宣言は何が違うのかということ

994 :デフォルトの名無しさん:2015/11/25(水) 10:53:08.74 ID:HI8L8hd9.net
static変数はコンパイル時に初期化されると信じてた俺、涙目 。・゚・(ノД`)・゚・。

995 :デフォルトの名無しさん:2015/11/25(水) 11:21:25.99 ID:Sra0FKsR.net
コンパイル時に初期化は勘違いもはなはだしいろう・・・
プログラム起動時の間違いかな

996 :デフォルトの名無しさん:2015/11/25(水) 11:28:54.79 ID:n/g2lh6I.net
>>993
コンパイラは何使ってる?
試しにclang++ -S 1.cc -o 1.S -O0でアセンブリレベルで比較したりしたけど
全く同じコードになってたよ。
gccでも同じコードになった。

>>994
コンパイル時に初期化ならconstexprだな。
実行時には書き換えできないけど。

グローバルなstaticはmain関数実行前に初期化(但し初期化に依存関係がある場合に正しく処理するとは限らない)
関数内のstaticは関数が初めて実行される時に初期化(しかもスレッドセーフ)

997 :デフォルトの名無しさん:2015/11/25(水) 16:47:14.43 ID:YbqZzFFd.net
>>993
それで、コードが変わると思えないけどな。
Cのつもりでロード時に初期化されてる事を仮定してなんか変な事やって、違うとの主張だと思ったわけ。

アセンブリリスト出力してみなよ。

998 :959:2015/11/25(水) 18:32:33.40 ID:sLdr6t9m.net
http://www.dotup.org/uploda/www.dotup.org624170.png
アセンブリコード出力してみました
微妙にpが呼び出されるタイミングが違っていて(何がどう影響しているのか全くわからんが)ここのせいで挙動が変わっているらしい
全く同じではないということがわかったのは収穫だけど、アセンブリコードについては詳しくないのでこの違いがどう響いているのか俺にはわからぬ

環境はVisualStudio2013です

999 :デフォルトの名無しさん:2015/11/25(水) 19:10:36.24 ID:n/g2lh6I.net
>>998
なんとなくだけど、左右逆じゃね?

そして、左右があってるとすればstatic int* p = 0;が
実は0で初期化されてないコードを吐いてる。

1000 :デフォルトの名無しさん:2015/11/25(水) 19:48:32.79 ID:HmIgiY2q.net
>static int* p=0

これ、意味的には初期化だけど、言語仕様的には初期化じゃなく代入に過ぎないからコードが変わるのは当たり前じゃね?

1001 :デフォルトの名無しさん:2015/11/25(水) 20:31:14.13 ID:pS65oVmN.net
は?

1002 :デフォルトの名無しさん:2015/11/26(木) 08:58:30.65 ID:4oXn5tau.net
どこかで
#define static
とかしてんじゃない?

1003 :デフォルトの名無しさん:2015/11/26(木) 09:02:13.03 ID:GuU354a3.net
動きの通りでいいんじゃない
関数内に書いてるんだったら
先(左)のは関数に入ってからゼロクリア
後(右)のはメモリ領域確保時に暗黙の初期化でしょ

1004 :デフォルトの名無しさん:2015/11/26(木) 12:21:05.77 ID:Utv/2Onf.net
>>999
もう一回試したけど左右はあってる

>>1002
ライブラリはDxLibだけ使ってるけどそんな変な仕様が入っていることはない……と思う

>>1003
原因はよくわからんが結果はそんな感じなんすかね

1005 :デフォルトの名無しさん:2015/11/26(木) 13:24:13.56 ID:GuU354a3.net
>>1004
原因わかりきってるじゃん
書いた通りに動いてるだけだよ
関数内の最初で代入するなら関数呼ばれる度に代入するんだから
暗黙の初期化がコンパイル時の最適化によって削除されるだけ

1006 :デフォルトの名無しさん:2015/11/26(木) 14:31:41.55 ID:w6z7subU.net
>>1004
c++のドラフトのsection 6.7.4によると、
The zero-initialization (8.5) of all block-scope variables with static storage duration (3.7.1) or thread storage
duration (3.7.2) is performed before any other initialization takes place. Constant initialization (3.6.2) of a
block-scope entity with static storage duration, if applicable, is performed before its block is first entered.
って書いてある。妥当ならただ一度だけ初期化しろ、そして初期化の前には0により初期化しろって事。
つまり、
static int* p;
とか
static int* p = 0;
とか書かれているなら、最初に実行されるときにはp==0が成り立った状態でその行を抜けなければならず、
しかももし代入が行われるのであれば、その代入はただ一度だけ行わなければならない。
そういう訳で、
>>1005
> 関数内の最初で代入するなら関数呼ばれる度に代入するんだから
この解釈は間違い。

一方でVC++の場合、
あのアセンブリリストが正しいなら、
static int* p = 0;
と書かれた場合にpの実体はBSSセクションに置かれる。
で、MicrosoftのPE/COFFの仕様書によると、このBSSセクションは以下の通り、初期化されないデータが置かれる事になってる。
https://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx から入手できる資料より一部抜粋
Section Name | Content
-------------|---------
.bss | Uninitialized data (free format)
つまりバグバグだって事だな!

1007 :デフォルトの名無しさん:2015/11/26(木) 16:20:53.10 ID:FOlz1cOR.net
関数内の初期値あり静的変数が関数コールの度に初期化されてたら意味無いだろ

1008 :デフォルトの名無しさん:2015/11/26(木) 20:05:34.37 ID:1UotzJYh.net
>>1006
その、Uninitialized data って初期化子で明示的に初期化されない変数(オブジェクトファイルに初期化データが無い)が配置されるところ。
ロードされた時(少なくともエントリポイントに制御が移る前)には0になってる。

こっから先はエスパーだが、
static int *p;の領域を壊している可能性が高い。
static int *p = 0;の時はC++の流儀で初回に0が代入されてバグが隠蔽される。

1009 :デフォルトの名無しさん:2015/11/27(金) 01:14:50.60 ID:Bpp9Chxs.net
>>1008
ふーむ
今cygwin/gccで__attribute__((section(".bss")))してでっかい未初期化の配列作って表示したりしてみたら
確かに0で初期化されてた。

ELFの.bssだとプログラム実行時に0で初期化されるってきちんと書いてあるんだけど、
PE/COFFの.bssにはそれが書いてないから怪しく思えたのよ

1010 :デフォルトの名無しさん:2015/11/27(金) 01:38:40.76 ID:A7JAVQ0/.net
いままでLinuxの32bit環境想定で作られたツールを、マシンをx86_64化したのにあわせて
64bit環境にmakeしなおしてます

が、一部のソースは、構造体とかで32bit環境前提で作ってあったり、リンクするライブラリが
32bit環境のものしかない等の理由により、それらのツールはgccに「-m32」オプションを
つけて、32bit環境のバイナリを作らせています

オプションは、ツール用のMakefileに「-m32」を入れてるのですが、しかしたまにソースを
流用する時、32bit専用ソースを誤って64bit環境にソースに混入させてしまう場合が
あることから、32bit環境でコンパイルさせるようにできないかと思ってます

#pragma とかで、そういうチェックや指定はできるのでしょうか

1011 :デフォルトの名無しさん:2015/11/27(金) 02:15:31.97 ID:mzBGejrM.net
>>1009
書いてあるが。
https://msdn.microsoft.com/en-us/library/thfhx4st.aspx
Variables that are uninitialized are considered to be initialized to zero and are stored in .bss.

それ以前に.bssに置かれた変数が0でないなら、MSがpeを採用した時から
世界中でPGが発狂しているという事すら考えつかないのか?

1012 :デフォルトの名無しさん:2015/11/27(金) 02:28:22.31 ID:mzBGejrM.net
>>1010
static_assert
ないなら
struct foo {int foo[sizeof(void *) == 4 ? 0 : -1];};

1013 :デフォルトの名無しさん:2015/11/27(金) 02:36:02.76 ID:Bpp9Chxs.net
>>1011
「PE/COFFの仕様書には」.bssがプログラム実行時に0で初期化されるか否かが書かれてないって話。
参照すべき資料はそいつではなく>>1006の方。

> それ以前に.bssに置かれた変数が0でないなら、MSがpeを採用した時から
> 世界中でPGが発狂しているという事すら考えつかないのか?
.bssがきちんと初期化されないならされないで、Cがそれを未初期化なstatic変数の場所として利用しなければ
発狂しないんじゃないかい?
mallocがゼロクリアされないからって誰も文句言わないだろう?

>>1010
コンパイルが通らなくなりゃそれで良いのであれば
static_assert(sizeof(ptrdiff_t) != 4, "error!");
かな。

1014 :デフォルトの名無しさん:2015/11/27(金) 02:49:14.81 ID:mzBGejrM.net
>>1013
1 C/C++の規格で0に初期化されることは要求されている
2 世界中で発狂していない
しかし、
> MicrosoftのPE/COFFの仕様書によると、このBSSセクションは以下の通り、初期化されないデータが置かれる事になってる。
と書かれている。バグだ!!!
と騒いだ道化は誰でしょう?

1015 :デフォルトの名無しさん:2015/11/27(金) 07:36:06.42 ID:A7JAVQ0/.net
>>1012
>>1013
回答ありがとうございました
コンパイルが通らなければ、それで気づくと思うので、その方法を試してみます

1016 :デフォルトの名無しさん:2015/11/27(金) 08:46:01.27 ID:Bpp9Chxs.net
>>1014
誰でしょう?私です

しかし初期化すべきデータをBSSセクションに置かないという選択をCコンパイラ作者が行ったなら
BSSセクションの中身が実際に初期化されるか否かに関わらず
世界中で発狂するような事態には決してならない、というのも正しいよね?

1017 :デフォルトの名無しさん:2015/11/27(金) 10:56:30.92 ID:mzBGejrM.net
> あのアセンブリリストが正しいなら、
> static int* p = 0;
> と書かれた場合にpの実体はBSSセクションに置かれる。
と仮定した上で、
> MicrosoftのPE/COFFの仕様書によると、このBSSセクションは以下の通り、初期化されないデータが置かれる事になってる。
と書かれている。バグだ!!!
と騒いだ道化は誰でしょう?

1018 :デフォルトの名無しさん:2015/11/27(金) 12:38:32.96 ID:K1Tb93fe.net
もう直ぐ、ニューヨークも日経も暴落します。

紅白歌合戦なんてやってられない阿鼻驚嘆の地獄絵図です。皆さんも、現金、食料の準備をしてください。

リーマン超える不況

世界貿易の「体温」を示すといわれる海運運賃指標、バルチック海運指数が1985年の統計開始以来、過去最低を記録した。
http://richa rdkoshimizu.at.webry.info/201511/article_190.html


                        日本から始まる世界的株式市場の大暴落

      , - ―‐ - 、
     /         \    終いには政府にも支えることができなくなり、日本がアメリカ国債の25%を引き出すと世界経済が破綻します。
    /    ∧ ∧  ,   ヽ    それが最終的な暴落であることがはっきりするや否や、マイトレーヤは出現するでしょう。彼は「匿名」で働いております。
   ./  l\:/- ∨ -∨、! , '
  / ハ.|/          ∨|,、ヘ     最初になくなるのは世界の株式市場でしょう。彼らは世界を餌にして生きており、何も還元しません。
|ヽ' ヽ     >  <    ノ!       マイトレーヤは次のように言われる――かれらは自分の財産を隠し、犯罪的雰囲気さえも創出している。            ×竹中&小泉  ←懲役?
〈「!ヽハ._    __    _.lノ 
 く´ \.)    ヽ. ノ   (.ノ        政府の第一の義務は、人々を食物で養うこと、そして最後に防衛です。国民の意志を裏切ると、自殺につながる。      ×黒田&安倍  ←自殺?
  \ `'ー-、 ___,_ - '          マイトレーヤは原発の閉鎖を助言されます。多くの人々が核の汚染の影響で不必要に死んでいます。             ×東電&中曽根 ←死刑?
    ` - 、 ||V V|| \
       | ||   || l\          マイトレーヤが公に現れるにつれて、UFOが姿を表すでしょう。彼の最初の控えめな態度に混乱してはならない。
     / ″         \
(((  /  まる子れーや \     世界平和の脅威は、イスラエル、イラン、アメリカです。イスラエルの役割は跪いて、パレスチナに許しを請うことです。
    ̄ \_ \ /_/

1019 :デフォルトの名無しさん:2015/11/27(金) 12:56:38.04 ID:zp6Snri4.net
http://lobby.xyz

ネットのロビイスト求む!

コネクションボックス ロビーに

ご参加ください

1020 :デフォルトの名無しさん:2015/11/27(金) 13:21:19.81 ID:mzBGejrM.net
COFFの.bssに置いて開発者が発狂した一例
http://processors.wiki.ti.com/index.php/Uninitialized_Static_Objects_Not_Set_to_Zero_in_COFF
でも、こんなことはWindowsでは起こっていない。

1021 :デフォルトの名無しさん:2015/11/27(金) 15:01:12.76 ID:NfVJ1pe2.net
ID:mzBGejrM は鼻につく言い方(書き方)しかできないのか?

1022 :デフォルトの名無しさん:2015/11/27(金) 16:42:50.48 ID:47yXVFDW.net
日常生活のストレスからくるもんだろ
哀れんでおけばいい

1023 :デフォルトの名無しさん:2015/11/27(金) 18:18:55.82 ID:mzBGejrM.net
>>1021
ウソを垂れ流す>>1006の方が良いとでも?

1024 :デフォルトの名無しさん:2015/11/27(金) 20:05:22.54 ID:hBuCorfy.net
相手が悪いからって自分が悪いことしていい理由にはならないんやで

1025 :デフォルトの名無しさん:2015/11/27(金) 20:57:16.73 ID:mzBGejrM.net
正確か否か
それ以外の評価は意味なし

バカにはそれがわからないようだ
罵られたくなかったら、でたらめなレスをする前に一週間くらい、無い知恵振り絞って考えろ

1026 :デフォルトの名無しさん:2015/11/27(金) 21:26:45.46 ID:yIQF9FHR.net
さぞ辛いことがあったんだね
ここではいくらでも見栄張って自分を主張していいのよ

1027 :2ch.net投稿限界:Over 1000 Thread
2ch.netからのレス数が1000に到達しました。

総レス数 1027
279 KB
掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★