Toon posts:

[C++] kan variabel niet terug vinden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een stuk code geschreven om waardes uit een teksfile op te slaan in een array als doubles. Nu wil ik deze array daarna aanroepen, en dan krijg ik onzin waardes terug, hij heeft de array niet onthouden. Ik heb al geprobeerd om de array global te maken, of voor de main te declareren, maar dat werkt niet. Mijn code is als volgt:
C++:
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
void main()
{
ifstream OpenFile("data1.txt");
OpenFile.seekg(ios::beg);
char line[20]; 
int q=0;

while(!OpenFile.eof())      
//tel het aantal ; in de file om de lengte van de benodigde array te weten
{
OpenFile.getline(line,20,';'); 
q=q+1;
//stop wanneer de waarde 0.00000001 is gevonden
double l=atof(line);
if (l==0.00000001)

{
   goto open;
}
}
open: q=q-1;
OpenFile.close();

//array om de waarden in te zetten
double *bp;
int aantal;
aantal=q;
bp = new double [aantal];       

OpenFile.open("data1.txt");
OpenFile.seekg(ios::beg);
while(!OpenFile.eof())
{

OpenFile.getline(line,20,';'); 
//make doubles van char array
double f=atof(line);
int i=0;
i=i+1;
if (f==0.00000001)  
{
goto stop;
}
bp[i]=f;
cout<< "bp[i]="<< bp[i]<< endl;
//hij kent de juiste waarden toe aan de array

cout << OpenFile.tellg() << endl; 
}
stop: cout<<"gestopt"<<endl;

cout<<"bp[4]="<<bp[4]<<endl;
//hij heeft de array niet onthouden en kent onzin toe aan bp[4]

}

Heeft iemand suggesties? Misschien is het ook wel een dom foutje, maar ik zie hem niet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Je kan je code eens debuggen en stap voor stap door je code lopen, en kijken waar het eventueel misloopt.
Ik zie trouwens ook dat je met goto's werkt; dat kan je nog meer problemen bezorgen aangezien je daarmee moeilijk onderhoudbare code creeërt.
Ipv met die goto's te werken, maak je beter gebruik van functions.

Ben je trouwens wel zeker dat er 5 elementen in die array zitten? bp[4] bevat het 5de element.

[ Voor 30% gewijzigd door whoami op 04-06-2004 08:30 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 04 juni 2004 @ 08:27:
Je kan je code eens debuggen en stap voor stap door je code lopen, en kijken waar het eventueel misloopt.
Ik zie trouwens ook dat je met goto's werkt; dat kan je nog meer problemen bezorgen aangezien je daarmee moeilijk onderhoudbare code creeërt.
Ipv met die goto's te werken, maak je beter gebruik van functions.
Het loopt mis wanneer ik die while heb afgesloten en het daarna weer aan wil roepen daarbuiten. Ik ben ook bezig geweest om zonder die goto's te werken, maar dat is niet de oorzaak van mijn probleem.

  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 23-05 18:32

LazySod

Scumbag with a mission

Heb je al eens gekeken hoeveel "records" gelezen worden en of dat overeenstemd met de testfile?

*editeer*

zie net trouwens dat je in de tweede loop je "i" ophoogt voordat je toekent aan het array. Dat betekent dus dat element[0] geen geldige waarde heeft.

[ Voor 71% gewijzigd door LazySod op 04-06-2004 08:40 . Reden: slaapkop ]

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
LazySod schreef op 04 juni 2004 @ 08:38:


zie net trouwens dat je in de tweede loop je "i" ophoogt voordat je toekent aan het array. Dat betekent dus dat element[0] geen geldige waarde heeft.
Idd, en mede door het feit dat het eerste element op index 0 begint, ben je dus niet zeker of er wel een element op index 4 zit.
Als je slechts 4 elementen/records hebt ingelezen, dan zit je laatste element op index 3 in de array.

Daarom ook dat ik zeg: debug je code eens. Als je een fatsoenlijke editor gebruikt, dan kan je breakpoints, watches, etc.... gebruiken.

Daarnaast kan ik niet anders dan nog eens zeggen om die goto's niet te gebruiken.

https://fgheysels.github.io/


  • LazySod
  • Registratie: Augustus 2003
  • Laatst online: 23-05 18:32

LazySod

Scumbag with a mission

Ahh ... En nu zie ik eindelijk de echte fout. Jees.. Heb meer koffie nodig denk ik.

Haal de "int i" eens uit de tweede loop - voor de loop initializeren op 0, daarna binnen de loop ophogen:

C:
1
2
3
4
5
int i = 0;
while ( bla)
{
   element[ i++] = atof( bla);
}

[ Voor 7% gewijzigd door LazySod op 04-06-2004 08:46 ]

Proof is the idol before whom the pure mathematician tortures himself. (Sir Arthur Eddington)


Verwijderd

Is de pointer naar BP bij het uitvragen van de variabele hetzelfde als bij het toekennen daarvan?
Wat is de waarde van aantal?

Verwijderd

in de 2e while heb je staan
int i=0
i=i+1

i is dus altijd 1
verder zoals eerder genoemd.. weg met de goto's

edit:
Born 2 slow

[ Voor 14% gewijzigd door Verwijderd op 04-06-2004 08:45 ]


Verwijderd

Topicstarter
LazySod schreef op 04 juni 2004 @ 08:44:
Ahh ... En nu zie ik eindelijk de echte fout. Jees.. Heb meer koffie nodig denk ik.

Haal de "int i" eens uit de tweede loop - voor de loop initializeren op 0, daarna binnen de loop ophogen:

C:
1
2
3
4
5
int i = 0;
while ( bla)
{
   element[ i++] = atof( bla);
}
Dank je LazySod, nu werkt het wel. Misschien heb ik juist meer koffie nodig! ;)

