전역변수를 계속적으로 변화(증가나 감소) 시키는 방법 알려주세

leo~~~~의 이미지

예를 들어서

class myclass{
public:
int a;
myclass();
private:
myfunction1();
myfunction2();
}

이렇게 클래스를 만들었을때요
myfunction1();과 myfunction2();가
int a 라는 변수를 같이 사용하려는데요
myfunction1()에서 a에 10을 넣었을때
myfunction2()에서
printf("%d ", a); 이렇게 하면 10이 출력 되도록 하려구요...
myfunction2에서 a=10;으로 초기화 해도 되지만
myfunction2를 계속적으로 호출할때마다
a의 값을 증가 시키려 하거든요....
어떻게 해야 할까요....

elien의 이미지

혹시 저만 이해하지 못한 건지 모르겠습니다만-_-, 질문으로 의도하는 바를 파악하기 힘드네요잉
순차적으로 myfunction1, 2가 불린다면 원하는 결과를 얻을 수 있겠지요.
myfunction2() 에서는 그냥 a 의 값을 변화시키면 되는 거 아닌가요...

그리고 위의 경우 a 는 전역변수가 아닌 멤버변수 입니다.

훗, 못 믿겠나?

leo~~~~의 이미지

답변주셔서 감사하구요....^^
제가 잘 몰라셔요.....^^;;;죄송합니다....
제가 초보라 질문도 어렵게 하는것 같네요.....ㅜ.ㅜ
아....근데요....왜 int a=10;
이렇게 하믄 초기화 시키면 안된다는 에러가 날까요....
제가 하려는 거는요
처음에 myfunction1()에서 a에다가 10 넣습니다...
그리고나서 myfunction2()를 타이머로(1초단뒤) 돌려서
1초마다 a의 값이 10씩 증가하게 하려구요.....

elien의 이미지

죄송해하실 필요는 없습니다~
myfunction1() 의 목적이 변수의 '초기화' 에 있다면, 컨스트럭터( myclass::myclass() )를 이용하세요
초기화하는 구문(a = 10; 같은 것 말이지요)을 컨스트럭터 안에 넣어두면,
myclass 의 인스턴스가 생성되는 시점에서 멤버 a 의 값이 10 으로 초기화 됩니다.

클래스 내부의 멤버를 직접적으로 초기화하는 것은 금지되어 있습니다. (그것은 구조체의 경우에도 마찬가지구요)
제가 static 에 대한 개념이 얇아서 정확한 이유는 잘 모르겠네요.

훗, 못 믿겠나?

익명 사용자의 이미지

답변감사합니다....^^
근데요....위에 쓴거는 제가 예로 든거구요....
예를 잘못썼네요.......ㅜ.ㅜ
제가 작성한 것두 생성자 안에서
a=10;
이렇게 넣고 다른 함수에서 a를 사용했는데요
-1073742520 이렇게 나오더라구요,,,,,
아무리 제가 작성한 소스지만 너무 허접해서
님들이 더 혼란스러워 할까봐 소스는 안올린거구요.....ㅜ.ㅜ

elien의 이미지

음, 뭔가 다른 부분에 문제가 있는 것이 아닐까 생각합니다.
타이머 부분도 펑션콜을 포함하고 있겠지요?

#include <iostream>

using namespace std;

class myclass
{
private:
	int a;
public:
	myclass() : a(10) { }
	void myfunction() { cout << a++ << endl; }
};

int main(int argc, char *argv[])
{
	myclass mc;

	for (int i = 0; i < 10; i++ )
		mc.myfunction();

	return EXIT_SUCCESS;
}

훗, 못 믿겠나?

익명 사용자의 이미지

계속 이렇게 답변해 주셔서 뭐라고 감사의 말씀을 드려야 할지.....
제가 하는것이 시리얼 통신인데요.....
우선 송신부에서는 타이머를 사용해서 0.1초 단위로 계속적으로
하나의 데이터를 보냅니다....
수신부는 Qt로 되어 있는데요.....
qtimer를 사용해서 0.5초 단위로 송신되는 데이터를
순서대로 출력을 하구요........
송신되는 데이터는 좌표값이구요...
맨 처음에는 두개의 데이터를 받아서 두개를 한번에 전송하고
수신부에서도 처음에는 두개의 데이터를 받습니다..
그 다음부터는 수신부 송신부 둘다 하나씩만 주고 받구요...
수신부의 그래서 생성자 부분에 맨 처음 두개의 데이터 받는
부분을 작성했구요...
그리고 그 다음 타이머 interval 때는 하나의 데이터만 받아서
처리하는 함수부분을 수행하구요....
거의 다했는데요.....
문제가 되는 부분이 타이머 부분도 아니고 Qt부분도 아닌.....
변수가 문제입니다.....
처음 보내어지는 데이터가 45와 67일때
이 두 데이터는 생성자 부분에서
10 45 20 67
이렇게 처리됩니다...
그리고 그 다음 부터는
20 67 30 78
30 78 40 82
40 82 50 18
이런식으로요....
그러니까 좌표값에서 3번째 4번째 값이
그 다음 타임 interval때는
1번째와 2번째 값이되고 3번째는 1번째값의 +10
그리고 4번째 값이 전송되어진 값을 읽은 값이 됩니다...
그래서 제가 생성자에서
inum=10; num[2], tmp=0
이렇게해서 for문으로 두 데이터를 한번에 받아서
printf("%d %d %d %d\n", inum, num[0], inum+10, num[1]);
inum=inum+10;
tmp=num[1];
이렇게 했구요....
타이머가 호출하는 함수 부분은
printf("%d %d %d %d\n", inum, tmp, inum+10, buf);
tmp=buf;
buf가 전송되는 데이터 값을 저장 시킨 변수 입니다.....
이렇게 했습니다.......
다른데는 다 아무 이상없이 되는데요....
inum....이녀석이 속을 썩이네요.....ㅜ.ㅜ

-1073742520 45 -1073742520 67
-1073742520 67 -1073742520 78
-1073742520 78 -1073742520 82
-1073742520 82 -1073742520 18

이렇게 나와버립니다.....쓰다보니 엄청 길군요........
이렇게 주저리 주저리 말로 쓰는것 보다 소스를
보시는게 무슨 말인지 더 잘 아실꺼 같다면
소스 올리라고 말씀해 주십시요.......바탁드립니다...ㅜ.ㅜ

elien의 이미지

잠시 밖에 나갔다와서 답이 좀 늦었습니다.
지금 하시는 일에 대해 제가 전혀 알지 못하니 딱히 드릴 말씀은 없네요
다만 최초에 올리셨던 예시 코드나 제가 올렸던 예제 코드와 같은 구조로 값을 변경하고 있다면 맞게 나와야 하는 것이 정상일 것 같습니다.

제가 드릴 수 있는 조언이라고는 기껏해야 요정도가 아닐까 생각합니다.
먼저 변수의 초기화가 잘 이뤄지고 있는지 확인을 해보시구요,
변수의 scope 에 맞게 참조하고 있는지 확인해보시구요
그래도 안된다면 간략한 소스코드를 올려주시는 것이 문제해결에 도움이되겠지요

위의 결과로 봐선 변수의 값이 아닌 포인터 값이 출력되고 있는 것 같습니다만...
(포인터 치곤 값이 너무 크기도 하네요 후우; )

훗, 못 믿겠나?

익명 사용자의 이미지

님께서 나갔다오셔서 답이 늦었다고 말씀해주시니까
감사하구 죄송스럽네여....^^;;
흠.....포인터 값은 아닌것 같긴 한데여.....
변수를 선언하고서 초기화를 안하고
그냥 그 변수를 쓰면 이상한 값이 나오자나요....
그래서 저렇게 되는듯 합니다....
그니까 제가 생성자에서 변수에 값을 넣어서
초기화를 시켰는데도 그 변수를 사용하는
다른 함수에서 초기화 안시킨 걸로 인식을 하는건지....ㅡ,.ㅡ;;;
지금이라도 소스를 올려보고 싶지만....
그게 학교에 있어서요.......ㅜ.ㅜ
내일 학교 가자마자 함 올려 봐야겠군요...
이렇게 도움 주셔서 감사합니다...^^

lovemyin의 이미지

혹시나 해서 말씀드립니다.
만약 생성자에서 초기화 리스트를 사용하셨다면 문제가 발생할 수도 있습니다.

class A {
public  
    A()  a(b), b(10) {}
    ~A() {}
private 
   int a;
   int b;
}

위의 소스를 보시면 생성자에서 초기화 리스트를 사용하고 있습니다.
초기화 리스트를 사용하여 초기화 할 경우 변수 초기화 순서는 클래스에 선언된
멤버의 순서에 따라 진행됩니다.
따라서 위처럼 a(b)를 했을경우 아직 b라는 변수에 10이 들어가기 전이기때문에 a의 값에 쓰래기 값이 들어갈 수 있습니다.
이와 같은 순서를 하셨는지 한번 확인해 보세요...
이건 아닐것 같지만...^^

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

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