C(++) 동적배열활용 연산중 간간한(?) 요류

denmark114의 이미지

요즘 혼자 안되는 실력으로 C(++)로 이런저런 삽질하고 있습니다. 파이(Pi)값 한 천만자리 계산해보겠다고, 다른 수치계산 라이브러리 안빌리고 char 배열의 형태로 숫자 정의해서 사칙연산부터 무한급수를 이용한 초월함수까지 하나하나 정의해나가려는 계획...이 있었으나, 덧셈뺄셈 구현하는데 며칠째 헤매고 있습니다. 어떻게든 혼자 해결보겠다고 밤까지 다 샜는데 아무리 코드를 읽어도 답이 안나옵니다.. (솔직히 더 열심히 읽어보고싶지도않아요 ㅠ).

수치계산용으로 실제 써먹진 못하겠으나 99% 이상 정확도는 나오는거 같애요. 거의 다 맞는데 1000번이상 테스트 돌려보면 꼭 몇개씩 깨지는 문자가 출력됩니다. 결과값을 텍스트 파일로 만들어서 매스매티카로 읽어들인다음 실제계산이 맞는지 검증을 해야하는데 자꾸 깨진문자때문에 골치가 아프네요. 남은 1%를 반드시 채워야하는데 도와주시면 정말 감사하겠습니다.

코드는 C++11의 람다식과 같은 편리한 부가기능을 조금 활용한 사실상의 C언어 입니다. STL, vector, template, OOP, 이런건 쓸줄모릅니다 ㅠ.

코드는 컴파일용 배치파일과 결과물까지 압축해서 첨부파일로 올렸습니다. 배치파일작성을 통해서 컴파일을 하고 있는데 혹시 옵션을 잘못지정한건가 싶기도 하고요.. 그리고 데이타저장용 텍스트 파일도 같이 넣었습니다, 끝쯤에 보면 깨진문자가 보일겁니다.

제 코딩실력이 아직 초보수준이기때문에 코딩과 관련된 어떤 지적이라도 달게 받겠습니다.

File attachments: 
첨부파일 크기
Package icon SJIS.zip40.83 KB
denmark114의 이미지

깨진문자뿐이아니라, 찾긴 힘들지만 간혹가다 숫자 자릿수 자체가 몇자리 틀리게 인식되는 경우가 있습니다. 왜그러는지는 역시나... 모르겠습니다ㅠ

denmark114의 이미지

제가 올린 글에 제가 제가 해결하고 제가 답변하네요...

문제는 printf, sprintf 함수의 불완전함에 있었습니다.
결과로 나온 char배열을 atof함수로 바꿔서 검증해봤을때는 몇번을 돌려도 정확도 100%가 나옵니다.
배열에 제대로 박힌 문자열을 printf함수가 받아서 출력하는데 시스템을 거치는 과정에서 어떤 오류가 생기는것 같네요..
일단 활용하는덴 다행이도 문제없겠습니다.

qiiiiiiiip의 이미지

디버깅하시는 방법을 공부해보시는게 좋겠습니다.

올려주신 소스를 -g 옵션 넣고 valgrind로 검사해보면,

==957== Invalid read of size 1
==957==    at 0x56A4AC7: vfprintf (in /usr/lib/libc-2.19.so)
==957==    by 0x56AC1E8: printf (in /usr/lib/libc-2.19.so)
==957==    by 0x400E40: main (main.cpp:61)
==957==  Address 0x5a11b35 is 0 bytes after a block of size 5 alloc'd
==957==    at 0x4C2A820: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==957==    by 0x401EA2: myprint(char*) (etc.cpp:8)
==957==    by 0x400D60: main (main.cpp:57)

이런 오류가 생기네요.
이걸 수정하세요...

대략 살펴본 바로는 getlen 함수가 의도대로 동작하지 않는듯..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.