Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio 20152017 RC Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Stephen Prata "C Primer Plus, 6th Edition" (2014) Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002) Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994) "Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
>>898249 Я рисовал треугольники и даже прямоугольники! Но не спрашивай меня ничего, все равно нихуя не помню, кроме того что современный опенгл сложнее старого.
>>898258 О, про /gd/ не знал, пойду и туда продублирую.
Суть в чем, я пытаюсь припердолить матрицу перспективы и... нихуя не работает! А должно, но в итоге черный прямоугольник. И через функцию делал, и вручную константой матрицу забивал - хуй. При том что если подставить единичную, но с единичной все норм (ясен хуй потому что она не на что не влияет).
>>898259 Ну, у меня на прямоугольник (на самом деле это два треугольника лол) натянута текстура (ну то есть две, они там смешиваются).
И я пытаюсь вращать эту хуйню. Собсно вращение (матрица модели) работает, матрица вьюхи работает (камера направлена на эту хуйню), а вот матрица проекции - хуй. По идее надо заебенить перспективу но с ней нихуя не работает, а без нее как камеру не удаляй от объекта - он всегда одинакового размера.
>>898346 Зачем? У меня со вью все нормально (без перспективы). В простейшем случае есть квадрат размером единица на единица, и прямо над ним висит камера на удалении 1.2 и палит в центр. С этим все норм - нету только перспективы.
А в перспективе в матрице из параметров только: - угол fov (я его дрочил от 45 до чуть ли не 360), ваще каким бы он не был - должен был показать хоть что либо, потому как камера палит в центр и не захватить объект вообще не может.
- аспект ратио - влияет только на пропорции, если не совпадает с размером окна то будет искажение, но опять же оно не видит вообще нихуя.
- передняя и задняя плоскость отсечения. 1..10 (камера на удалении 1.2), но я диапазон дрочил и на 0..+inf, все блять без толку.
В цикле часто вызывается несколько функций, которые обрабатывают нажатия клавиш. Как можно оптимизировать по скорости работу такого кода? Компилировать с оптимизацией? Определять функции __fastcall?
>>898370 > цикле часто вызывается несколько функций, которые обрабатывают нажатия клавиш. Как можно оптимизировать по скорости Выкинуть опрос, обрабатывать события.
>>898402 >обрабатывать события Тогда придется таскать с собой ДЛЛку с хуком. Пока буфер сбрасывался в сокет, задержка была допустимой, только иногда пропадал один символ. Когда я стал сбрасывать буфер в файл, стало пропадать больше символов. Наверно, лучше оставить сброс в сокет и сделать свой бинарный протокол для связи с админкой, а конечный автомат на моей стороне будет либо сбрасывать данные пакета в файл, либо обрабатывать их как-то иначе.
Есть довольно сложная задачка Сначала решил написать программу, которая вычисляет минимальный элемент каждого из трех массивов Но даже это у меня получилось как то криво ( но все работает)
Возможно ли оформить покрасивее, что бы меньше текста было в main? Просто желательно для всего использовать подпрограммы, а в main только вызывать эти подпрограммы.
>>898917 >Есть довольно сложная задачка >Сначала решил написать программу, которая вычисляет минимальный элемент каждого из трех массивов > довольно сложная задачка Нееее, парень, ты еще не знаешь что такое "сложная задачка". Я не совсем понял нахуя ты для каждого пишешь одну и ту же функцию, с одинаковым кодом? Напиши одну функцию, которая на вход принимает массив, на выходе возвращает минимальный его элемент и просто передавай в нее свои массивы по очереди.
>>898917 А еще можешь написать отдельную функцию для отображения массивов, чтобы тоже не повторять их вывод, а просто передал массив на вход, а функция все отобразит и если что-то нужно поменять, то в одном месте а не в трех копиях.
>>898922 >Нееее, парень, ты еще не знаешь что такое "сложная задачка". Ну, это ещё только начало задачки просто. Да и сложная относительно меня, в универе нихуя не дают, приходится самому учить по возможности
>Я не совсем понял нахуя ты для каждого пишешь одну и ту же функцию, с одинаковым кодом? Ахахах, я про это и спросил
Я не совсем понимаю как сделать такую функцию >Напиши одну функцию, которая на вход принимает массив, на выходе возвращает минимальный его элемент и просто передавай в нее свои массивы по очереди.
>>898926 Да ты же их сделал, лол, просто они у тебя повторяются, оставь одну. А потом вызывай Xmin = minValue(X, k); Ymin = minValue(Y, k); Zmin = minValue(Z, k); Присмотрись, они у тебя все одинаковые.
> Я не совсем понимаю как сделать такую функцию void printArray(сюда передаешь массив) { for (i = 0; i<k; i++) { printf("X[%d] = ", i); scanf("%d", &Z); } }
>>898949 Подумай, что ты хочешь сделать. Потом внимательно посмотри на код, ни о чём не думая. Потом встань и походи по комнате кругами минут двадцать, думая. Вот только после этого приходи снова задавать вопросы.
>>898949 Ты все напутал. void функции ничего не возвращают, я предлагал тебе вынести код который печатает массив в отдельную функцию printArray. A функцию нахождения минимального числа просто оставь одну вместо трех.
>>899366 Вектор - это абстрактная последовательность значений. Какие значения, как именно они хранятся, какие у них преимущества и недостатки - детали реализации. Линкед-лист - это как раз такая деталь реализации, в связанных списках физическое расположение элемента не имеет значения, вставки и удаления дешевые, а доступ по индексу дорогой.
>>899465 Вектор реализуется, как массив с указанием фактического размера и количества элементов. Можно убавлять, добавлять, переставлять и легко обращаться по индексу. Когда требуется больше элементов, чем фактический размер - переаллоцируется весь массив и копируются данные, получается новая верхняя граница.
В связанном списке добавлять можно сколько угодно, там маллок вызывается для создания каждого ебаного элемента. И удалять тоже можно сколько угодно, но для этого лучше использовать двойной связанный список, где указатель не только на следующий, но и на предыдущий элемент.
typedef struct item item; struct item { float val; item зв. next, зв. prev; };
Тогда удаление элемента - это в предыдущем менять указатель next на следующий за данным, а в следующем менять указатель prev на предыдущий.
А в векторе для удаления или вставки надо копировать (сдвигать) весь хвост.
>>899454 Вставка/удаление только с начала/конца же дешёвые в линкедлисте, поскольку удаление влечёт собой изменение всех нужных указателей на след. элемент. Скорее так?
>>899486 Вставка и удаление любого элемента - константа в линкед лите, если известен предыдущий или следующий. В векторе не константа. Если у тебя в векторе сто тыщ элементов и тебе захочется удалить второй, ты охуеешь.
>>899486 Зато в векторе константа - рандомный доступ к любому элементу по индексу. А в связанном списке не константа. Если у тебя в списке 100 тыс. элементов, и тебе захочется прочитать 99999-ый, ты точно так же охуеешь, потому что будешь пробираться через весь список.
Отсюда мораль: со списками можно работать, если часто известны соседние элементы, и надо постоянно что-то добавлять-убавлять. А с векторами - если нужен доступ по индексу, а добавление-убавление обычно в хвосте вектора.
>>898241 (OP) Аноны, как заполнить матрицу по треугольной спирали начиная с центра? Я уже неделю делаю это задание и все мои циклы ,работая вместе, идут по пизде. Мне всего то нужен код циклов, дальше я сам, эта последняя лаба для зачета
>>900089 Ну вот, только у меня нормальное работает начиная с А[0][0], если ставлю n/2 то все идет в пизду, да и еще нужно треугольную спираль, как в задании
>>900127 > спиздил Да, частично, я просто не могу понять самой логики > не понимаешь Ну понять пришлось, все равно препод не примет лабу, пока не объяснишь ему все строчки Да и к чему расспросы? Не хочешь помочь, просто не отвечай, или тебе в каеф хуесосить нюфага?
Пишу несложный сетевой протокол. Мне нужно, чтобы приходящие пакеты в зависимости от некоторого поля выводились либо в консоль, либо добавлялись в конец файла, который может создаваться с рандомным именем каждый раз, когда происходит соединение. Какой паттерн проектирования для этого использовать? Пытаюсь прикрутить шаблон стейтмашин, но получается неоптимально: когда нужно сбрасывать нагрузку пакета в конец файла, приходится этот файл открывать каждый раз, когда приходит пакет данного типа. Поток пакетов может быть неоднородным, т.е. друг за другом приходят пакеты, содержимое которых надо записывать в разные места.
Сейчас работает запись в консоль или в файл в зависимости от пакетов, но проблем нет только когда пакеты приходят одного типа. Если приходят пакеты разного типа, но файл перезаписывается, например, когда происходит смена состояния. Это не то, что я хочу.
Не могу понять как записать условие Вот что я уже сделал:
#include <stdio.h> #include <math.h> int main(void) { int i, imax = 0, lmin = 0, lmax, a[10];
for(;;) { printf("\nEnter length of array (imax): "); scanf("%d", &imax); if (imax<1||imax>10) printf("Error"); else break; }; for (i = 0; i < imax; i++) { printf("Enter the value of a[%d]: ", i+1); scanf("%d", &a); }; int b[10]; for (i = 0; i < imax; i++) { if (a == i) { b[10]=1; printf("\nb = %d", b[10]); } else { b[10]=0; printf("\nb = %d", b[10]); } } printf("\nb = %d", b[10]); getchar(); getchar(); return 0; }
Хелпаните плез, как записать условие: если значения каких-либо двух или более элементов массива a равны друг другу, на их месте в массиве b выводится 1, в противном случае 0.
>>900575 Исходя из того, что imax может быть большим, например, 10, то осмелюсь посоветовать написать свою хэш-таблицу или двоичное дерево и сделать 1 (один!) проход по массиву A, проверяя каждый элемент на наличие в выбранной тобой структуре данных и, если истина, записывай в массив B небо, иначе добавляй элемент в структуру, а Аллаха в массив B. Преподы будут течь, телки бояться.
>>900681 >(один!) проход Внимательней прочитал условие и понял, что я обосрался. Тебе придется два раза пройтись. первый: инкрементируя значение пары в хэш-таблице c индексом hash(A). Второй проход по массиву: если значение пары в хэш-таблице с индексом hash(A) равно еденице, B = 0, иначе B = 1.
>>900734 Именно в компеляции нет, прям вообще В самом начале в универе сказали вижалку поставить и в ней всегда все запускал 2 дня пытался вытащить ноут но нихуя, такой треш, из за этого еще и >лаба горит Но там не лаба, поважнее, тип зачетная хуйня
>>900318 Бамп вопросу. С паттерном, вроде, разобрался. Как лучше реализовать пакетную передачу данных? Сейчас у меня при отправке любых данных отправляется сначала заголовок, а потом данные. Не будет ли лучше сделать пакет фиксированного размера и отсылать, например, по 128 байт? То есть в начало буфера записывается заголовок, потом данные и все это отправляется.
Заебала меня наука нищетой и бесперспективностью, хочется перекатиться в программирование. Знаю хорошо синтаксис языка, на Си приходилось писать программки для численных расчётов, есть так же небольшой опыт работы с stm32 без операционной системы сперва по незнанию с еблей с регистрами с даташита, потом перешёл на spl . Как бы лучше развивать эти умения до чего-то профитоносного, есть ли перспективы в написании драйверов или системном программировании, или лучше сруливать в сторону крестов/шарпа и ООП? И если первое, что для этого дела нужно обязательно знать, кроме собственно языка перед тем как пытаться в поиск работы?
>>901070 у нас щас хайп на импортозамещении, вот и подумай. я сейчас пилю проджект в этом направлении, как будет альфа, пойду искать господдержку, а если хочешь быдь макакой, учи то, что востребованно на рынке в твоих ебенях.
>>901415 Если ты про каррирование - то пока изучаю его. Если про пример ООПного кода, то вот:
Допустим хотим узнать, хватает ли в корпорации денег на 9000 столов с амазона. При наличии скидки по партнёрке.
ООП style (C#) Main() { var dbShell = new DataBaseShell(); // Он будет подсчитывать бабки на счету dbShell.PathToDB = «xxx.xxx.xxx»; dbShell.User = «OverLord»; dbShell.Password = «»;
var cashBack = new CashBackCard(); // Класс, получающий скидку cashBack.Id = «007»;
var parser = new InternetStoreParser(cashBack); // Он будет парсить интернет-магазин parser.Site = “Amazon”; parser.Proxy = “127.0.0.1”;
var purchaseDetector = new PurchaseDetector(dbShell, parser); // Тут формула подсчёта
// А теперь просто спрашиваем что хотели bool response = purchaseDetector.CanIBuy(“yobaTable”, 9000);
Console.WriteLine(response); }
Функциональный стиль. (Если не быть хаскеле-боярином) Main() { bool response = CanIBuy( «xxx.xxx.xxx», «OverLord», «», «007», “Amazon”, “127.0.0.1”, “yobaTable”, 9000);
Console.WriteLine(response); }
Минусы: Не возможно изменить поведение CanIBuy, не влезая в её код. CanIBuy имеет кучу параметров, не относящихся к ней. Бороду параметров просто не приятно писать.
Или если с функциями, но ближе к ООП то так: Main() { struct DataBaseShell_Data dbShell_data; dbShell_data.pathToDB = «xxx.xxx.xxx»; dbShell_data.user = «OverLord»; dbShell_data.password = «*»;
Здарова пацаны помогите плиз переделать Нужно чтобы вместо удаления имени изменялось значение зарплаты. А если вводимое имя не найдено, задать запрос на новое значение зарплаты
Анон, у меня есть такой хедер для древней ассемблерной либы: http://ideone.com/GFpYqa Я указываю ее линоквщику в main.c при помощи прагмы. Когда я выкинул сишное CRT-говно, вызывающее дедлоки в PE-лоадере, возникла куча ошибок типа такой: unresolved external symbol __BigCreate@4 referenced in function _InitRSA
К имени _BigCreate добавилась еще одно подчеркивание. Почему возникла эта ошибка и как ее исправить?
>>902643 Алсо, в самой biglib.lib символы с двумя подчеркиваниями. Что это значит? Автор называл свои функции как _BigCreate, а не BigCreate, а при сборке либы из-за выбранного соглашения о вызовах добавилась еще одна черта?
Собираю ДЛЛку для двух архитектур. Для x86 ДЛЛ собралась нормально, а для x64 не собирается: линкер не находит символы типа _BigCreate. В настройках проекта biglib.lib подключил. Библиотека, видимо, 32-битная. Что делать?
>>902720 Есть хотя бы способ заинжектить 32-битную ДЛЛку в 64-битный процесс? Ебаная либа, нахуй я ее взял. Анон, посоветуй сишную имплементацию RSA с достаточно длинными числами. Нужно минимальное количество кода и отсутствие зависимостей от других библиотек.
Пацаны снова выхожу на связь. Пытаюсь конпелировать с помощью mingw-w64, который под msys2. Создал файл temp.c, создал CMakeLists.txt: [CODE]project(temp) set(CMAKE_GENERATOR "MinGW Makefiles") set(MINGW True) set(CMAKE_C_FLAGS -g) set(SOURCE temp.c) add_executable(temp ${SOURCE})[/CODE] Создаю директорию build, захожу в неё, выполняю cmake: [CODE]$ env PATH=/mingw32/bin cmake -G "MinGW Makefiles" .. -- The C compiler identification is GNU 6.2.0 -- The CXX compiler identification is GNU 6.2.0 -- Check for working C compiler: C:/msys32/mingw32/bin/gcc.exe -- Check for working C compiler: C:/msys32/mingw32/bin/gcc.exe -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: C:/msys32/mingw32/bin/g++.exe -- Check for working CXX compiler: C:/msys32/mingw32/bin/g++.exe -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: E:/Temporary/code/build[/CODE] Далее: [CODE]$ make Microsoft Windows [Version 6.1.7601] (c) ௮ (Microsoft Corp.), 2009. ࠢ 饭.[/CODE] Какого хуя? Он походу пытается запустить command shell от visual studio. Еще странно, что когда я пишу напаример [CODE]$ which gcc /mingw32/bin/gcc[/CODE] А на which make он говорит [CODE]$ which make /usr/bin/make[/CODE] Пакет установлен, но в /mingw32 он его почему-то не видит. Что я делаю не так?
>>902755 Сам готовься, у меня желтый военник))) Какую библиотеку длинной арифметики можно взять, чтобы реализовать RSA, и чтобы эта библиотека не требовала CRT, динамические либы и какое-нибудь еще говно?
>>902912 Вот задача, я написал через цикл фор и If (( i%2) == 0) И так сравнивал Но преподша подошла сказала что то про красное и зеленое Как сделать лучше? Мимо пишу зачет на бумаге
Во-первых: Иди на хуй. Во-вторых: Младший бит говорит о том, чётное ли число или нет (младший бит это 2 в степени 0, т.е. единица, остальные степени всегда дают чётное число) т.е. if( i & 1) / если элемент нечётный /
Хочу попробовать сделать из 32-битной скомпиленной либы 64-битную. Либа написана на асме, скорее всего масм. Если я ее дизассемблирую, а потом снова ассемблирую 64-битным ассемблером, она будет работать правильно? Эта либа хотя бы соберется обратно?
>>902973 >Младший бит говорит о том, чётное ли число или нет (младший бит это 2 в степени 0, т.е. единица, остальные степени всегда дают чётное число) >т.е. >if( i & 1) / если элемент нечётный / Нахрен такой хуйнёй маяться, если ассемблерный выхлоп будет один и тот же?
>>903026 1) Не сможешь дизассемблировать до надлежащего уровня, не соберется. 2) Работать будет, но заебешься с конвенциями вызова (аргументы функций останутся 32-битными).
Суть такова, нужно написать шифровальщик текста. Он собственно написан, но читает и пишет только первую строку, остальное удаляет.
Функции чтения и записи ДОЛЖНЫ выглядеть так: [CODE]char* readFromFile(char fileName[]) и void writeToFile(char fileName[], char text[]) [/CODE] соответственно. Как скопировать текст целиком в буфер (независимо от кол-ва строк), а потом записать обратно в текстовый файл без потерь?
Сап двач-программач. Хочу написать свой собственный хекс эдитор и тут же столкнулся с проблемой. Я скачал для проверки winhex и у результата моей программы и винхекса есть различия. Во первых 163-й байты различаются. Я не понимаю откуда там взялся 0D. Вовторых через некоторое кол-во байтов у меня пишется просто 19 19 19 19 19 19 19 19 19 19 19 19... В чём проблема?
>>905191 >ne 5 argumentov You know, my English is poor too. But if I don't know how to spell the word in English, I use the Google-Translate. You can try to use it. >fopen(argv[3], "r") Первое, что в глаза бросается. Попробуй "rb".
>>905191 Я не закапывался, но у тебя определённо есть косяки с i2. Номера байт - 0..63, а не 0..64. И ифы неправильно расставлены, для любого байта с номером не кратным 64 у тебя печатается лишний пробел.
>>905233 Да ладно тебе, все с чего-то начинали. >>905191 >fprintf(out, "0%x", sch); >fprintf(out, "%x", sch); А напомнит мне кто-нибудь синтаксис, чтобы одной строкой записать? Вроде как fprintf(out, "%.02x", sch)? Или просто два нуля или двойка без нулей?
>>905383 Это как раз тебе нужно определится. Что по синтаксису (внешнему виду), что по семантике — это все потянет за собой еще кучу всего (за паттернматчингом придется тянуть адт, убрав текстовую подстановку хидеров и запилив строгую типизацию захочется нормальные (типобезопасные, не лишповые) макросы и тд) — чем это будет отличатся от того же раста?
>>905403 >за паттернматчингом придется тянуть адт Не придётся. Да и уж на сишке-то они делаются за две минуты. >захочется нормальные (типобезопасные, не лишповые) макросы Во-первых, не факт. Во-вторых, даже если и захочется - это будет потом.
>>905420 >Не придётся. Да и уж на сишке-то они делаются за две минуты. И ты про строгую типизацию только недавно рот открывал, лол. Алсо, без адт и кортежей пм в сишке довольно бесполезная хуита — что ты там матчить собрался-то? Полтора примитива и структуры? Причём последнее по-человечески на си не сделать. >Во-первых, не факт. Во-вторых, даже если и захочется - это будет потом. Во-первых, ты очевидно никогда не задумывался о дизайне языков и не пробывал делать свое говнишко. Вот ты обмазываешься строгой типизацией, пм пилишь (правда непонятно нахуя без нормальной системы типов), модули там, чтобы избавится от текстовой подстановки — в общем, пилишь фичи которые позволяют писать корректный код без дебагинга а тут макросы, блядь, текстовые. Во-вторых, языки нужно сначала до конца продумать и только потом делать, так же как и любой проект либо начинается с тз, либо никогда не выходит в свет (или выходит по кусочкам какая-то невнятная костыльная ебота вроде жаваскрипта и плюсов, где сначала сделали, а потом подумали).
>>905458 >строгую типизацию И как они противоречат строгой типизации? >что ты там матчить собрался-то Матчить можно много всякого разного. Например, я могу матчить структуры. Или массивы, которые там будут. Или таплы, которые там будут. Или ещё что-нибудь. Можно даже дикшинарей напилить и их матчить. >Причём последнее по-человечески на си не сделать. А как тот же руст это делает? Ты же догадываешься, что паттерн-матчинг можно компилировать в цепочку ифов и свитчей, я надеюсь? >макросы, блядь, текстовые Ты с чем споришь-то? Ты там себе надумал что-то и теперь мне доказываешь, что так нельзя. Я и хочу эту хуйню как раз для того, чтобы никаких макросов текстовых не было нужно. >языки нужно сначала до конца продумать и только потом делать Продумай. Зделой.
>>905472 >А как тот же руст это делает? Ты же догадываешься, что паттерн-матчинг можно компилировать в цепочку ифов и свитчей, я надеюсь? /0 Я честно не подозревал что разговариваю с долбоебом. Сорян.
Суп, анон. Короче, тут такое дело, я решил захуярить этот ваш pipe/конвеер. Написал код, который должен рекурсивно создавать процесс и выдавать дескрипторы ввода/вывода следующему потоку. На вход первого процесса я поставил stdin, на вывод последнего я поставил stdout. http://pastebin.com/XFgHYLGH Суть такова, что ничего не работаетна вход первого потока из ожидаемого stdin ничего не идёт (соответственно, выхлоп последнего я не могу проверить, т.к. он ждёт входа с предыдущего). Пробовал запускать процессы в таком порядке (execvp): cat | bc который gnuкалькулятор ЧЯДНТ? Анон, спасай-помогай.
>>905504 Сука, блядь, выложи код, который можно собрать и протестировать, а не только огрызок из одной функции. И детально опиши сценарий, как можно воспроизвести проблему, что ты ожидаешь, что получаешь на самом деле.
>>905634 http://pastebin.com/qdaVAAkR Вот main, из которого всё запускается. ll_create(), ll_append() и ll_dispose() опустил, ибо их имплементация проверена и там ошибок быть не может.
Как заставить мингвшный линкер прилинковать либу? Есть одна библиотека, которая, по мнению линкера, не используется, поэтому он её старательно отфильтровывает. А мне надо, чтобы в таблице импорта на неё ссылка осталась. Можно это как-то сделать?
Как программировать роботов на си? Я думаю что надо как то передавать сигналы в USB или HDMI или ещё куда то, а дальше уже дело электроники. Но как передавать эти сигналы?
>>901070 >Заебала меня наука нищетой и бесперспективностью Что за наука-то у тебя? Изучил методы и съебал заниматься этим практически попутно зарабатывая деньги.
http://ideone.com/y8V8Ro Наваял вот такую программку, а она наотрез отказывается работать. Задача была такая: Написать програму, которая из файла берет слова и записывает их в односвязный список, затем она должна удалить из этого списка элементы, у которых длина слов меньше 3 символов, и получившийся список надо вывести в стандартный поток вывода. Вроде все сделал, но нихуя не выводит (совсем) и что-то я не пойму в чем ошибся. Само-собой компелировал я не в ideone. За говнокод прошу не обоссывать, я нюфаня.
>>907445 >buff=='\0'; Ты, видимо, хотел делать присваивание? >Element->text=buff; Здесь ты присваиваешь указатель, а не копируешь buf в text, если что.
На будущее, не пиши так много кода перед первым запуском. Напиши немного, протестируй как работает. Так куда лучше отлаживать, чем написав дохуя всего, обнаружить, что не заводится. Я подозреваю, у тебя тут ещё много косяков. Алсо, ты не проверяешь, что вернул malloc(), это не есть гуд.
>>907457 Спасибо, и впрямь хуйню сделал. >>907467 >buff=='\0'; >Ты, видимо, хотел делать присваивание? Да. >Element->text=buff; >Здесь ты присваиваешь указатель, а не копируешь buf в text, если что. Блять, да, надо strcpy использовать. Спасибо я у мамы дурак.
>>907445 >if(Current->next->next!=NULL) Нет, тебе не про это писал. Надо вот так if(Current->next != NULL) Потому что именно next может быть NULL, а Current последним элементом. Но в этой функции, как мне кажется, лучше сделать не так, как у тебя. Во-первых, вне цикла в начале проверять количество символов, т.е. найти первый элемент, у которого их больше 3. И, во-вторых, уже убирать элементы, в которых меньше 3 символов. И всё-равно ты не сделал так, как тебе писал. Тебе нужно запоминать предыдущий элемент, а потом делать prev->next = current->next, таким образом ты исключаешь текущий элемент из списка. И удалить не забудь.
>>907554 >Нет, тебе не про это писал. Надо вот так if(Current->next != NULL) У меня в цикле for чуть выше это условие есть. Current->next!=NULL; >Но в этой функции, как мне кажется, лучше сделать не так, как у тебя. Во-первых, вне цикла в начале проверять количество символов, т.е. найти первый элемент, у которого их больше 3. И, во-вторых, уже убирать элементы, в которых меньше 3 символов. Все это есть %%хотя я посмотрю еще, вдруг криво работает.
По поводу функции, многое поменял. >struct Word to_change_the_node(struct Word First) >{ >struct Word Current; >struct Word Buffer; >for(Current=First; Current!=NULL || strlen(Current->text)>=3; Current=Current->next) (в этом цикле ищем первый элемент списка, с длиной слова не меньше 3, тело цикла отсутствует) >while(Current->next!=NULL)(в этом цикле убираем из списка элементы с длиной слова меньше трех символов) >{ >if(strlen(Current->next->text)>=3)(вот тут мы удаляем) >{ >Buffer=Current->next; >Current->next=Current->next->next; >free(Buffer); >} >else >{ > Current=Current->next;(переходим к другому элементу списка) >} >} >return First;(возврат) >}
>>907581 Гениально, ты открыл мне глаза на это!!1111 Давай вопрос повторю. Если malloc вернул NULL, что делать дальше? Твоя (или не твоя) фраза >>907467 >ты не проверяешь, что вернул malloc(), это не есть гуд. Не лучше ли будет, если программа упадёт сразу же, если malloc вернул ноль? Зачем проверять, что вернул malloc? Если он вернул NULL, значит всё настолько плохо, что даже сообщение об ошибке вывести не удастся, даже лог возможно не получится записать.
>>907580 Пройдись пошагово отладчиком и посмотри, где начинается ошибка. >По поводу функции, многое поменял Ты опять предыдущий элемент не запоминаешь. Тебе надо удалить текущий, а ты делаешь что-то непонятное. Разбей на два цикла: в первом найди элемент, длина строки в котором больше 3 символов (возможно, это и будет первый элемент, это будет гарантировать, что предыдущий элемент существует), во втором удаляй те, где меньше 3 символов (то есть, как у тебя задумано было). Можешь дальше брутфорсить правильный вариант, может чего и получится. Но лучше подумай, а не пытайся угадать правильное решение. И ещё, твой код не смотрел, может быть, где ещё проблемы есть. Подсказать, что неправильно, мне не сложно, но делать за тебя не буду.
>>907580 Ещё увидел ошибку (to_create_the_element_of_the_node). >strcpy(Element->text,buff); Удивительно, как твоя программа не падает на таком (видимо, до этой функции дело не доходит). Ты выделяешь память для структуры и копируешь в нулевой указатель строку. Два варианта здесь возможны: 1. Выделить память для строки. 2. Сделать массив фиксированной длины.
>>907605 >Не лучше ли будет, если программа упадёт сразу же, если malloc вернул ноль? В твоём случае она упадёт не сразу, а только когда ты попытаешься записать данные по гнилому указателю. И потом ты будешь сидеть и чесать репу, откуда у тебя сегфолт. Ты мог бы проверить на NULL и сразу вызвать exit() с определённым кодом ошибки, например. >Если он вернул NULL, значит всё настолько плохо, что даже сообщение об ошибке вывести не удастся. Почему? Лол. Твоё приложение, например, может исчерпать лимит памяти, которое оно может аллоцировать, установленный системой. Остальные приложения в это же время будут работать в штатном режиме. Сценариев может быть овердохуя в зависимости от ОС и её конфигурации. Понятно, что для лабы1, которую ты запускаешь на своей пека это не критично.
Алсо, ты почему-то так напрягаешься по поводу проверки того, что возвратит malloc, но в то же время освобождаешь память перед выходом из программы. Вот это как раз бессмысленное действие, т.к. за тебя это сделает ОС.
>>907617 >И потом ты будешь сидеть и чесать репу, откуда у тебя сегфолт А вот и нет. Самая замечательная ошибка - обращение к нулевому указателю, отладчик тут же в место ошибки перейдёт. >Ты мог бы проверить на NULL и сразу вызвать exit() с определённым кодом ошибки, например А адрес, где ошибка произошла, ты как будешь искать? А тем, кто в библиотеках делает exit, надо клавиатуру отбирать. >Твоё приложение, например, может исчерпать лимит памяти Это ошибка в логике приложения. А может быть, что в системе всё плохо, поэтому и NULL от malloc. В первом случае возможно, можно и лог записать, и окошко с ошибкой вывести, если есть зарезервированная память. А во втором уже ничего не получится. >ты почему-то так напрягаешься по поводу проверки того, что возвратит malloc Не люблю, когда делаются бесполезные действия. А их за работу программы (проверка указателя от malloc на NULL) миллиарды раз будет. >но в то же время освобождаешь память перед выходом из программы Да, можно и не освобождать. Но при условии, что точно знаешь, что нет утечек памяти. Т.е. в debug режиме нужно всё освобождать и проверять в конце работы программы, а вот в release можно и не всё освобождать. Хотя и не назову эту практику хорошей.
>>907622 >А вот и нет. Самая замечательная ошибка - обращение к нулевому указателю, отладчик тут же в место ошибки перейдёт. Если выведешь сообщение или дашь нужный код возврата, даже отладчик не нужен будет, прикинь. Алсо, всем пользователям твоей проги, например, ты тоже будешь говорить, юзайте отладчик, чтобы понять, в чём проблема? Типа собирайте с отладочной инфой и изучайте мой код, где там чё я аллоцировал и делайте выводы? Ты просто своим отношением хуй на пользователей кладёшь. >А адрес, где ошибка произошла, ты как будешь искать? Можешь юазть __FILE__, __LINE__. Можешь сделать abort() вместо exit(), чтобы у тебя был кордамп. Суть в том, чтобы дать как можно больше инфы пользователю, а не просто упасть с сегфолтом. >А тем, кто в библиотеках делает exit, надо клавиатуру отбирать. Во-первых не о библиотеке речь сейчас. Во-вторых, exit() просто один из сценариев. В библиотеках обычно делается возврат кода ошибки, которому может соответствовать определённое сообщение. И ты так радикален насчёт exit(), но при этом забиваешь хуй на возврат malloc(). Ты очень непоследователен. >Не люблю, когда делаются бесполезные действия. Все приложения на C (как правило, open source), которые мне приходилось смотреть (в частности, очень много приходилось читать исходники perf утилиты, одна из юзерспейс программ линукса), пожалуй, в 99.99% случаях, если не в 100%, проверяли возврат malloc(). Я не знаю, либо все, кто этот код пишет, не шарят, либо ты. Мне кажется, второе. >Хотя и не назову эту практику хорошей. Пиздец, ты такой непоследовательный. Отсутствие проверки возврата malloc() куда более критична и фатальна, чем не освобождение памяти перед завершением. Это блядь пиздец так очевидно, что я просто тебе поражаюсь.
>>907622 >>>Твоё приложение, например, может исчерпать лимит памяти > Это ошибка в логике приложения. Если лимит памяти со стороны ОС установлен, то при чём тут приложение? >А может быть, что в системе всё плохо, поэтому и NULL от malloc. А может быть ты пытаешься аллоцировать овер 9000 ГБ на системе с 256 метрами оперативы. С чего считаешь, что если malloc() вернул NULL, то в системе обязательно всё плохо, я просто не могу понять.
Так что же за код надо написать чтобы программа могла подавать сигналы на USB, HDMI и другие выходы? Может есть какой то особый участок памяти, с которого считываются байты и подаются через USB и другие выводы?
>>907605 >Не лучше ли будет, если программа упадёт сразу же, если malloc вернул ноль? Для ленивого программистишки - конечно. Для пользователя твоей поделки - нет. Но для лаба1 не актуально. >Зачем проверять, что вернул malloc? Чтобы не падать как последняя сука хуй знает где и хуй знает когда с проебыванием всех полимеров, а попытаться завершить работу так, чтобы не проебать пользователськие данные. Или хотя бы не закапывать ошибку в долгий ящик и сообшить о ней на месте преступления. Для лаба1 не актуально. >Если он вернул NULL, значит всё настолько плохо, что даже сообщение об ошибке вывести не удастся, даже лог возможно не получится записать. С хуев это, кукаретик ты ебаный? Опять таки, для лаба1 не актуально. ??? Ты просто тупой студент.
>>907804 >Так что же за код надо написать чтобы программа могла подавать сигналы на USB, HDMI и другие выходы? Код с использованием OS specific либ/системных вызовов. >Может есть какой то особый участок памяти, с которого считываются байты и подаются через USB и другие выводы? Есть. Только им ОС заведует.
>>907804 > Может есть какой то особый участок памяти, с которого считываются байты и подаются через USB и другие выводы?
Нет никакой такой памяти. Ты наркоман чтоли? Но есть WinAPI функция которая позволяет работать с любым USB-портом как с файлом. Открыть его и писать в него байтики, или читать.
>>908079 ну что такое ls я не знаю например. system("dir [директория]") печатает имена файлов в консольке, мне нужно эти имена получить и сохранить в массив строк например.
Анон, вот у вас в шапке ссылка на шапку на пиратской подушке. Чем плоха паста бина, поясни ньюфагу. мимокрокодил, зашел лишь почитать ту самую шапку да задать ебанутый вопрос
>>908552 > Чем плоха паста бина Тем, что pastebin не редактируется, а в эту ты можешь что-нибудь добавить. Алсо, так исторически сложилось, все вопросы к ОПу первого треда.
Может кто помочь разобраться? Сам в программировании не шарю, лишь недели две знаком с этим. Нужно было написать программу для работы с базами данных. Что не так с этим кодом? http://ideone.com/w6D9z2 Он отключается либо рандомно во время заполнения данными, либо после того, как введу последние данные. Программа ничего не пишет и вылетает. Но зато компилируется нормально.
>>909055 Нет, компилятор не ругался на это. Он вообще ни на что не ругался. Спасибо, помог разобраться в чем проблема >>909073 Не знаю каким компилятором пользуешься, но мой компилятор (Видимо бесполезный и херовый) не сообщал ни о чем.
Никак. Компилятор и ассемблер не знают, куда линкер поместит твой объектный файл, а адрес call кодируется относительно инструкции, следующей за call. Сделай mov eax, адрес / call eax.
>>909073 >Ошибка компиляции Это из-за того, что он выбрал с99strict, который -Wall и -Werror, и проверяет вообще всё, что только можно. >Блять, пол доски таких долбоебов. Двачую.
Ребзя, чому у меня gdb в mingw-w64 при отладке программы пишет > This application has requested the Runtime to terminate it in an unusual way. > Please contact the application's support team for more information. и завершается? Воспроизводится даже на main с одним printf внутри, стоит только поставить брейк на входе в main и по одной строке выполнять, на выходе из main он упадет. Но без брейков процесс завершается нормально. В программе с несколькими файлами падает даже просто на входе в main. Нагуглить ничего не получается.
Где подробнее прочитать про динамическую аллокацию памяти да и вообще про память/стек/кучу? После K&R много вопросов осталось. Или, может, добрый анон сам расскажет, как и для чего нужна динамическая аллокация?
Прогаю на говноноуте, которые не тянет студию, поэтому использую PellesC. Мне нужно выкинуть CRT из программы. Как это сделать? Добавил прагму /NODEFAULTLIB, но при компиляции ничего не произошло. Обычно линкер ругался на _memcpy и _memst. Поставил в настройках проекта точку входа WinMain, но после этого появилась ошибка Undefined symbol _WinMain. Как решить проблему? Тип приложения Windows.
>>910890 Поставь GCС или командную строку от студии.
> /NODEFAULTLIB, но при компиляции ничего не произошло /Zl
> Undefined symbol _WinMain Потому что если ты объявил WinMain как обычно, то символ будет _WinMain@16. И имей в виду, что аргументы для тебя в нее никто не передаст, и выход из нее распидорасит стек, поэтому ExitProcess обязателен. Или объяви правильную функцию, без аргументов.
>>910890 Свободное сообщество дало им GCC - качай MinGW, пиши Make файлы, собирай из командой строки! Не хочу, хочу жрать какое-то никому неизвестное говно.
>>911609 У гнутых дебилов кроссплатформенный — означает не то, что поддерживающивает 98% процессоров в мире, а то что обязательно поддерживает 2% маргинальной хуиты устанавливающийся в чайниках и микроволновках с утюгами.
Нужен набор мелких статей чтобы по фасту вкатится в си. Кресты знаю, но как только начал писать хэлоуворд на си так куча ошибок. В инклюдах, в форах, в ссылках и в структурах. Короче надо с нуля изучать, но галопом. Чтобы уже завтра мог писать хэлоуворды. Дайте литературы.
Можно как-то сравнить два указателя с учётом, что указатель — typedef структура с множеством данных? Нужно просто понять, что указатели указывают на одно и тоже.
>>912098 if ((void ∗)some_ptr == (void ∗)other_ptr) {...} Обосрачей не будет. К void ∗ можно скастовать любой указатель на данные, указатели на void можно хранить, кастовать обратно и сравнивать через != или ==.
>>912100 Погоди, у меня сравниваемый указатель расположен в другом указателе, я к нему обращаюсь так: ptr->ptr, и если писать (void*)ptr->ptr, то нихуя не работает. Как правильно сделать?
>>912187 Тебе ответить сложно? Книжек под рукой нет, нагуглить не могу не получается нормально составить запрос, один мусор в выхлопе. Будь же ты человеком.
>>912118 > нихуя не работает Что не работает-то? Свет в комнате не включается? Выкладывай код. Алсо, что-то подсказывает мне, что ты все еще тот самый анон с из прошлых тредов, которому религия не позволяет открыть K&R.
>>912224 Ах да, туплю, всё работает, просто я идиотина тупая. > Алсо, что-то подсказывает мне, что ты все еще тот самый анон с из прошлых тредов, которому религия не позволяет открыть K&R. Ну не знаю, что-то такое было, но очень и очень давно, так что вряд ли.
>>912481 хуй его знает. можно заделать аргумент void@ - но это-же пиздец, или обернуть функцию в макрос, который кастует аргумент - всё херня какая-то. я просто каждый раз кастую к void@ на вызове и не парюсь - но тоже дерьмо.
но у меня более несправедливый случай, у меня алгоритм(ы) пробрасывает указатель(void@) в функцию которую ему передают. но на той стороне хочется видеть в аргументах сразу нужный тип указателя - а нельзя, парень.
эх ладно. с новым годом. приятно зайти сюда раз в месяцок, кругом хуесосы и всё благоухает.
Ебать вы тут все поехавшие. Си для тонких вещей вроде используют, а не для "ентер хуй ту дефлорейт" и "бля пасаны я тут с жабаскрипт на си перешел зочем освобождать память".
или ты про именно такие. не, я бы делал, и делаю, шаблоны через хедер. или как там, создаю 1 .c (макросы замены + инклюд оригинального.с) для точки компиляции и .h (макросы замены + инклюд оригинального.h + определяю функции и структуры которые сгенеряться) для каждого.
>>914616 Ну, дык, и писал бы себе спокойно на сях с шаблонами (в том же гцц именно так и сделали), ничего больше не используя, там в отличие от сей даже модули когда нибудь да появятся.
блин, как думаете, как организовать авто подцеп точек компиляции? название и приписку N - номер? или, может если есть папка с таким же именем, перейти в ней и там взять точку - и так рекурсивно. только во втором нужно будет повторять структуру папок. у меня тут просто куча программ - тестов, всё думаю как это организовать по нормальному.
или нахуй оно нужно, если можно просто в мейкфайле прописать. хуй знает, не шарю и вообще, в пизду программирование на сегодня, поду праздничной накачу за путина.
>>914948 В России только для встраиваемых систем. Не шаришь в этих ваших VHDL, не ходил в радиокружок в детстве, пиздуй нахуй. Если есть, что чуть подальше от железа, там из-за высокого порога вхождения и отсутствия опыта тебе сразу проводят по губам.
>>915655 Ты сейчас заменяешь значение указателя. После маллока он у тебя указывает на выделенную область памяти, а после присваивания 25 - на область памяти по адресу 25. Скорее всего, ты хочешь либо: int ∗ptr = malloc(sizeof(int)); ∗ptr = 25; либо void ∗ptr = malloc(sizeof(int)); *(int ∗) ptr = 25; Для второго варианта нужны причины, просто по приколу так писать не стоит.
>>915674 >просто по приколу так писать не стоит какое, блять, тебе дело до того как кто-то что-то там пишет? ты ещё вот так запрети писать f((a=1, &a)) или (*p).a. и каждый пидорас считает свои долгом заикнутся за goto. развели раковник понимаешь
>>915781 Говно с крайне узкой областью применения - нарисовать интерфейс по-быстрому, пока не появится время выкинуть нахуй нуклеар и сделать нормально. Ничего выходящего за рамки кнопочек и чекбоксов на этом изобразить нельзя.
>>915822 А действительно, чому? Выглядит неплохо. Правда как я на нём буду писать десктопные приложения вроде файлового менеджера? Они же будут выглядит пиздец как плохо. Вот если бы поддерживал темы, скажем, GTK, то было бы заебись, а так хз.
>>914948 >На Си пишут чего еще кроме лаб? Работа есть? чувак, пройдись по топовым крестовым проектам на том же гитхабе и окажется, что там тупо приплюснутый си - те вроде и классы, но внутри методов та же самая структурная дрисня, которую деды в 70х годах на pdp11 писали, ну плюсом еще темплейты юзают заместо макросов редкая библиотека спроектирована с использованием иерархий классов, с использованием полиморфизмов, ну или библиотеки сделанные в функциональном стиле на шаблонах большинство содержат самый настоящий сишных код, хоть и декларируется что это кресты
Есть ещё вопрос. Пикрел, выделяю память var1->ptr на всю структуру type2, потом пытаюсь записать в var->ptr->i значение, но разумеется ничего не выходит. Кастомагия способна на такое?
>>915884 Ну тебе все правильно сказали. Приоритет у -> выше, чем у приведения типов. Если хочешь сначала скастить, а потом обратиться - используй скобки. Алсо, у тебя получается лишний дереференс - звездочка берет значение по указателю и -> берет значение по указателю. Выбери что-то одно: ((type2 ∗) var1->ptr)->i = 25; или (∗(type2 ∗) var1->ptr).i = 25; А правильнее вообще не лениться и сделать так: type2 *something = var1->ptr; something->i = 25;
Котаны, такой вопрос. Пишу красивый CLI для своего приложения с богатым функционалом и хочу так как красиво как в git'е. Как этого можно добиться? Пока вижу три опции.
1. Руками на основе argc/argv разбираю строку. 2. Использую POSIX-совместимую getopt() 3. Использую расширенный вариант предыдущего функциионала getopt_long().
Хотелось бы узнать, что является best practicies/как сделать поыбстроми, минимизируя число зависимостей. Буст идёт нахуй. Не интересно.
Продублировал вопроси к тредик по плюсам. >>916365
>>916366 Использовать getopt_long нормально, но написать свой парсер, если хочется сделать что-то нестандартное - тоже вполне ок. А вот использовать исключительно однобуквенные ключи для приложения с богатым функционалом - это пиздец.
>>916369 > использовать исключительно однобуквенные ключи для приложения с богатым функционалом - это пиздец. В точку! В этом весь вопрос. Будет ещё немного конструктива? Попытался расковырять исходники git'а -- не зашло.
>>915781 Эй, нуклярщик, поясни как в этой либе делать вертикальные контейнеры с чем-либо.
Вот допустим один из его примеров. На сколько я понимаю это просто горизонтальные боксы в которые напиханы элементы. Верно? А как добавить во всё это дело вертикальный бокс? Как на второй пикче.
Хочу запилить генератор ассемблерного мусора на си, чтобы этот мусор был похож на реальную программу. То есть если где-то выполняется cmp, то за ним должен быть переход, или если выполняется push, то где-то должен быть pop, при этом надо следить за тем, чтобы исходные значения регистров не нарушились. Как это можно реализовать? Использовать графы? Как именно их использовать? За один раз помещать на граф одну инструкцию, потом делать проход по ветви, и если встретилось где-то, например, push, то на конце ветки вставить pop?
>>916565 Самый простой способ - создаешь рандомные инструкции куском от 5 до 20 комманд которые делают что угодно но в конце возвращают регистры в исходное состояние.
Сап. Пилю бинарный формат. У меня есть куча ключей, на которые мне нужно впоследствии много раз ссылаться. Подумал, что удобнее всего их будет просто проиндексировать и записать в определенном порядке, а при считывании восстанавливать значения индексов просто по порядку. Но что мне не особо понятно, так это то, в каком виде лучше всего записывать эти самые ссылки, т.е. номера индексов далее по "тексту". Есть идеи? Интересует самый компактный вариант.
>>916820 Да. Стандарт гарантирует, что память освободится и файлы закроются, если программа будет завершена через return в main или exit (т.е., не свалится по сегфолту, например), а большинство многозадачных ОС гарантируют очистку в остальных случаях.
>>917131 __stdcall позволяет избежать бесконечных add esp, N после вызова функции - функция сама за собой подчистит. К тому же, если ты случайно вызваал функцию с неверным числом аргументов, вероятность того, что программа свалится сразу, а не в продакшене, с __stdcall гораздо больше. В то же время какой-нибудь printf нельзя сделать __stdcall, потому что число аргументов неизвестно на этапе компиляции, и компилятор не может сгенерить retn XX, не зная заранее, сколько байт нужно вытолкнуть из стека.
Если не знаешь, что выбрать - не выбирай ничего. Если у тебя колбеки для чужой функции, то конвенция должна соответствовать тому, что ожидает функци (например, в колбеках для винды тебе придется прописывать __stdcall). Для кучи мелких функций с 1-2 аргументами на x86 есть смысл задуматься о __fastcall (под контролем профайлера, иначе можно только хуже сделать).
>>917131 Забыл про явный выбор. Если у тебя библиотечный код, имеет смысл прописать конвенцию в прототипах только не напрямую, конечно же, а зафайнить ее как какой-нибудь MYLIBCALL, чтобы при случае было легко поменять или выбросить. Иначе может случиться так, что в использующей библиотеку программе компилятору сказано делать __stdcall по умолчанию, в прототипах твоей либы нухуя, и компилятор вызывает библиотечный код как __stdcall, в то время как ты свою библиотеку собрал с __cdecl. По идее, об этой проблеме тебе расскажет линкер, но возможны и менее приятные варианты.
Аноны, а в sublime text есть какой-нибудь плагин, который бы мог находить и показывать объявление переменной ну хотя бы в пределах функции/файла? Чтоб как в вьюжал студио прям. Максимум нашел пока только те, что повзоляют открыть определение функции, макроса или типа данных. А вот мне б что б переменную...
>>918394 Ctrl+; Плагины не требуются. Также есть плагин SublimeIntel, который индексирует файлы и позволяет перемещаться между определениями функций в файлах. Также есть специальный плагин для clang.
>>918497 SublimeCodeIntel ты хотел сказать? Он не поддерживает c/c++. Я видел какой-то CTags, если я правильно понял, он то же самое должен делать. Но он только ошибками сыплет с какими-то символами и ничего не делает. Алсо, всякие плагины для автодополнений тоже работает не осне -- ставишь точку, и он предлагает всё, что нашел. Другие какие-нибудь не менее удобные и настраиваемые редакторы с такой фичей есть или так только полноценные ide умеют?
>>918815 >для пидоров Что не для пидоров? >нахуй тебе ide на твой хеловорд? Чтобы быстро найти в мейне, где объявлена переменная "a" и какой у неё тип.
>>918816 >Что не для пидоров? NotePad++/VIM >Чтобы быстро найти в мейне, где объявлена переменная "a" и какой у неё тип. ты правда не можешь запомнить свои переменные и их типы? погромирование явно не для тебя
>>918816 > Чтобы быстро найти в мейне, где объявлена переменная "a" Переменная a должа быть объявлена в мейне. Если ты ее не видишь, и глобальных переменных у тебя больше, чем ты можешь запомнить, тебе стоит почитать что-нибудь про правильный подход к говнокодингу.
>>918818 >вполне хватает Когда в чужом коде копаешься, гораздо легче разбираться, когда есть возможность в два клика найти место объявления переменной и т.д. >>918820 >NotePad++/VIM С каких пор они так умеют? Алсо, чем они лучше саблайма?
>>918832 >Когда в чужом коде копаешься Никому не рассказывай, но есть такая программа называется Source Insight. Лучше нее еще ничего не придумали. И даже то, что она древняя, как говно мамонта, даже ее откровенно отвратительный интерфейс не умаляет ее достоинств.
>>918833 >сравнивать саблайм с vim это как жопу с пальцем Сказанул как в лужу пёрнул. Давай конкретику. >>918835 >Source Insight Не слышал. Спасибо, гляну.
>>918811 > SublimeCodeIntel ты хотел сказать? Он не поддерживает c/c++ Ну у меня в проекте смешаны исходники на пдюсах и джаве. Отлично работает, это же просто поиск. CTags не пробовал, он не нужен. "Ctrl+;", "Ctrl+R" и Ctrl+F/Ctrl+D достаточно для навигации по одному файлу. >>918833 >сравнивать саблайм с vim это как жопу с пальцем Да, причём vim - это жопа, а Саблайм - это твои десять пальцев.
>>918835 угу правда щас в последней студии можно просто открыть папку в которой исходники (любые, пофиг есть или нет проект там, пофиг чем они компилятся), она их проиндексирует во время открытия, и можно будет сразу осуществлять навигацию по ним такие дела
>>918927 Попробуй открыть исходники линукса в студии, запусти на фоне его сборку в виртуалке, и попробуй параллельно "осуществлять навигацию". А потом с этой хуйней сравни. Это - не для хелловорлдов, оно нужно, чтобы в разумное время и без жопной боли разобраться в огромном проекте на C/C++. Алсо, в студии разве запилили поддержку реальных поддиректорий в проекте? Или оно по-прежнему по умолчанию валит все в одну кучу, а решается это только виртуальными директориями и только вручную?
>>918949 вымой рот >>918947 в vs 2017 при открытии папки произойдет парсинг исходников, что там лежат, включая подпапки, причем происходит это относительно быстро, положим исходники mfc/atl меньше минуты индексируются на моей некромашине в vs 2015 было не очень удобно когда нужно было быстро просмотреть какие-то исходники тк приходилось создавать пустой проект и скармливать ему путь до сорцов, в следующей версии это все автоматом делается
>>899366 Основная разница в механизме хранения в памяти. Массивы всегда хранятся последовательно и занимают один несегментированный блок памяти. Оттого и доступ к любому элементу мы имеем по индексу. Связанный список - структура искуственная. Такой нет в спецификации языка.
>>921844 Qt слишком жирная, я бы хотел писать крошечные программулины с простеньким интерфейсом и холстом, на который можно выводить графику. Желательно еще чтоб прогалось попроще.
>>921933 >win32 api но вот до сих пор не понимаю, нахуя? зачем пользоваться апи системы, а не писать через библиотеки? с таким же успехом можно заниматься траханьем с линупсом напрямую - но этого никто не делает. потому что: зачем прибивать свой код к полу гвоздями.
не, я раньше писал на винапи, у меня была иллюзия что это будет типо БЫСТРО работать.
ебанный малолетние дегенераты, я могу написать хелловорлд в 1 кбайт, а полный аналог блокнота в 20 кбайт. А потом приходит школьник с хелловорлдом в 5 мегабайт и что-то там кукарекает
Насколько корректно сравнение типа double d = 0; if(d==0).... и float f = 0; if(f==0).... Именно с нулем. Или нужно и здесь использовать функцию типа fabs() b сравнение с epsilon?
>>922373 Если это общий случай, то нет, некорректно, и нужно использовать сравнение с эпсилон. Если ты хочешь проверить, осталось ли в переменной какое-то записанное тобой же значение, например: if (d == 0.0) { // Еще не считали что-то сложное d = посчитать(); } или другие подобные случаи с простыми константами и ты знаешь, что эти константы тривиально кодируются, без зависимостей от rounding mode и прочей херни, тогда сравнение с константой допустимо. Но такое бывает редко.
>>922110 Виндовый блокнот в XP весит 70к, написан на сишечке. Примерно половину файла занимают иконки. А простейший блокнот (загрузить, отредактировать, сохранить) будет весить не 20к, а всего 2к, даже если специально не пытаться уменьшать размер файла.
Погромач, помоги вкатывальщику: пытаюсь освоить хэш-таблицы с линкед листами. Так вот, при создании массива индексов, как я понимаю, память не всем выделяется (пикрил). В чем ошибка? Объявляю как node *hashtable[SIZE] (SIZE = 26). Надеюсь, понятно объяснил.
>>923086 > и сколько иконок в блокноте? Несколько. Пикрелейтед.
>>923217 Ты объявил массив указателей на node. Не инициализировал. В результате у тебя в массиве тот мусор, который был в стеке. В хэш-таблицах на линкед-листах память заранее выделять не нужно (кроме buckets, вот этого твоего массива). Инициализируй указатели в массиве нулями, а выделять node и добавлять его в нужный bucket будешь, когда он тебе понадобится.
>>923269 > как системнонезависимо программировать сокеты? Никак. Для простых блокирующих сокетов между Winsock и линуксами различия минимальные - WSAStartup/Cleanup, closesocket вместо close, имена .h-файлов другие, ну и в винде еще хэндл unsigned. В сложных приложениях ты все равно будешь по хардкору пользоваться системными механизмами типа IOCP или epoll(). Поэтому пиши себе няшную обертку под задачу и не пытайся совместить несовместимое.
>>923293 >Инициализируй указатели в массиве нулями Спасибо, помогло, но я все равно немного не понимаю. Buckets пустые указатели в самом начале, и при добавлении нового node нужно сделать ведь, чтобы они указывали на первый node. Но доступа к указателю внутри изначального bucket, получается, нет? Или я туплю? Пока сделал, чтобы последний добавленный нод был в роли первого указателя, но это неправильно, как мне кажется.
>>923459 Тебе жалко? Так дохуя скипать нужно? Выдели пару килобайт на стеке, да и все. Ну или можешь scanf выебать на тему чего-то типа %*42с, но динамически количество указать нельзя вроде.
Есть два хедера и соответствующие им c-файлы. В первом хедере объявлена структура сетевой ноды, во втором - структура стека. Можно ли одновременно использовать обе этих структуры в каждом c-файле? Что-то у меня пиздец сколько ошибок.
>>923536 В с файлах инклюдишь оба хедера. В хедерах forward declaration нужной хуйни без инклюдов. Может не получится обойтись с помощью forward declaration - тогда нужно что-то думать.
У меня реализован стек, в котором я должен хранить структуры Node, определенные в другом хедере. В этом другом хедере определены функции, в которых используется стек. Такие вот перекрестные зависимости.
>>923566 ну, Node не объявлен. харе мне мозги ебать. короче, передаю тебя на попячительство местному добродетелью. а мне нужно трубы залить и посмотреть фильм трамбо. и отписать в /mov/
>>923579 В хедер со стаком инклюдишь ноду. В хедере ноды вместо инкда стека пишешь typedef struct stack; В с файле ноды инклюдишь хедер стака. Если не взлетит то ты соснул (перемещай декларацию ноды в стек).
Аноны, хочется попилить чего-нибудь, использующего gtk3. Посмотрел бегло гномопроекты - они только автотулз используют, а у меня на это не стоит, больше нравится cmake. Попробовал перевести наутилус (единственно чем я пользуюсь ежедневно из гномостека на C) на него, убив на настройку сборки неделю - всем похуй, послали лесом. Дайте какой-нибудь совет что ли или направление, кроме как нахуй.
Что означает *& Встретил такое. Вроде звёздочка относится к указателям, загогулина разыменовывает его. А вот от этой комбинации у меня мозг порвало. И не гуглится никак.
>>923969 Это плюсы, а не си. В плюсах у тебя может быть два вида сущностей, ссылающихся на объект: указатель или ссылка: Type ptr = &obj; Type& ref = obj;
И в сях, и в плюсах указатель на объкт типа принадлежит к своему отдельному типу указателей на тип (не знаю как это объяснить менее тавтологично). typedef Type TypePtr; // указатели это тоже тип
поэтому штукенцию вида: Type*& func(); можно понимать и записывать так: TypePtr& func();
>>924008 У меня там указывает на поле в структуре (объекте). В треде по всму выкладывал реверснутые сырцы, у меня там так получилось, вот и не уверен, верно ли это: http://pastebin.com/exhumh83
>>924080 А это, как ты можешь сам прочитать, Non-Qt Application. Ты можешь писать ее в QtCreator, но не можешь использовать кутэшный гуй из нее. Вопрос был про гуй.
>>929108 Битовые поля (bitfields). Эти члены структуры фактически хранятся в виде 5, 6, 6 и 12 бит (т.е., все вместе влезают в 32-битный инт). Такое делают для экономии памяти за счет раздувания кода битовыми операциями (магически получить биты из памяти нельзя, требуется 2-3 инструкции для маскирования и сдвигов). Еще так делают в embedded для всяких хардварных регистров, чтобы вместо (*(PLL0_REG0) >> FREQ_BIT_START) & FREQ_MASK, делать более читаемое PLL0->freq. Но способ расположения и выравнивание битов в битфилде зависят от компилятора, поэтому такое можно делать только если тебе не важен способ расположения битов (первый случай) или если у тебя одна конкретная платформа с конкретным компилятором, и ты знаешь, как этот компилятор собирает структуру (второй случай).
Что читать:
- Классика от Отцов: http://www.cypress.com/file/56651/download
- Годное пособие для гуманитариев: http://c.learncodethehardway.org/book/
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/%7Eats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (он же C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт) не драфт ищем на торрентах
- Стандарт ISO/IEC 9899:2011 (он же C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- man/Dash/zealdocs
Чем конпелировать:
- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio 20152017 RC Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и неполной поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
Что еще почитать:
http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.
Stephen Prata "C Primer Plus, 6th Edition" (2014)
Свежая знает про C89, C99, C11, описывает различия, объемная около тысячи страниц, годная хотя есть некоторые шероховатости, с вопросами, упражнениями и ответами. Читать после K&R или до.
Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.
Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).
Ben Klemens "21st Century C: C Tips from the New School" (2012)
Stephen G. Kochan "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)
MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C
Прошлые треды:
- https://arhivach.org/thread/106153/
- https://arhivach.org/thread/131949/
- https://arhivach.org/thread/140570/
- https://arhivach.org/thread/153698/
- https://arhivach.org/thread/155908/
- https://arhivach.org/thread/173837/
- https://arhivach.org/thread/180461/
- https://arhivach.org/thread/182958/
- https://arhivach.org/thread/188294/
- https://arhivach.org/thread/193780/
- https://arhivach.org/thread/198868/
- https://arhivach.org/thread/206632/
- https://arhivach.org/thread/211714/
- https://arhivach.org/thread/217128/
- https://arhivach.org/thread/223224/
Шапка: http://piratepad.net/bJ1SdmkZyu