二次元配列の出力

[戻る]
ごんた 2003/10/19(日) 15:17:52
前回は有難うございました。今回も宜しくお願いします。
今回は以下のような二次元配列からi行j列のcsv出力を試みていますが、どうもうまくい
きません。何かご指摘お願いします。

for(j=0; j<1000; j21++){
    
    for (i=0; i<10; i++) 
    {
    A[j][i]=B[j][i]
        fprintf(fp4,"%f\t",A[j][i]);//この部分の処理

    } 
    fprintf(fp4,",\n");//この部分の処理
}

をよよ 2003/10/19(日) 16:27:30
「i行j列」なら、次のように書くのがよろしいかと。

// 行数をROWS、列数をCOLSとする
for( int i = 0; i < ROWS; ++i )
{
    for( int j = 0; j < COLS; ++j )
    {
       // A[ i ][ j ]を出力する処理
    }
    // 改行を出力する処理
}

ごんた 2003/10/19(日) 16:37:34
以下のように変えては行っていますが、csvのセルの中に値がうまく表示できないのが現
状です。
for (i=0; i<10; i++) 
    {
for(j=0; j<1000; j21++){
 
    A[j][i]=B[j][i]
        fprintf(fp4,"%f",A[j][i]);//この部分の処理

                       } 
    fprintf(fp4,",\n");//この部分の処理
    }

をよよ 2003/10/19(日) 16:50:14
配列の添え字は"A[j][i]"でよいのですか?
内側のfor文中、"j21"って何ですか?
"A[j][i]=B[j][i]"の行末に;がないけど、良いのですか?
「うまく表示できない」とは、具体的にどのような症状なのですか?
# このコードではコンパイルもできないと思われますが、、、

ごんた 2003/10/19(日) 16:56:09
すいません。おっしゃるとおりです。
ソースから抜き出したため誤った表現になってしまいました。
申し訳ないです。

>配列の添え字は"A[j][i]"でよいのですか?
はい。結構です。
>内側のfor文中、"j21"って何ですか?
jの誤りでした。
以下のような二次元配列のcsvの出力を考えたいのですが、どうしてもテキストをそのま
まエクセルに貼り付けたような形になります。
セルの中にいれたいのですが、どうしても分かりません。
宜しくお願いします。
for (i=0; i<10; i++) 
    {
for(j=0; j<1000; j++){
 
    A[j][i];
        fprintf(fp4,"%f",A[j][i]);//この部分の処理

                       } 
    fprintf(fp4,",\n");//この部分の処理
    }

をよよ 2003/10/19(日) 17:16:36
>> 配列の添え字は"A[j][i]"でよいのですか?
> はい。結構です。

「i行j列」でなくて「j行i列」なんですね?
そうならば、元どおり外側のループがjで良いです。

> 以下のような二次元配列のcsvの出力を考えたいのですが、どうしてもテキストをその> まエクセルに貼り付けたような形になります。

csvはコンマ区切りだから、数値と数値の間にもコンマを出力してはどうでしょうか。

// 1000行10列
for( int j = 0; j < 1000; ++j )
{
    for( int i = 0; i < 10; ++i )
    {
        fprintf( fp4, "%f,", A[ j ][ i ] ); // 数値の後ろにコンマを追加
    }
    fprintf( fp4, "\n" ); // 改行だけ出力
}

ごんた 2003/10/19(日) 17:49:20
をよよ様
有難うございました。
お蔭様でできました。
しかし、私の表現不足で行いたかったことは10行1000列でした。
この場合ファイル全体を読み込めなくなってしまいます。
エクセルの列で読み込める限界がきたら折り返しみたいなことはできるのですか?
// 10行1000列
for( int i = 0; i < 10; ++i )
{
    {for( int j = 0; j < 1000; ++j )
  {
 
        fprintf( fp4, "%f,", A[ j ][ i ] ); // 数値の後ろにコンマを追加
    }
    fprintf( fp4, "\n" ); // 改行だけ出力
}

をよよ 2003/10/19(日) 18:45:18
1行の出力済みデータ数がエクセルの最大列数(255だったかな?)で割り切れたとき、
コンマの代わりに改行を出力すればよいと思います。

const int MAX_COLS = 255; // エクセルの最大列数
for( int i = 0; i < 10; ++i )
{
    for( int j = 0; j < 1000; ++j )
    {
        fprintf( fp, "%f", A[ j ][ i ] ); // コンマはここでは追加しない

        if( ( j + 1 ) % MAX_COLS == 0 ) // 1行の出力済みデータ数がエクセルの
            fprintf( fp4, "\n" );       // 最大列数で割り切れたら改行を出力
        else                            // そうでなければ
            fprintf( fp4, "," );        // コンマを出力
    }
    fprintf( fp4, "\n" );
}

# 蛇足ながら、2次元配列の構造と行、列を合わせておいた方が後々楽だと思います。
# つまり、A[j][i]でなく、A[i][j]で良いようにするということです。

ごんた 2003/10/19(日) 18:58:57
[[解決]]
をよよさん
有難うございました。
できました。
助かりました。
感謝します。

ごんた 2003/10/19(日) 19:00:00
># 蛇足ながら、2次元配列の構造と行、列を合わせておいた方が後々楽だと思いま
す。
># つまり、A[j][i]でなく、A[i][j]で良いようにするということです。
あと、このアドバイスも有難うございました。
かなりの参考になりました。

古いスレッドには追加発言できません。