|
|
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
что означает такая запись unsigned char ** data ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 20:02 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Указатель на указатель на беззнаковый символ (или символы, или числа от 0 до 255) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 20:14 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
а если есть функция объявленная как void test(unsigned char ** data); то корректно ли такое ее использование unsigned char buf[100]; test(&buf); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 20:39 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
наверное так: unsigned char buf[100]; unsigned char *pbuf=&buf; test(&pbuf); используется для передачи указателя на указатель, в который поместят(например) указатель на массив беззнаковых символов(или байтов, иногда можно и так понимать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 20:57 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
А кроме прототипа void test(unsigned char ** data); больше ничего не известно??? Сомневаюсь я однако, что все так просто. Не стали бы тогда двойной указатель использовать. Может это матрица какая-нибудь хитрая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 21:14 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
это может быть возвращаемым значением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 01:38 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Понимаю, что все не просто так, я только начинаю изучать С по этому возникают такие глупые вопросы, а может дело в ДНК ?. вот как выглядит эта функция полностью 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. В своей программе я ее примерно так же и использую, указатели у меня больше ни где не использутся и за пределы масивов не выхожу. Вот у меня и возник вопрос, а правильно ли ее так использовать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 02:33 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Я бы внес небольшое изменение: Код: plaintext 1. 2. 3. 4. Может поможет. Еще бы length сравнивал с размером масива sizeof(data), а то вдруг больше 200 байт пришло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 05:43 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Может пример кривой? Обычно такие функции так используются: 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:32 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
И, кроме того, unsigned int i, а не unsigned char i. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:33 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Ну блин, кроме того не printf(" %x ",data), а printf(" %x ",(int)data[ i ]); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:38 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Выбросьте эту функцию нафиг, вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:40 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
спасибо за ответы попробую как предложил www.fun4me.narod.ru может и получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 17:47 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
попробовал нефига и посему совет Код: plaintext выглядит самым нормальным. Обыдно, что такие библиотеки поставляются с промышленными контроллерами. Просто нехотелось заморачиваться с реализацией кольцевого буфера и прерываниями, ... Ну да ладно напишу лучше свою библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 18:25 |
|
||
|
проблемы с определением типа
|
|||
|---|---|---|---|
|
#18+
Да вы чё парни окрысились на сигнатуру этой функции. Абсолютно нормальная сигнатура. Например никаким другим приличным образом вы не передадите в функцию двумерный массив с переменными размерностями. А если понадобится трёхмерный, то придётся передaвать и double*** (char***) и т.д. Это вам не FORTRAN где любой массив можно передавать в тело функции/подпрограммы как одномерный с размерностью 1, а внутри тела процедуры обрабатывать его как сколько угодно мерный, лишь бы количество реально переданных элементов совпадало с произведением размерностей. Но это так, лирика, старческий маразм даёт себя знать... Вообще-то, в данном конкретном случае думаю что всё гораздо проще: функция, скорее всего, ожидает одномерный массив (к сожалению, и это необходимо признать, из одной лишь сигнатуры невозможно понять ожидает ли функция что память под массив выделяется в стеке или из кучи). Затем, в результате работы функции, размер массива изменяется и в вызывающую программу необходимо вернуть новый массив другой размерности, размещённый в памяти по другому адресу. Вот для этого и нужён указатель на указатель. Хотя лучше и безопасней было бы сделать так - при первом вызове в качестве фактического параметра для char** передаётся null и функция использует остальные параметры для вычисления требуемого размера массива, вызывающая программа динамически захатывает требуемую память из кучи и снова вызывает функцию, передавая ей на сей раз действительное значение char** исходного массива и указатель на память для нового массива. В этом случае можно обойтись без char**, вместо этого будут 2 char* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2004, 21:40 |
|
||
|
|

start [/forum/search_topic.php?author=Lazy%2B&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 594ms |
| total: | 730ms |

| 0 / 0 |
