[C++] vullen van een array (en meer.. )

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
(een goeie titel bedenken is moeilijk.. ik weet niks beters.. )


Ik heb nu 't volgende stukje code:
code:
1
2
3
4
    AnsiString matrix_a[3];
    matrix_a[0] = a0->Text;
    matrix_a[1] = a1->Text;
    matrix_a[2] = a2->Text;

(a0, a1 en a2 zijn TEdit veldjes)
Dit doet voor me wat ie moet doen.. vervelend wordt 't alleen als er niet slechts 3 van die veldjes zijn, maar bijvoorbeeld 100 :)

Daarom heb ik nu zoiets in gedachten:
code:
1
2
3
4
5
6
    const int i=8;
    AnsiString matrix_a[i];
    while(i != 0){
      matrix_a[i] = ai->Text;
      i--;
}

Owkay.. tis baggercode en er klopt niks van ;)
Gaat me even om 't idee.. Komt er dus op neer dat als ie bezig is met matrix_a[3] dat ie dan a3->Text; moet nemen, en als ie met matrix_a-6] dat ie dan a6->Text; doet etc..
Kan natuurlijk wel een array maken met verwijzingen naar die TEdit's maar is dat de enige manier? Of is er een handige oplossing hiervoor?

* krietjur hoopt dat ie de vraag enigzins duidelijk uit heeft weten te leggen.. :)

Verwijderd

Tijdens runtime kun je geen variabele namen opbouwen uit verschillende stukken, om ze daarna verder te gebruiken.

C++ heeft geen eval() oid.

Dus je zal het toch iets anders moeten oplossen.

Verwijderd

in plaats van a1,a2,a3,a4,a5 enz. maak je a[5],met dus a[0]->Text,a[1]->Text,a[2]->Text.....

Verwijderd

Op maandag 17 september 2001 22:52 schreef beelzebubu het volgende:
in plaats van a1,a2,a3,a4,a5 enz. maak je a[5],met dus a[0]->Text,a[1]->Text,a[2]->Text.....
Tja dat gaat dus ook niet :) je moet elk Text boxje of wat dan ook een unieke naam geven. dit is zeker wel op te lossen met een beetje VCL 'know how'

  • BurningSheep
  • Registratie: Januari 2000
  • Laatst online: 03-05 22:13
Op maandag 17 september 2001 22:58 schreef mgfun het volgende:

[..]

Tja dat gaat dus ook niet :) je moet elk Text boxje of wat dan ook een unieke naam geven. dit is zeker wel op te lossen met een beetje VCL 'know how'
Als je tijd en zin hebt om elk text boxje een unieke naam te geven heb je toch ook wel tijd/zin om die code ff uit te schrijven, of niet? ;)

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
grmblz.. zou zo handig zijn als je "gewoon" een deel van de variabele naam hetzelfde laat (in dit geval dus de a) en daar iets achter kan plakken tijdens runtime.. (de i).
dit is zeker wel op te lossen met een beetje VCL 'know how'
Misschien een domme vraag, maar wat is VCL?

  • solomo
  • Registratie: Juli 2001
  • Niet online

solomo

.....huh?

elke textbox heeft altijd een unieke naam :)
maar, het is dus de bedoeling om de boel op een makkelijke manier in een array te zetten.

Verwijderd

Op maandag 17 september 2001 23:03 schreef BurningSheep het volgende:

[..]

Als je tijd en zin hebt om elk text boxje een unieke naam te geven heb je toch ook wel tijd/zin om die code ff uit te schrijven, of niet? ;)
Je zou een array kunnen maken met componenten... maar dan zou je nog heel veel werk moeten verrichten om ze op je form te plaatsen.

edit:

Oja als hij borland C++ Builder gebuikt dan wil ik best wel een voorbeeldje schrijven.

Verwijderd

Op maandag 17 september 2001 23:03 schreef krietjur het volgende:
grmblz.. zou zo handig zijn als je "gewoon" een deel van de variabele naam hetzelfde laat (in dit geval dus de a) en daar iets achter kan plakken tijdens runtime.. (de i).
[..]

Misschien een domme vraag, maar wat is VCL?
Okay... wat gebruik je eigenlijk ?? Microsoft Visual C++ of Borland (C++ Builder/Compiler).

De VCL (Visual Component Library) is een onderdeel van Borlands C++ Builder en Dephi en is een soort laag tussen jou en windows om het leven makelijker te maken.

Verwijderd

Op maandag 17 september 2001 22:58 schreef mgfun het volgende:

[..]

Tja dat gaat dus ook niet :) je moet elk Text boxje of wat dan ook een unieke naam geven. dit is zeker wel op te lossen met een beetje VCL 'know how'
code:
1
2
3
4
5
6
7
8
9
10
11
#define NUM 1000

TEdit a[NUM];
char temp[256];
int i;

for(i=0;i<NUM;i++)
{
  sprintf(temp,"%d",i);
  a[i]->geefnaam(strdup(a[i]));
}

Niet vergeten te free()-enalsje klaar bent met de TEdit veldjes :D

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
Borland C++ Builder 3 gebruik ik

  • BurningSheep
  • Registratie: Januari 2000
  • Laatst online: 03-05 22:13
Op maandag 17 september 2001 23:06 schreef mgfun het volgende:

[..]

Je zou een array kunnen maken met componenten... maar dan zou je nog heel veel werk moeten verrichten om ze op je form te plaatsen.

edit:

Oja als hij borland gebuikt dan wil ik best wel een voorbeeldje schrijven.
Ik heb nog nooit een TEdit boxje gezien, en weet ook niet of ik ze wel wil zien, maar als je een handeling 100 keer moet uitvoeren dan doe je iets verkeerd. Je bent namelijk programmeur en geen lopende band medewerker

Verwijderd

Op maandag 17 september 2001 22:51 schreef Sneech het volgende:
Tijdens runtime kun je geen variabele namen opbouwen uit verschillende stukken, om ze daarna verder te gebruiken.

C++ heeft geen eval() oid.

Dus je zal het toch iets anders moeten oplossen.
sorry hoor maar je kunt wel runtime dit voor elkaar krijgen |:(

hier is de nodige code (runtime) >:)
int lengte;

TEdit *editArray[lengte];

for (int a=0;a<=lengte;a++){
// Form1 is verantwoorderlijk
editArray[a]=new TEdit(Form1);
...
...
// Form1 is waar de TEdit editArray[a] verschijnt
editArray[a]->Parent=Form1;
}
}

kortom door eerst een array te maken (runtime) die bestaat uit allemaal TEdit's, kun je vervolgens weer een simpele lus maken om de Text te gebruiken. Dus:

int intArray[lengte];
for (int a=0;a<=lengte;a++){
intArray[a]=StrToInt(editArray[a]->Text);
}

Het enige probleem is nu 'lengte', want die is niet runtime. Maar ik denk dat je nu al wat verder zult komen.

ow... neem het niet klakkeloos over ik weet dat het ongeveer zo is... maar precies, dat denk ik niet

Verwijderd

Op maandag 17 september 2001 23:11 schreef beelzebubu het volgende:

[..]
code:
1
2
3
4
5
6
7
8
9
10
11
#define NUM 1000

TEdit a[NUM];
char temp[256];
int i;

for(i=0;i<NUM;i++)
{
  sprintf(temp,"%d",i);
  a[i]->geefnaam(strdup(a[i]));
}

Niet vergeten te free()-enalsje klaar bent met de TEdit veldjes :D
Ja erg nuttig nu heb je 1000 TEdit boxjes die je daarna ook nog op je form moet plaatsen... Ik weet niet wat hij wil met zo veel editjes (Wat wil je eigenlijk ?) want dan kun je beter TString gebruiken.

Verwijderd

je zit volgens mij op het Saxion?! of nie, krietjur? :P

Verwijderd

Op maandag 17 september 2001 23:12 schreef BurningSheep het volgende:

[..]

