OOP in Pure C

แชร์
ฝัง
  • เผยแพร่เมื่อ 24 พ.ย. 2024

ความคิดเห็น • 204

  • @demolazer
    @demolazer 6 หลายเดือนก่อน +258

    I read the book clean Architecture. It has a great section near the beginning about programming paradigms where the author shows how you can implement all the OOP behavior in C. Very fascinating

    • @JoseDaviCorreiaPassos
      @JoseDaviCorreiaPassos 6 หลายเดือนก่อน

      ​​@@СергейДехтярёв-ъ4нjust read again and you Will find the nome of the book

    • @cslearn3044
      @cslearn3044 6 หลายเดือนก่อน

      Bruh ​@@СергейДехтярёв-ъ4н

    • @lowlevelcodingch
      @lowlevelcodingch 6 หลายเดือนก่อน

      @@СергейДехтярёв-ъ4н He literally said it

    • @AbdessamadBelm
      @AbdessamadBelm 6 หลายเดือนก่อน +4

      Can u please provide the full title of the book

    • @skeleton_craftGaming
      @skeleton_craftGaming 6 หลายเดือนก่อน +26

      People think this is some sort of Revelation, all of your OOLs compilers/interpreters are written in C [or c++ which's compiler was written in C originally]

  • @GaryChike
    @GaryChike 6 หลายเดือนก่อน +12

    Very nice! Reminds me of an article on Quora on "Object-Oriented Programming in C: A Deep Dive" by Khanno Mikhail:
    "...there are actually THREE ways to accomplish OOP in C (aptly named):
    Open style.
    Pointer style.
    and GTK style (GObject style).
    There are also three ways to apply function/method polymorphism in C as well:
    Struct style.
    Disjoint style.
    and Interface style ..."

  • @juanmamani2110
    @juanmamani2110 6 หลายเดือนก่อน +94

    absolutely agree with your phrase "you can do anything in C"

    • @garryiglesias4074
      @garryiglesias4074 6 หลายเดือนก่อน +3

      No, you can't do "generics" (meta programming).

    • @filip14528
      @filip14528 6 หลายเดือนก่อน

      @@garryiglesias4074 You could write a c program that inputs c code with generics and outputs c code

    • @gumz4183
      @gumz4183 6 หลายเดือนก่อน +5

      @@garryiglesias4074 the video is literally about implementing oop in C. You think the same can’t be done for generics?

    • @garryiglesias4074
      @garryiglesias4074 6 หลายเดือนก่อน +2

      @@gumz4183 Show me. Make some template, please.
      (Some context: I program in C for more than 30 years, and I've done full GUI in OOP/C for video games in 1997... So you won't be taken by surprise...)

    • @RandomGeometryDashStuff
      @RandomGeometryDashStuff 6 หลายเดือนก่อน

      @@garryiglesias4074macro like arena_da_append?

  • @tripplefives1402
    @tripplefives1402 6 หลายเดือนก่อน +33

    @30:36 I started learning C from reading the manual for LCC-win32 IDE as a PDF on an Palm PDA while on night shift. It even explained how to do win32 api stuff from scratch.

  • @miroaja1951
    @miroaja1951 6 หลายเดือนก่อน +103

    BREAKING NEWS: c programmer discovers dynamic dispatch in the lord's year 2024

  • @PhthaloJohnson
    @PhthaloJohnson 6 หลายเดือนก่อน +10

    A very interesting idea and quite elegant implementation! It's rather amazing that hot reloading can work so well in a typed and compiled language like C that doesn't have much features. I wish modern languages put some thought on making this a feature because it is so convenient for creating web servers, gui's and other highly interactive and visual applications.

  • @zetroks
    @zetroks 6 หลายเดือนก่อน +7

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

  • @neshkeev
    @neshkeev 6 หลายเดือนก่อน +15

    It only makes sense to define the Task struct's function members to accept Task itself so it looks similar to `self` in Python and besides you can call other task's functions from a Task's function

  • @asakhar
    @asakhar 6 หลายเดือนก่อน +10

    Tsoding, you don't actually need a dynamic array for vtable, or even register it at runtime, just store it in global library plain array variable and define it inplace. This way "dynamicness" is achieved through loading the lib itself, you just recompile the lib itself and vtable gets reloaded, then you just resolve it like you already do with function symbols. This way you can add vtable entries, but can't reorder or delete stuff from that just like in your implementation. I can provide an example via PR but unfortunately can't find public repo of panim, please consider making it public so people like me can f around with it)

    • @chri-k
      @chri-k 5 หลายเดือนก่อน +1

      That's actually a very good idea

  • @Do_It_Stupidly
    @Do_It_Stupidly 6 หลายเดือนก่อน +23

    I've been waiting for this for a loooong time😭

    • @garryiglesias4074
      @garryiglesias4074 6 หลายเดือนก่อน +1

      But it's a well known knowledge since the 70's...

  • @Jack_in_the
    @Jack_in_the 6 หลายเดือนก่อน +93

    are the captions the live chat?? that's cool af

    • @СергейФёдоров-щ8ш
      @СергейФёдоров-щ8ш 6 หลายเดือนก่อน +5

      Why do I need a chat if I came to watch/listen to the streamer. The streamer is interested in this, but the audience is not...

    • @nothappyz
      @nothappyz 6 หลายเดือนก่อน +1

      ​@@СергейФёдоров-щ8ш yeah this doesn't really make sense. Perhaps it's just a proof of concept

    • @adokce
      @adokce 6 หลายเดือนก่อน

      @@СергейФёдоров-щ8ш exactly why it's great. if anyone cares, they can turn on the captions. they are not hard-embedded in video

    • @lolcat69
      @lolcat69 6 หลายเดือนก่อน +15

      ​@@СергейФёдоров-щ8ш Maybe, just maybe, it's because in a stream, the streamer talks with the chat, and reads it, and people recommend him to do X or Y and he tells why yes or why not to do it that way, and if you can't read that then it makes no sense? Just saying

  • @user-hk3ej4hk7m
    @user-hk3ej4hk7m 6 หลายเดือนก่อน +85

    Wouldn't be a C video without a segfault 10 minutes in

    • @Brad_Script
      @Brad_Script 6 หลายเดือนก่อน +11

      you wouldn't be coding anything significant if you never get segfaults

    • @user-hk3ej4hk7m
      @user-hk3ej4hk7m 6 หลายเดือนก่อน

      ​@@Brad_Script Yes, in C you wouldn't. Anything remotely useful is segfault galore.

    • @araarathisyomama787
      @araarathisyomama787 6 หลายเดือนก่อน

      ​@@user-hk3ej4hk7m Is your OS a segfault galore?

    • @user-hk3ej4hk7m
      @user-hk3ej4hk7m 6 หลายเดือนก่อน +1

      ​@@araarathisyomama787 You must be confused, I don't develop OS'.
      Running production ready software is not the same as developing it.

  • @StevenMartinGuitar
    @StevenMartinGuitar 6 หลายเดือนก่อน +2

    Honestly seeing classes and virtual methods implemented in C was really freaking cool

  • @shakkar23
    @shakkar23 6 หลายเดือนก่อน +2

    For the tag implementation, you can make the tag an enum, as well as make the data a union of pointers to the types that inherit it, this allows the vtable to be off of the heap as you now know the size in compile time, as well as you can use designated initializers to have a more well defined offset of all of the pointers for your vtable.

    • @Adoblem
      @Adoblem 6 หลายเดือนก่อน

      😊😊😊😊😊😊

  • @DVRC
    @DVRC 6 หลายเดือนก่อน

    Looking at old codebases I've seen many cases of OOP in C:
    - Sun Pixrect is a low level library for drawing on the framebuffer, and for each framebuffer there is a different implementation. At the creation of a Pixrect object, it is dispatched with the function table to manipulate it
    - Still from Sun, X/NeWS has a graphics library called Shapes, that replaced the CScript (the PostScript graphic layer) + Pixrect combo, and it has plenty of macros to declare classes in C and dispatch all the methods. This package handles shapes, paths and framebuffers
    - At CMU, a preprocessor called "Class" was made for the Andrew project. It enriched C with Object-Oriented specific syntax (similar but different from both C++ and Objective C). I guess this was used for the Andrew Toolkit and other applications of the suite

  • @john.darksoul
    @john.darksoul 6 หลายเดือนก่อน +9

    Where is the book, Zozin? Where is it? You'd never give it to an ordinary citizen!

    • @martinparrish5392
      @martinparrish5392 6 หลายเดือนก่อน +1

      There is no book, only Zuul!

  • @AloisMahdal
    @AloisMahdal 6 หลายเดือนก่อน +2

    A huge problem with OOP is that virtually all basic tutorials go right away into stuff like inheritance and abstract classes, but in reality you should avoid that as much as possible (use interfaces and composition in 99% of cases). Then there's a ton of stuff such as composition, solid and "OOP design patterns" and *some* part of Clean Code... Lot of it is actually useful and applicable to most languages, OOP or not.

  • @ThatGuy-fq8cn
    @ThatGuy-fq8cn 6 หลายเดือนก่อน +3

    Congrats you invented GObject

  • @pyajudeme9245
    @pyajudeme9245 5 หลายเดือนก่อน +3

    "You can do anything in C" - Since (almost) everything is made in C, I guess you are right. hahaha If there are programming structures that are not available in C, one can write his/her own programming language in C, and call it something like "Python"," Ruby", "C++" or "Perl" - This is how it has been done since 1972. At the end stands (almost) always C.

  • @blastygamez
    @blastygamez 6 หลายเดือนก่อน +22

    Nice, see all you need is C and a Tsoding

    • @OCTAGRAM
      @OCTAGRAM 6 หลายเดือนก่อน

      When Tsoding does C, it's not C but Ts

  • @bbq1423
    @bbq1423 6 หลายเดือนก่อน +5

    The boilerplate in C for the animal example could have been a bit smaller if you would have stuck to what C++ does a bit closer. In C++ it would inline the dog and cat data into the same allocation as for animal, meaning Animal effectively becomes a "Animal_Methods**" with some extra data to the right of it. Dog and Cat would also need the vtable pointer in the struct definitions, but this could be mitigated via the use of the butterfly technique in the utility methods. Initialization code for the tags could also be simplified if you used the C++ approach.

  • @SaidMetiche-qy9hb
    @SaidMetiche-qy9hb 6 หลายเดือนก่อน +4

    Now your bottleneck is the compiler being slow lol

  • @SeasonalMike1
    @SeasonalMike1 6 หลายเดือนก่อน +30

    Why did i click this video. Obviously i'm not gonna watch a 2 hour video at 12:57pm, also i have to wake up at 7am for school.

    • @aemogie
      @aemogie 6 หลายเดือนก่อน +2

      am?

    • @sortof3337
      @sortof3337 6 หลายเดือนก่อน +3

      @@aemogie its literally 1 am. his brain is clearly borked. :)

    • @aidennwitz
      @aidennwitz 6 หลายเดือนก่อน +1

      how did not watching the video go?

    • @Maverick56912
      @Maverick56912 6 หลายเดือนก่อน +1

      you're so lucky. I've to wake up at 6am 😢

    • @SeasonalMike1
      @SeasonalMike1 6 หลายเดือนก่อน +1

      @@aidennwitz pretty cool, decided to watch a minecraft creepypasta at 2am instead :)

  • @NotherPleb
    @NotherPleb 4 หลายเดือนก่อน

    Well, a understand where the gatekeeping accusations come from. When people ask that kind of stuff it's not like they don't know how to search on the internet, it's more what to search, they want some advice about where to start looking because they are overwhelmed. They want a good root concept that branches to other concepts to learn, if you start at a leaf it's confusing, and often you find your way up to the root yourself, but it takes more time and it's more painful. I guess they can search for that advice on the internet too, but if they come to you it's because they trust your advice.

  • @theevilcottonball
    @theevilcottonball 6 หลายเดือนก่อน +1

    I just discovered that Chat is in the subtitles. Make of that what you will.

  • @kaotiskhund
    @kaotiskhund 6 หลายเดือนก่อน +2

    Thank you! For inspiration and laughs! Proposal: maybe animals poop in various places. Abstract the toilet?

  • @snowcrash-
    @snowcrash- 6 หลายเดือนก่อน +1

    I love your content dude it's just so good.

  • @MyriadColorsCM
    @MyriadColorsCM 6 หลายเดือนก่อน +4

    Unfathomably cool.

  • @alexw5093
    @alexw5093 2 หลายเดือนก่อน

    1:17:42 I could not stop laughing from this point on. Well done sir. Well done.

  • @oserodal2702
    @oserodal2702 29 วันที่ผ่านมา

    EOLang dude just rediscovered Smalltalk (without the images).

  • @jannemyllyla1223
    @jannemyllyla1223 6 หลายเดือนก่อน

    This kind of code not only exists, it is being standarized (there is upcoming ble smart toilet profile).

  • @matthijshebly
    @matthijshebly 6 หลายเดือนก่อน

    Professor Dr Tsoding, lead researcher in the field of Scatology

  • @OCTAGRAM
    @OCTAGRAM 6 หลายเดือนก่อน

    The most advanced OOP in C was in IBM System Object Model

  • @pedrokalil4410
    @pedrokalil4410 6 หลายเดือนก่อน

    Oh my god, you launched this video right as i am making async oop in C. Tho i am making it more as an general purpose language (i think i will create my lang and transpile to this subset of c i created)

  • @satyajeetjena6758
    @satyajeetjena6758 6 หลายเดือนก่อน +4

    2 uploads in one day😮😮😮😮

  • @RockyDesigne
    @RockyDesigne 5 หลายเดือนก่อน

    Yo, very informative vid, you're a great teacher, thanks!

  • @bbq1423
    @bbq1423 6 หลายเดือนก่อน +1

    Now that you have a way to run tasks in parallel.. Time for multicore support in nob?

  • @Nop_90h
    @Nop_90h 5 หลายเดือนก่อน

    you reinvented tweens! gz your prize is VELOSIPED

  • @SeishukuS12
    @SeishukuS12 6 หลายเดือนก่อน

    I played around with something similar a number of years ago, it's kinda fun... Not *super* practical, but fun.
    Though these days, I do still kind of lay out my data and functions in a similar manner, just without the "virtual functions"/function pointers... So if I ever become unlazy, I can just toss everything into classes and be with the hipsters and use C++. :D

  • @zeno7905
    @zeno7905 6 หลายเดือนก่อน +1

    GATEKEEPER!! Give me the book NOW!!!

  • @ooichu_
    @ooichu_ 2 หลายเดือนก่อน

    Всё, что необходимо для реализации ООП в C, - это макрос container_of().

  • @thehady1
    @thehady1 6 หลายเดือนก่อน

    I like this guy irl like this guy ! Keep it up bro

  • @tandeepdas9211
    @tandeepdas9211 6 หลายเดือนก่อน

    The best reply from the Gate_Keeper👍

  • @ahmadzaklouta
    @ahmadzaklouta หลายเดือนก่อน

    what is the name of the previous stream (the animation programming engine)

  • @drdca8263
    @drdca8263 6 หลายเดือนก่อน

    56:06 : I don’t understand why registering task wait wasn’t just added to the task_vtable_rebuild procedure?

  • @ahmadzaklouta
    @ahmadzaklouta 6 หลายเดือนก่อน

    Do you have any videos explaining OOP in C and desing pattern from the beginning

  • @kibels894
    @kibels894 6 หลายเดือนก่อน

    Nice that turned out really clean.

  • @RandomGeometryDashStuff
    @RandomGeometryDashStuff 6 หลายเดือนก่อน

    59:15 by "no code" do you mean Node_graph_architecture (wikipedia)?

  • @leshommesdupilly
    @leshommesdupilly 6 หลายเดือนก่อน

    Man, I can't wait to see c adding classes

  • @tripplefives1402
    @tripplefives1402 6 หลายเดือนก่อน +2

    What do we do if the toilet code has a stack overflow?

  • @kibels894
    @kibels894 6 หลายเดือนก่อน

    Could you also solve it by getting the arena from the main executable's memory space? Or does that only ensure the pointers aren't unreachable, but they will still be garbage after reloading?

  • @santitabnavascues8673
    @santitabnavascues8673 5 หลายเดือนก่อน

    In fact C++ is just a huge template over C 🤣

  • @skeleton_craftGaming
    @skeleton_craftGaming 6 หลายเดือนก่อน +2

    C++ is not an object oriented language, you can do oop like things in c++ but when you strip away the abstractions you just get C [which is why it is so fast; I say in regards to objects specifically]
    A C++ programmer... Thats who wrote the Vtable wiki page...

  • @kikawet
    @kikawet 6 หลายเดือนก่อน

    Is there any source code access so far? I am struggling a bit following all these concepts about virtual tables and wanted to take a look into it directly

  • @CoderDBF
    @CoderDBF 6 หลายเดือนก่อน

    Dude, seriously, I would buy your book.

  • @jiraibozo
    @jiraibozo 6 หลายเดือนก่อน

    0:08 The APNIM

  • @velikanskaglava2087
    @velikanskaglava2087 6 หลายเดือนก่อน

    Thank you!

  • @z0rdex701
    @z0rdex701 5 หลายเดือนก่อน

    the folder name is magnificent

  • @johnsonogbu8697
    @johnsonogbu8697 6 หลายเดือนก่อน

    I left python to be here. I want to know and learn how it all started. Thank you tsoding.

  • @gempf
    @gempf 2 หลายเดือนก่อน

    which is the previous video from this serie?

  • @kenneth_romero
    @kenneth_romero 6 หลายเดือนก่อน

    i tried doing this with specialized types with Odin but for a game framework. couldn't get it working though, probably misunderstood something.

  • @hubstrangers3450
    @hubstrangers3450 6 หลายเดือนก่อน

    Thank you....

  • @_ami_dad_3289
    @_ami_dad_3289 6 หลายเดือนก่อน

    using enum for indexs and naming of methods seems to be easier for me

  • @johnnysmith4714
    @johnnysmith4714 2 หลายเดือนก่อน +1

    Yo just write 1000s more lines of code so you can do object.do_stuff() instead of do_stuff(object).
    OOP is a meme.

  • @ddruganov
    @ddruganov 6 หลายเดือนก่อน

    it seems as though you do not use any kind of lsp, is that intentional?

  • @constant_teen9774
    @constant_teen9774 5 หลายเดือนก่อน

    what is !g for at the end of search bar at 1:04:22?

  • @error-4518
    @error-4518 6 หลายเดือนก่อน

    zozin should write a book about how to google, name it "art of googling" or something.

  • @Toby-ve6gp
    @Toby-ve6gp 2 หลายเดือนก่อน

    wtf is the second half of the stream?! lmfao.

  • @delicious_seabass
    @delicious_seabass 6 หลายเดือนก่อน +1

    Heresy!

  • @vkatasonov
    @vkatasonov 6 หลายเดือนก่อน

    Не буду спрашивать почем и откуда «стимуляторы», но программируя на Си всего полгодика чистого времени, понимаю, что с Си и сознание расширять не надо;)

  • @anon_y_mousse
    @anon_y_mousse 6 หลายเดือนก่อน

    Honestly, at this point it's kind of scary how similar my data structures library was to your OO in C code. Also, quite similar to the code I would hand students that asked for homework help in the chat room I frequented. For some reason, they were constantly asking for help with linked lists. So I wrote a joke implementation which perfectly demonstrated the concept and worked without any errors but was a giant stream of FOAD's in various forms and at one point even had a little poem. I really miss Yahoo chat rooms. Those were some of the best times I spent online. Even found a really awesome MUD through various people back then. I really wish I could remember the address or name of it because it was an amazingly detailed MUD that allowed you to dismember your enemies and even cook their bits over a fire. Who knows, maybe I'll write one myself.
    As to the original subject, I think you should write a proper animations programming language and implement a VM to run it. I already know you won't, but I think you should.

  • @чистюля-л2и
    @чистюля-л2и 6 หลายเดือนก่อน +1

    Как ты зумишь экран?

  • @ddruganov
    @ddruganov 6 หลายเดือนก่อน

    1:14:33 bruh that caught me off guard

  • @levvayner4509
    @levvayner4509 6 หลายเดือนก่อน

    I have full control of what languages I use, what paradigms I use, etc. And OOP is not click-bait; it is a very logical way to program, creating analogies from the real world of objects that have properties and actions or methods.
    I didn't watch the whole podcast, but if you wanted to write your squares as OOP,
    The squares would contain their own position on the screen, and expose methods like Move(x,y) Color(color) and whatever else you'd want to do with them.

  • @RatanBasak-f8h
    @RatanBasak-f8h 4 วันที่ผ่านมา

    Why don't you build an OS

  • @ceruleansky6670
    @ceruleansky6670 3 หลายเดือนก่อน

    Just make an OS at this point that uses your own libraries and framework to create a system that does exactly what you want from the ground up.

  • @TheBusttheboss
    @TheBusttheboss 6 หลายเดือนก่อน

    Based Emacs user.

  • @xProsek
    @xProsek 6 หลายเดือนก่อน

    13:18 ofc we know vtable ;P
    26:33 maybe 2d and 4d to make it obv for newbies
    Thx

  • @VictorPK100
    @VictorPK100 6 หลายเดือนก่อน +1

    Do not try and read the book. That's impossible. Instead... only try to realize the truth. There is no book.

  • @skittle72
    @skittle72 6 หลายเดือนก่อน +9

    hell nah💀

  • @YASYTU
    @YASYTU 5 หลายเดือนก่อน

    And all that work for nothing. He should have stopped and thought about what he es setting out to do, to realize that this is a waste of time. You do not want OOP.

  • @nil0bject
    @nil0bject 6 หลายเดือนก่อน +1

    i hate that vtable thing. just use generic objects instead of reinventing the wheel for everything

  • @mjpthetrucker9485
    @mjpthetrucker9485 14 วันที่ผ่านมา

    You will need pointers. 😂

  • @brambasiel
    @brambasiel 6 หลายเดือนก่อน +1

    1:31:27 out of context zozin when?

  • @xarax7950
    @xarax7950 6 หลายเดือนก่อน

    How did you make constructor and destructor in C ??? video is long ...

    • @IgneousGorilla
      @IgneousGorilla 6 หลายเดือนก่อน

      Probably malloc and free? Lol

    • @xarax7950
      @xarax7950 6 หลายเดือนก่อน

      ​@@IgneousGorillamalloc free MANUALY it's not a constructor and destructor !

    • @tripplefives1402
      @tripplefives1402 6 หลายเดือนก่อน

      @@xarax7950 You have to allocate the struct first then invoke an init function, which can be placed inside of a create function so you invoke one function which performs the task of being a constructor.

    • @javierflores09
      @javierflores09 6 หลายเดือนก่อน

      @@xarax7950 how are constructor and destructors not manual, there's nothing automatic about them

    • @BetaChri5
      @BetaChri5 หลายเดือนก่อน

      ​@@javierflores09well eg in C++ they get called automatically when an object enters/leaves scope, also the compiler derives default constructors for classes. That what they mean I think

  • @nyyakko
    @nyyakko 6 หลายเดือนก่อน +1

    Pog

  • @GiammarcoAgazzotti
    @GiammarcoAgazzotti 6 หลายเดือนก่อน

    very cool C stuff and a very good programming exercise as long as you just want to fiddle around and have fun. for any real world need c++ has you covered in a safer way already (and I'm sure we all know this)

  • @tianned
    @tianned 6 หลายเดือนก่อน

    That’s so cool omg

  • @Randy_McShandy
    @Randy_McShandy 6 หลายเดือนก่อน

    Hot reloading AKA Shared Object Oriented Programming, we love SOOP

  • @leshommesdupilly
    @leshommesdupilly 6 หลายเดือนก่อน +1

    You should call it "c = c + 1"

  • @BugbountyPOCs41
    @BugbountyPOCs41 6 หลายเดือนก่อน

    i see arch with dwm

  • @walkertest7503
    @walkertest7503 6 หลายเดือนก่อน

    Wait it's all struct...

  • @valshaped
    @valshaped 6 หลายเดือนก่อน +1

    Nice object oriented shitposting

  • @newbiex11
    @newbiex11 6 หลายเดือนก่อน

    it's not easy to just use c++?

  • @OneMilian
    @OneMilian 6 หลายเดือนก่อน

    I don't need as much specific programming paradigm's as i need good filenames and a clean order.
    Edit: specific

  • @mashroom_
    @mashroom_ 6 หลายเดือนก่อน +1

    just use Vala bruv

  • @sabitkondakc9147
    @sabitkondakc9147 6 หลายเดือนก่อน

    I love C, however freedom has consequences.

  • @JoshuaF.
    @JoshuaF. 6 หลายเดือนก่อน

    what a da fu

  • @twitchy9948
    @twitchy9948 6 หลายเดือนก่อน

    I lost it at 1:50:50 XD

  • @pemrograman-cepat3393
    @pemrograman-cepat3393 6 หลายเดือนก่อน

    Bro, can you make chess engine in C? Chess is happening right now 😅