Toon posts:

[C++] Wat doe ik hier nou weer fout *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zoals je hieronder kunt lezen ben ik dus net begonnen, ja ik heb een aantal boeken helemaal doorgelezen en nee ik heb nog niet overal verstand van :)

Het gaat om het volgende. In een functie buiten de klasse TForm1 doe ik dit:
===
TForm1 *t;
t->WerkBij(1);
===

In de klasse TForm1 staat de functie WerkBij. Deze ziet er zo uit:
===
void TForm1::WerkBij(int waarde)
{

if (waarde == 1)
{
CheckBox5->Checked = true;
}

}
===

Dit werkt allemaal nog goed (waarde = 1 wordt doorgegeven aan de functie) en bij de vergelijking gaat het fout. Het programma geeft een foutmelding op " CheckBox5->Checked = true" en wel deze:
===
E2208, Cannot access an inactive scope
===


CheckBox5 is een member van TForm1. De functie WerkBij heb ik in de header als volgt gedeclareerd:
===
void TForm1::WerkBij(int waarde);
===
als public van TForm1.


Wat betekent dit? En vooral, wat doe ik verkeerd?
Ik heb op de Builder site gekeken en daar wordt niets verteld. Het enige wat ik heb kunnen vinden is deze site: http://forum.born2program...wtopic.php?t=1822&start=0
Maar dat is niet echt mijn probleem volgens mij.

Zet dit topic aub niet direct op slot, ook al is het misschien een beginnersvraag. Ik heb echt een paar uur zelf geprobeerd... en ik ben ook geen beginner die dit probeerd te leren door maar wat in te vullen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
Tip: als je code post, gebruik dan code-tags rond die code. Dat zorgt voor een betere lay-out enzo.

Ik geloof dat je je functie als volgt moet definieren (in de header dus):
code:
1
void WerkBij (int waarde);


en als volgt moet implementeren (in de cpp dus):
code:
1
2
3
void TForm1::WerkBij (int waarde)
{
}

https://fgheysels.github.io/


Verwijderd

Topicstarter
Had ik al geprobeerd, maar dat mag op beide manieren. Ik denk zelf dat hij CheckBox5 op een één of andere manier kan benaderen ofzo? Hij kent hem in ieder geval wel (ik krijg een lijstje als ik -> gebruik en hij compiled zonder warnings of errors)

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Verwijderd schreef op 22 juni 2003 @ 22:49:
[...]


Had ik al geprobeerd, maar dat mag op beide manieren. Ik denk zelf dat hij CheckBox5 op een één of andere manier kan benaderen ofzo? Hij kent hem in ieder geval wel (ik krijg een lijstje als ik -> gebruik en hij compiled zonder warnings of errors)
Even iets anders:
C++:
1
2
TForm1 *t;
t->WerkBij(1);

Ik hoop dat je daar wel eerst nog die pointer alloceerd (kan zijn dat je het hebt weggelaten)?

Heb trouwens nog dit gevonden via alltheweb.com:
Cannot access an inactive scope

You have tried to evaluate or inspect a variable local to a function that is currently not active.

[ Voor 19% gewijzigd door ^Mo^ op 22-06-2003 22:59 ]

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Topicstarter
_Mo_ schreef op 22 juni 2003 @ 22:52:
[...]

Even iets anders:
C++:
1
2
TForm1 *t;
t->WerkBij(1);

Ik hoop dat je daar wel eerst nog die pointer alloceerd (kan zijn dat je het hebt weggelaten)?

Heb trouwens nog dit gevonden via alltheweb.com:

[...]
Dankjewel, nee.. ik heb geen informatie achtergehouden. De 2 functies zien er zo uit:

