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

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

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

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

Q&A

解決済

1回答

606閲覧

privateのメンバ変数の値が勝手に変わる

Suisoniumu

総合スコア14

C++

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

0グッド

0クリップ

投稿2023/01/21 10:38

前提

c++でclassのprivateなメンバ変数が意図せず変わります。
関数を使用するとその後に変数の値が0になります。

実現したいこと

ソースコード中の、printRate関数を使用した後もメンバ変数の値を変えないようにする。
それと、原因が分かる人は教えてほしいです。

発生している問題

printRate関数の前後で変数の値が変わっている。

0.0010653 |100.00%|[==================================================>] : solveK 0.00

該当のソースコード

C++

1#include <iostream> 2#include <fstream> 3#include <iomanip> 4#include <cmath> 5#include <stdlib.h> 6#include <string> 7#include <time.h> 8#include <random> 9#define pi 3.1415926f 10using namespace std; 11using std::ofstream; 12 13void printRate(float rate,string text=""){ 14 fflush(stdout); 15 cout << "\r"; 16 int width = 50; 17 int before = width*rate; 18 int after = width-before-1; 19 cout << "|" << std::setw(6) << fixed << setprecision(2) << rate*100.0 << "%" << "|" << "[";//6文字分のスペースを確保、fixedで小数であることを伝える、小数点以下2桁表示 20 //cout << "|" << setw(6) << setprecision(2) << rate*100.0 << "%" << "|" << "["; 21 for(int i=0;i<before;i++){ 22 cout << "="; 23 } 24 cout << ">"; 25 for(int i=0;i<after;i++){ 26 cout << "."; 27 } 28 cout << "] : " << text; 29} 30 31float solveK_HERE(float* m,float** v,int N){ 32 float K=0; 33 int n=N/64; 34 for(int i=0;i<N;i++){ 35 float v2 = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; 36 K += m[i]*v2/2.0; 37 if((i+1)%n==0){ 38 printRate((float)(i+1)/(float)N,"solveK"); 39 } 40 } 41 cout << endl; 42 return K; 43} 44 45class Parameter { 46 public: 47 double R,T,K; 48 double factor_L,factor_T,factor_M; 49 50 void setKbar(float value){ 51 k_bar = value; 52 } 53 54 float readKbar(){ 55 return k_bar; 56 } 57 58 //初期化 59 Parameter(){ 60 factor_L = 1.5e10; 61 factor_T = 3.1e7; 62 factor_M = 2e30; 63 R = 8.314f; 64 T = 30.; 65 } 66 67 //クラス関数 68 void initialize(); 69 void printInfo(); 70 71 private: 72 float k_bar; 73}; 74 75void Parameter::initialize(){ 76 setKbar(R*T /pow(factor_L/factor_T,2)); 77} 78 79int main(void){ 80 Parameter para; 81 para.initialize(); 82 83 cout << para.readKbar() << endl; 84 85 float* m=new float[100]; 86 float** v=new float*[100]; 87 for(int i=0;i<100;i++){ 88 v[i] = new float[3]; 89 } 90 solveK_HERE(m,v,100); 91 92 //この次にk_barを表示すると中身が0になってる 93 cout << para.readKbar(); 94 95 96} 97 98

試したこと

19行目のfixedを消すと0では無くなりましたが、元の値とは違うままでした。

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

windows 11
gcc version 9.2.0 (MinGW.org GCC Build-2)

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

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

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

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

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

guest

回答1

0

ベストアンサー

値は変わっていません。 出力書式が変わっています。

マニピュレータで設定した書式は新たに設定するまで維持されます。 つまり、 fixedsetprecision(2) の効果がずっと続いているために小数点以下二桁しか表示されないのです。 (なぜか例外的に setw の効果だけ出力の後にデフォルトに再設定される変な仕様です。)

書式を改めて設定してください。

投稿2023/01/21 11:24

SaitoAtsushi

総合スコア5444

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

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

Suisoniumu

2023/01/21 14:20

fixedの前後で cout<<defaultfloat を設定しても表示が違う(四捨五入されてる)のですが、書式設定がおかしいのでしょうか…?
SaitoAtsushi

2023/01/21 14:43

defaultfloat は fixed の効果のみを無効にするので setprecision(2) の効果は残り、有効桁数 2 桁で表示されることになります。
Suisoniumu

2023/01/21 23:52

ありがとうございます。 勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問