2

TL; DR:2次元配列に苦労しています。

テキストファイルの整数のリストから2つの2次元配列を作成しようとしています。これはCでプログラムされています。

tester.txtに含まれるもの:

2 1 2 3 4 5 6 7 8 

最初の数値は、両方の配列に2行と2列があることを意味します。それ以外の数値の場合、列/行はそのように表されます。

tester.txtは次のように出力する必要があります。

1 2    5 6
3 4    7 8

これが私のコードです:

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

int main()
{
    int i,j,k;
    FILE *filepointer;
    int nrows;
    int size;

    fputs("Enter a filename: ", stdout);
    fflush(stdout);

    if ( fgets(filename, sizeof filename, stdin) != NULL )
    {
        char *newline = strchr(filename, '\n'); /* search for newline character */
        if ( newline != NULL )
        {
            *newline = '\0'; /* overwrite trailing newline */
        }
        printf("filename = \"%s\"\n", filename);
    }

    filepointer=fopen(filename,"r");
    fseek(filepointer, 0, SEEK_END); // seek to end of file
    size = ftell(filepointer);
    printf("Size=%d\n",size);
    fseek(filepointer, 0, SEEK_SET);

    int holderarray[size];

    for(i=0; i<size; i++)
        fscanf(filepointer, "%d", &holderarray[i]);

    nrows=holderarray[0];
    printf("Number of rows/columns=%d\n",nrows);

    if (filepointer == NULL)
    {
        fprintf(stderr, "Can't open input file in.list!\n");
        exit(1);
    }
}

この時点まで、すべてが期待どおりに機能します。値の前半を新しい2次元配列に追加する方法を視覚化することはできません。皆さんが助けてくれることを願っています。これがコードブロックでのブレインストーミングです。

int matrix1[nrows][nrows];
int matrix2[nrows][nrows];


for (i=1; i<sizeof(holderarray);i++)
{
    for (j=0;j<nrows;j++)
    {
        matrix[i][j]=holderarray[j];
    }

for (i=0;i<sizeof(nrows);i++)
{
    for (j=0;j<sizeof(nrows);j++)
    {
        printf("%d",matrix[i][j]);
    }

}
return 0;
4

2 に答える 2

0

getcを使用してループすることでそれらを取得できます

1. you read the first char in line and define the array structure , cast to integer 
2. initialize the arrays  eg you read 2 so 2*2 is the size of the array, 3*3 is the size of the array and number of the elements to read in every array 
3. continue reading in to reach the first array bound based 2*2 = 4 3*3= 9 based on the first line. 

4. fill the other array since the first array is full,
于 2012-11-19T08:27:31.760 に答える
0

コンパイル時に不明な変数に基づいて、このように標準Cで配列を動的に宣言することはできません。

int matrix1[nrows][nrows];
int matrix2[nrows][nrows];

C99以降のバージョンを使用していない場合は、メモリを動的に割り当てるmalloc関数を使用する必要があります。

int **matrix1, **matrix2;
int i;

matrix1 = malloc(nrows * sizeof(int*));
matrix2 = malloc(nrows * sizeof(int*));

for(i = 0; i < nrows; i++) {
  matrix1[i] = malloc(nrows * sizeof(int));
  matrix2[i] = malloc(nrows * sizeof(int));
}

Cの2次元配列は、ポインターへのポインターとして扱われます。各ポインターは、整数(つまり、行列の行)を含む連続したメモリーのチャンクへの参照であり、ポインターへのポインターを、最初の要素への参照/ポインターを含む別の連続したメモリーのチャンクへの参照として使用します。これらすべての行で。

この画像(私のものではありません)が役立つ場合があります:DYNAMIC 2D ARRAY

この動的に割り当てられたメモリは、使用が終了したときに解放する必要があることに注意してください。

for(int i = 0; i < nrows; i++) {
  free(matrix1[i]);
  free(matrix2[i]);
}

free(matrix1);
free(matrix2);
于 2012-11-19T08:31:45.763 に答える