-1

これを修正する方法や何が間違っていたのかわかりませんが、値を入力するたびに実行プロンプトが閉じられます。

だから、コーディングのどこかに問題があるようです。プログラムを実行して変数を入力すると、常に同じ答えが返されます..「場所 76 の内容は 0 です。」 そのメモについて、誰かが私に「わかりませんが、プログラム A が命令 10 と 11 で分岐される固定アドレスを誤って持っているのではないかと疑っています」と言いました。- mctylr しかし、それを修正する方法がわかりません..

R Samuel Klatchko からこのアイデアを組み込む方法を見つけようとしています..何が欠けているのかまだわかりませんが、それを機能させることはできません..

const int OP_LOAD = 3;
const int OP_STORE = 4;
const int OP_ADD = 5;
...

const int OP_LOCATION_MULTIPLIER = 100;

mem[0] = OP_LOAD * OP_LOCATION_MULTIPLIER + ...;
mem[1] = OP_ADD * OP_LOCATION_MULTIPLIER + ...;

operand = memory[ j ] % OP_LOCATION_MULTIPLIER;
operation = memory[ j ] / OP_LOCATION_MULTIPLIER;

私はプログラミングが初めてで、最高ではないので、簡単にするつもりです。これも SML プログラムです。とにかく、これは宿題なので、良い成績を取りたいです。そこで私は意見を求め、このプログラムが私が望んでいることを実行できるようにしました。とにかく、手順は次のとおりです。SML (Simpletron Machine language) プログラムを作成して、次の各タスクを実行します。

A) センチネル制御ループを使用して、正の数 s を読み取り、それらの合計を計算して出力します。neg 番号が入力された場合は、入力を終了します。B) カウンタ制御ループを使用して、正と負の 7 つの数値を読み取り、平均を計算して出力します。C) 一連の数字を読み取り、最大の数字を決定して出力します。最初に読み取られる数値は、処理する数値の数を示します。

これ以上の期限はありませんが、これが私のプログラムです。すべて一緒に。

int main()
{
    const int READ = 10;
    const int WRITE = 11;
    const int LOAD = 20;
    const int STORE = 21;
    const int ADD = 30;
    const int SUBTRACT = 31;
    const int DIVIDE = 32;
    const int MULTIPLY = 33;
    const int BRANCH = 40;
    const int BRANCHNEG = 41;
    const int BRANCHZERO = 41;
    const int HALT = 43;

    int mem[100] = {0}; //Making it 100, since simpletron contains a 100 word mem.

    int operation; //taking the rest of these variables straight out of the book seeing as how they were italisized.

    int operand;

    int accum = 0; // the special register is starting at 0

    int j;




    // This is for part a, it will take in positive variables in a sent-controlled loop and compute + print their sum. Variables from example in text.
    memory [0] = 1010;

    memory [01] = 2009;

    memory [02] = 3008;

    memory [03] = 2109;

    memory [04] = 1109;

    memory [05] = 4300;

    memory [06] = 1009;

    j = 0; //Makes the variable j start at 0.

    while ( true )
    {

        operand = memory[ j ]%100; // Finds the op codes from the limit on the memory (100)
        operation = memory[ j ]/100;

        //using a switch loop to set up the loops for the cases
        switch ( operation ){
            case 10: //reads a variable into a word from loc. Enter in -1 to exit
                cout <<"\n Input a positive variable:  ";
                cin >> memory[ operand ]; break;

            case 11: // takes a word from location
                cout << "\n\nThe content at location " << operand   << "is " << memory[operand]; break;

            case 20:// loads
                accum = memory[ operand ]; break;

            case 21: //stores
                memory[ operand ] = accum; break;

            case 30: //adds
                accum += mem[operand]; break;


            case 31: // subtracts
                accum-= memory[ operand ]; break;

            case 32: //divides
                accum /=(memory[ operand ]); break;

            case 33: // multiplies
                accum*= memory [ operand ]; break;

            case 40: // Branches to location
                j = -1; break;

            case 41: //branches if acc. is < 0
                if (accum < 0)
                j = 5; 
                break;

            case 42: //branches if acc = 0
                if (accum == 0)
                    j = 5; 
                break;

            case 43: // Program ends
                exit(0); break;
    }
    j++;
    }
return 0;
}
4

3 に答える 3

1

昨日あなたの最初の質問で提案したように。私があなたのコードを正しく読んでいるなら、あなたはケースにエラーがあり、「スタックポインタ」()を5に変更するようにハードコーディングされ10ているかもしれないと思います。11j

caseステートメントがオペコード定数(たとえば、 )switch (operation)と一致しません。READ = 10BRANCH = 40これはあなたの例で修正されています

デバッグの場合、間違いをキャッチするために、少なくともスイッチにデフォルトのステートメントを設定して不明な操作をキャッチすることをお勧めします。

追加した:

Simpletronのプログラム実行を追跡できるように、実行中の演算とオペランドを出力することもお勧めします。

memoryアドレスの先行ゼロの使用法はまだ修正されていません。C / C ++コンパイラは、先行ゼロを8進数(基数8)の記数法を意味するものとして解釈します。

投稿されたサンプルコードはコンパイルされません。変数名の使用法を編集して修正してください(ヒント:mixing memand memory)。


コード修正が削除されました。

于 2010-03-10T15:01:33.283 に答える
1

だから、コーディングのどこかに問題があるようです。プログラムを実行して変数を入力すると、常に同じ答えが返されます..「76 番目のコンテンツの内容は 0 です。」

あなたのプログラムが何をしているか見てみましょう:

memory [0] = 1010;  /* Read from user and store at address 10 */
memory [01] = 2009;  /* Read garbage into acc from address 9 */
memory [02] = 3008;  /* Add whatever garbage is in address 8 into accumulator */
memory [03] = 2109;  /* Store garbage from accumulator into address 9 */
memory [04] = 1109;  /* Print the contents of address 9, which is garbage */
memory [05] = 4300;  /* Stop */
memory [06] = 1009;  /* Read from user and store in address 9 */

だから...ええ。このようなものをデバッグするには、プログラムのすべての関連変数を出力して、それらがあなたの考えているものであるかどうかを確認するだけです。たとえば、ケース 10 の場合は実行できcout << "10: operand is " << operand << endl;、ケース 11 の場合は実行できcout << "11: operand is " << operand << endl;、最初の命令ではオペランドが 10、2 番目の命令では 9、3 番目の命令では 8 であることがすぐにわかります。

メモリが常に値 0 で始まることを保証したい場合は、for ループを記述します (それを行うように宣言を変更できますが、学ぶ必要がある微妙な点があります)。

for( int i = 0; i < sizeof(memory); ++i ) { memory[i] = 0; }

ユーザーが入力した2つの値を追加して結果を出力する作業プログラムは次のとおりです。

memory [0] = 1009;
memory [1] = 1008;
memory [2] = 2009;
memory [3] = 3008;
memory [4] = 2109;
memory [5] = 1109;
memory [6] = 4300;
于 2010-03-11T20:18:24.097 に答える
0

switch ステートメントの値が正しくありません。操作値は、ケースで確認するように、1、2、3 などではなく、10、11、20、21 などになります。つまり、これらの数値のケースがないため、コードは実行されません。

幸運を!

于 2010-03-10T14:35:22.433 に答える