LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

На C можно писать как на Java/C++

То есть использовать библиотеки с нормальными контейнерами.

Массив:

// gcc list.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    GeeArrayList* list = gee_array_list_new (G_TYPE_INT, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 1));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 2));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 3));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 4));
    gee_abstract_list_remove_at ((GeeAbstractList*) list, 3);
    gee_abstract_list_set ((GeeAbstractList*)list, 2, (gpointer) ((gintptr) 10));


    gint list_size = gee_abstract_collection_get_size ((GeeAbstractCollection*) list);
    for (gint i = 0; i < list_size; ++i)
    {
        gpointer data = gee_abstract_list_get ((GeeAbstractList*) list, i);
        gint real_data = (gint)data;
        fprintf (stdout, "%d\n", real_data);
    }
    g_object_unref (list);
}

Map

// gcc map.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    GeeHashMap* map = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free, G_TYPE_INT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_map_set ((GeeAbstractMap*) map, "one", (gpointer) ((gintptr) 1));
    gee_abstract_map_set ((GeeAbstractMap*) map, "two", (gpointer) ((gintptr) 2));
    gee_abstract_map_set ((GeeAbstractMap*) map, "three", (gpointer) ((gintptr) 3));
    gee_abstract_map_set ((GeeAbstractMap*) map, "four", (gpointer) ((gintptr) 4));
    gee_abstract_map_set ((GeeAbstractMap*) map, "five", (gpointer) ((gintptr) 5));

    gpointer data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint a = (gint) ((gintptr) data);

    data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint b = (gint) ((gintptr) data);

    assert (a == b);

    fprintf (stdout, "Iterating over entries\n");
    {
        GeeSet* entries = gee_abstract_map_get_entries ((GeeAbstractMap*) map);
        GeeIterator* entry_it = gee_iterable_iterator ((GeeIterable*) entries);;
        while (gee_iterator_next (entry_it))
        {
            GeeMapEntry* entry = (GeeMapEntry*)gee_iterator_get (entry_it);
            gconstpointer key = gee_map_entry_get_key (entry);
            gconstpointer value = gee_map_entry_get_value (entry);
            fprintf (stdout, "%s => %d\n", (const gchar*) key, (gint) ((gintptr) value));
	    g_object_unref (entry);
        }
        g_object_unref (entry_it);
        g_object_unref (entries);
    }

    g_object_unref (map);
}

Отличия от Java минимальны...

Исправление fsb4000, :

На C можно писать как на Java/C++

То есть использовать библиотеки с нормальными контейнерами.

Массив:

// gcc list.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    GeeArrayList* list = gee_array_list_new (G_TYPE_INT, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 1));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 2));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 3));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 4));
    gee_abstract_list_remove_at ((GeeAbstractList*) list, 3);
    gee_abstract_list_set ((GeeAbstractList*)list, 2, (gpointer) ((gintptr) 10));


    gint list_size = gee_abstract_collection_get_size ((GeeAbstractCollection*) list);
    for (gint i = 0; i < list_size; ++i)
    {
        gpointer data = gee_abstract_list_get ((GeeAbstractList*) list, i);
        gint real_data = (gint)data;
        fprintf (stdout, "%d\n", real_data);
    }
    g_object_unref (list);
}

Map

// gcc map.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    GeeHashMap* map = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free, G_TYPE_INT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_map_set ((GeeAbstractMap*) map, "one", (gpointer) ((gintptr) 1));
    gee_abstract_map_set ((GeeAbstractMap*) map, "two", (gpointer) ((gintptr) 2));
    gee_abstract_map_set ((GeeAbstractMap*) map, "three", (gpointer) ((gintptr) 3));
    gee_abstract_map_set ((GeeAbstractMap*) map, "four", (gpointer) ((gintptr) 4));
    gee_abstract_map_set ((GeeAbstractMap*) map, "five", (gpointer) ((gintptr) 5));

    gpointer data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint a = (gint) ((gintptr) data);

    data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint b = (gint) ((gintptr) data);

    assert (a == b);

    fprintf (stdout, "Iterating over entries\n");
    {
        GeeSet* entries = gee_abstract_map_get_entries ((GeeAbstractMap*) map);
        GeeIterator* entry_it = gee_iterable_iterator ((GeeIterable*) entries);;
        while (gee_iterator_next (entry_it))
        {
            GeeMapEntry* entry = (GeeMapEntry*)gee_iterator_get (entry_it);
            gconstpointer key = gee_map_entry_get_key (entry);
            gconstpointer value = gee_map_entry_get_value (entry);
            fprintf (stdout, "%s => %d\n", (const gchar*) key, (gint) ((gintptr) value));
			g_object_unref (entry);
        }
        g_object_unref (entry_it);
        g_object_unref (entries);
    }

    g_object_unref (map);
}

Отличия от Java минимальны...

Исходная версия fsb4000, :

На C можно писать как на Java/C++

То есть использовать библиотеки с нормальными контейнерами.

Массив:

// gcc list.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    GeeArrayList* list = gee_array_list_new (G_TYPE_INT, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 1));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 2));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 3));
    gee_abstract_collection_add ((GeeAbstractCollection*)list, (gpointer) ((gintptr) 4));
    gee_abstract_list_remove_at ((GeeAbstractList*) list, 3);
    gee_abstract_list_set ((GeeAbstractList*)list, 2, (gpointer) ((gintptr) 10));


    gint list_size = gee_abstract_collection_get_size ((GeeAbstractCollection*) list);
    for (gint i = 0; i < list_size; ++i)
    {
        gpointer data = gee_abstract_list_get ((GeeAbstractList*) list, i);
        gint real_data = (gint)data;
        fprintf (stdout, "%d\n", real_data);
    }
    g_object_unref (list);
}

Map

// gcc map.c `pkg-config --libs --cflags glib-2.0 gee-0.8`
#include <glib.h>
#include <glib-object.h>
#include <gee.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    GeeHashMap* map = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free, G_TYPE_INT, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
    gee_abstract_map_set ((GeeAbstractMap*) map, "one", (gpointer) ((gintptr) 1));
    gee_abstract_map_set ((GeeAbstractMap*) map, "two", (gpointer) ((gintptr) 2));
    gee_abstract_map_set ((GeeAbstractMap*) map, "three", (gpointer) ((gintptr) 3));
    gee_abstract_map_set ((GeeAbstractMap*) map, "four", (gpointer) ((gintptr) 4));
    gee_abstract_map_set ((GeeAbstractMap*) map, "five", (gpointer) ((gintptr) 5));

    gpointer data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint a = (gint) ((gintptr) data);

    data = gee_abstract_map_get ((GeeAbstractMap*) map, "four");
    gint b = (gint) ((gintptr) data);

    assert (a == b);

    fprintf (stdout, "Iterating over entries\n");
    {
        GeeSet* entries = gee_abstract_map_get_entries ((GeeAbstractMap*) map);
        GeeIterator* entry_it = gee_iterable_iterator ((GeeIterable*) entries);;
        while (gee_iterator_next (entry_it))
        {
            GeeMapEntry* entry = (GeeMapEntry*)gee_iterator_get (entry_it);
            gconstpointer key = gee_map_entry_get_key (entry);
            gconstpointer value = gee_map_entry_get_value (entry);
            fprintf (stdout, "%s => %d\n", (const gchar*) key, (gint) ((gintptr) value));
			g_object_unref (entry);
        }
        g_object_unref (entry_it);
        g_object_unref (entries);
    }

    g_object_unref (map);
}