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

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

ただいまの
回答率

88.78%

[C言語]配列を使って2つの値の履歴を取りたい(バッファリング)

解決済

回答 2

投稿

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

kutc_chess

score 11

[C言語]配列を使って2つの値の履歴を取りたい(バッファリング)

タイトル通り、2つの別々の値を別々の履歴を取りたい事案が発生したので、
配列を使って値の履歴を取る事にし、以下のプログラムをコーディングしました。

問題の部分

ここで問題の話なのですが、実行すると、
2つの配列はお互い関係していないはずなのに、片方(Y_Error)の値の履歴はとれているが、
もう片方(X_Error)は、片方(Y_Error)の値を受け取ったかの様に”履歴を取ってほしい値を無視して”履歴を取る」
という問題が発生しました。

(私が口下手なのと、言葉じゃわかりにくいですね...実行した時の画面の画像添付するのでそれでお察しください)

以下、問題のコード(※Windowsで実行してるのでWindows専用の関数が絡んでます)

//
#include <stdlib.h>    //system()
#include <stdio.h>    //printf()
#include <Windows.h>    //Sleep()

//
#define BUFFERING_TIME 5    //バッファリング(値の履歴を取る)回数

//
int ClearArray(int* array, long int length_array);    //配列の全要素を0にする関数

//
void main(void)
{
    //
    int X_Error[BUFFERING_TIME];    //履歴を取る配列1
    int Y_Error[BUFFERING_TIME];    //履歴を取る配列2
    ClearArray(X_Error, BUFFERING_TIME);    //配列1をクリア
    ClearArray(Y_Error, BUFFERING_TIME);    //配列2をクリア

    while(1){
        //
        static long int I=0;    //ループ回数をカウントさせる変数

        //
        Sleep(1000);    //毎ループ1秒休止
        system("cls");    //コンソール(cmd(コマンドプロンプト)、ターミナル)に表示されている文字を消す
        printf("%dループ目    \n", I);

        //バッファリング(配列の要素を一個後の要素に入れていく
        for (int i = BUFFERING_TIME; 1 <= i; i--) {    //BUFFERING_TIME -> 1    バッファの履歴ずらし(シフト)
            X_Error[i] = X_Error[i-1];
            Y_Error[i] = Y_Error[i-1];
            printf("X_Error[%d]:%d    ,Y_Error[%d]:%d    \n", i, X_Error[i], i , Y_Error[i]);

        }//for
        printf("X_Error[0]:%d    ,Y_Error[0]:%d    \n", X_Error[0], Y_Error[0]);

        //バッファ配列への入力
        switch(I){
            case 5:{    //5ループ目でYに10を入力、履歴取って!
                X_Error[0] = 0;
                Y_Error[0] = 10;
            }break;
            case 10:{    //10ループ目でYに0で入力クリア!、Xに20を入力、履歴取って!
                X_Error[0] = 20;
                Y_Error[0] = 0;
            }break;

        }//if
        I++;

    }//while(1)
}//main

//
int ClearArray(int* array, long int length_array){    //配列の全要素を0にする関数
    //
    for(long int i=0;i<length_array;i++){
        array[i] = 0;
    }//for

    //
    return 0;
}//func

イメージ説明

問題解決よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+3

  for (int i = BUFFERING_TIME; 1 <= i; i--) { // Iの初期値、ひとつ大きくね?
    X_Error[i] = X_Error[i-1]; // X_Error[BUFFERING_TIME]  は範囲外だから
    Y_Error[i] = Y_Error[i-1];
    printf("X_Error[%d]:%d    ,Y_Error[%d]:%d    \n", i, X_Error[i], i , Y_Error[i]);
  }//for

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

epistemeさんの回答でつきていると思いますが、、、

 Y_Error[i] = Y_Error[i-1];

で、 i = BUFFERING_TIME の時、配列外アクセスとなって隣りの領域 (X_Error[0])を壊しているという事。

     int X_Error[BUFFERING_TIME];    //履歴を取る配列1
     int Dummy;         // ダミー
     int Y_Error[BUFFERING_TIME];    //履歴を取る配列2


とすれば、大丈夫? と思ったのですが、変化無しで、アドレスを取ってみたら、
Dummy, Y_Error, X_Error の順に並んでいました。 (VS2019 の場合)

参考までに。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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