2009-08-19 3 views
2

Я полный новичок во всем, за исключением, может быть, дышать, так что извините, если я не быть ясно, но здесь идет:Создание указателя, который указывает на два байта

У меня есть функция в С, которая записывает байт в схему через шину I2C, и в заголовочном файле выглядит следующим образом:

BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen); 
  • hJida картоне ручка.
  • dwType: Номер на основе нуля для шины I2C .
  • bAddr: адрес устройства на шине I2C , полный 8 бит, как и , записанный на автобус.
  • pBytes: Указатель на местоположение, в котором содержит байты.
  • dwLen: количество байтов для записи.

Если бы я хотел написать только один байт в схему с адресом 0x98, я хотел бы сделать что-то вроде этого:

unsigned char writing[1]; 
writing[0]=0x10; 

unsigned char *pointer; 
pointer = &writing[0]; 


JidaI2CWrite(hJida,0,0x98,pointer,1); 

, который, кажется, работает, но если бы я хотел написать два байта, скажем, 0x10FF, это не так. Так как я могу сделать указатель, который указывает на два байта вместо одного?

Благодаря

+2

Не забудьте не отставать от своего дыхания, когда вы читаете ответы :-) –

+1

Является ли указатель = и писать [1] опечатку? Это, безусловно, не должно работать. –

+0

Да, pointer = & writing [0], возможно, вы имели в виду. Или просто «указатель = письмо»; – Roddy

ответ

10

Вы хотите что-то вроде этого:

unsigned char writing[2]; 
writing[0] = 0x01; 
writing[1] = 0x02; 

JidaI2CWrite(hJida, 0, 0x98, writing, 2); 

Обратите внимание, что массив в C обычно можно использовать так же, как указатель. Переменная writing можно рассматривать как просто указатель на кусок памяти, который в этом случае имеет размер 2 байта. Создание другого указателя, указывающего на это местоположение, является избыточным (в данном случае).

Примечание вы могли бы сделать это указать на любое количество байт:

unsigned char writing[12]; 

//fill the array with data 

JidaI2CWrite(hJida, 0, 0x98, writing, 12); 
+2

«Обратите внимание, что массивы в C на самом деле просто указатели» не совсем ... см. «Http://www.lysator.liu.se/c/c-faq/c-2.html» –

+0

@ SDX2000 отличная точка и ссылка , Я упрощен, надеюсь, мое редактирование более точно – Gabe

+0

@ SDX2000 Эта ссылка дает 404 – Edward

6

Try это ...

//A buffer containing the bytes to be written 
unsigned char writeBuffer[] = {0x10, 0xFF}; 

//writeBuffer itself points to the start of the write buffer 
//you dont need an extra pointer variable 
//Indicate the size of the buffer in the call to the function 
//pointers do not carry array size information with them (in C/C++) 
JidaI2CWrite(hJida,0,0x98,writeBuffer,2); 

или еще лучше

unsigned char writeBuffer[] = {0x10, 0xFF}; 

JidaI2CWrite(hJida,0,0x98,writeBuffer 
       ,sizeof(writeBuffer)/sizeof(unsigned char)); 

Примечание: sizeof(writeBuffer)/sizeof(writeBuffer[0]) автоматически вычисляет размер массива в байтах для вас

+0

Деление на 'sizeof (unsigned char)' бессмысленно, так как 'sizeof (char)' определяется как 1 в стандарте и 'sizeof (unsigned char) == sizeof (char)' –

1

Похоже, что параметр dwLen - это количество байтов для записи. Итак:

unsigned char writing[2]; 
writing[0] = 0x10; 
writing[1] = 0xff; 
JidaI2CWrite(hJida, 0, 0x98, writing, 2); 

Обратите внимание, что использование pointer указывая на writing[1], вероятно, не должно работать, как написано, так что наборы pointer, чтобы указать на байты после байт вы действительно хотите написать. Я подозреваю, что это опечатка, но если нет, вы можете просмотреть существующий код перед продолжением.

+0

@Greg: он может работать или возможно, это не так. Дело в том, что поведение программы * undefined * в соответствии с спецификацией языка. –

+0

@StephenC: "undefined" каким образом? Фактически доступ к письму [1] может быть неопределенным, но, учитывая, что его адрес должен работать, конечно? – Roddy

0

Я вижу 2 варианта:

1) написать их отдельно:

писать [0] = 0x10; запись [1] = 0xFF;

2) проверьте, не хватает ли короткого замыкания на вашей системе 2Bytes и используйте короткий.

возможно как ((короткое *) письмо) [0] = 0x10FF;

Кроме того, вам нужно написать декларацию, написанную символом [2];

, а затем, как уже говорили другие, пишут 2 байта ...

+1

"((короткая *) запись) [0] = 0x10FF;" вызывает проблемы из-за проблем с энтианностью. например на x86 и sparc это дало бы разные результаты, и больно охотиться на такие ошибки. –

+0

, недавно сделав такие исправления в каком-то коде Mac, перейдя с powerpc на intel, вы очень правы. –

1

writing уже указатель, который вы хотите.

Избавиться от pointer.

Последний параметр для JidaI2CWrite - это количество байтов, которое вы хотите записать.

Указатель pBytes указывает на начало блока, который вы хотите написать.