
No.7ベストアンサー
- 回答日時:
No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?
例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>
double read_c(FILE *fp, int x, int y) {
double c;
fseek(fp,(x*10000+y)*8L, SEEK_SET);
fread(&c, 1,8, fp);
return c;
}
void write_c(FILE *fp, double *c, int x, int y) {
fseek(fp,(x*10000+y)*8L, SEEK_SET);
fwrite(c, 1,8, fp);
}
int main(void)
{
FILE *fp;
double c,s;
int x,y;
int a[10000],b[10000];
fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
for(x=0; x<10000; x++) {
for(y=0; y<10000; y++) {
c=a[x]*b[y];
write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
}
}
for(x=0; x<10000; x++) {
s=0;
for(y=0; y<10000; y++) {
s += read_c(fp, x,y);// s += c[x][y]; の意味
}
b[x] = s / 10000;
}
fclose(fp);
return 0;
}
No.6
- 回答日時:
No.5です。
>ご回答ありがとうございます。あまりくわしくないのでdatというものが何なのかよくわかりません。
これは、私の「そのデータを記録するファイルc.dat を作ります」に対する反応ですね。ファイル名ですから適当です。拡張子は気にしないでください。c.abcでもa.bcdでも、「double_c10000_10000のデータを保存するファイル.tmp」というファイル名でも何でもよいです。私が勝手に、Cという配列のデータを保存するファイルという意味でc.datという名前をつけただけです。
アイデアは単純で、「巨大なデータdouble c[10000][10000];をファイル上に確保する」というだけです。mallocでメモリ上にデータの保存先を確保する代わりに、ファイル上に確保するわけです。
ファイル名は何でもいいです。本質ではありません。
ご返答ありがとうございます。
現在も問題に取り組んでいます。
今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?
大変恐縮ですが、していただけると非常に助かる限りです。
ずうずうしいお願いをして申し訳ございません。
No.5
- 回答日時:
巨大データをファイルにしたら、遅いですがエラーにならないと思います。
つまり、double c[10000][10000];の代わりにそのデータを記録するファイルc.dat を作ります。
そして、c[x][y]にアクセスする場合、lseek(fd,(x*10000+y)*8, SEEK_SET);して、fread()やfwrite()で読み書きすればよいでしょう。変数がchar なら*8は省略、変数double が8バイトでなく16バイトなら *16です。これは昔、DOSプログラムで巨大データを操作する場合使ったテクニックです。
No.4
- 回答日時:
dom-domさん、こんにちは。
まずは、他の回答者の方も仰っているように、そもそも、なんでそんな巨大なサイズの
配列がいるのか?本当に必要なのか?どうかをじっくり検討してみた方が良いかもしれ
ません。
プログラムの処理内容は判りませんが、一度に(同じタイミングで)その配列全体をアク
セスする必要があるのかどうか.....
一度にアクセスする範囲が限定できるなら、配列を小さくして必要な部分のデータだけ
格納するような方法が採れると思います。
※配列のサイズを大きく取りすぎるのは、メモリが勿体無いのもありますが、トラブルの
原因にもなりやすいのであまりオススメできません。
dom-domさんが望まれる回答でなくてすみませんでした。m(__)m
ありがとうございます。
確かに大きすぎるので、もっと上手いやり方が存在するかもしれません。
配列を小さくすることも検討して試してみます。
No.3
- 回答日時:
「エラーになってしまいます」というのが、どんなエラーなのか、コンパイル時なのか実行時なのかなどをまずははっきりさせましょう。
あと、OSとコンパイラの名前とバージョンも。自動変数ならば、800MBも確保できないのが普通でしょうね。
他の方も書いているとおり、やはりmallocなどの方法で確保するのが基本です。ただし、2次元配列ということなので、1次元の場合と比べてアクセスは少々面倒になります。
要素数 M×N のdouble型の領域を確保して、i行j列の要素にアクセスする (0≦i<M, 0≦j<N) には、下記のようにします。
double *p = (double *)malloc(sizeof(double) * M * N);
if (!p) { エラー処理 }
...
p[i*N + j] = 0.0;
...
free(p);
p[i][j]とは書けないことに気をつけてください。
なお、mallocが失敗するようなら、根本的にメモリが足りません。物理的にメモリを増やすか、もっと少ない要素数で演算できるようにプログラムを変えてください。
ご意見ありがとうございます。
cはあまり知らないのでおそらくmallocというのをいろいろ調べたのですが正しく理解できず使いこなせないだけだと思います。
またソースの例まで書いてくれてありがとうございます。
salsberryさんの例を参考にしてもう少し試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(プログラミング・Web制作) PythonでLoopを使って配列内の文字列を結合する。そして [] を削除する 1 2022/03/31 23:28
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Visual Basic(VBA) VBAで大量データの処理 3 2022/11/15 21:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C#でのフィボナッチ数列
-
構造体のextern方法
-
C言語 ファイルの指定された行...
-
C言語の課題丸投げ
-
C#で構造体の配列を持った構造...
-
callocで二次元配列を作成する...
-
C言語において、 配列要素をひ...
-
C#で配列が空かを判定するには?
-
C言語 構造体でつまずいています
-
辞書式順序
-
c言語の初期化について
-
C++DLLからC#へのコールバック...
-
ファイルのデータを構造体に代...
-
C言語のプログラミング配列・fo...
-
C言語についてです 5人のテスト...
-
Cのエラー
-
[C++]const int と配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
C#で構造体の配列を持った構造...
-
コンボボックスでデフォルト値...
-
C#で配列が空かを判定するには?
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
C言語において、 配列要素をひ...
-
C言語の2次元配列 容量が大き...
-
配列のアドレス部
-
配列の配列をmemcpyやmemcmpし...
-
万年カレンダーについて。
-
C言語 ファイルの指定された行...
-
この変数名はわかりにくいですか?
-
MFCのCArrayを使った二次元配列
-
fclose()でセグメンテーション違反
-
c言語
-
C言語の配列のコピーについて
-
マルチスレッド環境での配列使...
おすすめ情報