Verwijderd

Topicstarter
O ja, en de rest natuurlijk ook bedankt! Ik zal ook meteen wat doen aan die goto's. :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Zal ik voor de show ook nog even als spuit elf ageren tegen het gebruik van goto's? ;)

Professionele website nodig?


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 20-05 10:39
Verwijderd schreef op 04 juni 2004 @ 08:19:
C++:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while(!OpenFile.eof())
{

OpenFile.getline(line,20,';'); 
//make doubles van char array
double f=atof(line);
int i=0;
i=i+1;
if (f==0.00000001)  
{
goto stop;
}
bp[i]=f;
cout<< "bp[i]="<< bp[i]<< endl;
//hij kent de juiste waarden toe aan de array

cout << OpenFile.tellg() << endl; 
}
Ik kan me vergissen hoor, maar je zegt eerst:

i=0;

de volgende regel is:

i=i+1;

Met andere woorden: i = 0 + 1 = 1. Zet int i=0 eens buiten je while loop?

edit:
oh laat maar, iemand anders was me voor :)

[ Voor 19% gewijzigd door BRAINLESS01 op 04-06-2004 10:03 ]


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 11:44
Kun je doubles vergelijken met == ??

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
Rowwan schreef op 04 juni 2004 @ 10:47:
Kun je doubles vergelijken met == ??
Eh, ja.

== is de equality operator in C++.

https://fgheysels.github.io/


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22-05 23:01

BoAC

Memento mori

whoami schreef op 04 juni 2004 @ 10:52:
[...]


Eh, ja.

== is de equality operator in C++.
Nee. Je moet < of > gebruiken omdat doubles aan het eind vrijwel nooit kloppen (in VC dan ;) )
Trouwens waarom geen string compare :?

En ik zou ipv goto break; gebruiken in het geval van de TS

[ Voor 8% gewijzigd door BoAC op 04-06-2004 10:54 ]


  • Rowwan
  • Registratie: November 2000
  • Laatst online: 11:44
Weet ik, maar kan de interne representatie niet 0.0000000100001 zijn? M.a.w is de interne representatie gegarandeerd... Bij normale floats niet altijd....

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:33
BoAC schreef op 04 juni 2004 @ 10:53:
[...]


En ik zou ipv goto break; gebruiken in het geval van de TS
Een break springt uit de loop; nu heb ik geen zin om die code nog eens te bekijken, maar ik denk dat functions zowiezo beter zijn.
Rowwan schreef op 04 juni 2004 @ 10:55:
Weet ik, maar kan de interne representatie niet 0.0000000100001 zijn? M.a.w is de interne representatie gegarandeerd... Bij normale floats niet altijd....
Hmmm, daar heb je idd gelijk in.

[ Voor 33% gewijzigd door whoami op 04-06-2004 11:13 ]

https://fgheysels.github.io/


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22-05 23:01

BoAC

Memento mori

whoami schreef op 04 juni 2004 @ 11:13:
[...]
Een break springt uit de loop; nu heb ik geen zin om die code nog eens te bekijken, maar ik denk dat functions zowiezo beter zijn.
[...]
Hmmm, daar heb je idd gelijk in.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
while(!OpenFile.eof())         
//tel het aantal ; in de file om de lengte van de benodigde array te weten 
{ 
    OpenFile.getline(line,20,';');  
    q=q+1; 
    //stop wanneer de waarde 0.00000001 is gevonden 
    double l=atof(line); 
    if (l==0.00000001) 
    { 
        goto open; 
    } 
} 
open: q=q-1; 

