トップページ⇒tech
1002コメント347KB

スレを勃てるまでもないC/C++の質問はここで 23 [転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2015/01/04(日) 22:51:08.99ID:BvikwYSt
スレを勃てるまでもない低俗な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/
0002デフォルトの名無しさん2015/01/04(日) 23:21:56.13ID:AZoVKcHR
前スレ999さんありがとうございました。
0003デフォルトの名無しさん2015/01/06(火) 20:38:52.39ID:hpet63Tg
1乙です

質問宜しいでしょうか?
Linux用で変数が変化するまで待機するプログラムはsyscall、SYS_futexで出来ますでしょうか?
出来るならどのように書けば良いのか教えてください
0004デフォルトの名無しさん2015/01/07(水) 01:03:17.52ID:9/4UCKaT
みんな構造体の宣言とかって毎回ググってる?
manとかで見れると便利だなあって思ったんだけどコマンドなんかない?
0005デフォルトの名無しさん2015/01/07(水) 01:20:06.74ID:IbCBqkxU
manよりも、infoの方が情報が新しいらしい
0006デフォルトの名無しさん2015/01/07(水) 10:33:44.42ID:Jika4sDC
VS2013で cout があいまいですというメッセージが出ます。
ビルドや実行は出来るのですが、何が原因でしょうか?
0007デフォルトの名無しさん2015/01/07(水) 17:50:37.22ID:DIYY1wPV
ERROR: 質問があいまいです
0008デフォルトの名無しさん2015/01/07(水) 20:27:25.12ID:ArlGb+1Q
>>4
何を検索しているんだ?
0009デフォルトの名無しさん2015/01/12(月) 04:40:49.46ID:Pgt9wbS9
メモリの動的確保について質問です
たとえばCではmallocで確保した変数をfreeで
解放しないといけないのは理解できます
ですが二重解放をしてはいけないというのが理解できません
理解というよりはどういう仕組みになっているか気になります
なぜ解放してあるかをチェックしないのでしょうか
0010デフォルトの名無しさん2015/01/12(月) 07:42:35.80ID:0gHWSTX6
>>9
後でそのメモリ空間が再びmallocされたら、それを誤ってfreeすることになる。
0011デフォルトの名無しさん2015/01/12(月) 08:29:34.28ID:JDGRgzhV
p = malloc();
・・・
free(p)
free(p)
の事だろ二重解放って
001292015/01/12(月) 10:34:49.47ID:Pgt9wbS9
freeを2回以上した場合、内部的にどういう状態になるのか気になります
処理系によるとは思いますが、一般的な環境(Unix系、Windows等)ではどうなるのでしょうか
0013デフォルトの名無しさん2015/01/12(月) 11:16:54.23ID:plV1fcgm
無効か別に利用されてるアドレスの開放になってどうなるかは未定義なんだろ。
0014デフォルトの名無しさん2015/01/12(月) 12:02:21.69ID:dz9wpGuy
>>12
たとえばヒープ領域とかヒープメモリで検索するといろいろと出てくるよ
http://www.atmarkit.co.jp/ait/articles/1408/28/news010.html など

余談だけど、むかしfjのC言語グループで
プログラムが終了する際にmallocした領域をイチイチfreeする奴は馬鹿だ、という情報工学の先生がいたなー
こんなセンセーに教育された学生はうちの会社にはいらないw
0015デフォルトの名無しさん2015/01/12(月) 12:32:51.93ID:plV1fcgm
>>14
そんな高級なことでなく、C/C++の規定で無効なアドレスに対する動作が決められてないだけだろ。
0016デフォルトの名無しさん2015/01/12(月) 12:39:09.45ID:plV1fcgm
存在しないファイルをオープンしたとき、Cはエラーメッセージを出してくれない状況と同様かと。
コンパイラは「ファイルが存在しません」「メモリはすでに開放されています」と出そうとしたら可能だろうが
パフォーマンスと互換性からそうしないんだろう。
0017デフォルトの名無しさん2015/01/12(月) 13:03:16.87ID:Pgt9wbS9
>>14
なるほど
もしこのように実装されていたら(実際はもっと複雑なんでしょうけど)
一度目の解放後に双方向リストのリンクが変わっていたり、
確保していたアドレスに別の変数のメモリを確保していたら、
もう一度解放するとリンクが滅茶苦茶になる可能性がありますね

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

自分でも調べてみます
ありがとうございました
0018デフォルトの名無しさん2015/01/12(月) 13:39:05.94ID:dz9wpGuy
>>16
> 存在しないファイルをオープンしたとき、Cはエラーメッセージを出してくれない状況と同様かと。

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

#include <errno.h>
errno

エラーメッセージを出すように組まなきゃ出ないのは当たり前だが
0019デフォルトの名無しさん2015/01/12(月) 15:35:19.43ID:GOoAet7L
式を選択した後ニュートン法で解を求めるプログラムなのですが、最後の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");
0020デフォルトの名無しさん2015/01/12(月) 15:36:39.01ID:GOoAet7L
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);

}
0021デフォルトの名無しさん2015/01/12(月) 15:37:16.70ID:GOoAet7L
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;
}
0022デフォルトの名無しさん2015/01/12(月) 16:03:47.42ID:NYq12SDF
> if ((j < 0) | (j > 2)) return 0;
if (...)
{
  fprintf(stderr, "error: equation number is invalid\nplease input 0, 1 or 2\n");
  exit(1);
}
0023デフォルトの名無しさん2015/01/12(月) 16:39:30.74ID:KGNTKkPE
エラーメッセージの通り。typedef した方が楽。
0024デフォルトの名無しさん2015/01/13(火) 09:17:24.80ID:p5zUoyxu
int(*pf[])() の宣言ってあってる?
double (*pf[])(double)
じゃないのかな?
0025デフォルトの名無しさん2015/01/13(火) 13:28:46.37ID:Xd+ASo4R
関数ポインタがガバガバだからちゃんと勉強した方がいい
0026デフォルトの名無しさん2015/01/13(火) 17:23:23.52ID:p5zUoyxu
>>25
すまん(_ _) 精進するわ orz
0027デフォルトの名無しさん2015/01/15(木) 05:04:37.22ID:sN1/S68L
fstreamで
ファイルの長さを短くするには
どうしたらできますか?
0028デフォルトの名無しさん2015/01/15(木) 09:03:31.24ID:+X0UBnJQ
>>27
ストリームなのにサイズを小さくできるわけないだろいい加減にしろ
強いて言えばftruncate
0029デフォルトの名無しさん2015/01/15(木) 11:20:21.19ID:lMW8kkLc
UNREFERENCED_PARAMETER()
を警告対策で入れまくっているのですが、こんな長い文字列がソースの中の
至る所にあると目ざわりなので
UP() とか短い名前で定義しなおすみたいな小細工は、馬鹿でしょうか?
お勧めな方法を教えれ。
0030デフォルトの名無しさん2015/01/15(木) 11:32:12.55ID:mt3DJv6M
そもそもそんなに使わない気がするんだが。
0031片山博文MZ ◆T6xkBnTXz7B0 2015/01/15(木) 14:57:44.01ID:OiYOltU9
>>29
//#1
void func(int param) {
...
param = param;
}

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

でいいじゃん
0035デフォルトの名無しさん2015/01/17(土) 13:12:48.82ID:46CXHtx0
>>558
超余裕w
0036sage2015/01/19(月) 12:55:39.27ID:0l2kTrnM
STL のコンテナの内容をデバッグ中に表示させたいのだが
gdb の pretty printer というやつがどうやってもうまく有効化できん。。
(gcc 4.8.4, gdb 7.8.1)

同じようなことできているひといますか?
0037デフォルトの名無しさん2015/02/01(日) 07:06:55.66ID:RggaqYXQ
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がわたっているのか設定が必要なのか再生時に問題が発生しているのか
よく分かりませんでした。なにかヒントを頂けると嬉しいです。
返信レスは遅れると思いますが、よろしくお願い致します。
0038デフォルトの名無しさん2015/02/03(火) 00:49:09.47ID:O9Z5gBA+
助けて下さい

<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]);
0039デフォルトの名無しさん2015/02/03(火) 01:05:40.03ID:hgFb4HHg
>>38
本の通りってどんな本使ってんだよ
0040デフォルトの名無しさん2015/02/03(火) 01:36:23.06ID:QU1jdhII
なんでファイルポインタがいるんだよ
getc()の実態が何になってるか見てみて
0041デフォルトの名無しさん2015/02/03(火) 02:45:00.34ID:O9Z5gBA+
実態ってこんな感じの?
http://ohmoriws1.ms.kagu.tus.ac.jp/1997/sotsuken/miyakosi/c03.html

実践 linux システムプログラミング C for Linux って本500P弱あるんだけど
19Pのそれで止まってもう動けない泣きたいww
0042デフォルトの名無しさん2015/02/03(火) 03:26:42.31ID:QU1jdhII
ideoneにソース載せてみて
0043デフォルトの名無しさん2015/02/03(火) 03:46:21.13ID:O9Z5gBA+
そういうサイトの存在を初めて知りました!
勉強になります。

これで見れますかね?
http://ideone.com/iRHNDJ
0044デフォルトの名無しさん2015/02/03(火) 04:06:55.61ID:yGwE0+2u
>>38
ほんとうに本のとおりか?
なおすとすれば http://ideone.com/sPoJJs だがあまり意味の感じられない内容だ
0045デフォルトの名無しさん2015/02/03(火) 04:33:33.26ID:O9Z5gBA+
>>44
有り難うございます。できました!!
先を見ると、これを元にどんどん拡張していく感じのようです。

ガンガン進めてみます!
0046デフォルトの名無しさん2015/02/03(火) 04:38:48.15ID:GMpj9RJ2
誘導されてきました。

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


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

抽象化しているオブジェクトの削除の、お作法みたいなものってありますでしょうか。
0047デフォルトの名無しさん2015/02/03(火) 05:04:38.61ID:yGwE0+2u
>>46
>参照が残ってるみたいでエラーがでる場合があります。
なぜそう判断した?
0048デフォルトの名無しさん2015/02/03(火) 05:19:50.66ID:yGwE0+2u
>>46
仮想デストラクタ
0049デフォルトの名無しさん2015/02/03(火) 05:24:28.94ID:GMpj9RJ2
>>47
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-
こちらのサイトの
純粋仮想関数の罠

の項の

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

が原因に近しいのはないかと踏んでいますが、具体的な対策が見出せません。
というのが恐らく一番近い原
0050デフォルトの名無しさん2015/02/03(火) 07:10:28.26ID:GMpj9RJ2
自己解決しました。

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

純粋にその場面では仮想関数を呼ばないように工夫することで解決しました。
>>47さん、お付き合い頂きましてありがとうございました。
0051デフォルトの名無しさん2015/02/03(火) 09:26:12.35ID:orcEUXbE
不思議な解決方法だな…
そもそも親クラスのコンストラクタ・デストラクタが純粋仮想関数を呼ぶように作られているというのが不思議だ。
もしかして最初から作り方を間違えていたのを、直し方を間違えたまま、現象だけ解決してるんじゃないか?
0052デフォルトの名無しさん2015/02/03(火) 10:08:38.01ID:415X5y7P
そもそも抽象クラスとは関係なく
コンストラクタ内での仮想関数呼び出しはいつもと同じようには機能しない
c++ コンストラクタ内での仮想関数呼び出し
でぐぐって勉強しとけや
0053デフォルトの名無しさん2015/02/03(火) 10:27:16.30ID:vbeiF6Sp
全然理解できないけど、理解しないで良い知識だと思った
0054デフォルトの名無しさん2015/02/03(火) 17:29:43.02ID:QU1jdhII
>>46
親コンストラクタ
子コンストラクタ
子デストラクタ
親デストラクタ
の順番怪しくないの?
0055デフォルトの名無しさん2015/02/08(日) 02:05:07.87ID:BueC27lR
ポインタを返す関数の戻り値を受けるのにautoで書くとき、
auto x = func();
と書くのと
auto * x = func();
と書くのは同じなんでしょうか。
下の例のxはポインタのアドレスになってしまうんでしょうか。
0056デフォルトの名無しさん2015/02/08(日) 02:09:34.75ID:JJBPIwXc
下はコンパイル通りません
0057デフォルトの名無しさん2015/02/09(月) 12:16:48.66ID:oe5uzBMp
>>55
そこで宣言するのがx一つならどちらも同じでxはただのポインタ
宣言するのが二つ以上のときに違いがでる

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

// エラー
// xはポインタだけどyは違うので初期化できない
// int *x = a, y = b;のときと同じようなこと
auto * x = func(), y = func();
0058デフォルトの名無しさん2015/02/10(火) 17:29:32.16ID:6CiTLKPy
cの経験は少しあって最近c++始めたんですが、vectorとstringだけでも十分便利
何ですが、この後何を覚えると
良いでしょうか?
0059デフォルトの名無しさん2015/02/10(火) 17:32:54.26ID:wTvHI6bs
unique_ptr shared_ptr
0060デフォルトの名無しさん2015/02/10(火) 17:51:16.45ID:Igj7O7oB
ところでvectorとstringってC++なの?
0061片山博文MZ ◆T6xkBnTXz7B0 2015/02/10(火) 17:55:47.93ID:ZZYSwCjN
std::vectorとstd::stringはC++のクラスだよ。
0062デフォルトの名無しさん2015/02/10(火) 18:00:25.33ID:fc6wBG1e
Cではないことは確か
0063デフォルトの名無しさん2015/02/10(火) 19:48:17.76ID:NjPy1BDR
>>58
map
あとコンパイラが対応してるなら楽できる便利機能として
auto や range based for あたり
0064デフォルトの名無しさん2015/02/10(火) 23:20:53.99ID:6CiTLKPy
>>63
レス有難うございます。
mapって言うのは少し知っているのですが
どういう状況で使ったらどんなメリット
が有るのかよく分かりません。
0065デフォルトの名無しさん2015/02/10(火) 23:31:36.48ID:Aoer/888
配列のインデックスに文字列がつかえる。
そんなもんAWK, Perlにもある。

mapがなかったら…
2本の配列を用意して、一方に文字列(Cなら2次元配列)、もう一方に数字をいれます。
おなじインデックスで、文字列および数値をとりだす。
たいへんだぁ(?)
それでできますが、mapなら
文字列 → 数値
が一発でできる
0066デフォルトの名無しさん2015/02/10(火) 23:38:54.44ID:Aoer/888
STLのmapは、二進木で管理されていて、検索しやすい
find
もう用意されている
イテレータもある
0067デフォルトの名無しさん2015/02/10(火) 23:42:56.56ID:6CiTLKPy
>>65
配列のインデックスに文字列が必要に
なる状況が思いつかないのですが、
どんなアプリを作るとそういう状況に
なりますか?
0068デフォルトの名無しさん2015/02/10(火) 23:49:02.93ID:Aoer/888
人間は、文字列を入力します
数字も文字列だ

名前
住所
年齢は、数字(数字を数値に変換すればいいが、数字のままでもいける)
性別は、2値でいい。これも文字列のままでいける
0069デフォルトの名無しさん2015/02/10(火) 23:56:47.79ID:7yL7ZV6a
>>67
文字列に限らずデータの対応付けぐらい普通にやるだろ
JSONとか知らない?
0070デフォルトの名無しさん2015/02/10(火) 23:59:30.85ID:MwNGRsKL
特定の文字列に特定の数値なり構造体なりを割り当てたいときとかあると思うんだが
文字列じゃなくても連番ではない特殊な数値を関連付けに利用してもいいわけだし
0071デフォルトの名無しさん2015/02/11(水) 00:14:07.04ID:vLqody7u
多言語なら辞書とか連想配列とか呼ばれてるものと同じようなもの
C++のはキーに任意の型が使える
0072デフォルトの名無しさん2015/02/11(水) 00:58:31.53ID:D/QOH335
人工知能の情報関連付けの処理で活躍してそうだな
0073デフォルトの名無しさん2015/02/11(水) 01:11:41.68ID:oz4RTyK1
>>67
配列の中身を検索するときいちいち全部ループで回すのか
0074デフォルトの名無しさん2015/02/11(水) 04:44:28.19ID:aYb/ZX4Z
map はポインタをキーとして使われることも多いよ。
キー側データにメンバを追加できないとき、あるいは
非破壊的に値を保持したい時などに使う。
0075デフォルトの名無しさん2015/02/11(水) 04:44:37.16ID:ZlZsHmR5
>>67
処理速度重視か作成効率かどちらを取るかで考え方が変わるね
Cでとことん処理速度に拘ってた人は抵抗あるかも知れない
CPUやらハードの性能が上がれば、速度なんて後でついてくる位の気持ちになることが大事
0076デフォルトの名無しさん2015/02/11(水) 04:52:35.15ID:aYb/ZX4Z
チューニングするときにはプロファイルとりつつ
「ここは高々数件だから配列に入れて検索した方が速いか」とかするとしても、
まずは map や unordered_map で実装しとくのがいいよね。
0077デフォルトの名無しさん2015/02/11(水) 05:32:39.62ID:X7wVt/Fu
There is an apple.
This apple is red.

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

空白区切りで、すべての単語を取り出し、
それらの使われた回数を数える
is, appleは2回
0078デフォルトの名無しさん2015/02/11(水) 09:09:02.61ID:yrYT/hzd
>>77
どういうふうに入力されるかわからないしアドバイスしようがないな。
宿題片付けたいだけなら宿題スレへ。
0079デフォルトの名無しさん2015/02/15(日) 17:50:17.20ID:B1xPkbHY
class Hoge{

private:

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

と

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

は同じなのでしょうか?
互換性があるかどうか調べるためにまず上を宣言してから、
下に書き換えるべくいじくったらこれでエラーが出なくなったのですが
0080デフォルトの名無しさん2015/02/15(日) 18:35:49.01ID:auAw66hR
>>79
クラス定義の中でメンバ関数の定義を書けば暗黙的にinlineになる

違いはそれだけなので
> 下に書き換えるべくいじくったらこれでエラーが出なくなったのですが
は気がついていなかったミスが書き換えてるうちに勝手に修正されただけだろう
0081デフォルトの名無しさん2015/02/15(日) 21:37:37.08ID:cBAJ0xmb
型名 クラス名::変数名で静的メンバ変数を宣言しつつ初期化することはできないのですか?
0082デフォルトの名無しさん2015/02/15(日) 22:23:37.30ID:oIrwp9Au
>>81
すればいいだろ
https://ideone.com/b2UMf5
クラス定義に書いてない変数を
クラス定義の外で定義したいのであれば無理
0083デフォルトの名無しさん2015/02/15(日) 22:59:17.65ID:cBAJ0xmb
あー…やっぱりクラス宣言の時にsatatic定義しないとstaticとして初期化できないんですか
static 型名 クラス名::変数名のように書いて一気にこなそうと思ったんですが、
その際にストレージクラスは宣言できないって怒られちゃって
当初考えていた通りヘッダの宣言で定義しておくことにします ありがとうございました
0084デフォルトの名無しさん2015/02/16(月) 12:07:40.11ID:vGSFacHj
coutをclose出来ますか?

close(1);する前に
fclose(stdout);みたいな事がしたいのです。
0085デフォルトの名無しさん2015/02/16(月) 12:22:35.58ID:DWHkwfYs
flushじゃいかんのか?
0086bti2015/02/16(月) 12:45:55.99ID:KKpFX0J7
ビットコインをはじめよう
このリンクからビットコイン購入・販売所bitFlyerにご登録すると
1000円分のビットコインがもらえます!

https://bitflyer.jp/gift/fn0tlipl

話のネタに、とにかく一応もらっておくといいです。
間もなく終了するようです。
0087デフォルトの名無しさん2015/02/16(月) 13:01:04.61ID:vGSFacHj
>>85
回答ありがとうございます。

cout.flush();close(1);

で大丈夫でしょうか?
処理の途中で標準出力をクローズしたいのです。
0088デフォルトの名無しさん2015/02/17(火) 18:52:31.46ID:FQU0SBpo
double d1 = DBL_MIN;
double d2 = DBL_MIN;
double d3 = 1.0;
とした時に
if(d1==d2)
if(d1==d3)
みたいな比較をしても良いのでしょうか?
0089デフォルトの名無しさん2015/02/17(火) 20:23:53.31ID:WP6LEt4U
プリプロセッサの仕様を思い出してみるといい
0090デフォルトの名無しさん2015/02/17(火) 22:04:02.88ID:p0gP7/RW
#define DBL_MIN 1.0ならok
0091デフォルトの名無しさん2015/02/17(火) 22:10:55.98ID:y95d2Nc1
訊きたいのは
if (d1 == DBL_MIN)
の成立が保証されてるかじゃないのか?
0092デフォルトの名無しさん2015/02/18(水) 00:21:05.39ID:CW9ZV6LJ
質問の意図もC++も分からないけど
「DBL_MINはdouble型で表現可能な最小な正数」だから
1.0ではないんじゃね?
ググったけど
2.225074e-308
みたいな値だろ?

等号での比較は「偽」だろうけど比較をする事自体は問題無いよ。
答えになってるかな?
0093デフォルトの名無しさん2015/02/18(水) 00:23:35.03ID:CW9ZV6LJ
double型での等価の比較はあまりオススメ出来ないとか
そんな答えを求めているのかな。
0094デフォルトの名無しさん2015/02/18(水) 12:24:16.22ID:cxgRNEsa
うちだとdoubleやfloat変数を==で比較してる時点で社内レビューではねられるな。例外は即値が整数のときだけ
0095デフォルトの名無しさん2015/02/18(水) 13:16:02.61ID:492Iwxk8
DBL_MIN==DBL_MIN を気にしてるんか? どこにフォーカスしてるのか
0096デフォルトの名無しさん2015/02/18(水) 13:38:50.13ID:9GHJc1N/
>>88
しても構わないが浮動少数では誤差が出るから正確な答えがでない可能性は高いよ
0097デフォルトの名無しさん2015/02/18(水) 16:30:13.29ID:UnM/2wIq
最大値や最小値が揺れるってのは概念としては考えづらいんだけど、
コンパイラや仕様によって起きるのだろうか 気になる
0098デフォルトの名無しさん2015/02/18(水) 20:56:44.33ID:wgfycviw
そりゃ
double d1 = DBL_MIN;
この時点で値が変わってるだろ
0099デフォルトの名無しさん2015/02/18(水) 21:07:49.24ID:s5Vrc8eg
doubleで表現できる最小な正数値なのにdoubleに代入しただけで値が変わるとはいかに
0100デフォルトの名無しさん2015/02/19(木) 13:19:57.14ID:PwGKmnLr
浮動小数点の誤差って、演算後の話で、代入だけしかしてなければ == で判定してもきっちり判定できるよね?
0101デフォルトの名無しさん2015/02/19(木) 14:34:52.84ID:fdKBoaCS
>>100
同じ型同士で同じ値を代入しただけなら==でも判定できそうな気がするけど(詳細は知らん)
以下のような場合は判定できないと思った方がよいと思うよ
doubleに代入した時点で厳密に1000ではなくなるから
int i = 1000;
double d = 1000;
if ( i == d )

実際に1000だとうまくいくかは試してない
0102デフォルトの名無しさん2015/02/19(木) 14:43:34.31ID:7oFSdK4O
>>101
どっちもint(1000)がdoubleに暗黙で変換されてるから一緒だろ
0103デフォルトの名無しさん2015/02/19(木) 15:09:24.04ID:IU8xWBqQ
>>101
等号が成立しなくなる理由はいくつかあって、

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

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

でおそらくb)の説明だよね。
であるなら整数であればたぶん大丈夫なはず。
0104デフォルトの名無しさん2015/02/19(木) 16:03:16.25ID:MTWKGuO0
>>100
計算機イプシロンより絶対値の小さい値a,bがあるとして
数学上はa≠bでも、変数に格納して両者を比較するとプログラムの動作ではa=bとなってしまう
だから「==」できっちりと判定できるとは限らない
まぁこれを逆手にとって、たとえば、二つの浮動小数点数の差の絶対値が計算機イプシロンより小さければ
「==」とみなす‥というコーディングをしたりします
0105デフォルトの名無しさん2015/02/19(木) 16:19:57.40ID:PwGKmnLr
なるほど… �dです

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

doubleの内部的な動きがいまいちぴんとこないから、double避けて書いてる…使う用事がないことを祈りつつ
0106デフォルトの名無しさん2015/02/19(木) 16:30:34.07ID:7oFSdK4O
IEEE754でググれ
JavaとかC#とかの多くの言語で採用されてる方法だから
固定長の浮動小数点型でこれ以外の方法で実装されてる環境を探す方が難しいぐらい
0107デフォルトの名無しさん2015/02/19(木) 16:32:53.74ID:MJrK0vGE
まあ浮動小数点演算ユニットからしてIEEE754に最適化されてるだろうしな
0108デフォルトの名無しさん2015/02/19(木) 17:28:23.19ID:GY4p95fn
>>105
ゲームでの座標計算って大抵floatかdoubleじゃね
理由は主に斜め移動などの少数になる演算

キャスト使って全部無理やりintにはできるけど
0109デフォルトの名無しさん2015/02/19(木) 18:43:58.71ID:x3p0g+OH
>>105
double使うなら基礎知識として浮動小数点誤差は知っておくべき
0110デフォルトの名無しさん2015/02/21(土) 20:03:43.80ID:l44iTosq
自作のWindowsアプリが連続で何時間も動かすとタスクマネージャで
メモリの使用量が徐々に増えていくのですが、それをグラフに書きたい
のですが、自分でメモリ使用量調べるのは面倒なので、何か簡単なツールで
特定のプロセスIDを指定したら、そのプロセスのメモリ使用量を
10分ごととかでファイルに保存してくれるようなそんなツール無いでしょうか?
あれば教えてください。
0111デフォルトの名無しさん2015/02/21(土) 20:06:47.17ID:g1tTND+u
それは知らないがメモリリークしてるだろ。そっちは無視か。
0112片山博文MZ ◆T6xkBnTXz7B0 2015/02/21(土) 20:09:37.81ID:swM6o0zc
Visual Studioのデバッグ機能を使えばメモリーリークくらい余裕でわかるだろ。
0113デフォルトの名無しさん2015/02/21(土) 20:28:23.41ID:l44iTosq
>>112
コツを教えてください。
0114片山博文MZ ◆T6xkBnTXz7B0 2015/02/21(土) 20:33:54.74ID:swM6o0zc
>>113
「VC デバッグ メモリーリーク」で検索
0115デフォルトの名無しさん2015/02/21(土) 20:36:49.08ID:MtQcH0ET
>>113
その質問が出るレベルなら、newをプロジェクトから検索、deleteを検索
数が合ってたら、
Createとreleaseで同じように
でも増えていくメモリの大きさから大体見当つくだろ
0116デフォルトの名無しさん2015/02/21(土) 20:42:14.17ID:qCqW+14K
new と delete (malloc() と free()) が同じ数とはかぎらないだろう‥
個人的にはラッパ(new/delete のオーバーロード)できっちり把握する
メモリ以外のリソースも同様に
0117デフォルトの名無しさん2015/02/21(土) 20:47:14.92ID:78/Ireu0
deleteしててもその型が基底クラスだったりしたら場合によってはリークするしな
0118片山博文MZ ◆T6xkBnTXz7B0 2015/02/21(土) 20:52:12.85ID:swM6o0zc
C++11以降は生ポ使うな、スマポ使え
0119デフォルトの名無しさん2015/02/21(土) 21:35:37.29ID:MtQcH0ET
質問のレベルに合わせないと更なる質問を産む事になる
0120デフォルトの名無しさん2015/02/21(土) 23:32:02.44ID:Ujipb/FI
shred_ptrやweak_ptrは煩わしいあれこれからマを解放するために生み出された物なので、
知らない人がいたらどんどん教えていくべき

なお物によっては使えなかったり結局明示的なdeleteに近い処理を書く必要がある模様
0121デフォルトの名無しさん2015/02/21(土) 23:41:25.44ID:Ujipb/FI
aが抜けてるよaが…shared_ptr
0122デフォルトの名無しさん2015/02/22(日) 00:27:11.07ID:qWw/awps
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14142251704

この問題がわからないんですが
0123デフォルトの名無しさん2015/02/22(日) 00:35:44.08ID:0njaRTk3
宿題はこっちのスレに投げるべし
http://peace.2ch.net/test/read.cgi/tech/1408962564/
0124デフォルトの名無しさん2015/02/22(日) 12:28:56.04ID:2HG+oh7E
if (::_stricmp(foo->bar(j).ToCStr(), "hoge") == 0)

みたいな文の :: (コロン2個)って何の意味がありますか?
初めて見たのですが。
0125デフォルトの名無しさん2015/02/22(日) 12:31:08.64ID:RFHyaT+D
なんか他人のソースに書いてあってカッコいいのでマネしてみました
意味はよくわかっていません
0126デフォルトの名無しさん2015/02/22(日) 12:37:32.41ID:2HG+oh7E
いやいや、ほんとに教えて下さい。
0127デフォルトの名無しさん2015/02/22(日) 12:44:15.66ID:vG1FeYAO
C言語とJAVA比べた時出力処理ってどっちのほうが長いの?
JAVAの出力処理が長すぎて萎えたんだけどwwww
0128デフォルトの名無しさん2015/02/22(日) 12:47:28.45ID:J+2bP69K
>>126
名前解決演算子(name resolution operator)で調べてこい。
C++で_stricmpがグローバル名前空間の_stricmpであることを明示するために使用

int v;
namespace N1 {int v;}
int j = ::v; // 一行目のvを指す
0129デフォルトの名無しさん2015/02/22(日) 12:47:38.44ID:TRUNFqhM
>>124
名前空間の指定だよ、この場合はグローバル名前空間を指す
0130デフォルトの名無しさん2015/02/22(日) 12:52:37.49ID:2HG+oh7E
>>128-129

なるほど分かりました。
ありがとうございます。
0131デフォルトの名無しさん2015/02/22(日) 13:58:32.00ID:+D+VdwAu
つまり、この外側にこの変数が所属する名前空間自体の定義があるはずなんだが、
一部分のみを見てしまったためわからなくなってしまったという
0132デフォルトの名無しさん2015/02/22(日) 15:59:14.17ID:i2HJL1En
変数じゃなくて関数っぽくね
0133デフォルトの名無しさん2015/02/23(月) 17:05:50.97ID:pMjCWY3N
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に戻って来るように出来ますか?
0134デフォルトの名無しさん2015/02/23(月) 17:10:10.02ID:Su9wFgfT
代入してないのに値が変わったらミラクルだわ
printf("i = %d\n", i_g);
じゃダメなのか
0135デフォルトの名無しさん2015/02/23(月) 17:10:11.68ID:zZTzM7Nf
>>133
int &i=i_g;
i_g=777;
とりあえず、そんな糞コード書く前にポイントとか参照の基礎を学べ
0136デフォルトの名無しさん2015/02/23(月) 17:17:56.49ID:pMjCWY3N
>>134
mainは変更しない前提でお願いします。
0137デフォルトの名無しさん2015/02/23(月) 17:21:00.06ID:Su9wFgfT
スタックを書き換える方法を聞いてるのか?
どちらにしろiに代入するしか方法はないが
0138デフォルトの名無しさん2015/02/23(月) 17:26:42.80ID:pMjCWY3N
>>137
説明不足ですみません。
int i_gではなく
int *p_g
としてfunc内で
p_g=&i
とすれば
*p_gに代入した値はmainに戻せますが
ポインタ変数を使わずに実現出来ますか?
参照だけで出来ますか?
0139デフォルトの名無しさん2015/02/23(月) 17:27:41.57ID:zZTzM7Nf
>>136
void func(int &i_g){
i_g=777;
}
はい、要件満たしてやったぞ。
0140デフォルトの名無しさん2015/02/23(月) 17:28:43.79ID:Su9wFgfT
参照なら>>133でいいだろ
0141デフォルトの名無しさん2015/02/23(月) 17:30:54.02ID:pMjCWY3N
>>139
i_gはグローバル変数でお願いします。
0142デフォルトの名無しさん2015/02/23(月) 17:32:14.07ID:zZTzM7Nf
>>141
グローバル変数である必要がありません。
0143デフォルトの名無しさん2015/02/23(月) 17:33:22.68ID:pMjCWY3N
>>142
私には必要なんです
0144デフォルトの名無しさん2015/02/23(月) 17:33:31.85ID:Su9wFgfT
グローバル変数は参照にできないから不可能
0145デフォルトの名無しさん2015/02/23(月) 17:46:15.63ID:zZTzM7Nf
>>143
ポインタにしたとしてどう使うんだよそのグローバル変数は
0146デフォルトの名無しさん2015/02/23(月) 17:47:44.44ID:RAjknDke
  i = i_g;     // この行無しで

