Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C-Vektor

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.04.2005, 13:32 Uhr
seanyann



Ich möchte das modul Array implementieren Hier ist meine header-datei


C++:
#ifndef _array_h
#define _array_h

const int WordLen = 15;

typedef char Word[WordLen+1];

typedef struct {
    Word wo;
    int count;
} Entry;

typedef struct header* Array;

Array Create (int sz);
void Dispose (Array a);
void Write (Array a, int index, Entry value);
Entry Read (Array a, int index);
void Read2 (Array a, int index, Entry* value);
int GetSize (Array a);
void Resize (Array a, int sz);

#endif


Hier ist meine klasse Array.c

C++:
#include <cstdlib>
#include <cassert>
#include "array.h"

typedef struct header {
    Entry* buffer;
    int size;
} Header;

Array Create (int sz) {
    Array a = (Array) malloc(sizeof(*a));
    a->buffer = (Entry*) malloc(sz*sizeof(Entry));
    a->size = 0; a->size = sz;
return a;
}

void Dispose (Array a) {
    free(a->buffer);
    free(a);
}

void Write (Array a, int index, Entry value) {
    Header h;
    h.buffer = value;
    h.size = index;
    a->buffer[a->size] = h; a->size++;

    
}

Entry Read (Array a, int index) { }

void Read2 (Array a, int index, Entry* value) {}

int GetSize (Array a) {return a->size;}

void Resize (Array a, int sz) {}


Die methode void Write (Array a, int index, Entry value) hat zwei fehler kann mir bitte einer helfen,bin ja noch ein Anfänger.
Und ausserdem wäre auch nett wenn einer mir die anderen methoden implementieren könnte.

C++:
Entry Read (Array a, int index) { }
void Read2 (Array a, int index, Entry* value) {}
void Resize (Array a, int sz) {}




Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Nächstes mal selbst machen.


Dieser Post wurde am 18.04.2005 um 13:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.04.2005, 14:36 Uhr
ao

(Operator)


Das ist alles etwas durcheinander.

1. Programmierst du in C oder in C++? Das solltest du zuerst klären und dann konsequent einhalten. Was da oben steht, ist Mischmasch, sowas macht gerne an unerwarteten Stellen Ärger.

2. Du gibst dem Element Array->size zwei verschiedene Bedeutungen. In Create () hat es die Bedeutung der *allozierten* Größe, in Write () die Bedeutung der *verwendeten* Größe. Das wird garantiert irgendwann krachen.

Wenn du in Write und Read über Index auf bestimmte Felder zugreifen willst, dann macht die *verwendete* Größe keinen Sinn; du kannst ja den 9. Eintrag füllen, während die Einträge 0 bis 8 noch unbesetzt sind. Besser. Jedem Eintrag eine Flagge zuordnen, und diese auf 1 setzen, wenn der Eintrag gültig ist, und auf 0 sonst. Das Elemetn Array->size wird nur bei Create (und bei Resize) verändert, in allen anderen Funktionen wird nur lesend drauf zugegriffen.

3. Write-Funktion: Der Ausdruck a->buffer[a->size] ist vom Typ Entry, nicht Header, also kannst du auch keinen Header zuweisen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.04.2005, 17:29 Uhr
Pablo
Supertux
(Operator)


Dein Code ist zum Heulen, wie ao schons agte, ein Mischmasch aus C/C++ und komplet falschen Code.

Also, wenn du C programmierst, dann musst du wissen, dass man malloc nicht castet, dass man überprüfen soll, ob malloc NULL zurückliefert (wer das nicht tut, soll verdammt sein!); typedefs benutzt man, wenn sie Sinn machen; cstdlib und cassert sind falsche Header Files.

Wenn das C++ sein soll, dann benutze new/delete für die Allozierung des Speichers und ich würde eine Klasse an deiner Stelle nehmen.

An deiner Stelle würde ich alles neu schreiben, das würde schneller gehen als deinen Code zu reparieren. Und sei konzequent, entweder C oder C++, die Mischungen sind zum Scheitern verurteilt.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.04.2005, 17:29 Uhr
seanyann



1.ich programmiere in C
2.hast du nicht nen konkreten vorschlag wie ich das machen kann
3.hab auch den fehler gemerkt und versuche das zu korrigieren
ich würde mich freuen wenn du mir paar methoden implementieren würdest
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.04.2005, 18:19 Uhr
0xdeadbeef
Gott
(Operator)


Etwas in der Art:

C++:
#ifndef INCLUDED_ARRAY_H
#define INCLUDED_ARRAY_H

/* array.h */

#include <stddef.h>

#define WORDLEN 15

#define ARRAY_OK 0
#define ARRAY_OUT_OF_BOUNDS 1
#define ARRAY_ALLOCATION_FAILURE 2

typedef struct {
  char wo[WORDLEN + 1];
  size_t count;
} entry;

typedef struct {
  entry *_private_data;
  size_t _private_size;
} array;

/* Methoden eindeutig benennen. Das ist in C++ natürlich einfacher, aber naja.
* Außerdem extensive Benutzung von Pointern wg. Performance
*/

array *array_construct(size_t sz);
void array_destruct(array *a);
int array_write(array *a, size_t index, entry const *value);
entry const *array_read(array const *a, size_t index);
int array_read_buf(array *a, size_t index, entry *value);
size_t array_size(array const *a);
int array_resize(array *a, size_t sz);

#endif



C++:
/* array.c */
#include "array.h"

#include <malloc.h>
#include <string.h>

array *array_construct(size_t sz) {
  array *p = (array*) malloc(sizeof(array));
  p->_private_size = sz;
  p->_private_data = (entry*) malloc(sz * sizeof(entry));

  return p;
}

void array_destruct(array *a) {
  free(a->_private_data);
  free(a);
}

int array_write(array *a, size_t index, entry const *value) {
  if(index >= a->_private_size)
    return ARRAY_OUT_OF_BOUNDS;

  /* Das willst du in der Zukunft wahrscheinlich mit ner Methode von entry
   * machen, für den Fall dass irgdenwann ne deep copy nötig ist, aber im
   * für den Moment:
   */

  memcpy(&a->_private_data[index], value, sizeof(entry));

  return ARRAY_OK;
}

entry const *array_read(array const *a, size_t index) {
  if(index >= a->_private_size)
    return NULL;

  return &a->_private_data[index];
}

int array_read_buf(array *a, size_t index, entry *value) {
  if(index >= a->_private_size)
    return ARRAY_OUT_OF_BOUNDS;

  memcpy(value, &a->_private_data[index], sizeof(entry));

  return ARRAY_OK;
}

size_t array_size(array const *a) {
  return a->_private_size;
}

int array_resize(array *a, size_t sz) {
  return realloc(a->_private_data, sz * sizeof(entry)) ? ARRAY_OK : ARRAY_ALLOCATION_FAILURE;
}


Wobei du da natürlich noch ein bisschen Fehlerbehandlung reinsetzen solltest, für den Fall, dass malloc fehlschlägt oder so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 18.04.2005 um 18:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.04.2005, 18:21 Uhr
Pablo
Supertux
(Operator)



Zitat von seanyann:
1.ich programmiere in C
2.hast du nicht nen konkreten vorschlag wie ich das machen kann



1. wieso nimmst du dann C++ Headers?
2. Siehe beefys Antwort
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: