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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

6回答

5209閲覧

C言語で素数を判定したい

tomopichan2002

総合スコア17

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2016/07/20 07:13

編集2016/07/22 08:44

C言語のプログラムについての質問です。
a^b-cの式の変数を変更して、算出された値が素数なのかどうかをエラトステネスのふるいで
判定するプログラムを書こうとしています。
例えば、b=2,c=3だと、a^2-3のようにして、
for文で(a+1)^2-3のように変化させたいです。
自分で組んでみたのですが、動きません。
関数Yの宣言ののかのifで、エラーが出ます。
表示された警告文:thread 1:EXE_BAD_ACCESS (code=2. address=0x7fff5f3ffffc)
警告文を読んでも指示が書いてないので、わかりません。
アドバイスをいただけると嬉しいです。

c

1#include <stdio.h> 2#include <math.h> 3 4int main(void){ 5 6 //式の編集 a^b-c = result 7 double a_double = 1; 8 double b_double = 1; 9 unsigned c = 1; 10 unsigned a_int,b_int,result_int; 11 unsigned square_root_of_result; 12 unsigned primenumbercount = 0,compositenumbercount = 0; 13 unsigned i; 14 int result_experimental; 15 unsigned result_processed; 16 17 //プロトタイプ宣言 18 int X(); 19 int Y(); 20 //result_intが0や負の数にならないようにするための関数 21 22for(a_double=a_double;a_double<=5;a_double++){ 23 24 double result_double = pow(a_double,b_double); 25 26 result_int = result_double; 27 a_int = a_double; 28 b_int = b_double; 29 30 if(a_int*b_int<=c){ 31 32 a_double++; 33 34 X(); 35 36 result_experimental = Y(); 37 38 } 39 40 result_experimental = result_int - c; 41 42 result_int = result_experimental; 43 44 45 46 unsigned prime_structure[result_int]; 47 48 for(i=0;i<result_int;++i){ 49 50 prime_structure[i] = 1; 51 52 } 53 54 prime_structure[0] = 0;//1は素数ではない 55 56 square_root_of_result = sqrt(result_int); 57 58 //エラトステネスのふるい 59 unsigned num,j; 60 61 for(i=0;i<square_root_of_result;i++){ 62 63 if(prime_structure[i] == 1){ 64 65 num=i+1; 66 67 for(j=num*2-1;j<result_int;j=num+j){ 68 69 prime_structure[j]=0; 70 71 } 72 73 } 74 75 } 76 //エラトステネスのふるい fin 77 78 if(prime_structure[result_int-1] == 0){ 79 80 printf("@%dは、素数\n",result_int); 81 82 primenumbercount++; 83 84 } 85 86 else{ 87 88 printf("@%dは、非素数\n",result_int); 89 90 compositenumbercount++; 91 92 } 93 94 double allcount = primenumbercount+compositenumbercount;//necessary 95 double primenumbercount_double = primenumbercount; 96 double probability = primenumbercount_double/allcount*100;//necessary 97 printf("a^%d-%dの確率は、%f%%です。\n",b_int,c,probability);//necessary 98 99 }//for fin 100 101}//main fin 102 103 104int rem(a_double,a_int,b_double,b_int,result_int,c,result_experimental){ 105 106 double result_double = pow(a_double,b_double); 107 108 result_int = result_double; 109 a_int = a_double; 110 b_int = b_double; 111 112 result_experimental = result_int - c; 113 114 Y(); 115 116 return 0; 117 118} 119 120 121int ram(result_experimental,result_processed){ 122 123 if(result_experimental<0){ 124 125 X(); 126 127 } 128 129 else{ 130 131 result_processed = result_experimental; 132 133 } 134 135 return result_processed;//正の数になったresultを返す 136 137}

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

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

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

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

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

A.Ichi

2016/07/20 07:25

unsigned int としてあげれば、とりあえすワーニングが消えるのでは
sun-solar-arrow

2016/07/20 09:46

C言語なら'C'タグをつけたほうがいいと思います
HogeAnimalLover

