2

GCC дает ошибку при компиляции кода ниже. Прокомментированные две строки вместо других или и сдвиг линии работают, но я не уверен, что отливки необходимы и верны.Побитовые операции по char *

Ошибка: недействительные операнды в бинарные | (имеют «char *» и «int»)

Спасибо.

void bits2byte(int *bits, char *byte) { 
    byte = 0; 
    int i; 
    for (i = 0; i<8; i++) { 
     if (bits[i] == 1) { 
      byte = byte | 0x01; 
      // byte = (char*)((int)byte | 0x01); 
     } 
     if (i<7) { 
      byte = byte << 0x01; 
      // byte = (char*)((int)byte << 0x01); 
     } 
    } 
} 
int main() { 
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1}; 
    char output_byte; 
    bits2byte(input_bits, &output_byte); 
} 

Edit: Я понимаю, что это проблема передачи по ссылке. Я пытаюсь изменить байт. Я хочу, чтобы функция конвертировала биты в байты. На самом деле я сначала написал это так, как предлагают все комментаторы/комментаторы, но пропуск по ссылочному примеру в http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr233.htm смутил мой разум.

+1

Ваша цель, чтобы изменить байт или адрес байта? В настоящее время вы делаете последнее (в том числе, в пронумерованных строках, прыгаете через обручи, чтобы заставить компилятор разрешить вам это делать), и я подозреваю, что вы хотите сделать первый ... – jimwise

+1

вы знаете, что делаете всю работу по адресу байта не сам байт? –

ответ

4

Почему вы выполняете побитовые операции над указателем? Это не очень хорошая идея, поэтому вы получаете ошибки компилятора.

Вы должны разыменования указателя с *, чтобы получить значение, которое вы можете сделать эти операции:

*byte |= 1; 

или

*byte <<= 1; 

Примечание использования |= и <<= операторов, чтобы сделать код проще, это еще более полезно при работе с указателями, поскольку выражение «target» больше, чем для прямой переменной.

2

В стандарте C указано, что операнд таких операторов должен иметь скалярный тип.

C11 (n1570), § 6.5.14 Логический оператор ИЛИ
Каждый из операндов имеет скалярный тип.

Вы можете отличить до intptr_t (C99/C11).

#include <stdint.h> 

intptr_t n = (void *)byte; 

В любом случае, трудно сказать, что вы пытаетесь сделать. Вы не хотите делать эти операции над значением, указанным указателем? В таком случае вы должны разыменовать его.

*byte = *byte | 0x01; 
1

Это то, что вы пытаетесь сделать (я думаю)

void bits2byte(int *bits, char *byte) { 
    //notice ALL the work is with "*byte" not "byte" which is the address of the byte. 
    *byte = 0; 
    for (int i = 0; i < 8; i++) { 
     *byte <<= 1; 
     if (bits[i] == 1) { 
      *byte |= 1; 
     } 
    } 
} 

int main() { 
    int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1}; 
    char output_byte; //no use to put value here, we'll override it anyway... 
    bits2byte(input_bits, &output_byte); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^