C++相談室 part132

■ このスレッドは過去ログ倉庫に格納されています
2017/10/10(火) 00:11:34.01ID:nc/5PI4P0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part131
http://mevius.2ch.net/test/read.cgi/tech/1501295308/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.101【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1500329247/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/11/05(日) 11:05:07.65ID:3uuR82Hq0
>>398
> constとは定数ですよ。
残念ながら違う
class c {
private:
 const int n;
public:
 c(const int x): n(x){}
 ...
}
なんてことができる
2017/11/05(日) 11:16:27.20ID:+AqtjiW/0
>>402
そんな本は存在しない。
2017/11/05(日) 11:25:28.59ID:edJGSUmw0
メンバーイニシャライザの構文は必要悪
だとは感じる

基底クラスやconstメンバの初期化構文が別途必要だったというのは必要悪ながら必要性がワカルが
その他のメリットはあんまはっきりしない
406デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 11:38:09.47ID:vRj0Z3ir0
>class c {
>private:
> const int n;
>public:
> c(const int x): n(x){}
> ...
>}
>なんてことができる。

 定数ではなくて、変更禁止の変数ってことだね。それにどれだけ意味があるんだろう。
イニシャライザ―でしか変更できないんでしょ。クラスを生成したときにしか設定できない変数になる
から、定数と同じ機能しかないよ。
const int n = 9600;って書く方が分かりやすい。

しかし別のインスタンスを生成する時は
c rs(115200);みたいに初期値を変更したい場合がある。これを実現できるのはイニシャライザ以外にはないってことか。
なるほど。
全く意味がないってことはないな。たしかにメリットはある。
2017/11/05(日) 11:46:35.42ID:8p1KlMD80
目醒ましたら香ばしいのがおるなあ
408デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 11:49:30.00ID:vRj0Z3ir0
結論を変更
メリット1:クラスのインスタンスごとにconst指定のメンバ変数のユニークな初期化ができる
メリット2:const指定のメンバ変数はユニークに設定できるにも拘わらずコードをまったく消費しない。
2017/11/05(日) 11:50:18.72ID:brx6OlnVM
>>405
まあ構文はわかり辛いよな
int n; で定義してるのに : n(1) とかはあ?って感じだし
かと言って c(): n = 1 {} って言うのもなれてないせいかいまいちだしね
410デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 12:04:33.48ID:vRj0Z3ir0
コンストラクタの構文があるんだから並置してつくるべきだね。
たとえはこんな感じだ。
class cass {
private:
 const int n;
public:
 cass(const int x){}
cass{ n = 9600 }
 ...
}
411デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 12:06:36.32ID:vRj0Z3ir0
~cass()があるんだから
!cass()でもいい。
412デフォルトの名無しさん (スップ Sd62-3K0w)
垢版 |
2017/11/05(日) 12:25:46.31ID:bjKo+Lyid
>>406
> const int n = 9600 って書く方が分かりやすい

C++のconstは、ユーザー入力など実行時に決まる値に固定化した変数を作れる
2017/11/05(日) 12:29:36.35ID:uz/X8WP/M
>>410
こいつはコンストラクタを複数持てることも知らんのか...
マジで初心者スレに行けよ

【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.2ch.net/test/read.cgi/tech/1509780815/
2017/11/05(日) 12:31:24.75ID:uz/X8WP/M
>>412
そう言う意味ではC#のreadonlyの方が近い感じだな
415デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 12:58:59.38ID:vRj0Z3ir0
>C++のconstは、ユーザー入力など実行時に決まる値に固定化した変数を作れる

実行時は無理でしょ。インスタンス生成時でしょ。見かけ上実行時にインスタンスを生成することで
可能というだけですよね。
416デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 12:59:54.85ID:vRj0Z3ir0
>こいつはコンストラクタを複数持てることも知らんのか...

オーバーロードってことかな? イニシャライザとはなんも関係ないね。
417デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 13:00:39.74ID:vRj0Z3ir0
>あと組み込みを前提に考えるのもやめとけ。

