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

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

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

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

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

Q&A

解決済

1回答

610閲覧

配列の中身が変わってしまう。

off

総合スコア6

C

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

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

0グッド

0クリップ

投稿2020/07/23 16:40

前提・実現したいこと

gnuplot で配列の中身を描画したい。だが、なぜか配列の中身が変わって、困ってしまった。

/* プロット開始 */ ///* gp = popen("gnuplot -persist", "w"); // パイプを開き、gnuplotの立ち上げ

の行の前後で配列の中身が変わってしまっている。
「ここからおかしい」の配列の1個目と2個目が
100, 75
から
-0.0, 0.0

に変わってしまっている。

どうすれば正しい値が出力されるのでしょうか?

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

エラーは起きていない

該当のソースコード

c

1#include<stdio.h> 2#include<math.h> // 累乗計算で使う 3#define N 5 //#define マクロ名 定数や式 4 5/* PIM throughput */ 6/* Find the PIM throughput when N=2 to N=50. */ 7 8/* Programming */ 9/* Write a program to obtain the result when N=2 to N=50. */ 10/* Plot the graph. */ 11 12 13/* 14再起関数で組み合わせnCrを作る 15forで2~50回回す 16毎回出力する 17*/ 18 19 20 21float combination(float n, float r){ 22 /* nCrの計算 */ 23 24 if(n == r) return(1.0); // (ex) 3C3 = 1 25 else if(n == 0.0) return(1.0); // (ex) 3C0 = 1 26 else if(r == 1.0) return(n); // (ex) 3C1 = 3 27 28 /* ------------------- */ 29 // 組み合わせは公式 30 // nCr = n-1Cr + n-1Cr-1 31 // より、再起関数で表せる。 32 /* ------------------- */ 33 return combination(n-1, r) + combination(n-1, r-1); 34} 35 36 37float caluculation(int n){ 38 /* --------------------------------------------- */ 39 /* 今回計算したいやつ */ 40 /* ∑{n}{k = 1} nCk * (1 / n)^k * (1 - 1/n)^(n-k) */ 41 /* --------------------------------------------- */ 42 43 float count_box = 0.0; // 一時的に保管する変数 44 45 for(int r=1; r<=n; r++){ 46 // (ex) 0.75 = 2C1 * (1/2)^1 * (1 - 1/2)^(2-1) + 2C2 * (1/2)^2 * (1 - 1/2)^(0) 47 count_box += combination(n, r) * pow(1.0/n, r) * pow(1.0 - 1.0/n, n-r); 48 } 49 return count_box; 50} 51 52int x[] = {}; 53 54int main(void){ 55 /* --------------------------------------------- */ 56 /* nを2~50まで以下の式を回す。 */ 57 /* ∑{n}{k = 1} nCk * (1 / n)^k * (1 - 1/n)^(n-k) */ 58 /* --------------------------------------------- */ 59 60 FILE *gp; 61 62 float throughput[] = {}; 63 64 printf("\n"); 65 66 for(int i=1; i<=N; i++){ 67 x[i] = i; 68 printf("x[%d] = %d\n", i, x[i]); 69 70 throughput[i] = caluculation(i) * 100; 71 72 printf("N= %d : Throughput=%.2f%%\n", i, throughput[i]); 73 74 if(i%10 == 0) printf("\n"); 75 } 76 printf("\n"); 77 78 79 for (int j=1; j <= N; j++) { 80 // 確認 81 printf("j=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", j, j, x[j], j, throughput[j]); 82 /* 83 j=1 x[1]=1 throughput[1]=100.00 84 j=2 x[2]=2 throughput[2]=75.00 85 j=3 x[3]=3 throughput[3]=70.37 86 j=4 x[4]=4 throughput[4]=68.36 87 j=5 x[5]=5 throughput[5]=67.23 88 */ 89 } 90 printf("\n"); 91 92 93 for (int m=1; m <= N; m++) { 94 // 確認 95 printf("m3=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", m, m, x[m], m, throughput[m]); 96 /* 97 m3=1 x[1]=1 throughput[1]=100.00 98 m3=2 x[2]=2 throughput[2]=75.00 99 m3=3 x[3]=3 throughput[3]=70.37 100 m3=4 x[4]=4 throughput[4]=68.36 101 m3=5 x[5]=5 throughput[5]=67.23 102 */ 103 } 104 printf("\n"); 105 106 /* プロット開始 */ 107 ///* 108 gp = popen("gnuplot -persist", "w"); // パイプを開き、gnuplotの立ち上げ 109 110 111 for (int m=1; m <= N; m++) { 112 // 確認 113 printf("ここからおかしいm2=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", m, m, x[m], m, throughput[m]); 114 /* 115 こからおかしいm2=1 x[1]=1 throughput[1]=-0.00 116 ここからおかしいm2=2 x[2]=2 throughput[2]=0.00 117 ここからおかしいm2=3 x[3]=3 throughput[3]=70.37 118 ここからおかしいm2=4 x[4]=4 throughput[4]=68.36 119 ここからおかしいm2=5 x[5]=5 throughput[5]=67.23 120 */ 121 122 } 123 printf("\n"); 124 125 126 127 fprintf(gp, "set multiplot\n"); // マルチプロットモード 128 fprintf(gp, "set xrange [0:%d]\n", x[N]); // 範囲の指定 129 fprintf(gp, "set yrange [60:100]\n"); 130 131 fprintf(gp, "set xlabel \"size n\"\n"); // ラベル表示 132 fprintf(gp, "set ylabel \"Throughput\"\n"); 133 134 for (int m=1; m <= N; m++) { 135 // 確認 136 printf("m=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", m, m, x[m], m, throughput[m]); 137 /* 138 m=1 x[1]=1 throughput[1]=-0.00 139 m=2 x[2]=2 throughput[2]=0.00 140 m=3 x[3]=3 throughput[3]=70.37 141 m=4 x[4]=4 throughput[4]=68.36 142 m=5 x[5]=5 throughput[5]=67.23 143 */ 144 145 } 146 printf("\n"); 147 148 // 曲線のプロット 149 fprintf(gp, "plot '-' with lines linetype 1\n"); 150 for (int k = 1; k <= N; k++) { 151 printf("k=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", k, k, x[k], k, throughput[k]); 152 /* 153 k=1 x[1]=1 throughput[1]=-0.00 154 k=2 x[2]=2 throughput[2]=0.00 155 k=3 x[3]=3 throughput[3]=70.37 156 k=4 x[4]=4 throughput[4]=68.36 157 k=5 x[5]=5 throughput[5]=67.23 158 */ 159 fprintf(gp, "%d\t%f\n", x[k], throughput[k]); 160 } 161 printf("\n"); 162 fprintf(gp, "e\n"); 163 164 165 166 167 // 点のプロット 168 fprintf(gp, "plot '-' with points pointtype 1\n"); 169 for (int l = 1; l <= N; l++) { 170 printf("l=%d\tx[%d]=%d\tthroughput[%d]=%.2f\n", l, l, x[l], l, throughput[l]); 171 /* 172 l=1 x[1]=1 throughput[1]=-0.00 173 l=2 x[2]=2 throughput[2]=0.00 174 l=3 x[3]=3 throughput[3]=70.37 175 l=4 x[4]=4 throughput[4]=68.36 176 l=5 x[5]=5 throughput[5]=67.23 177 */ 178 fprintf(gp, "%d\t%f\n", x[l], throughput[l]); 179 } 180 fprintf(gp, "e\n"); 181 182 183 184 185 fprintf(gp, "set nomultiplot\n"); // マルチプロットモード終了 186 fprintf(gp, "exit\n"); // gnuplotの終了 187 fflush(gp); 188 pclose(gp); // パイプを閉じる 189 190 //*/ 191 return 0; 192}

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C

1int x[] = {}; 2float throughput[] = {};

要素数が0です。
範囲外アクセスしているため何が起こっても不思議はないです。
必要なサイズ(インデックスがすべて1開始になっているのでN+1)の領域を確保しましょう。

C

1int x[N+1] = {}; 2float throughput[N+1] = {};

投稿2020/07/23 16:51

編集2020/07/23 16:57
SHOMI

総合スコア4079

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

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

off

2020/07/24 07:00

回答ありがとうございます!修正したら、正しい値を配列に格納することができました! 配列を初期化する時点で、何個分必要なのかという枠を定義してあげる必要があるということですか。 大変参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問