[C++] Bestand includen en wijzigen.

Pagina: 1
Acties:

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Wat wil ik doen?
Ik wil een bestand includen, dmv een loop de eerste vrije index bepalen van de array in dat bestand, en dan een nieuwe entry met die index toevoegen.

Wat lukt er niet?
Ik krijg het niet voorelkaar dat na het includen de array gebruikt kan worden en ik de eerste vrije index kan vinden. Hij compiled gewo0n niet :(

Je code?
whatever.cpp
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
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
#include <iostream>
#include <fstream>
#include <string>
#include "carddb.h"
using namespace std;

int main( int argc, char *argv[] )
{
    // Find the first empty index
    int i;
    cout << "Searching for an open array space ...\n";
    for( i = 0; i < 10; i++ )
         if( !cards[i][0] ) break;
         
    if( i == 10 )
    {
        cout << "Array full!\n";
        return 1;
    }
        
    // Open file
    ofstream ofs("carddb.h", std::ios::out | std::ios::app );
    
    // Define input vars
    string card[9];
    
    // Ask user to input
    cout << "Type of card? ( eg. Monster )\n";
    cin >> card[0];
    ofs << "cards[" << i << "][0] = \"" << card[0] << "\";\n";
    cout << "\nFilename of card image? ( eg. Monster.bmp )\n";
    cin >> card[1];
    ofs << "cards[" << i << "][1] = \"" << card[1] << "\";\n";
    cout << "\nName of the card? ( eg. Blue Eyes White Dragon )\n";
    cin >> card[2];
    ofs << "cards[" << i << "][2] = \"" << card[2] << "\";\n";
    cout << "\nWhat is the type of the card? ( eg. Dark )\n";
    cin >> card[3];
    ofs << "cards[" << i << "][3] = \"" << card[3] << "\";\n";
    cout << "\nWhat is the card's amount of stars? ( eg. 7 )\n";
    cin >> card[4];
    ofs << "cards[" << i << "][4] = \"" << card[4] << "\";\n";
    cout << "\nWhat is the cards description? ( eg. ultimate wizard in terms of attack and defence )\n";
    cin >> card[5];
    ofs << "cards[" << i << "][5] = \"" << card[5] << "\";\n";
    cout << "\nWhat is the cards effect? ( eg. Flip: destroy one faced up monster on the field )\n";
    cin >> card[6];
    ofs << "cards[" << i << "][6] = \"" << card[6] << "\";\n";
    cout << "\nHow many attack points has the card? ( eg. 1500 )\n";
    cin >> card[7];
    ofs << "cards[" << i << "][7] = \"" << card[7] << "\";\n";
    cout << "\nHow many defense points has the card? ( eg. 1200 )\n";
    cin >> card[8];
    ofs << "cards[" << i << "][8] = \"" << card[8] << "\";\n";
    cout << "\n";
    
    cout << "Wrote to file!" << endl;
    system( "pause" );
    return 0;
}


carddb.h
C++:
1
string cards[10][9];


Wie verlost me? ;)

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Heb je foutmeldingen, welke compiler/IDE gebruik je, welk systeem...

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18:46

Gerco

Professional Newbie

Het kan aan mij liggen, maar volgens mij ben je PHP gewend?

Als je in een gecompileerde taal een bestand include, gebeurt dat alleen op compile time, als je dan @ runtime een regel aan dat bestand toevoegt, gaat je programma dat echt niet merken als je het nogeens start, dan moet je het opnieuw compileren.

Dit gaat je niet bij je probleem helpen (het compileert nog steeds niet), maar je bedenkt je hopelijk nu wel dat je in de verkeerde richting aan het zoeken bent. Je moet het bestand niet includen, maar gewoon inlezen met een stream oid.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Maar hoe kom ik dan achter de laatste index van de cards array?

Ja ik ben PHP gewend :o

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Je array zit al 'vol' aan het begin. Alle plekken worden gevuld met een 'string' object, aangemaakt met de default constructor. Probeer dit maar eens:

