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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

2639閲覧

初学者 構造体の配列を関数の引数に渡す方法が知りたい

tendon_udon

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/20 02:06

編集2021/05/20 04:45

前提・実現したいこと

c++初心者です

提示コードですが、draw関数に構造体の配列ichiを引数で渡したいのですがどうすればいいでしょうか?
配列でない構造体ではできるのですが...

発生している問題・エラーメッセージ

ques.cpp: In function ‘void draw(board*)’:
ques.cpp:18:8: error: no match for ‘operator>>’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’})
18 | cout>>ichi[0].maru>>endl;
| ~~~~^~~~~~~~~~~~~~
| | |
| | std::string {aka std::__cxx11::basic_string<char>}
| std::ostream {aka std::basic_ostream<char>}
In file included from /usr/include/c++/9/string:56,
from /usr/include/c++/9/bits/locale_classes.h:40,
from /usr/include/c++/9/bits/ios_base.h:41,
from /usr/include/c++/9/ios:42,
from /usr/include/c++/9/istream:38,
from /usr/include/c++/9/sstream:38,
from /usr/include/c++/9/complex:45,
from /usr/include/c++/9/ccomplex:39,
from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:54,
from ques.cpp:1:
/usr/include/c++/9/bits/basic_string.tcc:1466:5: n

該当のソースコード

c++

#include <bits/stdc++.h> #include<iostream> #include<string> #include<vector> #include <array> using namespace std; using std::cout; using std::endl; using std::vector; using std::string; struct board{ int x; int y; string maru; }; void draw(board ichi[]) { cout>>ichi[0].maru>>endl;} int main(){ int i,k,j; board ichi[9]; i=0; while(i<9){ for(k=1;k<4;k++){ for(j=1;j<4;j++){ ichi[i]={k,j,0,"○"}; i++; } } } draw(ichi); return 0; }

#補足
コンパイルエラーはまだ続いているのですが、膨大すぎるのでpick upしてのせました

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuma-s

2021/05/20 02:52

ソースコードの貼り付けに失敗しているのを何とも思いませんか? teratail のヘルプを見て、修正してください。
tendon_udon

2021/05/20 03:13

ご指摘ありがとうございますm(__)m 修正しました
guest

回答4

0

cout には << という演算子はあっても、>> という演算子はありません。
cin には >> があります。
エラーメッセージをちゃんと読みましょう。

投稿2021/05/20 02:51

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tendon_udon

2021/05/20 03:25

そのとおりでした no match for ' operator'>> ってかいてありますね ご指摘ありがとうございますm(__)m
guest

0

配列を関数に渡す典型パターンをいくつか紹介しておきます。関数名はとりあえずfooにしておきます。

配列の先頭へのポインタを引数に取る

c

1void foo(int* arr);

これは関数側からは要素数がわからないのでbuffer overrunの危険があります。やめましょう。

配列の先頭へのポインタと要素数を引数に取る

c

1void foo(int* arr, std::size_t n);

これならbuffer overrunの危険がありません。C APIによく見られるパターンです

配列へのlvalue refreceを引数に取る

cpp

1template<std::size_t N> 2void foo(int (&arr)[N]);

この場合配列の要素数情報が型から消えないためbuffer overrunの危険がありませんが、要素数を可変にするためにtemplateが必要となるため、ヘッダーファイルに事実上書く必要があります。めったに使わない。

Cの配列を投げ捨ててstd::arrayを使う場合

cpp

1template<std::size_t N> 2void foo(std::array<int, N>& arr);

安全に扱えますが、呼び出し側に制約を与えるため利用ケースは限られます。どっちかというとconst std::array<int, N>&のほうがまだ使う。後述のイテレータのほうがよく使うので出番なし

イテレータのペアを受け取る

cpp

1template<typename Iterator> 2void foo(Iterator begin, Iterator end);

