【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18937

再びSOS
投稿者---SOS (2004/12/31 17:47:17)


たびたびすいません。
以下のプログラムに
add,r5,r5,r5
add,r5,r5,r5
add,r5,r5,r5
add,r5,r5,r5
add,r5,r5,r5
と実行したところ、合計値が正しく出ません。
どうしてでしょうか?
長いプログラムですが、教えてください。

#include <stdio.h>
#include <string.h>

struct youso{ /* 構造体の宣言 */
char opecode[20];
char operand0[20];
char operand1[20];
char operand2[20];
};

int goukei(int x);

int main(int argc, char *argv[])
{
int count=0;

count=goukei(count);

printf("合計は%dです\n",count);

return 0;
}

int goukei(int count)
{
int i;
struct youso y[20]; /* 構造体変数と構造体配列の宣言 */

/* 構造体配列に scanf()でデータを入力 */
for(i = 0; i < 5; i++) {
scanf("%s", y[i].opecode);
scanf("%s", y[i].operand0);
scanf("%s", y[i].operand1);
scanf("%s", y[i].operand2);

/* 入力データの確認 */
if(i==0){
printf("opecode:%s operand0:%s operand1:%s operand2:%s\n",
y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);
}else{
printf("opecode:%s operand0:%s operand1:%s operand2:%s p_opecode:%s\n",
y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2, y[i-1].opecode);
}

/* オペコード */
if(strcmp(y[i].opecode,"add")){
printf("%dです\n",count+1);
count=count+1;
}else if(strcmp(y[i].opecode,"sub")){
printf("%dです\n",count+2);
count=count+2;
}else if(strcmp(y[i].opecode,"addi")){
printf("%dです\n",count+3);
count=count+3;
}else if(strcmp(y[i].opecode,"addu")){
printf("%dです\n",count+4);
count=count+4;
}else if(strcmp(y[i].opecode,"subu")){
printf("%dです\n",count+5);
count=count+5;
}else if(strcmp(y[i].opecode,"addiu")){
printf("%dです\n",count+6);
count=count+6;
}else if(strcmp(y[i].opecode,"mfco")){
printf("%dです\n",count+7);
count=count+7;
}else if(strcmp(y[i].opecode,"mult")){
printf("%dです\n",count+8);
count=count+8;
}else if(strcmp(y[i].opecode,"multu")){
printf("%dです\n",count+9);
count=count+9;
}else if(strcmp(y[i].opecode,"div")){
printf("%dです\n",count+10);
count=count+10;
}else if(strcmp(y[i].opecode,"divu")){
printf("%dです\n",count+11);
count=count+11;
}else if(strcmp(y[i].opecode,"mfhi")){
printf("%dです\n",count+12);
count=count+12;
}else if(strcmp(y[i].opecode,"mflo")){
printf("%dです\n",count+13);
count=count+13;
}else if(strcmp(y[i].opecode,"and")){
printf("%dです\n",count+14);
count=count+14;
}else if(strcmp(y[i].opecode,"or")){
printf("%dです\n",count+15);
count=count+15;
}else if(strcmp(y[i].opecode,"andi")){
printf("%dです\n",count+16);
count=count+16;
}else if(strcmp(y[i].opecode,"ori")){
printf("%dです\n",count+17);
count=count+17;
}else if(strcmp(y[i].opecode,"sll")){
printf("%dです\n",count+18);
count=count+18;
}else if(strcmp(y[i].opecode,"srl")){
printf("%dです\n",count+19);
count=count+19;
}else if(strcmp(y[i].opecode,"lw")){
printf("%dです\n",count+20);
count=count+20;
}else if(strcmp(y[i].opecode,"sw")){
printf("%dです\n",count+21);
count=count+21;
}else if(strcmp(y[i].opecode,"lbu")){
printf("%dです\n",count+22);
count=count+22;
}else if(strcmp(y[i].opecode,"sb")){
printf("%dです\n",count+23);
count=count+23;
}else if(strcmp(y[i].opecode,"lui")){
printf("%dです\n",count+24);
count=count+24;
}else if(strcmp(y[i].opecode,"beq")){
printf("%dです\n",count+25);
count=count+25;
}else if(strcmp(y[i].opecode,"bne")){
printf("%dです\n",count+26);
count=count+26;
}else if(strcmp(y[i].opecode,"slt")){
printf("%dです\n",count+27);
count=count+27;
}else if(strcmp(y[i].opecode,"slti")){
printf("%dです\n",count+28);
count=count+28;
}else if(strcmp(y[i].opecode,"sltu")){
printf("%dです\n",count+29);
count=count+29;
}else if(strcmp(y[i].opecode,"sltiu")){
printf("%dです\n",count+30);
count=count+30;
}else if(strcmp(y[i].opecode,"j")){
printf("%dです\n",count+31);
count=count+31;
}else if(strcmp(y[i].opecode,"jr")){
printf("%dです\n",count+32);
count=count+32;
}else if(strcmp(y[i].opecode,"jal")){
printf("%dです\n",count+33);
count=count+33;
}else{
printf("%dです\n",count);
}
}


return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:再びSOS 18938 あかま 2004/12/31 18:40:52
<子記事> Re:再びSOS 18939 YuO 2004/12/31 18:43:23
<子記事> Re:再びSOS 18940 RiSK 2004/12/31 20:54:35


No.18938

Re:再びSOS
投稿者---あかま(2004/12/31 18:40:52)


>たびたびすいません。
>以下のプログラムに
>add,r5,r5,r5
>add,r5,r5,r5
>add,r5,r5,r5
>add,r5,r5,r5
>add,r5,r5,r5
>と実行したところ、合計値が正しく出ません。
>どうしてでしょうか?
>長いプログラムですが、教えてください。
これは何のプログラムですか?
どういう入力をすると、どう出力してほしいのかを書かなければ答えようがありません。
それとプログラムを載せるときは「HTML変換ツール」を使ってください。


この投稿にコメントする

削除パスワード

No.18939

Re:再びSOS
投稿者---YuO(2004/12/31 18:43:23)


【掲示板ご利用上の注意】をちゃんと読んで,実行して下さい。

> ※題名は具体的に!
> ※ソースの添付は「HTML変換ツール」で字下げ!
> ※環境(OSとコンパイラ)や症状は具体的に詳しく!

がなされていません。


>以下のプログラムに
(snip)
>と実行したところ、合計値が正しく出ません。
>どうしてでしょうか?

あなたの書いたコードが間違っているからです。
コンピュータは恐らく書かれたとおりのことをやっているはずです。
#まれに「コンパイラのバグ」とか「プロセッサのバグ」である場合もありますが……。

なので,「予測した(または取得したい)結果」と「実際の結果」を提示されないと,
回答のつけようがありません。



この投稿にコメントする

削除パスワード

No.18940

Re:再びSOS
投稿者---RiSK(2004/12/31 20:54:35)


>長いプログラムですが

同じことを何回も書くので長くなります。(バグの原因になる)
少しでも楽しようと努力すべし。

リファクタリングしたつもりのソース:
#include <stdio.h>
#include <string.h>

#define ELEMENTS_NUM(array) (sizeof(array) / sizeof(array[0]))

typedef struct {
    char opecode[20];
    char operand0[20];
    char operand1[20];
    char operand2[20];
} youso;

int goukei(int count)
{
    unsigned i, j;
    youso y[20];
    const char * opecode[] = {
        "add",
        "sub",
        "addi",
        "addu",
        "subu"
        "addiu",
        "mfco",
        "mult",
        "multu",
        "div",
        "divu",
        "mfhi",
        "mflo",
        "and",
        "or",
        "andi",
        "ori",
        "sll",
        "srl",
        "lw",
        "sw",
        "lbu",
        "sb",
        "lui",
        "beq",
        "bne",
        "slt",
        "slti",
        "sltu",
        "sltiu",
        "j",
        "jr",
        "jal"
    };

    for (i = 0; i < 5; ++i) {
        scanf("%s%s%s%s",
            y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);

        printf("opecode:%s operand0:%s operand1:%s operand2:%s", 
            y[i].opecode, y[i].operand0, y[i].operand1, y[i].operand2);
        if (i > 0) {
            printf("p_opecode:%s\n", y[i-1].opecode);
        } else {
            puts("");
        }

        for (j = 0; j < ELEMENTS_NUM(opecode); ++j) {
            if (strcmp(y[i].opecode, opecode[j]) == 0) {
                break;
            }
        }
        if (j < ELEMENTS_NUM(opecode)) {
            count += j + 1;
        }
        printf("%dです\n", count);
    }
    return 0;
}

int main(void)
{
    int count = 0;
    
    count = goukei(count);
    printf("合計は%dです\n", count);

    return 0;
}


他の方も言っていますが,希望する動作・現在の動作を書かないことには回答しようがないです。
# 解答が分からないから


この投稿にコメントする

削除パスワード

No.19036

Re:再びSOS
投稿者---ハンス(2005/01/05 11:06:53)


レーザーファイブのボード買ってきてアセンブラ流したほうが早くね?




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