C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

class Foo {
public:
    Foo() {std::cout << "Foo!" << std::endl;}
};

int main(int argc, char* argv[]) {
    Foo array[5][5];
    return 0;
}


Die strings zijn afhangende van de implementatie wel lege strings. Maar dit is idd niet de manier om iets op te slaan; code is statisch in C++.

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Hmmz, hebben jullie dan suggesties?
Het eerste plan was een XML bestand, maar het probleem daarmee was dat je niet makkelijk en snel bij de juiste kaart kon komen.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Als zoek snelheid van belang is, dan hang je toch al snel aan een volledige (sql) database.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je snapt echt niets van dat includen. In de header zet je dingen als datattypen, functieheaders en externe variabelen (dus dat een andere object (= gecompileerd .cpp) deze heeft).


Je moet "string cards[10][9];" in je cpp bestand hebben staan. Dit is gewoon de declaratie van een array. De data komt in een apart bestand te staan en heeft niets met het compilen te maken. Je moet gewoon bij het begin van je programma dat bestand met data uitlezen en in het array stoppen. Je kan er dan mee werken. Bij wegschrijven schrijf je de data in juiste volgorde weg naar het bestand. Je kan bij elk element wat zetten (zoals "x[1] = ..."), maar dat hoeft in dit simpele geval niet en maakt het inlezen moeilijker. XML is helemaal overkill.
En verder zoals Zoijar al zei: ( !cards[i][0] ) gaat waarschijnlijk niet werken en geeft waarschijnlijk een foutmelding.

In dit geval kan het nog simpeler. Je leest niets in en schrijft gewoon bij aan het eind van je bestand. Je hebt dan dat hele array niet nodig.

[ Voor 5% gewijzigd door Daos op 16-04-2005 19:29 . Reden: object kan in OO-taal ook andere betekenis hebben ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Ik wil dus in een .h bestand dat voor een andere applicatie gebruikt gaat worden een array wegschrijven.
Alleen moet ik wel weten waar ik ben, wat 2x arrayname[0] gaat niet, snappie?

Het gaat om het automatiseren van het toevoegen zodat een 'leek' de kaarten kan toevoegen :)

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 07-05 20:00
SH4D3H schreef op zaterdag 16 april 2005 @ 23:11:
Ik wil dus in een .h bestand dat voor een andere applicatie gebruikt gaat worden een array wegschrijven.
Alleen moet ik wel weten waar ik ben, wat 2x arrayname[0] gaat niet, snappie?

Het gaat om het automatiseren van het toevoegen zodat een 'leek' de kaarten kan toevoegen :)
Waarom wil je dan zo nodig het .h bestand wijzigen, wil je elke keer weer dan andere programa compilen? Want dat moet dan, anders kan het andere programma (waarvan die .h is neem ik aan) jouw wijzigingen niet doorvoeren.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je weet dat je een tweedimensionaal array ook kan declareren als volgt?
C:
1
string** cards;

Op die manier kun je later de getallen die je nodig hebt uitlezen uit een normale file, en het array realloceren naar de juiste grootte.

Let wel, zo werkt het dan in C. Het kan in C++ ook wel, maar wie weet zijn er betere manieren. Dat laat ik echter aan een C++ whizz over. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

-NMe- schreef op zaterdag 16 april 2005 @ 23:19:
Je weet dat je een tweedimensionaal array ook kan declareren als volgt?
C:
1
string** cards;

Op die manier kun je later de getallen die je nodig hebt uitlezen uit een normale file, en het array realloceren naar de juiste grootte.

Let wel, zo werkt het dan in C. Het kan in C++ ook wel, maar wie weet zijn er betere manieren. Dat laat ik echter aan een C++ whizz over. ;)
Dat is geen twee dimensionale array; dat is een pointer naar een pointer naar een string. Als je daar iets twee dimensionaals van wilt maken, dan moet je handmatig gaan alloceren voor elk element...nightmare :P
Pagina: 1