C выбор типа переменной во время выполнения - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть следующий фрагмент кода, который кажется очень явным и избыточным, есть ли способ выбрать тип переменной во время выполнения?

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);
    }
}

Я ищу что-то вроде этого:

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);
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Единственный инструмент C для написания универсального кода - с макросами, но здесь это не обязательно.

Пропустите формальность объявления переменной точно нужного типа и вместо этого просто прочитайте или запишите соответствующее количество байтов:

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);
}

Так как вашему коду на самом деле не важно, какие значения, сколько байт им требуется, вы можете просто использовать символьные буферы.

0 голосов
/ 15 ноября 2018

Вы не можете сделать это, я предлагаю вам использовать тот же тип переменной, например, вы можете привести int к char, и вы получите правильное значение

...