LINUX.ORG.RU

Подскажите как писать код на C

 , ,


2

4

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

  • Как мне использовать key-value структуру данных? В других языках используется библиотека (Java) или встроенная реализация (Go). А что используют в проектах, написанных на C?
  • Как в проектах на C узнают длину массива, переданного как аргумент? Я знаю, что массивы передаются как указатели, а указать длину данных за указателем - невозможно. Нужно всегда передавать длину как аргумент? Я также понимаю, что можно создавать свои структуры, состоящие из указателя и длины, но как это грамотно сделать, чтобы потом не запутаться в типах и бойлерплейте? Возможно, есть нормальная практика, которой все следуют?
  • Единственный способ иметь в структуре несколько массивов - использовать указатели. Значит, память нужно выделять и очищать вручную. Значит, для работы с такими структурами нужно иметь функции-обёртки. Так все делают для создания нескольких массивов в структуре?


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

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

Но они напишут код более производительный чем твой.

Deleted
()
Ответ на: комментарий от slovazap

и именно поэтому там нет ни key-value, одну сущность нельзя передать одним аргументом, и для работы с мало-мальски сложной структурой нужно написать тонну обёрток, где нужно не забыть всё в правильном порядке выделить, инициализировать и потом освободить.

Без всего этого в С нет смысла, на С пишут реализации, а не используют готовый функционал. Но так или иначе всегда есть библиотеки которые решат почти любую твою хотелку.

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

scheme из мира лиспов, lua отчасти, Cyclone пожалуй, go (c оговоркой использование _ это ужас, но если избегать этой херни то норм, а ещё авто вставка ; это просто надмозг ), js (дадада не ржать обычный js без всех этих вебпаков сверху, ну всякие ‘==’ и ‘===’ и приколы с ними доставляют, но если писать на Pure Js в процедурном стиле то всё хорошо) Про большее не скажу я либо просто тыкал палочкой либо рядом свечку держал и не могу сказать ничего. Но из всего этого сборища только С для меня годный, в нём заранее нет ничего, а то что нужно я либо добавлю сам, либо возьму библиотеку. И да, я не программист если что.

А твои примеры добротных по твоему языков какие?

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

Спроси у него сам в чём проблема? А смысл ему от этого какой? От gcc’цизма легко уйти. Убрать всякие unlikely макросы, вложенные функции и прочее. Нет ничего плохого подсказывать компилятору используя атрибуты, а в большинстве случаев при переносе кода достаточно обнулить все расширения через 1 заголовочный файл с #defin’ами. Но это всё не точно, код разный бывает.

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

По первому вопросу может подойти nvlist из фрибсд

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

Без всего этого в С нет смысла

Ну то есть вы согласны с тем что смысл C - в страдании без того что в других языках есть из коробки.

на С пишут реализации, а не используют готовый функционал

Смешно. С одной стороны, вы сами сейчас подтвердили что C недоязык, потому что использовать готовый функционал - это и есть программирование. С другой, вы уже сами себя опровергли упомянув кучу легаси на C которая уж точно использует готовый функционал и библиотеки в следующем предложении.

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

И да, я не программист если что.

Прекрасно вижу. Но мнение о языках программирования у вас есть и вы считаете допустимым им поделиться.

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

Ну то есть вы согласны с тем что смысл C - в страдании без того что в других языках есть из коробки.

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

Смешно.

Просто ты не осислил, так и скажи, тебе надо всё готовое, а лист написать для контролёра слабо.

Прекрасно вижу. Но мнение о языках программирования у вас есть и вы считаете допустимым им поделиться.

Да,а ты мне что запрещаешь высказывать мнение?. Но ты профессионал же получается, я ожидал конкретики и разумных доводов, а всё что я услышал это - «Искаропки нет сахара ненужно», нет сравнений с иными языками и полное отрицание того что на языках более высокого уровня почему-то практически никто не пишет код критичный к скорости выполнения и/или переносимости.

