[c++] pointer probleem

Pagina: 1
Acties:

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
Heb weer eens een pointer probleem. Als je naar onderstaande code kijkt dan wordt in de laatste cout statement wel het goede volgnummer weergegeven maar niet het goede OrderNr. Die laatste is altijd de laatste die ingelezen is....
Iemand enig idee?

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
    mDistancePtr = new Distance();
    mDiGraphPtr = new DiGraph();

    f = fopen(filename, "r");   
    while(!feof(f))
    {   
        DEntityPtr mDEntityPtr = new DEntity(Count);
        mDiGraphPtr->AddNode(mDEntityPtr);      
        Count++;
        fscanf(f,"%s %s %s %s ",Temp1,Temp2,Temp3, Temp4);
        mDEntityPtr->mOrderNr = Temp1;
        mDEntityPtr->mDemand1 = atoi(Temp2);
        mDEntityPtr->mDemand2 = atoi(Temp3);
        mDEntityPtr->mOrigineelNr = atoi(Temp4);
        for(int i = 0; i<mDistancePtr->GetSize() ; i++)
        {
            if(mDEntityPtr->mOrigineelNr == mDistancePtr->Origineel[i])
                mDEntityPtr->mVolgNr = i;
        }       
    }
    cout<<endl;
    fclose(f);  
    ListIterator <NodePtr> iter (mDiGraphPtr->mNodeList);
    for(iter.GotoBegin();!iter.AtEnd();iter.GotoNext())
    {
        cout<<iter.GetElement()->GetDEntityPtr()->mVolgNr<<" "<<iter.GetElement()->GetDEntityPtr()->GetOrderNr()<<endl;
    }
}


Laatst was het opgelost door een van jullie hier door een pointer aan te maken in een while loop. Dat doe ik alleen nu dus weer en nu lijkt dat dus niet te werken.

[ Voor 23% gewijzigd door Lord_T op 20-08-2003 17:05 ]

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Wat is de volledige declaratie van DiGraph::AddNode? Heeft ie als parameter een DEntityPtr, een DEntitiyPtr* of iets anders?

www.madwizard.org


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
ja dat heeft die:
C++:
1
2
3
4
5
6
7
8
9
10
11
void DiGraph::AddNode(DEntityPtr aDEntityPtr)
{
    assert(aDEntityPtr->mGraphPtr == 0);
    //create a node and link the node to the entity
    NodePtr aNodePtr = CreateNodePtr(aDEntityPtr);
    //add the node to the graph
    mNodeList.AddAtFront(aNodePtr);
    //link the entity to the node
    aDEntityPtr->mGraphPtr = this;
    aDEntityPtr->mNodePtr = aNodePtr;
}

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
Wat returned de functie GetOrderNr()? Want als die de pointer returned, schrijf je op deze manier het geheugenadres wat in die pointer zit op het scherm... En bij volgnr doe je het ook op andere manier (niet middels functie, maar gewoon rechtstreeks variabele).

[ Voor 26% gewijzigd door riezebosch op 20-08-2003 18:52 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
GetOrderNr returned mOrderNr en doet dus eigenlijk precies het zelfde... zal wel even proberen hoor ;)

edit: getest en maakt niks uit helaas :(

[ Voor 18% gewijzigd door Lord_T op 20-08-2003 18:57 ]

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


Verwijderd

Ik denk dat je een beetje te weinig detail hebt gepost. Ik persoonlijk kan die code niet volgen.

Bijvoorbeeld: Wanneer wordt het object waar mDistancePtr naar wijst gevuld met waarden?Zoals ik het lees maak je een object aan, maar doe je er voor de rest nix mee. Lijkt me dan dat mDistancePtr->GetSize() als return waarde 0 gaat krijgen waardoor je die for lus nooit in komt. Maar blijkbaar kom je er toch in want de volgnummers worden wel correct gezet.

M.a.w. ik snap er zo geen lor van ;)

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
uhm ok... even een beetje dingen erom heen:
In Distance() lees ik een binaire matrix in die zowel rijtijden en afstanden bevat en die zet ik om in 2 aparte matrices van de grote size x size (GetSize() returned deze waarde).
Dus ik heb een 2tal matrices en een size als data elementen. Met die matrices doe ik nu nog niets maar dat moet er nog in komen.
Dan maak ik een DiGraph aan die eigenlijk een graaf moet gaan modelleren en die op dat moment nog leeg is. (Dit is een wiskundige graaf en daarin komen de DEntityPtr (die weer nodes worden).
De bedoeling is dan dat ik uit een file ga inlezen welke nodes ik wil gaan hebben en dus maak ik die DEntityPtr aan.... Deze nodes hebben dus bepaalde eigenschappen zoals een ordernummer en een origineelnummer.

Vervolgens wil ik een volgnummer bepalen en dat is precies de locatie in de matrix... dus de van naar zeg maar.

Verduidelijkt dit iets?
Ik kan wel de hele code posten maar dan wordt het ook zoveel :D

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


Verwijderd

Verduidelijkt wel iets maar ik kan nog steeds geen oorzaak verzinnen.
Ik zou 1 van de volgende 2 dingen doen (of beide ;)):

