Note-se que relativamente ao conceito Caneta concretizado no exercício anterior é necessário adicionar cinco novas funcionalidades:

  • getStringFromMemory(PenWithMemory pen, int idx) - Devolve uma determinada cadeia de caracteres escrita anteriormente;
  • resetMemory(PenWithMemory pen) - Remove todas as cadeias de caracteres associadas à caneta;
  • newPenWithMemory(const char*brand, const char *color, int capacity) - É responsável por criar uma nova caneta com memória. Deverá reservar memória suficiente para guardar os dados respeitantes à nova caneta e inicializar os campos da nova caneta (recebidos através dos argumentos desta função);
  • deletePenWithMemory(PenWithMemory pen) - Liberta os recursos de memória associados à caneta a destruir;
  • getCapacityPenWithMemory(PenWithMemory pen) - Devolve a capacidade da caneta com memória;
Além destas novas funcionalidades, é ainda necessário definir um conjunto de funções para suportar funcionalidades semelhantes às definidas para o conceito simples de CanetawritePenWithMemoryequalsPenWithMemorygetBrandPenWithMemorygetColorPenWithMemoryprintPenWithMemory.

Assim, o ficheiro com a definição da interface deste conceito deverá ter o seguinte conteúdo:
#ifndef __PEN_WITH_MEMORY_H__
#define __PEN_WITH_MEMORY_H__

typedef struct pen_with_memory * PenWithMemory;

PenWithMemory newPenWithMemory(const char *brand, const char *color, int capacity);
void deletePenWithMemory(PenWithMemory pen);

const char *getStringFromMemory(PenWithMemory pen, int idx);

void resetMemory(PenWithMemory pen);

void writePenWithMemory(PenWithMemory pen, const char *msg);

int         equalsPenWithMemory(PenWithMemory pen1, PenWithMemory pen2);
const char *getBrandPenWithMemory(PenWithMemory pen);
const char *getColorPenWithMemory(PenWithMemory pen);
int         getCapacityPenWithMemory(PenWithMemory pen);
void        printPenWithMemory(PenWithMemory pen);

#endif