最頻出パターン。要素の先頭と終端の一つ先へのイテレータを渡す。それぞれstd::begin(), std::end()で取れる(C++20からはstd::ranges::begin()/std::ranges::end())。

引数が2個なのと、呼び出し側にボイラープレートが増えるのが問題。

また、template引数が本当にイテレータなのか検査が必要だが、C++11では安全に検査する方法はなく、C++14を待たなければならない・・・あれっ、そうだっけ??まあなんにせよiterator_traits見たりするので面倒くさい。
https://stackoverflow.com/questions/25290462/how-to-define-is-iterator-type-trait

rangeを受け取る(C++20)

cpp

1template<std::ranges::range Range> 2void foo(Range&& r)

こういうかんじですね。C++20で追加されたconceptを使っています。呼び出し側も1引数で済むのでこれからの主流でしょう。

cpp

1#include <ranges> 2#include <iostream> 3template<std::ranges::range Range> 4void foo(Range&& r) 5{ 6 std::cout << std::ranges::size(r) << std::endl; 7} 8int main() 9{ 10 int arr[3]{}; 11 foo(arr); 12}

https://wandbox.org/permlink/9TMsIsMpsYkjtl0y

投稿2021/05/20 23:47

編集2021/05/20 23:49
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C++

1#include <iostream> 2#include <string> 3 4struct board { 5 int x; 6 int y; 7 std::string maru; 8}; 9 10void draw(board ichi[]) { 11 using namespace std; 12 cout << ichi[0].maru << " " << ichi[3].maru << " " << ichi[6].maru << endl; 13 cout << ichi[1].maru << " " << ichi[4].maru << " " << ichi[7].maru << endl; 14 cout << ichi[2].maru << " " << ichi[5].maru << " " << ichi[8].maru << endl; 15} 16 17int main() { 18 int i, k, j; 19 board ichi[9]; 20 i = 0; 21 22 while (i < 9) { 23 for (k = 1; k < 4; k++) { 24 for (j = 1; j < 4; j++) { 25 ichi[i] = { k,j,"○" }; 26 i++; 27 } 28 } 29 } 30 31 draw(ichi); 32 return 0; 33}

投稿2021/05/20 02:39

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tendon_udon

2021/05/20 03:03

膨大なエラーの原因は<<を>>にしてたことだったんですね ありがとうございます!! また、includeやstdも重要だったのですね(全然わからなかったのでとりあえず入れとけの精神でincludeしまくってました 初期学習中に、ふと思いついたプログラムを実装したくなったのでつくったのですが、新しいプログラムを作るのは基本を終えてからにしようと思います
episteme

2021/05/20 03:09

× 全然わからなかったのでとりあえず入れとけ ○ 目的の実現には不可欠なので確実に入れとく
episteme

2021/05/20 03:14 編集

あと #include <bits/stdc++.h> これはやめとけ。 どれを #include すべきかわかんなくなる。 ...とはいえ「初学者にどれ#includeするかなんてわかるわけねーだろ。そんなことよりコード書いて動くことを体感させたい」ってことなら、わからんでもない。
tendon_udon

2021/05/20 03:21

#include<bits/stdc++.h>は包括的すぎて言語の理解を妨げるのですね… 気をつけますm(__)m
guest

0

board ichi[9];で確保されるのはichi[0]からichi[8]までです。ichi[9]にアクセスした場合、何が起きるかわかりません

投稿2021/05/20 02:11

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tendon_udon

2021/05/20 02:22

そうですね! ichi[6].maruを抜かしてました… ですが、修正してもコンパイルエラーが出てしまいます…
maisumakun

2021/05/20 02:30 編集

> 修正してもコンパイルエラーが出てしまいます… コンパイルエラーが出るのでしたら、質問時点で書いてほしかったです。 どこにどのようなエラーが出ましたか?
tendon_udon

2021/05/20 03:15

確かにそうすべきでした ご指摘ありがとうございます 再編集しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問