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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C言語 配列の長さの上限
C言語・C++・C#
-
C言語で巨大配列を作るにはどうすれば良いのでしょうか?
C言語・C++・C#
-
関数から配列を返すには?
C言語・C++・C#
-
-
4
mallocの確保要素数の限界は?
C言語・C++・C#
-
5
C言語を実行すると-infが出てきて困っています。
C言語・C++・C#
-
6
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
7
charでの計算?
C言語・C++・C#
-
8
char*を初期化したいのですが
C言語・C++・C#
-
9
Segmentation Fault (メモリ制限?)
その他(プログラミング・Web制作)
-
10
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
11
DoEventsがやはり分からない
Visual Basic(VBA)
-
12
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
C言語において、 配列要素をひ...
-
エラーが出てしまいます
-
C言語についてです 5人のテスト...
-
c言語 構造体
-
C#で配列が空かを判定するには?
-
ポインタを使って構造体の配列...
-
構造体のextern方法
-
c言語の自分で数字を入力してサ...
-
int i, int i[1];
-
C言語から質問です。
-
C言語 構造体でつまずいています
-
要素数・要素の値が未定の配列...
-
char型配列をint型に代入するには
-
fclose()でセグメンテーション違反
-
関数への構造体の配列の渡し方<...
-
define で 配列
-
c言語プログラミング 等差数列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報