BG Development


Страници: (2) 1 [2]   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> C generics
Реконструктор
Публикувано на: 19-05-2017, 10:48
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 184
Регистриран на: 18.12.06



QUOTE (saruman @ 18-05-2017, 20:37)
QUOTE (dvader @ 17-05-2017, 13:13)
wxWidgets ги правят с макроси - хем шаблон, хем на С, хем typesafe...

Не знам защо се мъчите с това С, освен ако не е някакво legacy...

Това е верният отговор - макроси,с тия войд поинтъри не се знае кога ще гризнеш дръвцето,но ще се случи,повярвай ми icon_smile.gif

Какъв му е проблема на void*? Аз даже бих използвал int за още по- мега ултра генерик. icon_lol.gif
PMEmail Poster
Top
dvader
Публикувано на: 19-05-2017, 11:43
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 3637
Регистриран на: 12.07.05



QUOTE (Реконструктор @ 19-05-2017, 10:48)
Какъв му е проблема на void*?

Шегуваш се, нали?


--------------------
I find your lack of faith disturbing
PM
Top
Дон Реба
Публикувано на: 19-05-2017, 11:48
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5453
Регистриран на: 11.11.06



който иска сейф, да пише на джава, на С void* си е съвсем нормално
PM
Top
korsarq
Публикувано на: 19-05-2017, 12:32
Quote Post



Име: мартин
Група: Потребител
Ранг: Посетител

Мнения: 138
Регистриран на: 30.11.16



Снощи имах малко време та реших да си напиша един generic linked list.
list.h
CODE

#ifndef __LIST_H
#define __LIST_H

typedef void(*freeMemory)(void*);
typedef void(*printList)(void*);

typedef struct _node {

      void* object;
      struct _node* pNext;

}node;

typedef struct _list {

      unsigned int sizeOfElem;
      unsigned int numOfElem;
      node* head;
      freeMemory freeFn;
      printList pr;

}list;

void listNew(list* list, unsigned int elementSize, freeMemory freeFn, printList print);
node * listPushFront(list *list, void* data);
void listDestroy(list *list);
void listPrint(list *l);

#endif

list.c
CODE

#include <stdlib.h>
#include "stdafx.h"
#include "list.h"
#include <malloc.h>

void listNew(list* list, unsigned int elementSize, freeMemory freeFn, printList print) {

      list->numOfElem = 0;
      list->freeFn = freeFn;
      list->pr = print;
      list->head = NULL;
      list->sizeOfElem = elementSize;
}

node * listPushFront(list *list, void* data) {

      node *listNode = (node*)malloc(sizeof(node));

      if (listNode == NULL) {

            return NULL;
      }

      listNode->object = malloc(sizeof(list->sizeOfElem));

      if (listNode->object == NULL) {

            return NULL;
      }

      memcpy(listNode->object, data, list->sizeOfElem);

      listNode->pNext = list->head;
      list->head = listNode;

      list->numOfElem++;

      return listNode;
}

void listDestroy(list *list)
{
      node *current;

      while (list->head != NULL) {
            current = list->head;
            list->head = current->pNext;

            if (list->freeFn) {
                  list->freeFn(current->object);
            }

            free(current->object);
            free(current);
      }
}

void listPrint(list *l) {

      node* temp = l->head;
      int i = 0;

      if (temp == NULL) {

            printf("\nEmpty list.");
            return;
      }

      while (temp) {

            printf("\nPrint element %d", i);

            l->pr(temp->object);
            temp = temp->pNext;

            i++;
      }
}

main.c
CODE

#include "stdafx.h"
#include <stdlib.h>
#include "list.h"

typedef struct _TLV {

      unsigned int tag;
      unsigned int length;
      unsigned char* value;

}TLV;


void listFree(void* data) {

      TLV** ptr = (TLV**)data;

      free((*ptr)->value);
}

void Print(void* data) {

      TLV** ptr = (TLV**)data;

      printf("\nTag = %d", (*ptr)->tag);
      printf("\nLength = %d", (*ptr)->length);
      printf("\nValue = ");

      for (int i = 0; i < (*ptr)->length; i++) {

            printf("%d", (*ptr)->value[i]);
      }
}

TLV* allocateTLV(unsigned int tag, unsigned int length, unsigned char* value) {

      TLV* elem = (TLV*)malloc(sizeof(TLV));

      if (elem == NULL) {

            return NULL;
      }

      elem->tag = tag;
      elem->length = length;
      elem->value = (unsigned char*)malloc(length);

      if (value == NULL) {

            return NULL;
      }

      memcpy(elem->value, value, length);

      return elem;
}

int main()
{
      list l;
      TLV* tag;

      unsigned char test2[2] = { 1,2 };
      unsigned char test3[3] = { 1,2,3 };
      unsigned char test4[4] = { 1,2,3,4};

      listNew(&l, sizeof(TLV*), listFree, Print);

      tag = allocateTLV(2, sizeof(test2), test2);
      if (tag != NULL) {

            listPushFront(&l, &tag);
      }

      tag = allocateTLV(3, sizeof(test3), test3);
      if (tag != NULL) {

            listPushFront(&l, &tag);
      }

      tag = allocateTLV(4, sizeof(test4), test4);
      if (tag != NULL) {

            listPushFront(&l, &tag);
      }

      listPrint(&l);

      listDestroy(&l);

   return 0;
}



Това мнение е било редактирано от korsarq на 19-05-2017, 12:34


--------------------
No pain, no gain.
PMEmail Poster
Top
ici
Публикувано на: 19-05-2017, 13:00
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 14778
Регистриран на: 06.06.04



CODE
// node_ namespace
typedef struct node_obj* node_this;

typedef void(*node_free)(node_this);
typedef void(*node_print)(node_this);

typedef struct node_obj {
     void* object;
     node_this pNext;
} node_obj;


--------------------
Everything you can imagine is real. Pablo Picasso
PMEmail PosterUsers Website
Top
Demigod
Публикувано на: 19-05-2017, 20:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 4112
Регистриран на: 26.04.09





--------------------
being insane is so .... liberating ....
PMEmail Poster
Top
PxL
Публикувано на: 19-05-2017, 21:23
Quote Post


Group Icon
Име: Димитър Т. Димитров
Група: VIP
Ранг: Почетен член

Мнения: 2078
Регистриран на: 26.04.05



Аз не виждам проблем да се учиш да пишеш под абстакцията вместо да се научиш да използваш абстракция. Важното е, че има момент, в който като знаеш какво върви под абстрактният слой, спираш да го пишеш сам и ползваш вече написан подобен минал през N прегледа и критики.

По-скоро проблем е когато ползаш абстрактен слой, без да знаеш как да се имплементира.


--------------------
void putchar(char c);int main(){int x,c=1,i;for(i=0;(x="PxLY2H4:2E;7231?=68255A5S5P9N:N9O84111H861I85111G9N:O811O812M<G33911EAEDBECE22169D1=2k"[i+++3]);)while(x-->'0')putchar((!(++c%'('))?0x0a:33^(i&1));}
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (2) 1 [2]  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0