構造体の配列へのアクセス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kanse
記事: 6
登録日時: 10年前

構造体の配列へのアクセス

#1

投稿記事 by kanse » 10年前

下記のコードをデバックすると,i=5まで実行されて t.time = 905までは出力されます。
その後 "0x011F1823で例外がスローされました : 0xC0000005:場所0x0043D00Cへの書き込み中にアクセス違反が発生しました"
と出たのですが、どう対処したらいいのでしょうか?

コード:

t[i].time.push_back(900+i);
というのも考えたのですが、式にはクラス型が必要ですと出てビルドできません。

コード:

#include <iostream>
//名前空間指定することでstd::を記載する必要がなくなる
#include <vector>
#include <string>
#include <random>

#include <algorithm>
using namespace std;

typedef struct {
	int day;int time;
	int buy_ita[8]; int sell_ita[8];
	int buy_price[8]; int sell_price[8];
	int ryou; int price;
	int limit_delta_buy[8], limit_delta_price_buy[8];
	int limit_delta_sell[8], limit_delta_price_sell[8];
	int delta_price;
	int trading_volume;
}Ita;

int main()
{
vector<Ita> t;
	
	t.push_back(Ita()); // add 要素にアクセスする前に、push_backやresize、コンストラクタなどで領域(要素)を確保しないといけない。

	int max_gyou = 100;
	//test
	for (int i = 0; i < max_gyou; i++) {
		t[i].time = 900 + i;
		for (int j = 0; j < 8; j++) {
			t[i].buy_ita[j] = 1000 * j+i;
		}
		cout << t[i].time <<","<< t[i].buy_ita[1] << endl;
	}
return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の配列へのアクセス

#2

投稿記事 by みけCAT » 10年前

kanse さんが書きました:下記のコードをデバックすると,i=5まで実行されて t.time = 905までは出力されます。
その後 "0x011F1823で例外がスローされました : 0xC0000005:場所0x0043D00Cへの書き込み中にアクセス違反が発生しました"
と出たのですが、どう対処したらいいのでしょうか?

ソースコード中のコメント「要素にアクセスする前に、push_backやresize、コンストラクタなどで領域(要素)を確保しないといけない。」の通りです。
当然、要素は使う数以上確保しないといけません。

コード:

#include <iostream>
//名前空間指定することでstd::を記載する必要がなくなる
#include <vector>
#include <string>
#include <random>

#include <algorithm>
using namespace std;

typedef struct {
	int day;int time;
	int buy_ita[8]; int sell_ita[8];
	int buy_price[8]; int sell_price[8];
	int ryou; int price;
	int limit_delta_buy[8], limit_delta_price_buy[8];
	int limit_delta_sell[8], limit_delta_price_sell[8];
	int delta_price;
	int trading_volume;
}Ita;

int main()
{
vector<Ita> t;

	// delete
	// t.push_back(Ita()); // add 要素にアクセスする前に、push_backやresize、コンストラクタなどで領域(要素)を確保しないといけない。

	int max_gyou = 100;
	//test
	for (int i = 0; i < max_gyou; i++) {
		t.push_back(Ita()); // add 要素にアクセスする前に、push_backやresize、コンストラクタなどで領域(要素)を確保しないといけない。
		t[i].time = 900 + i;
		for (int j = 0; j < 8; j++) {
			t[i].buy_ita[j] = 1000 * j+i;
		}
		cout << t[i].time <<","<< t[i].buy_ita[1] << endl;
	}
return 0;
}
kanse さんが書きました:

コード:

t[i].time.push_back(900+i);
というのも考えたのですが、式にはクラス型が必要ですと出てビルドできません。
t.timeはint型なので、メンバの参照はできません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kanse
記事: 6
登録日時: 10年前

Re: 構造体の配列へのアクセス

#3

投稿記事 by kanse » 10年前

使うたびに確保しないといけないのですね。

int型がメンバの参照のところは今のところよくわからないのですが、調べなおしてみようと思います。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 構造体の配列へのアクセス

#4

投稿記事 by Dixq (管理人) » 10年前

> int型がメンバの参照のところは今のところよくわからないのですが

分からないといっている意味がよく分かりません。
timeは構造体Ita内でint型で宣言しており、クラスのメンバ変数ではありません。

Ita ita;
ita.time = 900;

と出来るものに

Ita ita;
ita.time.push_back(***);

と書いているのと一緒だと考えると参照できるはずがないと分かると思います。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の配列へのアクセス

#5

投稿記事 by みけCAT » 10年前

kanse さんが書きました:使うたびに確保しないといけないのですね。
いいえ、既に確保した要素を使いまわすこともできます。
Dixq (管理人) さんが書きました:timeは構造体Ita内でint型で宣言しており、クラスのメンバ変数ではありません。
timeはクラスのメンバ変数です。(C++ではstructで宣言した「構造体」はメンバがデフォルトでpublicのクラスだったはずです)
クラスではないので、ドット演算子を用いて「timeのメンバ」(存在しない)にアクセスすることはできません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 構造体の配列へのアクセス

#6

投稿記事 by Dixq (管理人) » 10年前

書き間違えました

× クラスのメンバ変数ではありません。
○ メンバ変数はクラスではありません。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 構造体の配列へのアクセス

#7

投稿記事 by みけCAT » 10年前

Dixq (管理人) さんが書きました:メンバ変数はクラスではありません。
今回は(少なくとも見える場所では)使われていませんが、メンバ変数の型としてクラスを用いることもできます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る