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

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

ただいまの
回答率

89.09%

dumpについての質問

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 137

別の方の質問を見ての質問となります。

現在ダンプを勉強しており以下2文がなぜ必要かが理解できないためご教授願えたらと思い質問させていただきます。

staddr += offset;
この処理は何のために行っいるのでしょうか?

savecnt = startcnt;
startcnt = savecnt;
何のために一度格納して再度入れなおしているのでしょうか?

https://teratail.com/questions/204968
上記の方の質問を見ての質問です。
よろしくお願い致します。

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable: 4996)

#define H_PRT 0x02// ヘッダ印字オプション 
#define C_PRT 0x01// 文字印字オプション
#define ROW 16 // 1行に表示する文字
#define TESTBUF 512 //テストデータ用のバッファ
#define TEXTBUF 1024 //テキストファイル用のバッファ

//プロトタイプ宣言
void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt);

void main(void) {

    //int filcnt;// フィル用のカウンタ

    //char bin_data[TESTBUF];// テストデータ用のバッファ
    //char asc_data[] = "01234567809 ABCあいうえおかきくけこDEFGHIJKLMNOPQRSTUVWXYZ 漢字表示のテスト abcdefghijklmnopqrstuvwxyz01234567809ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz";
    char txt_data[TEXTBUF]; // テキストファイル読み込み用
    //char txt;
    int readnum;

    FILE* file;
    file = fopen("s-jis2.txt", "rb");
    if (file == NULL) {
        printf("ファイルが開けません");
        exit(1);
    }

    readnum = fread(txt_data, sizeof(unsigned char), TEXTBUF, file);

    if (readnum == 0) {

        printf("ファイルの内容がありません");
        exit(1);
    }

    fclose(file);

    //for (filcnt = 0; filcnt < 512; filcnt++) bin_data[filcnt] = filcnt & 0xff;  // テスト用のテーブルを0からFFで埋める

//    dump("\nASCIIdata 文字印字あり", asc_data, 0, 65, H_PRT + C_PRT);
//    dump("\nBINARYdata 文字印字あり", bin_data, 0, 512, H_PRT + C_PRT);
    dump("テキストファイル", txt_data, 0, readnum, H_PRT + C_PRT);
}


void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt) {

    int startcnt = 0;// ダンプするバイト数のカウント
    int bytecnt; // 16回ループさせる
    int savecnt = 0;
    int address = 0; //アドレスの表示
    int onhold = 0; //文字出力が最後のバイトだった時の一時保留
    staddr += offset;

    char addrhead[] = "Addr";
    char hexa[] = "0 1  2 3  4 5  6 7  8 9  A B  C D  E F";
    char charprint[] = "0 2 4 6 8 A C E";


    printf("\n%s\n", title);
    printf("  %s     %s  %s\n", addrhead, hexa, charprint);

    printf("--------  ---- ---- ---- ---- ---- ---- ---- ----  ----------------\n");

    while (startcnt < dsize) {

        if (onhold != 0) {  //前回最後が漢字だった場合、漢字を出力して改行

            printf("%c%c", onhold, staddr[startcnt]);
            printf("\n");
        }

        printf("%08x  ", address);

        savecnt = startcnt;
        for (bytecnt = 0; bytecnt < ROW; bytecnt++) {

            if (startcnt < dsize) {
                printf("%02x", staddr[startcnt]); //16進数で出力
            }
            else {
                printf(" ");
            }
            if (startcnt % 2 != 0) {
                printf(" ");
            }
            startcnt++;
        }
        startcnt = savecnt;

        //文字の出力
        for (bytecnt = 0; bytecnt < ROW; bytecnt++) {

            if (onhold != 0) {  //前回最後が漢字だった場合 次の行の最初にスペースと初期化

                printf(" ");
                onhold = 0;
                bytecnt++;
            }

            //漢字だった場合
            if ((staddr[startcnt] >= 0x81 && staddr[startcnt] < 0xa0) || (staddr[startcnt] >= 0xe0 && staddr[startcnt] < 0xfd)) {

                if (bytecnt > ROW - 1) {  //漢字で最後のバイトの場合、保留

                    onhold = staddr[startcnt];
                    bytecnt++;

                }
                else {//最後のバイトでなければ出力

                    printf("%c%c", staddr[startcnt], staddr[startcnt + 1]);
                    startcnt++;
                    bytecnt++;
                }
            }
            if (startcnt < dsize) {

                if ((staddr[startcnt] >= 0x20 && staddr[startcnt] < 0x7f) || (staddr[startcnt] >= 0xa0 && staddr[startcnt] < 0xe0)) {

                    printf("%c", staddr[startcnt]);
                }

            }
            else {

                printf(" ");
            }
            startcnt++;
        }
        if (onhold == 0) {  //最後が漢字でなければ改行
            printf("\n");
        }
        address += ROW; //addressを出力しただけ足す

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/07/01 14:05

    コードを提示しましょう

    キャンセル

  • yamamotodaiti

    2020/07/01 14:20

    >y_waiwai様
    すみません、ほかの方の質問なので引用していいものか迷っていましてURLにしておりました。
    コードの方を貼らせていただきました。

    キャンセル

回答 1

checkベストアンサー

+1

この処理は何のために行っいるのでしょうか? 

staddr に、offsetの値を加算してます

何のために一度格納して再度入れなおしているのでしょうか? 

startcnt の値をもとに戻してるだけですね

C言語のデバッグできる環境を整え、コードを走らせてみれば動作がわかると思いますよ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/01 14:25

    >y_waiwai様
    質問の書き方が少し悪かったです。
    何のために、なぜこの処理が必要なのでしょうか?

    キャンセル

  • 2020/07/01 14:31

    staddr というのはダンプ開始アドレスで、 offsetというのは開始オフセットです
    ダンプするアドレスを求めるために加算してますね

    そこでなにをやっているのか、動作を追いかけていけばなんのためにそうしてるのかわかると思いますよ

    キャンセル

  • 2020/07/01 15:49

    y_waiwai様
    実行していると
    staddr += offset;
    はstaddr にoffsetを加算しているのが0なのでコメントアウトしても変わらないということが分かりました。
    開始アドレスを設定していたのですね。
    ありがとうございました!

    キャンセル

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る