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

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

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

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

C++

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

Q&A

解決済

2回答

3952閲覧

構造体に値を代入をしようとする際expected expressionエラーが出てしまいます。

w022alzlv

総合スコア5

C

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

C++

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

0グッド

0クリップ

投稿2022/02/10 14:43

1.前提・実現したいこと

C++を用いてコンソール上で動作するブロック崩しアプリを作成しています。

下記動画の、1時間42分辺りが該当箇所です。
ブロックくずしを作ってみる #1「リアルタイム処理」 【C言語ゲームプログラミング実況ライブ】

エラーの発生原因を教えて頂きたいです。

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

中央よりやや下、[6-?-?]パドルの座標を初期化する で構造体であるVEC2のpaddlePositionに値を代入しようとするとエラーが出てしまいます。
具体的なエラーメッセージは「expected expression gcc [83、 22]」です。

3.該当のソースコード

コード全体です。

C++

1// [1]ヘッダーをincludeする場所 2#include <stdio.h> // [1-?]標準入出力ヘッダーをインクルードする 3#include <string.h> // [1-?]文字列操作ヘッダーをインクルードする 4 5// [2]定数を宣言する場所 6#define FIELD_WIDTH (15) // [2-?]フィールドの幅を宣言 7#define FIELD_HEIGHT (20) // [2-?]フィールドの高さを宣言 8 9#define PADDLE_WIDTH (3) // [2-?]パドルの幅を宣言する 10 11// [3]列挙定数を宣言する場所 12// [3-?]タイルの種類を宣言する 13enum { 14 TILE_NONE, // [3-?-?]何も無い 15 TILE_BLOCK, // [3-?-?]ブロック 16 TILE_PADDLE, // [3-?-?]パドル 17 TILE_MAX // [3-?-?]種類の数 18}; 19 20// [4]構造体を宣言する場所 21// [4-?]ベクトル構造体を宣言する 22typedef struct { 23 int x, y; 24}VEC2; 25 26 27// [5]変数を宣言する場所 28// [5-?]タイルのアスキーアートを宣言する 29const char *tileAA[] = { 30 "・", // [5-?-?]TILE_NONE, 何も無い 31 "🟫", // [5-?-?]TILE_BLOCK, ブロック 32 "回", // [5-?-?]TILE_PADDLE, パドル 33}; 34 35int field [FIELD_WIDTH][FIELD_HEIGHT]; // [5-?]フィールドを宣言する 36int screen [FIELD_WIDTH][FIELD_HEIGHT]; // [5-?]画面を宣言する 37 38VEC2 paddlePosition; // [5-?]パドルの座標を宣言する 39 40// [6]関数を宣言する場所 41// [6-?]画面を描画する関数を宣言 42void DrawScreen(){ 43 // [6-?-?]画面にフィールドをコピーする 44 memcpy(screen, field, sizeof field); 45 46 // [6-?-?]パドルの幅だけ反復する 47 // for(int x = 0; x < PADDLE_WIDTH; x++){ 48 // screen[paddlePosition.y][paddlePosition.x] = TILE_PADDLE; 49 // } 50 51 // [6-?-?]上の壁を描画する 52 for(int x = 0; x < FIELD_WIDTH + 2; x++){ 53 printf("⬜️"); 54 } 55 // [6-?-?]上の壁の描画が終わり次第改行 56 printf("\n"); 57 // [6-?]全ての行を反復する 58 for(int y = 0; y < FIELD_HEIGHT; y++){ 59 // [6-?-?]左の壁を描画する 60 printf("⬜️"); 61 // [6-?-?]全ての列を反復する 62 for(int x = 0; x < FIELD_WIDTH; x++){ 63 // [6-?-?]対象のマスを描画する 64 printf("%s", tileAA[screen[y][x]]); 65 } 66 printf("⬜️"); // [6-?-?]右の壁を描画する 67 // [6-?-?]1行描画する毎に改行 68 printf("\n"); 69 } 70} 71// [6-?]ゲームをリセットする関数を宣言する 72void Reset(){ 73 // [6-?-?]フィールドの上の方を反復する 74 for(int y = 0; y < 6; y++){ 75 // [6-?-?]全ての列を反復する 76 for(int x = 0; x < FIELD_WIDTH; x++){ 77 // [6-?-?]対象の座標にブロックを配置する 78 field[y][x] = TILE_BLOCK; 79 } 80 } 81 82 // [6-?-?]パドルの座標を初期化する 83 // paddlePosition = {( FIELD_WIDTH - PADDLE_WIDTH ) / 2, FIELD_HEIGHT - 2}; 84 85 // [6-?-?]画面を描画する関数を呼び出す 86 DrawScreen(); 87} 88// [6-?]プログラムの実行開始を宣言する 89int main (){ 90 // [6-?]ゲームをリセットする関数を呼び出す 91 Reset(); 92 // [6-?-?]メインループを追加する 93 while (1){ 94 95 } 96}

エラーの原因であるコードを記述しない場合、下画像のような描写となります。
描写が成功した場面

4.自分で調べたことや試したこと

C++

1typedef struct { 2 int x, y; 3}VEC2;

typedefを記述することによって、構造体を宣言する際structを省略出来るということは理解しました。

なので構造体を宣言する際本来は

struct VEC2 paddlePosition;

と記述する必要がある所を

VEC2 paddlePosition;

の記述だけで済む。

宣言までは上手くいっていると思っています。
ですが代入をする際にエラーとなります。

5.使っているツールのバージョンなど補足情報

エディターはVisual Studio Code
動作環境は拡張機能の「C/C++ v1.1.3」です。

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

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

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

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

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

guest

回答2

0

最近の g++やclang だとエラーにはならない気がしますが・・・

Cだったら、gcc や clang では
paddlePosition = (VEC2){( FIELD_WIDTH - PADDLE_WIDTH ) / 2, FIELD_HEIGHT - 2};
とすれば代入にできます。

古いコンパイラやその他のコンパイラは出来ない物もあるかと思います。

投稿2022/02/10 21:09

編集2022/02/10 21:23
PingHermit

総合スコア478

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

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

0

ベストアンサー

paddlePosition = {( FIELD_WIDTH - PADDLE_WIDTH ) / 2, FIELD_HEIGHT - 2};

これは初期化ではなく、代入です。
なので、初期化式は使えません

ふつーに代入の式を書きましょう

投稿2022/02/10 14:47

y_waiwai

総合スコア88163

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

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

w022alzlv

2022/02/11 01:43

解決方法のご提示ありがとうございます! 無事解決出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問