この行を削らないといけない理由は?
0147デフォルトの名無しさん2015/02/23(月) 23:57:52.51ID:pMjCWY3N
>>146
そんなに深い理由はないのですが、
削っても出来るかなという素朴な疑問でした。
0148デフォルトの名無しさん2015/02/23(月) 23:59:40.53ID:cWkGfwjm
>>147
君の頭と貴重な時間を削ってもできるかな
0149デフォルトの名無しさん2015/02/24(火) 03:22:23.24ID:G4iqMc1S
>>147
ろくに答えもしない人はたいがい「なんでそんな事をするのか」だから答えなくていいよ
0150デフォルトの名無しさん2015/02/24(火) 06:25:16.30ID:RxQOhZJD
そういうやつは一生糞みたいなコード書いてればいいよ。
間違っても仕事にすんなよまわりが迷惑するから。
0151デフォルトの名無しさん2015/02/27(金) 02:32:04.08ID:GOSdj3hN
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独自拡張でしょうか?
0152デフォルトの名無しさん2015/02/27(金) 02:34:29.96ID:Iu53F2aP
自分はわからないが、危険だとおもったら文法的に安全な方法で。
0153デフォルトの名無しさん2015/02/27(金) 09:54:11.83ID:MHy9s9iY
>>151
cでならc99で規格化されてるがc++では(今のところ)コンパイラの独自拡張
0154デフォルトの名無しさん2015/02/27(金) 10:19:22.37ID:vnP6fImO
>>151
っ https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html#Variable-Length
0155デフォルトの名無しさん2015/03/09(月) 03:55:55.20ID:oMflzd71
char buff1[定数];
char buff2[定数];
if(strcmp(buff2,"++")==0){
buff2 = buff1 +1;
}

という式を書いたのですがbuff2は変更不可能というエラーが出てしまいます。ポインタなのが問題らしいのですがポインタでなくbuff2に入っている文字列の数値を計算して書き換えるにはどう修正すればいいのでしょうか?
buff2の中身が"++"の時はbuff1(数値)に1加えた数値をbuff2に代入するという式を書きたいです。
0156デフォルトの名無しさん2015/03/09(月) 04:16:20.53ID:UEMwm/ZM
>>155
ポインタとアドレス、配列アドレスと配列バッファを混同してる
buff1とbuff2の値を見て見るべき
ついでにヒントとしてbuff1[0]とbuff2[0]の値もね
0157デフォルトの名無しさん2015/03/09(月) 04:47:05.93ID:C8nwOi6u
>>155
int num=atoi(buff1);
num=num+1;
sprintf(buff2,”%d”,num);
0158デフォルトの名無しさん2015/03/09(月) 05:46:16.97ID:d8cjeDnQ
>>155
if(strcmp(buff2, "++") == 0) {
sprintf(buff2, "%d", atoi(buff1) + 1);
}
0159デフォルトの名無しさん2015/03/09(月) 07:47:02.31ID:N0bMeNoe
vector<int> test;
vector<int>::iterator begin,end;

2行目の::はなんですか??
名前空間に属している事を示す::と、クラスのメソッドである事を示す::しか知らないのですが
iteratorはvectorクラスのどういうものなんですか?
0160デフォルトの名無しさん2015/03/09(月) 08:00:26.85ID:lCvEf7bM
>>159
:: はスコープ指定演算子で、iterator は vector のネストされた内部のクラス
0161デフォルトの名無しさん2015/03/09(月) 08:18:41.90ID:N0bMeNoe
>>160
ご返答ありがとうございました
0162デフォルトの名無しさん2015/03/09(月) 17:29:38.15ID:b0X+6jZ8
C++でクラスがconstなメンバ変数を持つと代入演算子が生成できない
みたいなエラーが出ますが、対策としては自前で代入演算子を定義する
など有るみたいですが、そんなことしなくても、const以外のメンバ変数は
普通に代入して、constメンバは何もしないみたいな処理を勝手にやってくれる
ような楽ちんな方法はありませんか?VS2013です。
0163デフォルトの名無しさん2015/03/09(月) 18:19:22.31ID:Z3OokkBM
>>162
static
0164デフォルトの名無しさん2015/03/09(月) 18:37:06.07ID:b0X+6jZ8
>>163
うまく行きました。ありがとうございました。
0165デフォルトの名無しさん2015/03/09(月) 22:50:27.46ID:AQB4uEfR
>>156-158
ありがとうございました。おかげで無事できました。
javascript齧ってた程度なのでポインタやアドレスはイマイチわからない……C系は難しい
0166デフォルトの名無しさん2015/03/10(火) 02:54:49.84ID:J40sdYqt
>>165
Javascriptも文字列のまま四則演算とか出来ないでしょ。
Cの文字列は色々面倒だからC++のstd::string使った方がいいよ
0167デフォルトの名無しさん2015/03/10(火) 10:30:47.33ID:Zsa8IBTe
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;
のように記述する文法は用意されていないのでしょうか?
0168デフォルトの名無しさん2015/03/10(火) 12:46:26.98ID:Zt65CvSc
用意されていない
0169デフォルトの名無しさん2015/03/12(木) 13:38:06.69ID:bakilSIy
マクロでなんとかしる
0170デフォルトの名無しさん2015/03/14(土) 00:04:39.33ID:rKRQmeKw
udpパケットを16進数で受け取るにはどうすればいいんですか?
受信したパケットを
AA BB CC
みたいな感じで表示させたいです。
また、パケットの先頭から何bitまで抽出するにはどうしたらいいですか?
0171デフォルトの名無しさん2015/03/14(土) 00:08:03.77ID:OeJNA3gM
>>170
お前は通信の前に基礎を勉強しろ
0172sage2015/03/14(土) 07:48:45.98ID:heK9BCvf
>>163
テキトーなこと教えんな
氏ね
0173デフォルトの名無しさん2015/03/14(土) 10:29:23.78ID:PbzhoJJP
>>172
mutable
0174デフォルトの名無しさん2015/03/14(土) 10:36:07.35ID:ulb+QBES
>>170
パケット内容をダンプするのが目的なのか、ネットワークプログラミングを学習するのが目的なのか
前者ならWireSharkというツールが既にありますし、後者ならトランスポート層に直接アクセスする必要があるのでSocketでは無理。たぶんドライバレベルの知識が必要でしょう
0175デフォルトの名無しさん2015/03/14(土) 12:55:42.34ID:PbzhoJJP
「後者なら」の意味がわからんが、データリンクへのアプローチだったらLinuxならソケット、BSDならBPFでいけるんでねぇの。
トランスポート以前でモニタ・加工ってことな。
0176デフォルトの名無しさん2015/03/14(土) 13:01:04.16ID:rKRQmeKw
>>174
パケットの 内容をそのままダンプしたいだけですね。
確かにワイヤシャークなどのツールがありますが、勉強のために簡単なものを
自分で作ってみようとおもいました。
0177デフォルトの名無しさん2015/03/14(土) 13:43:04.34ID:ulb+QBES
>>175
SOCK_RAWを使えばできそうですね。失礼しました
0178デフォルトの名無しさん2015/03/14(土) 13:47:33.07ID:ulb+QBES
途中送信申し訳ない...
>>176
こちらが参考になるかも
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
0179デフォルトの名無しさん2015/03/14(土) 23:00:02.68ID:rKRQmeKw
raw_socketならできそうです。
ありがとうございました。
0180デフォルトの名無しさん2015/03/15(日) 05:23:07.02ID:NNq1Z6It
静的な多次元配列をクラスメンバの動的配列にコンストラクタで引き渡す(コピー)するにはどうすればいいですか?
0181デフォルトの名無しさん2015/03/15(日) 06:03:16.60ID:NNq1Z6It
すいません解決しました
0182デフォルトの名無しさん2015/03/16(月) 17:42:14.07ID:c3Hz1edW
特定のポート番号のみのパケットを受信しようとしてもうまくいきません。
どうすれば、良いですか?

//ソケット作成
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)というところの設定を変えたりしました。
0183デフォルトの名無しさん2015/03/16(月) 19:16:48.91ID:rl2BM/P0
プログラム以外の所に原因があるケースが多い
ポート開放でググって先に原因と対策を調べるべき
0184デフォルトの名無しさん2015/03/16(月) 20:35:43.27ID:c3Hz1edW
>>183
ありがとうございます。確かにiptablesの設定で弾いているかもしれませんね。
htons()何ですが、htons(80)と指定することでポート80番にパケットのみひろうと
いう解釈でよろしいでしょうか?
0185デフォルトの名無しさん2015/03/16(月) 22:20:36.45ID:bhsTaUEk
ネットワーク上はビッグエンディアンで扱うから Host TO Network byte order, Short してる。
アプリケーションレベルで通信相手を特定するならconnet(2)
どのOSかしらんけど。
0186デフォルトの名無しさん2015/03/16(月) 22:23:26.66ID:bhsTaUEk
データグラムを recvfrom したまま応答なし、メインのシェルがブロックされたままだとキー受け付けないとかあるからお気をつけあそばせ〜。
0187デフォルトの名無しさん2015/03/22(日) 17:07:18.49ID:fw6k4Nmy
ポインタを上書きしてしまうと前のポインタが示すデータはどうなるんですか?
ずっとどこかに残ったままですか?
0188デフォルトの名無しさん2015/03/22(日) 17:13:02.17ID:CvAUvH6J
どうもしませんよ
0189デフォルトの名無しさん2015/03/22(日) 18:01:42.39ID:KcTTsKQ+
>>187
スマポじゃなきゃメモリーリークになる
0190デフォルトの名無しさん2015/03/28(土) 16:48:23.64ID:NmdYaBEp
初歩的な質問で恐れ入ります。

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; だとおかしいような‥
0191デフォルトの名無しさん2015/03/28(土) 16:55:40.06ID:zJiPBq01
つねにxがa以上を仮定すれば上下の成立条件は同じと見た。
0192デフォルトの名無しさん2015/03/28(土) 16:56:30.64ID:LZ/SArZZ
unsigned前提だからだろ
0193デフォルトの名無しさん2015/03/28(土) 17:00:21.01ID:NmdYaBEp
>>191
でもつねにxがa以上なら、この部分を記述する必要はないのではないでしょうか?
if( /* a<=x && */ x<=b ) {...}
0194デフォルトの名無しさん2015/03/28(土) 17:02:43.46ID:zJiPBq01
a>x とすると、つねに上は不成立だが。
このときx-aが非常に大きい正数(b-aよりも)であると仮定すれば
下も不成立だな。
0195デフォルトの名無しさん2015/03/28(土) 17:16:02.53ID:zJiPBq01
a=70; b=90; x=60; でMを扱える最大数とすると、

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

つねに一致するにはbとxに条件がいる気がするが。
0196デフォルトの名無しさん2015/03/28(土) 17:17:46.86ID:NmdYaBEp
最初の条件式はxがa〜bの範囲内(両端含む)かどうかを調べるということですよね。
x<aの時も、そうでない時も、両方のケースを想定している条件式なんじゃないでしょうか。
0197デフォルトの名無しさん2015/03/28(土) 17:19:36.35ID:NmdYaBEp
アンカー忘れ、すみません。196は194へのレスでした。
0198デフォルトの名無しさん2015/03/28(土) 17:46:19.84ID:NmdYaBEp
ideoneで試したらx<aのケースだと下記のifも不成立でした。私のミス、すみません。
unsigned intの計算途中で負数になった際の取り扱いを勉強し直します。
レス下さった方々、ありがとうございました。
0199デフォルトの名無しさん2015/03/28(土) 18:00:54.63ID:p+oUvV+T
>>190
リンク先をみてもよくわからなかったが

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

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

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

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

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

x <= b

にはならない。
0202デフォルトの名無しさん2015/03/28(土) 20:48:16.14ID:p+oUvV+T
>>200
ほーなるほど‥
0203デフォルトの名無しさん2015/03/29(日) 00:33:59.85ID:nF1Ol+9b
>>190
それは、xがa以上b以下であるかどうかを判定しようとしている式だろうから
a < b が暗黙の前提になっていると思われる。
あとは、>>192 が言うように unsigned ということ考えれば、成立する

a=70, b=90, x=60 の場合、(intが32bitすると)
x - a = 2^32 - 10 = 4294967286
b - a = 20
で false になり、 a <= x && x <= b と一致する。
0204デフォルトの名無しさん2015/03/29(日) 00:54:33.44ID:nF1Ol+9b
数直線に a と b があって、その間に x がある条件をイメージすれば
直感的に (x - a) <= (b -a) になると思う

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

x < a の場合は a - x がラップして b - a より大きくなることを使ってるので
最初の式の第1項は a <= x じゃなければならないね
0205デフォルトの名無しさん2015/03/29(日) 02:14:17.08ID:PjXq8DMp
そういうことだな。a<=xなら常に一致。
a>xならb-aが(2の補数などで一回転しない)正数だったら一致。
0206デフォルトの名無しさん2015/03/29(日) 10:42:27.27ID:L3D4TSkJ
重箱のスミで申し訳ない
unsigned int a, x; a=70; x=60; ※intは32bit
だとして
x - a == 4294967286
が成り立つことは規格で保証されているんだろうけど
ネット上で探しても文献が見つけられない
知ってる方がいたらリンクとか具体的記述とか教えてもらえればありがたいです
0207デフォルトの名無しさん2015/03/29(日) 10:51:01.31ID:Lkr8cLwC
#define CURVEP_BEZIER (1<<0)
#define CURVEP_CORNER (1<<1)
#define CURVEP_LOCKED_Y (1<<2)

フラグの定義ですけど
この二重の不等号みたいなのって、何の意味というか、どんな動作をしますか?
intに格納されるみたいですが。
0208デフォルトの名無しさん2015/03/29(日) 10:58:28.09ID:gR6bL9ge
シフト演算子と言うものだ
教科書を入手するとこを推奨する
0209デフォルトの名無しさん2015/03/29(日) 11:02:43.36ID:PjXq8DMp
>>206
そんな保証はないはず。
CPUなどハードウェア的に1の補数や2の補数という仕組みがあったり
コンパイラによってもちがったりするだろう。
0210デフォルトの名無しさん2015/03/29(日) 11:06:38.80ID:PjXq8DMp
符号付数値表現 - 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
0211デフォルトの名無しさん2015/03/29(日) 11:15:29.16ID:XfQU9N1R
>>206
https://www.jpcert.or.jp/sc-rules/c-int30-c.html

嘘に騙されないようにね
0212デフォルトの名無しさん2015/03/29(日) 11:30:08.22ID:PjXq8DMp
それは初めて知った。
騙すつもりはないんだが。
しかしC11(ISO/IEC 9899-2011)だからそれ以前のコンパイラは違うかもしれない。
0213デフォルトの名無しさん2015/03/29(日) 11:48:18.40ID:PjXq8DMp
はじめからなのかわからないが。符号なしではオーバーフローが未定義ではないということは、符号あり計算のほうが速度が出る可能性はあるってことだな。



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

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

JISX3010:2003(C99) P.25 6.2.5 型
符号無しオペランドを含む計算は,決してオーバフローしない。
すなわち,結果を符号無し整数型で表現できないときは,その型で表現しうる最大値より1 だけ大きい数を法とする剰余を結果とする。
0215デフォルトの名無しさん2015/03/29(日) 12:05:40.70ID:PjXq8DMp
>>214
CPUの加算や減算の機能に丸投げが最速だろう。リターン値を規定しまうとそのチェックが必要となる。
同様のことはたとえば浮動小数点数でもありえる。詳細は知らないが。
0216デフォルトの名無しさん2015/03/29(日) 12:09:29.93ID:PjXq8DMp
CPUに丸投げしたら規定通りの動作をするCPUならそのままでよく、
規定通りには動作しないCPUで実行した時、規定通りになるように修正する部分を組み込まないといけないので
遅くなり得るということ。
0217デフォルトの名無しさん2015/03/29(日) 14:05:28.70ID:GySB0qzL
それでなぜ符号なしよりも早くなりえるの?
最大でも同じにしかならんくない?
0218デフォルトの名無しさん2015/03/29(日) 14:18:06.94ID:5KSECsA5
ばかか。

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

こういうハードでは、

>符号あり計算のほうが速度が出る可能性はあるってことだな。
02192062015/03/29(日) 14:53:51.16ID:L3D4TSkJ
>>211
資料のご提示、感謝します まさに私が探していた情報です
0220デフォルトの名無しさん2015/03/29(日) 15:08:53.09ID:L3D4TSkJ
>>216
> 規定通りには動作しないCPUで実行した時、規定通りになるように修正する部分を組み込まないといけないので遅くなり得るということ。

いまの話の流れで、ハードウェアの正常動作が保証されないことを含めて
C/C++の規格や動きを議論しても無意味ではないだろうか
フォールトトレラント系の話がしたいのなら話題を明示的に区別するべき
0221デフォルトの名無しさん2015/03/29(日) 15:16:48.68ID:GySB0qzL
符号なし計算については何かしら修正処理が必要だけど
符号ありについてはオーバーフローを無視してよければ修正処理が必要ないようなハードウェアなら
という前提か
いったいどんなアーキテクチャなんだ
0222デフォルトの名無しさん2015/03/29(日) 17:53:11.97ID:PjXq8DMp
コンパイラ側で応答を規定したら、ハードウェア動作の差を埋める必要があるだろ。



ビッグエンディアンとリトルエンディアン - ソフトウェアエンジニアリング - 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/
0223デフォルトの名無しさん2015/03/29(日) 20:06:36.91ID:GySB0qzL
>符号なしではオーバーフローが未定義ではないということは、符号あり計算のほうが速度が出る可能性はあるってことだな。
これへのつながりが全く分からんので符号ありと符号なしで何の差がでるのかをもう少し解説してほしい
0224デフォルトの名無しさん2015/03/29(日) 20:14:32.88ID:PjXq8DMp
たとえば、文字列・バイト列データはビッグエンディアンに限ると言語で規定してしまえば、
直接ハードウェアから受け渡しされるデータはリトルエンディアンの可能性もありえるから
それを修正する部分を組み込まないといけないだろ。
0225デフォルトの名無しさん2015/03/29(日) 20:49:37.61ID:L3D4TSkJ
いや、だから「たとえば―」ではなくて、直接に、符号無し整数データや符号付き整数データが操作されるときに
データの流れやCPUのどんなインプリが速度に影響を与える‥とか、そういう内容で説明しないと
無駄にわかりにくいだけだろう
0226デフォルトの名無しさん2015/03/29(日) 20:53:05.25ID:PjXq8DMp
なにが理解されないのかが理解できない。
CPUの四則演算を直接利用すると、CPUの四則演算を演算前後で補正かけて利用するとき
前者のほうが高速動作するだろう。
前者はリターン値はハードウェア依存で、後者は言語で規定。
0227デフォルトの名無しさん2015/03/29(日) 20:54:35.06ID:fSK0AMUw
signed で負数が1の補数でCが動いている、という話もきかないし、signed/unsigned それぞれのために1の補数と2の補数が共存している系もきいたことがないし
考えてもしかたがないことじゃないか?
0228デフォルトの名無しさん2015/03/29(日) 21:31:13.91ID:GySB0qzL
>>226
すまんね なんか一番最初の前提を読み間違えていたようだ
符号付きでもオーバーフローを定義済みの挙動とすると符号無しよりはやくなる
と読んでしまっていた

説明してくれていたのは
仕様で未定義の部分が多ければ、その方が実装の自由度が大きい
だから符号付きはオーバーフロー時の動作はHWが自由にできるから速くできる可能性があるってことね
やっとわかりましたありがとう
0229デフォルトの名無しさん2015/03/29(日) 22:12:51.04ID:L3D4TSkJ
【符号無し整数データの演算】
(言語仕様に適合するように)オーバーフロー発生時の処理をソフトでインプリしなければならず
そのオーバーヘッドのために処理速度が遅くなる可能性がある

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

要点だけで説明すればこういうことが言いたかったのか、と想像
0230デフォルトの名無しさん2015/03/29(日) 23:14:25.00ID:PjXq8DMp
自分は言語仕様に詳しかったり拘っていなかったので。
なんとなくunsignedのほうが高速動作するんじゃないかと思っていたが。
ループで0以上しか扱わないのに添字intを使うのもよくあるがこれには言語仕様による根拠があるのかもしれないと思った。
ほとんど場合で影響なくても遅くなりうる可能性があるからなあ。
0231デフォルトの名無しさん2015/03/30(月) 00:09:04.02ID:Cu+BvQPL
そもそも符合無しのオーバーフローのために余分なコードを入れなきゃならないCPUなんて無いだろう
可能性だけの話なんて無意味
0232デフォルトの名無しさん2015/03/30(月) 01:18:06.07ID:vd5gzrat
unsigned はラップアラウンドする。
8bitなら、255の次は、0になる

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

配列の[i]インデックスなどには、
普通に、signed intを使う
0233デフォルトの名無しさん2015/03/30(月) 03:21:22.92ID:AKJsrmAN
インデックスにsignedを使うって事は
if(i < 0) {・・・}
なんてフェイルセーフ入れてんの?
0234デフォルトの名無しさん2015/03/30(月) 03:32:57.95ID:Ee2yddLD
配列のindexはsize_tって決まってたと思うんだけど
02352322015/03/30(月) 06:06:09.41ID:vd5gzrat
size_t だったか
0236デフォルトの名無しさん2015/03/30(月) 06:34:10.29ID:srztvLsH
メモリアクセスは正負は関係なく同一ビット列なら同じ参照先だろ?
0237デフォルトの名無しさん2015/03/30(月) 12:23:42.35ID:vamG2xl1
急に何言ってるの
新しい質問なの?
0238デフォルトの名無しさん2015/03/30(月) 23:23:44.69ID:/CgEMBWR
>>236
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]
となった
0239デフォルトの名無しさん2015/03/31(火) 09:41:15.05ID:IugrT7n6
>>238
流れがよくわからんけど、やりたいのはこう?
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]
*/
0240デフォルトの名無しさん2015/03/31(火) 11:06:46.46ID:HeIxUMFm
>>239
その場合
&a[256]はおkだけど&a[-1]は未定義だった気がする
0241デフォルトの名無しさん2015/03/31(火) 21:15:25.81ID:NYpgTAud
少し上で、unsignedの演算で結果がオーバーフローした時の処理が問題になってましたが。
リンク先の規格に、
―
〜 結果を符号無し整数型で表現できないときは、
その型で表現しうる最大値より1だけ大きい数を法とする剰余を結果とする。
―
ってありますから、計算結果がオーバーフローしたら、アセンブラレベルでは
Carryを無視して32bitだけを取り出せばよいわけですから(int:32bit時)
そんなに煩雑な処理を追加する必要はないと思います。
CPUによるだろうけど、たかだか数命令くらいではないかな?
例
0xFFFFFFFF + 0xFFFFFFFE = 0x1FFFFFFFD
よって0x100000000を法とする剰余0xFFFFFFFDを返せばOK
0242デフォルトの名無しさん2015/03/31(火) 21:50:03.26ID:meXl7bV+
誰も処理の絶対量は気にしてない 相対量の話をしていた
しかもあくまで可能性の話だけだったので実際存在する処理系やHWでどうだというのは関係ない

まあだからこそ大した意味のない話だったともいえるが
0243デフォルトの名無しさん2015/04/01(水) 09:00:37.99ID:3aukNige
>>241
carryを無視して32bit取り出せばいいcpuは、もともと問題にしてない
上の>>213はそうならないcpuがある場合の話。はっきりい言って無意味
0244デフォルトの名無しさん2015/04/01(水) 15:21:58.49ID:SQPSJK5O
>>243
> >>241
> carryを無視して32bit取り出せばいいcpuは、もともと問題にしてない
話が進むと後付けで条件をだしてくる奴?
「もともと問題にしてない」というなら、どのレスの、どの書き込みでそう書かれてるか示してみ
0245デフォルトの名無しさん2015/04/01(水) 15:29:30.25ID:IHXA7IXr
>>216がまんまそれを言ってるんじゃないの
0246デフォルトの名無しさん2015/04/01(水) 19:16:36.38ID:SQPSJK5O
>>245
216は「(言語の)規格通りの動作をする(しない)CPU」って書くべきだよな
その後のレス読んで、規定通りに動作しないというH/Wのトラブルの話と思ってたわ
サンクス!