C++は組み込みにしか活路がない。というか組み込みに特化すべきだと思う。
PCの場合はJavaとかC#の方が圧倒的にいいからね。

組み込みにCではなくてC++を使うべき最大の理由は?
最大のメリットはScopeが使えることだと思う。NameSpaceとかブロックとかだね。
まあClassの基本構造もスコープを制限できるという意味では含める。これらを使うだけでも
価値がある。

Cでは少しプログラムが大きくなると名前付けで混乱してくる。多少はコード効率が落ちてもC++の方がいい。
C++はすでに化石かと思っていたがなかなか使えそう。
2017/11/05(日) 13:07:42.41ID:CS19J9ATM
普通にデータベースとかC++で書かれてるが…
2017/11/05(日) 13:12:57.94ID:PxmV+gVs0
多分パフォーマンス重視のソフトとか一つも知らないんじゃね
2017/11/05(日) 13:15:03.92ID:+AqtjiW/0
速度が要求される用途ということは、アセンブラの代替としての言語なのだ。

高級言語志向の奴はKotlinでも使ってろ。
2017/11/05(日) 13:17:22.43ID:PxmV+gVs0
C++で数百万行になるプロジェクトをアセで書けと?
422デフォルトの名無しさん (スップ Sd62-3K0w)
垢版 |
2017/11/05(日) 13:18:14.72ID:bjKo+Lyid
>>415
たとえばインスタンス生成時のシステム時刻をconst変数にセットするとする。
これを実行時と呼ばずになんと呼ぶんだ?
2017/11/05(日) 13:31:02.52ID:kyKiHR5g0
メンバイニシャライザって、基本だろ。
初期化と代入は異なるから、マシン語も異なるし、効率的

君らは、実行ファイル中の、BSS セクションとか、
異なるセクションのデータが、異なるマシン語になる事も、知らんのか?
2017/11/05(日) 13:47:24.79ID:+AqtjiW/0
もはやマシン語がバズワードに見える
425デフォルトの名無しさん (スップ Sd62-3K0w)
垢版 |
2017/11/05(日) 13:47:40.95ID:bjKo+Lyid
>>423
そんなのはプロでもなきゃあまり知らないんじゃない?
426デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 13:52:54.16ID:vRj0Z3ir0
>たとえばインスタンス生成時のシステム時刻をconst変数にセットするとする。
>これを実行時と呼ばずになんと呼ぶんだ?

クラスを起点で説明するときには、実行時というのはクラスインスタンスのメソードを実行したり
プロパティにアクセスする時が実行時だね。
インスタンス生成時とは区別したほうが分かりやすい。
クラスは大まかには
1.生成して
2.実行して
3.消滅する
というサイクルがある。
constは生成時にしか設定できない。
427デフォルトの名無しさん (スップ Sd62-3K0w)
垢版 |
2017/11/05(日) 13:59:00.72ID:bjKo+Lyid
>>426
少なくともC++においては実行時とは「コンパイル時」に対比する言葉だ。
「クラスを起点に説明する」なんて知らんがな
独自定義か?
2017/11/05(日) 14:41:08.77ID:3uuR82Hq0
>>415
> 実行時は無理でしょ。インスタンス生成時でしょ。見かけ上実行時にインスタンスを生成することで
> 可能というだけですよね。
見かけ上?
意味わからん
インスタンス生成時=実行時なんだが w

>>416
オーバーロードしたコンストラクタ毎に異なる初期値を与えられるんだが>>410の構文でどうやって実現するつもりなんだよ w
2017/11/05(日) 14:59:59.34ID:NfAeb+vj0
メンバイニシャライザの構文、
class Aclass {
public:
 Aclass(int val) : _member(val) {}
...
}
の評判が悪いけど、C++11から使えるようになった{}初期化なら
いくらかマシじゃないかな。
class Aclass {
public:
 Aclass(int val) : _member {val} {}
...
}

メンバに初期値を与える部分が関数呼び出しに見える、
という事態は解消されてるかと。
2017/11/05(日) 15:13:21.78ID:edJGSUmw0
>>409
なんでそのnのケースで構文を新たに作る話になりますか…
2017/11/05(日) 15:37:01.01ID:U5vPVsbz0
お前ら
T t(args);
って形の初期化付き変数宣言使ったことも見たこともない素人ばかりかよ...

