質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C

    3706questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Cで先頭アドレスを指定して宣言されたDoubleの配列を連結したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 185

TSH1984

score 12

 現状の説明

表題の通りだとちょっとよく分からないかもしれませんが、現在、以下のように2種類の先頭をメモリ番地の直接指定で決め打ちしている配列が2つあります。

double* A = (double*)(0xaaaa);
double* B = (double*)(0xbbbb);

 実際にやりたいこと

A,Bは先頭からdoubleで100個分にデータが入っていて、
最終的には配列A,Bを連結した長さ200の配列Xを使えるようにしたいです。

 困っていること

以下のように書いてA,Bを連結してみたのですがエラーが出てうまくいきません。
正しいやり方をご教授いただけたら幸いです。

double* X;
&X[0] = (double*)(0xaaaa);
&X[100] = (double*)(0xbbbb);
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

double *A = (double*)(0xaaaa);
double *B = (double*)(0xbbbb);
double x[200];

bcopy(A, X, sizeof(double)*100);
bcopy(B, X+100, sizeof(double)*100);


では?

あるいは、

double *A = (double*)(0xaaaa);
double *B = (double*)(0xbbbb);
double *x[200];
int i;

for(i=0; i<100; i++){
    x[i] = A+i;
}
for(i=0; i<100; i++){
    x[100+i] = B+i;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/28 21:56

    ありがとうございます。
    bcopyが用意されてない環境なので、2つめのコードで試してきます。

    キャンセル

  • 2018/05/28 22:06

    データのコピーで良いなら、別にbcopyなんて自分で書けば良いと思いますが。書けませんか?であれば、初心者マークを付けておいた方が良かったと思います。

    2つ目のコードは、データをコピーせずに、データへのポインタを配列にしていますので、
    「連結した配列のi番目の要素の値」は、*x[i] で参照します。

    キャンセル

  • 2018/05/28 22:14

    すみません。遅くならないうちにすぐに検証して動かそうと思っていたので上記コメントをしました。
    2つめのコードで動きました。ありがとうございます。

    キャンセル

+1

こんにちは。

最終的には配列A,Bを連結した長さ200の配列Xを使えるようにしたいです。

  1. double 200個分のメモリを用意してそこへコピーするのが、最も一般的な解と思います。
  2. もしも運良くAとBの間がdoubleちょうど100個分だったら、普通にAで連続アクセスできます。例えば、A[100]はB[0]です。
  3. ありえないと思いますが、もしも仮想メモリをいじることができ、かつ、double 100個分単位でアドレスを割り振れるならば、A+100のアドレスにB+0のメモリを割り当てることで可能です。

でも、ごめんなさい。アドレス決め打ちで配列の先頭アドレスを指定しているということは、小さな組み込み用CPU上のプログラムと思います。この場合、上記の1.と3.は適用できない可能性が高いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/28 21:55

    回答ありがとうございます。
    2はダメだと思います。100個ちょうどではないです。
    3も仮想メモリはいじれないので、すみません。

    1で試してみます。
    ただ、もう1人の方の2つめのコードと同じだと思うので、もしこれで解決するようだったら、もう1人の方がコードも載せてくださっているので、そちらをBAにさせて頂きます。
    (普通にiを足すのではなくsizeof(double)*iだとは思いますが)

    試してくるので少し時間をください。コメントありがとうございました。

    キャンセル

0

最終的には配列A,Bを連結した長さ200の配列Xを使えるようにしたいです。

TSH1984さんが意図されたようなシンプルな書き方では、できません。

(double*)(0xaaaa)と固定の値で宣言されたメモリ空間は移動できないこと、
&X[0]といったアドレス表現にたいする代入はC言語の文法ではないことが理由です。

もしやるとするなら、メモリを管理するリスト構造体をつくり、連結させたうえで手動でメモリ空間を管理しつつ、値をゲット・セットしてやる必要がありそうです。

struct MemoryManager;

typedef struct MemoryManager {
   double *ptr;
   size_t  size;
   struct MemoryManager *next;
} MemoryManager;

double MemoryManager_Get(MemoryManager *mm, size_t index)
{
    do {
        if(mm->size < index) {
            index -= mm->size;
            mm = mm->next;
        }
        else {
            break;
        }
    }while(mm != NULL);
    return mm->ptr[index];
}

Set関数は省略☆(ゝω・)v

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

無理です。

&X[0] = (double*)(0xaaaa);

&X[0] は、X の先頭アドレスを示します。(変数ではありません)
&X[100] も同様。

また、配列 or ポインタは、連続したアドレスが前提となっています。
連続した領域にコピーして使用すべきです。
もっとも物理/論理アドレスのマッピングを変更してなんてのがありならば、可能ですが、それは普通しないと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    「シンボルを見つけられません」とエラーが出る

    BMI.javaをコンパイル時に 「シンボルを見つけられません」と表示されてしまします。 10行目の変数mが問題らしいのですが、色々変更してもエラーが直りません。 どうす

  • 受付中

    javaで配列を宣言したいのですが、リスト内包記法みたいにできませんか?

    前提・実現したいこと Javaを使ってdouble型の配列を作っています。 配列は0.01から1.0のdouble型で、0.01刻みです。 いちいち空の配列を宣言した後でfo

  • 解決済

    二分法(2変数)

    前提・実現したいこと xを0から2πまで動かしたとき、cos(x)+cos(y)=0 をyについて解きたいです。 発生している問題・エラーメッセージ xを動かしてもyが動

  • 解決済

    C++,2つのクラスで相互に代入演算をオーバーロード

    C++で演算子オーバーロードを使ったソフトを作っています。 Class AとClass Bがあったとき、下記のようにすると、 Class Bのほうは問題なく=をオーバーロー

  • 解決済

    配列

    n個のデータを配列に読み込み、平均と分散を求めるプログラムを作成して、下記のデータで試せ、という問題です。 {3.9,10.4,9.5,7.5,2.8,4.8,2.9,8.1,3

  • 解決済

    SQLのData型から、Javaで曜日を取得したいです。

    SQLにData型で2017-4-1と入っています。それをJavaで取得し、曜日を出したいのですが、どう書けばよいのか分かりません。calendarメソッドやDAY_OF_WEEK

  • 解決済

    JPanelの結果を、他のJPanelに反映させたい。

    JPanel j2の、Count(i)の結果を、j1のLabelに反映させたい。 import javax.swing.*; import java.awt.*; import

  • 解決済

    f(x) = x^ 3 − 2 = 0 を二分法で解きたい

     前提・実現したいこと 現在プログラミング言語について学習しています。まだまだ初心者で分からないことが多すぎて困っています。そこで二分法を用いたプログラムの課題を与えられたのですが

同じタグがついた質問を見る

  • C

    3706questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。