Toon posts:

[C++] Fout in pointer adres *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben net begonnen met C++ te leren, en bij wijze van oefening voor mezelf wilde ik een string tokenizer bouwen net als in java. Het gaat niet echt om de functionaliteit van de code, maar gewoon dat ik weet wat ik aan 't doen ben. Maar nu is het zo dat op een of andere vage manier aan een dubbele pointer naar een char (char**) aan de char* pointer adres 0x00000001h word toegewezen. Dit vind windows niet zo vriendelijk en laat dan ook behoorlijk hard m'n progje crashen.

Voor de duidelijkheid, de code is vrij brak, en kijk vooral niet naar de functionaliteit van het geheel.
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
#include <iostream.h>
#define LENGTH 64
bool tokenize(char string[], int& length, char delim, bool returnDelim, char ** token);

int main()
{
  int exit = 1, length = LENGTH;
  char input [LENGTH];
  char ** token;
 
  while (exit != 0)
  {
  cout << "Typ iets in om te tokenizen\n";
  cin.getline(input, LENGTH);
  tokenize(input, length, ' ', false, token);
  
  cout << token[0];
  //hier geeft ie dus adres 0x00000001h
    
  }
 return 0;
}

bool tokenize(char string[], int& length, char delim, bool returnDelim, char ** token)
{
  cout << string;
  int noDelim = 0;

  for(int i = 0; i < length; i++)
  {
    if (string[i] == delim)
      noDelim++;
  }

  token = new char * [noDelim + 1];
  token[0] = &string;
  length = noDelim + 1;
  noDelim = 1;
  for(int i = 0; i < length; i++)
  {
    if (string[i] == delim)
    {
      string[i] = '\0';
      token[noDelim] = &string[i + 1];
      noDelim++;
    }
  }

 return true;
}

[ Voor 27% gewijzigd door curry684 op 03-08-2003 02:01 . Reden: layout en zo fix0red :P ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:56
Hoe had je bedacht dat er ooit een waarde (anders dan de default 0 waar je OS 'm blijkbaar op initialiseert) in je "token" variabele zou komen? Door 'm als by-value argument mee te geven gebeurt er zeker niets mee; je zult dan echt een pointer of reference naar de variabele moeten meegeven.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Zoals Soultaker zegt moet je inderdaad een pointer naar de token variabele meegeven.

Er zijn nog meer problemen:

- Bij de aanroep van tokenize wordt de verkeerde waarde voor length gegeven, dit moet strlen(input) zijn. Dit zou de tokenize() functie natuurlijk ook zelf kunnen berekenen.

- In de regel
token[0] = &string;
neem je het adres van de variabele waar de pointer naar het eerste karakter van string instaat. Hier wil je gewoon "string".

- In de tweede for loop, om delimiters in nul-bytes de veranderen, wordt eerst length de waarde "noDelim + 1" gegeven, terwijl de for-loop die waarde als het aantal karakters in de string gebruikt.

- De parameters en returnwaardes zijn nogal onlogisch:
* returnwaarde is onzinnig;
* de length parameter is in de lengte van de string; en waarschijnlijk heb je die ook bedoeld als out-parameter voor het aantal tokens? Die waarde moet je wel teruggeven namelijk. Dat is dan wel wat onduidelijk.
* returnDelim is een loze parameter
* token moet dus als pointer of by reference