Я уважаю настоящих программистов которые при случае ткнут меня носом в аргумент. Но чёт то ли тебе лень и хочется просто похаить на пустом месте С и говоря про то что там нет сахара, ну и новость, а яж не знал, как жить то. Скажи что тебе он просто не нравится и всё. Вот и весь разговор. И ты так и не сказал какой по твоему хоть 1 язык нормальный и лучше во всём и может заменить на 100% Си. Короче скучна. И вангую что ты думаешь что я ставлю С во главе всего. Это не так. Для меня, он удобен, красив, покрывает обсалютно все решаемые мной задачи (кроме уж совсем узких вроде шейреров хотя и там надмножество С по сути)

Deleted
()
Ответ на: комментарий от slovazap

легаси на этом языке

оно прекрасно продаётся и это главный аргумент, а твоё тявкание вообще не интересно - извини :)

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

да уже полно таких контейнеров. в сети библиотек завались. я периодически использую uthash. хотя для простых задач несложно написать структуры вручную.

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

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

Это исключения, для них можно оставить С...

Просто ты не осислил, так и скажи, тебе надо всё готовое, а лист написать для контролёра слабо.

Делать ему нечего, листы писать свои, зачем если уже есть оптимизированные и совместимые?

а всё что я услышал это - «Искаропки нет сахара ненужно»

Так ведь не просто сахар, посмотри на Rust.

а всё что я услышал это - «Искаропки нет сахара ненужно»

Видел сколько уязвимостей из за отсутствие сахара находят?

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

Да ладно тебе, ты то как раз просто неосилил остальные %)

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

Да ладно тебе, ты то как раз просто неосилил остальные %)

Не пали! :D

Видел сколько уязвимостей из за отсутствие сахара находят?

А я и не отрицаю

Так ведь не просто сахар, посмотри на Rust.

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

Я как бы всё понимаю, просто слушать про то что у верблюда на спине горб как то не прикольно уже. А у него там единорог волшебный, моя лошадь плохая, а его хорошая ток, чёт ни имени у неё ни вида. Хоть бы сказал что мол я юзаю язык X чтоб я хоть ответить мог нормально, а то, эхх. Повторюсь, скучна такие беседы беседовать. Ну, хоть посраться, тоже дело :D

Deleted
()

Взять c++, писать на нём, чтобы меньше таких вопросов возникало, а когда действительно нужно байтоёбство - пишем в C-стиле.

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

но скорее нужен чем нет

Ну как, он нужен как идея, но не как язык %) Совместимости с С/C++ нету, зачем такое, лучше бы плагин к clang или gcc сделали.

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

Не ну по началу я так прям фапал на него, потом забросил, а в нынешние времена гляжу как на нём софт и пишут и выглядит он, убягаю волосы назад, ну нахер. Может я конечно чего не понимаю, но блин, зачем же так жёстко то, код читать невозможно. Хотя… можно привыкнуть. Ай да ладно. Пойду лучше чай попью

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

Следите за руками:

use std::collections::HashMap;

fn main() {
    let mut map = HashMap::new();
    map.insert("one", 1);
    map.insert("two", 2);
    map.insert("three", 3);
    map.insert("four", 4);
    map.insert("five", 5);
    
    assert_eq!(map.get("four"), map.get("four"));
    
    println!("Iterating over entries");
    for (key, value) in map {
        println!("{} => {}", key, value);
    }
}
RazrFalcon ★★★★★
()
Ответ на: комментарий от Iron_Bug

Исхожу из того, что ТС хотел средствами языка, без сторонних библиотек

XMs ★★★★★
()

Пиши на плюсах.

invy ★★★★★
()

Си это не прикладной язык, это переносимый ассемблер. Если к нему относится именно так, то проблем с восприятием языка нет, все таки на сях писать значительно приятнее чем на ассемблере :)

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

все таки на сях писать значительно приятнее чем на ассемблере :)

Не очень. Скажем, длинную арифметику намного проще реализовывать на ассемблере. Переменное число аргументов — тоже.

А для большей части типового кода легкость написания и чтения примерно одинакова: http://websvn.kolibrios.org/filedetails.php?repname=Kolibri OS&path=/prog...

