Результаты поиска
| |
afq | Дата: Понедельник, 13 Января 2020, 12:20 | Сообщение # 341 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, ты не прав. Если появляется хорошая идея, то её можно показать. Как в пример, хаха Линукс Торвальдс по твоему мнению не мог учить людей, а написал линукс. Дело в том что ты пытаешься мне запрещать, хотя у тебя прав на это нет. Другое дело, что если бы ты написал что с таким уровнем знаний я никого не научу, тогда может быть понятно, да и то, кому то мои идею могут чем то помочь. Например сегодня ночью я читал книгу по c#, тему делегатов. Это типа указателя на функцию. Я ещё не проверял, но как то тупо сделано, ты не находишь. Ну я о том, что можно сделать сразу несколько указателей с помощью d += function. А если я захочу удалить в середине указатель на функцию, то что мне делать? С помощью d -= function можно удалить только крайний справа указатель. Вот как считаешь, это преимущество языка? Я хочу оценить твою адекватность. )
|
|
| |
afq | Дата: Понедельник, 13 Января 2020, 11:44 | Сообщение # 342 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, Цитата Только не стоит учить других паттернам Захочу ещё статью напишу. ) И заброшенные проекты тут не причем.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 22:31 | Сообщение # 343 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Xakep, Цитата Почему мы должны писать за тебя на Си? За меня на си не надо писать. Я сделал нормальную реализацию. Но если вы считаете что она не правильная, то где правильная, где пруфы, что на си можно сделать правильней?
Цитата Мы можем предложить свои какие-то идеи, ты можешь попытаться их реализоват, Ну так я об этом и написал. Пиши как выглядеть должна функция, чтобы использовать нескольких издателей. Да и для библиотеки это не подходит. Если память будет выделяться на стороне библиотеки, то другой кто будет использовать эту библиотеку, то получит доступ к этим данным.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 22:25 | Сообщение # 344 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Xakep, ну а как бы ты сделал, какие бы функции были бы доступны для использования издателя и подписчика? Какие бы ты функции определил? Я так понимаю вы все можете писать о том, что плохая реализация, а сами то как бы сделали? Разумеется нужна универсальность, чтобы не писать реализацию каждого издателя заново. Надо ведь написать такой способ, чтобы разработчик уже только использовал эти функции.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 21:51 | Сообщение # 345 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, ну раз ты программировал на c++, то как бы знаешь и си. И я как понял что ты тоже считаешь что у меня плохая реализация. Тогда видимо у тебя тоже есть опыт. Вот я и написал в начале сообщение о том, что рад услышать советы и т.д. Тогда напиши мне на си, как сделать не реализацию, а функции, которые можно использовать типа готовых. Ну напиши как должна выглядеть функция, ну какие параметры должна получить и всё. То есть например у меня функция выглядит так.
Код init_publisher ( int type, void (*callback) (void *event, void *data), void *data );
здесь я указываю номер издателя, функцию указатель, и пользовательские данные. а вот так я отправляю события.
Код send_event ( int type, void *event );
А как ты считаешь надо сделать, чтобы можно было объявить нескольких издателей и нескольких подписчиков? У меня например мышление такое, что я сделал так. Но разные люди по разному мыслят. И поэтому я рад вашим вариантам. И так я посмотрю какой вариант лучше. Но пока я считаю что мой вариант правильный.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 21:14 | Сообщение # 346 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, а, или ты имел ввиду не квадрат, а куб? ну да, куб я не могу нарисовать. не знаю почему. но я хотя бы стараюсь.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 20:37 | Сообщение # 347 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Цитата С другой стороны, как можно набираться опыта у Си программиста, который не может на OpenGL нарисовать квадрат?
drcrack, я могу, только с количеством вершин ошибся. а ты что-ли можешь то сам? я так понимаю что ты на unity решил программировать, потому что не хочешь знать как это всё изнутри работает. ты как бы программируешь логику игры, а не саму игру. не знаю, возможно тебе стоит самому попробывал делать свой движок, чтобы отучиться писать такие комментарии.
Цитата Язык программирования - это инструмент в первую очередь, принципы, подходы и алгоритмы в программирования все равно остаются одними и теми же не совсем верно. подход другой у языков. ты например не можешь с помощью шаблонов на си программировать, а в c++ можешь и т.д. на каждом языке задачи решаются по разному. от тех кого я слышу что язык всего лишь инструмент обычно знают несколько языков, да и то не очень хорошо. и задачи решают обычно на том, в котором легче всего решить. то есть у тебя такой уровень знаний языка, что ты например не можешь сделать программу по картографии на си, но зато ты можешь это сделать на python с уже готовой библиотекой. я бы лучше делал это на си, чтобы скилл рос, а не пользоваться языком как инструментом.
Цитата И что с того, что это веб разработчики, они не программисты чтоле? Да как ты не поймешь, они указывают на недостаток языка си и показывают как это делается на их языке. это похоже на то, что вообще абсурдно писать на си, что компилятор не может проверить такие вещи, которые в си дают универсальность.
Цитата Поэтому нужно учиться программировать, а не учить языки программирования. Вот, вот это правильно. учишь один язык и реализуешь на нем всё и не сворачиваешь с пути.
Цитата другое дело, когда ты участвуешь в разработке крупного проекта, где цена ошибки может стоить компании миллионов $ (а тебе может это стоить работы). Да какой там. хочешь сказать что в моей программе могут ошибиться программисты на си, которые живут программированием? как вообще можно ошибиться и подписаться на издателя, который определен в определенном файле. знаешь, я изучаю как новый код, так и старый код разных программ. есть специальная лицензия, которая объясняет что автор не несет ответственности за программу. и кстати, я изучаю еще код, где были найдены уязвимости, хотя не могу все равно понять где эта уязвимость, может ее пофиксили. и знаешь, с моей программой не справился бы только какой нибудь тупой не программист. чтобы сделать такую реализацию, нужно было написать не мало строчек кода, но зато теперь можно пользоваться. ну и конечно же ты можешь показать как это сделать на java. вот например в java каждый класс в отдельном файле да. тебе надо сделать так. чтобы в одном файле ты подписался на издателя. в другом файле подписался на издателя. в другом файле отправил событие и два файла получили это событие. чтобы этот способ был универсальным. чтобы не нужно было переделывать издателя, ну подстраивать под новый проект. вот я такое сделал. в моем случае написал один раз, используешь везде. потому что издателю можно передать любой тип. эти с хабра пишут что тип нельзя проверить. ну и что. ты что не знаешь какие данные будешь передавать? это тупо троллинг. вон например в glib. есть такая функция g_signal_connect, сюда ты можешь подключить либо g_object, либо gtk виджет. также отправить данные свои, вот здесь тип не проверяется, оно и правильно, потому что функция сделана так, чтобы ей можно было пользоваться сколько угодно и в любых проектах.
Цитата Это же идет в разрез с принципами промышленного кодирования, где чем шаблонее будет код, тем лучше. А любой велосипед заведомо вызывает негатив. ну в моем случае готовых библиотек для си нет. проще уже самому это сделать чтобы пользоваться. я лишь хотел показать удобство использования подобия паттерна, заметь я написал подобия, а не паттерна. но все всё равно пишут что я паттерн имел ввиду. тупость.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 10:23 | Сообщение # 348 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, видишь что я ему написал, посмотрим какой он ответ даст.
Цитата А почему вы мне показываете как это делается на js? Почему вы сишника учите программировать, если сами показываете код на js. Если хотите показать как надо правильно делать, то пишите на си. То же мне, показывает как это удобно делается на js. Как будто статья про js.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 09:51 | Сообщение # 349 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| drcrack, да не. там единицы написали, не все такие. не знаю даже почему ты встал на их сторону, на сторону меньшинства. что там профи такие чтоли сидят? которые бояться без компилятора ошибок наделать. они возможно и не поняли в чем плюс такого подхода. и пишут свои js программы. это же веб разработчики. они не шарят в си программировании и указывают на недостатки си языка, типа их язык лучше, что типа на их языке это можно реализовать без всяких проблем, с которыми можно столкнуться в поем языке. ты же сам знаешь что на си и c++ можно отстрелить себе ногу ( как говориться ). как можно набираться опыта у js программиста, который учит не как на си это делать, а как это выглядит на js. ты хоть смотри с кем я спорю.
|
|
| |
afq | Дата: Воскресенье, 12 Января 2020, 08:08 | Сообщение # 350 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Блин, на хабре минусуют статью как всегда. )
Я ещё видео записал, только наверное плохо обдумал архитектуру примера. Но всё же пример рабочий. Я сделал так, что после каждого отправления события, очищаются данные. Но в реальном приложении такие данные врядли надо чистить. они наверное должны храниться в памяти или в базе данных. Посмотрите пожалуйста и напишите ваше мнение о таком способе, правильно ли я делаю или не правильно. Может советы какие нибудь. Может я что-то для себя интересное открою читая ваши комментарии.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 19:24 | Сообщение # 351 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| Xakep, а, ясно. все равно рисуется почему то один треугольник. а в каких то случаях рисовалось почти пол квадрата с разными цветами.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 16:07 | Сообщение # 352 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| Xakep, ну я подумал что на 9 это значит, что три компоненты, это одна точка в пространстве, 6 компонент, это две точки в пространстве. 9 компонент, это три точки в пространстве, а значит треугольник. Ну насчет glm::vec3 не знаю. Так как то удобней код организовать. указал размер массива, чтобы считать и считал в массив float и всё.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 08:33 | Сообщение # 353 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Захотелось даже статью на хабре написать. ))) habr
там я вроде объяснил чем удобно программирование на си с помощью такого паттерна наблюдателя.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 02:41 | Сообщение # 354 | Тема: реализация издателя и подписчика на си. |
Разработчик
Сейчас нет на сайте
| Написал я в общем это. На си мне как то больше нравиться как выглядит код, чем в ооп. Вдруг кому нужно, пожалуйста, скачивайте publisher
этот код работает глобально. то есть если есть один издатель TRADE, то он будет во всей программе. Можно из любой части получить данные от издателя. Имеется несколько функций упрощающее управление издателем. Можно например отписаться подписчику с определенными данными, а можно отписаться подписчику со всеми данными. То есть подписчик это функция. с помощью функции init_publisher можно указать к какому подписчику отправлять события. Можно подписаться одному и тому же подписчику с разными данными. Есть функция, которая убирает сразу подписчика со всеми данными. А есть функция, которая убирает всех подписчиков.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 01:52 | Сообщение # 355 | Тема: Знаете какие нибудь сервисы работающие на websocket? |
Разработчик
Сейчас нет на сайте
| Написал программу для работы с websocket. websocket_client. Хочу где нибудь применить. Пробывал на twitch, но там какие то заморочки с oauth2. то есть там есть возможность получить oauth с помощью управления на сайте. но чтобы подписаться на события в websocket, надо запросить права для oauth2, а это у меня не получается. да и вообще у меня проблема пока что с oauth2. он отсылает на другую страницу для получения токена. я не пойму как получить его. недавно подумал что надо загрузить эту страницу, но там возможно нужен js. короче проблема.
может вы знаете какие нибудь сервисы, которые используют websocket? я бы у себя на компьютере сделал бы информационные сервисы всякие, которые получают инфу из инета.
|
|
| |
afq | Дата: Суббота, 11 Января 2020, 00:36 | Сообщение # 356 | Тема: локальные сети и связь |
Разработчик
Сейчас нет на сайте
| sitx34, и что ты там купил?
|
|
| |
afq | Дата: Пятница, 10 Января 2020, 18:19 | Сообщение # 357 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| а понятно. для треугольника нужно 9 компонент. тогда надо делать на 9.
|
|
| |
afq | Дата: Пятница, 10 Января 2020, 18:13 | Сообщение # 358 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| Xakep,
Цитата Но как минимум ты делаешь опять ту же ошибку, что и в предыдущем примере - `length_v` нужно делить на 3 в `glDrawArrays`, т.к. у тебя 3 компонента на вершину. ну я не понимаю. а сколько тогда надо рисовать. если у меня допустим 6 компонентов?
|
|
| |
afq | Дата: Среда, 08 Января 2020, 23:53 | Сообщение # 359 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| Xakep, у меня ещё есть проблема с model.cpp. выложу сюда код. я загружаю модель obj формата. но этот формат изначально преобразую с помощью утилиты в tools. зря я наверное удалил примеры. там были объекты из blender. так вот. я проверял, все координаты правильно считываются. но проблема в том что рисуется только один треугольник. в gldrawarrays я задаю общее количество вершин поделенное на три. думаю так правильно рисовать треугольники. шейдер с тенями я пока не осилил, но есть книга где написано как тени делать, но мне пока не надо это. приведу пример шейдера без текстуры и исходника model.
Код #version 300 es layout ( location = 0 ) in vec3 position; layout ( location = 1 ) in vec3 normaly; layout ( location = 2 ) in vec4 color; uniform mat4 transform; uniform mat4 perspective; uniform mat4 rotate; out vec4 v_color;
void main ( ) { gl_Position = perspective * transform * vec4 ( position, 1.0 ); v_color = color; }
Код #version 300 es precision mediump float; in vec4 v_color; layout ( location = 0 ) out vec4 out_color; void main ( ) { out_color = v_color; }
Код #ifndef __MODEL_H__ #define __MODEL_H__ #include "../glm/glm.hpp" #include "../glm/ext.hpp" #include "sprite.h" #include "object.h" #include "types.h"
struct frame { unsigned int length_v; unsigned int length_vt; unsigned int length_vn;
float *v; float *vn; float *vt;
unsigned int current_length; };
struct with_t { int sampler_location; int transform_location; int perspective_location; int rotate_location; };
struct without_t { int transform_location; int perspective_location; int rotate_location; };
class Model : public Object { private: glm::mat4 proj; glm::mat4 view; glm::mat4 model; glm::mat4 rotate; glm::mat4 result;
glm::vec4 color;
struct frame *frames;
unsigned int current_frame;
unsigned int program_wit; unsigned int program_wiot;
struct with_t wit; struct without_t wiot;
unsigned int textureid;
friend void draw_with_texture ( Model * ); friend void draw_without_texture ( Model * );
void (*map) ( Model * );
public: int get_type ( ) { return Type::MODEL; } float x; float y; float z; Model ( ); void read_file ( const char *file ) override; void draw ( ) override; void set_color ( glm::vec4 color ); void switch_to ( void ); void transform ( const glm::vec3 &translate ); Sprite *texture; }; #endif
Код #include "model.h" #include <stdio.h> #include <string.h> #include "vars.h" #include "conf.h" #include "gl.h"
extern struct conf cf;
Model::Model ( ) { this->frames = nullptr; this->texture = nullptr;
float aspect = ( float ) cf.screen_width / ( float ) cf.screen_height;
this->proj = glm::perspective ( glm::radians ( 45.f ), aspect, 0.0f, 100.f ); this->view = glm::translate ( glm::mat4 ( 1.0f ), glm::vec3 ( 0.f, 0.f, 0.f ) ); this->model = glm::mat4 ( 1.0f ); this->rotate = glm::mat4 ( 1.0f );
this->current_frame = 0;
this->program_wit = cf.programs [ SHADER_MODEL_WITH_TEXTURE ]; this->program_wiot = cf.programs [ SHADER_MODEL_WITHOUT_TEXTURE ];
int error; glUseProgram ( this->program_wit ); this->wit.sampler_location = glGetUniformLocation ( this->program_wit, "s_texture" ); this->wit.transform_location = glGetUniformLocation ( this->program_wit, "transform" ); this->wit.perspective_location = glGetUniformLocation ( this->program_wit, "perspective" ); this->wit.rotate_location = glGetUniformLocation ( this->program_wit, "rotate" );
glUseProgram ( this->program_wiot ); this->wiot.transform_location = glGetUniformLocation ( this->program_wiot, "transform" ); this->wiot.perspective_location = glGetUniformLocation ( this->program_wiot, "perspective" ); this->wiot.rotate_location = glGetUniformLocation ( this->program_wiot, "rotate" ); }
void Model::transform ( const glm::vec3 &translate ) { this->x = translate.x; this->y = translate.y; this->z = translate.z; this->view = glm::translate ( this->model, translate ); }
void Model::set_color ( glm::vec4 color ) { this->color = color; }
void draw_with_texture ( Model *m ) { glUseProgram ( m->program_wit );
glActiveTexture ( GL_TEXTURE0 ); glBindTexture ( GL_TEXTURE_2D, m->textureid );
glUniform1i ( m->wit.sampler_location, 0 ); glUniformMatrix4fv ( m->wit.transform_location, 1, GL_FALSE, &m->view[0][0] ); glUniformMatrix4fv ( m->wit.perspective_location, 1, GL_FALSE, &m->proj[0][0] ); glUniformMatrix4fv ( m->wit.rotate_location, 1, GL_FALSE, &m->rotate[0][0] );
glEnableVertexAttribArray ( 0 ); glEnableVertexAttribArray ( 1 ); glEnableVertexAttribArray ( 2 );
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].v ); glVertexAttribPointer ( 1, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vn ); glVertexAttribPointer ( 2, 2, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vt );
glDrawArrays ( GL_TRIANGLES, 0, m->frames[m->current_frame].length_v );
glDisableVertexAttribArray ( 0 ); glDisableVertexAttribArray ( 1 ); glDisableVertexAttribArray ( 2 ); }
void draw_without_texture ( Model *m ) { glUseProgram ( m->program_wiot );
glUniformMatrix4fv ( m->wiot.transform_location, 1, GL_FALSE, &m->view[0][0] ); glUniformMatrix4fv ( m->wiot.perspective_location, 1, GL_FALSE, &m->proj[0][0] ); glUniformMatrix4fv ( m->wiot.rotate_location, 1, GL_FALSE, &m->rotate[0][0] );
glEnableVertexAttribArray ( 0 ); glEnableVertexAttribArray ( 1 ); glEnableVertexAttribArray ( 2 );
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].v ); glVertexAttribPointer ( 1, 3, GL_FLOAT, GL_FALSE, 0, m->frames[m->current_frame].vn ); glVertexAttribPointer ( 2, 4, GL_FLOAT, GL_FALSE, 0, &m->color[0] );
glDrawArrays ( GL_TRIANGLES, 0, m->frames[m->current_frame].current_length );
glDisableVertexAttribArray ( 0 ); glDisableVertexAttribArray ( 1 ); glDisableVertexAttribArray ( 2 ); }
void Model::switch_to ( ) { if ( this->texture ) this->map = draw_with_texture; else this->map = draw_without_texture; }
void Model::draw ( ) { this->map ( this ); }
void Model::read_file ( const char *file ) { int count;
char path[255] = { 0 }; snprintf ( path, 254, "%s/models/%s", DEFAULT_ASSETS, file ); FILE *fp = fopen ( path, "r" ); fread ( &count, sizeof ( int ), 1, fp ); this->frames = new struct frame [ count ];
for ( int i = 0; i < count; i++ ) { fread ( &this->frames[i].length_v, sizeof ( unsigned int ), 1, fp ); fread ( &this->frames[i].length_vt, sizeof ( unsigned int ), 1, fp ); fread ( &this->frames[i].length_vn, sizeof ( unsigned int ), 1, fp );
this->frames[i].current_length = this->frames[i].length_v / 3;
this->frames[i].v = new float [ this->frames[i].length_v ]; this->frames[i].vt = new float [ this->frames[i].length_vt ]; this->frames[i].vn = new float [ this->frames[i].length_vn ];
fread ( &this->frames[i].v[0], sizeof ( float ), this->frames[i].length_v, fp ); fread ( &this->frames[i].vn[0], sizeof ( float ), this->frames[i].length_vn, fp ); fread ( &this->frames[i].vt[0], sizeof ( float ), this->frames[i].length_vt, fp ); }
fclose ( fp ); }
|
|
| |
afq | Дата: Среда, 08 Января 2020, 11:10 | Сообщение # 360 | Тема: какой то глюк в opengl чтоли. |
Разработчик
Сейчас нет на сайте
| Xakep, спасибо.
|
|
| |
|