возникли проблемы с функцией write () в C - PullRequest
0 голосов
/ 14 апреля 2011

Учитывая части моего кода:

char bmpheader[54] = {0x42, 0x4D, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char bmpimagedata[36] = {0x07, 0x07, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x66, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00};


while (i < 54) {
    printf("%c", bmpheader[i]);
    write (socket, bmpheader[i], 1);
    i++;
}
while (j < 36) {
    printf("%c", bmpimagedata[j]);
    write (socket, bmpimagedata[j], 1);
    j++;
}

Я получаю сообщение об ошибке на моем компиляторе, говорящее passing argument 2 of 'write' makes pointer from integer without a cast для обеих функций записи.Я не слишком уверен насчет самих аргументов функции (верен ли третий аргумент?).

Как я могу исправить это?

Ответы [ 7 ]

3 голосов
/ 14 апреля 2011

Стандартная функция write принимает указатель на то, что вы хотите выписать; вы передаете ему char (что повышается до int).

Минимальное исправление было бы изменить это:

write (socket, bmpheader[i], 1);

до

write (socket, &bmpheader[i], 1);

... но есть и лучшие способы.

Вы можете просто позволить write записать все 54 байта:

write (socket, bmpheader, 54);

Или, если вы действительно хотите сделать это char одновременно, вы можете использовать указатель:

int i;
char *p;
for (i = 0, p = bmpheader; i < 54; ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

В любом случае вы хотите избежать этого магического числа 54 и взять его из данных. Поскольку sizeof(char) - это всегда один байт в стандартном C , вы можете использовать sizeof, не делая некрасивую вещь sizeof(array) / sizeof(array[0]):

int i;
char *p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

... но я уверен, что есть более элегантное решение, чем это.

Вы также можете использовать putchar (довольно легкий) вместо printf (довольно тяжелый):

int i;
char* p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    putchar(*p);
    write (socket, p, 1);
}

И я делал подобные вещи с помощью арифметики с указателями, понятия не имею, являются ли они плохой практикой в ​​современном мире:

char* p;
char* endp;
for (p = bmpheader, p = bmpheader + sizeof(bmpheader); p < endp; ++p) {
    putchar(*p);
    write (socket, p, 1);
}
1 голос
/ 14 апреля 2011

подпись для запись - это

ssize_t write(int fd, const void *buf, size_t count);

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

write (socket, bmpheader + i, 1);
write (socket, bmpimagedata + j, 1);

Но почему бы не сделать

write (socket, bmpheader, sizeof(bmpheader)/sizeof(*bmpheader));
write (socket, bmpimagedata, sizeof(bmpimagedata)/sizeof(*bmpimagedata));

и проверить возвращаемое значение курса

0 голосов
/ 14 апреля 2011

Удивительно много странных / запутанных предложений.

Канонический способ выписать эти два массива:

write(socket, bmpheader, sizeof bmpheader);
write(socket, bmpimagedata, sizeof bmpimagedata);

Абсолютно бессмысленно делать вычисления, чтобы выяснить количество элементов, включая размер одного символа или что-то еще. Просто напишите весь массив, по одному для каждого, и все готово.

Плюс, конечно, отследить, если вам это удалось или нет (возможно, была написана только часть), и обработать это.

0 голосов
/ 14 апреля 2011

Если вы измените свой код на ...

write (socket, bmpimagedata + j, 1);

... это будет работать.но вам не нужно отправлять данные по одному байту за раз, поэтому третьим параметром является длина.

Также вы рассматривали поиск справочной документации для функции write (), чтобы увидеть, как именно она работает и чтоэто принимает?Научиться читать и толковать документацию может быть нелегко, но в долгосрочной перспективе это будет гораздо выгоднее, чем задавать вопросы: «Я не уверен, какой третий параметр»

0 голосов
/ 14 апреля 2011

bmpimagedata [j]

- это целое число, которое вы хотите использовать & bmpimagedata [j]

0 голосов
/ 14 апреля 2011

запись (сокет, & bmpimagedata [j], sizeof (bmpimagedata [j])); второй аргумент должен быть указателем и третий - размер данных для записи

0 голосов
/ 14 апреля 2011

если вы проверите прототип функции записи , вы увидите, что вторым параметром является char *.В вашем случае вы даете ему ячейку или массив, а затем символ.Вы должны написать:

write (socket, &(bmpheader[i]), 1);

Конечно, это далеко не самый эффективный, вы можете написать прямо

write (socket, bmpheader, 54);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...