インスタンスとクラスの違いも知らずに他人と話そうとする迷惑な人もいるし。
2017/11/05(日) 15:40:38.86ID:+AqtjiW/0
自虐ネタするときはひろしですって言ってください。
2017/11/05(日) 15:47:09.77ID:3uuR82Hq0
>>430
ん?

> まあ構文はわかり辛いよな
って言う日本語を理解できない人なの?
434デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 16:23:38.88ID:vRj0Z3ir0
>オーバーロードしたコンストラクタ毎に異なる初期値を与えられるんだが>>410の構文でどうやって実現するつもりなんだよ w

ass():{ assmember = 12; }{
....
}
ass(int you ):{ assmember = 99 }{
....
}
2017/11/05(日) 16:32:02.93ID:3uuR82Hq0
>>434
しれっと>>410の構文変えてどうするよ w
>>410の時点じゃ知らなかったんだろ?
436デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/05(日) 16:34:19.30ID:vRj0Z3ir0
知らないでもすぐにまともな構文が考え付くというのに、わざわざ仕様を変更したというのに
またしてもろくでもない構文とは、どういうことだ。
437デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/05(日) 16:38:07.45ID:qHZ+DCMx0
こんな浅い思いつきだけで喋ってるやつによくつき合ってるな
2017/11/05(日) 17:21:19.00ID:edJGSUmw0
>>433
> まあ構文はわかり辛いよな
という国語はわかったつもりだったが>>409のような変態構文の追加提案に至る必然性がわからん…
そのケースならコンストラクタ内でn=1でええやん?

