データが消えてる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AiT0

データが消えてる

#1

投稿記事 by AiT0 » 2年前

下の入力方法に対して、動的にとった配列s、tに値をscanfで代入します。その直後にprintfで代入できているか確認します。値を全て代入し終えた後に再度printfで代入できているか確認します
すると最後に代入したt[n][k],s[n][k]以外の値が0になります。なぜでしょうか...
N
K_1
t_11 s_11
t_12 s_12


t_1K s_1K





K_N
t_N1 s_N1
t_N2 s_N2


t_NK s_NK

実際の入力&出力
2
2
3 5
i=0 j=0 t=3 s=5
1 4
i=0 j=1 t=1 s=4
1
1 6
i=1 j=0 t=1 s=6
verification
i=0 j=0 t=0 s=0
i=0 j=1 t=0 s=0
i=1 j=0 t=1 s=6

コード:

    	int n,*a,*k,**t,**s;
    	int i,j;
        scanf("%d",&n);
        k = (int *)calloc(n,sizeof(int));
        t = (int **)calloc(n,sizeof(int *));
        s = (int **)calloc(n,sizeof(int *));
        for(i=0;i<n;i++){
            scanf("%d",&k[i]);
            for(j=0;j<n;j++){
                t[j] = (int *)calloc(k[i],sizeof(int));
                s[j] = (int *)calloc(k[i],sizeof(int));
            }
            for(j=0;j<k[i];j++){
                scanf("%d",&t[i][j]);
                scanf("%d",&s[i][j]);
(確認)          printf("i=%d j=%d t=%d s=%d\n",i,j,t[i][j],s[i][j]);
            }
        }
        printf("verification\n");
        for(i=0;i<n;i++){
            for(j=0;j<k[i];j++){
(確認)     	printf("i=%d j=%d t=%d s=%d\n",i,j,t[i][j],s[i][j]);
            }
        }
        
  

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: データが消えてる

#2

投稿記事 by あたっしゅ » 2年前

東上☆海美「

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21158
// データが消えてる - ミクプラ(ja)
//
// for VS2019
//
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    //int n, * a, * k, ** t, ** s;
    int n, * t, * s;
    int i, j;

    printf( "n:" );
    scanf("%d", &n);

    //k = (int*)calloc(n, sizeof(int));
    //t = (int**)calloc(n, sizeof(int*));
    //s = (int**)calloc(n, sizeof(int*));
    t = new int[n*n];
    s = new int[n*n];

    for (i = 0; i < n; i++) {
        //printf("k[%d]:", i );
        //scanf("%d", &k[i]);

        //for (j = 0; j < n; j++) {
            //t[j] = (int*)calloc(k[i], sizeof(int));
            //s[j] = (int*)calloc(k[i], sizeof(int));
        //}

        //for (j = 0; j < k[i]; j++)
        for (j = 0; j < n; j++) 
        {
            printf("t[%d,%d]:", i, j );
            //scanf("%d", &t[i][j]);
            scanf("%d", &t[i*n+j]);
 
            printf("s[%d,%d]:", i, j );
            //scanf("%d", &s[i][j]);
            scanf("%d", &s[i*n+j]);
            //(確認)
            //printf("i=%d j=%d t=%d s=%d\n", i, j, t[i][j], s[i][j]);
            printf("i=%d j=%d t=%d s=%d\n", i, j, t[i*n+j], s[i*n+j]);
        }
    }

    printf("verification\n");
    for (i = 0; i < n; i++) {
        //for (j = 0; j < k[i]; j++)
        for (j = 0; j < n; j++)
        {
                //(確認)
            //printf("i=%d j=%d t=%d s=%d\n", i, j, t[i][j], s[i][j]);
            printf("i=%d j=%d t=%d s=%d\n", i, j, t[i*n+j], s[i*n+j]);
        }
    }

    delete[] s;
    delete[] t
        ;
    return EXIT_SUCCESS;
}


// end.
朝早く目ざめたので、直してみたみみ
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: データが消えてる

#3

投稿記事 by みけCAT » 2年前

AiT0 さんが書きました:
2年前
すると最後に代入したt[n][k],s[n][k]以外の値が0になります。なぜでしょうか...
最後の行で1個しか代入をしておらず(ここで複数個代入していれば、それは全部維持されるはず)、
それぞれの行の入力の前に全部の行のデータを

コード:

            for(j=0;j<n;j++){
                t[j] = (int *)calloc(k[i],sizeof(int));
                s[j] = (int *)calloc(k[i],sizeof(int));
            }
という部分で参照を外し、0で初期化された新しいバッファにしているからと考えられます。
ただし、最終的に全行に1要素のバッファへのポインタを代入しているのに、
2番目のデータを読んでいるため、これは範囲外の読み込みであり、未定義動作です。
したがって、値が0になったのは「たまたま」でしょう。
範囲外にもかかわらず、たまたまそこが管理などで使われず、もしくは管理のために0が代入され、
たまたま0だったのでしょう。

対策としては、ここで全行のバッファを置き換えるのではなく、
以下のように現在読んでいる行についてのみバッファを確保し、代入するようにするといいでしょう。

コード:

            t[i] = (int *)calloc(k[i],sizeof(int));
            s[i] = (int *)calloc(k[i],sizeof(int));
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: データが消えてる

#4

投稿記事 by みけCAT » 2年前

あたっしゅ さんが書きました:
2年前
朝早く目ざめたので、直してみたみみ
このコードは間違っています。
K_iの入力を読む部分が消されており、「下の入力方法に対して」という条件を満たさなくなっています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

AiT0

Re: データが消えてる

#5

投稿記事 by AiT0 » 2年前

解決しました。ありがとうございましたみけさん

返信

“C言語何でも質問掲示板” へ戻る