2013-11-25 3 views
0

파일에서 읽는 프로젝트를 수행하도록 char가 지정되었으며 입력 한 char 값에 따라 다음 값을 사용하므로 + 다음 두 숫자가 추가되거나 H 그것은 지침을 인쇄합니다. 결과를 다른 파일로 출력하는 데 문제가 있습니다. void add(int a, int b, FILE *print)과 같이 포인터를 각 함수에 전달하고 다음과 같이 호출합니다. add(a, b, printer), 파일을 인쇄하기 전에 완벽하게 작동했습니다. 기능 추가에 I가 얻을 오류 ...프로그래밍 포인터 문제 프로그래밍

는 :

error : incompatible type for argument 1 of fprintf 
expected 'struct FILE *' but argument is of type 'FILE' 

이 너무 내 모든 기능을 발생합니다.

여기 코드가 있습니다. 감사 !

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

void add(int a, int b, FILE *print); 
void add(int a, int b, FILE *print) 
{ 
    int c; 
    c = a + b; 
    printf("%i + %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i + %i = %i\n\n", a, b, c); 
} 
void subtract(int a, int b, FILE *print); 
void subtract(int a, int b, FILE *print) 
{ 
    int c; 
    c = a - b; 
    printf("%i - %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i - %i = %i\n\n", a, b, c); 
} 
void multiply(int a, int b, FILE *print); 
void multiply(int a, int b, FILE *print) 
{ 
    int c; 
    c = a * b; 
    printf("%i * %i = %i\n\n", a, b, c); 
    fprintf(*print, "%i * %i = %i\n\n", a, b, c); 
} 
void divide(int a, int b, FILE *print); 
void divide(int a, int b, FILE *print) 
{ 
    double c; 
    c = (double)(a/b); 
    printf("%i - %i = %.1lf\n\n", a, b, c); 
    fprintf(*print, "%i - %i = %.1lf\n\n", a, b, c); 
} 
void help(FILE *print); 
void help(FILE *print) 
{ 
    printf("+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    printf("* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    printf("- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    printf("/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    printf("H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    printf("Q [Quit ]\t\t\tQuit\n\n"); 
    printf("\n\n"); 
    fprintf(*print, "+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    fprintf(*print, "* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    fprintf(*print, "- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    fprintf(*print, "/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    fprintf(*print, "H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    fprintf(*print, "Q [Quit ]\t\t\tQuit\n\n"); 
    fprintf(*print, "\n\n"); 
} 
char quit(void); 
char quit(void) 
{ 
    char user; 
    printf("Do you really want to quit?(y/n): "); 
    scanf(" %c", &user); 
    return user; 
} 

int main() 
{ 

char trigger; 
char user; 
char fname; 
char lname; 
int a; 
int b; 

FILE *myPointer; 
FILE *printer; 
myPointer = fopen("CommandsProj1.dat", "r"); 
printer = fopen("results.dat", "w"); 

if (myPointer == NULL) 
{ 
    printf("error opening the file"); 
    fprintf(printer, "error opening the file"); 
} 
else 
{ 
    fscanf(myPointer, " %c%c", &fname, &lname); 
    printf("Initials %c%c\n\n\n", fname, lname); 

    while(user != 'y') 
    { 
     fscanf(myPointer, " %c", &trigger); 
     switch(trigger) 
     { 
      case '+': 
        fscanf(myPointer, "%i%i", &a,&b); 
        add(a,b,myPointer); 
        break; 
      case '-': 
        fscanf(myPointer, "%i%i", &a, &b); 
        subtract(a,b,myPointer); 
        break; 
      case '/': 
        fscanf(myPointer, "%i%i", &a,&b); 
        divide(a,b,myPointer); 
        break; 
      case '*': 
        fscanf(myPointer, "%i%i", &a,&b); 
        multiply(a,b,myPointer); 
        break; 
      case 'H': 
        help(myPointer); 
        break; 
      case 'Q': 
        user = quit(); 
     } 
    } 
} 

return 0; 
} 
+3

는 오류가 말한대로 변경 * 인쇄는 fprintf와에서 인쇄 마십시오. –

답변

2

당신은 FILE *fprintf에 역 참조하고 있습니다. fprintf이 포인터를 기대하므로 반드시 (그리고 심지어 오류가있는) 필요하지 않습니다. 에 인쇄 라인을 변경 : 그것은 ppointer으로 통과 한 경우에만 있기 때문에 인쇄로 인쇄 * 내가 바꿀 생각

fprintf(print, ...); 
0

문제는 당신이 구분하지 않았다고 생각에 대한 fprintf(*print,...);

입니다 de-reference 문에 *이있는 정의 및 선언문의 *

이 코드 세그먼트 고려 :

int *p =a;에서
int a=10; 
int *p =a; 
printf("%d",*p); 

,이 정의 문은을의 * 여기서 p는 포인터임을 나타냅니다.

printf("%d",*p);에는 p 앞에 *이 있지만 여기에서는 연산자이며, 여기서 p는 (여기서 값은 10) 값을 가져옵니다.

그래서 fprintf(...);에서 첫 번째 인수는 포인터가 아닌 포인터 여야합니다. 그런 다음 포인터를 print 전달해야합니다.

2

모든 * print를 fprintf 함수 호출에서 인쇄하도록 변경하면 모든 내용이 정상적으로 작동합니다.

전체 작업 코드

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

void add(int a, int b, FILE *print); 
void add(int a, int b, FILE *print) 
{ 
    int c; 
    c = a + b; 
    printf("%i + %i = %i\n\n", a, b, c); 
    fprintf(print, "%i + %i = %i\n\n", a, b, c); 
} 
void subtract(int a, int b, FILE *print); 
void subtract(int a, int b, FILE *print) 
{ 
    int c; 
    c = a - b; 
    printf("%i - %i = %i\n\n", a, b, c); 
    fprintf(print, "%i - %i = %i\n\n", a, b, c); 
} 
void multiply(int a, int b, FILE *print); 
void multiply(int a, int b, FILE *print) 
{ 
    int c; 
    c = a * b; 
    printf("%i * %i = %i\n\n", a, b, c); 
    fprintf(print, "%i * %i = %i\n\n", a, b, c); 
} 
void divide(int a, int b, FILE *print); 
void divide(int a, int b, FILE *print) 
{ 
    double c; 
    c = (double)(a/b); 
    printf("%i - %i = %.1lf\n\n", a, b, c); 
    fprintf(print, "%i - %i = %.1lf\n\n", a, b, c); 
} 
void help(FILE *print); 
void help(FILE *print) 
{ 
    printf("+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    printf("* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    printf("- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    printf("/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    printf("H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    printf("Q [Quit ]\t\t\tQuit\n\n"); 
    printf("\n\n"); 
    fprintf(print, "+ i j [Integer Add]\t\tAdds integers i and j and print out result\n\n"); 
    fprintf(print, "* i j [Integer Multiply]\tMultiply integers i and j and print out result\n\n"); 
    fprintf(print, "- i j [Integer Subtract ]\tSubtract integer j from i and print out result\n\n"); 
    fprintf(print, "/ i j [Integer Divide ]\t\tDivide integer i by j and print out result of integer division\n\n"); 
    fprintf(print, "H [Help ]\t\t\tPrint a short synopsis of all the available commands\n\n"); 
    fprintf(print, "Q [Quit ]\t\t\tQuit\n\n"); 
    fprintf(print, "\n\n"); 
} 
char quit(void); 
char quit(void) 
{ 
    char user; 
    printf("Do you really want to quit?(y/n): "); 
    scanf(" %c", &user); 
    return user; 
} 

int main() 
{ 

char trigger; 
char user; 
char fname; 
char lname; 
int a; 
int b; 

FILE *myPointer; 
FILE *printer; 
myPointer = fopen("CommandsProj1.dat", "r"); 
printer = fopen("results.dat", "w"); 

if (myPointer == NULL) 
{ 
    printf("error opening the file"); 
    fprintf(printer, "error opening the file"); 
} 
else 
{ 
    fscanf(myPointer, " %c%c", &fname, &lname); 
    printf("Initials %c%c\n\n\n", fname, lname); 

    while(user != 'y') 
    { 
     fscanf(myPointer, " %c", &trigger); 
     switch(trigger) 
     { 
      case '+': 
        fscanf(myPointer, "%i%i", &a,&b); 
        add(a,b,myPointer); 
        break; 
      case '-': 
        fscanf(myPointer, "%i%i", &a, &b); 
        subtract(a,b,myPointer); 
        break; 
      case '/': 
        fscanf(myPointer, "%i%i", &a,&b); 
        divide(a,b,myPointer); 
        break; 
      case '*': 
        fscanf(myPointer, "%i%i", &a,&b); 
        multiply(a,b,myPointer); 
        break; 
      case 'H': 
        help(myPointer); 
        break; 
      case 'Q': 
        user = quit(); 
     } 
    } 
} 

return 0; 
}