of..
C++:
1
2
3
4
5
6
7
8
9
10
11
while(!OpenFile.eof())         
//tel het aantal ; in de file om de lengte van de benodigde array te weten 
{ 
    OpenFile.getline(line,20,';');  
    q++; 
    //stop wanneer de waarde 0.00000001 is gevonden 
    if (strcmp(line, "0.00000001") == 0)
    { 
        break; 
    } 
} 

Nog korter ook ;)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Rowwan schreef op 04 juni 2004 @ 10:47:
Kun je doubles vergelijken met == ??
Moeilijk, over het algemeen gebruik je daarvoor alternatieve methodes met ranges om de foutmarge van doubles te nihiliseren:
C:
1
2
3
4
bool equals(double left, double right, double margin = 0.001f)
{
return (left + margin > right && left - margin < right);
}

Professionele website nodig?


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22-05 23:01

BoAC

Memento mori

curry684 schreef op 04 juni 2004 @ 11:18:
[...]

Moeilijk, over het algemeen gebruik je daarvoor alternatieve methodes met ranges om de foutmarge van doubles te nihiliseren:
C:
1
2
3
4
bool equals(double left, double right, double margin = 0.001f)
{
return (left + margin > right && left - margin < right);
}
Hetzelfde probleem had ik met afstands-berekeningen waar doubles uit kwamen. De ene keer ging de == vergelijking wel goed en de andere keer niet.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

BoAC schreef op 04 juni 2004 @ 11:21:
[...]

Hetzelfde probleem had ik met afstands-berekeningen waar doubles uit kwamen. De ene keer ging de == vergelijking wel goed en de andere keer niet.
DirectX heeft zelfs gestandaardiseerde methodes in de API voor vergelijkingen met doubles (met standaard margin 0.001 als ik me niet vergis).

Professionele website nodig?


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 22-05 23:01

BoAC

Memento mori

curry684 schreef op 04 juni 2004 @ 11:38:
[...]

DirectX heeft zelfs gestandaardiseerde methodes in de API voor vergelijkingen met doubles (met standaard margin 0.001 als ik me niet vergis).
Het ging om een PCB ontwikkel packet (ULTIboard) en daar gebruikten we geen DirectX in ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
curry684 schreef op 04 juni 2004 @ 11:18:
[...]

Moeilijk, over het algemeen gebruik je daarvoor alternatieve methodes met ranges om de foutmarge van doubles te nihiliseren:
C:
1
2
3
4
bool equals(double left, double right, double margin = 0.001f)
{
return (left + margin > right && left - margin < right);
}
Het probleem daarmee is dat operator==(double,double) transitief is : a==b && a==c ==> b==c.

equals (0.000, 0.001) && equals (0.001, 0.002 ) =/=> equals (0.000, 0.002),

jouw equals is dus niet transitief. Hij is wel symmetrisch en reflexief, maar een equivalentierelatie moet aan alle drie voldoen.

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


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Rowwan schreef op 04 juni 2004 @ 10:55:
Weet ik, maar kan de interne representatie niet 0.0000000100001 zijn? M.a.w is de interne representatie gegarandeerd... Bij normale floats niet altijd....
De interne representatie is gegarandeerd binair. 0.5, 0.25, 0.125 zijn dus wel te representeren maar getallen die niet de vorm T/2N hebben niet. 1/10N is dus alleen representeerbaar als N==0, anders hou je N factoren 5 over. N==0 wil alleen maar zeggen dat 1.0 representeerbaar is (duh)

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


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
BoAC schreef op 04 juni 2004 @ 11:21:
[...]

Hetzelfde probleem had ik met afstands-berekeningen waar doubles uit kwamen. De ene keer ging de == vergelijking wel goed en de andere keer niet.
Je moet ook nooit afstanden vergelijken met ==, of zelfs met < en >. Je moet afstand2 vergelijken, dat is veel makkelijker.

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


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:00

Janoz

Moderator Devschuur®

!litemod

Miereneuken kan natuurlijk iedereen :).

Zou je de normale == operatie gebruiken dan krijg je dat 10^100 + 1 - 10^100 == 1 niet geldt. 't is maar net waar je meer waarde aan hecht ;).

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


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Janoz schreef op 04 juni 2004 @ 14:13:
Miereneuken kan natuurlijk iedereen :).

Zou je de normale == operatie gebruiken dan krijg je dat 10^100 + 1 - 10^100 == 1 niet geldt. 't is maar net waar je meer waarde aan hecht ;).
Dan helpt
C++:
1
2
3
4
bool equals(double left, double right, double margin = 0.001f)
{
return (left + margin > right && left - margin < right);
}

ook niet meer; 10^100 + 0.001f == 10^100 + 1 :)

[ Voor 4% gewijzigd door MSalters op 04-06-2004 16:44 ]

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