Toon posts:

[C++] Array van strings probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een array van strings van 9 letters, alleen weet ik nog niet hoeveel elementen deze array moet gaan bevatten, dus gebruik ik dit:

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

int main(int argc, char *argv[])
{

    char ** woord;
    for (int x=0;x<13000;x++) {
        cout << x << "\n";
        woord[x] = new char(10);
    }
}

Tijdens runtime krijg ik steeds onderstaande error, steeds bij elementje 1262 (?). Dit is bij alle elementjes boven 1261 waar ik geheugen voor wil reserveren. Dit is niet zo handig aangezien ik zo rond de 13000 elementjes nodig heb (dat staat niet niet vast, maar is afhankelijk van een bestand). Is dit raar, of is hiervoor een logische verklaring?

Als compiler gebruik ik DJGPP 2.03.
----
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Exiting due to signal SIGSEGV
General Protection Fault at eip=000013b3
eax=00000074 ebx=00000000 ecx=0003c0c8 edx=0000001e esi=000013b8 edi=00000019
ebp=006bff78 esp=006bff60 program=C:\TOM1\TOM.EXE
cs: sel=01a7  base=01670000  limit=006cffff
ds: sel=01af  base=01670000  limit=006cffff
es: sel=01af  base=01670000  limit=006cffff
fs: sel=017f  base=00005520  limit=0000ffff
gs: sel=01bf  base=00000000  limit=0010ffff
ss: sel=01af  base=01670000  limit=006cffff
App stack: [006c0000..00640000]  Exceptn stack: [0003f4bc..0003d57c]

Call frame traceback EIPs:

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
De variabele "woord" is nog niet geinitialiseerd. Die array van 13000 elementen moet je dus eerst ook met new maken:

C++:
1
woord = new char*[13000];

[ Voor 6% gewijzigd door matthijsln op 07-11-2003 18:00 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Toeval, maar je moet als beginner niet met pointers werken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> 
#include <string>
#include <vector>

int main(int argc, char *argv[]) 
{ 

    std::vector<std::string> woord(13000);
    for (int x=0;x!=13000;++x) { 
        cout << x << "\n"; 
        woord[x] = "Willekeurig"; // woord[x].size==11 
    } 
}

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

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;
int main(int argc, char *argv[])
{

    vector<string> arraytje;
    for (int x=0;x<13000;x++) {
        cout << x << endl;
        //hoef je van te voren ook niet weten hoe groot het is...
        arraytje.push_back("Bananevla");
    }
    for (int i=0; i<arraytje.size(); i++)
    {
        cout << arraytje[i] << endl;
    }
}

[ Voor 15% gewijzigd door Verwijderd op 07-11-2003 18:23 ]


Verwijderd

De meeste code kun je in C++ zonder pointers schrijven. Alleen denken velen alleen nog te veel in C.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

hannibal331: het lijkt me niet de bedoeling om kant en klare oplossingen te geven

FD-man:
C++:
1
woord[x] = new char(10); 

Weet je wat je daar doet? Je alloceert 1 nieuwe char, met de waarde 10. Om een array van chars te alloceren moet je [] haakjes gebruiken, niet ()

Overigens, als elke "string" altijd uit 9 chars bestaat, dan zou je je array natuulijk ook zo kunnen definieren en alloceren:
C++:
1
2
3
char (*woorden)[9];

woorden = new char[aantal_elementen][9];

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Dat met die vectoren lijkt wel te werken, maar ik kan dat niet echt gebruiken, aangezien de woorden weer aan functies als input moeten worden gegeven, en letter voor letter uitgelezen moeten worden.

Het probleem is dat ik een bestand heb vol met woorden van 9 letters, die ik dus in een array met 'arrays van chars' wil hebben.

Zoiets dus (maar dit werkt dus maar tot woord 1262):

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream.h> 
#include <fstream.h> 

int main(int argc, char *argv[]) 
{ 
    char ** woorden;
    ifstream InFile;
    InFile.open("negen.dat", ios::in);
    for (int i=0;(!InFile.eof());i++) 
    {
        cout << i << "\n";
        woorden[i] = new char[10];
        InFile >> woorden[i];
    }
}

[ Voor 7% gewijzigd door Verwijderd op 07-11-2003 20:39 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Lees je de reacties überhaupt wel :?
[rml]matthijsln in "[ C++] Array van strings probleem"[/rml]

En waarom zou het bij een vector van strings niet werken? Ook dan kun je prima letter voor letter inlezen hoor.

Verder is jouw code ook nogal prone voor buffer overflows. Wat als een string in het bestand nu langer dan 10 chars is? Dan treedt ie mooi buiten de buffer. Als je een std::string gebruikt dan heb je dat probleem niet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Nee, het is niet mogelijk dat een bestand langer is dan 9 letters, het is namelijk een vast bestand met woorden van 9 letters, alleen het aantal woorden weet je niet zeker.

Ik ga toch nog maar eventjes prutsen met die strings.. Misschien lukt het wel, maar ik moet zoveel code ombouwen om dat te kunnen gebruiken :S

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
.oisyn schreef op 07 november 2003 @ 19:41:
Overigens, als elke "string" altijd uit 9 chars bestaat, dan zou je je array natuulijk ook zo kunnen definieren en alloceren:
C++:
1
2
3
char (*woorden)[9];

woorden = new char[aantal_elementen][9];
Als het character-array altijd 9 cijfers bevat, kan je dan niet beter 10 elementen reserveren (ivm de \0)? :Y)

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik had het over 9 chars, de \0 is ook een char. Dat ze zero-terminating moesten zijn zei niemand erbij (als ik een bepaalde code moet coderen die altijd 4 chars ofzo is, dan definieer ik dat ook als char[4], niet als char[5])

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Als de character array altijd 9 chars bevat, dan hoef je geen \0 toe te voegen. Je moet dan alleen de strncpy/strncmp/strn... functies gebruiken.

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


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
MSalters schreef op 08 november 2003 @ 00:27:
Als de character array altijd 9 chars bevat, dan hoef je geen \0 toe te voegen. Je moet dan alleen de strncpy/strncmp/strn... functies gebruiken.
Of gewoon memcpy(), het zijn immers geen null-terminated strings.
Pagina: 1