>>241
このオーバーフロー時の動作って
特定のアーキテクチャ(x86とかSPARCとか)の話なの?それとも一般的なCPUの動作?
マシン語に疎くてスマン
0247デフォルトの名無しさん2015/04/03(金) 04:59:57.72ID:EdqVb1x3
しかし、この話は本当によく出るな
データ型の曖昧な規格に悩まされる人がいかに多いかがよくわかる
0248デフォルトの名無しさん2015/04/06(月) 20:55:14.70ID:TiB43yfl
あれは失敗だったな。とくにサイズ。
charは8bit、shortは16bit、intは32bit、longは64bit、と明確に決めておくべきだったな。
その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。
0249デフォルトの名無しさん2015/04/06(月) 20:56:14.78ID:GsXEUmUF
いやいや型が実装されてない方が困るだろ
0250デフォルトの名無しさん2015/04/06(月) 21:15:01.21ID:MS5/fcmB
別に困らないと思うけど?(´・ω・`)
どんな時に困るの?(´・ω・`)
0251デフォルトの名無しさん2015/04/06(月) 21:16:07.54ID:GsXEUmUF
型を使おうとしたときに困る
0252デフォルトの名無しさん2015/04/06(月) 21:32:07.49ID:PTrbisMT
どの型も実装されていない可能性があるなんていったら
可搬性を確保するのが今より更に面倒になりそう
0253デフォルトの名無しさん2015/04/06(月) 21:34:16.17ID:Vdk88DGT
UNIXやCが育ったPDPシリーズには12、18、36bitなどのバリエーションもあり
K&Rではintはマシンの自然な処理サイズとだけ規定されていた
(さらに言えばcharが8bitとも限らない)
そういう歴史の上で書かれたCのソースコードに対して、いきなりintを32bitしか認めないと切り捨ててしまうと
あちこちで互換性の問題が噴出するだろう
ソフト資産継承の点から無理な相談ではないかな?
0254デフォルトの名無しさん2015/04/06(月) 21:35:00.81ID:1b9kLnNh
intが32bitなんて今だから言える話だし
20年以上も前から存在する言語だからそこらへんはね
0255デフォルトの名無しさん2015/04/07(火) 09:16:39.14ID:hBeZALFs
>>251
charとintで処理できない場合って、そんなにあるかな?(´・ω・`)

>>252
まあ、浸透してしまったから仕方ないけど、そんなにCに拘らなくても
いいんじゃないかな?(´・ω・`)
0256デフォルトの名無しさん2015/04/07(火) 09:22:50.66ID:pdohDM9u
そのintやcharすらない可能性を考慮しないのか
0257デフォルトの名無しさん2015/04/07(火) 13:38:08.70ID:hBeZALFs
charとintがない?それはCじゃないから、気にしなくてもいいんじゃないかな?(´・ω・`)
0258デフォルトの名無しさん2015/04/07(火) 14:42:12.15ID:Tt/PIfub
>>257
>>>248
>> その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。
0259デフォルトの名無しさん2015/04/07(火) 17:13:21.18ID:hBeZALFs
>>248 が何か言ったからってCが変になる訳じゃないよね?(´・ω・`)
charとintがないなら、それはCじゃない(キリッよね?(´・ω・`)
0260デフォルトの名無しさん2015/04/07(火) 17:54:24.00ID:i6pEMRTg
>>259
>>251-252,256はCが今と違い全ての型の実装有無がコンパイラ依存とした場合に(>>248)困る例は何があるか(>>249-250)
という話への回答でしょ?レス指定したから順番に落ち着いてもう一回レス読み直してみてね?
0261デフォルトの名無しさん2015/04/07(火) 19:37:42.24ID:djs4Gk4G
非現実的な定義をしておいて、「エヘン!俺様の勝ちぃ〜!!!」て
言うのが流行ってるの?(´・ω・`)
0262デフォルトの名無しさん2015/04/07(火) 19:52:07.90ID:/U9ZAOiy
>>261
memset() で double やポインタを初期化しているつもりなのも、十分非現実的だよ
0263デフォルトの名無しさん2015/04/07(火) 19:57:02.89ID:djs4Gk4G
その初期化が、いずれはその値を演算によって望むものに変えたいというなら
間違っている可能性もあるけど、単純に「まだ、何も入れていない」という状態を
設定していて、いずれは新たな値を上書きする、という意味での初期化なら100%
正しい初期化だよね?(´・ω・`)
0264デフォルトの名無しさん2015/04/07(火) 19:58:41.36ID:/U9ZAOiy
>>263
そんな初期化をする必要があるのか?
0265デフォルトの名無しさん2015/04/07(火) 20:14:26.00ID:djs4Gk4G
君は経験が乏しくてやったことがないだろうけど、普通のプログラマなら
大抵は経験してるよ?(´・ω・`)
0266デフォルトの名無しさん2015/04/07(火) 21:03:19.76ID:i6pEMRTg
ただの無駄なうえ
意味のない値にもかかわらず初期化しているように見えてしまう可能性があるので害悪
0267デフォルトの名無しさん2015/04/07(火) 21:26:52.72ID:/U9ZAOiy
free() する直前でも、つかわなくなったらその構造体のメンバに NULL を入れるようには書いてしまうなぁ‥
0268デフォルトの名無しさん2015/04/08(水) 00:11:05.08ID:bms3DTdi
>charは8bit、shortは16bit、intは32bit、longは64bit、と明確に決めておくべきだったな。
>その上で、コンパイラは全ての型を実装しなくてもかまわない、としておくべきだった。

これにたいして、特定のコンパイラで
charやintが無ければ動かなくなるから困るというが、
動かなくてかまわないんだよ。
そのマシンでは扱えない型なんだから。
むしろ、むりして動くほうが困る。
intが16bitか32bitか64bitか分かりません、のほうが困る。
どうせ移植性がない。
0269デフォルトの名無しさん2015/04/08(水) 01:31:11.34ID:qnslIA4C
厳密に何ビットの型が欲しいとかなら
int64_tとか環境で用意されてるtypedefされた型使うでしょ
0270デフォルトの名無しさん2015/04/08(水) 07:56:10.79ID:Ll2kXDCr
>>268
Cプログラマとして言えば、その環境で自然なコードが生成されるのが望ましい
からそういう発想にはならない
稀にbit数に依存するコードも書くけど、そうでない場合は圧倒的に多いから
0271デフォルトの名無しさん2015/04/08(水) 08:17:10.01ID:3GDRMldd
各型の上限or下限は決まってるんだからそれを考慮したうえでコード書くのが普通だろう
もちろんintが16bitのものは対象外 とか前提にすることもあるだろうがつまりちゃんと考慮してるってこと
intのサイズが可変だから移植性がないというのは書いたコードが悪いだけだろう
0272デフォルトの名無しさん2015/04/08(水) 08:23:05.99ID:rJ1QxPv7
まあ普通はintN_tだよな
intなんか使わないし悩む意味がわからん
0273デフォルトの名無しさん2015/04/08(水) 10:32:04.08ID:QLYO7z6z
移植性/可搬性はなくてよい、処理系依存で構わないっていうプログラマが世の多数派だったなら
ANSI(だっけ?)もCの規格化・標準化は行わなかっただろう
0274デフォルトの名無しさん2015/04/08(水) 18:54:41.74ID:TrrKWYIM
変数のサイズに依存するのだったら、assert() で明示することにしている
0275デフォルトの名無しさん2015/04/10(金) 06:49:08.30ID:nHOYt1IP
static_assert
0276デフォルトの名無しさん2015/04/10(金) 17:05:30.82ID:nxaXc56W
クラスで質問です
クラスのメンバ関数で色々な関数内で頻繁に呼び出して使うようなものがあるとします

その場合、面倒なのでグローバルにしちゃうのは良くないんでしょうか
その都度インスタンス化して呼び出すのか普通なんでしょうか
0277デフォルトの名無しさん2015/04/10(金) 19:03:54.95ID:6mfRBVMy
>>276
ポリシー次第だけど、純粋な関数ならグローバルでいい
0278デフォルトの名無しさん2015/04/10(金) 20:11:07.25ID:D6HkliCl
>>277
純粋という意味がわからなかったですが、オブジェクトをグローバルにしちゃって
メンバ関数を呼びやすくしても、別にいいってことですよね
趣味でやってるのであまり気にしないことにします、ありがとう
0279デフォルトの名無しさん2015/04/10(金) 20:18:07.34ID:78c5foiz
.NET(VC++)の質問です。スレチの場合は誘導頂けると助かります。

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

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

デザイナで頭1つだけ指定するのは、位置決めが楽だからです。
ついでにイベントもそこに書いて、これをコピーしようとしています。
ところがEventInfo::GetRaiseMethodではnullが返ってきてしまいます。
ハンドラさえ取れれば以下と組み合わせて上手く行くはずです。
https://msdn.microsoft.com/ja-jp/library/ms228976%28v=vs.110%29.aspx
0280デフォルトの名無しさん2015/04/10(金) 20:18:38.92ID:D6HkliCl
>>277
申し訳ない勘違いしてました、純粋の意味わかりました
確かに拘らなくてもいいかもしれないですね
0281デフォルトの名無しさん2015/04/10(金) 20:25:38.08ID:AgT+3q87
>>276
その都度インスタンス化って事はクラス外の関数からも頻繁に呼ばれてるって事だろうから
その関数を独立させる
02822792015/04/11(土) 19:55:43.05ID:rfVEU9W7
ちなみにVC#だと以下でいけるのですが、VC++だと何故か駄目です。
http://stackoverflow.com/questions/6055038/how-to-clone-control-event-handlers-at-run-time

前から困っている点で、とらいえずいちいち書いて対応していますが、
見ていて汚いので書き直したいと思っています。
気長に待っていますので、どなたか対策をご存じの方はレスよろしくお願いします。
0283デフォルトの名無しさん2015/04/11(土) 19:58:29.32ID:ijD8XqjA
>>282
あなたが使ってるのはC++ではなくC++/CLIです
http://peace.2ch.net/test/read.cgi/tech/1268613679/
こちらへ移動を
02842792015/04/11(土) 20:54:16.24ID:rfVEU9W7
>>283
了解しました。>>279,282は取り下げます。
CUDA関連スレかと思っていましたが、中身は完全にVC++のようです。
向こうで質問し直します。ありがとうございました。
02852792015/04/12(日) 03:42:43.11ID:DBf5x0AF
>>283
向こうで質問した結果、即答され、解決しました。
ありがとうございました。
0286デフォルトの名無しさん2015/04/13(月) 23:13:16.49ID:yWe3L8ho
最近はプレインクリメントよりポストインクリメント使うべきなの?
0287デフォルトの名無しさん2015/04/13(月) 23:16:55.31ID:gGrqgMm6
まともな処理系なら、ちゃんと最適化してくれるからプリでもポストでもお好きなように?(´・ω・`)
0288デフォルトの名無しさん2015/04/15(水) 00:36:50.19ID:9YI/hGho
printfでダブルクォーテーションを含む文字列を出力したいのですが、どうすればいいか教えて欲しいです

例としては
「あ"あ"あ"」と出力したいという感じです
0289片山博文MZ ◆T6xkBnTXz7B0 2015/04/15(水) 00:41:01.23ID:Be/6smJn
"あ\"あ\"あ\""
0290デフォルトの名無しさん2015/04/15(水) 00:41:06.52ID:LX/U9UXu
\"
0291デフォルトの名無しさん2015/04/15(水) 00:41:38.59ID:Mlfw56xY
printf("あ\"あ\"あ\"");
0292片山博文MZ ◆T6xkBnTXz7B0 2015/04/15(水) 00:44:13.93ID:Be/6smJn
\に続く文字に特別な意味を持たせる、エスケープシーケンスってやつだな
0293デフォルトの名無しさん2015/04/15(水) 00:53:30.96ID:9YI/hGho
>>289-292
ありがとうございます!
助かりました
0294デフォルトの名無しさん2015/04/15(水) 23:43:39.85ID:Obn4k40R
創価/学会
草加/せんべい
相加/相乗平均
-
人間の書き手でも難しい「そうか」の書き分けを難なくこなすATOK2010
素晴らしいじゃないか!
これならあと5年は使えるな
02952942015/04/15(水) 23:44:29.44ID:Obn4k40R
すみません
誤爆しました
0296デフォルトの名無しさん2015/04/15(水) 23:52:34.27ID:/EekHbuv
そうか
0297デフォルトの名無しさん2015/04/16(木) 21:49:21.30ID:9rYj+myM
草加
0298デフォルトの名無しさん2015/04/17(金) 20:22:53.99ID:MoAcY3k3
C++ではマクロじゃなくてテンプレート使えって言われますが、
マクロも併用した方がいい場合もあるんでしょうか?
マクロでクラスや関数を作るとDoxygenで見えないのが困るんですよね...
0299デフォルトの名無しさん2015/04/18(土) 15:33:17.56ID:Cuf4FohB
コンパイラの機能の足りない時代の遺物なので極力使わない
0300デフォルトの名無しさん2015/04/18(土) 17:25:13.10ID:c7W+WDWi
>>299
そうなんですか
これからスクラッチ開発するC++はマクロを極力使わないようにします
ありがとうございました
0301デフォルトの名無しさん2015/04/21(火) 17:10:39.11ID:uO4aFmSl
さすがにインクルードガードくらいは使うけどね
0302デフォルトの名無しさん2015/04/29(水) 13:39:06.86ID:jpNn2fx2
>>298
__FILE__、__LINE__とかを仕込むのはマクロじゃないと出来ない
そういう特殊なの除いたらマクロはなるべく使わない方がいい
0303デフォルトの名無しさん2015/05/15(金) 01:59:34.69ID:xhvpicim
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行目)

基底クラスで使われてないメンバ変数がムーブによって破壊されたとは考えにくいですが、
基底クラスの部分がごっそり破壊された後の派生クラスがまともに動くことは期待できませんし、規格によればムーブ後の変数の中身は未定義です。
お知恵をお貸しいただけるとうれしいです。
0304デフォルトの名無しさん2015/05/15(金) 02:03:53.73ID:kZ3YQu1b
Swap
0305デフォルトの名無しさん2015/05/16(土) 02:48:21.46ID:ghTgVRCT
解決しました。
N3337 17.6.5.15 Moved-from state of library types
N3337 17.3.26 valid but unspecified state
失礼しました。
0306デフォルトの名無しさん2015/05/19(火) 19:24:52.24ID:N5/GZYgz
どがつくほどの初心者です。AndroidStudioについての質問なのですが、
クラスファイルにプログラムを書く。 → 後々翻訳とか色々できるようにxmlに文字列を書く。 この認識であっているでしょうか?
0307デフォルトの名無しさん2015/05/20(水) 21:25:37.12ID:PX1Z5WVW
C++で、private変数をクラスの後方に置く風潮なのはなぜでしょう?
private,protected,publicの方が、private変数がどういう役割をしているとかいうのがコメントで書かれてるので理解しやすいとおもうのですが・・・
0308デフォルトの名無しさん2015/05/20(水) 22:11:13.74ID:2T6/P0Lm
>>307
そんな流儀があるのか!あるのか?
0309片山博文MZ ◆T6xkBnTXz7B0 2015/05/20(水) 22:23:13.32ID:TMa82PCT
>>307
外側からブラックボックスなインターフェイスとして見たときは、
publicなメンバーを先に注目した方が分かりやすい。
実装と仕様の分離。
0310デフォルトの名無しさん2015/05/20(水) 22:43:08.99ID:f7ZuyK4S
座標が格納された配列またはVectorがあります。
座標は(−3000,-3000)から(3000,3000)の範囲でランダムで分布されています。
1点の座標の半径10以内にある他の座標は平均をとり、1つにまとめます。
このロジックをクールに作られる方おられますでしょうか。
0311デフォルトの名無しさん2015/05/20(水) 23:26:07.76ID:BLE7pvKi
>>307
private なものを人目に触れる所に置いとくのはおかしい
0312デフォルトの名無しさん2015/05/21(木) 01:29:32.85ID:ZhKmhhGS
privateメンバを完全に隠したいならPimplイディオムを使えばよい
0313デフォルトの名無しさん2015/05/21(木) 09:19:46.24ID:xlNH4UEy
>>307
クラスの後方かどうかより、スコープが広い順に書くだろ
0314デフォルトの名無しさん2015/05/21(木) 10:04:24.42ID:d9D99tdd
確実に使用するprivateメンバを一番上
protected, publicの順にしてるわ
0315デフォルトの名無しさん2015/05/21(木) 18:17:30.52ID:GUG56MZT
CRTPって一つの基底クラスに対して
派生クラスが一つに定まるじゃないどすか?
virtualの代わりに使うと速くなるみたいな説明しかないのどすけど
基底クラスから一つしか派生できないのならvirtualの代わりに使う意味が
ないと思うのどすが、どんな役に立つのかおしえてください。
0316デフォルトの名無しさん2015/05/21(木) 18:24:08.91ID:ZnRk/DYk
派生クラスは何種類でも作れるだろ
何を勘違いしてるんだ
0317デフォルトの名無しさん2015/05/21(木) 18:27:56.13ID:GUG56MZT
あなたの方こそ勘違いしているのでは
0318デフォルトの名無しさん2015/05/21(木) 18:37:01.91ID:ZnRk/DYk
ttp://ideone.com/mJJDpH
こういうことじゃないの?
Super1をさらに継承するパターンのことを言ってるのか?
CRTPはコンパイル時に呼び出し先が一意に決まるものにしか使えないぞ
0319デフォルトの名無しさん2015/05/21(木) 18:43:30.77ID:GUG56MZT
だからCRTP<Super2>とCRTP<Super1>が別物なのに
virtualの代わりに使えても意味ないだろといっているのどすよ
0320デフォルトの名無しさん2015/05/21(木) 18:58:37.73ID:ZnRk/DYk
virtualの代わりではないな
あくまでコンパイル時の静的な多態だから
0321デフォルトの名無しさん2015/05/21(木) 19:07:24.46ID:WhiRQ/oN
あれか。
ATLみたいなやつか。
0322デフォルトの名無しさん2015/05/23(土) 11:05:41.37ID:oljntYsR
int rc1 = func1();
int rc2 = func2();
int rc3 = func3();
int rc4 = func4();
int rc5 = func5();

if(rc1 == rc2 == rc3 == rc4== rc5 == 0){
  // こういうif判定したいんですが、
  // これだとエラーします。
}
最もスッキリした書き方教えて下さい。
0323デフォルトの名無しさん2015/05/23(土) 11:48:26.58ID:UM9/stbq
int rc = func1();
rc |= func2();
rc |= func3();
rc |= func4();
rc |= func5();
if (rc == 0) { }
0324デフォルトの名無しさん2015/05/23(土) 14:24:37.13ID:oljntYsR
レスありがとうございます。
利用させていただきます
0325デフォルトの名無しさん2015/05/23(土) 20:44:53.50ID:oljntYsR
wchar_t c = 'A';
wchar_t c = L'A';
どちらも行けるんですが、どっちが正しいのでしょうか?
0326デフォルトの名無しさん2015/05/23(土) 20:45:50.21ID:ojXlCtK2
した
0327デフォルトの名無しさん2015/05/23(土) 20:53:26.57ID:oljntYsR
>>326
レスありがとうございます。
下ですか。上でも同じ結果になるんですが、なぜでしょうか?
良く分かりません。
0328デフォルトの名無しさん2015/05/23(土) 20:56:52.32ID:ojXlCtK2
ANSIとUnicodeで同じコードの文字の場合、上でも下でもOK。
0329デフォルトの名無しさん2015/05/23(土) 20:59:13.97ID:N5mcUzwL
'A' = 0x41
L'A' = 0x0041
0330デフォルトの名無しさん2015/05/23(土) 23:39:40.09ID:3og+zCpJ
どのクラスでも同じ 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. どちらを選択するかの決め手が分かりません。ご教授頂けたらと思います。
0331デフォルトの名無しさん2015/05/23(土) 23:42:37.10ID:pR56aZiN
シングルトンでもモノステートでもお好きに
0332デフォルトの名無しさん2015/05/24(日) 07:55:36.02ID:hp4TWV5c
>>328>>329
解説ありがとうございました。
よく理解できました。
0333デフォルトの名無しさん2015/05/26(火) 11:49:56.88ID:WpucxMlI
ダイアログを表示してEDITTEXTで入力した文を別のダイアログに作った表に表示させたいんだけどどんなふうにかけばいいですか?
0334デフォルトの名無しさん2015/05/26(火) 16:28:19.71ID:UK6dK39h
>>333
ttp://peace.2ch.net/test/read.cgi/tech/1428570962/
0335デフォルトの名無しさん2015/05/27(水) 19:12:21.15ID:YLAut6HO
Visual Studio Community 2013を使ってるのですが
デバッグビルドするとSTLのチェック機能やら他のいろいろな理由で実行速度が遅くなりますよね
デバッグ時でも、プログラムの部分的な箇所については速度の低下を抑えるという方法はありますか?

具体的には、自分の場合、ひとつのファイルからデータを読み込んで処理するのに
Debug版で800ミリ秒、Rlease版で40ミリ秒かかっていて、
ある処理の実行には20個ほどのファイルが必要で20秒程余分に時間がかかります。
なのでこのデータ読み取り部分の速度をデバッグ版でも高めたい、ということです。
0336デフォルトの名無しさん2015/05/27(水) 19:28:04.63ID:fEfNE1Dn
デバッグは追加情報入れてるんだから遅くて当然。
速いかデバッグかの一択。
0337デフォルトの名無しさん2015/05/27(水) 19:42:11.04ID:nCq7jW/A
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と乱数の様に表示されています。

一体何が行われているのか皆目検討もつきません。どなたかよろしくお願いいたします
0338デフォルトの名無しさん2015/05/27(水) 19:46:26.75ID:fEfNE1Dn
saが未初期化なだけだろ。
メモリ確保時点で必ずしもゼロで初期化されない。
0339片山博文MZ ◆T6xkBnTXz7B0 2015/05/27(水) 19:48:35.58ID:bhmZkUHl
>>337
saは初期化されてないのでゴミデータが入ってた
0340デフォルトの名無しさん2015/05/27(水) 19:49:17.16ID:nCq7jW/A
>>338すみません。未初期化とはいったいなんでしょうか…?
0341デフォルトの名無しさん2015/05/27(水) 19:50:41.62ID:nCq7jW/A
>>339ゴミデータとは一体…?ランダムでデータが入るのでしょうか?
0342片山博文MZ ◆T6xkBnTXz7B0 2015/05/27(水) 19:59:57.94ID:bhmZkUHl
記憶媒体がデータを記憶する領域は、要らなくなったら再利用される。
領域が使用中かどうかやサイズなどの情報は別のどこかに記録されている。
0343デフォルトの名無しさん2015/05/27(水) 20:03:26.43ID:nCq7jW/A
>>342ということはどこかの要らなくなった数列が利用されたということですか…?
0344片山博文MZ ◆T6xkBnTXz7B0 2015/05/27(水) 20:12:16.93ID:bhmZkUHl
自動変数の値はCPUのレジスタか、スタック領域に格納される。
スタック領域は山を積み上げたり崩したりするように何度も再利用されている。
なので、ゴミデータが紛れ込むこともある。
0345デフォルトの名無しさん2015/05/27(水) 20:14:46.25ID:nCq7jW/A
>>344ありがとうございます。自動変数になってしまった上に、安定しないデータなのでこの出力になったのですね。ありがとうございます
0346デフォルトの名無しさん2015/05/27(水) 21:18:29.51ID:YLAut6HO
>>336
たとえば翻訳単位で、追加情報を必要としないということを宣言等できないものですか
必要のないところにチェックを課したり情報を追加したりして、結果人間が不便を被っても
それが当たり前、当然というのはあまり腑に落ちません。

デバッグするにしても、最初から全体を見ていくよりは、
対象を絞り込んでその周辺から徐々に視野を広げていくのが一般的でしょうし、
それに適したやり方っていうのは見つからないものですかね。
0347デフォルトの名無しさん2015/05/27(水) 21:32:52.03ID:20GZswGl
初期化しないとゴミが入るの?
なんだこのクソ言語
0348片山博文MZ ◆T6xkBnTXz7B0 2015/05/27(水) 21:39:06.29ID:bhmZkUHl
>>347
初期化にもコストがかかるからね
0349デフォルトの名無しさん2015/05/27(水) 21:42:49.68ID:x5rosGcz
ゴミが入るんじゃないゴミだった領域を再利用するエコな言語なんだよ
0350デフォルトの名無しさん2015/05/27(水) 21:48:58.32ID:jSIsBLLL
そういや翻訳単位でデバッグ情報いれるとどうなんるんだっけ?
0351片山博文MZ ◆T6xkBnTXz7B0 2015/05/27(水) 22:17:58.44ID:bhmZkUHl
>>350
ランタイムライブラリが違う
0352デフォルトの名無しさん2015/05/27(水) 22:23:37.78ID:jSIsBLLL
malloc/freeするとおかしくなるとかだっけ?
よくわからん。
0353デフォルトの名無しさん2015/05/28(木) 00:01:48.28ID:m+TyS5r+
>>347
直前に使用されてた値がそのまま残ってるだけ
0354デフォルトの名無しさん2015/05/28(木) 00:12:14.53ID:2DLv23cc
リリースビルドでデバッグ情報を付加することも可能だろ。
0355デフォルトの名無しさん2015/05/28(木) 00:15:27.48ID:Xmw848ss
デバッグ情報入ってたらビルド名がリリースなだけ。
0356デフォルトの名無しさん2015/05/28(木) 00:16:06.78ID:AnQe6xX7
>>335
20秒くらいなら気にすんな
0357デフォルトの名無しさん2015/05/28(木) 00:18:17.88ID:Xmw848ss
デバッグで速度が苦になるなら、リリースビルドして
必要部分だけifとprintfで自前デバッグしたらいい。
0358デフォルトの名無しさん2015/05/28(木) 00:57:53.24ID:CuNSMS4U
リリース ビルドをデバッグするには
https://msdn.microsoft.com/ja-jp/library/fsk896zz.aspx

これでいける
0359デフォルトの名無しさん2015/05/28(木) 05:37:24.02ID:yUFQMWm3
#define f(x)
#ifdef x
a(x, #x)
#else
b(x, #x)
#endif

みたいなことってできますか
0360デフォルトの名無しさん2015/05/28(木) 05:46:43.57ID:HB8xXEuW
#elseのときxは定義されていないから
b(x, #x)なんてできないぞ
0361デフォルトの名無しさん2015/05/28(木) 06:22:46.40ID:/5YfYo57
失礼しました b(#x) です
0362デフォルトの名無しさん2015/05/28(木) 08:01:00.89ID:B9gnu8yA
b(#x)の#xはfの引数のつもり?
fの引数のスコープは1行分しかないと思うが。
0363デフォルトの名無しさん2015/05/28(木) 08:02:19.13ID:B9gnu8yA
IDがgnu
0364デフォルトの名無しさん2015/05/28(木) 11:45:52.12ID:7WYWs3lt
#define check(MACRO)
#ifdef MACRO
std::cout << #MACRO << " is defined as " << MACRO << std::endl;
#else
std::cout << #MACRO << " is not defined" << std::endl;
#endif

みたいなことがしたかったんですが無理でしょうか
上記を吐くコードは書けたので問題ありませんが
0365デフォルトの名無しさん2015/05/28(木) 13:29:51.58ID:RdBy8InI
「みたいな」がはっきりしないが、まあ無理
0366デフォルトの名無しさん2015/05/28(木) 15:10:02.66ID:QEZThiJ2
しばらくC#に行ってて、C++は0xの頃で時間止まってるんだけど
今どうなってんの?
boostとかまだあるん?
0367片山博文MZ ◆T6xkBnTXz7B0 2015/05/28(木) 15:20:57.24ID:BPOchcgZ
>>366
g++やVSでのサポートでC++11がだいぶ普及してきている。
右辺値参照とか初期化リストとかラムダとか。
0368デフォルトの名無しさん2015/05/28(木) 15:23:25.27ID:AnQe6xX7
c++からヘッダーファイルと言う
物が無くなれば物凄くやり易く
なると思う。
0369デフォルトの名無しさん2015/05/28(木) 15:26:04.02ID:BPOchcgZ
>>368
それはあり得ない
0370デフォルトの名無しさん2015/05/28(木) 15:47:31.06ID:otFcwpTV
C++からヘッダーをなくしたのが、C#でありJavaだな。
importやusingが必要な時点であんま変わらんけど、
これらは省略のためで必須ってわけでもないし微妙だな。
0371デフォルトの名無しさん2015/05/28(木) 16:25:44.63ID:BS3T4776
うむ 今さらC/C++をいじくるより Java+ とか D- とかを進めるのが賢明
0372デフォルトの名無しさん2015/05/28(木) 16:51:03.32ID:ttn+1yST
C++17でモジュールがどうたらって話あるみたいだけど具体的にどういう形になんの?
0373デフォルトの名無しさん2015/05/28(木) 17:19:15.30ID:CtCSkEBs
ヘッダーファイルがなくなるってのは、要するにこうか
工程表から材料リストがなくなればものすごくやりやすくなる

???
0374デフォルトの名無しさん2015/05/28(木) 19:57:17.98ID:uGepSntc
>>364
とりあえず#defineは改行したらそこで終了な
0375デフォルトの名無しさん2015/05/28(木) 21:42:18.31ID:gCuhL1rI
頭がくらくらしてくるな。
0376デフォルトの名無しさん2015/05/29(金) 04:36:20.44ID:QmBB8Gwr
>>374
\を忘れてるだけじゃないのか
0377デフォルトの名無しさん2015/05/29(金) 04:43:17.37ID:ru3QOXEM
#ifdef MACRO \
なんてできるの?
0378デフォルトの名無しさん2015/05/29(金) 08:21:49.91ID:VcfS7+TO
プリプロが2パスならいけそう
0379デフォルトの名無しさん2015/05/29(金) 15:32:15.71ID:Efq5+4ix
#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に代入できません。
同じ型の関数ポインタには入れられます。
何が間違っているのでしょうか。
0380デフォルトの名無しさん2015/05/29(金) 18:46:53.04ID:gXnjRwZ6
useの名前がぶつかってんのかなぁ?
片方名前変えてみたら?
0381デフォルトの名無しさん2015/05/30(土) 00:26:33.80ID:qC/pm06Q
>>379
キャストすれば入るよ
ラムダ式はさんでもいいけど
0382デフォルトの名無しさん2015/05/30(土) 20:34:59.91ID:h4Yx63EK
>>381
まじでキャストで行ける?
やり方がわからん。
ソースプリーズ
0383デフォルトの名無しさん2015/05/31(日) 16:10:45.18ID:456RRL4M
初歩的ですみません配列の質問です


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文でどのように数値を格納しているのか教えてください><
0384デフォルトの名無しさん2015/05/31(日) 16:14:18.96ID:SZ/HavyK
1ループ内で偶数と奇数に分けて代入してる
0385デフォルトの名無しさん2015/05/31(日) 16:29:02.30ID:456RRL4M
>>384
ありがとうございます
続けてお願いします
例えば、三重対角行列の格納なんですけど

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]ってどういう意味なんですか?
0386片山博文MZ ◆T6xkBnTXz7B0 2015/05/31(日) 16:40:31.40ID:t8jPrrOm
0≦i,j<Nのとき、f(i,j)=j*N + iで定義される写像f:[0,N)×[0,N)→[0,N×N)が全単射になることを
利用している。一次配列を多次配列のように使うテクニックだね。
0387デフォルトの名無しさん2015/05/31(日) 17:04:30.79ID:2zIxob7P
>for文の中のK[j*N +i]ってどういう意味なんですか?
配列Kのj*N +i番目の要素だろ。
0388デフォルトの名無しさん2015/05/31(日) 17:41:00.83ID:456RRL4M
385です
ありがろうございました、変な勘違いしてました
0389デフォルトの名無しさん2015/06/07(日) 18:05:23.63ID:lDA49rz+
オブジェクト思考の設計の話なんですが、

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

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

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

当方、C言語に毛が生えた程度の使い方しかしてこなかったので、
仮装関数用意するとかやったことなく、
どうすればスマートなのかなと
0390デフォルトの名無しさん2015/06/07(日) 18:08:28.47ID:xCcw73lL
Facadeパターンでは?
0391デフォルトの名無しさん2015/06/07(日) 18:43:03.25ID:IR8285sC
TECHSCOREのFacadeパターンの例を見るたびに
中村くんへの丸投げで中村君が高負荷で倒れないか心配になる
0392デフォルトの名無しさん2015/06/10(水) 21:04:07.34ID:EVVFhxwz
委譲をされたクラスって解放されるタイミングはいつになる?
委譲したクラスを解放するとデストラクタが呼ばれて
ちゃんと解放される?
0393デフォルトの名無しさん2015/06/10(水) 23:07:32.55ID:hIQNRZvl
されなきゃ困る
03943922015/06/11(木) 00:28:55.17ID:phbL6DGJ
なんどもすまないが
ポインタで委譲しても当然同じく解放されるよね?
0395デフォルトの名無しさん2015/06/11(木) 00:33:38.30ID:ESr81XRP
されるわけねーだろ
03963922015/06/11(木) 00:42:19.12ID:phbL6DGJ
deleteいる?
0397デフォルトの名無しさん2015/06/11(木) 00:43:08.55ID:wPKRrOhd
なぜいらないと思ったのか
0398デフォルトの名無しさん2015/06/11(木) 03:45:48.27ID:KWkffMj/
最少構成で試してみたらいいのに
0399デフォルトの名無しさん2015/06/11(木) 03:48:02.27ID:daO6fC9u
それ言ったらほとんどが試してみろで済んじゃう…
0400デフォルトの名無しさん2015/06/11(木) 03:49:45.65ID:ESr81XRP
実際それで済む
0401デフォルトの名無しさん2015/06/11(木) 04:12:46.18ID:xl+1bn71
>>399
試してわからないなら聞くのが普通
0402デフォルトの名無しさん2015/06/11(木) 10:12:44.12ID:MCnGDuRk
このレベルで試して検証なんて無理だべ
0403デフォルトの名無しさん2015/06/11(木) 23:40:16.41ID:phbL6DGJ
C++における宣言と定義と生成の
意味を教えて下さい
0404デフォルトの名無しさん2015/06/12(金) 09:26:21.74ID:L7aZuwN6
なんで「C++相談室」で聞かないの?(´・ω・`)
04054032015/06/12(金) 11:29:09.30ID:ZzMiSOW4
ここで聞いても良いじゃないか(´・ω・`)
0406デフォルトの名無しさん2015/06/12(金) 12:55:42.13ID:Qvm3BcbJ
何で調べないの?
0407デフォルトの名無しさん2015/06/12(金) 16:53:56.75ID:GqZkqTHr
なんで教えてくれないの?
0408デフォルトの名無しさん2015/06/12(金) 21:47:39.48ID:ju6p67Z1
>>403
宣言と定義はともかく生成というのはなんだろう?instantiate?
0409デフォルトの名無しさん2015/06/12(金) 21:58:17.50ID:sUePbdZr
せめて入門書読んでから言語触ろうよ…
掲示板で聞くまでもない質問スレじゃないんだぞ
0410デフォルトの名無しさん2015/06/12(金) 22:35:35.27ID:GqZkqTHr
あほかそれじゃスレが伸びないだろ。
0411デフォルトの名無しさん2015/06/12(金) 23:44:10.07ID:mLuCQ1ez
別に伸ばすためのスレじゃないしな
0412デフォルトの名無しさん2015/06/13(土) 01:13:45.28ID:05Jv17Sn
おるわおるわw
「じゃあこのスレいらないよね?」ってやつw

いらないから自分で調べてね^^
0413デフォルトの名無しさん2015/06/15(月) 02:24:44.83ID:YoDUUVOd
////////////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;
}
0414デフォルトの名無しさん2015/06/15(月) 02:27:53.55ID:YoDUUVOd
////////////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;
}
0415デフォルトの名無しさん2015/06/15(月) 02:29:40.06ID:YoDUUVOd
////////////singltonClass.h
#include <iostream>

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

public:
static singltonClass* Instance();
int atai;
void setAtai(int atai);
int getAtai();
};
0416デフォルトの名無しさん2015/06/15(月) 02:30:11.52ID:TWn3hn91
>static singltonClass* instonce;
落ちるに決まってんだろ
それにinstonceってなんだよ
0417デフォルトの名無しさん2015/06/15(月) 02:32:50.12ID:YoDUUVOd
//////////////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;
}
0418デフォルトの名無しさん2015/06/15(月) 02:35:02.91ID:YoDUUVOd
//////////////TestClass.h
#include <iostream>

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

int atai;

public:
static TestClass &getInstance();

void setAtai(int atai);
int getAtai();
};
0419デフォルトの名無しさん2015/06/15(月) 05:30:01.88ID:cIly8SrJ
>>418
これはどうなったんだ

【初心者歓迎】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はどうやって認識しているの?
0420デフォルトの名無しさん2015/06/15(月) 07:23:10.09ID:YoDUUVOd
こんな感じでシングルトンクラスを作ってみて
TestClassは大丈夫なんだけど
singltonClassで値を入れようとするとアクセス違反で落ちる・・・
詳しく理由を教えてほしい
0421デフォルトの名無しさん2015/06/15(月) 08:00:52.13ID:stx1FStm
>>416
0422デフォルトの名無しさん2015/06/15(月) 08:41:04.40ID:P9xXTUaw
instonce の値が 0 だからじゃない?
04234202015/06/15(月) 11:40:03.70ID:mHyo0Y7D
>>416
だからなぜそれだと落ちるのか聞いてるんだYO
0424デフォルトの名無しさん2015/06/15(月) 12:07:59.32ID:x90+VGun
static singltonClass instonce;これはインスタンス
static singltonClass* instonce これは ぬるぽ
ぬるぽ呼んだら落ちるに決まってるだろ
0425デフォルトの名無しさん2015/06/15(月) 12:14:08.76ID:x90+VGun
コードそのままで修正するなら
static singltonClass* instonce = new singltonClass;
0426デフォルトの名無しさん2015/06/15(月) 12:17:05.18ID:x90+VGun
つかなんだこの板…
いくら何でも質落ちすぎだろ
0427デフォルトの名無しさん2015/06/15(月) 12:30:17.60ID:HDA/Cn6G
そういう受け皿も必要
04284202015/06/15(月) 13:48:45.29ID:mHyo0Y7D
TestClass &TestClass::getInstance()
singltonClass *singltonClass::Instance()
ってなにが違うの? &と*って同じじゃないの?
これが分かれば疑問が解けそう
0429デフォルトの名無しさん2015/06/15(月) 13:56:54.34ID:HDA/Cn6G
>>428
そっちじゃなくて、何を返してるのかだよ

singltonClass instonce;
の &instance と
singltonClass * instonce = new singltonClass();
の instance がほぼ同等
newしてないやつは実体がないだろ。
0430デフォルトの名無しさん2015/06/15(月) 13:58:49.85ID:P9xXTUaw
同じ意味なら記号変えるとかただの無駄な件
04314202015/06/15(月) 14:25:07.45ID:mHyo0Y7D
ありがとう
このままだとMULLだからnewで生成する必要があるのは分かった

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

あと & と * って同じじゃないの?
0432デフォルトの名無しさん2015/06/15(月) 14:44:00.83ID:P9xXTUaw
ポインタと参照について要勉強だな
0433デフォルトの名無しさん2015/06/15(月) 15:15:27.32ID:HDA/Cn6G
参照を返すかポインタを返すかの違いで実質は同じ、、とも言える
演算子としての&と参照としてのそれと混乱してる?
0434デフォルトの名無しさん2015/06/15(月) 15:16:58.79ID:cIly8SrJ
>>431
int i = 10, *p;
p = &i;

この状態で*p = i = 10
04354202015/06/15(月) 15:50:47.14ID:mHyo0Y7D
ごめん

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

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

の違いが分からない・・・
TestClass::getInstanceでは何が起こっているの?
0436デフォルトの名無しさん2015/06/15(月) 15:57:14.24ID:P9xXTUaw
何も起こってない

むしろsingltonClass::Instance()のコンパイル通る方が深刻
0437デフォルトの名無しさん2015/06/15(月) 16:03:25.21ID:P9xXTUaw
>>434のレスに倣えばこういうこと

int x = 0;
int& q = x;
q = 10; // x = 10
04384202015/06/15(月) 16:11:31.47ID:mHyo0Y7D
TestClass &TestClass::getInstance()
{
static TestClass instance;
return instance;
}

これだと正常に動作して

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

こんな感じで & を外すと
main.cppでTestClassを生成しようとするとコンパイルエラーになる
ごめん、これが分からない・・・
0439デフォルトの名無しさん2015/06/15(月) 16:14:51.03ID:P9xXTUaw
コンストラクタ/デストラクタがprivateだからじゃないの?
04404202015/06/15(月) 16:42:12.89ID:mHyo0Y7D
& をつけるとコンストラクタ/デストラクタがprivateでも大丈夫な理由を教えて下さい
何度もすみません、ここが分からないんだ
0441デフォルトの名無しさん2015/06/15(月) 16:49:19.72ID:HDA/Cn6G
単に外したらインスタンスのコピーが渡されるから、デストラクタが外から呼ばれることになるべ
04424202015/06/15(月) 17:08:37.28ID:mHyo0Y7D
そういうことか分かったぁぁぁぁぁぁ!!!
関数のアドレスを渡してるから
関数を実行しているのはTestClass本体ってことか!!!
だからprivateでも問題ないと!!!!
ありがとbfヴぃbfdgb!!!
04434202015/06/15(月) 17:11:26.95ID:mHyo0Y7D
何度も質問してからこんなこと聞くものあれなんだけど
一般的にシングルトンってTestClassのやりかたが主流?
他になんか良いやり方がある?
0444デフォルトの名無しさん2015/06/15(月) 18:29:21.08ID:ks4U7BG0
>>443
ググれアホ
0445デフォルトの名無しさん2015/06/15(月) 19:02:51.79ID:FZwBA5EA
適当なCかC++入門サイト開いて、
ポインタについてしっかり頭に叩き込んでからまたおいで
0446デフォルトの名無しさん2015/06/23(火) 19:12:27.44ID:coxulpee
教えてください。
typedef vector<int> v1;
typedef vector<v1> v2;
typedef vector<v2> v3;
…
typedef vector<vn-1> vn;

みたいなことやりたいんですが、テンプレートでうまくまとめられませんか。
0447デフォルトの名無しさん2015/06/23(火) 21:47:23.20ID:qkxeTacg
>>446
一体nはどれくらいの値を想定している?
vectorをあんまり沢山入れ子にすると訳分からない状態になるぞ。
0448デフォルトの名無しさん2015/06/23(火) 21:54:26.48ID:coxulpee
>>447
実を言うと本当はvectorの入れ子じゃなくて自作のクラスの入れ子なんですけど、
自作クラスの説明が面倒くさいからvectorに置き換えました。
nは10位ですかね。
0449デフォルトの名無しさん2015/06/23(火) 22:00:49.15ID:qkxeTacg
参考までに聞きたいのだが、どういう用途のアプリで、そういうデータ構造が必要になるの?
0450デフォルトの名無しさん2015/06/23(火) 22:03:13.38ID:qkxeTacg
vectorを10個入れ子にして、どうやってデータを取り出す?
0451デフォルトの名無しさん2015/06/23(火) 22:06:36.66ID:coxulpee
いや、完全に趣味のコードなんですけどw
整数型2つメンバにもって多倍長整数にするクラスを作ろうとしてる。

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

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

みたいな感じ。
0452デフォルトの名無しさん2015/06/23(火) 22:15:43.63ID:qkxeTacg
>>451
それなら、わざわざややこしい入れ子にしなくても、10倍長計算に必要な領域を
配列か何かで int work[10] みたいに確保しておいて、それ使って計算すればいいんじゃないか?
0453デフォルトの名無しさん2015/06/23(火) 22:18:38.19ID:qkxeTacg
ああ、work[10]じゃあ足りないか。
0454デフォルトの名無しさん2015/06/23(火) 22:23:15.99ID:coxulpee
>>452
そこはロマンというかw
テンプレート使える俺かっこいい的なw
0455デフォルトの名無しさん2015/06/23(火) 23:57:56.03ID:/nLjrxmH
これ明らかに使わないだろ

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;
}
0456マ○コデラックス2015/06/23(火) 23:59:17.67ID:bwjeXC/X
スレ立てるまででもない質問ってどんなの?
0457デフォルトの名無しさん2015/06/24(水) 11:52:28.38ID:67aeQTeE
趣味で作る多倍長計算プログラムか‥ いいねぇ πとか計算するのかな?
今はGMPとかあるからなー
良い時代になったもんだ
0458QZだ信じれ2015/06/27(土) 14:03:24.53ID:KcwTZCGl
足し算だけで力尽きた‥
いつか割り算を実装してから『素数』を数えて落ち着くんだ‥
0459デフォルトの名無しさん2015/06/27(土) 15:13:43.86ID:07vULyYd
>>458
素数の計算だけでしたら、エラトステネスのふるい法でどうでしょうか。
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のふるいによる素数の計算」
をご覧いただければと思います。
とんでもない思い違いをしているかもしれません。その節はご容赦
をお願いいたします 
0460デフォルトの名無しさん2015/06/27(土) 21:13:58.41ID:v21lmC3z
しょうもない質問ですいません

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

これを実行するとnには4が必ず入ってしまうのですがなぜなのでしょうか
実行環境はVisual C++ 2010 Expressです
0461デフォルトの名無しさん2015/06/27(土) 21:19:14.85ID:K06hVkJE
>>460
多分、4/1を計算しているからだと思う。
0462デフォルトの名無しさん2015/06/27(土) 21:20:38.90ID:JzcDXnUr
>460
32ビットアプリですね?
ポインタのサイズをchar のサイズで割るから当たり前です。
0463デフォルトの名無しさん2015/06/27(土) 21:27:09.14ID:K06hVkJE
>>460
それにしても
char *AA
なんて変数名付ける奴初めて見たわ。
何で大文字なんだよ?
何でAA何だよ?
見れば見るほど変だぞ。
0464デフォルトの名無しさん2015/06/27(土) 21:28:36.30ID:oXqh0l6v
大文字はマクロだと決まってる
0465デフォルトの名無しさん2015/06/27(土) 22:26:08.63ID:v21lmC3z
>>461
なぜ*AAのアドレスのサイズが4byteなのでしょうか・・・
0466デフォルトの名無しさん2015/06/27(土) 22:31:26.25ID:e2zMBxYg
ポインタのサイズだからだろ
sizeof(char*)は32bit環境だと大体4だろ
0467デフォルトの名無しさん2015/06/27(土) 22:47:11.23ID:9MGfZNNc
charでもintでも、32bitの環境ならそのアドレスはどちらも4byte
0468デフォルトの名無しさん2015/06/27(土) 23:02:33.19ID:++FZGhMS
ひょっとして12になることを期待(予想)してたのかなぁ
0469デフォルトの名無しさん2015/06/28(日) 00:58:59.21ID:IZhI7buf
むしろ11になることを期待していたと予想
0470デフォルトの名無しさん2015/06/28(日) 03:48:23.85ID:YhCvVIgA
>>459
その方法だと,最初から求めたい地点まですべて「オンメモリ」なのが辛いところです.
といって試し割り素朴法は計算が遅い
そこで,そのハイブリッドを考えています
オンメモリの素数を調べる部分は先端だけで十分だと思うのです
0471デフォルトの名無しさん2015/06/28(日) 07:57:05.85ID:q4v0PqzP
>>463
本題以外で突っ込むとか変だぞ
0472デフォルトの名無しさん2015/06/28(日) 08:46:19.67ID:EIkqw89x
>>470
前述の「電子計算機のための数値計算法 II』には
求めた素数を一旦外部記憶装置に記憶させておいて、
その値を使って新しくチェックする云々と書いてあります。
入出力に時間がかかりますが、これだとたしかにメモリーの
消費が少なくなりますが……
是非一度、上記の書籍の該当箇所をご覧ください。
小生の生半可な説明よりは、ずっとよいと思いますので。
ご検討をお祈りしております。
結果のご報告をお待ちしております。
0473デフォルトの名無しさん2015/06/28(日) 10:22:05.93ID:Z3SmjTo/
>>473
ご紹介いただいた書籍には「素数を外部装置に記録する」方法と
エラトステネスの篩とを併用する方法は紹介されていますか?
そうでなければ興味はわきません
0474デフォルトの名無しさん2015/06/28(日) 10:23:14.25ID:M4OFumRq
>>470
試し割り素朴法を使うにしても、無駄を省くために平方根の多倍長計算ルーチンは実装しておきたいところですよね。
除算や平方根を楽に(?)計算するNewton-Raphson法というのがあるようです。ご参考までに。
http://円周率.jp/method/newton.html

>>471
> >>463
> 本題以外で突っ込むとか変だぞ
話し合ってる問題の本質と無関係なところで揚げ足をとって騒ぐ
こういうバカは、会社でも一定数存在するな。たいてい会議が無駄に長引く元凶。
0475デフォルトの名無しさん2015/06/28(日) 10:37:39.95ID:Z3SmjTo/
>>474
試し割り素朴法では、平方根の計算は実は必要ありません。
試し割りの商と割数とを比較すればいいからです。
それにニュートンラプソンは実装が面倒な浮動小数点が必須、わざわざややこしい世界に手を広げる必要はありません。

素数を数えておちつくんだ!
0476デフォルトの名無しさん2015/06/28(日) 11:13:06.74ID:2/AXk5Qq
クラス内のvectorってダメ?
ただの二成分量のクラスを作ったんだが
vectorにすると急に遅くなった(g++ -O3)
0477デフォルトの名無しさん2015/06/28(日) 12:21:10.02ID:rotd9Dcd
>>476
それだけの情報で答えるなんて適当なことしか言えないよ
プロファイル取って何が問題になってんのか調べな
0478デフォルトの名無しさん2015/06/28(日) 14:29:17.61ID:l/YNGXJW
時代に付いていこうとスマートポインタ勉強してるんだけど
クラスのメンバに持ってる std::unique_ptr の参照をゲッターで外に出すのって普通?
std::shared_ptr をメンバに持って std::shared_ptr<T> Class::Getter() の方が良いの?
0479デフォルトの名無しさん2015/06/28(日) 15:41:33.49ID:Iw80ONOH
スマポなんてとっくに時代遅れだろ
今はガベコレが主流だよ
0480デフォルトの名無しさん2015/06/28(日) 16:17:14.22ID:l/YNGXJW
C++にGCないやん……Boehm?
というかそのGCを趣味で実装しようとしてるのでGCは使えないのです

生ポインタ使うよりはモダンかなと思ってたんだけどどうなのかな
使ってみるとスマポと生ポインタが混在してるのが気持ち悪くなっちゃって
どうにかスマポか参照に置き換えようとしてる
0481デフォルトの名無しさん2015/06/28(日) 16:21:16.22ID:OeLQkQMR
スマポ便利って言うけど今までナマポで不便感じた事ないしこれからもナマポで行くかな。
0482デフォルトの名無しさん2015/06/28(日) 16:34:44.44ID:UiBucRXh
つalloca
0483デフォルトの名無しさん2015/06/28(日) 16:38:40.66ID:OeLQkQMR
>>482
malloc/freeじゃあ駄目なのか?
0484デフォルトの名無しさん2015/06/28(日) 16:41:21.52ID:l/YNGXJW
スマポの話だったから解放処理書かなくてすむmallocの代替品ってことなのでは?>alloca
でもヒープメモリが欲しいんや……
0485デフォルトの名無しさん2015/06/28(日) 17:12:47.69ID:Iw80ONOH
CoTaskMem使おうよ
0486デフォルトの名無しさん2015/07/06(月) 17:46:05.01ID:Bbdz7Dci
遺伝的アルゴリズムで調べてたら
wikiの手順説明には
・選択
・交叉
・突然変異
・コピー
(下3つはそれぞれ設定された確率で起こる)
みたいにあるけど生物界では必ず交叉起こるはずだよな?

・選択(重複無し)
・交叉(必ず起こる)
・突然変異(低確率で起こる)
・コピー(起こらない)
にした方がいいと思うんだが
0487デフォルトの名無しさん2015/07/06(月) 18:55:53.85ID:QWNNDY2V
それでいい結果が得られるんならそうすれば
0488デフォルトの名無しさん2015/07/06(月) 19:17:47.96ID:L4KLNmyL
別に生物界の遺伝をシミュレートしてるわけじゃないだろこのスットコドッコイ
0489デフォルトの名無しさん2015/07/06(月) 19:39:45.55ID:Bbdz7Dci
>>488
腑に落ちたありがとう
0490デフォルトの名無しさん2015/07/08(水) 05:54:43.37ID:8R+nhtCy
visual studio で組み込み開発

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


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

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

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

みたいな事やってるけど、超面倒。
こんな事やってられないけど、これ以外に手段ないですよね?
0491デフォルトの名無しさん2015/07/08(水) 09:40:39.03ID:P1nDZAUb
VC、MS環境の組み込みは経験ないけど、
OSが同じなら、一旦セルフ環境でデバッグ済ませてしまえば?と思うのだが

まぁアタッチしないといけない理由は他にありそうな気もするが
0492デフォルトの名無しさん2015/07/08(水) 10:04:25.40ID:PAkk6Hqa
>>490
良く知らんがそのexeがデバッグビルドして有ったら、アタッチした時点で自動的にソースコードが読み込まれて普通にデバッグ出来るんちゃうか?
0493デフォルトの名無しさん2015/07/08(水) 10:08:37.12ID:PAkk6Hqa
>>492
ああ、exeはリモートで動くから駄目だな。
そのリモートのタブレットにVisual Studioのリモートデバッガーはインストール出来ひんのか?
リモートデバッガーなら行けるかも。
根拠の無い勘ですが。
0494デフォルトの名無しさん2015/07/08(水) 11:44:06.43ID:ac7mf5QU
VisualStudio使ったこと無いけどデバッグ実行前に実行するコマンド書けるでしょそれで転送とかサービスの起動を自動化すればいいんじゃないの
0495デフォルトの名無しさん2015/07/08(水) 11:48:34.67ID:PAkk6Hqa
>>494
それをリモートデバッガーと言うと思うよ。
開発環境でビルドして、実行はリモート環境。実行に必要なexeやその他のファイルは、設定しておけば実行時に自動的にリモート側にコピーされる。そしてデバッガーが起動する。
0496デフォルトの名無しさん2015/07/08(水) 12:45:47.21ID:xsPPpspE
>>490
環境依存度が高すぎるから VisualStrdio 系のスレで質問し直すのが吉。
そのときはせめて、 VS のバージョンくらい書けよ。
サービスからの起動じゃないと動かない(工夫すれば動かないことも無いと思うが)のならば、
そのことも書いた方がいいな。

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

あと、プロジェクトのプロパティ「デバッグ」のところについて
しっかり調べるともっと楽できるかもな。
よさげな方法が見つかったら教えてくれ。
0497デフォルトの名無しさん2015/07/08(水) 18:07:32.75ID:yzj4SMDb
VS諦めてICE使え
0498デフォルトの名無しさん2015/07/08(水) 18:11:20.27ID:PAkk6Hqa
>>490
その後どうなったんだよ?気になって寝られないよ。
それとも、2ch見る暇も無いくらい虎ブってんのか?
0499デフォルトの名無しさん2015/07/16(木) 20:25:08.45ID:8PKWst4d
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"って出す方法はありますか?
0500デフォルトの名無しさん2015/07/16(木) 20:42:33.89ID:97AdtI1Z
funcをバーチャルにするんじゃだめかな?
確かめてないけど。
0501デフォルトの名無しさん2015/07/16(木) 20:44:43.18ID:0HInDZYo
>>499
func()をvirtualにするか、単にオーバーライドするか
0502デフォルトの名無しさん2015/07/16(木) 20:48:22.58ID:8PKWst4d
virtualにしたら継承する子クラスごとに実装が必要になりますよね?
全部共通の挙動を記述したいのに、ポリモーフィズムになってないような…
継承したときの挙動がJavaとだいぶ違うんですね…
0503デフォルトの名無しさん2015/07/16(木) 20:51:22.83ID:0HInDZYo
ちゃんと共通の挙動になってるじゃん
"Parent"を表示するという共通の挙動に
0504デフォルトの名無しさん2015/07/16(木) 21:07:12.81ID:8PKWst4d
ポリモーフィズムという言葉の使い方が論理で言う裏の意味になってしまっていましたが、
挙動が異なる部分は個別で書いても、
共通の部分は1か所で書いてほしいという意味です。
0505デフォルトの名無しさん2015/07/16(木) 21:12:17.89ID:0HInDZYo
>>504
ちょっと言ってる事が分からないんで最小限の"Javaならこんな動作をするんだけど"って
コードをideoneにでも上げてみてくれ
0506デフォルトの名無しさん2015/07/16(木) 21:26:39.68ID:8PKWst4d
あれ?私がアホだったようです。今までどうやってたんだろう?
0507デフォルトの名無しさん2015/07/16(木) 21:31:31.63ID:97AdtI1Z
Childでstr定義しなけりゃいーんじゃね
コンストラクタで値設定してやるとか
0508デフォルトの名無しさん2015/07/16(木) 21:32:02.23ID:97AdtI1Z
privateも変えなきゃダメか。
0509デフォルトの名無しさん2015/07/16(木) 21:38:42.38ID:8PKWst4d
コンストラクタは試しましたが駄目でした
Javaも同じ挙動なので正統な仕様っぽいですね
0510デフォルトの名無しさん2015/07/16(木) 21:57:38.31ID:97AdtI1Z
staticでないメンバ変数って宣言と一緒に初期化できないんじゃ?
0511デフォルトの名無しさん2015/07/16(木) 22:04:39.16ID:97AdtI1Z
c++11だと出来るのか?
0512デフォルトの名無しさん2015/07/16(木) 22:07:20.68ID:CJJ7/fpC
できるよ
0513デフォルトの名無しさん2015/07/16(木) 22:20:20.71ID:97AdtI1Z
まあ、ParentとChildで同じ名前だが別々の変数になってるのが悪いんだろ要は
0514デフォルトの名無しさん2015/07/16(木) 23:25:09.92ID:y0fv9fm6
Parent単体で使わないならCRTP使えばいいよね
0515デフォルトの名無しさん2015/07/17(金) 02:38:25.17ID:s3h+5IcC
Childに変数strじゃなくprotected関数でparentのstrに"Child"とやるんじゃないの?
0516デフォルトの名無しさん2015/07/17(金) 13:12:55.27ID:OTxNgdvH
overrideキーワードでなんとかならんか
0517デフォルトの名無しさん2015/07/17(金) 13:36:11.16ID:q0tTJLJ/
あれは名前の間違いを防ぐためのもんだろ
0518デフォルトの名無しさん2015/07/18(土) 01:27:59.36ID:+dYah9PS
515が正解だろうな
0519デフォルトの名無しさん2015/07/18(土) 02:26:19.56ID:bSmobx4N
>>502,506
俺はCしかやったことないから、間違っているかもしれないが。

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

ただしstrはメンバ変数(フィールド)なので、virtual指定は出来ない。
俺も515が正解だと思う。
0520デフォルトの名無しさん2015/07/18(土) 03:14:55.63ID:YrpuCTOJ
http://ideone.com/kasXIK

こういう風に書くもんだと思ってたけどな
0521デフォルトの名無しさん2015/07/18(土) 03:24:51.92ID:YrpuCTOJ
http://ideone.com/P22ci3

結果だけ同じにしたいのならこっちの方がシンプルかも
0522デフォルトの名無しさん2015/07/18(土) 04:20:59.92ID:bSmobx4N
>>521
いや520は駄目だろ、521はいいけど。
515は日本語が若干アレだが、521に近くて、

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

なのだと思う。
文法的にどうなのかはちょっと怪しいが、通るのならいいのでは。
0523デフォルトの名無しさん2015/07/19(日) 21:05:38.46ID:C0eKKOJs
日本語的にちょっとアレでも意味が通るだけまだマシ

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

さらに
>通るのならいいのでは
というスタンスの方がよっぽど怖い
0524デフォルトの名無しさん2015/07/19(日) 21:36:02.86ID:4AVebAB2
なんで?
意味的には問題ない。だからコンパイルが通ればいい。
C++11なら通るし、昔のC++なら通らないだけだろ。

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

当たり前だけど、コンパイルが通りさえすれば全ていいといっているわけではない。
一般的に、改訂されるときは、過去に記述が面倒だったものが簡潔に書けるようになる。
C++11でいい環境ならそれでいいし、駄目ならコンストラクタで初期化する記述を書くしかないだけだろ。
0525デフォルトの名無しさん2015/07/19(日) 23:44:07.89ID:M/uggKZR
なんでプログラマって日本語があれの人が多いの?
0526デフォルトの名無しさん2015/07/19(日) 23:54:00.89ID:i+qdcRrk
「こいつ、プログラミング言語より母国語をちゃんと学習するべきだろ!」って感じる書き込みは、このスレにも散見されるな
0527デフォルトの名無しさん2015/07/20(月) 00:02:02.31ID:B6aaQcuY
自然言語でのお喋りは難しいよね
リアルタイムに構文チェックできないのがツライ
0528デフォルトの名無しさん2015/07/20(月) 00:12:57.65ID:Zt6Jwc5S
日本語は流し読みするのに向いてないような気がしてきた。
述語が最後に来たり、「てにをは」を読み飛ばすと意味が反対になったり。
論理的な記述よりも時系列に沿った記述に向いているので、小説には向いているのかも知れんが、
技術的な議論を展開するのは難しいのかも。
結論を後回しにするので、ウソを付くのには向いている言語かも。
これのせいで世の中が混乱する。玉虫色言語。
小学生から英語を学習するのに賛成だ。
例えば上記の文章一つとってもいつも迷う。
「小学生から英語を学習するのに賛成だ。」・・・時系列重視
「英語を小学生から学習するのに賛成だ。」・・・目的語重視
はたしてどちらが読みやすく、意味が正確に伝わりやすいのだろうか。
何故こんなことで悩まなくてはならないのだろう。
0529デフォルトの名無しさん2015/07/20(月) 00:15:46.01ID:1Qy7XHWg
>>528
君は日本語の良さを全く分かっとらん!
0530デフォルトの名無しさん2015/07/20(月) 00:17:09.46ID:B6aaQcuY
良い年した大人が小学生に英語を教わるなんて恥ずかしいよ
0531デフォルトの名無しさん2015/07/20(月) 00:24:55.57ID:NxNLCFO0
>>530
for (int i=0;i<3;i++) printf("w");
0532デフォルトの名無しさん2015/07/20(月) 00:28:42.11ID:Zt6Jwc5S
あと、日本人は縦割り行政で利権が大好きでOOP脳なので、
自分の立場に立ったり、相手の立場に立ったり、
思いやりだとか、なんとか、主体がかなりいい加減。
例えば次の文はどっちでも通る。
「小学生から英語を学習するのに賛成だ。」
「小学生から英語を学習させるのに賛成だ。」
なんとかしてほしい。もやもや
0533デフォルトの名無しさん2015/07/20(月) 00:51:14.45ID:Zt6Jwc5S
述語や動詞というのは「機能」なんです。
と言うことはこれが前に来る言語を使っている人たちは、ひとえに機能主義なんです。
機能主義は立場よりも横のつながりを重視します。
一方で思いやりに欠けます。しかし、そこに拘るのは男らしくないという考え方です。
こういう何らかの感覚的な違いが、結構重要な何かなんじゃないかと最近ひしひし。
0534デフォルトの名無しさん2015/07/20(月) 01:27:14.66ID:Zt6Jwc5S
われわれはどうして、機能主義なことを、皆こぞって「風通しが良い」って詩的な表現で言うんですかね。
こういう曖昧な表現を使うと、毛の壁さんのような人が、独自の解釈をして、勘違いして、変な展開になる可能性が。
わざとなんですかね。一定以上の知能が無い人には真意が伝わらないようにするっていう。
二重の会話。凄い技術ですね。
0535デフォルトの名無しさん2015/07/20(月) 02:12:16.93ID:ERLwMp/J
>>528
それは論理的に日本語で記述しない側の問題,
あるいはもともと論理的でない内容だったという話なのでは?

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

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

英語でも分詞構文はかなりあいまいで読み手が内容を推察しないといけないかと
憲厳密性の必要なはずの法律・条文に割合に多い
https://en.wikisource.org/wiki/Constitution_of_Japan#The_Constitution_of_Japan
0536デフォルトの名無しさん2015/07/20(月) 02:32:06.60ID:Zt6Jwc5S
風通しの良い社風ですってPRってどうなんだろうね。
風通しが良すぎて、要らなくなったらはいサヨナラだったりして。
機能主義って結構厳しいわけで。
分かりやすく、風通しが良い==公務員の正反対の社風と考えると、疑問がわくよね。
今の時代、「わが社は市役所の様な社風です」ってPRしたほうが人気出るんじゃね。
0537デフォルトの名無しさん2015/07/20(月) 02:55:37.94ID:Zt6Jwc5S
あと、風通しが悪そうな業種と言えば、
医者とか大学教授とか政治家とか。
余裕の有る業種は機能的になる必要が無いので風通しが悪くなる。
余裕の無い業種は機能的にならざるを得ないので風通しが良くなる。
それに、普通に考えて、働く上で、風通しが良くて、何か得することがあるだろうか。
そりゃ会社は得するだろうが、従業員的にはリスクの方が大きいような。
派遣とか有る意味最高に風通し良いよな。会社の垣根すら越えているわけだから。
0538デフォルトの名無しさん2015/07/20(月) 03:16:13.69ID:Zt6Jwc5S
OOPはメンバ変数を大切に保護する、とても思いやりに溢れた発想。
日本的で良いではないか。Matzも喜ぶ。
裏を返せば縦割り行政で利権主義とも。
0539デフォルトの名無しさん2015/07/20(月) 03:30:39.42ID:Zt6Jwc5S
あと、OOPは各オブジェクトがコミュニケーションをとりながら協調動作するあたりも、
非常に日本的といえるね。
それがたとえ機能的じゃなかったとしても、そういう風に振舞うことが美徳とされている。
デザインパターンとかいった様式美も時代劇みたいでいいね。
0540デフォルトの名無しさん2015/07/20(月) 04:07:18.07ID:exWjJYka
なにこの独壇場(;^ω^)

スレタイの日本語と空気も読めるようになっとけよ?
0541デフォルトの名無しさん2015/07/20(月) 12:07:06.33ID:B6aaQcuY
ドキュメント記述に最適なOOP自然言語開発しようぜ
0542デフォルトの名無しさん2015/07/20(月) 21:50:13.92ID:4CXi8vOi
スレ立てて勝手にやれよ
0543デフォルトの名無しさん2015/07/22(水) 23:52:29.80ID:1Ae0pJ+D
質問です

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

hoge_funcを動的ロードするのは、macro_funcの中身が今後どう変わるか
分からないので極力避けたいです
どうすればmacro_funcを動的ロードできるか教えてください
0544デフォルトの名無しさん2015/07/23(木) 00:01:59.37ID:CfJH8He2
>>543
どうみても関数hoge_funcの実体がないとmacro_funcは動作しない。
動的・静的ロード、コード全体の埋め込みに関わらず、hoge_funcがないと無理。
0545デフォルトの名無しさん2015/07/23(木) 01:21:06.57ID:65Ur3bjf
というQZの妄想が始まった
0546デフォルトの名無しさん2015/07/24(金) 11:05:32.19ID:+CDH8aof
昔から疑問なんですが、
文字列扱う場合、エスケープってやるじゃないですか。
"\"あいうえお\""
こんな感じ。これ見辛いし面倒だし
""あいうえお""
でええやん?って思うんですが。どうですか?
0547デフォルトの名無しさん2015/07/24(金) 11:15:53.69ID:OLl6qPEd
それは釣りか?
""あいうえお""
これは、
"<空の文字列>"あいうえお"<空の文字列>"
と解釈されるぞ。
0548デフォルトの名無しさん2015/07/24(金) 11:25:05.67ID:+CDH8aof
>>547
いや、だからそのcやc++の仕様を拡張してエスケープ無しで行けるようにしたら良いんじゃないかと…
0549デフォルトの名無しさん2015/07/24(金) 11:26:49.57ID:yzOD5LHX
R("あいうえお")";
0550デフォルトの名無しさん2015/07/24(金) 13:11:20.49ID:otR8/vJ5
拡張って、それ区別できんやろ
0551デフォルトの名無しさん2015/07/24(金) 13:58:41.01ID:LT/1nm8p
>>548
http://ideone.com/VU0Ru9
0552デフォルトの名無しさん2015/07/24(金) 14:15:50.67ID:+CDH8aof
>>551
なるほど。
区別出来ないのか。だったら"や'では無くてasciiコードに1文字新しい記号を割り当てて例えば''' トリプルクオーテーション
みたいなの定義して文字列はこの記号で囲う。この記号自身は文字列に使ってはいけないとか言う仕様にするのはどうかな?
0553デフォルトの名無しさん2015/07/24(金) 14:19:59.16ID:yzOD5LHX
Raw string literalsでいいじゃん
0554デフォルトの名無しさん2015/07/24(金) 14:34:24.73ID:OLl6qPEd
>>511
こんな小難しい例を挙げなくても、
"";int i;"";
これで十分。このコード、コンパイルは通ります。

>>552
それって今と同じ状況じゃないですか。
再帰的にどんどん増やしていくんですか?
0555デフォルトの名無しさん2015/07/24(金) 18:15:33.40ID:7eFkrdf6
asciiコードに自分の考える文字追加とかどんだけドリーミーなんだよ
0556デフォルトの名無しさん2015/07/24(金) 20:46:34.43ID:B25T497v
被曝してるのにオリンピックとかやっちゃう脳をもった国ですからね
何やってもおかしくない
0557デフォルトの名無しさん2015/07/24(金) 20:52:37.92ID:eC0qtT6i
ASCIIコード体系はC/C++だけの為にあるわけじゃないのに
今からそれを変更するのはあまりにも影響が大きすぎるでしょう
「\"」の見栄えのためだけにとんでもないコストを払うのは現実的ではないとおもうよ
0558デフォルトの名無しさん2015/07/24(金) 21:01:28.24ID:OLl6qPEd
今更ASCIIコード変更とか逝かれてる発想だけど、
過去にはバックスラッシュを\マークにすると言う離れ業をやってのけたわけだがね。
もともとの話は、
"\"あいうえお\""
が見にくいって話だったけど、\マークだから余計に見にくいってのも有るね。
変なところで話がつながった。おしまい
0559デフォルトの名無しさん2015/07/24(金) 23:30:32.86ID:M2zLZm11
C#だと
@"""あいうえお""";
となるな。
0560デフォルトの名無しさん2015/07/25(土) 09:38:50.40ID:swByAiFJ
ああ " を2つ並べるエスケープも見ずらいよな〜
0561デフォルトの名無しさん2015/07/25(土) 11:23:13.05ID:O+qig66a
asciiに文字を増やしてみたとして
結局そのうちその文字自身を文字列に入れたくなることが出てきていたちごっこ
0562デフォルトの名無しさん2015/07/25(土) 11:31:14.17ID:bLirGUmg
じゃあ、見た目は同じだけれど
asciiコードが異なる"を二種類定義してだなあ、文字列定義で使う一つ目の"で文字列を囲って、文字列の中身は二つ目の"を使えば
"あ"い"う"
"""
""""""""
など何でもOK。俺って天才だろ
0563デフォルトの名無しさん2015/07/25(土) 11:31:15.57ID:BM2K7hmS
asciiとか半角256パターンなのにどうすんだべ
0564デフォルトの名無しさん2015/07/25(土) 11:58:32.89ID:O+qig66a
見た目が同じでコードが違うとかプログラマの嫌がる王道パターンじゃないか
0565デフォルトの名無しさん2015/07/25(土) 14:48:08.13ID:xrZjcDNk
文字列リテラルは連結できるんだから、文字定数を文字列リテラルと連結できるルールがあればいいんだな。
'"' "あいうえお" '"'
0566デフォルトの名無しさん2015/07/25(土) 15:27:06.34ID:SkX3Z7YG
好きな書式を選びたまえ by D

"\"abc\""
`"abc"`
q{"abc"}
q"["abc"]"

# ほんとは この倍くらい記法の種類がある
0567デフォルトの名無しさん2015/07/25(土) 19:10:08.76ID:kRwC234a
それよりテンプレートのテンプレートで>が連続で書けないのが不満

昔VCだと通っていたが
0568デフォルトの名無しさん2015/07/25(土) 19:13:50.43ID:9SEykvB/
C++11に対応してるコンパイラなら書けるだろ?
0569デフォルトの名無しさん2015/07/25(土) 20:13:53.13ID:bLirGUmg
>>567
テンプレートのテンプレートなんて使ったら、後で自分で見返しても何してる処理かわからなく成りませんか?
0570デフォルトの名無しさん2015/07/25(土) 20:22:52.03ID:9SEykvB/
std::vector<std::pair<a,b>>←これのことでしょ
0571デフォルトの名無しさん2015/07/25(土) 20:32:50.55ID:HTRLB0UZ
昔は通らなかったが最近は通るようになったんじゃなかったか
0572デフォルトの名無しさん2015/07/25(土) 20:45:06.07ID:FjYNChri
>>569
そんな事ねぇよ
だいたいvectorで二次元配列書こうとするだけで必要になるでしょうが
0573デフォルトの名無しさん2015/07/25(土) 20:48:37.93ID:bLirGUmg
>>572
vectorのvectorなんか使わなくても
普通に二次元配列とか、自前のlist構造みたいなの使う方がやり易く無いですか?
0574デフォルトの名無しさん2015/07/25(土) 20:59:22.38ID:FjYNChri
>>573
途中で列方向に伸ばしたり行方向に伸ばしたくなる事がたまにある
そういう時はvectorが便利
0575デフォルトの名無しさん2015/07/25(土) 21:00:03.73ID:FjYNChri
なーんか釣りっぽいけど
listなんか糞遅くて使えるか
0576デフォルトの名無しさん2015/07/26(日) 09:22:04.99ID:Kcbwho8L
エディター作ろうと思ったらlist<vector<char>>かなんかを使うだろ。
0577デフォルトの名無しさん2015/07/26(日) 15:03:16.44ID:kbQtFiQ+
エディタもvector< vector< char > * >でよくね?
0578デフォルトの名無しさん2015/07/26(日) 16:47:25.24ID:P7wSwPkX
エディタは一行削除したり数行まとめて移動・挿入したりの頻度が高いので
行方向がvectorでは遅くなる
0579デフォルトの名無しさん2015/07/26(日) 17:41:01.90ID:vMGDFyGs
計算量の理屈では挿入削除はリストのほうが効率がいいが、
実測ではlistよりvectorが速くなることってめったにない気がするんだよなぁ。
俺個人の感想だが。
0580デフォルトの名無しさん2015/07/26(日) 17:41:53.36ID:vMGDFyGs
逆だった。vectorよりlistが速くなるのが滅多にない。
0581デフォルトの名無しさん2015/07/26(日) 18:02:19.78ID:P7wSwPkX
体感ではなくベンチマークすべきだな、そこまで言うなら

100000行位のテキストを想定して、ランダムにカット&ペーストを繰り返す
0582デフォルトの名無しさん2015/07/26(日) 18:25:36.24ID:iQP3uV6G
>>579
処理のやり方にもよるからね。
毎回挿入位置までリストをたぐる操作をやっていたりしたら計算量もたいして有利じゃないし。
0583デフォルトの名無しさん2015/07/26(日) 20:39:58.99ID:kABshWn7
ベンチマークプログラム難しそうだな
コピペのブロック指定中は既に先頭のイテレータを取得した状態だという事だし、そこから
splice()を実行するのならlistの方が遥かに速いだろうけど、イテレータを取得するのは
vectorの方が圧倒的に速い
0584デフォルトの名無しさん2015/07/26(日) 22:36:35.84ID:kbQtFiQ+
普通に考えてvectorの方が良いだろ。
行の変更があるのは、改行した時とか、限定的。
ユーザの入力があったときしか、行の変更は無い。
なので、一秒間に何十回もそういう操作があるわけではない。
一方再描画は頻繁に発生する。滑らかなスクロールをするためには、
一秒間に60回の描画が発生するかもしれない。
それなのにlistはランダムアクセスが出来ません。
ランダムアクセスができないと言うことは、ほかにも色々な制限をもたらします。
たとえばクイックソートは絶望的。とにかく面倒。素直にvector使っておけばよい。
ここで、vectorを使う場合を考える。
ポインタ一つ4バイトとして、100000行だと、400KB。
これのmemmoveに何msかかるか考えてみろ。
画像で言えば32bitで1000x100のビットマップ程度の大きさに相当して、
これは、フルハイビジョンの1/20の面積しかない。
この程度の処理がもたつくようでは、面積20倍、それも複雑なデコード処理が必要な
フルハイビジョン動画の再生は困難なわけで、問題になりえるか、考えるまでも無い。
0585デフォルトの名無しさん2015/07/27(月) 01:29:16.53ID:nrCiDIHC
だから言葉では何とでも言えるからベンチマーク取るしかないんだよ

行のイテレータはadvance()で取るとして、erase()やinsert()と、splice()を
使って行の長さを適当に変化させて、advance()が勝つかinsert()が勝つか
実測するしかない
0586デフォルトの名無しさん2015/07/27(月) 07:24:58.31ID:oo3Jt8Wj
vector がお手軽に使えるようになったせいで,
vector の不利な点―削除前詰はコストが高い―を取り落とす人が出てきたようだ
0587デフォルトの名無しさん2015/07/27(月) 11:39:00.18ID:KH8d/GA1
何で測定する必要があるんだよ。
高々400KBのmemmoveの実行時間を調べてどうするんだよ。
今のPCのメモリ帯域は、理論値で21GB/sもあるのに、一体一秒に何千回改行する気だよwww
こんなものいちいち測定するなら、ありとあらゆる物を測定しなきゃならん。

大体、時たま発生する400KBのmemmoveがもたつく環境で、テキストエディが満足に動くはずが無い。
画面サイズを1024x768と小さめに見積もっても4MB、つまり400KBの10倍あるのに、
滑らかな描画が出来るわけが無い。まず問題視するならそっち。
そういう意味で破綻しているし、考える意味が無い問題と言える。

今のPCの能力では、テキストエディタの行を保持するのに、listを使ってもvectorを使っても
問題ない速度で動く。それはわかりきっているわけで、測定する意味が無い。
問題になるとしたら、描画関係。そっちを優先したデータ構造にすべし。
どちらを使ってもいいのなら、わざわざランダムアクセスが出来ないlistを選ぶ意味は無い。
面倒なだけ。何も考えずにvectorを使えばいい。
0588デフォルトの名無しさん2015/07/27(月) 11:47:35.16ID:KH8d/GA1
もう一度書いておくと、問題になりえるとしたら描画関係なわけで、
描画に都合の良いデータ構造を採用するべきなんだよ。
行の変更は頻繁に起こるわけではないし、
たかだか400KBのmemmoveなんぞ、描画の重さに比べれば、無いも同然なわけで。
そんなものを測定して早い遅い言っても何の意味も無い。描画を中心に考えるべし。
描画に適したデータ構造と言う意味では、ランダムアクセスの出来るvecotrの方が
使いやすいといえる。丁寧に書いてあげるのなら、listでも構わない、が、
し・か・し、わざわざランダムアクセスの出来ないlistを使う意味は無いので、vectorでよい。
listだと、ソートするだけでも鬱陶しい。
0589デフォルトの名無しさん2015/07/27(月) 12:15:48.73ID:KH8d/GA1
ついでに書いておくと、4K解像度だと、画面のビットマップサイズは30MB近くになる。
これだけの量をレスポンスを損なうことなくリアルタイムにレンダリングしなければならないのに、
たかだかたまに起こる400KBのmemmoveに拘っている暇は無い。
実際に、4K解像度で、何も考えずに、アンチエイリアス効かせて、DrawTextで全面描画すると、
カクカクになって、まるで使い物にならない。たぶん1FPS位になる。
実際、7のエクスプローラも、4K解像度で最大化すると、選択ツールがカクカクになる。
7のエクスプローラにとって4K解像度は想定外ということ。
更新のあった場所だけレンダリングするなり、DirectWrite使うなり、何らかの対策が必要。
お前らが過去に作ったツールも、4K解像度で滑らかに動くかどうか、一度確認してみたほうが良い。
特に遅いのが、アンチエイリアスの効いた文字の描画。FHD解像度では問題なくても、4Kだとカクカクになる。
これからのプログラムは4Kに対応しなくちゃね。
0590デフォルトの名無しさん2015/07/27(月) 13:31:05.37ID:KH8d/GA1
あと、挿入や入れ替えの事ばかり気にしているようだけど、
実際には削除の方が問題になる。
memmoveは単純なアルゴリズムだしSSE化されているので高速だけど、
freeやdeleteは空き領域を結合したりと、複雑なアルゴリズムでとても遅いから。
加えてデストラクタも走るし。
しかも、vectorを使った場合でもlistを使った場合でも、
本体とバッファで、一行に付き2回のdeleteが走る。
経験則だけど、10万行を一気に削除すると、多分1秒ぐらい固まる。もっとかかるかも。
スレッド立ち上げておいて、バックグラウンドで遅延deleteすると良いかも。
こういう問題を放っておいて、挿入時間がどうとか、馬鹿げてるね。
根本的に目の付け所がおかしいんだよ。
それでも描画の方がもっと問題だが。
0591デフォルトの名無しさん2015/07/27(月) 13:33:17.24ID:L+84gj0A
http://ideone.com/JIBJGe

ほれ
Nを適当にいじって手持ちの環境で走らせてみ
listはある範囲の終点のイテレータを取得するのにも順繰りにたどるしかないんで
いくらinsertが速いと言ってもvectorの約3倍ほど時間が掛かるようだ
0592デフォルトの名無しさん2015/07/27(月) 19:42:02.36ID:8jkVFbGd
コンテナの無駄を語る前に、自分の文章の無駄を省くことを勧める

新機軸の考察を交えた、高尚な意見を語るのならともかく
0593デフォルトの名無しさん2015/07/27(月) 20:59:48.12ID:9agqNJ/2
クドくてわかりにくい、冗長なコードを書きそうだよなw
0594デフォルトの名無しさん2015/07/27(月) 21:59:34.50ID:kF5kcc0V
三行で読むのをやめた
0595デフォルトの名無しさん2015/07/27(月) 22:24:31.49ID:b0q7AFFp
いくら口が達者でも肝心のプログラムが一つも書けないんじゃム板では相手にされないよ
それに口が達者というより井の中の蛙って感じだね
仕事してないっしょ?
0596デフォルトの名無しさん2015/07/27(月) 22:30:32.68ID:DuLbgldQ
こんな文章書く奴が口達者でたまるかwww
0597デフォルトの名無しさん2015/07/27(月) 22:38:24.99ID:KcMXEwaZ
>>591
俺の環境ではvectorのほうがちょっと速いくらいで3倍の差はつかなかった。
最適化してないからかもしれん。
最適化オプション付けたらなぜか完走しない。
原因はよくわからん。
0598デフォルトの名無しさん2015/07/27(月) 22:50:41.69ID:sgwB7yTG
listは確かにinsert()は速いけど、そのinsertする場所を求めるのに時間がかかり、また
複数の要素をinsertするとその度にポインタを辿って一個ずつしか挿入出来ないのな

普通リスト操作と言うとつながったリストの先頭と最後尾だけを指定すればポンと挿入
出来るはずなのにそうなってない
C++11で改良されたかと思ったけど駄目だった

でも>>591は改良の余地があるね
挿入もsplice()を使うべき
0599デフォルトの名無しさん2015/07/27(月) 23:05:02.49ID:Mi01ZGiW
文章盛ってるだけで言ってる事は同じとかそれこそ無駄
0600デフォルトの名無しさん2015/07/27(月) 23:18:01.27ID:KcMXEwaZ
リストとツリーの遅さはガチ
0601デフォルトの名無しさん2015/07/27(月) 23:40:10.31ID:eqeml5nf
deque()でいいじゃん。
0602デフォルトの名無しさん2015/07/27(月) 23:48:22.48ID:pp6uoCzE
VS2015のパフォーマンスエクスプローラーで分析してみた
予想どおりstd::nextだけで全体の73%もの時間を消費してる
これじゃあベンチマークの意味ないよ
ランダムに挿入するのが裏目に出てる
0603デフォルトの名無しさん2015/07/27(月) 23:50:30.57ID:pp6uoCzE
ちなみにstd::vectorのstd::erase()とstd::insert()を足しても全体の25%にしかならない
もう少しベンチマークプログラムのアルゴリズムを考えるべきだろこれ
0604デフォルトの名無しさん2015/07/28(火) 00:08:57.30ID:WNbWyPpf
しかしstd::nextに73%かかるのがひょっとしたら実アプリに近いのかもしれない。
わからんけど。
0605デフォルトの名無しさん2015/07/28(火) 08:24:07.21ID:tsfiL0l/
insertする場所は「今キャレットがある位置」で明確だから
テキストエディタでは探索コストは問題にならないのでは?
0606デフォルトの名無しさん2015/07/28(火) 11:50:55.62ID:dCM9/1ij
スクロール先頭のイテレータも保存して、
キャレット位置のイテレータも保存して、
マウスカーソル直下のイテレータも保存して、
と、どんどん保存するイテレータが増えていくわけですね。
面倒になってきて、そのうちイテレータキャッシュを作り始めると・・・
で、そこまでするメリットは?
0607デフォルトの名無しさん2015/07/28(火) 12:35:30.16ID:tsfiL0l/
回答を聞く気がないなら最初から質問なんかしなさんな
0608デフォルトの名無しさん2015/07/28(火) 12:42:23.90ID:tsfiL0l/
ああ、質問口調なのは自分も同じだった。今のは撤回するね、ごめん。
0609デフォルトの名無しさん2015/08/06(木) 08:00:13.21ID:f8gvnJE6
VisualStudio2015のC++11対応状況を知りたいがなかなか情報にヒットしない。

誰か知ってたら教えていただきたきそうろう
0610デフォルトの名無しさん2015/08/06(木) 08:38:20.05ID:BM+A+5/Q
つ[msdn]
0611デフォルトの名無しさん2015/08/19(水) 23:31:20.42ID:8uw32tI0
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
0612デフォルトの名無しさん2015/08/19(水) 23:37:00.42ID:KWfiCcWC
マロックに気をとられて内容が読み取れなかったw
0613デフォルトの名無しさん2015/08/19(水) 23:43:19.12ID:8uw32tI0
>>612
ああ、ごめんなさい。
文字列を別の箱にコピーしたら元の文字列を破壊しなくて済むよね、
という発想で、別の箱にコピーする方法を探してました。
すると�@のページが出てきてなれないマロックとかいうものが出てきて困惑したという感じです。
マロックがよくわからないので、�@のfreeなどが適切なのかわからず。。。
0614デフォルトの名無しさん2015/08/19(水) 23:46:23.94ID:8uw32tI0
>>612

そして�@の最後でcopy=NULLとしてるのもなんでだろう、、とおもっており。
freeだけだとまずいんですかね。
0615デフォルトの名無しさん2015/08/19(水) 23:52:19.21ID:KWfiCcWC
いや、マロックじゃなくてmallocと正確に書きましょう。
英単語を日本語で発音したものを日本語文字で書き起こしたものなんてさ
0616デフォルトの名無しさん2015/08/19(水) 23:58:08.57ID:KWfiCcWC
で、mallocでググってみると、メモリの動的割り当てだの説明ページが出てくると思うんだが。

普通に配列を宣言する場合って、ソースコードを書く時点でサイズが決まってしまうけど、
そうじゃなくて任意の長さの文字列に対して配列を確保したい場合はmallocを使うもの
と考えておけばいい。
0617デフォルトの名無しさん2015/08/20(木) 00:29:51.57ID:hK7dURUd
>>616
ああ、それはわかります。動的に確保したいからって意味だと思います。
よくわからないのがfree関係のところです。
0618デフォルトの名無しさん2015/08/20(木) 00:58:54.12ID:iXzlVX06
ああ済まない全然読んでなかったw

copy自体は確保されたメモリの先頭アドレスが格納されている。

特にそのアドレス値自体は変更してないので、freeで問題無く開放される。
変更されているのは、copyのアドレスが指し示すメモリに格納されている値。

あと、NULLを入れるのは、そうしておくとこれは確保されたメモリなのか、
開放したけどそのまま放置されているものなのか分かるようにする方法。
freeした後でcopyを再び再利用するとかでさ。
0619デフォルトの名無しさん2015/08/20(木) 01:18:46.57ID:hK7dURUd
>>618
なるほど。freeはアドレス値に対して解放するものなので、
格納されてる値が変わったとしても関係ないわけですね。

NULLを入れるのは目印的なもの?って感じなんですね。
0620デフォルトの名無しさん2015/08/20(木) 06:50:00.21ID:iXzlVX06
はい
0621デフォルトの名無しさん2015/08/20(木) 09:23:26.67ID:7wC+DvH0
その目的なら、strchr()が無難だと思う。
0622デフォルトの名無しさん2015/08/20(木) 09:39:44.94ID:83vcvbQR
その目的なら_tsplitpath_s()かな?
0623デフォルトの名無しさん2015/08/20(木) 11:57:47.23ID:mELjCRuD
>>621
少し調べてみます。

後、ちょっと気になったんですが、上記の様なケースでmallocは絶対つかわないといけないもんなんですかね。
逆にmallocにかんする部分をコメントアウトしたりして使わない場合はどうなるんでしょう。エラー?
0624デフォルトの名無しさん2015/08/20(木) 12:10:26.88ID:XXXu8/KU
つまり >>617 は全くのウソ
0625デフォルトの名無しさん2015/08/20(木) 12:26:07.32ID:mELjCRuD
自己解決しましたが新たななぞが。。
mallocがないといわゆるセグメンテーション違反になるんですね。よく意味はわかってませんが。

そして、apacheモジュール開発のためにrequest_rec構造体のuriというのを上記の方法を用いて分割しようとしています。r->uriで参照してます。
しかし、リクエストを受け付けておそらくmalloc時にセグメンテーション違反のエラー文言が、、

*copy=(char *)malloc(strlen(r->uri)+1);
上記が悪いまでは推測できてるのですが、
これの何が悪いのかがわかりません、、
ちなみに推測したのはこれを加えた時点で、リクエスト受けた時にエラーログにセグメンテーションフォウルトと出るからです。
よくわからないのは、uriの長さ取れてて、その+1ならちゃんと領域確保されてそうなのに、だめなんだ、、ってので混乱してます。
うーん。
0626デフォルトの名無しさん2015/08/20(木) 12:36:47.32ID:mELjCRuD
自己解決しましたが新たななぞが。。
mallocがないといわゆるセグメンテーション違反になるんですね。よく意味はわかってませんが。

そして、apacheモジュール開発のためにrequest_rec構造体のuriというのを上記の方法を用いて分割しようとしています。r->uriで参照してます。
しかし、リクエストを受け付けておそらくmalloc時にセグメンテーション違反のエラー文言が、、

*copy=(char *)malloc(strlen(r->uri)+1);
上記が悪いまでは推測できてるのですが、
これの何が悪いのかがわかりません、、
ちなみに推測したのはこれを加えた時点で、リクエスト受けた時にエラーログにセグメンテーションフォウルトと出るからです。
よくわからないのは、uriの長さ取れてて、その+1ならちゃんと領域確保されてそうなのに、だめなんだ、、ってので混乱してます。
うーん。
0627デフォルトの名無しさん2015/08/20(木) 12:38:03.31ID:mELjCRuD
とおもったら、
*copyとしてたのをcopyにしたらなおりました、、
書き方間違えてたっぽいですが、なんか理由は不明のままに。
0628デフォルトの名無しさん2015/08/20(木) 12:42:22.66ID:q4vIrycP
こんな人が開発したapacheのモジュールとか怖いな
ぜひ公開しないで欲しい
まぁ演習かなんかだろうが
0629デフォルトの名無しさん2015/08/20(木) 12:57:42.09ID:C0zkB6yz
初歩の初歩が分かってないから、コーディングしても無駄
一旦筆を止めて入門書のポインターあたりから勉強しなおすべき
0630デフォルトの名無しさん2015/08/20(木) 15:50:17.76ID:LQ4KOo8K
怖えー
ポインタすらわかってない奴がC開発なんてすんなよ
0631デフォルトの名無しさん2015/08/20(木) 16:55:54.98ID:dJVl2eol
まぁ確かにstrtokの仕様は、直感的に分かりにくいしちょっと気持ち悪いよな
余談だけど、Cの標準関数で与えたパラメータの中身を関数コールで勝手に破壊するものって他にあったっけ?
0632デフォルトの名無しさん2015/08/20(木) 21:30:07.36ID:Amgj5mKY
C言語の記述する対象となるコンピュータの構造はシンプルだ。実際にはメモリページとかプロセス分岐とかあるかもしれないが、C言語では意識しなくてもいい
それほど多くないレジスタとメモリ、環境による出力の手続きさえ覚えればこんなにラクな言語はないと思うが
逆にVMとかフレームワークに支配される言語の方が難しい。
そういえば昔、アセンブラは出来るがBASICは出来ないという技術者がいたな。
0633デフォルトの名無しさん2015/08/20(木) 21:46:06.11ID:d5r4dVNc
>>631
ニュアンスは違うけど、time()も引き数がNULLじゃなければ書き換えるね。
strncpy()やstrncat()の振る舞いも分かり難いし。
0634デフォルトの名無しさん2015/08/20(木) 21:48:41.17ID:d5r4dVNc
そうそう、printf()系も出力だけだと思い込んでいると%nでポイント先を書き換えますな。
0635デフォルトの名無しさん2015/08/20(木) 21:54:30.48ID:q4vIrycP
そもそも、strtokはマルチスレッド環境で・・・だったから
いまどきは大丈夫なんだけど、誰も使わないんだ
0636デフォルトの名無しさん2015/08/20(木) 23:29:24.59ID:dJVl2eol
>>633
うん、それはまぁそうなんだけど‥
timeは「ここへ書き込んでね」のポインタ、strtokは「これを調べて頂戴」の元データなんだよね

元データは書き換えるし、関数内部で"状態"を保持してて、関数コールの度にそれが遷移する挙動が呼び出し側から見えないし→strtok (>_<)
素直に「元データ」「デリミタ」「トークンの位置」「トークンのコピー先ポインタ」を引数で渡して
取り出したトークンをコピー先に書き込んでくれた方が分かりやすい希ガス
で、関数戻り値はコピーできた文字数で、コピーできないエラーがあったら-1とか‥ たとえばね
0637デフォルトの名無しさん2015/08/21(金) 00:45:01.87ID:pYz5qGfR
それなんてsscanf()w
0638デフォルトの名無しさん2015/08/21(金) 07:02:32.53ID:ALerSfbe
asctimeとか
マルチスレッドでの利用禁止になってるやつとか
0639デフォルトの名無しさん2015/08/22(土) 14:49:35.32ID:mr0xWKbe
ターミナル系のソフトを書いていて、createprocessでcmd.exeを起動してそのあとそのプロセスの標準入力に文字を送り込む方法がわからん
誰か助けてくれ
0640デフォルトの名無しさん2015/08/22(土) 16:05:22.03ID:TdiPFjxM
自プロセスの出力ハンドルを起動したプロセスの標準入力を繋いで……
popen()のソースでも見たら?w
0641デフォルトの名無しさん2015/08/22(土) 16:28:29.39ID:nrIOmrw7
プロセス間通信じゃあダメなん?
0642デフォルトの名無しさん2015/08/22(土) 16:57:57.04ID:kXIlr7qG
受信動作をcmdに埋め込めと?
0643デフォルトの名無しさん2015/08/26(水) 17:14:26.26ID:m14uiM4v
ttp://racanhack.osdn.jp/rhdoc/coderect.html
Cをjavaに書き直したいがCの勉強が先か。
0644デフォルトの名無しさん2015/08/26(水) 19:17:39.07ID:YgutvNxC
あるコードをVisualStudio6.0からVisualStudio2003に変更してソフトは起動するのですが、
GetCurrentDirectory関数の動きがおかしいです。
下の処理を通る時、よくソフトが落ちます。
6.0で生成したexeではおきない現象です。

GetCurrentDirectoryを使わずに。定数の文字列をつかったら落ちませんが、
できれば、GetCurrentDirectoryかそれに近い関数を使いたいです。
原因と対策がわかる方教えて下さい。

ーーーーーー//グローバル
    char szAppPath[] ;
// アプリケーション起動パス確保
GetCurrentDirectory( MAX_PATH, szAppPath ) ;//<ここは問題ない

ーーーーーー//ここの関数でカレントに全角があるとよく落ちる
      //デフォルトカレントだとたまーに落ちる
      //半角のみの任意のファルダもたまに落ちる

CString strModuleDir = szAppPath;

GetCurrentDirectory( MAX_PATH, strModuleDir.GetBuffer( 0 ) ) ;
0645片山博文MZ ◆T6xkBnTXz7B0 2015/08/26(水) 19:19:25.37ID:FI4yoOkF
char szAppPath[] ; をchar szAppPath[MAX_PATH] ; にする
0646デフォルトの名無しさん2015/08/27(木) 01:23:41.97ID:B/17Cww9
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) という書き方自体は正しいんでしょうか?
0647デフォルトの名無しさん2015/08/27(木) 01:47:35.95ID:Hj8yQhv+
>>644
GetCurrentDirectory( MAX_PATH, strModuleDir.GetBuffer( MAX_PATH ) ) ;
にしないとまずいんじゃない?領域が確保されないでしょ
0648デフォルトの名無しさん2015/09/06(日) 08:18:00.15ID:o5btW5BW
>>646
同じ人のページに情報があった。
decltype(auto) はC++14で追加された(or 追加される予定の)機能みたいね。

ttp://cpplover.blogspot.jp/2013/08/decltypeauto.html
0649デフォルトの名無しさん2015/09/09(水) 06:58:06.36ID:MfaLsueu
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で簡単なスクリプトをかくぐらいです、よろしくお願いします。
0650デフォルトの名無しさん2015/09/09(水) 10:01:58.42ID:/MxCO9yi
遅いのはechoしてるからだろ
ファイルか/dev/nullにリダイレクトしたらどのくらいで終わる?
0651デフォルトの名無しさん2015/09/09(水) 10:10:34.57ID:/MxCO9yi
あと C/C++ のスレで聞いてるんだからC++使いたいんだと思うけど
スクリプトでもいい気がする、、まあHelloWorldからやってみては
0652デフォルトの名無しさん2015/09/09(水) 10:27:59.50ID:c9DyEDAo
>>649
そもそもやりたいことと合ってるの?

先頭のforは時間とメモリを食うから、
for((i=1 ; i < 2000000 ; i++))
とかでないと始まるまで時間かかるし、そもそも乱数が条件に
一致したときしか次のループに進まないから、早さは乱数次第だし
0653デフォルトの名無しさん2015/09/09(水) 10:39:29.79ID:UbDBGCr0
>>649
パチンコの抽選なんて人為的なもんだろ
純粋な乱数の訳がない
0654デフォルトの名無しさん2015/09/09(水) 12:15:52.21ID:AK7tGDzj
RNDが偏ってて終了条件になかなか合わないんだけじゃないの?
06556492015/09/09(水) 19:03:24.05ID:MfaLsueu
>>650
>>652
forの書き換えと、echo 先を変えたらかなり速くなりました。
進みにムラがあるのですが(条件に一致するまで時間がかかるとかだと思います)
3倍にはなった感じです。

まずは御礼申し上げます。

>>653
これだけでパチンコってわかるってすごいですね。

>>651
>>654
質問しなおさせていただきます。
0656デフォルトの名無しさん2015/09/09(水) 19:04:25.80ID:M9IJrk25
自分でぱちんこって書いてるじゃん
06576492015/09/09(水) 19:17:35.51ID:MfaLsueu
パチンコのシミュレーションをするために、
プログラムを勉強しようと思います。
プログラミング言語は、CかC++を使用しようと思います。

 �@パチンコの抽選をシミュレーションするのに、bashで簡単に書いて見たのですが、
   実行速度が遅い(できれば、当たり10万回引いて数分〜1時間とかそういうのにしたい)。

   >当たり10万回引いて数分〜1時間程度とかそういうのにしたい
   というのは、識者の皆さまから見ても難しいというレベルでしょうか。

 �Aスクリプト(bash)と、Cで似たようなコードを書いて、コンパイルしたものって
   超がつくほど明らかな、実行速度の違いってありますでしょうか。
   それとも「実行を早くする工夫を重ねないと、たいして速度はかわらない」もんでしょうか。
   勝手なイメージですが、スクリプトとコンパイルが必要なものを比べると、
   コンパイルしたものの方が、実行速度がすごく早いってイメージがあります。

 �B今手元に、「やさしいC」と「ねこでもわかるC」という本が2冊ありますが、
   お勧めの「ド素人はこれから読め」みたいな名著ってありますでしょうか。
   ちなみに古本屋の100円コーナーにあったので、買っただけで1ページも読んでません。


>>656
うわーお恥ずかしいです・・・。申し訳ありません。
0658デフォルトの名無しさん2015/09/09(水) 19:27:05.49ID:7ZaI5L5+
とりあえず実装するだけなら
やりたい事を1つ1つネットで調べるだけでおk
0659デフォルトの名無しさん2015/09/09(水) 19:29:16.87ID:+quVusLF
そもそもパチンコの抽選シミュレーションがわからん。どんな動きをするのか。
0660デフォルトの名無しさん2015/09/09(水) 20:13:46.40ID:4DuqUcJJ
アルゴリズムに関わる質問じゃないんだから、そこはノータッチでいいだろ
0661デフォルトの名無しさん2015/09/09(水) 20:18:16.39ID:/MxCO9yi
シェルスクリプトじゃなくてPythonとかRubyとかさ
まあそこにgccも入ってるだろうからいきなり試せるよ
条件がわからんけどほぼそのまま移行できる、置き換えいるけど
0662デフォルトの名無しさん2015/09/09(水) 20:28:15.38ID:luIXYWNp
>>657
>買っただけで1ページも読んでません。
聞く前にまず読め
んで試せ
どうせ言われて買ってもよまねぇだろw
0663デフォルトの名無しさん2015/09/09(水) 20:42:45.10ID:UbDBGCr0
>>657
パチンコ何てやめとけ。
ギャンブルは競馬の三連単がオススメ。
0664デフォルトの名無しさん2015/09/09(水) 21:25:07.11ID:V9adpqxF
パチンコは攻略法を発見して乗り込むと出入り禁止になるんだろ?
0665デフォルトの名無しさん2015/09/09(水) 21:39:20.31ID:cP17XdT8
>>657
シェルスクリプトでは、10万行のループ処理にかかる時間は、
whileでは5秒、forでは9分かかる

それらを、awkとperlに書き直せば、0.1秒。
たぶん、Python, Rubyでも同じくらいだろう

特にbashは、dashよりもずっと遅い。
シェルスクリプトでは一々、
コマンド(プロセス)を起動するから遅い。
しかも外部コマンドは、組み込みコマンドよりも、さらに遅い

一般的に速い順番は、
C/C++, Java > スクリプト言語 > シェルスクリプト

Python, Ruby が比較的、簡単なのでおすすめ。
C/C++にはポインタという地獄があるので、
君の学力では無理
0666デフォルトの名無しさん2015/09/09(水) 21:46:28.99ID:+quVusLF
なんの目的でするのかとおもった。実機の再現ができるわけないし。
もしゲームづくりに使うなら再現性よりもインチキ麻雀みたいのでもいい。
設定資料が手に入ってて、プログラムするだけなのか?
0667デフォルトの名無しさん2015/09/09(水) 21:52:57.11ID:cP17XdT8
まあ、プログラミングコンテストでも、

C/C++, Java で、1秒間に、
100万回の計算量なら楽勝で、
500万回までで見積もる
0668デフォルトの名無しさん2015/09/09(水) 23:37:42.99ID:iPfr8Kps
シェルでいいならシェルで
間に合わないならPerl系
でもだめなら C/C++
が通常のUnix/Linux屋の流れです。

まぁデイリなバッチならシェルで十分かと。
0669デフォルトの名無しさん2015/09/10(木) 09:30:34.07ID:0F4QMyo/
>>664
カジノもな
0670デフォルトの名無しさん2015/09/12(土) 21:09:12.76ID:LSgZsaGc
「猫でもわかる」はおすすめできない。
サンプルコードにまともなエラーチェックが無いからだ。
たとえばこんなサンプルコードがある。

while (p != 999) {
printf("点数(999で終了)---");
scanf("%d", &p);
if (p != 999) {
sum = sum + p;
n++;
}
}

このサンプルコードの scanf に間違えて英字を入力したら何が起きるだろうか。
scanf の値をチェックするということを教えてもらっていない読者はどうすればいいだろうか。
ちなみにサンプルコードだけでなく練習問題の解答もこんな調子だ。
0671デフォルトの名無しさん2015/09/12(土) 22:07:15.72ID:2fh0eLdu
教えてもらっていない読者は「自分で調べる」ということをすればいいんじゃないか?
0672デフォルトの名無しさん2015/09/12(土) 22:26:19.03ID:shptMOS6
というか《何を》説明するために掲載されたサンプルコードなんだ?
その説明コンテクストの中でscanfの例外処理云々は本質的に説明に関係するのか?
0673デフォルトの名無しさん2015/09/12(土) 23:17:57.19ID:0C2xMlx4
scanfはバッファから読み出してエラーだったらバッファに残す よって・・・
0674デフォルトの名無しさん2015/09/12(土) 23:32:28.62ID:Y0QkDcDu
>>670
エラーチェックが一々書いてあったら、
何の処理を説明しているのか、
わからなくなるので読むのが面倒

普通はソースコードの7割は、エラーチェックなので、
それを書くと、本のほとんどがエラーチェックで埋まり、
その本を買う価値がなくなる
0675デフォルトの名無しさん2015/09/12(土) 23:57:17.62ID:JUZlHW5G
大体そんな本は エラー処理は考慮してないって書いてるもんね。
0676デフォルトの名無しさん2015/09/13(日) 00:01:49.26ID:9Xvo2tPa
昔、ある本で、scanfを使うな。getsを使えと書いてあったね。
getsで入力を受け取ってそれをatofとかatoiで変換するほうが、安全だと書いてあった。
たしかにそうだと思ったという記憶がある。
いまでは、C++のcinとかcoutを使っている。
0677デフォルトの名無しさん2015/09/13(日) 00:49:11.00ID:12WRp03/
getsはバッファオーバーフローの危険がある
fgetsを使う
0678デフォルトの名無しさん2015/09/13(日) 01:02:58.51ID:M0wiS1Aa
二次元ベクトル場の演算結果を表示したいのですがどのような方法を使えば出来ますか?
言語はC++とC#くらいしか書けません
0679デフォルトの名無しさん2015/09/13(日) 01:38:19.05ID:q3JnkdTU
よくしらんけど、Gnuplotとかは?
0680デフォルトの名無しさん2015/09/13(日) 01:43:29.35ID:M0wiS1Aa
描画速度が速い方が良いです
0681デフォルトの名無しさん2015/09/13(日) 01:48:19.73ID:HfSTz78x
教科書に従って一つ一つ計算していくしかないが?
0682デフォルトの名無しさん2015/09/13(日) 01:59:04.97ID:q3JnkdTU
リアルタイムに描画したいんなら、
WindowsならDirect2DかGDI+かかな
0683デフォルトの名無しさん2015/09/13(日) 09:55:27.28ID:iqWIwAuh
>>676
もし670が、while文の使用例を読者に分かってもらうために掲げられたサンプルなら、
「scanfは危険だから―」なんて本題からはずれた話題を一緒くたに提供すると主題がぼやけるだろ。
while文の動作を理解することとscanfがエラーに脆弱であることとは何の関係もない。
そんな話は別の章(例外処理とかエラー対策とか)で解説するべきなんだよ。
そもそも "C言語やプログラミングそのものがまったく初めてという方を対象にした入門書" にどこまで求めているんだよ?って話。
0684デフォルトの名無しさん2015/09/13(日) 10:23:29.26ID:iqWIwAuh
すまん、アンカーミスと本文ミス
--
誤: >>676
正: >>670

誤: while文の動作を理解することとscanfがエラーに脆弱であることとは何の関係もない。
正: while文の動作を理解することとscanfがエラーに脆弱であると理解することとは何の関係もない。
0685デフォルトの名無しさん2015/09/13(日) 13:07:17.47ID:llmGp1Am
まぁ突っ込むとしたら
今は別のやり方で置き換えられてる
っていう但し書きがほしい部分があるくらいかな
0686デフォルトの名無しさん2015/09/13(日) 17:28:05.59ID:/NF5k7PN
>>676
できれば書名か著者を知りたい
昔から入門書は入門者が書いてるような変なのが多いし
0687デフォルトの名無しさん2015/09/13(日) 17:58:30.83ID:12WRp03/
それは入門書が入門者のために書かれているからだろ
お前のような玄人からすれば変なものに見えても
入門者からすればそんなことを理解するだけでいっぱいいっぱいなんだ
0688デフォルトの名無しさん2015/09/13(日) 20:42:36.34ID:9Xvo2tPa
>>686
探してみたらかなり古い本(1989年発行)でした。
小川優介・西田雅昭著『プログラミングお作法』(技術評論社)
です。
この中に
「函数scanf()は、キャリッジリターン・コードの取扱方が言語仕様として定義されていないため、
処理系によっては副作用が発生します。そのため、処理系によっては予期せぬ振舞いをする場合があります。
このような副作用を考慮する必要のない標準文字列入力函数にgets()があります。函数gets()は標準入力
すなわちキーボードから1行(キャリッジリターンまで)を文字列として読み込み、このとき改行コードをヌル
コードに置き換えます。」
と書いてありました。
いまでは、Cも標準化が進んでいるようで、処理系による違いとかは無いかもしれませんが、
scanf()の書式仕様を指定する場合に間違えやすいこともあって、この本を読んでいら、gets()を
使っています。
しかしどなたがが指摘されていたように、fgets()を使うのがよりよいかもしれません。
0689デフォルトの名無しさん2015/09/14(月) 09:10:41.03ID:T1dWA9Ek
>>688
fgets()がよりよいのではなくて、
gets()がダメなの。
新しいcでは最早deplicatedだ。
0690デフォルトの名無しさん2015/09/14(月) 09:52:28.85ID:MZSqhosU
deprecated?
0691デフォルトの名無しさん2015/09/14(月) 12:58:07.90ID:12ng6EG6
>>688
予期せぬ振る舞いってなんだろう。
よく言われるscanfが初心者向けでない理由は改行が空白と扱われることだけど、K&R(翻訳)のscanfの節でも、
「復改も空白文字であるから、これは、scanfで複数行に渡る読み込みも可能だということを意味している。」
とあるから処理系依存ではないだろうし
0692 ◆QZaw55cn4c 2015/09/14(月) 21:34:52.10ID:aQticbJR
scanf() なんてきれいさっぱり忘れて
fgets() + sscanf() とか適当なトークン解析とかに徹したほうが幸せだよ…
0693デフォルトの名無しさん2015/09/15(火) 15:48:43.84ID:RjhaFYE3
VC++で自作でMFCでアプリを作りました。ファイルをたくさん処理してそれぞれを吐き出すものですが
たくさんやると、タスクマネージャーやリソースモニタで見ていると、
利用可能メモリ(=スタンバイメモリ+空きメモリ)が減っていくのです
もともとアプリを走らせた起動後は空きメモリが2GB以上あったのが、500MBくらいまで減っていきメモリ不足のメッセージが出ます
メモリリークを入れてしまっているのかと思ってVC++デバッガで確認したのですが
アプリを終了させてもそれらしいリークは見つかりません。VC++のことはさておき、
タスクマネージャーのメモリなのですが、
メモリのワーキングセット、メモリのプライベートワーキングセット、コミットサイズ
ページプール非ページプールをみていてもファイル処理をいくらしても全く増えて行きません
唯一増えていくのは、ページフォルトですが、でもこれはFirefoxとかは2ケタも大きな値になっていて
関係ないと思います。
にもかかわらず、空きメモリはどんどん減っていくのです
どうなっているのでしょうか
タスクマネージャーの空きメモリとこれらワーキングセット等の関係を教えてください
0694デフォルトの名無しさん2015/09/15(火) 16:04:20.23ID:XyyEatel
空きメモリは気にしなくていいけど、デバッグでリーク出ないのは
ずっと確保しっぱなしで終了処理の時に初めて開放するのかもよ?
0695デフォルトの名無しさん2015/09/15(火) 16:15:12.97ID:DGAx56Up
アプリを終了しちゃったらメモリ解放されて
リークしてるかどうかわからないだろ
0696デフォルトの名無しさん2015/09/15(火) 18:19:40.31ID:Or0Sr6DS
先人のお言葉:
最初っからreleaseで作れ。
0697デフォルトの名無しさん2015/09/16(水) 09:10:34.81ID:nf18HxN0
>>693
端的に言うと、空きメモリはシステム全体、ワーキングセットは特定プロセス
アプリを終了させたらアプリのリソースリークは解消するのでデバグ方法がおかしい
0698デフォルトの名無しさん2015/09/16(水) 10:06:19.24ID:knfsespo
リークをVCが見つけてくれるという思い込みは誤り
タスクマネージャに反映されるタイミングが大幅にズレている可能性がある
ツールに頼る以前の問題

Javaとかスクリプトで悪い癖がついちゃったかね
自分でアロケートしたメモリを開放してないとか
オブジェクトをnewして返す関数なんかを呼んで後始末してないとか
そんな根本的な話じゃろ
0699デフォルトの名無しさん2015/09/16(水) 10:26:27.52ID:+5AYCL9d
>>693
とりあえず_CrtSetDbgFlag
0700デフォルトの名無しさん2015/09/16(水) 10:41:46.16ID:7sbTeZHX
まあ開放しないで終了させるとデバッグログにズラズラと出るんだけど
ずっと保持してて終了前には開放してるから出てないのかと
0701デフォルトの名無しさん2015/09/16(水) 13:34:19.60ID:knfsespo
なんか違う気がしてきた
グローバルなゴッドオブジェクトに全部ぶら下げてるというオチか
0702デフォルトの名無しさん2015/09/16(水) 15:33:41.78ID:a5qJ/F/3
タスクマネージャに表示される自アプリのメモリ使用量を増やすことなく
こっそりとメモリを使う方法が有る
この方法を使うとタスクマネージャで確認できるPC全体のメモリ使用量は増えるが
アプリ単体のメモリ使用量は増えない
0703デフォルトの名無しさん2015/09/19(土) 22:00:51.68ID:ppmJVZuM
エンディアンについて疑問というか不安なのですが
エンディアンはソフトを使う側のCPUに依存するのでしょうか?
もしそうだとすると、ソフトの設定をファイルに保存する時にパラメータをまとめた構造体を fwite() で保存して、
そのファイルを他のPCに移動させると、エンディアンが違っていたら誤った値がロードされるのでしょうか?

対策としては2バイト以上の値をすべて1バイトに分解して自分で順番を決めてファイルに書き込むしかないのでしょうか?
readmeに「マシンを超えて設定ファイルを移動させるな」と書くのは最終手段でなるべく避けたいです
0704デフォルトの名無しさん2015/09/19(土) 22:06:48.11ID:ISETQD0O
>>703
心配しなくてもえんでぃやん?
0705デフォルトの名無しさん2015/09/19(土) 22:15:19.62ID:MCsx1TIA
ソフトの設定ぐらいだったらテキストにすればいい
xmlとかwindowsのiniファイルとか正にそうだよな?
0706デフォルトの名無しさん2015/09/19(土) 23:10:36.91ID:4Q4PjKSm
心配ならhtonlしとけ
0707デフォルトの名無しさん2015/09/19(土) 23:19:03.51ID:ISETQD0O
>>706
何やそれ?
0708デフォルトの名無しさん2015/09/20(日) 00:35:30.67ID:Insv9mJ4
>>703
そういう設定ファイル使う場合、その設計時点でどっちのエンディアンを使うか
決めるでしょ普通。それに合わせて実装すれば問題は出ない
0709デフォルトの名無しさん2015/09/20(日) 02:14:38.18ID:SoWNA795
>>703
基本的にはエンディアンが違うCPUで同じソフトは動かないから
移植することになったら読み書きを修正すればいいだけで
とりあえずは気にしなくていいよ
0710デフォルトの名無しさん2015/09/20(日) 02:39:52.78ID:Oy+vde1J
WIN32_FIND_DATA を用いてファイルを列挙し、ifstream から読みこもうとしています
その際にread 関数へ渡すファイルサイズ情報として、nFileSizeHigh,nFileSizeLow を得ました

nFileSizeLow はそのまま一回で扱えるので問題無いのですが、
nFileSizeHigh の値を利用する場合、手動でサイズ計算して複数回に分けて読み込むしかありませんか?
0711デフォルトの名無しさん2015/09/20(日) 06:13:05.69ID:SoWNA795
そんな大きなサイズを一気に読み込むの?
0712デフォルトの名無しさん2015/09/20(日) 23:03:50.54ID:DWK3Vubo
64bitアプリなら一気にいけるかもしれないが32bitアプリなら無理なので小分けするしかない
0713デフォルトの名無しさん2015/09/21(月) 22:46:34.73ID:yAF/qNFv
メモリマップドファイルとか?
0714デフォルトの名無しさん2015/09/21(月) 23:58:16.62ID:DTNjasVP
ありがとうございます、大人しく小分けにします

>>711
言われてみればご尤もなので、
適当なサイズを上限に小分けして読み込む処理で統一する事にします
0715デフォルトの名無しさん2015/09/24(木) 15:34:21.58ID:l6wjQdp1
>>707
socket.h とか winsock2.h とか
要は外に出るときはネットワークバイトオーダーに統一すると

最初から複数の環境に対応させるならこうだけど、
通常は最初に作ったやつに合わせる
フォーマットだけ提供するならバイトオーダーマークを入れる手も
0716デフォルトの名無しさん2015/09/25(金) 13:24:21.54ID:cJmaZWu4
>>678
二次元ベクトルなら、XY座標系なんだし
C++でもC#でも、オペレーター使えるから
XY座標系のベクトルを管理、処理する行列クラス作れば
良いんじゃない?
XY座標系だから、二行一列の行列処理だし
0717デフォルトの名無しさん2015/09/30(水) 14:17:26.63ID:r5ugZ70O
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はこのコンパイラでは使えないという事ですかね?
0718デフォルトの名無しさん2015/09/30(水) 14:37:40.72ID:lHbG4YHv
>>717
そのpiには、何が入ってるのが期待値なんだ?
0719デフォルトの名無しさん2015/09/30(水) 14:37:59.43ID:rddxCA32
>>717
それLP64かLLP64じゃないの?
ポインタは常に64bitでもLP64とLLP64ではintは32bitしかない
0720デフォルトの名無しさん2015/09/30(水) 15:05:10.92ID:r5ugZ70O
>>718-719
なるほど、bitの上限の問題でしたか。
longでcastしたらarray[0]のアドレスを取り出せました。
このままでは移植性が0ですね。
有難う御座いました。
0721デフォルトの名無しさん2015/10/07(水) 15:28:03.37ID:GRynzwR1
if (no % 2 )

この条件式の意味を教えて下さい
0722片山博文MZ ◆T6xkBnTXz7B0 2015/10/07(水) 15:32:19.55ID:Xf/Hcqsc
>>721
noを2で割ったときの余りが0でなければ
0723デフォルトの名無しさん2015/10/07(水) 16:08:48.59ID:jyxNZJK8
noの肩が何で%がオーバーライドされていない事が確認できないので
そのコードだけでは結論は下せない…
0724デフォルトの名無しさん2015/10/07(水) 16:35:31.65ID:CCbM2RdR
>>721
そんなコード書くな
0725デフォルトの名無しさん2015/10/07(水) 16:43:06.75ID:M6BIJhgd
意味がわからないってことは自分で書いたわけじゃないのに書くなと言われてもなあ
0726デフォルトの名無しさん2015/10/07(水) 17:13:43.05ID:Kru1mWVv
奇数かどうか見てるんじゃね
0727デフォルトの名無しさん2015/10/08(木) 20:12:40.58ID:VJW9Q5b7
>>722
ありがとうございます
理解できました
0728デフォルトの名無しさん2015/10/09(金) 19:12:37.26ID:EoDzitTg
struct gps {
float lat;
float lng;
};
vector<gps> gps1;
vector<gps> gps2;

gps1とgps2は大量の緯度経度情報を保存してあります。
このgps1,gps2の各緯度経度が一番近いものの情報を取得したいのですが
いい方法はないでしょうか?
0729片山博文MZ ◆T6xkBnTXz7B0 2015/10/09(金) 19:21:36.52ID:W40lUqcY
>>728
二点間の距離を定義せよ
0730片山博文MZ ◆T6xkBnTXz7B0 2015/10/09(金) 19:53:27.88ID:W40lUqcY
地球はほぼ球体であり、緯度経度情報から球面上の点の
位置座標が定まる。二点の位置座標と三平方の定理から
距離を求めることができる。距離が最小になる点が答えになる。
0731デフォルトの名無しさん2015/10/09(金) 20:16:27.11ID:yuaYKRBS
球面三角法の問題ですね。
球面状の距離は大圏コース上の長さで定義されます。
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に非常に近い値になり、その変化が緩やかだからです。
0732デフォルトの名無しさん2015/10/09(金) 20:35:01.57ID:3Zfy8nsh
GPSに特殊相対理論が使われてる事を説明出来れかい?
俺はなんとなく説明出来るぞ。へへん
0733デフォルトの名無しさん2015/10/09(金) 21:10:36.44ID:JqWJKO83
WG84だっけ?なんか楕円体が決まってたよな
0734デフォルトの名無しさん2015/10/09(金) 21:37:04.44ID:oggkbSfr
>>728
説明が分からん
0735デフォルトの名無しさん2015/10/09(金) 22:46:25.91ID:W7w78kvP
double使えよ
0736デフォルトの名無しさん2015/10/09(金) 23:22:02.20ID:nLFgz/u9
とりあえず、素朴な実装をコードで示してもらおうか。
最適化するのはその後だ。
0737デフォルトの名無しさん2015/10/10(土) 02:50:43.20ID:9JPBBcF9
煽ればサンプルコードが出て来ますよ
0738デフォルトの名無しさん2015/10/10(土) 15:40:47.88ID:Ver+0xRf
731です
緯度経度とかいてしまったのが間違いだったのかもしれません

gpsを持って同じ道を二回歩いてみて各gpsデータにおける一番近い点を取得したかった
だけなので厳密な計算方法を利用しようとは考えていませんし数mオーダーの計算は困難と
聞いております

なので一回目二回目ともに10歩歩いた時のGPSの情報、20歩歩いた時のGPSの情報、30歩、40歩、、、、
と取得していく中で何歩目が一番近いか知りたいと考えています
0739デフォルトの名無しさん2015/10/10(土) 19:15:39.34ID:aygA5MQe
doubleの0は真のゼロですか?
==0比較が失敗することがあるんですよね
2の倍数じゃない数が正しく表現されないのは知ってるんですが
でもゼロはゼロですよね?
その辺の仕様がわかる人いますか?
0740デフォルトの名無しさん2015/10/10(土) 19:56:19.64ID:kfeAURAL
>>739
表示上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(); は実行されると思いきや実行されない
0741デフォルトの名無しさん2015/10/10(土) 20:07:45.80ID:aygA5MQe
struct A{ double a;}
A aa ={0};
こんな感じので
aa.a==0が失敗することがあるんです
比較部分はどのみちなおしますが
ただDLL作成しての呼び出しなのでバグがあるなら切り分けしたいと質問した次第でして
0742デフォルトの名無しさん2015/10/10(土) 20:09:43.87ID:wZWPBuKi
0を表す場合は符号部、仮数部、指数部のすべてのビットを0とすると都合が良いことからそのようにされることが多い。
またその場合は+0.0で、浮動小数点では他に符号部が負をあらわし他が0の-0.0という0もあることがある。
たとえば正の数を負の無限大で割ったり、負の数を正の無限大で割ったりすると-0.0になる。

これはWikiの転載だけど、どうして自分でGoogleで検索しないの?
Google知らないの?Wiki知らないの?
0743デフォルトの名無しさん2015/10/10(土) 20:12:12.18ID:wZWPBuKi
どうしてデバッガを使わないの?
0744デフォルトの名無しさん2015/10/10(土) 20:20:22.61ID:vT1N9X7j
計算後の float, dobule で == が通らないのは常識だけど、誰もが一度は通る道でもあるだろ
0745デフォルトの名無しさん2015/10/10(土) 20:26:00.08ID:kfeAURAL
>>741
初期化直後に比較するのか?
0746デフォルトの名無しさん2015/10/10(土) 20:44:06.40ID:Bz6ayOgj
年寄りだと実数即値は0.0て書くんだろうか‥?
0747デフォルトの名無しさん2015/10/10(土) 21:00:20.87ID:aygA5MQe
>>731
DLLで初期化して呼び出しもとで比較。ライブラリがおかしな事してなければ途中計算いっさいなし
だから気になった
>>728
んなことわかってるってーの
俺より知識のある奴はいなそうなんでもういいです
0748デフォルトの名無しさん2015/10/10(土) 21:07:47.17ID:wZWPBuKi
ほら、まじめに相手して損したでしょう
0749デフォルトの名無しさん2015/10/10(土) 21:26:53.42ID:LXdnro1p
>>739
インド人に聞け
0750デフォルトの名無しさん2015/10/10(土) 21:36:36.79ID:vT1N9X7j
> ライブラリがおかしな事してなければ途中計算いっさいなし
それならバグの可能性の方が高いと思うが。
一応IEEEではビットフォーマットまでは規定していなかったはずだが、現実的にほぼ全てのマシンで同じだったはず。
それ以前に通常は同一マシン上だからビットフォーマットは当然同じ。
0751デフォルトの名無しさん2015/10/10(土) 21:39:39.21ID:kfeAURAL
呼び出し元とDLLとでアライメントが違ってるとか

>>746
0 との比較(初期化)だと整数型からの実数型へのキャストで正確な0ではなくなるってヤツだっけ?
0752デフォルトの名無しさん2015/10/10(土) 21:44:17.12ID:aygA5MQe
やっぱバグすかー哀しいなあ
どうもー
0753デフォルトの名無しさん2015/10/10(土) 22:02:45.81ID:wZWPBuKi
二回連続で平気でアンカを間違うような人だからね(>>747)
注意散漫、プログラムもバグってるんでしょう
0754デフォルトの名無しさん2015/10/10(土) 23:01:50.02ID:Bz6ayOgj
>>750
> 一応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

>>751
> 0 との比較(初期化)だと整数型からの実数型へのキャストで正確な0ではなくなるってヤツだっけ?
たしかK&Rの初版では、整数値でも実数として処理したいばあい、コンパイラへ指示するために
明示的に .0 を付けろとか‥ 除算結果のキャストに効いてくる、とかなんとか
そのクセが染みついてる人は.0を付けたがるのかな?とw
0755デフォルトの名無しさん2015/10/11(日) 01:27:33.90ID:IkPUsRem
それは交換形式ね。
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
0756デフォルトの名無しさん2015/10/11(日) 06:18:57.29ID:SxbzA5C5
ソースはウィキ
0757デフォルトの名無しさん2015/10/12(月) 09:31:45.35ID:Cb4Ih0Jl
>>739
doubleに限らず、0は偽
0以外が真
って答えるとアスペっぽいな。

そもそも浮動小数点数型は近似値しか扱えないので
やっぱ閾値を決めて近似判定するか
ざっくり整数型にキャストして比較しちゃえば?
0758デフォルトの名無しさん2015/10/12(月) 10:12:05.03ID:mWUWwMlc
0.1とかどうすんだ
0759デフォルトの名無しさん2015/10/12(月) 11:09:39.37ID:PwRq9lmF
一昨日のネタにレスしてるけど意味不明だな
しかも
>浮動小数点数型は近似値しか扱えない
とか断言しちゃってるし
0760デフォルトの名無しさん2015/10/12(月) 12:00:37.90ID:DSHcQooM
ただし、0.0には+0.0と-0.0が有るという
0761デフォルトの名無しさん2015/10/12(月) 13:04:46.12ID:C+jvtDQK
+0.0と-0.0は比較の時にどちらも0にマッチすると思ったけど。
0762デフォルトの名無しさん2015/10/12(月) 15:54:34.14ID:FoiyBQVb
for(int i = 0; i < 4; ++i){

このループはi=1,i=2,i=3
となるので、3回ループが実行されるということでよろしいのでしょうか?
0763片山博文MZ ◆T6xkBnTXz7B0 2015/10/12(月) 15:59:59.64ID:f2n17VdL
>>762
i == 0を含む四回。
0764デフォルトの名無しさん2015/10/12(月) 16:04:27.73ID:oCa7NkmO
forループカウンタを
i++
++i
は好き好きですか?
0765デフォルトの名無しさん2015/10/12(月) 16:06:08.48ID:mWUWwMlc
for文の3つ目(変化式)は本文が実行された後で呼ばれるし
インクリメントが前置でも後置でも結果は同じ
0766デフォルトの名無しさん2015/10/12(月) 16:11:48.51ID:VZXXCjAT
++iもi++も同じなんですか
ありがとうございました
0767デフォルトの名無しさん2015/10/12(月) 16:13:16.58ID:oCa7NkmO
++i++
と書くと2増えますか?
0768デフォルトの名無しさん2015/10/12(月) 16:23:03.13ID:iier02gv
>>767
http://codepad.org/OKjNAgct
0769デフォルトの名無しさん2015/10/12(月) 17:17:25.37ID:08WVOaLv
>>764
i++ と ++iは戻り値が違う。単に整数型なら戻り値を気にしないのなら同じだが
これがクラスのオーバーロードされた演算子だと i++ は処理を終えるまで最初の値を
保持しなければならないので戻り値を取らないなら保持が無駄になる。
そういう無駄を省きたいなら普段から ++i を使いたくなるということ。

今のPCで違いなんか出るか!と言われればそれまでだが
0770デフォルトの名無しさん2015/10/14(水) 20:35:17.54ID:Qq/D9jsd
それ以前にコンパイラがなんとかしちまうな。副作用のある関数をオーバーロードしてたら別だが。
0771デフォルトの名無しさん2015/10/21(水) 20:50:31.85ID:4OC5hcF4
プリプロセッサか何かで、このソースは32bit環境としてコンパイルすること(-m32を付けてコンパイルしろ)、みたいな指令を
ソース中に埋め込む事ってできますか?

コンパイラはLinuxのgcc4とgcc3を併用してます
0772デフォルトの名無しさん2015/10/22(木) 06:50:43.75ID:VleKFdIY
GCC5が出たというのに…
0773デフォルトの名無しさん2015/10/22(木) 14:21:39.41ID:DwxkcuZk
C++でクラス内のクラスのメンバ関数から1つ上のクラスの変数にアクセスすることはできますか?

class c_Master{
 int val ;

 class c_Slave{
  void func() ;
 } ;

}

func()の中で val = 1 ; のようにvalの値を変えたいです
c_Masterのインスタンスは複数作りたいのでstaticをつけることはできません
0774デフォルトの名無しさん2015/10/22(木) 14:40:47.00ID:MPE/iy9W
privateってことはc_Slaveはc_Masterの中からしか使わんのだろ?
だったらc_Slaveのコンストラクタでthisを渡せばいいじゃない
0775デフォルトの名無しさん2015/10/22(木) 15:16:14.49ID:DwxkcuZk
c_Slaveの中に
c_Master* p_Master
のようなポインタを作って
p_Master->val = 1 ; という風にアクセスするということでしょうか?
それならできそうですありがとうございます
0776デフォルトの名無しさん2015/10/22(木) 15:22:52.34ID:7evvohY8
C++の場合、Java のようなInner クラス/Outer クラス関係は無いからね。
0777デフォルトの名無しさん2015/10/23(金) 17:24:09.90ID:xtwbcN6R
protectedじゃいかんのか?
0778デフォルトの名無しさん2015/10/23(金) 17:25:09.58ID:xtwbcN6R
クラス内クラスか継承してるんじゃないのね。
0779デフォルトの名無しさん2015/10/30(金) 12:53:47.45ID:evAKCgDF
初心者です
unsigned long a = b->c;
だとうまくいくのですが
unsigned long a;
a=b->c;
だとコンパイルはできるのですがbusエラーが出てしまいます
何か考える原因はないでしょうかご教授お願いします。
0780デフォルトの名無しさん2015/10/30(金) 14:49:29.04ID:rNHBRIIu
>>779
連続した行じゃなくて、実際には間に何か処理が入っているんじゃねーの?
で、その処理スタック壊しているとか。
0781デフォルトの名無しさん2015/10/30(金) 14:51:21.53ID:W7b3aTEp
busエラってなんだ?
0782デフォルトの名無しさん2015/10/30(金) 15:11:34.11ID:rNHBRIIu
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)
07837822015/10/30(金) 15:19:28.97ID:rNHBRIIu
おっと忘れていた。
ビルド環境は VS2010 です。
0784デフォルトの名無しさん2015/10/30(金) 15:20:43.27ID:evAKCgDF
レスありがとうございます
趣味で今更ながらPSPむけにコンパイルしているのでコンパイラ側の問題かもしれません
busエラーについては私もどういうエラーなのかはよく存じないのですがWikipediaによると
https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B9%E3%82%A8%E3%83%A9%E3%83%BC
要約するとメモリへのアクセスの失敗のようです。
また、いろいろいじくってみた結果わかったことが一つあって
関数内でaを宣言した時は問題なしなのですが
ヘッダ内もしくはグローバル変数の時の時に失敗するみたいです。
0785デフォルトの名無しさん2015/10/30(金) 15:29:00.20ID:3PTV2iIj
>>779
ただ単に
unsigned long a;
って定義してる?
何かの構造体の中だったりしないか?
07867822015/10/30(金) 15:52:07.16ID:rNHBRIIu
>>782
間にレスが挟まるとわかりにくくなるからアンカ打とうぜ。
一々 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
}
こんな感じ?
07877822015/10/30(金) 15:55:00.87ID:rNHBRIIu
>>786
落ち着けよ俺
>>784 ね
で、 >> 785 の話はこういうことかなと。
0788デフォルトの名無しさん2015/10/30(金) 16:18:57.61ID:evAKCgDF
>>780>>781>>785>>786さんすみませんそしてありがとう>>779です、
いろいろ試行錯誤して原因が判明しました
unsigned long a;
a=b->c;
-----別の関数--------
for(int i=0;i<a;i++)
ここでエラー発生
aに0を代入した時だけうまくいったために気づきました
・・・プログラムが肥大しすぎてつらい、どこでどんな処理をしてるか自分でも把握できてない
0789デフォルトの名無しさん2015/10/30(金) 22:05:24.15ID:XZwfZSuT
>>788
機能別に分け!
}
0790デフォルトの名無しさん2015/10/31(土) 19:42:54.91ID:23sVEfSr
困難は分割せよ
0791デフォルトの名無しさん2015/10/31(土) 19:53:22.22ID:F017Euy3
人類の工学5000年の知恵:分割統治
それが分科の学となって科学となった。
0792デフォルトの名無しさん2015/11/03(火) 13:35:41.07ID:fim1V6dp
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++;
0793デフォルトの名無しさん2015/11/03(火) 13:45:06.06ID:kfNzP733
>>792
そういう簡略化記法はない
if( (a == "文字列" || b == "文字列" ) x++;
とでもするしかない
0794デフォルトの名無しさん2015/11/03(火) 13:55:56.16ID:i649bMmf
bool AorBequals(a, b, "文字列")

こうやって使える関数を作ればいい

まあ条件分岐はとにかくバグが入り込みやすいので
あまり込み入ったことをせずベタに書いたほうが後々楽
0795デフォルトの名無しさん2015/11/03(火) 13:59:02.87ID:fim1V6dp
>>793
ありがとうございました。
単純な文法ミスでしたね・・・失礼しましたorz
0796デフォルトの名無しさん2015/11/03(火) 14:04:54.96ID:fim1V6dp
>>794
bool型で関数作成もわかりやすそうですね!
ありがとうございます。
0797デフォルトの名無しさん2015/11/05(木) 23:04:17.94ID:nUM8ca/H
static じゃないメンバ変数を自クラスからアクセスするのにクラス名つけるのってありですか?

CHoge::mVal = 0; 見たいに書く。
0798デフォルトの名無しさん2015/11/05(木) 23:09:25.24ID:Rl0ElxiZ
多重継承で同じ名前があるのかな?と思う
0799デフォルトの名無しさん2015/11/06(金) 00:38:00.62ID:ykiXGTEN
定数の定義について質問です。

連番の定数を定義する時には、enumを使いますが、
これで作られるのは全部変数で、各定数ごとにメモリを確保しているんですよね?

メモリを消費したくない場合、enumを使わず、#defineを行ったほうがいいのでしょうか?
0800デフォルトの名無しさん2015/11/06(金) 00:52:10.14ID:eLeZ0/m6
定数じゃなかったっけ?
0801デフォルトの名無しさん2015/11/06(金) 03:06:29.77ID:2no8hc5C
enum自体はメモリ消費しないよ
0802デフォルトの名無しさん2015/11/06(金) 08:22:06.66ID:nauUzqH5
windows上でopenCVってのを使いたいと思って居ます。

使用OSがwindowsなのでダウンロードするopenCVはwindows版で良いとしても、コンパイラはvc++になるのでしょうか?
ご教示頂けたら幸いです。

※後にJavaにてGUIを生成して、JNIで上記を呼び出したいと思って居ます。
0803デフォルトの名無しさん2015/11/07(土) 08:41:45.90ID:WJci58Ju
コンパイラなんて何でもいいと思うけど
というかjava版のOpenCV使えば?
0804デフォルトの名無しさん2015/11/07(土) 14:08:38.72ID:aJXYP9QX
>>803
公式なら使うのですが、確か非公式だった様な。

vc を使う事にしました、ありがとうございます。
0805デフォルトの名無しさん2015/11/08(日) 11:36:04.59ID:RpsuGr6i
>>799
定数だよ。
ついでに言えば、連番に限らないよ。
例えば、enum RelativeDays {Tommorow = 1, Yesterday = -1}なんてのもできなくはない。
0806デフォルトの名無しさん2015/11/08(日) 12:47:29.54ID:vx6yITef
>>799
> これで作られるのは全部変数で、各定数ごとにメモリを確保しているんですよね?
> メモリを消費したくない場合、enumを使わず、#defineを行ったほうがいいのでしょうか?
このenumの理解度からして闇が深そうだな。

enum tag {e1, e2, e3, …};
e○ごとにメモリを確保してるわけじゃないよ。単に列挙型要素を宣言してるだけでまだ実態はない。

enum tag val1, val2, val3, …;
実際にメモリを確保するのは変数のval○を定義するとき。

まあ他に、#defineじゃなくてenumを使えば、コンパイル時にチェックしてくれるとか利点はある。
0807デフォルトの名無しさん2015/11/08(日) 13:50:53.72ID:2JTWdxT9
enumのメモリ消費気にするってw
どんだけたくさん使う気だよ
0808デフォルトの名無しさん2015/11/08(日) 15:43:20.16ID:rgUuUfPG
C++デーモン小暮「グハハハハ! お前もカプセル化してやろうか」
0809デフォルトの名無しさん2015/11/08(日) 17:29:06.95ID:Kfq1KjrF
ファイルに書き込みができない
解決策を教えてほしいです

#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;
}
0810デフォルトの名無しさん2015/11/08(日) 17:35:45.22ID:FJ7EwzEm
>>809
戻り値
正常終了した場合は 0 を返します。
失敗した場合はエラー コードを返します。
これらのエラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。

だから fopen_s 正しくはこっちじゃね?

if ((error = fopen_s(&output, "output.dat", "w")) != NULL){
0811デフォルトの名無しさん2015/11/08(日) 17:43:23.07ID:Kfq1KjrF
>>810
なるほど,解決したわ

ありがとう
0812デフォルトの名無しさん2015/11/08(日) 19:21:46.97ID:gczgyzuS
0を返すってんだから0と比較しろって。
NULLが0じゃない環境も今時珍しいけど
0813デフォルトの名無しさん2015/11/08(日) 20:08:14.33ID:zLvmLdPT
それはおかしい
NULLは内部でどういう数値を使っているかにかかわらず
ソースコード上ではNULLはdefineで0と定義してあるのではないかね
だからどうであれソースコード上で0に置き換わるのでは?
しかし((void *)0)と定義して有る場合はコンパイルエラーになるね
0814デフォルトの名無しさん2015/11/08(日) 20:13:55.15ID:rhG8pOkx
最終的に置き換わるからって問題じゃなくね
そんなソース引き継ぎたくないわw
0815デフォルトの名無しさん2015/11/08(日) 20:22:17.19ID:krAhSW9o
環境によっては-1のこともあると大昔に聞いた気がする。だからNULLと書かなきゃいけないと
今はnull_ptrがあるけど
0816デフォルトの名無しさん2015/11/08(日) 20:56:58.16ID:zLvmLdPT
それはない
ヌルポの内部表現が-1だったとしてもソースコード上では0がヌルポ
ポインタが出ててくる事が期待される箇所に0が出現したら
コンパイラはヌルポインターを生成するとCの仕様で決まっている
0817デフォルトの名無しさん2015/11/08(日) 21:33:04.75ID:qUw9KKbb
0と比較しろって書いてるんだろ?
0818デフォルトの名無しさん2015/11/08(日) 21:42:38.26ID:RpsuGr6i
NULLが0じゃない、0がNULLなんだ。

つー話はさておき、今時詰め込むメリットないから代入と評価は分けようぜ。
0819デフォルトの名無しさん2015/11/08(日) 21:44:47.09ID:zLvmLdPT
>NULLが0じゃない、0がNULLなんだ。

いやそれはおかしい
0820デフォルトの名無しさん2015/11/08(日) 21:47:30.04ID:rhG8pOkx
>>819
お前否定しかしてないけどお前が間違ってるっていうw
0821デフォルトの名無しさん2015/11/08(日) 21:53:37.80ID:zLvmLdPT
#define NULL 0
と定義して有るんだからNULLが0であって、0がNULLなわけではないし
0がヌルポインタなんだ、の言い間違えだったとしても
ヌルポではない普通の整数の0の場合も有るから
常に0がヌルポなわけでもない
0822uy ◆Qawu9.2l1E 2015/11/08(日) 22:03:50.38ID:hjGS9Lf9
良いじゃんC言語なんてテキトーに書いて動いた終わり。で
もう使われる事もないその程度の言語なんだから
0823デフォルトの名無しさん2015/11/08(日) 22:05:12.79ID:SGCCwhdk
ヌル論争なんて聞き飽きた。
ヌルはゼロだと思っていても全く問題ない。
0824デフォルトの名無しさん2015/11/08(日) 22:22:50.58ID:vx6yITef
ま、エラーの条件判断に「==NULL」と書いてるところから推理すると、fopenとfopen_sをごちゃ混ぜにしちゃったんだろうね。
最初から次のブログのコードをパクって書いていれば問題なかったのに…
http://blog.livedoor.jp/mrcom511/archives/51270788.html
0825デフォルトの名無しさん2015/11/09(月) 06:47:17.94ID:imWJY0W/
>>813
>しかし((void *)0)と定義して有る場合はコンパイルエラーになるね

この実装しか見たことない
0826デフォルトの名無しさん2015/11/09(月) 07:13:22.33ID:fyLz/sBu
C++の場合は#define NULL 0
Cの場合は#define NULL ((void *)0)
理由は考えろ。
0827デフォルトの名無しさん2015/11/09(月) 07:35:26.18ID:u4Kl1uhV
頑なにNULL論争を続けようとする人はなんなの?
なんで実装を気にしてプログラム書くの?
NULLかnullptr使うと死ぬの?
0828デフォルトの名無しさん2015/11/09(月) 08:35:16.46ID:giUW2w8g
>>822
それは ruby であって C/C++ ではない
0829デフォルトの名無しさん2015/11/09(月) 16:54:52.45ID:xDt2hEwv
>>821>>826
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
と書かれてるはずで、そうじゃない処理系は知ったこっちゃない
0830デフォルトの名無しさん2015/11/09(月) 17:13:45.53ID:xDt2hEwv
ちなみに何故お前らのNULLが0で定義されてるかというと、
言語としてはそこにアクセス出来ないことになってるので
そこにアクセスしたら確実にセグメンテーションフォールトが発生するようなアドレスの一つが0だから、
というのが正しいんだけど実はこれOS依存。

x86系で動くモダンなOSを仮定するなら、
アドレス0への参照をプログラムが要求
→論理アドレス0を含むページが物理アドレスに載っていないのでページフォールト例外が発生(ディスクリプタがどうとかいう話は省略)
→OSがそれを検出
→プログラムがアクセスしようとしたアドレスが0x00000000-0x00001000番地に含まれている事をOSが認識して、SEGVを発送
→プログラムに処理が戻り、SEGVを検出
→デフォルトハンドラを読みに行って正常に異常終了する
といった流れになる。

これがCPUが違えば、例えばアドレスの最上位ビットが立ってるからだとか、
アドレスのアラインメントが取れてないからだとか、
他の方式によって検出して最終的にセグメンテーションフォールトで落とす感じになる。
なので自然とNULLが意味する値は処理系依存になる。
0831デフォルトの名無しさん2015/11/09(月) 18:30:01.88ID:GSrDHzaU
fopen_s
https://msdn.microsoft.com/ja-jp/library/z5hh6ee9.aspx
> 戻り値
> 正常終了した場合は 0 を返します。失敗した場合はエラーコード(errno)を返します

と書いているのでNULLじゃなく 0で判定する(必要とあらばerrnoも)以外に無いと思うんだが
0832デフォルトの名無しさん2015/11/09(月) 19:23:27.14ID:hqP7pMYo
>>829-830
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を参照のこと
0833デフォルトの名無しさん2015/11/09(月) 19:25:42.20ID:hqP7pMYo
Cプログラマーは、昔から自分の書いたプログラムが走るマシンの実 装に関して必要以上に知りたがる。
ヌルポインターがたいていのマシ ンで、ソースコード上も多くの内部表現上も0であることが、保証さ れない仮定を招いている。
マクロ「NULL」を使うことで、その値が将 来変化するかもしれないことや、妙なマシン上では0でないことを指 しているように思えるかもしれない。
「if(p==0)」と書くと、比較す る前に0をポインター型に変換するというよりは、pを整数型に変換す ることを必要とすると解釈されがちである。
最後に(上の質問5.13で 記述した)「ヌル」という言葉は、文脈によって異なる意味を持つの に、違いを大目に見がちである。 混乱を避けるよい方法は、
C言語にはキーワードがあって(Pascalの nilのような)、それを使ってヌルポインター定数を要求すると考える ことである。
コンパイラはソースコードから型が決定できるときは、 "nil"を正しい型のヌルポインターに変換することができるし、でき ないときは苦情を出す。
実際にはヌルポインターのC言語のキーワー ドは"nil"ではなく「0」である。0は"nil"とほとんど同じ働きをする。
違いは、ポインター以外が必要な状況ではキャストされていない0に はエラーメッセージを出す代りに整数の0を作り出すことである。
キャ ストされていない0をヌルポインターのつもりで使うと、そのコード はうまく動かないかもしれない。
0834デフォルトの名無しさん2015/11/09(月) 19:37:07.11ID:fyLz/sBu
>>829
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」でも良いなんて書いてない。
無知自慢しなくても良いぞ。
0835デフォルトの名無しさん2015/11/09(月) 19:46:58.51ID:xDt2hEwv
>>832-833
fopen_sなんて関数使ってるから「仕様に完全に準拠してるわけではないC++」についての話題だと思ってたよ。
C言語に関しては、仕様に準拠してりゃ確かにそれが正しい。

俺の発言の要点は、
・変な処理系もあるよ!
・C++ではNULLの見かけ上の値すら未定義(なので便利で適当な値が使われる)。
・Cの処理系では0(仕様通りなら)。
の3つであって、なんで噛みつかれたのかさっぱり分からんのだが。
0836デフォルトの名無しさん2015/11/09(月) 19:51:21.75ID:xDt2hEwv
>>834
null pointer constantは整数0か、又はstd::nullptr_t型の値(要はnullptr)だって事だろ。
nullptrを整数に(正確にはビット列に)した時の値については何も言ってないのよ。
0837デフォルトの名無しさん2015/11/09(月) 20:10:28.11ID:hqP7pMYo
誰もヌルポインターの内部表現の話なんかしてねーよ
0838デフォルトの名無しさん2015/11/09(月) 20:28:36.21ID:fyLz/sBu
>>836
バカめ
> NULLがどう定義されてるかは処理系依存で、
> 実際0x80000000や0xffffffffで定義された処理系も存在するのよ
実際に存在するとは、どの処理系だ? それが存在するなら、それは規格を満たしていない。

これ以上、無知の上塗りせずに、間違いを認めて引っ込んだ方が良いぞ。
0839デフォルトの名無しさん2015/11/09(月) 20:51:17.62ID:xDt2hEwv
触れたのがあまりに昔で名前は出てこないけど、当時NULLが0だと思ってて嵌ったことは覚えてる。
今は規格に準拠してりゃCでもC++でも0なのか。
0840デフォルトの名無しさん2015/11/09(月) 20:58:09.57ID:eC7QTO9C
何時の時代の話かは分からんのだが、
NULLが-1になってた処理系に遭遇したって都市伝説は耳にしたことがあるな
0841デフォルトの名無しさん2015/11/09(月) 21:01:16.83ID:fyLz/sBu
根拠として「C++の2012年のドラフト」をあげているんだから、その言い訳は通用しない。
まだ、恥の上塗り続けるつもりか?
0842デフォルトの名無しさん2015/11/09(月) 21:05:08.74ID:xDt2hEwv
NULLが0じゃないこともあるって知識を元に適当に仕様をググッて斜め読みしたらそう読めたんで
そう書いたって話。
誤解させてごめんよ。

Cの仕様でNULLが0だって決まってる方がむしろ驚いてる。
0843デフォルトの名無しさん2015/11/09(月) 21:32:53.50ID:J1dkkwNY
内部表現が0とは限らない,というだけの話だろう
いずれにしてもポインタが期待されるところで 0 と書けば,それはヌルポインタであることには変わりない
0844デフォルトの名無しさん2015/11/09(月) 21:33:59.13ID:NTgR53a+
>>840
俺も聞いたことがある
30年くらい前
まだマシン毎にコンパイラが乱立してた頃
0845デフォルトの名無しさん2015/11/09(月) 22:28:11.83ID:GSrDHzaU
実装が
#define NULL 0
だろうがなんだろうが fopen_s は「成功は == 0 で判定しろ」ってんだからさ
NULLで判定しても良いなんてガキみてぇなことグチャグチャ言ってないで
ちゃんと 0 で判定しろよガキ
0846デフォルトの名無しさん2015/11/09(月) 22:28:25.78ID:fyLz/sBu
>>844
ANSIでCの規格が制定される前は規格がなかったからね。
0847デフォルトの名無しさん2015/11/09(月) 22:42:43.69ID:fyLz/sBu
>>845
それはそのとおり。
ヌルポがオール0以外な環境だったら、判定が間違う可能性があるからね。
0848デフォルトの名無しさん2015/11/09(月) 22:49:48.54ID:hqP7pMYo
確かに整数を返すのだから0と判定したほうが良いのは確かだが

>ヌルポがオール0以外な環境だったら、判定が間違う可能性があるからね。

この根拠はおかしい
NULLはどの環境でも内部表現に関わらずソースコード上では0に置換されるから
ただし、((void*)0)に置換される環境では整数の0のつもりでNULLを使うとコンパイルエラーになるが
0849デフォルトの名無しさん2015/11/09(月) 22:59:02.41ID:ZbpKjgrs
>ソースコード上では0に置換される
ちがくない?0はNULLポインタになるけどただし以降に書いてるとおりNULLは0になるかどうかわからんでしょ
0850デフォルトの名無しさん2015/11/09(月) 23:07:52.73ID:kUB8xo8u
俺も>>812、>>817、>>845あたりが正論と思うね
>>813からの流れがおかしい
NULLが0と等しいか、などと議論すべき事柄じゃない
そもそもfopen_sの解説からしてリテラル0と比較するのが理に適っている
それをわざわざNULLマクロというワンクッションを挟んで記述する合理的理由がない
0851デフォルトの名無しさん2015/11/09(月) 23:18:15.81ID:fyLz/sBu
>>848
int x;
x == (void *)0;
これ警告は出るけどエラーにならないでしょ。
0852デフォルトの名無しさん2015/11/09(月) 23:45:30.61ID:eIzs0U/u
NULLはゼロだと思っておけば良い。
0853デフォルトの名無しさん2015/11/10(火) 01:09:51.87ID:0bGxannp
思うのは勝手だがNULLをゼロの代わりに使ってはいけない
0854デフォルトの名無しさん2015/11/10(火) 02:14:04.89ID:YWed6J6d
struct Location {
int x;
int y;
int z;
};
って
Position pos = {1, 2, 3};
みたいに宣言出来るのにLocationを引数をとる関数にGetValue({1, 2, 3})みたいに出来ないのはなぜですか?
0855デフォルトの名無しさん2015/11/10(火) 02:15:23.33ID:YWed6J6d
PositionはLocationの間違いです
0856uy ◆Qawu9.2l1E 2015/11/10(火) 02:16:33.56ID:rHJUCiJo
どのみち環境依存の関数使って書いてるのにNULLだけこだわるアホ
0857デフォルトの名無しさん2015/11/10(火) 02:34:08.03ID:co6NjOXk
>>854
出来るが

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
0858デフォルトの名無しさん2015/11/10(火) 02:39:07.56ID:YWed6J6d
struct location_t{ int x, y, z; };

void func( location_t pos ){} //OK;
これに対して
func({1,2,3});
とするとE2188構文エラーが出ました
0859デフォルトの名無しさん2015/11/10(火) 03:04:26.38ID:co6NjOXk
環境は?
こっちはVS2013で試したけど動いたよ
0860デフォルトの名無しさん2015/11/10(火) 07:52:52.72ID:3CFe6hEs
>>854
Position pos = {1, 2, 3};
これの右辺は初期化子という構文要素、
GetValue({1, 2, 3})
これのカッコ内は式という構文要素。
使用出来る形式が異なる。
0861デフォルトの名無しさん2015/11/10(火) 07:57:59.40ID:/JKv2M44
NULLは今は0かも知れないが、0が常にNULLと同じ意味を持っている訳ではないってことだろ
#define FOPEN_S_OK (0)
とでもやっておけよ
0862デフォルトの名無しさん2015/11/10(火) 07:59:17.49ID:3CFe6hEs
ちなみに後者はC99のコンパウンドリテラルという書式で、
GetValue((struct location_t){1, 2, 3})と記述出来る。
C++(11?)ならGetValue(location_t{1, 2, 3})
0863デフォルトの名無しさん2015/11/10(火) 08:42:35.36ID:1JfD7fk6
コンストラクタでいいだろ
0864デフォルトの名無しさん2015/11/10(火) 08:42:47.62ID:xDrjxquL
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
0865デフォルトの名無しさん2015/11/10(火) 08:48:41.86ID:xDrjxquL
天ぷらが抜けた
0866デフォルトの名無しさん2015/11/10(火) 08:58:57.20ID:uEihdd6c
C++から離れて舞い戻ったらnullptrてあるんだな。
浦島太郎状態
0867デフォルトの名無しさん2015/11/10(火) 09:10:00.14ID:3CFe6hEs
void *からの暗黙変換できないからね。崩れかけてるトランプタワー。
0868デフォルトの名無しさん2015/11/10(火) 09:26:37.61ID:2PTLdG6J
>>859
Borland C++ 5.5.1です

>>862
調べてみたところどうやらこのコンパイラはその規格に対応してなかったようです
このコンパイラで引数のところに{}で指定する方法はないですか?
0869デフォルトの名無しさん2015/11/10(火) 09:32:51.25ID:3CFe6hEs
>>868
無理だね。
0870デフォルトの名無しさん2015/11/10(火) 09:33:46.06ID:eBvt9LNV
orland C++ 5.5.1からLLVM/Clangへ移行
0871デフォルトの名無しさん2015/11/10(火) 09:38:04.56ID:2PTLdG6J
>>869-870
ありがとうございます
このコンパイラでは駄目なようですね
0872デフォルトの名無しさん2015/11/10(火) 18:01:22.35ID:XNBaBHgi
写真は、文字列を関数に渡して逆順にして返す、という問題の解答ですが、疑問があります。

char *s = "文字列"
これは文字列リテラルのアドレスを渡しているので書き換えができるかは処理系依存という理解でいいでしょうか?
0873デフォルトの名無しさん2015/11/10(火) 18:02:25.06ID:XNBaBHgi
画像貼り忘れました。。

http://i.imgur.com/4mqb1BM.jpg
0874デフォルトの名無しさん2015/11/10(火) 18:28:45.77ID:xgXHwxle
>>872
どうなるかは処理系依存。

The effect of attempting to modify a string literal is undefined.
って書いてあった。

char s[] = "This is a test.";
が正しいと思うのです。
0875デフォルトの名無しさん2015/11/10(火) 18:45:03.85ID:0bGxannp
>>873
'\n' がキモいな。 endlだろうI like C++ならw
0876デフォルトの名無しさん2015/11/10(火) 19:19:58.99ID:3CFe6hEs
C++なんて破綻したのをlikeな地沼って存在するのか?
0877デフォルトの名無しさん2015/11/10(火) 19:23:43.03ID:37NidK9w
>>872
余り詳しいわけではないけど、俺は処理系非依存だと思う。(常に書き換えできる)
charとstd::stringは別物だろ。
0878デフォルトの名無しさん2015/11/10(火) 20:36:58.14ID:c0uHB6kx
みなさんありがとうございます。
これは独習c++という本ですが、第3版14刷とかなり版を重ねていて他の説明などは分かりやすく書かれているので少し気になりました。
0879デフォルトの名無しさん2015/11/10(火) 20:59:32.52ID:1JfD7fk6
>>877
文字列リテラルがROMに配置されてたら書き換え不能じゃね?
0880デフォルトの名無しさん2015/11/10(火) 21:18:58.96ID:XNBaBHgi
>>877

非依存と書かれていたのですね。見落としてました。
私の環境では
vs2015 実行時強制終了
g++ コンパイル時にエラー
borland 書き換え可能
となっています。
0881デフォルトの名無しさん2015/11/10(火) 21:45:36.71ID:YYcxvMD9
endlはフラッシュ処理が入るから若干遅い
0882デフォルトの名無しさん2015/11/10(火) 21:51:28.42ID:FYErR5Mx
endlにフラッシュ処理が入る…
0883デフォルトの名無しさん2015/11/10(火) 22:12:49.13ID:1JfD7fk6
フラッシュ処理の遅延気にするってw
どんだけ出力する気なんだよw
0884デフォルトの名無しさん2015/11/10(火) 22:36:41.93ID:37NidK9w
>>879-880
処理系依存だった。
> 同じ文字列リテラルが区別されるかどうかは処理系での定義による。
> 文字列リテラルを変更しようとするプログラムのふるまいは不定である。
> K&R第2版P236(A2.6)、ただしその後の変更があった場合は知らない
ちなみに記憶クラスはstaticで定数扱いだから、ROM領域においてもいいらしい。

以下ページだと
char s_l* = "literal'; // リテラルを指す
char s_a[] = "literal"; // 自動変数を指す
みたいな感じだね。つまり>>874も正解。
http://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01077.html
0885デフォルトの名無しさん2015/11/10(火) 23:15:02.95ID:xDrjxquL
ポインタを表すべき場所での0がヌルポインタになるのは分かったんだけど、
もし本当にアドレス0のデータを読み書きしたくなったらどう書くのが正解なの?

volatile int8_t* text_screen = 0xb8000;
text_screen[0] = 'a';
text_screen[1] = 7;
でアドレス0xb8000に0x0761が書かれると仮定して。
0886uy ◆Qawu9.2l1E 2015/11/10(火) 23:42:57.79ID:0FN92oKT
C/C++で書かないのが正解

ゴミ言語
0887デフォルトの名無しさん2015/11/10(火) 23:48:09.40ID:3CFe6hEs
>>885
ヒント
ポインタを表すべき場所での「定数 0」がヌルポインタコンスタント
0888デフォルトの名無しさん2015/11/11(水) 00:03:15.97ID:kzShUi9X
>>885
アドレス指定で読み書きする必要があるような環境向けの処理系ならやりかたが用意されてるだろ。
そのコンパイラのマニュアル嫁
0889デフォルトの名無しさん2015/11/11(水) 00:32:08.54ID:iOpec/0o
>>885
ptrdiff_tとのunion作って0をぶち込んどけ
0890uy ◆Qawu9.2l1E 2015/11/11(水) 01:09:50.86ID:uYSp+fPE
NULL == 0 とか単なるモンキーパッチ
0891デフォルトの名無しさん2015/11/11(水) 01:44:08.78ID:X7TkVs/Y
>>885
0(NULL)でありえないアドレスと判断してるのであって、
アクセスしてはダメってわけじゃないし、できないわけではない

0番地にアクセスが必要、つまり安全ってわかってるなら、
判断の必要もなくアクセスすりゃあいい
0892uy ◆Qawu9.2l1E 2015/11/11(水) 03:23:51.63ID:uYSp+fPE
そういう判断でやってるとNULLでエラーチェックやってる場所でバグるんだよね

NULLにアクセスしてんのと同じだもん
NULLを -1 に定義しなおすのが正解

C使わないのが大正解
0893デフォルトの名無しさん2015/11/11(水) 03:37:46.04ID:YjEvuyTw
まぁそんな状況はないって事ですよ。
0894デフォルトの名無しさん2015/11/11(水) 07:24:41.78ID:mKuF2Y4X
>>891
いや、ダメだよ。
ヌルポインタコンスタントを、ポインタタイプに変換したものが、ヌルポインタ。
ヌルポインタは如何なるオブジェクトへのポインタとも等しく無い事が保証されている。
NULLが何かを指しているのはこれと矛盾。
0895デフォルトの名無しさん2015/11/11(水) 07:30:43.33ID:/esTl/Qt
>>891
アクセスしちゃダメってマニュアルに書いてあるCPUもあるよ
0896デフォルトの名無しさん2015/11/11(水) 07:45:21.32ID:HaR9EPgA
CPUからアドレス0を読み書きできるように設計したCPUがあったら
大いなる仕様設計ミスでしかない
0897デフォルトの名無しさん2015/11/11(水) 08:27:12.80ID:X7TkVs/Y
>>896
電源入れたらゼロ番地にアクセスするCPUは設計ミスなのか?
0898デフォルトの名無しさん2015/11/11(水) 08:28:14.91ID:dnGEiVDn
>>896
普通に読み書きできるよ、アドレス0にはね by Z80, i80x86
0899デフォルトの名無しさん2015/11/11(水) 08:51:55.79ID:bkM6Jmzo
0番地が普通にアクセス可能な環境があるなら
その時には処理系がNULLに別の(特殊な)定数を割り当てようとするんじゃないかな?
ぎゃくにNULLマクロを使ってコードを書いていれば、そんな環境の違いをプログラマは意識する必要はないよね
0900デフォルトの名無しさん2015/11/11(水) 09:05:54.23ID:mKuF2Y4X
>>899
x86(64も含む)は0番地にアクセス可能だよ
0901デフォルトの名無しさん2015/11/11(水) 09:20:54.95ID:pvIjWuQG
論理アドレス空間と物理アドレス空間の区別がつかないなら黙ってろ。
0902デフォルトの名無しさん2015/11/11(水) 09:29:38.15ID:bkM6Jmzo
>>900
私の言葉足らずで済みません。「プログラムから見て」R/W可能か?というつもりでした(o_ _)o
0903デフォルトの名無しさん2015/11/11(水) 09:34:37.50ID:iOpec/0o
>>891
それだとNULLの内部表現によってはアドレス0にアクセスしたことにならない。

>>899
ソースコード上のヌルポインタコンスタントはヌルポインタの内部表現に置き換わることに注意しなきゃいけない。
つまり単に*((*int)0) = 0;等とやると実際に何が行われるかが処理系依存ということになる。
0904デフォルトの名無しさん2015/11/11(水) 09:42:23.33ID:F3g6v2f+
>>903
ヌルポインタのデリファレンスは未定義じゃない?
0905デフォルトの名無しさん2015/11/11(水) 09:45:32.67ID:iOpec/0o
>>904
未定義だっけ?
処理系依存って書いちゃったけど。
0906デフォルトの名無しさん2015/11/11(水) 12:31:12.42ID:dnGEiVDn
>>899
NULL マクロなんか不要だよ、NULL って書かずに 0 って書いて全く問題ない

>処理系がNULLに別の(特殊な)定数を割り当てようとする
たぶんハードウェアのアドレス空間上にそのような特別な場所はないと思うよ
0907デフォルトの名無しさん2015/11/11(水) 12:56:10.74ID:mKuF2Y4X
>>906
可変個数引数関数やプロトタイプが無い関数で困る。
後者は死ねで済むが。
0908デフォルトの名無しさん2015/11/11(水) 14:21:46.94ID:WDtG518P
可変長引数の場合はキャストが必要
でもこれは良く考えれば一般的にそうだ
単に0と書いたとき、charなのかintなのかlongなのかlong longなのか
usngiendなのかsigneldなのか何なのか分らないではないか
0909デフォルトの名無しさん2015/11/11(水) 14:36:22.22ID:iOpec/0o
va_startしてva_argすればそれ以上キャストは要らんだろ。
何言ってんの?

多分、可変長引数個数関数の最後の引数はNULLにしてねって書いてある
GTKなんかのライブラリで困るって言いたいんだと思う。
0910デフォルトの名無しさん2015/11/11(水) 14:38:17.18ID:m8XjY7WS
スタックに積むときのサイズはコンパイラはわかってるだろ
取り出す方で判別する必要があるだけだ
リテラルの0はintだろ?
0911デフォルトの名無しさん2015/11/11(水) 14:41:58.95ID:iOpec/0o
どうでもいいけどリテラルの0って八進数だっけ?
0912デフォルトの名無しさん2015/11/11(水) 14:44:02.88ID:WDtG518P
君が何言ってるの?
int32とint64でサイズが違うけど
単に0と書いただけでは判断つかない
期待される型が分っている場合ならコンパイラが適切に変換してくれる
(0をヌルポインターに変換するのと同じように)

しかし可変長引数やプロトタイプの無い関数の場合は
コンパイラは期待される型がわからないから
int64のつもりで0と書いていても、コンパイラはintの0を生成するだろう
キャストするかサフィクスをつけなければならない
(ちょうど(void *)0と書かなければならないのと同じようにな)
0913デフォルトの名無しさん2015/11/11(水) 14:48:05.91ID:m8XjY7WS
>コンパイラはintの0を生成するだろう

自分で答え書いてるじゃんw
0914デフォルトの名無しさん2015/11/11(水) 14:49:33.05ID:m8XjY7WS
>>911
どっちでも同じだから気にしないことにしてるw
0915デフォルトの名無しさん2015/11/11(水) 14:49:47.71ID:iOpec/0o
判別付くよね?
int32のつもりでゼロと書きたいなら単に0と、
int64のつもりでゼロと書きたいなら0lって書くけど。
0916デフォルトの名無しさん2015/11/11(水) 14:50:12.44ID:WDtG518P
可変長引数やプロトタイプ宣言の無い関数で
受け取り側がint64のつもりで受け取っていたら
呼び出し側もint64を渡さなければならない、当たり前
しかし、単に0と書いただけではintになるから
intが32bitの環境ならスタックフレームが壊れて即座にクラッシュする
だから受け渡し側はサフィクスかキャストをして渡さなければならない
これはちょうどヌルポを渡すときに(void *)0とキャストが必要なのと同じこと
もちろん、プロトタイプ宣言があってコンパイラが関数の型を分っているなら
適切に変換されるわけだがな
0917デフォルトの名無しさん2015/11/11(水) 14:53:48.57ID:m8XjY7WS
スタックフレームは壊れないっしょ
積んだ奴がスタックポインタを戻すcdeclだからできることではあるが
0918デフォルトの名無しさん2015/11/11(水) 14:54:02.25ID:WDtG518P
だから可変長引数やプロトタイプの無い関数で
ヌルポインターを渡すときに(void *)0とキャストが必要というのは
数値のリテラル一般にも、そういうことだということ
特別な事じゃない
元々そういうもの
0919デフォルトの名無しさん2015/11/11(水) 14:55:01.00ID:WDtG518P
スタックフレームは確かに壊れんなスマソ
しかしプログラムはバグるがな
0920デフォルトの名無しさん2015/11/11(水) 15:01:43.04ID:iOpec/0o
>>916
ちょっと待って。
確認なんだけど、プロトタイプ宣言が無い関数を呼んだ時って
呼び出し側がどう書こうがintにキャストされるんじゃなかったっけ?
古いCの仕様で。

それと、君はキャストをどの意味で使ってる?
俺は(呼ばれる側が、引数の型を既に判明してる引数の情報から推測できる場合には)
reinterpret_castが必要ないって意味で言ってるんだけど。
0921デフォルトの名無しさん2015/11/11(水) 15:13:38.70ID:iOpec/0o
ところでさ。

確かx86/x64上のCだと、32bit以下の型をスタック使って引数として渡す場合にも
スタックポインタって1引数あたり丁度32bit分ズレたと思うんだけど。

つまり、doubleだのint64_tだのを渡さない限り、可変長引数個数関数のva_argはどんな32bit以下の型に対しても
同じように上手く動く筈なんだけど、違ったっけ?
0922デフォルトの名無しさん2015/11/11(水) 15:31:07.69ID:WDtG518P
むしろfloatはdoubleに拡張されるんじゃなかったっけか?
0923デフォルトの名無しさん2015/11/11(水) 15:36:59.98ID:iOpec/0o
>>922
補足ありがとう。なんか忘れてる気がしてた。
それでscanfとprintfの書式に対称性がなくなるんだった。
0924デフォルトの名無しさん2015/11/11(水) 16:24:58.75ID:YjEvuyTw
なんだかわからんが、NULLを使えばいんですよね
という当たり前の事に帰着するのであった。
0925デフォルトの名無しさん2015/11/11(水) 17:05:05.87ID:mKuF2Y4X
NULLなんか使っちゃダメに決まってんだろ。アホウ。
0926デフォルトの名無しさん2015/11/11(水) 17:18:00.97ID:YjEvuyTw
だから 実際問題となるケース出せ ぼけが
0927デフォルトの名無しさん2015/11/11(水) 17:18:55.85ID:hcWNQVA+
>>911
8
0928デフォルトの名無しさん2015/11/11(水) 17:40:41.92ID:Ye3Cp2LR
>>903
× > *((*int)0) = 0;
○ > *((int*)0) = 0;
0929デフォルトの名無しさん2015/11/11(水) 17:59:41.08ID:iOpec/0o
>>928
なんか変だとは思ってた。
サンクス
0930デフォルトの名無しさん2015/11/11(水) 19:36:27.59ID:mKuF2Y4X
>>926
もう一回言ってやる。
NULLなんか使っちゃダメに決まってんだろ。アホウ。
0931デフォルトの名無しさん2015/11/11(水) 19:45:11.77ID:mKuF2Y4X
>>926
お前、致命的にバカそうだから、指摘してやろう。
NULLを使えと言い出したのはこのスレではお前がはじめてだ。
0932デフォルトの名無しさん2015/11/11(水) 19:59:15.39ID:YjEvuyTw
だからお前はプロなのかどうなんだ。
それだけ言え。この馬鹿素人が。
0933デフォルトの名無しさん2015/11/11(水) 20:15:23.16ID:iOpec/0o
とりあえずs/NULL/nullptr_t/gを手作業でやったことにして
明日もサボろう
0934デフォルトの名無しさん2015/11/11(水) 20:15:34.95ID:mKuF2Y4X
プロだよ。バカ。
0935デフォルトの名無しさん2015/11/11(水) 20:37:39.07ID:WOIGmI6i
>>895
ないと思うよ‥
0936デフォルトの名無しさん2015/11/11(水) 20:42:08.76ID:WOIGmI6i
>>907
可変長引数では,(void *)0 ってキャストして書けばいいよ
キャストなしで,とか変な縛りはやめようね
0937デフォルトの名無しさん2015/11/11(水) 21:27:09.67ID:mKuF2Y4X
「キャストすんな」はバカを調教する時にすごく重要
あいつら「キャストしないとコンパイラエラーが取れない」とか、真顔で言いだすから。
0938デフォルトの名無しさん2015/11/11(水) 22:43:57.99ID:kzShUi9X
>>899
NULLをデリファレンスしたら何が起きるかわからないんだから、そのときに0番地に
アクセスすることになってもしょうがない。わざわざNULLの内部表現を変える必要なんてない。
アドレス指定のダイレクトアクセスが必要なら処理系がライブラリ用意するのが筋だろう。
0939デフォルトの名無しさん2015/11/12(木) 02:02:07.91ID:vfLy0hrq
C言語はオワコン
0940デフォルトの名無しさん2015/11/12(木) 04:39:55.43ID:X3qMcYPf
元々戻り値の話だったのによく飽きないな
0941デフォルトの名無しさん2015/11/12(木) 05:00:57.49ID:+TRt+Sln
NULL使えなんて言いだして引っ張る道化が現れるから
0942デフォルトの名無しさん2015/11/12(木) 06:54:33.73ID:Rz9ctgf7
成功時NULLと、成功時0と、成功時1以上が
混ざってるとクッソめんどい
0943デフォルトの名無しさん2015/11/12(木) 08:28:00.26ID:X3qMcYPf
0, 1以上, NULLを同列で考えてるから混ざってると感じるだけ
0944デフォルトの名無しさん2015/11/12(木) 08:39:19.46ID:Titn/2xe
成功時にNULLを返す関数ってどんなのがあったっけ。
0945デフォルトの名無しさん2015/11/12(木) 08:46:28.02ID:0/9agn9x
戻り値の型が整数型なら0は返せても、NULLは返せないからな。
ポインタ型を返す関数なら、正常時に意味のあるポインタを返したいだろうからNULLを返すなんて無意味な仕様にしないだろうし。
0946デフォルトの名無しさん2015/11/12(木) 09:04:13.80ID:Rz9ctgf7
ああすまん、最後は失敗時NULLだな
0947uy ◆Qawu9.2l1E 2015/11/12(木) 12:11:32.58ID:YKGP90Ph
経験が無いのをバレないように会話していくスレw
0948デフォルトの名無しさん2015/11/12(木) 12:21:56.59ID:FMRhjNH0
それはお前だけ
0949デフォルトの名無しさん2015/11/12(木) 12:22:55.06ID:9l61Vk4V
>>947
面白そうだから立てたww
http://peace.2ch.net/test/read.cgi/tech/1447298537/
0950デフォルトの名無しさん2015/11/13(金) 12:04:58.17ID:P+x1lmAA
CのstaticとC++のanonymous namespaceってどう違うんだっけ?
0951デフォルトの名無しさん2015/11/13(金) 15:57:23.37ID:cTzYhkFo
>>950
Cのstaticはそのファイルでのみ有効
C++ anonymous namespaceでは知らん
基本C++では宣言とコードは別ファイル
cpp側で書けば、そのファイルでのみ有効なんじゃ無い?
そんなコード書いたこと無いけどさ
0952デフォルトの名無しさん2015/11/14(土) 17:35:20.56ID:Ngo/6AAy
>>950
staticは名前の通り記憶クラス指定子。静的寿命を持つという宣言。
関数の外でstatic宣言するとファイルスコープになるのはどっちかというと副作用。

namespaceには記憶クラスを指定する機能は無い。
0953デフォルトの名無しさん2015/11/14(土) 19:02:05.68ID:iwAmPq2+
副作用じゃねーよ
Cは予約語をケチるため、一つの予約語を使い回す
0954デフォルトの名無しさん2015/11/14(土) 20:04:03.27ID:MSvtHxf5
externできなくない?
0955デフォルトの名無しさん2015/11/14(土) 21:42:00.07ID:5MMaz5Qo
>>952
>namespaceには記憶クラスを指定する機能は無い。

うそつけ

>http://exlight.net/devel/cpp/unnamed_namespace.html
>名前の有効範囲をファイルスコープに制限したい場合に利用する.
>次のように名前空間名を指定せずにnamespaceで囲むと,同一ファイル内からは見えるけど,
>他のファイルからは見えないグローバル変数などをつくることができる.
>staticじゃないの?
>文脈によって意味が変わってきてわかりにくいところが不評で,C++ではstaticではなく無名名前空間を使うようになっている.
0956デフォルトの名無しさん2015/11/15(日) 02:02:58.45ID:YRBdjGon
いや、記憶クラスではないだろ。

namespace
{
 int g_count;
}

こうすると、コンパイラが勝手に、

namespace XYZ@20151115
{
 int g_count;
}
using namespace XYZ@20151115;

みたいな解釈をして、定義されたファイルの利用者は、namespaceを指定せずに利用できる。
が、他のファイルからはXYZ@20151115を知らないとアクセスできないので、結局アクセスできないというだけ。
0957uy ◆Qawu9.2l1E 2015/11/17(火) 19:15:42.80ID:f2qjXPcC
load "fileA.rb" , true
0958デフォルトの名無しさん2015/11/17(火) 21:38:05.76ID:of/WOUg/
>>956
実装は関係なくね?
外から見る手段がないなら内部リンケージ以外の何者でもないだろ
0959デフォルトの名無しさん2015/11/24(火) 22:35:37.02ID:RCu8tHgV
static int* p=0;
と
static int* p;
って動作違うんすか?
差し替えたら動作変わったんすけど何がどう変わったのかわからんので思い当たる節があったら教えてほしい
0960デフォルトの名無しさん2015/11/24(火) 22:54:27.18ID:AGfVRi14
んー差し替えたのホントにそこだけ?
0961デフォルトの名無しさん2015/11/24(火) 23:32:05.85ID:RCu8tHgV
本当にこの一文というか「=0」の二文字だけっす
ポインタの使い方が正しくないだけならともかく同じ意味のはずなのに動作自体が変わるのはおかしいなあと思って
0962デフォルトの名無しさん2015/11/24(火) 23:34:08.02ID:ORfHMd4J
printfデバッグできるような状況でもないのかしら
0963デフォルトの名無しさん2015/11/24(火) 23:57:41.51ID:XeCWO9iV
>>961
せめてどう変わったのかを教えて欲しい
0964デフォルトの名無しさん2015/11/25(水) 00:04:51.49ID:KJ2R+Cik
nullptrでいいやん
0965デフォルトの名無しさん2015/11/25(水) 02:10:04.22ID:VZbixYb2
>>962
>>963
関数の頭にこれを書いたのですが、
起動時に一度だけ0で初期化して、以降は関数内で値を保持し続けるという(静的変数にしてほしい)挙動をするのは
static int* p;
の方

static int* p=0;
だと関数を呼び出したときにたまにp=0を実行し直しているような挙動をするようです
0966デフォルトの名無しさん2015/11/25(水) 07:18:22.03ID:YbqZzFFd
>>965
規格上の呼び方は知らんけど、C++のstatic変数の初期化のタイミングは、その宣言文が初めて実行される時と思えば良い。
宣言文が実行と言うのもおかしな表現だが。
0967デフォルトの名無しさん2015/11/25(水) 09:53:50.83ID:VZbixYb2
>>966
ありがとう、でもstaticの機能については理解しています(staticの仕様について質問していると勘違いされそうなので具体的な挙動の違いを書くことを渋っていた)
聞きたいのは
static int* p
と
static int* p=0
で現に挙動が変わるのでこの宣言は何が違うのかということ
0968デフォルトの名無しさん2015/11/25(水) 10:53:08.74ID:HI8L8hd9
static変数はコンパイル時に初期化されると信じてた俺、涙目 。・゚・(ノД`)・゚・。
0969デフォルトの名無しさん2015/11/25(水) 11:21:25.99ID:Sra0FKsR
コンパイル時に初期化は勘違いもはなはだしいろう・・・
プログラム起動時の間違いかな
0970デフォルトの名無しさん2015/11/25(水) 11:28:54.79ID:n/g2lh6I
>>967
コンパイラは何使ってる?
試しにclang++ -S 1.cc -o 1.S -O0でアセンブリレベルで比較したりしたけど
全く同じコードになってたよ。
gccでも同じコードになった。

>>968
コンパイル時に初期化ならconstexprだな。
実行時には書き換えできないけど。

グローバルなstaticはmain関数実行前に初期化(但し初期化に依存関係がある場合に正しく処理するとは限らない)
関数内のstaticは関数が初めて実行される時に初期化(しかもスレッドセーフ)
0971デフォルトの名無しさん2015/11/25(水) 16:47:14.43ID:YbqZzFFd
>>967
それで、コードが変わると思えないけどな。
Cのつもりでロード時に初期化されてる事を仮定してなんか変な事やって、違うとの主張だと思ったわけ。

アセンブリリスト出力してみなよ。
09729592015/11/25(水) 18:32:33.40ID:sLdr6t9m
http://www.dotup.org/uploda/www.dotup.org624170.png
アセンブリコード出力してみました
微妙にpが呼び出されるタイミングが違っていて(何がどう影響しているのか全くわからんが)ここのせいで挙動が変わっているらしい
全く同じではないということがわかったのは収穫だけど、アセンブリコードについては詳しくないのでこの違いがどう響いているのか俺にはわからぬ

環境はVisualStudio2013です
0973デフォルトの名無しさん2015/11/25(水) 19:10:36.24ID:n/g2lh6I
>>972
なんとなくだけど、左右逆じゃね?

そして、左右があってるとすればstatic int* p = 0;が
実は0で初期化されてないコードを吐いてる。
0974デフォルトの名無しさん2015/11/25(水) 19:48:32.79ID:HmIgiY2q
>static int* p=0

これ、意味的には初期化だけど、言語仕様的には初期化じゃなく代入に過ぎないからコードが変わるのは当たり前じゃね?
0975デフォルトの名無しさん2015/11/25(水) 20:31:14.13ID:pS65oVmN
は?
0976デフォルトの名無しさん2015/11/26(木) 08:58:30.65ID:4oXn5tau
どこかで
#define static
とかしてんじゃない?
0977デフォルトの名無しさん2015/11/26(木) 09:02:13.03ID:GuU354a3
動きの通りでいいんじゃない
関数内に書いてるんだったら
先(左)のは関数に入ってからゼロクリア
後(右)のはメモリ領域確保時に暗黙の初期化でしょ
0978デフォルトの名無しさん2015/11/26(木) 12:21:05.77ID:Utv/2Onf
>>973
もう一回試したけど左右はあってる

>>976
ライブラリはDxLibだけ使ってるけどそんな変な仕様が入っていることはない……と思う

>>977
原因はよくわからんが結果はそんな感じなんすかね
0979デフォルトの名無しさん2015/11/26(木) 13:24:13.56ID:GuU354a3
>>978
原因わかりきってるじゃん
書いた通りに動いてるだけだよ
関数内の最初で代入するなら関数呼ばれる度に代入するんだから
暗黙の初期化がコンパイル時の最適化によって削除されるだけ
0980デフォルトの名無しさん2015/11/26(木) 14:31:41.55ID:w6z7subU
>>978
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が成り立った状態でその行を抜けなければならず、
しかももし代入が行われるのであれば、その代入はただ一度だけ行わなければならない。
そういう訳で、
>>979の
> 関数内の最初で代入するなら関数呼ばれる度に代入するんだから
この解釈は間違い。

一方で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)
つまりバグバグだって事だな!
0981デフォルトの名無しさん2015/11/26(木) 16:20:53.10ID:FOlz1cOR
関数内の初期値あり静的変数が関数コールの度に初期化されてたら意味無いだろ
0982デフォルトの名無しさん2015/11/26(木) 20:05:34.37ID:1UotzJYh
>>980
その、Uninitialized data って初期化子で明示的に初期化されない変数(オブジェクトファイルに初期化データが無い)が配置されるところ。
ロードされた時(少なくともエントリポイントに制御が移る前)には0になってる。

こっから先はエスパーだが、
static int *p;の領域を壊している可能性が高い。
static int *p = 0;の時はC++の流儀で初回に0が代入されてバグが隠蔽される。
0983デフォルトの名無しさん2015/11/27(金) 01:14:50.60ID:Bpp9Chxs
>>982
ふーむ
今cygwin/gccで__attribute__((section(".bss")))してでっかい未初期化の配列作って表示したりしてみたら
確かに0で初期化されてた。

ELFの.bssだとプログラム実行時に0で初期化されるってきちんと書いてあるんだけど、
PE/COFFの.bssにはそれが書いてないから怪しく思えたのよ
0984デフォルトの名無しさん2015/11/27(金) 01:38:40.76ID:A7JAVQ0/
いままでLinuxの32bit環境想定で作られたツールを、マシンをx86_64化したのにあわせて
64bit環境にmakeしなおしてます

が、一部のソースは、構造体とかで32bit環境前提で作ってあったり、リンクするライブラリが
32bit環境のものしかない等の理由により、それらのツールはgccに「-m32」オプションを
つけて、32bit環境のバイナリを作らせています

オプションは、ツール用のMakefileに「-m32」を入れてるのですが、しかしたまにソースを
流用する時、32bit専用ソースを誤って64bit環境にソースに混入させてしまう場合が
あることから、32bit環境でコンパイルさせるようにできないかと思ってます

