[초보] c언어 함수포인터 사칙연산 질문

shekdns의 이미지

include
#include "2.h"

int main() {
int(*pf[4])(int, int) = { add, sub, mul, div };
int choice = 0;
int x = 0, y = 0;
int result = 0;

while (1) {
menu();
printf("메뉴를 선택하세요 : ");
scanf(" %d", &choice);
if (choice < 0 || choice >= 4) {
printf("종료 \n");
break;
}
printf("두개의 정수를 입력하세요 : ");
scanf("%d %d", &x, &y);
if (choice == 3) {
result = pf[choice](&x,&y);
printf("연산결과 : %lf \n", (double)result);
}
else {
result = pf[choice](x, y);
printf("연산결과 : %d \n", result);
}
}

return 0;
}

int div(int x, int y) {


return (double)x / (double) y;

}
그 여기서 덧셈 뺄셈 곱셈은 문제가 없는데 나눗셈을 소수점 까지 하는게 안되네요;
예를들면 5 / 2 하면 2.5 가 나와야하는데 자꾸 2.00000 이 나와서 생각을 해도 나오지가않습니다.
형님들 도와주세요 ㅠ

raymundo의 이미지

div 의 반환형이 int 니까 반환하는 시점에 2.5가 2가 되어 버립니다.

그걸 고치려면 pf 포인터의 타입도 고쳐져야 겠고 result 도 고쳐져야겠네요.

좋은 하루 되세요!

shekdns의 이미지

음... 그러면 pf 포인터 타입을 void로 바꿔야 하나요!!?

라스코니의 이미지

익명 사용자의 이미지

이 문제는 직접적으로는 div의 반환형이 int이기 때문에 발생한 문제입니다.
하지만 div의 반환형을 double 등으로 바꾸고 나면 int를 반환하는 add, sub, mul 등과 타입이 달라지기 때문에 같은 함수 포인터 배열에 넣을 수 없게 되지요.

가장 쉽게 해결하는 방법은 add, sub, mul도 죄다 double을 반환하게 만들어서 통일시키는 겁니다. 하지만 어떻게든 add, sub, mul은 int를, div만 double을 반환하게 만들고 싶으시다면, 좀 번거로운 일을 해야 합니다.

(1) 어떻게든 서로 다른 두 타입을 동시에 나타낼 수 있는 타입을 써야 합니다. 취향껏 void *이나 union을 쓰세요.

(2) 그런 타입으로부터 원래의 타입으로 되돌려놓기 위한 정보, 즉 add~mul은 int를 반환하지만 div는 double을 반환한다는 정보를 코드로든 데이터로든 프로그램에 포함시켜야 합니다. 그래야 적절히 캐스팅을 해서 쓸 수 있겠죠.

솔직히 이런 종류의 코딩은 정말 귀찮고 멋 없어요. C++를 쓰고 boost library를 이용할 수 있다면 Boost.Variant를 쓰면 됩니다. 뭐, 사실 문제를 없앴다기보다는 번거로운 일을 부스트한테 맡겼을 뿐이긴 하지만요:
https://www.boost.org/doc/libs/1_69_0/doc/html/variant.html

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.