(even kijken of dit werkt :) )

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
void Transitie (const TTL& I, const TTL& S, TTL& N)
{
  TTL::TNiveau A = S.niveau(1),
               B = S.niveau(0),
               C = I.niveau(3),
               D = I.niveau(2),
               E = I.niveau(1),
               F = I.niveau(0);
               
  TTL::TNiveau Y = N.niveau(1);
  TTL::TNiveau Z = N.niveau(0);

  Y = TTL::TNiveau((!A&&B&&!C&&D)||(A&&!C&&!F)||(A&&!B&&!C));
  Z = TTL::TNiveau((!A&&!D)||(A&&E)||(!A&&!B)||(A&&B)||(C));

  
  N.niveau(Y,1);
  N.niveau(Z,0);

  TForm1 *t;
t->WerkBij(1);
//t.WerkBij(1);



}


en


C++:
1
2
3
4
5
6
7
8
9
void TForm1::WerkBij(int waarde)
{

  if (waarde == 1)
  {
    CheckBox5->Checked = true;
  }

}

[ Voor 5% gewijzigd door Verwijderd op 22-06-2003 23:07 ]


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Verwijderd schreef op 22 June 2003 @ 23:06:
[...]


C++:
1
2
3
4
5
6
7
8
9
void TForm1::WerkBij(int waarde)
{

  if (waarde == 1)
  {
    CheckBox5->Checked = true;
  }

}
Krijg je de foutmelding trouwens niet meer als je "CheckBox5->Checked = true;" uitzet?

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Verwijderd

Topicstarter
_Mo_ schreef op 22 June 2003 @ 23:21:
[...]

Krijg je de foutmelding trouwens niet meer als je "CheckBox5->Checked = true;" uitzet?
Als ik "CheckBox5->Checked = true;" vervang door "String sTest = "Testje";" is er geen enkel probleem nee. Dan wordt sTest gewoon gelijk gemaakt aan "Testje".

Het is echt alleen als ik CheckBox-> gebruik. Compilen en runnen gaat allemaal goed, totdat hij bij de functie WerkBij komt. Dan krijg ik een maffe geheugendump. Als ik vervolgens weer terugkeer naar de editor staat de melding "Cannot access an inactive scope"

Het ligt trouwens echt aan de functie WerkBij volgens mij. Als ik namelijk dit doe:

C++:
1
2
3
4
5
6
7
void __fastcall TForm1::CheckBox4Click(TObject *Sender)
{
  unsigned int toets = 4;
  ToetsActie (toets,state, instate, decoder);
  decoder.decodeer ();
  CheckBox5->Checked = true; 
}


is er weer niets aan de hand, dan krijg ik een mooi vinkje :)


Is het anders misschien handig als ik de source hier neer zet? Of mag dat niet?

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Verwijderd schreef op 22 juni 2003 @ 23:06:
[...]


Dankjewel, nee.. ik heb geen informatie achtergehouden. De 2 functies zien er zo uit:

(even kijken of dit werkt :) )

C++:
1
2
  TForm1 *t;
t->WerkBij(1);
Waarom gebruik je daar die T? Als je gewoon je bestaande form wil benaderen doe je gewoon Form1->WerkBij(1);

Verwijderd

Topicstarter
Bigs schreef op 22 June 2003 @ 23:38:
[...]


Waarom gebruik je daar die T? Als je gewoon je bestaande form wil benaderen doe je gewoon Form1->WerkBij(1);
Jij krijgt de kus :)
Ik weet ook niet waarom ik dat deed, zag er wel grappig uit eigenlijk :) Anyway, ik heb het veranderd en hij werkt :) Woei... dank jullie wel.

(wel vreemd trouwens dat de constructie die ik had eigenlijk wel werkte, mja... je ziet dat ik nog wat moet leren)

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Verwijderd schreef op 22 June 2003 @ 23:49:
[...]


Jij krijgt de kus :)
Ik weet ook niet waarom ik dat deed, zag er wel grappig uit eigenlijk :) Anyway, ik heb het veranderd en hij werkt :) Woei... dank jullie wel.

(wel vreemd trouwens dat de constructie die ik had eigenlijk wel werkte, mja... je ziet dat ik nog wat moet leren)
Begin je nou met C++ te leren of Windows programmeren? Als je nog C++ moet gaan leren dan ben je (naar mijn mening) beter af met console programmeren totdat je de principes van C++ allemaal kent.

-Edit-
@ MSalters
Klinkt op zich best zinnig wat je daar zegt. Is dat een typish Borland compiler iets dan? Want volgens mij mag je in elke andere compiler zomaar een pointer gebruiken (of je 'm goed initialiseerd/alloceerd is een ander verhaal).

[ Voor 18% gewijzigd door ^Mo^ op 23-06-2003 00:11 ]

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Cannot access an inactive scope
You have tried to evaluate or inspect a variable local to a function that is currently not active.
wijst 100% zeker naar de fout, die _Mo_ ook al opmerkte: t is een pointer, maar t point nergens naar. ("not active"). Je kunt er dus geen methods aanroepen van het object waar t naar toe wijst, maar je probeert het de volgende regel wel.

Pointers moet je (vrijwel) altijd meteen een waarde geven. Als dat niet kan, declareer de pointer dan een paar regels later waar je de waarde wel hebt ipv de pointer ongeinitialiseerd te laten.

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

Topicstarter
_Mo_ schreef op 23 juni 2003 @ 00:06:
[...]

Begin je nou met C++ te leren of Windows programmeren? Als je nog C++ moet gaan leren dan ben je (naar mijn mening) beter af met console programmeren totdat je de principes van C++ allemaal kent.

-Edit-
@ MSalters
Klinkt op zich best zinnig wat je daar zegt. Is dat een typish Borland compiler iets dan? Want volgens mij mag je in elke andere compiler zomaar een pointer gebruiken (of je 'm goed initialiseerd/alloceerd is een ander verhaal).
Beide. Ik had dit programma eerst voor DOS geschreven, maar wil er nu een C++ applicatie van maken. Tevens ben ik net begonnen met C++ onder Linux. Dus hier wordt nog aan de weg getimmerd :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
_Mo_ schreef op 23 June 2003 @ 00:06:
[...]

-Edit-
@ MSalters
Klinkt op zich best zinnig wat je daar zegt. Is dat een typish Borland compiler iets dan? Want volgens mij mag je in elke andere compiler zomaar een pointer gebruiken (of je 'm goed initialiseerd/alloceerd is een ander verhaal).
In Borland C++ Builder 5 (en ook in Delphi 5), wordt van iedere form die je maakt in je project 1 instance van die Form gemaakt.
Er bestaat dus al een instance van TForm1, namelijk Form1 in je project. Eigenlijk is het het netste als je daar geen gebruik van maakt, van die autocreated instance.
Je kan dit dan ook afzetten door in je Project Options die form van je auto-created list te halen (als het niet het hoofdform is tenminste).
Op die manier moet je dus wel nog je instance creeëren en instantieren:
code:
1
2
TForm1* t = new TForm1();
t->Werkbij(1);

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
[quote]Verwijderd schreef op 23 June 2003 @ 00:36:
@ MSalters
Klinkt op zich best zinnig wat je daar zegt. Is dat een typish Borland compiler iets dan? Want volgens mij mag je in elke andere compiler zomaar een pointer gebruiken (of je 'm goed initialiseerd/alloceerd is een ander verhaal).
quote]
Nee hoor, bijvoorbeeld MSVC doet vergelijkbare dingen in de nieuwere versies (5+ IIRC) en alleen in debug mode. Het kost tijd, maar het helpt het debuggen wel.

Slechtere compilers hebben de vervelende eigenschap om alleen rotzooi in die pointer te stoppen als je baas kijkt })

C (waar dit feature vandaan komt) is een taal gebouwd voor snelheid; veiligheid is een optioneel compiler onderdeel. Safety last enzo. De compiler doet geen dingen achter je rug, ook al zou het nodig zijn.

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

Pagina: 1