#pragma とかで、そういうチェックや指定はできるのでしょうか
0985デフォルトの名無しさん2015/11/27(金) 02:15:31.97ID:mzBGejrM
>>983
書いてあるが。
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が発狂しているという事すら考えつかないのか?
0986デフォルトの名無しさん2015/11/27(金) 02:28:22.31ID:mzBGejrM
>>984
static_assert
ないなら
struct foo {int foo[sizeof(void *) == 4 ? 0 : -1];};
0987デフォルトの名無しさん2015/11/27(金) 02:36:02.76ID:Bpp9Chxs
>>985
「PE/COFFの仕様書には」.bssがプログラム実行時に0で初期化されるか否かが書かれてないって話。
参照すべき資料はそいつではなく>>980の方。

> それ以前に.bssに置かれた変数が0でないなら、MSがpeを採用した時から
> 世界中でPGが発狂しているという事すら考えつかないのか?
.bssがきちんと初期化されないならされないで、Cがそれを未初期化なstatic変数の場所として利用しなければ
発狂しないんじゃないかい?
mallocがゼロクリアされないからって誰も文句言わないだろう?

>>984
コンパイルが通らなくなりゃそれで良いのであれば
static_assert(sizeof(ptrdiff_t) != 4, "error!");
かな。
0988デフォルトの名無しさん2015/11/27(金) 02:49:14.81ID:mzBGejrM
>>987
1 C/C++の規格で0に初期化されることは要求されている
2 世界中で発狂していない
しかし、
> MicrosoftのPE/COFFの仕様書によると、このBSSセクションは以下の通り、初期化されないデータが置かれる事になってる。
と書かれている。バグだ!!!
と騒いだ道化は誰でしょう?
0989デフォルトの名無しさん2015/11/27(金) 07:36:06.42ID:A7JAVQ0/
>>986
>>987
回答ありがとうございました
コンパイルが通らなければ、それで気づくと思うので、その方法を試してみます
0990デフォルトの名無しさん2015/11/27(金) 08:46:01.27ID:Bpp9Chxs
>>988
誰でしょう?私です

