[C++] Variabele in variabelenaam gebruiken

Pagina: 1
Acties:

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Hallo allemaal, ik ben nog niet zo heel lang bezig met C++, maar ik heb een, waarschijnlijk, simpel vraagje. Ik heb op een dialogje een aantal edit field gezet. Aan deze edit fields heb ik member variabels toegekend in de trant van m_strBank1, m_strBank2 etc.
Nu wil ik dus in een loop wat code uitvoeren en dan een waarde aan een member variabel toekennen. Alleen hoe gebruik in bijvoorbeeld variabele i in de member variabel naam?

Ikzelf zat aan zoiets te denken maar dat werkt niet. Wie kan me een zetje in de goede richting geven :) :>

code:
1
2
3
4
for (i = 0, i < 13, i++) {
  //wat code om een chip uit te lezen
  m_strBank[i] = string;
}

Hail to the king baby!


  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 20:00
Kun je niet beter al je EditFields in een of andere Collection zetten en dan door deze Collection lopen?

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:11
Nog nooit wat in C++ gedaan, maar als je variabele variabelnamen nodig hebt moet je meestal kijken naar arrays.

Regeren is vooruitschuiven


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

T-MOB schreef op woensdag 11 mei 2005 @ 11:24:
Nog nooit wat in C++ gedaan, maar als je variabele variabelnamen nodig hebt moet je meestal kijken naar arrays.
m_strBank[i] lijkt toch zeker wel op een array. Ik vraag me alleen af hoe hij die gedeclareerd heeft.

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Dus dan zou ik een array aanmaken met daarin de variabele namen en de waardes?

Zoiets:

code:
1
CString waardes[2][13];


Maar volgens mij heb ik dan nog steeds niet de waarde in de variabele staan?

@GX, is geen array, is gewoon de variabele naam. Was een probeerseltje.

[ Voor 15% gewijzigd door urk_forever op 11-05-2005 11:55 ]

Hail to the king baby!


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:11
urk_forever schreef op woensdag 11 mei 2005 @ 11:54:
Dus dan zou ik een array aanmaken met daarin de variabele namen en de waardes?
Wat ik uit je TS opmaak noem je nu de variabelen m_strBank1, m_strBank2, etc..
Dat zou dan een array moeten worden a la:
code:
1
m_strBank = array( 1 => foo, 2 => bar)

Dan kun er doorheenloopen zoals in je startpost.

Regeren is vooruitschuiven


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Dan de vraag, waarom variabele variabele namen? Gebruik gewoon een array om je waarden op te slaan. met [i] achter de m_strBank geef je al aan dat m_strBank meerdere values kent (of gewoon een string is) en daarmee dus een array is.

Naar mijn weten kan je variabelenamen niet variabel declareren. Uberhaupt in welke gangbare taal dan ook. Then again, mijn kennis is ook zeer beperkt :P

edit:
Ik ga niet nog een keer post maken :+. Variabele namen gaat niet; gebruik gewoon een array. dan kan je er ook veel soepeler doorheen itereren (in de toekomst. nu. ooit).

[ Voor 20% gewijzigd door GX op 11-05-2005 12:25 ]


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Laat ik mijn vraag dan anders stellen.

Ik heb 13 member variabels aangemaakt als strings, ze hebben een naam in de trant van m_strBank1, m_strBank2. Dus m_strBank en dan een nummer.
Nu wil ik via een loop deze member variabels vullen. Hoe doe ik dit? Hoe gebruik ik mijn loop integer om de variabele naam te construeren en dan te vullen met een waarde?

Is dat duidelijker?

Hail to the king baby!


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Gebruik een array.

code:
1
2
3
4
for( int i = 0; i < aantalItemsInArray; i++ )
{
    cout << myArray[i];
}

[ Voor 82% gewijzigd door whoami op 11-05-2005 12:17 ]

https://fgheysels.github.io/


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

urk_forever schreef op woensdag 11 mei 2005 @ 12:13:
Laat ik mijn vraag dan anders stellen.

Ik heb 13 member variabels aangemaakt als strings, ze hebben een naam in de trant van m_strBank1, m_strBank2. Dus m_strBank en dan een nummer.
Nu wil ik via een loop deze member variabels vullen. Hoe doe ik dit? Hoe gebruik ik mijn loop integer om de variabele naam te construeren en dan te vullen met een waarde?

Is dat duidelijker?
Als jij een fundering van een paar tegels neerlegt kun je daar ook niet een huis op bouwen. Iedereen hier zegt dat je een fatsoenlijke fundering moet leggen en jij blijftzeggen dat de tegels een gegeven zijn.

