C言語関係掲示板

過去ログ

No.285.配列の大きさを任意にしたい

[戻る] [ホームページ]

No.1719

配列
投稿者---TAK(2002/06/12 08:23:00)


ここでいろいろと勉強させてもらってます。
質問なのですが、配列の大きさを任意にしたいので、
定義の前にscanfをおいてみたのですが、コンパイルの時にエラーが出てしまいます。
定義の前には命令を置くことはできないのでしょうか?
私はCygwinを使っているのですが、Cygwinの方に原因があるのでしょうか?
抽象的な質問となってしまいましたが、ご助言をよろしくお願いします。

No.1722

Re:配列
投稿者---retrun(2002/06/12 18:37:02)


配列のサイズはコンパイル時に決まっている必要があります。
scanfなどにより実行時にサイズを変えることはできません。
動的に記憶領域を確保したいのであればmallocを使うことが
考えられます。しかし、よほどの大きなデータ量を扱うのでなければ、
配列で十分だと思います。書込みから察するに、仕事ではなく、
勉強の過程でぶつかった壁だとは思いますが…。
Cygwinの問題でないことだけは確かです。



No.1726

Re:配列
投稿者---TAK(2002/06/15 02:06:17)


ありがとうございました。
おっしゃる通り大学の授業の課題を、自分なりに改良しようとしてこのような壁にぶつかりました。
いろいろと細かい制約があるものなのですね。
mallocを使いこなせるように頑張りたいと思います。
また、何かあったらよろしくお願いします。

No.1793

Re:配列
投稿者---かずま(2002/06/24 16:59:55)


> mallocを使いこなせるように頑張りたいと思います。

malloc は使わなくてもよいとか、連結リストを使えばとか、意見が出て
いますが、素直に malloc を使ってもいいのではないでしょうか。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i;
    int *a;

    if (scanf("%d", &n) != 1)
        return fprintf(stderr, "can't get number\n"), 1;

    a = malloc(sizeof(int) * n);
    if (a == NULL) return fprintf(stderr, "out of memory\n"), 1;
    /* これで、int a[n]; と宣言したかのように使える */

    for (i = 0; i < n; i++)
        a[i] = (i+1) * 10;

    for (i = 0; i < n; i++)
        printf("%5d", a[i]);
    printf("\n");

    free(a);
    return 0;
}


No.1833

Re:配列
投稿者---TAK(2002/06/27 00:25:59)


2次元配列(に見えるように)を作るのは難しそうだったのであきらめました。
何とか動く形に下のようにしてみました。
何か改善するところがあれば教えて下さい。
よろしくお願いします。

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

int main(){
	int max=5;
	int i,j;
	double *a;
	
	a=(double *)malloc(sizeof(double) * max * max);
	
	if (a == NULL) return 0;
	
	for (i=0 ; i<max ; i++){
		for (j=0 ; j<max ; j++){
			scanf("%lf",&a[i*max+j]);
		}
	}

	for (i=0 ; i<max ; i++){
		for (j=0 ; j<max ; j++){
			printf("%8.3f",a[i*max+j]);
		}
		printf("\n\n");
	}

	return 0;
}


No.1837

Re:配列
投稿者---かずま(2002/06/27 01:50:18)


> 2次元配列(に見えるように)を作るのは難しそうだったのであきらめました。

double が 8バイト境界にないといけない CPU だと、もうちょっと小細工が必要
ですが、Pentium ならこれで十分でしょう。
#include <stdio.h>
#include <stdlib.h>

void *allocate_double(size_t n, size_t m)
{
    size_t i;
    double **p = malloc(sizeof(double *) * n + sizeof(double) * n * m);
    if (p == NULL) return NULL; /* or exit(1); */
    p[0] = (double *)(p + n);
    for (i = 1; i < n; i++)
        p[i] = p[i-1] + m;
    return p;
}

int main()
{
    int max = 5;
    int i, j;
    double **a = allocate_double(max, max);

    for (i = 0; i < max; i++)
        for (j = 0; j < max; j++)
            if (scanf("%lf", &a[i][j]) != 1) return 1;
    for (i = 0; i < max; i++) {
        for (j = 0; j < max; j++)
            printf("%8.3f", a[i][j]);
        printf("\n");
    }
    free(a);
    return 0;
}



No.1761

Re:配列
投稿者---A・I(2002/06/20 19:53:29)



>mallocではなくポインタを使い連結リストにすれば動的に領域を確保できると
思うのですが・・・?


No.1789

Re:配列
投稿者---TAK(2002/06/24 10:34:59)


連結リストについては、まだしっかりとは分かっていないのですが、
データを作る時にmallocを使うことになるのではないでしょうか?
実は学校の課題で行列を扱うことになって、何とかメモリの消費を
少なくしたいなと思ってこのような質問をしました。
(最近のパソコンではそのような心配も必要ないかなと思いましたが)
でも、これでまた少し上達したかなと思っています。
連結リストについて詳しく教えていただければ幸いです。