C choosing variable type at run-time












2















I have this piece of code below which seems very explicit and redundant, is there a way to choose variable type at run-time?



if(header->bitsPerSample == 16) {
int sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
} else if(header->bitsPerSample == 8) {
char sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
}


I'm looking for something like this:



if(header->bitsPerSample == 16) 
sample is of type int
else if(header->bitsPerSample == 8)
sample is of type char

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}









share|improve this question


















  • 2





    Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

    – Basile Starynkevitch
    Nov 15 '18 at 16:31
















2















I have this piece of code below which seems very explicit and redundant, is there a way to choose variable type at run-time?



if(header->bitsPerSample == 16) {
int sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
} else if(header->bitsPerSample == 8) {
char sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
}


I'm looking for something like this:



if(header->bitsPerSample == 16) 
sample is of type int
else if(header->bitsPerSample == 8)
sample is of type char

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}









share|improve this question


















  • 2





    Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

    – Basile Starynkevitch
    Nov 15 '18 at 16:31














2












2








2








I have this piece of code below which seems very explicit and redundant, is there a way to choose variable type at run-time?



if(header->bitsPerSample == 16) {
int sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
} else if(header->bitsPerSample == 8) {
char sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
}


I'm looking for something like this:



if(header->bitsPerSample == 16) 
sample is of type int
else if(header->bitsPerSample == 8)
sample is of type char

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}









share|improve this question














I have this piece of code below which seems very explicit and redundant, is there a way to choose variable type at run-time?



if(header->bitsPerSample == 16) {
int sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
} else if(header->bitsPerSample == 8) {
char sample;
for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}
}


I'm looking for something like this:



if(header->bitsPerSample == 16) 
sample is of type int
else if(header->bitsPerSample == 8)
sample is of type char

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += sizeof(sample) * 2) {
fread(&sample, sizeof(sample), 1, fp);
fwrite(&sample, sizeof(sample), 1, new);
fread(&sample, sizeof(sample), 1, fp);
}






c syntactic-sugar






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 15 '18 at 16:22









Aristos GeorgiouAristos Georgiou

1089




1089








  • 2





    Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

    – Basile Starynkevitch
    Nov 15 '18 at 16:31














  • 2





    Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

    – Basile Starynkevitch
    Nov 15 '18 at 16:31








2




2





Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

– Basile Starynkevitch
Nov 15 '18 at 16:31





Types in C are only known at compile time. You might want tagged unions, and you'll build them above struct and union

– Basile Starynkevitch
Nov 15 '18 at 16:31












2 Answers
2






active

oldest

votes


















6














C's only tool for writing generic code is with macros, but that's not necessary here.



Skip the formality of declaring a variable of precisely the right type and instead just read or write the appropriate number of bytes:



size_t raw_size = header->bitsPerSample / 8;
unsigned char buffer[raw_size];
void* raw = &buffer;

for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
fread(raw, raw_size, 1, fp);
fwrite(raw, raw_size, 1, new);
fread(raw, raw_size, 1, fp);
}


Since your code doesn't really care what the values are, just how many bytes they require, you can just use character buffers.






share|improve this answer

































    2














    You cannot do this, I suggest you to use the same variable type, for example you can cast a int to char and you will reach the correct value






    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53323767%2fc-choosing-variable-type-at-run-time%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      6














      C's only tool for writing generic code is with macros, but that's not necessary here.



      Skip the formality of declaring a variable of precisely the right type and instead just read or write the appropriate number of bytes:



      size_t raw_size = header->bitsPerSample / 8;
      unsigned char buffer[raw_size];
      void* raw = &buffer;

      for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
      fread(raw, raw_size, 1, fp);
      fwrite(raw, raw_size, 1, new);
      fread(raw, raw_size, 1, fp);
      }


      Since your code doesn't really care what the values are, just how many bytes they require, you can just use character buffers.






      share|improve this answer






























        6














        C's only tool for writing generic code is with macros, but that's not necessary here.



        Skip the formality of declaring a variable of precisely the right type and instead just read or write the appropriate number of bytes:



        size_t raw_size = header->bitsPerSample / 8;
        unsigned char buffer[raw_size];
        void* raw = &buffer;

        for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
        fread(raw, raw_size, 1, fp);
        fwrite(raw, raw_size, 1, new);
        fread(raw, raw_size, 1, fp);
        }


        Since your code doesn't really care what the values are, just how many bytes they require, you can just use character buffers.






        share|improve this answer




























          6












          6








          6







          C's only tool for writing generic code is with macros, but that's not necessary here.



          Skip the formality of declaring a variable of precisely the right type and instead just read or write the appropriate number of bytes:



          size_t raw_size = header->bitsPerSample / 8;
          unsigned char buffer[raw_size];
          void* raw = &buffer;

          for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
          fread(raw, raw_size, 1, fp);
          fwrite(raw, raw_size, 1, new);
          fread(raw, raw_size, 1, fp);
          }


          Since your code doesn't really care what the values are, just how many bytes they require, you can just use character buffers.






          share|improve this answer















          C's only tool for writing generic code is with macros, but that's not necessary here.



          Skip the formality of declaring a variable of precisely the right type and instead just read or write the appropriate number of bytes:



          size_t raw_size = header->bitsPerSample / 8;
          unsigned char buffer[raw_size];
          void* raw = &buffer;

          for (int i = 0; i < header->chunkSize - HEADER_SIZE + 8; i += raw_size * 2) {
          fread(raw, raw_size, 1, fp);
          fwrite(raw, raw_size, 1, new);
          fread(raw, raw_size, 1, fp);
          }


          Since your code doesn't really care what the values are, just how many bytes they require, you can just use character buffers.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 15 '18 at 19:06

























          answered Nov 15 '18 at 16:30









          tadmantadman

          156k18178209




          156k18178209

























              2














              You cannot do this, I suggest you to use the same variable type, for example you can cast a int to char and you will reach the correct value






              share|improve this answer




























                2














                You cannot do this, I suggest you to use the same variable type, for example you can cast a int to char and you will reach the correct value






                share|improve this answer


























                  2












                  2








                  2







                  You cannot do this, I suggest you to use the same variable type, for example you can cast a int to char and you will reach the correct value






                  share|improve this answer













                  You cannot do this, I suggest you to use the same variable type, for example you can cast a int to char and you will reach the correct value







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 15 '18 at 16:28









                  Alesandro GiordanoAlesandro Giordano

                  318110




                  318110






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53323767%2fc-choosing-variable-type-at-run-time%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Bressuire

                      Vorschmack

                      Quarantine