LINUX.ORG.RU

Как создать множество в языке Си (чтобы видно было далеко)?

 , , множество


0

2

Первое что приходит в голову - это использовать GHashTable из GLib. Ну там, автоматические биндинги подо всё (Python, C#, Java) через GObject Introspection, наличие документации.

И вот смотрю я на него внимательно: https://docs.gtk.org/glib/type_func.HashTable.get_keys.html

а там написано: «This function is not directly available to language bindings.»

И так почти во всех функциях этого «класса».

Или, в функции Add написано: https://docs.gtk.org/glib/type_func.HashTable.add.html «When a hash table only ever contains keys that have themselves as the corresponding value it is able to be stored more efficiently. See the discussion in the section description.» но в этой документации нет вкладки «дискуссии» в секции «description»…

Я понимаю, что нормальные люди этим не пользуются. Но как вообще они тогда программируют? Работа с множествами это базовая база. А писать надо обязательно на Си, так как это единственный язык с хорошо проработанными FFI (https://en.wikipedia.org/wiki/Foreign_function_interface), это потребуется, когда нужно будет построенную объектную модель скриптовать из под всего.

★★★★

Последнее исправление: Shushundr (всего исправлений: 2)

так как это единственный язык с хорошо проработанными FFI

Это ложь, конечно. Нормальные люди не используют C, только и всего.

slovazap ★★★★★
()

чтобы видно было далеко

Бери любую готовую хештаблю или пиги сам, или базу данных даже, хрен знает что у тебя за данные и какой у них размер.

это потребуется, когда нужно будет построенную объектную модель скриптовать из под всего.

Пиши API доступа к данным и работе с ними, а потом под всё пиши биндинги или теже FFI. Интросекцию ты сам описал, то что там функции недоступные по цитате из вне, так ты сам должен свои методы для интросекции делать и во вне выпускать, а не внутренние, пиши свои ибёртки к ним и всё.

Можно сделать ход конём статически собрать с lua и использовать её механизмы хранения и доступа (хештабли) к данным внутри Си которые потом ещё раз обернуть в функции которые уже будут для биндинга/FFI для других языков при этом lua будет из коробки даже когда у тебя в системе вообще не будет ничего из интерпретаторов.

Короче тебе сначала нужно взять хешталю, реализовать своё нечто, написать к нему API и только потом задаваться вопросом по поводу биндинга к всему. Что прям к всему всему надо?

На правах диванной аналитики

LINUX-ORG-RU ★★★★★
()

применяй лучшие практики, иди в ногу со временем. спроси www.phind.com

create an unordered set in c programming language

оно тебе даже код напишет, а ты выдашь его за свой.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Мне надо не как попало, а чтобы хорошо интегрировалось с PyGObject (или как там называется библиотека для питонофикации). А ещё лучше, чтобы уже готовый код был такой в одном из Gnome-приложений.

Shushundr ★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Короче тебе сначала нужно взять хешталю, реализовать своё нечто, написать к нему API и только потом задаваться вопросом по поводу биндинга к всему.

Сначала мне надо пруф-оф-концепт, иначе я не буду реализовывать своё нечто таким образом совсем, а буду реализовывать его другим образом.

Что прям к всему всему надо?

Ну я там написал - Python, Java, C#. Можно ещё JavaScript из Node.js

Lua не надо. Точно.

Интроспекцию ты сам описал, то что там функции недоступные по цитате из вне, так ты сам должен свои методы для интросекции делать и во вне выпускать, пиши свои ибёртки к ним и всё.

Я не понимаю, какие у интроспекции ограничения. Помог бы учебник по ней

Вот ваша ChatGPT пишет:

limitations of GObject Introspection include:

    It does not support some C constructs, such as unions, bitfields, and variadic functions.
    It does not support introspection of private APIs by default.
    Generating GObject Introspection data can be slow and memory-intensive for large libraries.

Ничто из этого не мешало сделать библиотеку для работы с множествами. Если её ещё нет готовой, это очень странно.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)
Ответ на: комментарий от soomrack

Мне требуется наколенная поделка, содержащая минимум кода. Для работы с примерно тысячей элементов (ну точно вся влезет в память).

Shushundr ★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Про PyGObject пишут, что она всё создаёт для своих библиотек в рантайме. А для моей библиотеки она так сработает? (Разумеется моя библиотека будет GObject-based и со сгенерированной метаинформацией)

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)

Множества хорошо создаются на Паскале. Но эмулировать их и на Си можно. Битовые поля и массивы потыкай, точнее массивы битовых полей, где каждый бит - это входит/не входит такой-то элемент в множество.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Множества хорошо создаются на Паскале.

речь идет о множестве с произвольным типом членов. например множестве строк или каких-то обьектов. а не просто коротких чисел, что отображается на bitset.

alysnix ★★★
()
Ответ на: комментарий от Shushundr

Не знаю. Почитай доки сделай 1 функцию в качестве эксперимента и заверни её в гобжект и всё такое. Тебе надо пробовать.

https://pygobject.readthedocs.io/en/latest/ погляди как другие делают. Наверное это.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от Shushundr

ты хочешь сделать что-то, что должно интегрироваться с pyНенужно, а ещё чтобы такой код был в одном из ненужно-приложений?

mittorn ★★★★★
()
Ответ на: комментарий от Shushundr

ещё и gtk, предвкушаю что-то вырвиглазное

mittorn ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

ну и как ты проверишь, находится ли строка «hello vasya» во множестве таких строк? где там ее бит у тебя?