2016/07/24 02:38

平方根計算1回と毎回の平方計算、どちらの方が適切かな・・・平方根計算の実装にも依るのかな・・・速さのほか精度の問題もあるし・・・
Zuishin

2016/07/24 03:04

私も素数算出クラスを実装したことがありますが、平方根は整数でいいので、二乗して求める数以上になる最小の整数をバイナリサーチで求めました。
guest

回答6

0

こんにちは。

unsigned power(unsigned a,b,result)ではなく、unsigned power(unsigned a,unsigned b,unsigned result)とすれば警告は消えるのではないかと思います。

もう一つの質問はすいません、ちょっと気力が湧きません。
最近の質問によいものがあります。ソースコードぐらいは```で囲んで欲しい!がお薦めです。

投稿2016/07/20 08:19

Chironian

総合スコア23272

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

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

tomopichan2002

2016/07/20 08:46

回答していただきありがとうございます。 ご指摘の通りに全ての変数に型をつけたら、警告文が消えました。 また、ソーコードについてのご指摘もありがたいです。 Chironianさんの気力が湧いてきたら、またいつでも回答してください。 本当にありがとうございます。
tomopichan2002

2016/07/20 08:53

私の勘違いでした。 警告文が消えたと思っていましたが、前のコメントを投稿した後に再び警告文が表示されていました。 コンパイルが遅れて、実行されたようです。 ほうんとうにごめんなさい。
Chironian

2016/07/20 08:59

> for(unsigned i = b-2;i>=0;--i){ が無限ループになります。iは符号無しなので、i>=0は常に成立します。
tomopichan2002

2016/07/20 10:17

この無限ループから抜け出すにはどうすればいいでしょうか。 そもそも、このpower関数はうまく機能するのでしょうか。 このpower関数は、math.hのpow関数は引数と戻り値がdouble限定 なので、引数と戻り値が整数型の関数が欲しかったので作ったのですが このような関数はすでに存在しますか、それとも我慢してpow関数を使ったほうが 良いのでしょうか。
Chironian

2016/07/20 12:23

いろいろ手はあります。iが0になったらループを抜けるようにしてループの回数が変わらないように調整することも可能と思いますよ。 > そもそも、このpower関数はうまく機能するのでしょうか。 ソースを見る限りでは、上記問題を除き、かつ、bが大きくないなら動作すると思いますよ。if文でb==1, b==2を分ける必要はあまりないと思います。分けてはダメというほどでもないです。 整数型のpow関数は標準ライブラリにはないです。世の中には存在していると思いますが、この位なら探すより作る人の方が多いだろうと思います。 また、浮動小数点用pow関数を用いるべきか、整数用に作るべきか、正直どちらでも良いと思います。 手間を取るか軽さを取るかですね。どちらでも良いなら、C言語ユーザなら軽さを取ることをお勧めします。
tomopichan2002

2016/07/20 13:07

Power関数を完成させられる気がしないので、Pow関数を利用しようと思います。 自分なりに考えてコードを修正しました。 しかし、実行結果がおかしいです。 偶数に素数と判定したり、突然7万くらいの数が実行結果に現れたりします。 恐らく私の技術的なミスだと思いますが、もしかしてエラトネスのふるいのアルゴリズムが間違っているのでしょうか
Chironian

2016/07/20 14:07

> for(unsigned i=0;i<=result_int-1;i++){//0~result-1 添え字 > prime_structure[result_int-1] = 1; > } この文は、prime_structureを初期化しようとしているのだと思いますが、初期化できていないようです。 > Power関数を完成させられる気がしないので、Pow関数を利用しようと思います。 Pow関数を利用すること自体は何ら問題ないと思います。オーバーフローしないように作るのはちょっと難しいかもしれませんし。 ところで、デバッグの時、要所要所で各変数の値をprintf()してみるのは有効ですよ。 その値がtomopichan2002さんの期待と一致しているか確認しましょう。異なっていたら、その近辺にバグがあることが多いですよ。 もし、Visual Stduio等のIDEをお使いなら、ステップ実行しつつ、各変数をポイントすれば値が表示されますので、もっとお手軽にデバッグできます。
tomopichan2002

2016/07/20 14:20

私のIDEは、Xcodeなのでprintf()を使おうと思います。 Prime_structureの初期化についてですが、1が代入されているので 初期化されているとは言えませんか。 恐らく、私はおかしなことを言っているので指摘してください。
Chironian

2016/07/20 14:30

本当にPrime_structure[]の要素全てに1が設定されてますか? forループの直後で各値を表示してみて下さい。 for(unsigned i=0; i < result_int-1; ++i) printf("%d\n", Prime_structure[i]); Xcodeを使ったことはありませんが、恐らく、ブレークで止めたり、ステップ実行したり、変数の内容を表示したりできるのではないでしょうか?
tomopichan2002

2016/07/20 23:17

ご指摘ありがとうございます。 確かにprime_structureは1に初期化されていませんでした。 printf("配列:%d@回数:%d\n",prime_structure[result_int+1],i+1);にしていました。 自分の未熟さが思い知らされました。 私には、prime_structureを初期化できない理由もする方法も思いつきませんので、 教えていただけると嬉しいです。
Chironian

2016/07/21 01:19

えっ。それは流石に「丸投げ」に該当すると思います。 まずは、下記のような入門サイトで勉強する必要があると思います。 http://www.nmn.jp/~hidai/c/
tomopichan2002

2016/07/21 13:33

3時間くらい考えましたが、分かりません。 何が原因かすら分かっていません。 甘えになってしまいますが、せめてヒントだけでもいただけませんか。
Chironian

2016/07/21 15:57 編集

for(unsigned i=0; i < result_int; ++i) Prime_structure[i]=1; これでいけますよ? すいません、何故分からないのかが、分かりません。 なお、unsigned Prime_structure[result_int-1];と定義しているので、Prime_structureはresult_int-1個しか存在しませんね。ということは、0からresult_int-2までしかないので定義の修正も必要です。
tomopichan2002

2016/07/21 23:41

ご返答ありがとうございます。 配列の数と添え字を間違えていました。 紛らわしい仕組みです。
guest

0

自己解決

C

1コード 2#include <stdio.h> 3#include <math.h> 4#include <stdlib.h> 5 6/*自然数をカウントする。0は非素数とする。 7 0:素数 1:非素数*/ 8 9int main(void){ 10 11 //式の編集 a^b-c = result 12 double a_double = 3; 13 double b_double = 2; 14 int c = 1; 15 int b_int; 16 int result_int; 17 int square_root_of_result; 18 int primenumbercount = 0; 19 int compositenumbercount = 0; 20 int i; 21 22 for(a_double=a_double;a_double<=100;a_double++){ 23 24 /*a^bの演算*/ 25 26 double result_double = pow(a_double,b_double); 27 28 result_int = result_double; 29 30 result_int = result_int - c; 31 32 b_int = b_double; 33 34 /*result_intの検査*/ 35 36 if(result_int<=0){ 37 38 if(result_int==0){ 39 40 compositenumbercount++;//0の時非素数判定 41 42 } 43 44 while(result_int<=0){ 45 46 a_double++; 47 48 result_double = pow(a_double,b_double); 49 50 result_int = result_double; 51 52 result_int = result_int - c; 53 54 } 55 56 } 57 58 if(result_int<0){ 59 60 printf("result_intが%dだったので終了します。n",result_int); 61 62 } 63 64 else{ 65 66 square_root_of_result = sqrt(result_int); 67 68 } 69 70 /*prime_structureの定義*/ 71 int * prime_structure; 72 prime_structure = (int *)calloc(result_int,32); 73 74 prime_structure[0] = 1; 75 76 /*ふるい 0:素数 1:非素数*/ 77 int num,j; 78 79 printf("p\n"); 80 81 for(i=0;i<square_root_of_result;i++){printf("11\n"); 82 83 if(prime_structure[i] == 0){printf("12\n"); 84 85 num=i+1; 86 87 for(j=num*2-1;j<result_int;j=num+j){printf("13\n"); 88 89 prime_structure[j]=1; 90 91 } 92 93 } 94 95 } 96 /*ふるいのおわり*/ 97 98 if(prime_structure[result_int-1] == 0){ 99 100 printf("@%dは、素数\n",result_int); 101 102 primenumbercount++; 103 104 } 105 106 else{ 107 108 printf("@%dは、非素数\n",result_int); 109 110 compositenumbercount++; 111 112 } 113 114 }//for 115 116 double allcount = primenumbercount + compositenumbercount; 117 118 double primenumbercount_double = primenumbercount; 119 120 double probability = primenumbercount_double/allcount*100; 121 122 printf("a^%d-%dの確率は、%f%%です。\n",b_int,c,probability); 123 124 printf("%d\n",result_int); 125 126 127}

以上を最終的な答えとさせていただきます。
皆様の回答をもとに、当初の設定を変更した部分もあります。
私がまだ未熟なので、ひどいソースコードだと思いますが
これを最終的な答えとさせていだだきます。
たくさんのご回答をありがとうございました。

投稿2016/07/25 13:05

tomopichan2002

総合スコア17

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

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

k1000

2016/07/26 02:39

うーん……マイナスはつけませんが、他の方から多少なりとも参考になる(解決につながる)回答があった以上はとりあえずそちらのほうに「ベストアンサー」を付すべきではないでしょうか。 teratailは「思考するエンジニアのためのQAプラットフォーム」をうたっていますから、 《注文通り動くプログラム》そのものよりも《見た人の技術力が高まるための情報・ヒント》のほうに価値を見出す人たちによって支えられているものと思います。そして、そうした有益な「情報・ヒント」を示した実績がスコアだったりベストアンサー数だったりするので、解決のために力になってもらった以上はそうした評価を下す責任があるのではないでしょうか。 回答が複数あった場合どれを「ベスト」とするか迷うという意見もあろうかとは思いますが、例えば評価の一番高いものとか、それも同程度なら時刻の早い方とか、それなりに決めようはあるでしょうし、よほど外したものでなければ特に非難されるものでもないと思います。
guest

0

まず第一に整数の計算にdoubleを使ってはいけません。また変数の型が混じっているのでデバッグが面倒です。統一しましょう。
doubleだと確かに大きなすうを扱えるのですが、その代償として精度が低くなります。
判定したい素数の範囲が2^31以下であればすっぱりintにしましょう。
unsigned にすると2^32までになりますが、たかだか2倍です。

2^32を超えて2^63まで行きたい理由は普通あまりないのですが、2^63までならlongです。
その先 long longもありますが、サンプルのコードではそのような大きな数が扱える気がしません。

for(i=0;i<square_root_of_result;i++){
は計算量を減らすには、いい考えですが、
最小の素数は2で、2以外は全部奇数なので、
for(i=3;i<square_root_of_result;i+=2){
くらいは普通で、このアルゴリズムでは使いにくいのですが、
for(i=3;i<result_int;i+=2){
if( result_int / i < i ) break ;
みたいにした方がカッコいいです。

全体を通してみてみるとエラーを消すために書いてあるコードが多すぎです。一度、手で計算を行ってみて、その計算をそのまま表現する方向でコード書いたほうがいいです。書き足すのではなく宣言文をみなしましょう。全部intにすれば良いような気がします。

投稿2016/07/24 01:46

gm300

総合スコア580

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

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

tomopichan2002

2016/07/24 08:46

回答ありがとうございます。 >整数の計算にdoubleを使ってはいけません。 と、おっしゃいましたがpow関数の引数にはdoble型が推奨(double型が推奨されてはなかったかもしれませんが、整数型では警告文が出るはずです。)されていたはずですが、pow関数でもdouble型は使うべきではありませんか。
gm300

2016/07/25 09:50

powは課題の本質ではないので、powのために基本構造の方を調整するのは変です。 従って変えるのは、powの引数ではなくpowの方。 それはともかく、powの帰値を(間接的に)intに入れるのであれば、まずbの範囲は非常に狭いはずで、普通にループで計算しても速度的なペラルティはないと思います。 いいかえると、a = 1000, b = 1001 みたいな計算はできない。a=2としてbは32までしか行けない。 であれば、 int mypow(int x, int y) { int r ; for( r=1 ; 0<y ; y-- ) r*=x ; return r ; } で十分で、コードに埋め込むのであれば、 int w_b = b_int ; for( result_int = 1 ; 0 < w_b ; w_b -- ) results_int *= a_int ; みたいな形で十分では? powはpow(2.001,1.001) もできるような高度な関数なので、計算量がもったいないです。
guest

0

私の場合は、calloc()で確保したエリアに数値(配列のインデックスと同じ:0~n)を入れて倍数を消していく手法でやりました。例えば、2から始めて2の倍数を0クリア、次に見つかる0以外の数値は3なので3を残して3の倍数を0クリア、次は4ですが4は2の倍数としてクリア済なので次に見つかる5を残して5の倍数を0クリア・・・とすべてが終わったとき、配列に残っている0以外の数値はすべて素数・・・といった具合です。

投稿2016/07/22 10:57

cateye

総合スコア6851

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

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

0

エラトステネスの篩,古代ギリシャの方ですね。勉強になりました。
プログラムでちょっと気になりましたのでご参考まで

//配列prime_structureの定義 unsigned prime_structure[result_int-1];//0~result-1 result個

今後の拡大に備えてどうでしょうか。

//配列prime_structureの定義 unsigned int * prime_structure; prime_structure = (int *)calloc(result_int,sizeof(int));

エラトステネスの篩に興味が涌き、参考に部分作成してみました

C

1#include <stdio.h> 2#include <math.h> 3#include <stdlib.h> 4 5int main(void){ 6 7 double a_double = 9; 8 double b_double = 2; 9 unsigned int a_int,b_int,result_int; 10 11 result_int = pow(a_double,b_double); 12 13 a_int = a_double; 14 b_int = b_double; 15 16 //配列prime_structureの定義 17 unsigned int * prime_structure; 18 prime_structure = (int *)calloc(result_int-1,sizeof(int)); 19 20 unsigned int i,j; 21 //エラトステネスのふるい 22 for (i = 2; i < result_int/2 ; i++) { 23 if (prime_structure[i] == 0){// prime[i]が素数なら 24 for (j = 2; i * j <= result_int-1; j++){ 25 prime_structure[i * j] = 1; // 素数の倍数は素数ではない 26 } 27 } 28 } 29 for ( i = 1; i < result_int; i++){ 30 if(prime_structure[ i ] == 0){ 31 printf("%dは、素数\n",i); 32 } 33 } 34}

投稿2016/07/21 08:30

編集2016/07/21 22:59
A.Ichi

総合スコア4070

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

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

A.Ichi

2016/07/21 09:57

すみませんC99から追加され、C11でオプション機能に格下げされた)可変長配列(VLA)の機能で問題有りません。古いプログラマでしたお許しを。
tomopichan2002

2016/07/21 12:12

ご回答ありがとうございます。 プログラミングを学び始めてまだ日が浅いので、意味を解説していただけると嬉しいです。
A.Ichi

2016/07/22 09:08

エラトステネスの篩wikiを見て作成してみました。 ステップ 1 :探索リストに2からxまでの整数を昇順で入れる。 ステップ 2:探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから篩い落とす。 ステップ 3:上記の篩い落とし操作を探索リストの先頭値がxの平方根に達するまで行う。 (ここだけ理解出来なかったので最低の乗数2を使いました。多分ルートの方が余分な処理が少ないでしょう) ステップ 4:探索リストに残った数を素数リストに移動して処理終了。 異なる部分から解説します・ //配列prime_structureの定義 unsigned int * prime_structure; prime_structure = (int *)calloc(result_int,sizeof(int)); prime_structureを整数値のポインターとして定義します。 calloc関数でresult_int×ポインターサイズのエリアを取ってゼロクリアします。 prime_structure[result_int]+ゼロクリアするのと同じ事です。 unsigned int i,j; //エラトステネスのふるい for (i = 2; i < result_int/2 ; i++) { if (prime_structure[i] == 0){// prime[i]が素数なら for (j = 2; i * j <= result_int-1; j++){ prime_structure[i * j] = 1; // 素数の倍数は素数ではない } } } 2から初めて倍数の配列に、値1をセットします。次に3,4と同じ事を繰り返します。 素数候補である0を見つけて同じ様に倍数して値1をセットします。 for ( i = 1; i < result_int; i++){ if(prime_structure[ i ] == 0){ printf("%dは、素数\n",i); } } 上記で出来た配列の中から0であるものを探して素数とします。
A.Ichi

2016/07/22 09:11

コメント投稿はネストが無くなってしまうのですね見ずらくてすみません。
A.Ichi

2016/07/22 09:16

平方根までで良い様です。数学的に証明する能力が無かった。
tomopichan2002

2016/07/22 09:31

calloc関数で定義する配列と添え字をつけて定義するint a[10];みたいに定義する配列とは何が違うのでしょうか。 calloc関数自体をA.Ichiさんの回答で知ったばかりで、バイト数によって配列を定義する くらいの理解しかしていないので、calloc関数の解説からしていただけるとありがたいです。 本当に無知ですいません。
A.Ichi

2016/07/22 10:27

可変長配列(VLA)の機能はC99からサポートされるのを知らなかった事は前に書きました。古いCコンパイラは、配列はメモリ上連続アドレスで取る必要が有るので、後で変わるのを嫌っていました。可変長配列の欠点は、ローカル変数なので、関数(ブロック)が終わると自動的に破棄されます。freeする必要は無いですが、戻り値として上位に返す事が出来ません。 プログラム中でメモリにエリアを動的に確保する場合、malloc関数に長さを渡し、メモリ上にエリアを確保貰い先頭アドレスを受取ます。その際にcallocはプラスゼロクリアを一緒に行ってくれるものです。 calloc = malloc + memset かな int a[10];は、整数4×10バイトのエリアを取りますと言う意味ですが、初期値は保障されていません。大抵はゼロです。大きいエリアを指定するとゴミが入る事が有ります。  int a[10]; memset(a,0,sizeof(a[10])); と書くのと  int * a; a=(int *)calloc(10,sizeof(int))とは等価です。 配列の全てに整数ゼロが入る事になります。これ以降は安心して足し引きがでます。 実は、callocが使われているのはiniよりもcharの方が多いです。文字列操作の不得意な c言語はstr**関数を多用しますが、これらの関数は文字列の終端は\0としければなりません。  char c[10]; printf("%s", c);の場合11バイト目が\0で無い場合は次の\0まで連続的に出力されます。 長くなってすみません、結論は、何も違わないゼロクリアして安心の差です。
tomopichan2002

2016/07/22 11:18

calloc関数とは、配列を定義してかつ0に初期化もしてくれる関数ということでしょうか。 ありがとうございます。 ちなみに、ゼロクリアとは0に初期化するということでしょうか。
A.Ichi

2016/07/22 13:43

システム屋さん用語の俗語です。ゼロでクリアする事です。初期化するで良いと思いますが、たまに初期設定の事を初期化と言われる方も居られます。TPOで変わります。
guest

0

警告文だけですか?
これだけエラーが出ました。

.\untitled.c(6) : error C2081: 'b' : 仮パラメーター リスト内の名前が正しくありません。
.\untitled.c(6) : error C2081: 'result' : 仮パラメーター リスト内の名前が正しくありません。
.\untitled.c(22) : error C2057: 定数式が必要です。
.\untitled.c(22) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
.\untitled.c(22) : error C2133: 'prime_structure' : サイズが不明です。
.\untitled.c(72) : error C2081: 'b' : 仮パラメーター リスト内の名前が正しくありません。
.\untitled.c(72) : error C2081: 'result' : 仮パラメーター リスト内の名前が正しくありません。

「仮パラメーターリストの名前が正しくありません」については、Chironian さんのおっしゃる通りです。そのようにしてください。
「定数式が必要です」はunsigned prime_structure[result-1];//0~result-1 result個の部分です。result が変数なので、コンパイル時に配列の大きさが決定されません。malloc() を使ってください。
「サイズが 0 の」「サイズが不明です」は、prime_structure が定義されていないからです。定義してください。
###追記
パラメーターリストと同じ名前の変数をローカルで宣言しています。わざとかもしれませんが、これを忘れるとはまりますので、関数の外で宣言してそれを引数として呼び出した方がいいでしょう。

投稿2016/07/20 08:55

編集2016/07/20 08:58
Zuishin

総合スコア28660

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

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

Chironian

2016/07/20 09:01

Visual Studioだとそうなりました。可変長配列を使っているからだろうと思います。 gccなら大丈夫なようですよ。
Zuishin

2016/07/20 09:04

今は可変長配列というものがあるのですか? 知りませんでした。 ありがとうございます。 便利になっていますね。
Chironian

2016/07/20 09:10 編集

可変長配列は、C99の時代からあるそうです。実は、私も知ったのは極最近です;; Visual Studioはサポートしてないし、C++規格では規格違反ですがgccはC++でも使えます。 また、ローカル変数でのみ使えます。クラスのメンバ変数では使えません。 更に、スタックを消費するので、簡単にスタックオーバーフローできます。 正直、あまり使わない方が良い機能の1つと思います。
tomopichan2002

2016/07/20 09:11

私は、Xcodeで実行しています。 最後の警告文は unsigned i = power(a,b,result);で、 resultが初期化されていないという警告文があります。
Zuishin

2016/07/20 09:19

C99 からあったのですか? すっかり化石になった気持です。 result は確かに初期化されていませんね。 可変長配列の仕様はよく知らないのでうまくいくかわかりませんが、a^b-c で初期化してみてください。 でも引数によっては結構スタックを使いそうだし、やっぱり malloc を使った方がいい気がしますが。
Chironian

2016/07/20 09:19

resultはpower()の戻り値として返却してますから、引数として渡す必要はないのでは?
Zuishin

2016/07/20 09:26

むむ、確かに。power() の中で result の値を使っていませんね。
tomopichan2002

2016/07/20 09:32

まだ、c言語を学んで日が浅いのでpower()のresultについて 具体的にどうするべきか教えてもらえると有難いです。 resultの初期化についても具体的な指示を教えていただけるとありがたいです。
Zuishin

2016/07/20 09:34

Chironian さんのおっしゃっているのは、power(unsigned a, unsigned b, unsigned result) ではなく、result の引数は不要で power(unsigned a, unsigned b) でいいんじゃないかということです。result は外から渡す必要はないので、power の中でローカル変数として宣言してください。
Chironian

2016/07/20 09:37

Zushinさん、フォロー有難うございます。 tomopichan2002さん、Zushinさんのおっしゃる通りです。
Zuishin

2016/07/20 09:39

補足します。初期化というのは変数に最初の値を与えることです。 unsigned result; として宣言しただけでは、result の値は不定です。 コンパイラは、「値がわからないものを引数にするんじゃねえ!」って怒っているわけです。 その対応策として私は result に初期値を与えたらどうかと提案しました。しかし、そもそも引数として不要であれば、power() の戻り値で result が初期化されるので、それ以前の初期化は必要ありません。
Zuishin

2016/07/20 09:45

それと、私は C99 対応のコンパイラをインストールしていませんので、修正されても実行することができず、適切な回答ができません。Chironian さんにお任せします。
Zuishin

2016/07/20 09:47

勝手な物言いでした。 「Chironian さんはじめ他の回答者の方に」と訂正します。
tomopichan2002

2016/07/20 10:10

Chironianさん、Zuishinさん返信していただきありがとうございます。 Resultをpower()内でローカル変数として宣言して、引数から抜きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問