powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблемы с определением типа
15 сообщений из 15, страница 1 из 1
проблемы с определением типа
    #32416120
что означает такая запись

unsigned char ** data
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416127
SnowMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Указатель на указатель на беззнаковый символ (или символы, или числа от 0 до 255)
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416141
а если есть функция объявленная как

void test(unsigned char ** data);

то корректно ли такое ее использование

unsigned char buf[100];
test(&buf);
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416153
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное так:

unsigned char buf[100];
unsigned char *pbuf=&buf;
test(&pbuf);

используется для передачи указателя на указатель, в который поместят(например) указатель на массив беззнаковых символов(или байтов, иногда можно и так понимать)
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416162
SnowMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кроме прототипа

void test(unsigned char ** data);

больше ничего не известно???

Сомневаюсь я однако, что все так просто. Не стали бы тогда двойной указатель использовать. Может это матрица какая-нибудь хитрая.
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416230
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это может быть возвращаемым значением
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416233
Понимаю, что все не просто так, я только начинаю изучать С по этому возникают такие глупые вопросы, а может дело в ДНК ?.

вот как выглядит эта функция полностью

int comm_get(unsigned int *l, unsigned char ** data, unsigned char p)

вот описание
if comm-port recieved some datas,return successful.
or, if comm-port buffer is empty, return fail.the datas
length(unit is byte) stored in parameter (l), datas
content store in paramter ( data ).

parameter:
unsigned int *l:
return the recieve datas length.

unsigned char ** data:
return the recieved datas content,user must first allocate
a data-buffer (size is the same with comm_init(int buf_size)
the buf-size definition).and before exit program, free this buffer.

unsigned char p:
comm-port index

с ней так же был пример использования вот его часть:

unsigned int length;
unsigned char data[200];
unsigned char i;
...
инициализация порта
...
подготовка и запись пакета запроса
....
// чтение полученных данных
if(comm_get(&length, &data ,1))
for (i=0; i<length; i++)
printf(" %x ",data );
...
деинициализация порта

Все бы ничего, но при таком использовании, если несколько раз выполнить цикл записи и чтения из порта, то при завершении программы
вываливается сообщение типа Null pointer assigment.
В своей программе я ее примерно так же и использую, указатели у меня больше ни где не использутся и за пределы масивов не выхожу.

Вот у меня и возник вопрос, а правильно ли ее так использовать ?
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32416256
SnowMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы внес небольшое изменение:

Код: plaintext
1.
2.
3.
4.
if (comm_get(&length, &data , 1 )) {
     for (i= 0 ; i<length; i++) 
     printf( " %x " ,data[ i ]); // А то оказалось не в if
     .....
} // if

Может поможет. Еще бы length сравнивал с размером масива sizeof(data), а то вдруг больше 200 байт пришло.
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417347
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может пример кривой?

Обычно такие функции так используются:
unsigned int length;
unsigned char *data=NULL;
unsigned char i;
...
инициализация порта
...
подготовка и запись пакета запроса
....
// чтение полученных данных
if(comm_get(&length, &data ,1))
for (i=0; data && (i<length); i++)
printf(" %x ",data );

//free(data);
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417349
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кроме того, unsigned int i, а не unsigned char i.
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417353
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну блин, кроме того не printf(" %x ",data), а printf(" %x ",(int)data[ i ]);
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417356
Фотография www.fun4me.narod.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбросьте эту функцию нафиг, вообще.
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417369
спасибо за ответы
попробую как предложил www.fun4me.narod.ru может и получится
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417422
попробовал нефига и посему совет
Код: plaintext
Выбросьте эту функцию нафиг, вообще.

выглядит самым нормальным. Обыдно, что такие библиотеки поставляются с промышленными контроллерами. Просто нехотелось заморачиваться с реализацией кольцевого буфера и прерываниями, ...
Ну да ладно напишу лучше свою библиотеку.
...
Рейтинг: 0 / 0
проблемы с определением типа
    #32417539
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы чё парни окрысились на сигнатуру этой функции. Абсолютно нормальная сигнатура. Например никаким другим приличным образом вы не передадите в функцию двумерный массив с переменными размерностями. А если понадобится трёхмерный, то придётся передaвать и double*** (char***) и т.д. Это вам не FORTRAN где любой массив можно передавать в тело функции/подпрограммы как одномерный с размерностью 1, а внутри тела процедуры обрабатывать его как сколько угодно мерный, лишь бы количество реально переданных элементов совпадало с произведением размерностей. Но это так, лирика, старческий маразм даёт себя знать...

Вообще-то, в данном конкретном случае думаю что всё гораздо проще: функция, скорее всего, ожидает одномерный массив (к сожалению, и это необходимо признать, из одной лишь сигнатуры невозможно понять ожидает ли функция что память под массив выделяется в стеке или из кучи). Затем, в результате работы функции, размер массива изменяется и в вызывающую программу необходимо вернуть новый массив другой размерности, размещённый в памяти по другому адресу. Вот для этого и нужён указатель на указатель. Хотя лучше и безопасней было бы сделать так - при первом вызове в качестве фактического параметра для char** передаётся null и функция использует остальные параметры для вычисления требуемого размера массива, вызывающая программа динамически захатывает требуемую память из кучи и снова вызывает функцию, передавая ей на сей раз действительное значение char** исходного массива и указатель на память для нового массива. В этом случае можно обойтись без char**, вместо этого будут 2 char*
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблемы с определением типа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]