- DEntity::GetOrderNr() insteppen, kijken of je daar iets verdachts ziet.
- Heel goed uitzoeken hoe en waar die order nummers nou precies worden geset.

Deze 2 dingen zie ik nergens terug in de code die je hebt gepost, derhalve blijft het gissen.

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Is mOrderNr toevallig een char *?

www.madwizard.org


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
C++:
1
2
3
4
char* DEntity::GetOrderNr()
{
    return mOrderNr;
}


Dus ja het is een char* en nou ja die functie ziet er als bovenstaand uit.

edit: als ik in de while loop dat ordernummer cout met GetOrderNr() dan geeft hij gewoon de goede waardes weer

[ Voor 28% gewijzigd door Lord_T op 20-08-2003 20:30 ]

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Dan is het niet zo gek dat je steeds hetzelfde krijgt :). Temp1..4 zijn char buffers neem ik aan, die buffers worden continu hergebruikt. Met een char * verwijs je naar een char (of char array in jouw geval), hier verwijs je naar Temp1, je kopieert verder niks. Als Temp1 wijzigt ben je je orginele string kwijt, de oude (vorige) mOrderNr verwijst vrolijk nog naar dezelfde buffer die nu dus een nieuwe string bevat.
Maak van mOrderNr een std::string en het is opgelost, of als OrderNr echt een getal is zoals de naam doet vermoeden, maak er een int van zoals bij de andere variabelen.

www.madwizard.org


Verwijderd

Lol ja een char*, dan overschrijf je met scanf steeds het stukkie geheugen dus waar Temp in staat. Derhalve staan bij alle OrderNrs steeds de laatste ingelezen waarde omdat DAT het laatste stukkie geheugen is wat veranderd is.

madwizard was me voor :P

[ Voor 6% gewijzigd door Verwijderd op 20-08-2003 20:39 ]


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
kom ik weer... soms bevat dat OrderNr ook 1 letter erin en dat op verschillende plaatsen... dus er een int van maken werkt niet.
Nou weet ik niet goed hoe die std::string werkt maar ik krijg nu allemaal fouten.
Met denk ik dit als de meest belangrijke:
'std' : is not a class or namespace name

Verder staat dit dus nu in de header. Klopt dat?
Moet de regel "namespace std " erin? Dan geeft hij allemaal andere fouten....

Waar kan ik daar wat info over vinden?

edit: wat headers toegevoegd en die ene regel en dan doen de meeste dingen het wel weer.... alleen nu heeft hij problemen met ifstream en << operators? Wat kan ik daar aan doen?

[ Voor 19% gewijzigd door Lord_T op 20-08-2003 21:06 ]

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Voor std::string heb je include <string> nodig.. Optioneel kan je 'using namespace std;' bovenaan je code zetten, zodat je string kan typen ipv std::string. Alles binnen de std namespace valt onder de Standard Template Library (STL), zoek daar maar eens op, is genoeg info over te vinden. Wat voor errors krijg je met ifstreams? Gebruik je die ook echt of gaan de includes al fout?

www.madwizard.org


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
'ifstream' : ambiguous symbol

binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable c

dat zijn de fouten... en die krijg ik dus nog niet weg :'(

edit: lijkt dus nu voor alles die string clas te gebruiken en niet meer iostream of fstream of ios ofzo

[ Voor 27% gewijzigd door Lord_T op 20-08-2003 21:16 ]

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


Verwijderd

Zoiets als dit zou moeten werken. (Uit m'n hoofd want zit niet op m'n werk dus heb geen msdn etc tot m'n beschikking)

#include <string>
#include <iostream>

ifstream i("jouwfile");
string s;
getline(i, s);

Deze regel gaat ervan uit dat je een string gevolgd wordt door een newline, maar je hebt ook andere vormen van get... Moet je ff in de docs snuffelen.

  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
Heb nu de volgende includes in mijn header staan:

#include <string>
#include <iostream.h>
#include <fstream.h>
#include <io.h>
#include <iomanip.h>

Als ik er 1 van diegene weg laat krijg ik rustig 205 errors omdat hij dan ios of streambuf ofzo niet kent en als ik ze er zo inzet krijg ik die bovenstaande fouten :?

Laat ik de .h weg bij sommige dan vindt c++ ze niet :?

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)


Verwijderd

1) Niet die ouwe .h dingen gebruiken. De redenen daarvoor zijn legio, maar geen zin om op in te gaan ;)
2) Gebruik je using namespace std; ?
3) Ga naar google groups en typ iets in van 'ifstream read file into string' en aanschouw de tachtig duizend voorbeelden die er staan.

[ Voor 32% gewijzigd door Verwijderd op 20-08-2003 21:48 ]


  • Lord_T
  • Registratie: Oktober 2000
  • Laatst online: 31-07 09:50
cool.... probleem zat inderdaad in die .h files uiteindelijk.... als je degene uitzette die hij niet kon vinden en de andere zonder .h gebruikte dan werkt het!!!

Super bedankt!

ja ja... niet iedereen heeft dezelfde kennis... wees daarom ook eens gewillig en geef een antwoord op een vraag ;)

Pagina: 1