なお初期化と代入は違うという意見は
コンパイラのコピコン呼び出し回数削減最適化を前提とする限り、
あんまメンバ初期化構文の支持理由としては弱いかなと、(いうのが元レス>>405
439デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/05(日) 17:33:27.29ID:qHZ+DCMx0
>>438
コピー出来ないクラスはどうすんだよ。コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか?
2017/11/05(日) 17:35:00.88ID:3uuR82Hq0
>>438
>>409の構文にケチをつけたいだけなのはわかったよ
2017/11/05(日) 17:42:24.41ID:3uuR82Hq0
>>439
> コピー出来ないクラスはどうすんだよ。
const 云々言ってるなかで>>438みたいなレスする程度の理解力だから許してやれよ w

> コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか?
C#のreadonlyはそんな感じだな
2017/11/05(日) 17:44:56.54ID:edJGSUmw0
>>439
まあYESということもできる

クラスFooのメンバm_a (∈クラスT)は、Fooのコンストラクタ実行前に構築されているはずはないのだから
 m_a = (some クラスTのオブジェクト)
というのがコンストラクタ内に現れたら、むしろそれを代入と解釈するわけにはいかない
すわなち話がただちにコピコンの出番に絞られる
2017/11/05(日) 17:53:44.93ID:edJGSUmw0
>>441
ちょっ漏れもconst云々は>>405で言及済みなんだがガン無視カヨ
何でも俺の仕業かよ…

>>440
いや新たな構文の追加提案自体の罪を問いたい
>>405の通り、基底クラスとconstメンバの初期化については現行のメンバ初期化構文は必要悪なんであって、
それ自体は全否定まではしないが、
基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!?
というのが漏れのスタンス
2017/11/05(日) 17:58:22.61ID:edJGSUmw0
まあ漏れの案の欠陥としては、
コンストラクタ内でthisを他の関数bar()(すでにコンパイル済みかもしれない)に渡して
barの中でthis->m_aに代入するのはどうなんじゃ、というのはあるが
(C#はこの点現行C++と同じ実行時コストを支払っているハズ…
 つまりデフォルトコンストラクタでFoo::m_aを構築した状態でコンストラクタに入る
2017/11/05(日) 17:59:06.73ID:3uuR82Hq0
>>443
> 基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!?
お前がそう思うのは勝手だが、わざわざ用途毎に構文を分けるのは悪手だろ
って言うだけのこと
2017/11/05(日) 18:10:51.69ID:edJGSUmw0
スマン>>444の末尾2行は抹消
C#はオブジェクトを参照型でしか扱わないから、明示的にFoo::m_aに対して
どっかで明治t系にnew T()を書かねば何も起きないから、書かなかった場合の実行時コストも糞も無い
447デフォルトの名無しさん (ワッチョイ 417f-dVlt)
垢版 |
2017/11/05(日) 18:14:02.62ID:XS4+4qja0
↓structもあるとか言い出すアホ
2017/11/05(日) 18:31:44.21ID:edJGSUmw0
いやすまん>>442の方針にはまだ欠陥があったわ;
Foo::Foo() {
 m_a = 1; // (1)
 m_a = 2; // (2)
}
と書いた場合、(1)は>>442の方針でm_aの初期化とみなすことはできるが(2)をどう解釈すべきか曖昧になる
やっぱメンバの初期化はコンストラクタ本体実行前に1回だけ行われるようにする現行メンバ初期化構文の方がスマートじゃわ;;

というわけで完全に自己解決しますた!
449デフォルトの名無しさん (ワッチョイ 6e3e-cSXK)
垢版 |
2017/11/05(日) 18:57:45.52ID:rSDVGL6P0
しっかし「漏れ」って久々に聞いたぞ。
2017/11/05(日) 19:58:56.84ID:miuEyx390
黎明期からROMやっててUNIX板の騒動を解決した御仁もいるんだろ
2017/11/05(日) 21:08:22.04ID:g4RG1qZKM
>>361
<<を使ったフォーマットだと語順を簡単に変えられなくて翻訳対応しづらいという問題もある。
2017/11/06(月) 04:26:03.89ID:2+QNBq450
なんか、相談室じゃなく、テクニックを披露し合って
自慢ごっこスレになってるな。

初心者は入れないし、もし書いたら、さげすむばかりだし。
本当に自慢ごっこスレだな。

おまえらだって、最初はなんにも知らなかった・わからなかったのに。

ちょっとわかる様になったら、自慢ごっこだな。

本当にわかっている人は、簡単な言語で良いソフトを作っているよ。

テクニック自慢ごっこはやめれ。
2017/11/06(月) 05:16:27.05ID:gbsDrhzw0
テクニックでもなんでもない
「c++知らない人の考えた正しいc++論」なんか要らんってだけ
2017/11/06(月) 05:26:32.69ID:BSAOW8np0
煽れば答えを教えてくれると思ってるとでも思ってるのかねぇ。
まともな人はスルーするだけだし、テキトーに答える人がいてそれにかみつく人がいて荒れるいつもの流れ。
2017/11/06(月) 05:30:04.94ID:BSAOW8np0
>>454
思ってるとでも思ってる→とでも思ってる
orz
2017/11/06(月) 05:52:30.70ID:YMdKjlXe0
visual studio comunity 2015のc++で下記コンソールプログラムを実行すると
「0x73AD36A8 (tmmon.dll) で例外がスローされました (ConsoleApplication1.exe 内)
: 0xC0000005: 場所 0x0058F180 の読み取り中にアクセス違反が発生しました」
というエラーが出て停止するんだけど、原因が分かったら教えてください
ちなみに、コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラーが出ます
tmmon.dllというのはウィルスバスター関係のソフトらしいので、もしかしたらそちら側の不具合かもしれないけど

#include <iostream>
#include <conio.h>
using namespace std;

#define num 5000

class CLASS_A {
};

int main()
{
CLASS_A** ppa = new CLASS_A*[num];
for (int i = 0; i < num; i++)
ppa[i] = new CLASS_A;

for (int i = 0; i < num; i++)
delete ppa[i];
delete ppa;

cout << "hit any key!" << endl;
char ch = (char)_getch();
return 0;
}
2017/11/06(月) 05:59:29.00ID:7ntrKCQE0
ステップ実行してどこで落ちてるか検証するべし。
これくらいのコードならおえるでしょ。
2017/11/06(月) 06:01:06.59ID:662yk6z20
少なくともdelete ppa; はdelete[] ppa; じゃなくちゃダメだろ
2017/11/06(月) 06:06:20.61ID:pcHZ0AZV0
C++のクラスのコーディングをCで表現しようとするとどんなコードになる?
2017/11/06(月) 06:11:23.92ID:7ntrKCQE0
structで関数ポインタ持たせるとかあるけど。
変換規定はない。
2017/11/06(月) 06:31:31.92ID:YMdKjlXe0
>>457
エラーが出るのが
return 0;
の後なので、ステップ実行してもよく分かりませんでした

>>458
なるほど、忘れてました
でも付けてもエラーは出るみたいです

トレンドマイクロの方に問い合わせしてみたほうがいいですかね?
462デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/06(月) 07:31:40.53ID:z+KG8ZZn0
>>453
ほんこれ。
例の人のどこに初心者だから教えてくれという要素があったというのか。
2017/11/06(月) 08:03:49.75ID:FJG0yfiKd
>>460
賢い
関数ポインタに関数のアドレスを突っ込むタイミングは構造体初期化のタイミングだろうか?
464デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/06(月) 08:23:52.67ID:Z84gcoL/0
>>456
そのコンパイラのバグだろ。他の系でやってみたらいいと思う。問題ないはずだ。
自分の脳内コンパイラでもOKだ。
2017/11/06(月) 09:14:29.24ID:7ntrKCQE0
>>463
コンストラクタ関数を必ず持つようにするとかね。
Hoge h = constructHoge(...);
2017/11/06(月) 09:20:09.45ID:6kMDcvlvr
>>456
>(tmmon.dll) で例外がスローされました

よくあること
Windowsだったらスタートメニューからメンテナンスツール(普通の管理画面ではない)を起動して
モジュールの全アンロードすると起こらなくなる
2017/11/06(月) 09:48:56.37ID:YMdKjlXe0
>>464
エラーについて検索していたら、こちらのページにVisual studio 2017のdenev.exeと自作アプリの置いてあるフォルダを
ウィルスバスターの例外設定に追加して様子を見るようトレンドマイクロから回答されたという人がいたそうです。
私の場合は2015なので、とりあえず自作プログラムのフォルダを例外設定に追加したところエラーが出なくなりました。
なんか根本解決になっていないような気もするけど、とりあえずこれで様子を見てみます。

http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&;no=4148

ちなみに今気づいたのですが、エラーが出るのはVisual studio 2015のIDE上から実行したときだけで、
プログラム単体で実行したときはエラーは出ないようです。

回答してくださったみなさん、ありがとうございました
2017/11/06(月) 09:51:12.88ID:YMdKjlXe0
>>466
ありがとうございます
>>467の方法でとりあえず解決しました
469デフォルトの名無しさん (ワッチョイ c29d-SaAB)
垢版 |
2017/11/06(月) 10:48:41.89ID:Z84gcoL/0
#include <boost/pool/pool_alloc.hpp>
サンプルをテスト使用としたらTIのCCSにはこのあたりのライブラリがないんだが、このライブラリって
古いのだろうな? 
boost::fast_pool_allocator<int> とかをテストしたいのだが、新しいライブラリはどれになるんだろうか?
2017/11/06(月) 12:11:13.49ID:FN/Llmne0
>>461
メモリリークだろ

メモリを解放せずに、アプリを終了してるとか?
2017/11/06(月) 12:13:38.44ID:FJG0yfiKd
>>465
C++ならできるだろうけどCだとできる...?
2017/11/06(月) 21:05:16.36ID:7ntrKCQE0
>>471
https://ideone.com/ZfcWrq
こういうイメージだな。
C久々に触ったわ。メモリ回りはおまじないが多いのでこわいよ〜。
2017/11/06(月) 21:12:28.45ID:MXn0CmOw0
>>472
どうしても記法を再現しようとするとそうなるだろうけど、
メモリを無駄にして割に合うのかっていうとだいぶん疑問ではあるよな。
2017/11/06(月) 21:14:53.41ID:7ntrKCQE0
>>473
まぁ、折衷案で関数群とデータで分けるとかね。
一応継承紛いなこともできなくないし。
2017/11/06(月) 22:45:43.65ID:r9+CDuOfM
>>471
glibを真似たらいいよ。
476デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/06(月) 22:51:39.40ID:z+KG8ZZn0
記法を似せたいだけならともかく、関数ポインタを使うところはC++でいうところのvirtual functionでそれをクラスのIFとするのはC++でもめったにやらんわな。
2017/11/06(月) 23:44:50.11ID:SClVOYaP0
COM(Component Object Model)はC++及びCでバイナリ互換のオブジェクトを作ることが出来る
vtblの配置は言語仕様上は定められていないが、MSがCOM(OLE2)を実装するにあたって定めた配置にしている処理系が殆どだ
2017/11/07(火) 02:44:04.83ID:5kOZtFPy0
BisonでC語風の言語作ってるのですが、代入の構文が衝突してしまい困っています。
bison.yy: conflicts: 5 shift/reduce

*の回数を記録、Identifier = expression という構文を作りたいのですが、いい方法ありませんか?
*の検出はC語風のポインターを使うための処理です。

assignList :
assign {$$=new StatementAssignList($1);}
|assignList assign {$$=$1->add($2);}
;
assign :
Identifier '[' expression ']' "=" expression {$$=new StatementAssignVariable($1,$3,$6);} // 変数に代入:名前[式]=式;
| Identifier "=" expression {$$=new StatementAssignVariable($1, 0,$3);} // 変数に代入:名前=式;
| "*" {$$=new StatementAssignPtr();}
;
class StatementAssignList : public Statement{
public: std::vector<Statement *>m_list;
~StatementAssignList(){for(auto &p:m_list) delete p;}
StatementAssignList(Statement*pStatement){m_list.push_back(pStatement);}
StatementAssignList *add(Statement *pStatement){m_list.push_back(pStatement);return this;};
}
現在は、m_listで、StatementAssignPtr()の個数を調べてStatementAssignVariableの処理につなぐことを考えてます。
2017/11/07(火) 04:38:27.99ID:PQkUnwQq0
>>478
expressionがどうなってるのか知らないけどその文法だと
a=expr * a=expr * *
みたいに書けてしまうけど良いのか?
「左辺に書けるもの」を分けて整理すべし
C言語風ならC言語の文法を参考にしてもいいと思うけど
2017/11/07(火) 05:07:39.94ID:5kOZtFPy0
アドバイスありがとうございます。
expressionは、 =禁止していますので、a = expr*a=expr * * は出来ないようにしてます。
手動で*の数を記述してみたのですが、conflicts: 3 shift/reduce となって混乱してます。
こんな感じ。。StatementAssignVariable()の第一引数を *の数にして実験。
statement :
Identifier "=" expression {$$=new StatementAssignVariable(0, 省略); }
| "*" Identifier "=" expression { $$= new StatementAssignVariable(1, 省略); }
| "*" "*" Identifier "=" expression { $$= new StatementAssignVariable(2, 省略); }
;
gcc 3はbisonのソース有ったので見たのですが、難解でしたorz
構文の設計ムズカシイ
conflicts: 3 shift/reduce無視しちゃっていいのかなぁ。。
481デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/07(火) 05:27:52.17ID:2eQgtTM30
> コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラー

スタック破壊の典型的な症状だな
2017/11/07(火) 07:17:12.36ID:PQkUnwQq0
>>480
いや、assignListはassignの1以上の繰り返しで、assignは
identifier [ expression ] = expression
identifier = expression
*
のどれでも良いのだからassignListは
a=b * a=b * * a[b]=c *
みたいにassignを自由な順番で書けてしまうよね?

おそらくexpressionに2項の乗算が入ってるでしょ
それでセミコロンで区切らない文法とか?
a = b の次に*が来たときに乗算の右辺を待つ状態へshiftするか、それともa=bをreduceして次の代入文へ移るかが曖昧なのだと思う
常にshift(乗算優先)が望みなら無視してもいいけど、 a=b *c=d (代入二つ)とは書けなくなるかな
2017/11/07(火) 09:38:50.61ID:Nwc3R7kX0
>>481
あれから少し調べてみたけど、クラスを使わない、このプログラムでもエラーが出ることが分かりました
またnumの値によっても変わるみたいで、このプログラムの場合はnumを3805まで減らすとエラーが出なくなります
(昨日のプログラムの場合は、また別の値だったと思うけど)
エラーが出るのはIDE上で動かした場合だけで、プログラム単体で動かした場合はエラーが出ないからIDEの不具合なのかな?
マイクロソフトに報告するべき?

#include <iostream>
#include <conio.h>
using namespace std;

#define num 5000

int main()
{
int** ppa = new int*[num];
for (int i = 0; i < num; i++)
ppa[i] = new int;

for (int i = 0; i < num; i++)
delete ppa[i];
delete []ppa;

cout << "hit any key!" << endl;
char ch = (char)_getch();
return 0;
}
2017/11/07(火) 09:48:51.30ID:Nwc3R7kX0
>>483
すみません、再確認したらnumの数を減らせば出なくなるというのは間違いです
ただ、出にくくなっているような気はするけど
2017/11/07(火) 16:23:51.40ID:5kOZtFPy0
>>482
再帰的下向きコンパイラ見たいな構造で、expressionに、乗算2つ入ってます。
%prec を排除して文法作ってましたが、曖昧な表現が衝突の原因っぽいですね。
文法修正してみます。ありがとうございました。

expression : term1 | expression "||" term1 {$$=省略;} ;
term1 : term2 | term1 "&&" term2 {$$=省略;};
省略 ...
term7 : term8 | term7 '+' term8 {$$=省略;}; term7 '-' term8 {$$=省略;};
term8 : factor
| term8 '*' factor {$$=省略;}
| term8 '/' factor {$$=省略;}
| term8 '%' factor {$$=省略;}
factor:
'-' factor {$$=省略} // -xxの時 NEGの処理
| '*' factor {$$=省略;} // *xxの時 ポインターの処理
| '(' expr '){ $$ = $2; } // ()
| func // 関数呼び出し
| value // 変数
| number { $$ = $1; }// 数値
;
2017/11/07(火) 21:03:50.18ID:t2a48+le0
>>477
C++ 用の宣言と C 用の宣言がマクロで分岐するようになってるのを読んだことが有るんだけど、
C++ で引数を参照で渡してるやつが C ではポインタになってて、
それってバイナリレベルでは互換性があるんだ〜と思ったことがある。
2017/11/07(火) 21:13:18.56ID:LIKWanez0
>>483
_getchあやしくね?
cin.get(); に変えてみたら?
2017/11/07(火) 21:59:05.61ID:5kOZtFPy0
>>483
試しにvs2015とvs2017で動かしてみたんですが、正常に動きますよ?デストラクタ確認でちゃんと動作してるみたいです。
ch = (char)_getch(); ってとこは書き換えて、getchar(); にしましたが。。

#include <iostream>
#include <conio.h>
using namespace std;
#define num 5000
void test1()
{
int ** ppa = new int *[num];
for (int i = 0; i < num; i++) { ppa[i] = new int; }
for (int i = 0; i < num; i++) delete ppa[i];
delete[]ppa;
cout << "hit any key!" << endl;
}
class MyInt { public:int n; MyInt(int i) :n(i) {}~MyInt() { printf("~MyInt %d\n", n); } };
void test2()
{
MyInt ** ppa = new MyInt *[num];
for (int i = 0; i < num; i++) { ppa[i] = new MyInt(i); }
for (int i = 0; i < num; i++) delete ppa[i];
delete[]ppa;
cout << "hit any key!" << endl;
}
int main(){
test1();test2(); //共に普通に動作確認済み
getchar();return 0;
}
2017/11/07(火) 22:01:54.27ID:aP9yM4om0
結論。Newすんな。ベクタ使え。
2017/11/08(水) 00:05:45.23ID:b+QUYReX0
伸び縮みしないんだったらunique_ptrで十分じゃん
2017/11/08(水) 00:17:24.11ID:NuL34q9d0
>>483
ウィルスバスターのdllでエラーならMSに言っても意味ないんじゃないか。
デバッガがアタッチされてるとウィルスバスターのdllがおかしなことして起きるってことじゃないの?
492デフォルトの名無しさん (ワッチョイ 4502-S32u)
垢版 |
2017/11/08(水) 06:08:53.08ID:Qxc+LNev0
ウイルスバスターが干渉しているっぽいなら
VirtualBoxでウイルスバスターのない仮想環境を作って
その中で動かしてみればええやん
2017/11/08(水) 06:30:19.02ID:pFtekju40
セキュリティソフトを動かしていたら、多くのアプリは、正常に動かない

多くのアプリの説明書に、そう書いてある
2017/11/08(水) 07:29:57.54ID:/yzKqtBG0
>>487 cin.get(); とgetchar() もやってみたけど同じでした

>>488 ウィルスバスターはインストールされているでしょうか?
エラーを出すのがウィルスバスターなので、ウィルスバスターの入っている環境じゃないと出ないようです

>>489 vector使ってみたけど同じでした。今までvectorってあまり使ったことなかったけど、これからはvectorを使うことにしよう
int main()
{
vector< vector<int> > ppa;
ppa.resize(5000);
for (int i = 0; i < 5000; i++ )
ppa[i].resize(20);

cout << "hit any key!" << endl;
char ch = (char)_getch();
return 0;
}

>>490 実際のプログラムでは伸び縮みします

>>491 そうですね、ウィルスバスター側の問題かもしれない。トレンドマイクロに問い合わせしてみようかな?

>>492 ウィルスバスターを終了した状態ではエラーは出ないことは確認しています
ただ、visual studioとウィルスバスターのどちら側に問題があるかは分からないけれども

>>493 そうですね、でもウィルスバスターを止めるわけにもいかないので

とりあえず、プログラムを最後まで実行させなければ問題ないので、IDEから強制終了することで対応しようと思います。
プログラム単体で実行したときはエラーは出ないので
2017/11/08(水) 08:02:44.81ID:pFtekju40
多くのアプリの説明書に、
「セキュリティソフトを動かしていたら、正常に動きません」

って書いてあるけど、何でだろ?
2017/11/08(水) 08:10:49.38ID:MA4CFapNd
多くのアプリがウィルスみたいなものだから
2017/11/08(水) 09:33:37.02ID:tfdQ3Vx70
セキュリティソフトは潜在バグを顕在化する事が往々にしてある
2017/11/08(水) 10:25:00.80ID:s/8N4dfn0
事情は知らんが開発中はウィルスバスター止めるとか>>467の方法で問題あるのか?
IDEから強制終了とかクソ面倒くさいことやってられんだろ
2017/11/08(水) 10:27:07.11ID:pfXJjTar0
OSの設定に干渉するようなモノはウイルス判定されることがあり得るでしょ。
それが善意かどうかなんて判定のしようがない。
2017/11/08(水) 10:29:43.39ID:s/8N4dfn0
もしかしてウイルスを作ってるのか?
501デフォルトの名無しさん (ワッチョイ 4980-VYVV)
垢版 |
2017/11/08(水) 12:29:57.54ID:/2nLdTDi0
>>499
ウイルス判定したならただクラッシュさせて放置じゃなくてアンチウイルスソフトとしての仕事しろよ。
ただウイルスバスターがクソなだけだろ。
2017/11/08(水) 13:26:26.66ID:xvDlz0If0
ウイルスと判定したわけじゃなくて、判定するために干渉した結果としてそうなる場合がある。
コンソールアプリを起動しようとした場合に、一旦サンドボックス的なものの中で起動させてチェックして
直後にあらためて普通に起動するというのを見たことがある。
今回の場合、そのコンソールアプリを起動している VS の状況と噛み合わなくなっているのだと思う。

チェックのために何かしら介入しなきゃならないのはしょうがないのだが、
泥臭い、クソみてぇなことの塊なので、まじめに検証するのアホらしいぞ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況