Ik heb nog nooit een TEdit boxje gezien, en weet ook niet of ik ze wel wil zien, maar als je een handeling 100 keer moet uitvoeren dan doe je iets verkeerd. Je bent namelijk programmeur en geen lopende band medewerker
Afbeeldingslocatie: http://www.mgfun.com/stuffforothersites/tedit.jpg
>:)

Maar om even bij de les te blijven. Heb je een form met allemaal TEditjes er op die je naar een array van strings wil beamen ?

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
Euh jah ik zit op 't Saxion.. :-)
Ken ik u? :-)

Verwijderd

Op maandag 17 september 2001 23:22 schreef krietjur het volgende:
Euh jah ik zit op 't Saxion.. :-)
Ken ik u? :-)
misschien in welke IC klas zit je? ik zit in IC3D(3)..

en heb beide vakken waarvoor je dit geintje nodig hebt al gehaald

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
Maar om even bij de les te blijven. Heb je een form met allemaal TEditjes er op die je naar een array van strings wil beamen ?
Ik heb dit form:

Afbeeldingslocatie: http://www.krietjur.co.uk/matrix.jpg
Zodra ik op de knop druk wil ik de inhoud van matrix 1 en 2 in een array hebben (een array voor elke matrix). Nu kan ik 't voor deze matrix makkelijk uitvoeren, maar ik wil 't dus 't liefst zo maken dat als ik 100 TEdit's toevoeg ik niet zoveel regels code hoef toe te voegen.. :)

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
Op maandag 17 september 2001 23:29 schreef VoodooBox het volgende:

[..]

misschien in welke IC klas zit je? ik zit in IC3D(3)..

en heb beide vakken waarvoor je dit geintje nodig hebt al gehaald
IC3D1 als ik me niet vergis :)

Verwijderd

die code die ik gaf hoef je alleen nog maar uit te werken.. positie enzo (editArray[a]->Left en editArray->Top)..

gebruik voor de opslag een andere array van het type 'long double' anders kun je rekenvoudjes krijgen :)

je kun je matrix ook makkelijker maken door een 2 dimentionale array te gebruiken dus:

editArray[a][b]

veel suc6 man... met ongeveer 30 regels code is het helemaal zo te krijgen als dat de opdracht je voorschrijft

  • krietjur
  • Registratie: Februari 2001
  • Laatst online: 11:58

krietjur

Where am I?

Topicstarter
Thnx! 'k heb nu helaas een ander probleem, de cola en de chips is op en dat zijn twee dingen die ik nodig heb om te kunnen werken.. :( Morgen ff nieuwe halen en dan kan ik weer aan de slag! ;) Bedankt in elk geval!

Verwijderd

heheh ik ken het probleem...

btw.. graag gedaan...

Verwijderd

30 regels maar ?
code:
1
2
3
4
5
6
7
8
9
     TWinControl *Container = MyMatrixPanel;
     for (int i =0;i <Container->ControlCount;i++)
     {
      if (dynamic_cast <TEdit*>(Container -> Controls[i]))
      {
        TEdit&ref_obj = dynamic_cast<TEdit&>(*Container->Controls[i]);
        Status -> Lines -> Add(ref_obj.Text);
      }
     }

>:)

Werkt prima in zijn geval je moet alleen ff 'Status -> Lines -> Add(blabla)' vervangen met je string array.

Verwijderd

idd... zeer strakke code...:)

maar ik had het ook over de rest van de opdr8... |:(

Verwijderd

Op maandag 17 september 2001 23:49 schreef VoodooBox het volgende:
idd... zeer strakke code...:)