monk ★★★★★
()
Ответ на: комментарий от monk
  • Не вижу рядом аналогичного кода на С для сравнения
  • Не вижу, сколько из этого кода написал лично ты для таких заявлений
  • Ассемблерный код по ссылке - говно, не использующее современных инструкций И дальше можно продолжать.
anonymous
()
Ответ на: комментарий от fsb4000

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

Во-первых, такой код на Си не читаем, во-вторых, ты вручную делаешь unref, В-третьих,...

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

C не является лучшим решением нигде

Микроконтроллеры, модули ядра Linux, opencl-кернелы(хотя это не совсем Си) и т.п.

anonymous
()
  • у GNU есть hsearch

https://www.opennet.ru/man.shtml?topic=hsearch&category=3&russian=0

есть много других библиотек с поддержкой kv, uthash, например

  • в С нет встроенного типа динамического массива, поэтому его нужно создать самостоятельно или использовать сторонние библиотеки. В простейшем случае:
struct item {
  ...
}

struct items {
   struct item* items;
   size_t items_sz;
}

void items_do(struct items* ){}
  • в С нет автоматического управления памятью, нужно писать его самостоятельно или использовать сторонние библиотеки
zudwa
()
Ответ на: комментарий от Deleted

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

Объективно C пока что незаменим для низкоуровневых вещей, особенно для микроконтроллеров. Да, там уже что-то пытается Rust и Go, но это пока слишком сыро для продакшана + проигрыш в производительности (я не шарю, но так писали экспериментаторы).

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

Поэтому от упоминания любых хардкорных технологий у них неизменно бомбит.

Потому что их суют куда не надо, а потом сам автор разобраться не может что да как.

Объективно C пока что незаменим для низкоуровневых вещей, особенно для микроконтроллеров

Согласен.

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

Да. Синтаксис раст придумали инопланетяне.

Как раз в преведенном примере кода раст выглядит как все современные языки, такие как swift, kotlin, scala, typescript. Конкретно что я увидел: 1) вывод типов с возможностью опускать тип в объявлениях переменых 2) destructuring assignment 3) иммутабельность по дефолту.

Aber ★★★★★
()
Ответ на: комментарий от anonymous
#include <unordered_map>
#include <iostream>
using namespace std;

int main()
{
  unordered_map<string, int> map {
    {"one", 1},
    {"two", 2},
    {"three", 3},
    {"four", 4},
    {"five", 5}
  };
  cout << "Iterating over entries" << endl;
  for (auto [key, value] : map)
    cout << key << " => " << value << endl;
}
anonymous
()

Зачем тебе Си? Пиши на креслах хотя бы.

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

Если ты заходил на форум с телефона, то да на телефоне, из-за того что строчки не входят плохо читается, а с десктопа вроде норм.

Вручную unref это да, ручное управление памятью это печаль..

А так, вот иерархия ArrayList в Java:

https://www.developer.com/imagesvr_ce/1955/Array.jpg

И в LibGee:

https://valadoc.org/gee-0.8/img/Gee.ArrayList.svg

По-моему достаточно похоже...

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

Rust пытается заменить скорее C++.

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

С пытается заменить Zig

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

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

Это там, где можно строки умножать на числа

А в C нельзя?

Нет?

foo.c: In function ‘main’:
foo.c:6:11: error: invalid operands to binary * (have ‘char *’ and ‘int’)
     "foo" * 3;
     ~~~~~ ^

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

Поздравляю, ваши знания C — «в районе нуля» ©.

foo.c: In function ‘main’:
foo.c:6:11: error: invalid operands to binary + (have ‘char *’ and ‘char *’)
     "foo" + "bar";
     ~~~~~ ^
anonymous
()
Ответ на: комментарий от Deleted

В С есть строки

Нет их там. Есть строковые литералы и неявные преобразования массивов в указатели.

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

И я и RazrFalcon знаем об этом! Просто он меняет мнение о существовании строк когда ему нужно.

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