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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

831閲覧

サンプルアプリのconstを削除するとエラーが出るので、どのように対処したらよいか教えていただきたいです。

Toro

総合スコア10

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2022/03/14 01:13

編集2022/03/14 03:23

前提・実現したいこと

Live2Dデータを壁紙に表示できるサンプルアプリを編集して、
モデルの切り替え機能を実装しようとしています。
(githubリンク)

画面をタッチすると、読み込むLive2Dモデルのパスを切り替えて再度読み込みをするような動作を実現したいです。
そこで以下のように、画面をタッチしたときに動作する関数のOnDragとOnTapに、changeModelという読み込むモデルを切り替える関数を追加しました。
また、変数の値を変更できるようにしようとしているので、関連する関数のconstをコメントアウトしています。

C++

1{} 2 3void LWallpaperLive2DManager::OnDrag(csmFloat32 x, csmFloat32 y) //const 4{ 5 //灯篭が追加 6 changeModel("MangaJK02"); 7 LWallpaperModel* model = GetModel(); 8 model->SetDragging(x, y); 9} 10 11void LWallpaperLive2DManager::OnTap(csmFloat32 x, csmFloat32 y) 12{ 13 //灯篭が追加 14 changeModel("MangaJK02"); 15 if (_model->HitTest(HitAreaNameHead, x, y)) 16 { 17 _model->SetRandomExpression(); 18 } 19 else if (_model->HitTest(HitAreaNameBody, x, y)) 20 { 21 _model->StartRandomMotionWithOption(MotionGroupTapBody, PriorityNormal); 22 } 23} 24 25{} 26 27//元の-> 28//void LWallpaperLive2DManager::LoadModel(const std::string modelDirectoryName) 29void LWallpaperLive2DManager::LoadModel(std::string modelDirectoryName) 30{ 31 // モデルのディレクトリを指定 32 SetAssetDirectory(LWallpaperDefine::ResourcesPath + modelDirectoryName + "/"); 33 34 // モデルデータの新規生成 35 _model = new LWallpaperModel(modelDirectoryName, _currentModelDirectory); 36 37 // モデルデータの読み込み及び生成とセットアップを行う 38 static_cast<LWallpaperModel*>(_model)->SetupModel(); 39} 40 41{} 42 43void LWallpaperLive2DManager::changeModel(std::string modelDirectoryName) //const 44{ 45 delete _model; 46 _viewMatrix = new CubismMatrix44(); 47 LoadModel("MangaJK02"); 48}

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

以下のようにエラーが出ます。
また、関連する関数のconstを削除していくというやり方が正しいのかもわかりません。こちらも合わせて教えていただければ幸いです。