maar ik had het ook over de rest van de opdr8... |:(
Snap ik ook wel, ik zit gewoon een beetje aan te klooien, heb al een aantal weken geen C++ meer gedaan en al helemaal niet lang op GoT gezeten... krijg je als je fulltime moet werken. Wel een leuk project trouwns.

Verwijderd

Kent VCL geen concept als DataTargets. Erg kewl zijn die.
Kun je bijv. een textbox aan een variable hangen... zodat de variable altijd de waarde heeft wat in een textbox staat.
Dit kan op verschillende manieren zoals een textbox verbinden met een int, double of string. Erg handig al zeg ik het zelf.Checkbuttons kunnen bijv. aan een boolean worden gehangen. Ofcourse... dit zit allemaal in FOX.

sluipreclame: (www.fox-toolkit.org)

Verwijderd

Op maandag 17 september 2001 23:55 schreef vicz het volgende:
Kent VCL geen concept als DataTargets. Erg kewl zijn die.
Kun je bijv. een textbox aan een variable hangen... zodat de variable altijd de waarde heeft wat in een textbox staat.
Dit kan op verschillende manieren zoals een textbox verbinden met een int, double of string. Erg handig al zeg ik het zelf.Checkbuttons kunnen bijv. aan een boolean worden gehangen. Ofcourse... dit zit allemaal in FOX.

sluipreclame: (www.fox-toolkit.org)
Dat klinkt zeker leuk, maar volgens mij kan dat niet in C/C++ zover ik weet... En sluip reclame vink niet erg ben altijd in voor iets leuks.

Verwijderd

Op maandag 17 september 2001 23:58 schreef mgfun het volgende:

[..]

Dat klinkt zeker leuk, maar volgens mij kan dat niet in C/C++ zover ik weet... En sluip reclame vink niet erg ben altijd in voor iets leuks.
Dit is een GUI-Toolkit geschreven in C++....
Als je een textbox verbind met een datatarget, send de textbox een message naar de datatarget als die wordt gewijzigd . De datatarget send vervolgens een message naar de textbox met als boodschap ID_GETSTRINGVALUE ( of ID_GETINTVALUE... ligt aan de datatarget)... de textbox geeft dan de gevraagde value terug. De datatarget zorgt ervoor dat de variable deze waarde dan krijgt.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op maandag 17 september 2001 23:44 schreef mgfun het volgende:
30 regels maar ?
code:
1
2
3
4
5
6
7
8
9
     TWinControl *Container = MyMatrixPanel;
     for (int i =0;i <Container->ControlCount;i++)
     {
      if (dynamic_cast <TEdit*>(Container -> Controls[i]))
      {
        TEdit&ref_obj = dynamic_cast<TEdit&>(*Container->Controls[i]);
        Status -> Lines -> Add(ref_obj.Text);
      }
     }

>:)
Gadverdamme ga jij je in een hoekje zitten schamen met dynamic_casts op VCL objecten... heb je wel eens in de docs van TObject gekeken? RTTI zit gewoon in het framework hoor... dus:
code:
1
2
3
4
5
6
7
8
9
TEdit*     MyEdit;
TWinControl*   Container = MyMatrixPanel;

for (int i = 0; i < Container->ControlCount; i++)
  if(Container->Controls[i]->InheritsFrom(__classid(TEdit)))
    {
    MyEdit     = (TEdit*)Container->Controls[i];
    Status->Lines->Add(MyEdit->Text);
    }

Da's toch een stuk cleanere code, en helemaal legaal en netjes volgens VCL guidelines.

Professionele website nodig?


Verwijderd

Zal je vertellen dat het idee van de code uit het boek 'C++ Builder 5 Developer's Guide' kwam... dus ik denk dat je hun even moet aankijken :) ik heb het alleen aangepast aan zijn code. Magoed ik zal het hoekje opzoeken (me bed :Z)

Zo zie je maar weer, alle wegen leiden naar Rome.

  • Xiphalon
  • Registratie: Juni 2001
  • Nu online
Terug naar het origineel:
code:
1
2
3
4
5
6
const int i=8;
AnsiString matrix_a[i];
while(i != 0){
    matrix_a[i] = ai->Text;
    i--;
}

moet worden
code:
1
2
3
4
5
6
7
8
#define NAAM(i) a##i

const int i=8
AnsiString matrix_a[i];
while(i != 0){
    matrix_a[i] = NAAM(i)->Text;
    i--;
}

zou moeten werken...
Pagina: 1