LINUX.ORG.RU

Учебник прочитай по С. Любой. Начни хотя бы.

anonymous
()

Можешь начать с темы "Массивы и указатели"

anonymous
()

> как передавать subj в функцию, не указывая размера?

никак. нужны указатель и размерность массива.

anonymous
()

Дык... И одномерный -- никак!

Если это принципиально, можно схитрить, например, в 0 элементе массива указать его длинну. На многомерный случай обобщается тривиально.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Почему? Передать-то можно, отчего ж не передать? Указатель на первый элемент и все дела. Только что потом с этим делать?

Используй связные списки, Люк. :)

Uncle_Theodore ★★
()
Ответ на: комментарий от Uncle_Theodore

> Используй связные списки, Люк. :)

man алгоритмическая сложность и man время доступа к элементам массива vs время доступа к элементам списка (hint: O(1) vs O(n))

quarck
()
Ответ на: комментарий от wfrr

А я что, против что-то сказал? Я лишь указал на некорретность предолжения использовать вместо массива, списки. При этом под массивом не обязательно подразумевался pure-C массив. Но если вы руками разгоните от монитора дым, то увидите, что сабж был "многомерные массивы C", а не "многомерные массивы C++".

quarck
()

void** , void*** ... ну и не забывать про null в конце.

а вообще почитай про указатели.

alphex_kaanoken ★★★
()

Если нужен частный случай - двумерный массив символов (т.е. массив строк), то можно обойтись без указания размеров. Используешь одномерный массив указателей char*, последний указатель помечается NULL, концы строк как известно '\0'. В общем случае никак. Да и не надо.

shumer
()
Ответ на: комментарий от Uncle_Theodore

>Используй связные списки, Люк. :)

хэ, оно не всегда удобно. а так указатель на первые элемент - типа char** - и так до того пока char* !=NULL себе спокойно читаешь. Опять же линкованный список овердрафт имеет.

Можно конечно интрузивный односвязный список создать - типа -

struct __list_t {
struct __list_t *next;
};

но зачем уродоватся - когда часто проще иметь void** ?

alphex_kaanoken ★★★
()
Ответ на: комментарий от Die-Hard

> Если это принципиально, можно схитрить, например, в 0 элементе массива указать его длинну. На многомерный случай обобщается тривиально.

Если для человека это не очевидно, его нельзя допускать до компилятора C. Ибо нефиг.

Nihilist
()
Ответ на: комментарий от alphex_kaanoken

> Можно конечно интрузивный односвязный список создать

Что значит "интрузивный" вообще и в данном случае?

К сожалению, автор не объяснил зачем это ему нужно. То ли он ищет способ как определить размер непосредственно внутри функции, то ли ему просто обидно уродовать сигнатуру слишком большим количеством аргументов. В последнем случае можно порекомендовать засунуть массив в стрктуру вместе с полями его размеров :)

shumer
()
Ответ на: комментарий от shumer

>Что значит "интрузивный" вообще и в данном случае?

сложно по русски пояснить - в данном и вообще случае - это значит что структура указывает на данные - те указатель на next указывает на кусок данных - неопределенных - те смещая на sizeof(struct __list) у тебя данные - а что там и какие они это уже десятый вопрос - это бывает удобно когда тебе надо хранить что то - недетерминированной структуры.

Короче сложно по русски это объяснить - проще

typedef struct __list_t { struct __list_t *next; } list_t;

char *blabla="blabla"; char *blabla2="blablabla";

/* делаем типа список из этих двух друзей */

void *n=malloc(sizeof(struct __list_t)+(sizeof(char)*(strlen(blabla)+1)));

... запихиваем в n blabla повторяем тож самое с blabla2

list_t *u=(list_t*) n;

u->next=n2; u=(list_t*) n2; n2->next=NULL;

вот такой вот псевдо код - проверки и прочее сам понимаешь лень писать.

alphex_kaanoken ★★★
()
Ответ на: комментарий от alphex_kaanoken

А ясно, тот же односвязный список, но куски разного размера?

Все-таки главная ценность массива - константное время доступа к любому члену. Список такой фичей не обладает, интрузивный он или нет.

А так спасибо, может пригодится.

shumer
()
Ответ на: комментарий от shumer

>Список такой фичей не обладает, интрузивный он или нет.

ессно ;) вопрос в том где ты используешь то или другое - не всегда ты знаешь какой именно элемент тебе нужен - в таких случаях что void** что список (любой) будет O(n) ;)

>А ясно, тот же односвязный список, но куски разного размера?

по сути да - те тебе не надо завязывать структуру списка - или хранить структуру списка отдельно от данных - такое часто бывает нужно.

alphex_kaanoken ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.