C choosing variable type at run-time
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
add a comment |
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
2
Types in C are only known at compile time. You might want tagged unions, and you'll build them abovestruct
andunion
– Basile Starynkevitch
Nov 15 '18 at 16:31
add a comment |
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
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
c syntactic-sugar
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 abovestruct
andunion
– Basile Starynkevitch
Nov 15 '18 at 16:31
add a comment |
2
Types in C are only known at compile time. You might want tagged unions, and you'll build them abovestruct
andunion
– 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
add a comment |
2 Answers
2
active
oldest
votes
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.
add a comment |
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
edited Nov 15 '18 at 19:06
answered Nov 15 '18 at 16:30
tadmantadman
156k18178209
156k18178209
add a comment |
add a comment |
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
add a comment |
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
add a comment |
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
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
answered Nov 15 '18 at 16:28
Alesandro GiordanoAlesandro Giordano
318110
318110
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
2
Types in C are only known at compile time. You might want tagged unions, and you'll build them above
struct
andunion
– Basile Starynkevitch
Nov 15 '18 at 16:31