Pak een boek over c++ of programmeren algemeen, sla dit open en zoek het hoofdstuk over arrays op en ga dit lezen. Variabele variabele namen zijn in 99% van de gevallen onnodig en slecht en in al deze gevallen is er een veel simpelere en nettere oplossing te verzinnen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Ik snap het niet helemaal, dus ik hoop dat jullie het nog ff met me volhouden ;)

Als ik nu een array aanmaak, CString waardes[13], en daar de waardes instop die ik uitlees moet ik toch nog altijd code aanmaken om de waarde uit de array naar de member variabel toe te kennen?
Of denk ik nu helemaal verkeerd?

Hail to the king baby!


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Je kunt toch ook een array van membervariabelen maken?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Nou, ik denk dat ik de zoektocht maar opgeef en terugval op de oude vertrouwde, copy/paste methode en het stukje code gewoon 13 keer paste :|

Hail to the king baby!


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Welke compiler/API gebruik je eigenlijk? Het riekt een beetje naar Visual C++ icm MFC, en volgens mij kun je dan idd niet al die verschillende controls in een enkele array plaatsen. Wat je wel zou kunnen doen is een array maken met pointers naar die variabelen; dan hoef je die array maar 1 keer te initializeren, en in de rest van je code kun je dan vervolgens die array gebruiken om de individuele controls te benaderen.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class MyWindow
{
public:
    MyClass();

    void DoeIetsMetControls();

    // ...

    // je control variabelen
    CString m_strBank1;
    CString m_strBank2;
    CString m_strBank3;

    // je array
    CString *m_strBanks[3];
};

// in je constructor:
MyClass::MyClass()
{
    m_strBanks[0] = &m_strBank1;
    m_strBanks[1] = &m_strBank2;
    m_strBanks[2] = &m_strBank3;
}

// een random functie in je class
void MyClass::DoeIetsMetControls()
{
    for (int i = 0; i < 3; i++)
        MessageBox(*m_strBanks[i]);
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Copy ff die code van je dialog in een berichtje(het is toch mfc?) dan probeer ik het ook met een testprogje. Misschien kan je van de members die aan je edit fields zitten meteen een array maken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
urk_forever schreef op woensdag 11 mei 2005 @ 11:21:
Hallo allemaal, ik ben nog niet zo heel lang bezig met C++, maar ik heb een, waarschijnlijk, simpel vraagje. Ik heb op een dialogje een aantal edit field gezet. Aan deze edit fields heb ik member variabels toegekend in de trant van m_strBank1, m_strBank2 etc.
Nu wil ik dus in een loop wat code uitvoeren en dan een waarde aan een member variabel toekennen.
Dat kan niet. Na compilatie zijn de namen verdwenen. De variabele heeft pas een waarde tijdens executie, dus er is nooit een moment waarop dit zo werkt.

De correcte manier is om om je variabelen simpelweg niet m_strBank1 te noemen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
@.oisyn Het is eMbedded Visual C++ met inderdaad MFC

@FozzyBear De rest van de code heeft weinig met dit probleem te maken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// MyPropertyPage1.cpp : implementation file
//

#include "stdafx.h"
#include "PropertySheetDialog.h"
#include "MyPropertyPage1.h"
#include "MyPropertyPage2.h"
#include "HITLib-2G_inc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyPropertyPage1 property page

IMPLEMENT_DYNCREATE(CMyPropertyPage1, CPropertyPage)

CMyPropertyPage1::CMyPropertyPage1() : CPropertyPage(CMyPropertyPage1::IDD)
{
    //{{AFX_DATA_INIT(CMyPropertyPage1)
    m_strBank1 = _T("");
    m_strBank2 = _T("");
    m_strBank3 = _T("");
    m_strBank4 = _T("");
    m_strBank5 = _T("");
    m_strBank6 = _T("");
    m_strBank7 = _T("");
    m_bAuthentication = TRUE;
    m_strSerialNumber = _T("");
    //}}AFX_DATA_INIT
}

CMyPropertyPage1::~CMyPropertyPage1()
{
}

void CMyPropertyPage1::DoDataExchange(CDataExchange* pDX)
{
    CPropertyPage::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMyPropertyPage1)
    DDX_Control(pDX, IDC_DISCONNECT, m_ctrlDisconnect);
    DDX_Control(pDX, IDC_CONNECT, m_ctrlConnect);
    DDX_Control(pDX, IDC_WRITE, m_ctrlWrite);
    DDX_Control(pDX, IDC_READ, m_ctrlRead);
    DDX_Text(pDX, IDC_BANK1, m_strBank1);
    DDX_Text(pDX, IDC_BANK2, m_strBank2);
    DDX_Text(pDX, IDC_BANK3, m_strBank3);
    DDX_Text(pDX, IDC_BANK4, m_strBank4);
    DDX_Text(pDX, IDC_BANK5, m_strBank5);
    DDX_Text(pDX, IDC_BANK6, m_strBank6);
    DDX_Text(pDX, IDC_BANK7, m_strBank7);
    DDX_Check(pDX, IDC_AUTH, m_bAuthentication);
    DDX_Text(pDX, IDC_SERIALNUMBER, m_strSerialNumber);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyPropertyPage1, CPropertyPage)
    //{{AFX_MSG_MAP(CMyPropertyPage1)
    ON_BN_CLICKED(IDC_CONNECT, OnConnect)
    ON_BN_CLICKED(IDC_DISCONNECT, OnDisconnect)
    ON_BN_CLICKED(IDC_READ, OnRead)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyPropertyPage1 message handlers