しかし初期化すべきデータをBSSセクションに置かないという選択をCコンパイラ作者が行ったなら
BSSセクションの中身が実際に初期化されるか否かに関わらず
世界中で発狂するような事態には決してならない、というのも正しいよね?
0991デフォルトの名無しさん2015/11/27(金) 10:56:30.92ID:mzBGejrM
> あのアセンブリリストが正しいなら、
> static int* p = 0;
> と書かれた場合にpの実体はBSSセクションに置かれる。
と仮定した上で、
> MicrosoftのPE/COFFの仕様書によると、このBSSセクションは以下の通り、初期化されないデータが置かれる事になってる。
と書かれている。バグだ!!!
と騒いだ道化は誰でしょう?
0992デフォルトの名無しさん2015/11/27(金) 12:38:32.96ID:K1Tb93fe
もう直ぐ、ニューヨークも日経も暴落します。

紅白歌合戦なんてやってられない阿鼻驚嘆の地獄絵図です。皆さんも、現金、食料の準備をしてください。

リーマン超える不況

世界貿易の「体温」を示すといわれる海運運賃指標、バルチック海運指数が1985年の統計開始以来、過去最低を記録した。
http://richa rdkoshimizu.at.webry.info/201511/article_190.html


                        日本から始まる世界的株式市場の大暴落

      , - ―‐ - 、
     /         \    終いには政府にも支えることができなくなり、日本がアメリカ国債の25%を引き出すと世界経済が破綻します。
    /    ∧ ∧  ,   ヽ    それが最終的な暴落であることがはっきりするや否や、マイトレーヤは出現するでしょう。彼は「匿名」で働いております。
   ./  l\:/- ∨ -∨、! , '
  / ハ.|/          ∨|,、ヘ     最初になくなるのは世界の株式市場でしょう。彼らは世界を餌にして生きており、何も還元しません。
