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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C言語 配列の長さの上限
C言語・C++・C#
-
C言語で巨大配列を作るにはどうすれば良いのでしょうか?
C言語・C++・C#
-
mallocの確保要素数の限界は?
C言語・C++・C#
-
-
4
関数から配列を返すには?
C言語・C++・C#
-
5
C言語を実行すると-infが出てきて困っています。
C言語・C++・C#
-
6
バッファとは何ですか
C言語・C++・C#
-
7
C言語 エラーの原因がわからないので,見てほしいです
C言語・C++・C#
-
8
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
9
char*を初期化したいのですが
C言語・C++・C#
-
10
charでの計算?
C言語・C++・C#
-
11
配列の要素数を超えた参照のコンパイル
C言語・C++・C#
-
12
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
13
プログラムでの数字につく”f”の意味
C言語・C++・C#
-
14
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
15
C言語でファイル読み書きを早くしたい。
C言語・C++・C#
-
16
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
17
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
18
DoEventsがやはり分からない
Visual Basic(VBA)
-
19
C言語で特定列だけを抽出して配列に格納し、出力したいです。 読み込みファイル(read.txt) 0
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
構造体のextern方法
-
C言語の2次元配列 容量が大き...
-
C言語を使って、ファイルの読み...
-
bmpやImageの配列を関数の引数...
-
C#で構造体の配列を持った構造...
-
[C++/CLI]マネージコードで配列...
-
C言語において、 配列要素をひ...
-
MFCのCArrayを使った二次元配列
-
AfxBeginThread の引数について
-
C#で配列が空かを判定するには?
-
プログラム 数列の和
-
万年カレンダーについて。
-
C言語についてです 5人のテスト...
-
100個の要素を持つ1次元配列に1...
-
ポインタを使って構造体の配列...
-
配列のNULL初期化について
-
C言語の配列のコピーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
構造体のextern方法
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
コンボボックスでデフォルト値...
-
2番目の最大値を求める
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
C言語の課題が出たのですが自力...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
ポインタを使って構造体の配列...
-
配列のアドレス部
-
char型配列をint型に代入するには
-
MFC - ダイアログボックスのPic...
-
C言語から質問です。
おすすめ情報