[완료] #define X Y*2를 하면 Y+2값이 들어가네요 ;;;

turbo978의 이미지

안녕하세요~

C로 짠 코드를 g++에서 컴파일 하여 돌렸더니...

array(float [174])를 읽기만 하는데도...

몇번 반복 연산하다보면 array내용이 변경되어버립니다 ;;;

근데 문제는 gcc로 컴파일해서 돌리면 아무 문제가 없다는 거죠...;;;

파일 확장자만 .cpp로 바꿔서 g++로 컴파일 한 것밖에는 없는데도...;;;

이 난감한 사태를 어쩌면 좋을까요?

어디서 부터 확인해야할까요? ;;;

어떤 함수를 몇번 정도 실행후에 바뀌는데...

그 함수는 바뀐 array를 참고하지도...바꾸지도 않는단 말이죠 ㅠㅠ

icc로 해봐도 그렇고...다른 리눅스에서 해봐도 그렇네요 ㅠㅠ

난감하네요 ;;;

cinsk의 이미지

C 언어 코드는 100% 완벽하게 C++과 호환되는 것이 아니므로, 코드를 보지 않는한 뭐라 말하기가 힘드네요.

그런데 궂이 잘 동작하는 소스를 g++로 컴파일할 필요가 있나요?

C++ application에서 필요하다면, 해당 소스만 gcc로 컴파일하고, 같이 링크하면 될텐데요.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

turbo978의 이미지

전적으로 동의합니다...만...ㅠㅠ

메인 코드를 수정해서 mpi를 붙여서 쓰려는데...C++만 지원해서요...ㅡㅜ

메인코드에서 바껴버리는거라...컴파일, 링크해서 쓰는게 불가능한 상황입니다 ㅠㅠ

간단하게 보자면...;;;;

float x[174];

func(&x[0]);
//여기서 확인해보면 다 제대로 있습니다...
for {
y=x[i];
// (1)
func2(y);
// (2)
}

이런식인데도...func2부분을 돌다가 x가 바껴버린다는거죠 ;;;;

1, 2번에서 체크를 해보면...몇번 돌다가 참조도 하지 않는 x의 내용이 바껴버립니다 ;;

mg2000의 이미지

메모리 쓰는 부분에서 다른 영역을 침범해서, x부분을 바꿔버리는게 아닐까 하는 생각도 들고...

turbo978의 이미지


근데 메모리영역을 침범해서 바꿔버리는게...훔 ;;;;;

C에서는 아무 문제 없다가...

C++에서는 허용범위가 늘어나서 그런걸까요? ㅠㅠ

인덱스를 다 찍어봐야겠네요 ㅠㅠ

guybrush1의 이미지

func2에서 stack 에 할당되는 변수에 대해서 buffer overflow가 일어나는지 확인해 보세요.
함수가 복잡하거나 하면, valgrind같은거 돌려보면 쉽게 알수 있을겁니다.

herasonic의 이미지

static float x[174]; 으로 선언한뒤에 해보셨어요?

음...

turbo978의 이미지

#define X Y*2

를 했는데...

X에 Y+2...값이 들어가네요 ;;;;

이런 황당한 일이 ;;;;

이놈때문에 포인터가 날라다녀서 다른 메모리 값이 엉망이 되었던 거였네요 ;;;;

shyfool의 이미지

Y가 뭔지 모르겠지만,

#define X ((Y)*2)

로 했으면 정확히 동작하지 않았을까요?

expression 사이에 X 쓰셔서 그런것 같은데...

turbo978의 이미지

Y도 #define에서 계산했던 값이었어요...ㅠㅠ

#define Y Z+2

였었어요 ㅠㅠ

ifree의 이미지

결과적으로 X = Z+2*2 로 될 것 같네요.

turbo978의 이미지


그렇게 컴파일링...할수도 있겠군요 ;;;;;;

좋은 정보 감사합니다~ ^0^/

ifree의 이미지

C++ 에 이런 #define 문법은 없는 것으로 보시면 됩니다.
변수 타입이 제대로 정의되지 않기 때문에 실행을 보장할 수 없죠.

상수를 정의할 때도 const 를 사용하는 것이 좋습니다.

turbo978의 이미지


원래는 info class로 따로 만들어서 쓰는데...

컨버팅 귀찮아서 그냥 썼더니...저렇게 되어버렸네요 ㅠㅠ

대대적인 수정을 다시 해야할꺼 같아요 ㅠㅠ

jick의 이미지

그보다도... 저렇게 썼는데 C에서는 제대로 동작했다는 게... 더더욱 미스테리인데요?

왠지 판도라의 상자를 보는 듯한...

댓글 달기

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