|ヽ' ヽ     >  <    ノ!       マイトレーヤは次のように言われる――かれらは自分の財産を隠し、犯罪的雰囲気さえも創出している。            ×竹中&小泉  ←懲役?
〈「!ヽハ._    __    _.lノ 
 く´ \.)    ヽ. ノ   (.ノ        政府の第一の義務は、人々を食物で養うこと、そして最後に防衛です。国民の意志を裏切ると、自殺につながる。      ×黒田&安倍  ←自殺?
  \ `'ー-、 ___,_ - '          マイトレーヤは原発の閉鎖を助言されます。多くの人々が核の汚染の影響で不必要に死んでいます。             ×東電&中曽根 ←死刑?
    ` - 、 ||V V|| \
       | ||   || l\          マイトレーヤが公に現れるにつれて、UFOが姿を表すでしょう。彼の最初の控えめな態度に混乱してはならない。
     / ″         \
(((  /  まる子れーや \     世界平和の脅威は、イスラエル、イラン、アメリカです。イスラエルの役割は跪いて、パレスチナに許しを請うことです。
    ̄ \_ \ /_/
0993デフォルトの名無しさん2015/11/27(金) 12:56:38.04ID:zp6Snri4
http://lobby.xyz

ネットのロビイスト求む!

コネクションボックス ロビーに

ご参加ください
0994デフォルトの名無しさん2015/11/27(金) 13:21:19.81ID:mzBGejrM
COFFの.bssに置いて開発者が発狂した一例
http://processors.wiki.ti.com/index.php/Uninitialized_Static_Objects_Not_Set_to_Zero_in_COFF
でも、こんなことはWindowsでは起こっていない。
0995デフォルトの名無しさん2015/11/27(金) 15:01:12.76ID:NfVJ1pe2
ID:mzBGejrM は鼻につく言い方(書き方)しかできないのか?
0996デフォルトの名無しさん2015/11/27(金) 16:42:50.48ID:47yXVFDW
日常生活のストレスからくるもんだろ
哀れんでおけばいい
0997デフォルトの名無しさん2015/11/27(金) 18:18:55.82ID:mzBGejrM
>>995
ウソを垂れ流す>>980の方が良いとでも?
0998デフォルトの名無しさん2015/11/27(金) 20:05:22.54ID:hBuCorfy
相手が悪いからって自分が悪いことしていい理由にはならないんやで
0999デフォルトの名無しさん2015/11/27(金) 20:57:16.73ID:mzBGejrM
正確か否か
それ以外の評価は意味なし

バカにはそれがわからないようだ
罵られたくなかったら、でたらめなレスをする前に一週間くらい、無い知恵振り絞って考えろ
1000デフォルトの名無しさん2015/11/27(金) 21:26:45.46ID:yIQF9FHR
さぞ辛いことがあったんだね
ここではいくらでも見栄張って自分を主張していいのよ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。