Build command failed. Error while executing process C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\cmake\3.18.1\bin\ninja.exe with arguments {-C C:\Users\{ユーザー名}\AndroidStudioProjects\CubismAndroidLiveWallpaper\AndroidWallPaper\app\.cxx\cmake\debug\armeabi-v7a Demo} ninja: Entering directory `C:\Users\{ユーザー名}\AndroidStudioProjects\CubismAndroidLiveWallpaper\AndroidWallPaper\app\.cxx\cmake\debug\armeabi-v7a' [1/2] Building CXX object CMakeFiles/Demo.dir/src/main/cpp/LWallpaperLive2DManager.cpp.o FAILED: CMakeFiles/Demo.dir/src/main/cpp/LWallpaperLive2DManager.cpp.o C:\Users\{ユーザー名}\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=armv7-none-linux-androideabi16 --gcc-toolchain=C:/Users/{ユーザー名}/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/{ユーザー名}/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/sysroot -DCSM_TARGET_ANDROID_ES2 -DDemo_EXPORTS -I../../../../../../thirdParty/stb -IC:/Users/{ユーザー名}/AndroidStudioProjects/CubismAndroidLiveWallpaper/FrameWork/src -isystem ../../../../../../Core/include -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O0 -fno-limit-debug-info -fPIC -std=c++14 -MD -MT CMakeFiles/Demo.dir/src/main/cpp/LWallpaperLive2DManager.cpp.o -MF CMakeFiles\Demo.dir\src\main\cpp\LWallpaperLive2DManager.cpp.o.d -o CMakeFiles/Demo.dir/src/main/cpp/LWallpaperLive2DManager.cpp.o -c ../../../../src/main/cpp/LWallpaperLive2DManager.cpp In file included from ../../../../src/main/cpp/LWallpaperLive2DManager.cpp:8: ../../../../src/main/cpp/LWallpaperLive2DManager.hpp:120:41: warning: ISO C++11 does not allow conversion from string literal to 'Csm::csmChar *' (aka 'char *') [-Wwritable-strings] Csm::csmChar* _modelDirectoryName = "Hiyori";//MangaJKはモーションがないので、モーション再生はひよりでテスト ^ ../../../../src/main/cpp/LWallpaperLive2DManager.cpp:141:23: error: non-const lvalue reference to type 'basic_string<...>' cannot bind to a temporary of type 'basic_string<...>' SetAssetDirectory(LWallpaperDefine::ResourcesPath + modelDirectoryName + "/"); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../../../../src/main/cpp/LWallpaperLive2DManager.cpp:130:62: note: passing argument to parameter 'path' here void LWallpaperLive2DManager::SetAssetDirectory(std::string &path) ^ 1 warning and 1 error generated. ninja: build stopped: subcommand failed.

以下の記事も参考にしています。
2021年夏のLive2Dワークショップ
2021年夏のLive2Dワークショップのスライド

該当のソースコード

\app\src\main\cpp\LWallpaperLive2DManager.cpp

C++

1/** 2 * Copyright(c) Live2D Inc. All rights reserved. 3 * 4 * Use of this source code is governed by the Live2D Open Software license 5 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. 6 */ 7 8#include "LWallpaperLive2DManager.hpp" 9#include <string> 10#include <GLES2/gl2.h> 11#include <Rendering/CubismRenderer.hpp> 12#include "LWallpaperPal.hpp" 13#include "LWallpaperDefine.hpp" 14#include "LWallpaperDelegate.hpp" 15#include "LWallpaperModel.hpp" 16#include "LWallpaperView.hpp" 17 18using namespace Csm; 19using namespace LWallpaperDefine; 20using namespace std; 21 22namespace { 23 LWallpaperLive2DManager* s_instance = nullptr; 24} 25 26LWallpaperLive2DManager* LWallpaperLive2DManager::GetInstance() 27{ 28 if (!s_instance) 29 { 30 s_instance = new LWallpaperLive2DManager(); 31 } 32 33 return s_instance; 34} 35 36void LWallpaperLive2DManager::ReleaseInstance() 37{ 38 if (s_instance) 39 { 40 delete s_instance; 41 } 42 43 s_instance = nullptr; 44} 45 46LWallpaperLive2DManager::LWallpaperLive2DManager() 47{ 48 _viewMatrix = new CubismMatrix44(); 49 LoadModel(_modelDirectoryName); 50} 51 52LWallpaperLive2DManager::~LWallpaperLive2DManager() 53{ 54 ReleaseModel(); 55} 56 57void LWallpaperLive2DManager::ReleaseModel() 58{ 59 delete _model; 60} 61 62LWallpaperModel* LWallpaperLive2DManager::GetModel() const 63{ 64 return _model; 65} 66 67void LWallpaperLive2DManager::OnDrag(csmFloat32 x, csmFloat32 y) //const 68{ 69 //灯篭が追加 70 changeModel("MangaJK02"); 71 LWallpaperModel* model = GetModel(); 72 model->SetDragging(x, y); 73} 74 75void LWallpaperLive2DManager::OnTap(csmFloat32 x, csmFloat32 y) 76{ 77 //灯篭が追加 78 changeModel("MangaJK02"); 79 if (_model->HitTest(HitAreaNameHead, x, y)) 80 { 81 _model->SetRandomExpression(); 82 } 83 else if (_model->HitTest(HitAreaNameBody, x, y)) 84 { 85 _model->StartRandomMotionWithOption(MotionGroupTapBody, PriorityNormal); 86 } 87} 88 89void LWallpaperLive2DManager::OnUpdate() const 90{ 91 int width = LWallpaperDelegate::GetInstance()->GetWindowWidth(); 92 int height = LWallpaperDelegate::GetInstance()->GetWindowHeight(); 93 94 CubismMatrix44 projection; 95 96 LWallpaperModel* model = GetModel(); 97 98 if (model->GetModel()->GetCanvasWidth() > 1.0f && width < height) 99 { 100 // 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する 101 model->GetModelMatrix()->SetWidth(2.0f); 102 projection.Scale(0.3f, static_cast<float>(width) / static_cast<float>(height)*0.3f); 103 // 元のコード -> 104 // projection.Scale(1.0f, static_cast<float>(width) / static_cast<float>(height)); 105 } 106 else 107 { 108 // サイズ小さく (灯篭 109 projection.Scale(static_cast<float>(height) / static_cast<float>(width) * 0.3f, 0.3f); 110 // 元のコード -> 111 // projection.Scale(static_cast<float>(height) / static_cast<float>(width), 1.0f); 112 } 113 114 // 必要があればここで乗算 115 if (_viewMatrix) 116 { 117 projection.MultiplyByMatrix(_viewMatrix); 118 } 119 120 // モデル1体描画前コール 121 LWallpaperDelegate::GetInstance()->GetView()->PreModelDraw(*model); 122 123 model->Update(); 124 model->Draw(projection);///< 参照渡しなのでprojectionは変質する 125 126 // モデル1体描画前コール 127 LWallpaperDelegate::GetInstance()->GetView()->PostModelDraw(*model); 128} 129 130void LWallpaperLive2DManager::SetAssetDirectory(std::string &path) 131//void LWallpaperLive2DManager::SetAssetDirectory(const std::string &path) 132{ 133 _currentModelDirectory = path; 134} 135 136//元の-> 137//void LWallpaperLive2DManager::LoadModel(const std::string modelDirectoryName) 138void LWallpaperLive2DManager::LoadModel(std::string modelDirectoryName) 139{ 140 // モデルのディレクトリを指定 141 SetAssetDirectory(LWallpaperDefine::ResourcesPath + modelDirectoryName + "/"); 142 143 // モデルデータの新規生成 144 _model = new LWallpaperModel(modelDirectoryName, _currentModelDirectory); 145 146 // モデルデータの読み込み及び生成とセットアップを行う 147 static_cast<LWallpaperModel*>(_model)->SetupModel(); 148} 149 150void LWallpaperLive2DManager::SetGravitationalAccelerationX(float gravity) 151{ 152 if(_model) 153 { 154 _model->SetGravitationalAccelerationX(gravity); 155 } 156} 157 158// 灯篭が追加 159void LWallpaperLive2DManager::changeModel(std::string modelDirectoryName) //const 160{ 161 delete _model; 162 _viewMatrix = new CubismMatrix44(); 163 LoadModel("MangaJK02"); 164}

試したこと

対処方法を調べている途中ですが、自力で解決するにはまだかなり時間がかかってしまいそうだったので質問させていただきました。
念のため現在みているサイトのリンクをのせておきます。
C++において,文字列リテラルから 'char*型' への変換が非推奨? エラーメッセージ
c言語_constで注意すべきこと

補足情報(FW/ツールのバージョンなど)

【Cubism SDKのバージョン】CubismSdkForNative-4-r.4
【エミュレータ】Pixcel 2 API 30
【スマホ】Sony SOV34 (Xperia, Android 8.0)
【OS名・バージョン】Windows 10
【開発使用ツール】Android Studio Bumblebee | 2021.1.1

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

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

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

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

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

hoshi-takanori

2022/03/14 05:27

.cpp に合わせて .h も変更する必要がある (本来は逆ですが) と思いますし、呼び出し側もいじる必要があるかも知れませんし、そもそもプログラムの構造を見直すことになる可能性もないとは言えないですね…。
guest

回答1

0

関連する関数のconstを削除していくというやり方が正しいのか

そんなの,
全てを把握して「適切に削除していく」なら「正しい」と言えるのでしょうし,
そうでないなら「正しい」とは言えない……というだけの話かと思えます.

例えば,SetAssetDirectory() の引数は const std::string& たるべきなのではないか? と推測しますが,
仮に,元々そうなっていたのをあなたが「constを削除」したのであれば,それはもう「何も分かってないのに手当たり次第に "const" という文字列を削除している」ということになりますよね.
(もしそうであれば,そんな作業が「正しい」わけがない.)

どこかに "const" と書いてあるとき,

  • 元々何故constなのか?
  • そこは非constに直す必要があるのか?(それともそのままとすべきなのか)
  • 非constに変えるならば,一体どのように直せば良いのか?(そこの "const" の5文字を削除すればそれで済むとは限らない)

…を,ちゃんと考えることから始めるべきです.

投稿2022/03/14 05:52

fana

総合スコア11729

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

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

fana

2022/03/14 05:56

> 1 warning and 1 error の内容については, エラーメッセージが懇切丁寧に説明しているのだから,ちゃんと読めばいいと思うの.
Toro

2022/03/20 14:38

ありがとうございます! 基礎から勉強しなおしてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問