Ich versuche, ein albernes kleines Programm zu schreiben, und ich habe in eine Wand gerannt. Der betreffende Code ist hier:Ich habe Probleme mit Arrays von Funktionszeigern in C
double(*operf[NOPERS])() = {addf,subf,mulf,divf}
Was ich auch als
double(*operf[NOPERS])(double,double) = {addf,subf,mulf,divf}
Wenn ich das Programm in Haupt laufen, mit printf("%f\n", (*operf[0])(2,3));
gemacht habe, habe ich das erwartete Ergebnis erhalten (5), aber wenn Ich rufe es von einem anderen Ort an, ich bekomme ein Gobletygook. Ich weiß, dass das in C möglich ist und ich weiß nicht, was ich falsch mache. Ich habe mir alle anderen Antworten ernsthaft angesehen und sie scheinen genau das zu tun, was ich mache.
EDIT: Hier ist der Code in Frage. Ich wollte Sie nicht alle im Code ertränken, also ging ich irgendwie den umgekehrten Weg, haha.
#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);
}
Ohne eine [mcve] ist es schwer, irgendeine Hilfe anzubieten. –
Könnten Sie den Code veröffentlichen oder zumindest erklären, wo Sie das Array von Zeigern deklarieren und wie es an die Funktion übergeben wird, die es aufruft? Es ist schwer, ohne einen minimalen Kontext zu helfen. –
Alle Warnungen zur Kompilierzeit? – dasblinkenlight