История изменений
Исправление 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);
}