Misschien dat dit interessant is maar ik denk het niet.

Hail to the king baby!


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 15:48
Maar ja, volgens mij kan ik veel slimmere dingen bedenken maar korter als dit zal het volgens mij niet worden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    if (SelectCard()) {
        i2 = 6;
        for (i = 0; i < 13; i++) {
            HIT_ReadBlock(i2, 2, PROTOCOL_PICO_15693, l_sDataReceived);
            Banks[i] = HexstringToString(l_sDataReceived);
            wcscpy(l_sDataReceived, TEXT(""));
            i2 += 2;
        }
        m_strBank1 = Banks[0];
        m_strBank2 = Banks[1];
        m_strBank3 = Banks[2];
        m_strBank4 = Banks[3];
        m_strBank5 = Banks[4];
        m_strBank6 = Banks[5];
        m_strBank7 = Banks[6];
        //m_strBank8 = Banks[8];
        //m_strBank9 = Banks[9];
        //m_strBank10 = Banks[10];
        //m_strBank11 = Banks[11];
        //m_strBank12 = Banks[12];
        //m_strBank13 = Banks[13];
    }

Hail to the king baby!


Verwijderd

Bij mij werkt het. Het belangrijkste is dit:

C++:
1
2
3
4
5
6
7
8
void CarraytestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_szBank[0]);
    DDX_Text(pDX, IDC_EDIT2, m_szBank[1]);
    DDX_Text(pDX, IDC_EDIT3, m_szBank[2]);
    DDX_Text(pDX, IDC_EDIT4, szEdit4);
}


Ik heb met de m_szBank aangemaakt bij IDC_EDIT1 (private) en hier met de hand een array van gemaakt en bij DoDataExchange de andere arraynummers bijgevoegd. Dus ff in je header er [3] achter typen. Dan doe ik:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CarraytestDlg::OnBnClickedOk()
{
    // TODO: Add your control notification handler code here
    int i=0;
    UpdateData(true);
    for (i = 0; i < 3; i++)
    {
        //wat code om een chip uit te lezen
         szString[i]=m_szBank[i];
         // Weergeven in de 4e editbox om te zien wat je doet:
         szEdit4+=szString[i];
        
    }
    UpdateData(false);
    //OnOK();
}

[ Voor 4% gewijzigd door NMe op 11-05-2005 15:20 . Reden: Code tags toegevoegd. Doe je dat volgende keer zelf even? ;) ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Als je handig bent, zorg je dat die IDC_BANK waarden opeenvolgend zijn, dan kun je die DDX_Text calls ook in een loop zetten.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Oeps 1 te groot gemaakt is nl. (0-2)=3 dus het kan zelfs [2] zijn. :o Bij jou moet het dan [12] zijn :)

Leuk probleempje dit, ookal heb ik al een werkende mp3-speler in mfc gemaakt, met arrays in Editboxen had ik nog nooit gespeeld.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nee hoor, een array van m_szBank[0] tot en met m_szBank[2] moet je declareren als een m_szBank[3].

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Ja, idd. Het eerste element =0 maar je declareert [3]. Heb het even nagekeken en er stond ook bij dat dit vaak verwarring veroorzaakt. Misschien is dit in VB anders ofzo ik weet niet hoe ik hier aan kom maar vaak zijn het dingen die ik in VB heb aangeleerd. |:(

Maar de code is volgens mij wat hij bedoelt, korter en werkend.

[ Voor 12% gewijzigd door Verwijderd op 11-05-2005 15:46 ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

In C++ declareer je het aantal elementen, in VB declareer je de index van het laatste element. In VB hangt de index van het eerste element ook nog eens af van de Option Base setting, die kan namelijk 0 of 1 zijn 8)7

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Een goede manier om dat te onthouden is dat je het formaat declareert en dat de index het aantal stappen vanaf het eerste element is ;)
Pagina: 1