質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

6227閲覧

c++でのアセンブラの実装

a_tuya

総合スコア10

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/04/13 13:45

前提・実現したいこと

コンピュータシステムの理論と実装の本を参考にc++を用いて、簡単なassemblerを作っています。
int main()のなかでアセンブリファイルを開き構文解析を行い、writing_file<<acombin<<endl;やwriting_file<<ccombin<<endl;でバイナリファイルへと書き込んでいます。コンパイルはできたのですが、実行すると以下のエラーが出てしまい詰まっています。

発生している問題・エラーメッセージ

terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid Abort trap: 6

該当のソースコード

C++

1#include "./Code.hpp" 2#include "./Parser.hpp" 3#include <bits/stdc++.h> 4using namespace std; 5 6const string A = "A_COMMAND"; 7const string C = "C_COMMAND"; 8const string L = "L_COMMAND"; 9 10 11int binary(int bina){ 12 int ans = 0; 13 for (int i = 0; bina>0 ; i++) 14 { 15 ans = ans+(bina%2)*pow(10,i); 16 bina = bina/2; 17 } 18 return ans; 19} 20 21int main(int argc, char *argv[]){ 22 string filename_asm = argv[0]; 23 string filename_hack = argv[1]; 24 25 ofstream writing_file; 26 Parser parser(filename_asm); 27 writing_file.open(filename_hack, ios::binary); 28 29 for (int i = 0; i<parser.comSet.size(); i++){ 30 string commandtype = parser.commandType(); 31 if(commandtype==A||commandtype==L){ 32 string symbol10 = parser.symbol(); 33 string symbol2 = to_string(binary(stoi(symbol10))); 34 bitset<16> acombin(symbol2); 35 writing_file<<acombin<<endl; 36 } 37 else{ 38 string sdest=parser.dest(); 39 string scomp=parser.comp(); 40 string sjump=parser.jump(); 41 Code code(sdest,scomp,sjump); 42 string sdestbin = code.destbin(); 43 string scompbin = code.compbin(); 44 string sjumpbin = code.jumpbin(); 45 string sccombin = "111"+sdestbin+scompbin+sjumpbin; 46 bitset<16> ccombin(sccombin); 47 writing_file<<ccombin<<endl; 48 } 49 parser.advance(); 50 } 51 52}

試したこと

色々と調べてみた結果stringにnullを代入することによるエラーだと思い、怪しいと思う箇所を修正してみたのですが、エラーのままで困っています。このエラーが出た原因はこの解釈でいいのか、またエラーが出てる可能性が高い場所などがわかれば教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

エディタ:vscode

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majiponi

2020/04/14 02:11

プログラムを引数なしで起動していませんか? (argcのチェックは不要?)
a_tuya

2020/04/14 02:48

はい、引数は正しくつけて実行しています。
guest

回答1

0

std::logic_error が例外として投げられる状況というのは割と幅広いですが、 basic_string::_M_construct null not valid というメッセージがある以上は stringNULL を渡したとしか考えようがありません。

質問者の考え方で正しいと思います。

ポインタを扱っていれば NULL になる場合というのはよくあることなのでどこでそうなっているかというのはデバッガで追跡するか assert を入れまくって見つけるしかないでしょうね。

投稿2020/04/13 15:54

SaitoAtsushi

総合スコア5444

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a_tuya

2020/04/14 02:50

ご回答ありがとうございます。デバッガで追跡ひとまずデバッガで追跡してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問