Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. I like C more than I thought I would

I like C more than I thought I would

Scheduled Pinned Locked Moved The Lounge
c++wpfiot
50 Posts 20 Posters 1 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D David ONeil

    Thank you. That makes sense. I hate it!

    Our Forgotten Astronomy | Object Oriented Programming with C++ | Wordle solver

    D Offline
    D Offline
    den2k88
    wrote on last edited by
    #25

    I hate it so much. And I like VisualStudio because at lerast since 2008, maybe before but after VisualStudio 6, it allowed mixing C++ syntax in C source so we could do without a lot of old C absurdities. Also C99 fixed a lot of these inconsistencies, but MS headers were written long before it.

    GCS/GE d--(d) s-/+ a C+++ U+++ P-- L+@ E-- W+++ N+ o+ K- w+++ O? M-- V? PS+ PE Y+ PGP t+ 5? X R+++ tv-- b+(+++) DI+++ D++ G e++ h--- r+++ y+++*      Weapons extension: ma- k++ F+2 X

    1 Reply Last reply
    0
    • H honey the codewitch

      I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

      To err is human. Fortune favors the monsters.

      I Offline
      I Offline
      inlandchris1
      wrote on last edited by
      #26

      I too is the same, started in C language in 1992 and in a few years, I graduated to C++ and I loved it. However, my last project included over 400,000 lines of MFC/C++ code and a lot of memory. So much memory (CStrings!) it would crash in 2 weeks for no reason. I finally figured out that the CStrings were eating up memory. I changed most of the CStrings with common C language variables (static arrays [], chars etc). More work but running smoothly.

      H 1 Reply Last reply
      0
      • H honey the codewitch

        I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

        To err is human. Fortune favors the monsters.

        G Offline
        G Offline
        giulicard
        wrote on last edited by
        #27

        Another good argument for using C++ templates is its capability to "inject" code into algorithms. I mean that C is forced to use callbacks to expand the functionality of the algorithms: with C++ you can pass the "portion" of the algorithm that extends the functionality of the base algorithm as a template argument to a template parameter. Functors (or lambdas, they are the same beast) which has code declared inline, it is generally injected into the template of the base algorithm. For example, the classic C library qsort algorithm, ignoring the fact that it forces you to play dangerously with casts to connect arguments to the callback function parameters, produces a function call for each comparison. If the algorithm (which is never a pure qsort but is a modified version, e.g. introsort) has to do with many elements and the compare function is inexpensive, it turns out that the biggest waste of time is in the invocation of the callback. In fact, especially when dealing with processors without caches or sophisticated branch prediction mechanisms, which is almost always the case with small MCUs, a function call can cost a lot. This means that, apart from code bloating (which with modern MCUs is no longer a big problem since they have a lot of Flash), C++ is often faster than C, unless a C programmer writes everything by hand and doesn't use any library facility. This gives the possibility to use the just-ready STL or Boost algorithms that do not need exceptions or dynamic allocation, customizing them efficiently. I want to remind all of you that usually the above code is written better than we could do and, in general, it is already debugged. And yes, using custom allocators and the placement-new operator, C++ can do what C does and many times it does even better: that is, C++, with a little care, can be happily used on small embedded systems. Cheers

        H 1 Reply Last reply
        0
        • G giulicard

          Another good argument for using C++ templates is its capability to "inject" code into algorithms. I mean that C is forced to use callbacks to expand the functionality of the algorithms: with C++ you can pass the "portion" of the algorithm that extends the functionality of the base algorithm as a template argument to a template parameter. Functors (or lambdas, they are the same beast) which has code declared inline, it is generally injected into the template of the base algorithm. For example, the classic C library qsort algorithm, ignoring the fact that it forces you to play dangerously with casts to connect arguments to the callback function parameters, produces a function call for each comparison. If the algorithm (which is never a pure qsort but is a modified version, e.g. introsort) has to do with many elements and the compare function is inexpensive, it turns out that the biggest waste of time is in the invocation of the callback. In fact, especially when dealing with processors without caches or sophisticated branch prediction mechanisms, which is almost always the case with small MCUs, a function call can cost a lot. This means that, apart from code bloating (which with modern MCUs is no longer a big problem since they have a lot of Flash), C++ is often faster than C, unless a C programmer writes everything by hand and doesn't use any library facility. This gives the possibility to use the just-ready STL or Boost algorithms that do not need exceptions or dynamic allocation, customizing them efficiently. I want to remind all of you that usually the above code is written better than we could do and, in general, it is already debugged. And yes, using custom allocators and the placement-new operator, C++ can do what C does and many times it does even better: that is, C++, with a little care, can be happily used on small embedded systems. Cheers

          H Offline
          H Offline
          honey the codewitch
          wrote on last edited by
          #28

          Absolutely, although I would not use STL and and Boost on most IoT class MCUs, and the reason his heap fragmentation. When you're dealing with say 360KB of usable SRAM (the amount available for use on an ESP32) or less, the struggle is real. STL just takes a big steamer all over your heap.

          To err is human. Fortune favors the monsters.

          G 1 Reply Last reply
          0
          • I inlandchris1

            I too is the same, started in C language in 1992 and in a few years, I graduated to C++ and I loved it. However, my last project included over 400,000 lines of MFC/C++ code and a lot of memory. So much memory (CStrings!) it would crash in 2 weeks for no reason. I finally figured out that the CStrings were eating up memory. I changed most of the CStrings with common C language variables (static arrays [], chars etc). More work but running smoothly.

            H Offline
            H Offline
            honey the codewitch
            wrote on last edited by
            #29

            Well, to be clear, I started with C++, not C, but yeah. =) CString, std::string and the like are a mess.

            To err is human. Fortune favors the monsters.

            1 Reply Last reply
            0
            • H honey the codewitch

              Absolutely, although I would not use STL and and Boost on most IoT class MCUs, and the reason his heap fragmentation. When you're dealing with say 360KB of usable SRAM (the amount available for use on an ESP32) or less, the struggle is real. STL just takes a big steamer all over your heap.

              To err is human. Fortune favors the monsters.

              G Offline
              G Offline
              giulicard
              wrote on last edited by
              #30

              honey the codewitch wrote:

              Absolutely, although I would not use STL and and Boost on most IoT class MCUs, and the reason his heap fragmentation.

              I understand, but I wasn't talking about STL containers: I was talking about "algorithms". Many ready-to-use algorithms only work on data in place. However, you can use STL algorithms on standard C arrays (basically pointers are "random access iterators", intended as the category, aren't they?). If you like templates can always use std::array which has zero overhead with respect C array.

              honey the codewitch wrote:

              When you're dealing with say 360KB of usable SRAM (the amount available for use on an ESP32) or less, the struggle is real. STL just takes a big steamer all over your heap.

              I started programming MCUs like 6805 in pure assembly up to MC68000 in "pure C". So I know well what are you talking about. :) Regards.

              H 1 Reply Last reply
              0
              • G giulicard

                honey the codewitch wrote:

                Absolutely, although I would not use STL and and Boost on most IoT class MCUs, and the reason his heap fragmentation.

                I understand, but I wasn't talking about STL containers: I was talking about "algorithms". Many ready-to-use algorithms only work on data in place. However, you can use STL algorithms on standard C arrays (basically pointers are "random access iterators", intended as the category, aren't they?). If you like templates can always use std::array which has zero overhead with respect C array.

                honey the codewitch wrote:

                When you're dealing with say 360KB of usable SRAM (the amount available for use on an ESP32) or less, the struggle is real. STL just takes a big steamer all over your heap.

                I started programming MCUs like 6805 in pure assembly up to MC68000 in "pure C". So I know well what are you talking about. :) Regards.

                H Offline
                H Offline
                honey the codewitch
                wrote on last edited by
                #31

                Fair enough. When you said algorithms I thought you were including things like hashtables.

                To err is human. Fortune favors the monsters.

                1 Reply Last reply
                0
                • Greg UtasG Greg Utas

                  I'd guess that the mantra "C is for embedded" is mostly because of legacy systems. There was also Embedded C++, which removed templates, exceptions, and RTTI. Memory is now so cheap that C is only justified in small systems. I wouldn't sign onto a C project unless the team was small and disciplined. The risk of dealing with hacked-together code is simply too great. "Embedded" is a broad spectrum. At the toaster end, C is fine, but it quickly becomes unjustified as one moves away from that.

                  Robust Services Core | Software Techniques for Lemmings | Articles
                  The fox knows many things, but the hedgehog knows one big thing.

                  U Offline
                  U Offline
                  User 13269747
                  wrote on last edited by
                  #32

                  Quote:

                  I'd guess that the mantra "C is for embedded" is mostly because of legacy systems. There was also Embedded C++, which removed templates, exceptions, and RTTI. Memory is now so cheap that C is only justified in small systems.

                  I tend to enforce it on my teams the other way around: provide a real justification for using C++ over C. It becomes very hard to justify using C++ over C for embedded projects that cannot use exceptions, as at that point you're into real implementation-defined behaviour which changes with the compiler being used, or even the flags passed to it. When C is not suitable for some problem space, I don't find myself reaching for C++ because there are much nicer languages. C++ is in this weird position - for very small embedded systems, C is better, for very large embedded systems (SBCs, for example), any other high-level language can be used. For uncrippled C++, the target needs to be larger than atmega level and smaller than Raspberry Pi level. Not a lot of need in that particular niche.

                  Quote:

                  I wouldn't sign onto a C project unless the team was small and disciplined. The risk of dealing with hacked-together code is simply too great.

                  I would. C is one of the easier languages to unf***k. A C++ project that was hacked together can be very difficult to reason about (OTOH, A Lisp project that was hacked together may as well be thrown away)

                  Greg UtasG 1 Reply Last reply
                  0
                  • H honey the codewitch

                    I do like overloading and increased type safety, but those are things you can find in other languages. And sure C# has generics but it's just not the same. I can make the C++ compiler dance the tango in a way I just can't with any other language, and it's not me - it's the compiler. Metaprogramming, for example. There's nothing else that really compares to it, at least not in common use. So that's why I miss them, and why they stand out to me. You can't do it in other languages. It sets C++ apart.

                    To err is human. Fortune favors the monsters.

                    U Offline
                    U Offline
                    User 13269747
                    wrote on last edited by
                    #33

                    Quote:

                    You can't do it in other languages. It sets C++ apart.

                    You could do more metaprogramming stuff in Lisp in the 80s than you can do, right now, with C++ templates. I used to use Lisp quite often (SBCL, sometimes gcl/ecl), and find C++ templates a poor substitute for AST manipulation.

                    H 1 Reply Last reply
                    0
                    • H honey the codewitch

                      I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

                      To err is human. Fortune favors the monsters.

                      M Offline
                      M Offline
                      Martin ISDN
                      wrote on last edited by
                      #34

                      "Also, using the preprocessor freely is kind of liberating" C will set you free. the oldest dogmas i've heard were: goto is evil and macros are evil i remember you once said (probably here on The Lounge) that you prefer C++ and even that you work with it like it is C# (translating C++ to C# in your head and vice versa) what i don't like about C is the standards. there are nice things in every standard that benefit, but they push with the Undefined Behavior as a way to shame and discipline the coder. what the creators of C didn't put in the language, they try to force thru the standards the spirit of C is kind of hippie, uncertain. that made me search for the first edition of The C Programming Language: "C is a general-purpose programming language with features economy of expression...", "its absence of restrictions and its generality make it more convenient and effective for many tasks than supposedly more powerful languages." "...the run-time library required to implement self-contained programs is tiny.", "...efficient enough that there is no compulsion to write assembly language instead." - this seems like something that is not important now, but lets think of the energy consumption. "Existing compilers provide no run-time checking of array subscripts, argument types, etc." - wooow, you just put an int where the function takes a float, the sizeof float bytes are copied from the address of the integer object to the stack frame. the function treats the data as float. the most astonishing for me has always been "The arguments to functions are passed by copying the value of the argument, and it is impossible for the called function to change the actual argument in the caller", i interpret as Ritchie's intention towards pure functions. yes, you can pass Person's pointer to a function, but the default is passing a copy of Person. i chose C because it doesn't change, although C++ was my first choice. C++ now changes every 3 years? i cannot even recognize the language. anyway, i'm not a competent programmer.

                      H 2 Replies Last reply
                      0
                      • U User 13269747

                        Quote:

                        You can't do it in other languages. It sets C++ apart.

                        You could do more metaprogramming stuff in Lisp in the 80s than you can do, right now, with C++ templates. I used to use Lisp quite often (SBCL, sometimes gcl/ecl), and find C++ templates a poor substitute for AST manipulation.

                        H Offline
                        H Offline
                        honey the codewitch
                        wrote on last edited by
                        #35

                        That's fair, but LISP isn't really in common usage, so there's that. TBH, I didn't know LISP allowed you to do that.

                        To err is human. Fortune favors the monsters.

                        1 Reply Last reply
                        0
                        • M Martin ISDN

                          "Also, using the preprocessor freely is kind of liberating" C will set you free. the oldest dogmas i've heard were: goto is evil and macros are evil i remember you once said (probably here on The Lounge) that you prefer C++ and even that you work with it like it is C# (translating C++ to C# in your head and vice versa) what i don't like about C is the standards. there are nice things in every standard that benefit, but they push with the Undefined Behavior as a way to shame and discipline the coder. what the creators of C didn't put in the language, they try to force thru the standards the spirit of C is kind of hippie, uncertain. that made me search for the first edition of The C Programming Language: "C is a general-purpose programming language with features economy of expression...", "its absence of restrictions and its generality make it more convenient and effective for many tasks than supposedly more powerful languages." "...the run-time library required to implement self-contained programs is tiny.", "...efficient enough that there is no compulsion to write assembly language instead." - this seems like something that is not important now, but lets think of the energy consumption. "Existing compilers provide no run-time checking of array subscripts, argument types, etc." - wooow, you just put an int where the function takes a float, the sizeof float bytes are copied from the address of the integer object to the stack frame. the function treats the data as float. the most astonishing for me has always been "The arguments to functions are passed by copying the value of the argument, and it is impossible for the called function to change the actual argument in the caller", i interpret as Ritchie's intention towards pure functions. yes, you can pass Person's pointer to a function, but the default is passing a copy of Person. i chose C because it doesn't change, although C++ was my first choice. C++ now changes every 3 years? i cannot even recognize the language. anyway, i'm not a competent programmer.

                          H Offline
                          H Offline
                          honey the codewitch
                          wrote on last edited by
                          #36

                          Martin ISDN wrote:

                          C will set you free. the oldest dogmas i've heard were: goto is evil and macros are evil

                          There's a time and a place for nearly everything (except Python :-D ). Macros make certain impossible things possible in C, like conditionally compiling code for different platforms, or setting compile time configuration parameters in the absence of templates. Gotos are pretty handy for state machines, where higher level constructs don't work because you can't jump in and out of while loops.

                          Martin ISDN wrote:

                          the most astonishing for me has always been "The arguments to functions are passed by copying the value of the argument, and it is impossible for the called function to change the actual argument in the caller"

                          I'm surprised this astonished you, as it's the default in most any programming language including asm, where the most natural way to call is to put a *copy* of a value in a register or onto the stack. Indeed to pass by reference you need to put the *address* of the object in a register or on the stack. BASIC facilitates this using the Byref keyword, C# with the ref and out keywords, but it's pretty much always extra typing. The exception is arrays including strings, because you *reference* them (in C by referencing the first element), and while in theory you could push each element onto the stack in practice that's prohibitive.

                          To err is human. Fortune favors the monsters.

                          M 1 Reply Last reply
                          0
                          • M Martin ISDN

                            "Also, using the preprocessor freely is kind of liberating" C will set you free. the oldest dogmas i've heard were: goto is evil and macros are evil i remember you once said (probably here on The Lounge) that you prefer C++ and even that you work with it like it is C# (translating C++ to C# in your head and vice versa) what i don't like about C is the standards. there are nice things in every standard that benefit, but they push with the Undefined Behavior as a way to shame and discipline the coder. what the creators of C didn't put in the language, they try to force thru the standards the spirit of C is kind of hippie, uncertain. that made me search for the first edition of The C Programming Language: "C is a general-purpose programming language with features economy of expression...", "its absence of restrictions and its generality make it more convenient and effective for many tasks than supposedly more powerful languages." "...the run-time library required to implement self-contained programs is tiny.", "...efficient enough that there is no compulsion to write assembly language instead." - this seems like something that is not important now, but lets think of the energy consumption. "Existing compilers provide no run-time checking of array subscripts, argument types, etc." - wooow, you just put an int where the function takes a float, the sizeof float bytes are copied from the address of the integer object to the stack frame. the function treats the data as float. the most astonishing for me has always been "The arguments to functions are passed by copying the value of the argument, and it is impossible for the called function to change the actual argument in the caller", i interpret as Ritchie's intention towards pure functions. yes, you can pass Person's pointer to a function, but the default is passing a copy of Person. i chose C because it doesn't change, although C++ was my first choice. C++ now changes every 3 years? i cannot even recognize the language. anyway, i'm not a competent programmer.

                            H Offline
                            H Offline
                            honey the codewitch
                            wrote on last edited by
                            #37

                            I should add, I agree with you about C++ changes being frustrating, but I lean on the -std=c++17 compiler option. :) as it gives me a good mix of features without overwhelming me with language features I'm not familiar with, or restricting me to toolchains that support the newer standards. The saving grace of C++ is the standards are stamped every few years with compilers allowing you to choose between them. It helps a lot.

                            To err is human. Fortune favors the monsters.

                            1 Reply Last reply
                            0
                            • D David ONeil

                              First time I saw C I immediately liked it. The syntax made sense at a gut level. I had Fortran and Basic under my belt at that time, so not a lot of exposure to other languages, but it was non-case locked, and arbitrary length variable names were a godsend. But I still dislike two items about it. First is the typedefs that surround all structs in the MS headers. I still don't understand why that was done, although I never delved into it very much. The second is that everything has to be casted on both sides of the '='. That got old quick. I still like the language, though. C++ is far betterer! And when I finally understood true OOP in C++ I was in heaven!

                              Our Forgotten Astronomy | Object Oriented Programming with C++ | Wordle solver

                              U Offline
                              U Offline
                              User 13269747
                              wrote on last edited by
                              #38

                              Quote:

                              The second is that everything has to be casted on both sides of the '='. That got old quick.

                              You must have first seen C back in the 80s? Since C99, anytime a cast is done in C it's a code-smell; casting should almost never be required.

                              D 1 Reply Last reply
                              0
                              • U User 13269747

                                Quote:

                                I'd guess that the mantra "C is for embedded" is mostly because of legacy systems. There was also Embedded C++, which removed templates, exceptions, and RTTI. Memory is now so cheap that C is only justified in small systems.

                                I tend to enforce it on my teams the other way around: provide a real justification for using C++ over C. It becomes very hard to justify using C++ over C for embedded projects that cannot use exceptions, as at that point you're into real implementation-defined behaviour which changes with the compiler being used, or even the flags passed to it. When C is not suitable for some problem space, I don't find myself reaching for C++ because there are much nicer languages. C++ is in this weird position - for very small embedded systems, C is better, for very large embedded systems (SBCs, for example), any other high-level language can be used. For uncrippled C++, the target needs to be larger than atmega level and smaller than Raspberry Pi level. Not a lot of need in that particular niche.

                                Quote:

                                I wouldn't sign onto a C project unless the team was small and disciplined. The risk of dealing with hacked-together code is simply too great.

                                I would. C is one of the easier languages to unf***k. A C++ project that was hacked together can be very difficult to reason about (OTOH, A Lisp project that was hacked together may as well be thrown away)

                                Greg UtasG Offline
                                Greg UtasG Offline
                                Greg Utas
                                wrote on last edited by
                                #39

                                Our experiences are rather different. I worked on large, embedded systems (call servers) in a proprietary language that could be compared to C, though with better type safety and other things that made it a competitive advantage at the time. And later in the same language after it was extended in much the same way that C was extended to C++. Having the OO version of the language enabled much clearer frameworks to be defined, which eliminated superfluous diversity when it came to designs. And just like C++/C, legacy, non-OO code could be reused, or the non-OO subset of the language used when appropriate. Not being able to use exceptions is certainly a problem if using C++, but I don't know why they should be ruled out. They're far better than setjmp/longjmp. My "hacked together" comment wasn't really about languages, but about the attitude of developers who prefer C over C++. Too many of them are hotshots at the micro level but don't care about the abstractions that are needed in a large system. And I can't really blame them, because doing C++ types of things in C requires more boilerplate than even C++ has.

                                Robust Services Core | Software Techniques for Lemmings | Articles
                                The fox knows many things, but the hedgehog knows one big thing.

                                <p><a href="https://github.com/GregUtas/robust-services-core/blob/master/README.md">Robust Services Core</a>
                                <em>The fox knows many things, but the hedgehog knows one big thing.</em></p>

                                1 Reply Last reply
                                0
                                • H honey the codewitch

                                  Martin ISDN wrote:

                                  C will set you free. the oldest dogmas i've heard were: goto is evil and macros are evil

                                  There's a time and a place for nearly everything (except Python :-D ). Macros make certain impossible things possible in C, like conditionally compiling code for different platforms, or setting compile time configuration parameters in the absence of templates. Gotos are pretty handy for state machines, where higher level constructs don't work because you can't jump in and out of while loops.

                                  Martin ISDN wrote:

                                  the most astonishing for me has always been "The arguments to functions are passed by copying the value of the argument, and it is impossible for the called function to change the actual argument in the caller"

                                  I'm surprised this astonished you, as it's the default in most any programming language including asm, where the most natural way to call is to put a *copy* of a value in a register or onto the stack. Indeed to pass by reference you need to put the *address* of the object in a register or on the stack. BASIC facilitates this using the Byref keyword, C# with the ref and out keywords, but it's pretty much always extra typing. The exception is arrays including strings, because you *reference* them (in C by referencing the first element), and while in theory you could push each element onto the stack in practice that's prohibitive.

                                  To err is human. Fortune favors the monsters.

                                  M Offline
                                  M Offline
                                  Martin ISDN
                                  wrote on last edited by
                                  #40

                                  honey the codewitch wrote: I'm surprised this astonished you, as it's the default in most any programming language including asm, where the most natural way to call is to put a *copy* of a value in a register or onto the stack. Indeed to pass by reference you need to put the *address* of the object in a register or on the stack. BASIC facilitates this using the Byref keyword, C# with the ref and out keywords, but it's pretty much always extra typing. The exception is arrays including strings, because you *reference* them (in C by referencing the first element), and while in theory you could push each element onto the stack in practice that's prohibitive. probably i wanted to give Dennis more credit than he deserves. once an idea like "i have underrated C, Dennis was more clever and foreseeing than i thought. he made the right compromises" appeared in my mind it is constantly working in the background trying to find new prof of greatness. cannot test it, but the BASICs on the home computers may have been default to pass by reference. that set the intuition that the function changes the callers arguments at very young age :( though, he made copy by value the only way to pass. except for that array! i often wonder at length, why he did so. the default way is to pass it by reference i suppose for economical reasons. there is a way to pass it by copy if you put it inside a struct. or simply, cast the array as a struct. i wish i could find some paper written by Ritchie about this or "the other things, not because they are easy, but because they are hard"

                                  1 Reply Last reply
                                  0
                                  • H honey the codewitch

                                    I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

                                    To err is human. Fortune favors the monsters.

                                    C Offline
                                    C Offline
                                    Cpichols
                                    wrote on last edited by
                                    #41

                                    Back in the day, working for a NASA contractor, we were working on graphic representation of data from the engineering (FORTRAN) programs, which had to be done in C on massive UNIX machines. OOP was still a new concept, but we used the flexibility of C to create object-like arrays of data (okay, just the parameter part of objects, but with a suite of functions to support each). OOP was the natural progression, but I never did learn C++. Perhaps I should. The freedom of C is both scary and appealing to the megalomaniac in me; I always delighted in writing in it.

                                    1 Reply Last reply
                                    0
                                    • H honey the codewitch

                                      I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

                                      To err is human. Fortune favors the monsters.

                                      J Offline
                                      J Offline
                                      Juan Pablo Reyes Altamirano
                                      wrote on last edited by
                                      #42

                                      My main language is C, although I've coded in C++ far longer. I don't use classes unless I have a very good reason to and on only one very specific occasion I used templates (I hate generics). That said I have to confess I come from the opposite end of programming. C is a very nice abstraction of assembler, with the added caveat of being portable and I have emulated objects in C using function pointers within structs. Despite the supposed (never seen it) security implications of void pointers, those are about as close as I can imagine to using generic data types in your functions (I do videogames so performance and efficiency always trumps readability...and security will always be an afterthought) Anyways welcome :)

                                      1 Reply Last reply
                                      0
                                      • H honey the codewitch

                                        I've always been a C++ nerd. I came at C++ self taught, but I came at it fresh, without "graduating" from writing C code. I've never regarded C++ as OOP, but rather GP oriented, although in truth it's a chameleon, and can do pretty much anything. However, I make heavy use of template based programming. So I didn't think I'd enjoy C. I figured I'd miss templates. I still do. There is some real ugly in terms of things you have to do with C that are elegant in C++. That being said, I don't miss them as much as I thought I would. Also, using the preprocessor freely is kind of liberating. In C++ I use it only as a last resort. In C it's more first class for me. Anyway, I like C. I do wish it had templates! And it's kind of verbose, which is hard on the fingers (everything has a handle) but also it wasn't a huge transition for me, since I do a lot of IoT coding I don't use things like exceptions, nor do I make heavy use of the STL, so C wasn't so bad. :)

                                        To err is human. Fortune favors the monsters.

                                        S Offline
                                        S Offline
                                        sasadler
                                        wrote on last edited by
                                        #43

                                        I spent my career as an embedded developer (retired now) and I've only had one project that had enough RAM to be able to use something like STL. The project was basically done when I got it so all I did to it was add/fix miscellaneous features. For most of my projects in the last 15 years of my career, I was using C++ but stayed away from dynamic object creation (all objects instantiated at startup) and inheritance. Since compiler tech had gotten so good, I did use templates for common things like FIFO's, queue's and components for some DSP (filters, tone generators, etc). Don't be afraid to use C++ features, just make sure you know the memory and time cost.

                                        H 1 Reply Last reply
                                        0
                                        • S sasadler

                                          I spent my career as an embedded developer (retired now) and I've only had one project that had enough RAM to be able to use something like STL. The project was basically done when I got it so all I did to it was add/fix miscellaneous features. For most of my projects in the last 15 years of my career, I was using C++ but stayed away from dynamic object creation (all objects instantiated at startup) and inheritance. Since compiler tech had gotten so good, I did use templates for common things like FIFO's, queue's and components for some DSP (filters, tone generators, etc). Don't be afraid to use C++ features, just make sure you know the memory and time cost.

                                          H Offline
                                          H Offline
                                          honey the codewitch
                                          wrote on last edited by
                                          #44

                                          Sounds like we're very similar in how we approach C++ on embedded and IoT. In projects like htcw_gfx[^] I rarely allocate memory for you, although temporary allocations are sometimes necessary for performance, they are few and far between, plus allow you to specify custom allocators. I don't use STL in such projects. In fact, I've gone out of my way to avoid it, even implementing my own streams and basic data structures like a hashtable and a vector that you can't remove items from aside from clearing the whole thing. The reason is flash size and memory usage - primarily heap frag. I keep my constructors inlineable by my compiler and generally use template based "interfaces" at the source level rather than inheritance based interfaces at the binary level. The idea being flash size is at less of a premium than CPU cycles.

                                          To err is human. Fortune favors the monsters.

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups