Gnuplotを使用してC++でグラフを描画しています。グラフは予想どおりにプロットされていますが、コンパイル中に警告があります。警告はどういう意味ですか?
warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
これは私が使用している機能です:
void plotgraph(double xvals[],double yvals[], int NUM_POINTS)
{
char * commandsForGnuplot[] = {"set title \"Probability Graph\"",
"plot 'data.temp' with lines"};
FILE * temp = fopen("data.temp", "w");
FILE * gnuplotPipe = popen ("gnuplot -persistent ", "w");
int i;
for (i=0; i < NUM_POINTS; i++)
{
fprintf(temp, "%lf %lf \n", xvals[i], yvals[i]);
//Write the data to a te mporary file
}
for (i=0; i < NUM_COMMANDS; i++)
{
fprintf(gnuplotPipe, "%s \n", commandsForGnuplot[i]);
//Send commands to gn uplot one by one.
}
fflush(gnuplotPipe);
}
文字列リテラルはconst charの配列であり、これはドラフトC++標準セクション2.14.5
文字列リテラルこれは(重点鉱山):
通常の文字列リテラルとUTF-8文字列リテラルは、ナロー文字列リテラルとも呼ばれます。狭い文字列リテラルは、「n const charの配列」型を持ちます。ここで、nは、以下で定義される文字列のサイズで、静的な保存期間( 3.7)。
この変更により、警告が削除されます。
const char * commandsForGnuplot[] = {"set title \"Probability Graph\"", "plot 'data.temp' with lines"};
^^^^^
constまたはstringリテラルの変更は ndefinedなので、* non-const char **がconstデータを指すようにすることは悪い考えです。動作 。これはセクション7.1.6.1
cv-qualifiers:
Mutable(7.1.1)として宣言されたクラスメンバを変更できる場合を除き、存続期間(3.8)の間にconstオブジェクトを変更しようとすると、未定義の動作が発生します。
セクション2.14.5
文字列リテラルは次のとおりです。
すべての文字列リテラルが異なる(つまり、重複しないオブジェクトに格納される)かどうかは、実装によって定義されます。文字列リテラルを変更しようとする効果は未定義です。