2017-03-12 8 views
0

私はOSX 10.11上で極座標形式のフェーザーの合計の大きさと角度を計算するためにCで一対の関数を書いていますが、私はいくつか問題があります。私が持っている2つの主な質問は次のとおりです。ターミナルの関数に対して、2つの配列を入力として(私が合計したいフェーザの大きさと角度)与える方法はありますか?Mac端末のCプログラムに配列を入力するにはどうすればよいですか?

2)main、argc、およびargvを持つようにCによって強制されているときに、どうすればよいですか?ここで

は、コードは次のとおりです。

float PhasMag(float *coef,float *angle); 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
int main(int argc, char *argv) 
{ 
    if(argc != 2){ 
     printf("Incorrect number of arguments, please input an array of magnitudes and an array of angles, exiting\n"); 
     return -1; 
    } 
    return PhasMag(argv[1],argv[2]); 
} 

float PhasMag(float *coef,float *angle) 
{ 
    float R = 0,Im = 0, Mag; //real and imag. parts of answer 
    float *countM; 
    int sc = 0 ,sa; 
    countM = coef; 
    while(countM != NULL){ 
     countM = countM + 1; 
     sc = sc + 1; 
    } 
    sa = sc; 
    for(int i = 0;i<sc;i++){//computes real part 
     coef = coef + i; angle = angle + i; 
     R = R + (*coef)*cos(*angle); 
    } 
    coef = coef - sc + 1; angle = angle - sa + 1; 
    for(int k = 0;k<sa;k++){//computes imaginary part 
     coef = coef + k; angle = angle + k; 
     Im = Im + (*coef)*sin(*angle); 
    } 
    return sqrt(R*R+Im*Im); 
} 
+1

argvが文字列の配列です - あなただけの魔法あなたはどのように多くを持っているん山車 –

+0

の配列にこれらの文字列をキャストすることはできませんか?もしあなたがロットを持っているならば、それらをファイルに入れて、ファイル名をパラメータとして与えることができます。 –

答えて

1

あなたはコマンドライン引数から何を得る(ARGV中のもの[i])と文字列(char型*)です。あなたは、あなたのプログラムは、2つの別々の入力として二つの配列を取る持っていると思った場合、あなたはこの

./yourprogram '1.0 2.0 3.0 4.0' '5.0 6.0 7.2 8.1' 

ノートのように2の前後に引用符を、それを指定することができますC.

で自分を浮くようにこれらを解析する必要がありますこれはシェルが8つの個別の浮動小数点数ではなく2つの引数としてプログラムに渡すことが重要です。

これらの文字列のそれぞれの浮動小数点数を手動で解析し、空白文字で分割し、scanfまたはatofのような関数を使用して、文字列の一部から浮動小数点数を解析する必要があります。

別の方法としては、

./yourprogram 5 a1 a2 a3 a4 a5 b1 b2 b3 b4 b5 

ことそして、あなたのプログラムでargvの中に10浮動小数点値を介して実行するためのコマンドラインインターフェイスを指定することができます。それを行う方法はたくさんあります。私は個人的にプログラムをstdinから「最初の行には配列Nのサイズが含まれています。次の行にはN個の浮動小数点値coeffが含まれ、次の行にはN個の浮動小数点値が含まれています。例えば、このプログラムへの入力を生成する他のプログラムを持っている。

HTHは、

0

コマンドライン引数は、実際にconst char* argv[]として、「文字列」へのポインタの配列として渡されます。だから何あなたが得ることは常にの配列です文字列、決して1つまたは2つの配列ではなく、浮動小数点でもありません。

私は3つの選択肢があると思います:

  1. はそれぞれ、1つの文字列にリストの文字列を梱包することにより 、"または'によりcoefangle引数を囲み、
  2. をパラメータとしてcoefsや角度を渡すが、 ファイルに保存していないとファイル名をパラメータとして渡すか、
  3. は引数のリストを2つのグループに分け、coefsと の角度をfloatとして解析します。

ここではオプション3を示します。あなたが他のものを好むなら、ヒントを得るために躊躇したり、単にウェブを検索したりすることを躊躇しないでください。

オプション3は、偶数量のパラメータに依存します。前半はcoefsを表し、後半は角度を表します。次のようにそれを呼び出す:

myprg 1.0 2.0 43.0 180.0 
--> 0: 1.000000/43.000000 1: 2.000000/180.000000 
myprg 
--> Error: please pass float values (an even amount) as parameters 
myprg 1.0 2.0 43.0 
--> Error: please pass float values (an even amount) as parameters 
myprg 1.0 2.0 43.0 foo 
--> Error parsing parameters; foo is not a valid float value 

をそしてここでコードは次のとおりです。

#include <stdio.h> 
#include <stdlib.h> 

float PhasMag(float *coef,float *angle, int n) { 

    // your actual code goes here... 
    for (int i=0; i<n; i++) { 
     printf("%d: %f/%f\n",i, coef[i], angle[i]); 
    } 
    return 0.0; 
} 

int scanParams(float* result, int amount, const char* params[]) { 
    for (int i=0; i<amount; i++) { 
     if (sscanf(params[i], "%f", result) != 1) { 
      printf("Error parsing parameters; %s is not a valid float value", params[i]); 
      return 0; 
     } 
     result++; 
    } 
    return 1; 
} 


int main(int argc, const char *argv[]) 
{ 

    int nrOfArguments = argc -1; 
    if (nrOfArguments %2 > 0 || nrOfArguments == 0) { 
     printf("Error: please pass float values (an even amount) as parameters"); 
     return 1; 
    } 

    int sizeOfArray = nrOfArguments/2; 
    float coef[sizeOfArray]; 
    if (!scanParams(coef,sizeOfArray, argv+1)) 
     return 1; 

    float angle[sizeOfArray]; 
    if (!scanParams(angle,sizeOfArray, argv+1+sizeOfArray)) 
     return 1; 

    PhasMag(coef,angle,sizeOfArray); 

    return 0; 
} 
関連する問題