alysnix ★★★
()
Ответ на: комментарий от Shushundr

Мне требуется наколенная поделка, содержащая минимум кода.

положи болт на оптимизации и храни все элементы в массиве фиксированного размера.

olelookoe ★★★
()
Ответ на: комментарий от Reset

Я кстати какое-то время заморачивался и около 300 задач на leetcode решил на чистом Си, множества писал с ноля. Потом лениво стало, стал использовать богомерзкие плюсы :)

Reset ★★★★★
()
Ответ на: комментарий от olelookoe

Разве тебе не ясно, что моя проблема не в том - использовать массив или enum, а в том, как обеспечить внешнюю скриптуемость? Причём не вашим способом (типа CFFI, ctypes и т.п.), а моим через PyGObject ?

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)

Что-то документация и впрямь не очень. В таких случаях я обычно читаю код или расчехляю gdb.

snizovtsev ★★★★★
()
Ответ на: комментарий от snizovtsev

Ну, вы бы могли хотя бы план изучения посоветовать,
https://wiki.gnome.org/Projects/GObjectIntrospection/Architecture

Что-то вроде такого:

1) изучить libffi
2) изучить libgirepository
3) прочитать man на g-ir-scanner
4) прочитать man на g-ir-compiler

Как я должен понять прямоугольник «Specific language bindings» мне не ясно до сих пор...

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)

Если производительность не должна быть высокой, можешь сделать свою программу сервером, а другие языки смогут просто вызывать твои методы через SOAP JSON-RPC.

MOPKOBKA ★★★★★
()

так как это единственный язык с хорошо проработанными FFI

Неправда, можно это сделать и на современном языке, таком как Rust.

PyO3:

use pyo3::prelude::*;

/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

/// A Python module implemented in Rust. The name of this function must match
/// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to
/// import the module.
#[pymodule]
fn string_sum(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

ext-php-rs:

#![cfg_attr(windows, feature(abi_vectorcall))]

use ext_php_rs::prelude::*;

/// Gives you a nice greeting!
/// 
/// @param string $name Your name.
/// 
/// @return string Nice greeting!
#[php_function]
pub fn hello_world(name: String) -> String {
    format!("Hello, {}!", name)
}

// Required to register the extension with PHP.
#[php_module]
pub fn module(module: ModuleBuilder) -> ModuleBuilder {
    module
}

Или С++, для него есть тоже удобные библиотеки, например Boost.Python

char const* greet()
{
   return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}
Биндинги под все не сделаются, но никто так и не делает вроде? Тем более везде свои модели выполнения, свои паттерны.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

если уж душа лежит к pyObject, ну так и делай с ним..сразу втаскивай python внутрь и работай с его сущностями. хешмапы там точно есть :-)

иначе совсем просто : при отсутствии аллергии к С++, задействуется STL, нормальный си-с-классами-и-стл. Если аллергия есть, но не сильно выражена, то возможно ETL (вроде как минимальный аналог контейнеров stl, но без rtti и сверх-модных плюх).

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

втаскивай python внутрь

нет (не буду)

при отсутствии аллергии к С++

тоже нет (в смысле, аллергия, получается, есть)

Я ещё могу понять, человека, толкающего Rust, но ТАКИХ как ты надо гнать.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

плохому девелоперу скриптуемость обеспечивать массивы мешают

не расстраивайся, у танцоров вапще беда

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

«Мы не ищем простых путей, на сложных дают больше опыта!»

Shushundr ★★★★
() автор топика

а там написано: «This function is not directly available to language bindings.»

Это в том смысле, что для него нет XML описания. Потому что всё равно для каждого высокоуровнего языка надо делать индивидуальный интерфейс.

https://pygobject.readthedocs.io/en/latest/guide/api/basic_types.html отображает GHashTable на питоновский dict.

monk ★★★★★
()
Ответ на: комментарий от olelookoe

Только битмаска адресов, только хардкор.

t184256 ★★★★★
()
1 февраля 2024 г.
Ответ на: комментарий от untitl3d

а силиконовой долине счас ужин, макароны дают… (джентельмены удачи)

alysnix ★★★
()

cdecl не катит?

anonymous
()
Ответ на: комментарий от untitl3d

Ну как знаешь. США это же ебеня куда хрен приедешь а потом хрен уедешь. У меня все знакомые родственники друзья в европах

Reset ★★★★★
()
Ответ на: комментарий от Reset

Когда кто-то говорит мне, что не хочет жить в лучшем климате, доступном на Земле, не хочет иметь зп в пол ляма долларов и заниматься самыми интересными проектами, которые ит только может предложить вместе с лучшими инженерами планеты.. ну да, не могу поверить.

Ты бы хоть съездил посмотрел.

untitl3d
()
Ответ на: комментарий от alysnix

А я спросил ради интереса, предложило односвязный список в качестве множества :)

Waterlaz ★★★★★
()
Ответ на: комментарий от untitl3d

Когда кто-то говорит мне, что не хочет жить в лучшем климате, доступном на Земле, не хочет иметь зп в пол ляма долларов и заниматься самыми интересными проектами, которые ит только может предложить вместе с лучшими инженерами планеты.. ну да, не могу поверить.

Никому из моих знакомых в Калифорнии не понравилось

Waterlaz ★★★★★
()
Ответ на: комментарий от untitl3d

Мне нравится климат того места где я нахожусь. О своем дальнейшем перемещении скоро будет анонс в моем linkedin. У меня все схвачено. Пол ляма зп пока нет, но получаю очень достойно :)

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.