2016-03-19 10 views
0

私は愚かな小さなプログラムを書こうとしていますが、私は壁にぶつかりました。問題のコードはここにある:(5)が、ときprintf("%f\n", (*operf[0])(2,3));を使用して、私がメインでプログラムを実行すると、私も私はC言語で関数ポインタの配列に問題があります

double(*operf[NOPERS])(double,double) = {addf,subf,mulf,divf} 

としてやった

double(*operf[NOPERS])() = {addf,subf,mulf,divf} 

は、私が期待される結果を得ます私は別の場所からそれを呼び出す、私は噂を聞く。私はこれがC言語で可能であることを知っています。私は何が間違っているのか分かりません。私は真剣に他の答えのすべてを見てきました、そして、彼らは私がやっていることを正確にやっているようです。

編集: ここに問題のコードがあります。私はコードの中で皆さんを溺れさせたくなかったので、私は逆のやり方で笑いました。 funcsの配列のための

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
// #include <math.h> 

#define SE(X,Y) (strcmp(X,Y)==0) 

#define STACKSIZE 1024 
double snums[STACKSIZE]; 
int snums_ctr=0; 
int sopers[STACKSIZE]; 
int sopers_ctr=0; 

#define Push(STACK, DATA) STACK[STACK##_ctr++]=DATA 
#define Peek(STACK) STACK[STACK##_ctr-1] 
#define Pop(STACK) STACK[--STACK##_ctr] 

#define ABF(NYM,DEF) double NYM (a,b){ return DEF ; } 
ABF(addf,a+b); 
ABF(subf,a-b); 
ABF(mulf,a*b); 
ABF(divf,a/b); 
//ABF(pwrf,pow(a,b)); 

int indexOf(char**ss,char*s) { 
    int i=0; 
    while(*ss){ 
     if(SE(*ss,s)) { 
      return i; 
     } 
     i++;ss=&ss[1]; 
    } 
    return -1; 
} 

#define NOPERS 5 

int operp[NOPERS] = {1,1,2,2,3}; 
int operprec[NOPERS] = {0,0,0,0,1}; 
char* opers[NOPERS+1] = {"+","-","*","/","**"}; 
char* cs(char* s) { 
    int n=strlen(s); 
    char*r=malloc(n+1); 
    memcpy(r,s,n+1); 
    return r; 
} 

char* gs(int n) { 
    char c = getchar(); 
    char*r; 
    if(c=='\n'){ 
     c=0; 
     r=malloc(n+1); 
    } 
    else{ 
     r=gs(n+1); 
    } 
    r[n]=c; 
    return r; 
} 
typedef double(*oper_f)(); 

void rpn(oper_f* operf) { 
    printf("Entering RPN mode...\n"); 
    while(1) { 
     char* raw = gs(0); 
     int idx = indexOf(opers, raw); 
     if(idx != -1) { 
      double b = Pop(snums); 
      double a = Pop(snums); 
      double c = (*operf[idx])(b,a); 

      printf("%f %s %f = %f %f\n", a,raw,b,(float)(double)c, addf(2,2)); 
      Push(snums, c); 
     } 
     else { 
      Push(snums, atof(raw)); 
     } 
     free(raw); 
    } 
} 


int main() { 
// operf[4] = &pwrf; 
    oper_f operf[NOPERS] = {&addf,&subf,&mulf,&divf,NULL}; 
    printf("%f\n", (*operf[0])(2,3)); 
    printf("MODE? "); 
    char* mode = gs(0); 
    if(SE(mode,"rpn")||1) { 
     rpn(operf); 
    } 
    free(mode); 
} 
+2

[mcve]がなければ何の助けもありません。 –

+1

コードを投稿するか、ポインタの配列をどこで宣言しているのか、それをどの関数に渡すのかを少なくとも説明してください。最小の文脈なしでは助けが難しい。 –

+1

コンパイル時に警告が表示されますか? – dasblinkenlight

答えて

0

例:

int f() { 
    return 1; 
} 

int g() { 
    return 2; 
} 

typedef int (*PFUNC)(); 

int main() { 
    PFUNC pf[2] = {&f, &g}; 
    pf[0](); // return 1 
} 
+0

私はそれを試しました。それは何らかの理由でまったく動作しませんでした。それが助けになると、mainの外側で配列を初期化しようとすると、ロード時に計算不可能なエラーが出ますが、メインで初期化しているときには影響しません。 –

+0

「うまくいかない」ってどういう意味ですか?それはコンパイルされませんでしたか?あなたのシステムとコンパイラは何ですか? – rlib

+0

Linux Mint 17.3、gcc、標準のもの。私が得た出力は '2.000000 + 3.000000 = 20655140.000000'でした。 –

0

私は通常、これを行う方法は次のとおりです。

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

typedef float (*math_op)(float, float); 

float addf(float f1, float f2) { return (f1 + f2);} 
float multf(float f1, float f2) { return (f1 * f2);} 
float divf(float f1, float f2) { return (f2 != 0 ? f1/f2 : NAN);} 
float subf(float f1, float f2) { return (f1 - f2);} 

int main(void) 
{ 
    math_op opsf[] = {addf, multf, divf, subf}; 

    printf("sum of 1.0 and 3.5 is %f\n", opsf[0](1.0, 3.5)); 

    return 0; 
} 

上記のコードはGCC-4.8.3を使用して、Windows 7上できれいにコンパイルコマンドラインgcc -std=c99 -pedantic -Wall temp.c -o tempを使用します。それでも問題が解決しない場合は

Q:\>gcc -std=c99 -pedantic -Wall temp.c -o temp 
Q:\>temp.exe 
sum of 1.0 and 3.5 is 4.500000 
Q:\> 

は、システムおよびコンパイラを使用している、だけでなく、あなたのコードのコピーを提供してください:そして、次の出力を与えます。

1

さて、私はそれを理解しました。それは本当にばかげたエラーでした。私は、型付き:

#define ABF(NYM,DEF) double NYM (a,b){ return DEF ; } 

私は

#define ABF(NYM,DEF) double NYM (double a,double b){ return DEF ; } 

を入力している必要があります場合には提案されているようstd=99を追加する私は、この問題を診断する助けました。私は睡眠が必要だと思う。

+1

あなたはそれを修正することができたことを知ってよかった! –

関連する問題