Структуры. Указатели. Чистый СИ.

cDLEON

Онанист РНРСlub
Структуры. Указатели. Чистый СИ.

PHP:
struct sd_s_pool {
	sd_client				*cp;
	struct sd_s_pool				*prev;
	struct sd_s_pool				*next;
	struct sd_s_pool				*last;
	int				*count;
};

typedef struct sd_s_pool sd_pool;

sd_pool *
sd_pool_alloc() {
	char *test=malloc(sizeof(sd_pool));
	return (sd_pool *)test;
}

sd_pool *
sd_create_new_pool_element(sd_pool *main) {
	sd_pool *new=sd_pool_alloc();
	if(new==NULL) {
		return NULL;
	}
	new->cp=NULL;
	
	//*main[0]=new;
	/*if(count(*main)) {
		main=new;
		printf("blablabla %i\n",sizeof(*main));
	}*/
	printf("%p\n",main);
}
sd_pool *pool;

if(!sd_create_new_pool_element(pool)) {
	printf("ERROR!\n");
	goto error;
}
Задача - добавить новый элемент в конец массива pool. Прописать для ВСЕХ элементов массива новый last глобально.
И выставить prev,last...
Как это реализуется? Можно небольшой примерчик? А то как я только не извращался =( Даже узнать пустой ли массив не могу (
 

kode

never knows best
[затупил, незаметил про "чистый си"]

-~{}~ 28.02.08 02:08:

Ну как минимум размер массива на ссылках вы так просто не узнаете, но есть вариант с использованием

struct pool_array{
int count;
sd_pool * array;
}

во вторых при присваивании делайте так:


my_arr.array = (sd_pool*)realloc(my_arr.array, (my_arr.count+1)*sizeof(sd_pool));


if(!my_arr.count){
my_arr.array[0].prev == NULL;
}else{
my_arr.array[my_arr.count] = &my_arr.array[my_arr.count-1];
}

int i=0;

for(i=0;i<=my_arr.count;i++){
my_arr.array.last = &my_arr.array[my_arr.count];
}

my_arr.count++;

ну это как бы принцип-пример работы. Я не исключаю (даже точно знаю) что есть лучшие методы.

-~{}~ 28.02.08 03:45:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct s_test {
	char chr;
} test;

typedef struct s_arr {
	int count;
	test ** array;
} array;

void add_element(array *arr, test *element){	
	int alloc_size = (arr->count+1)*sizeof(test*);
	arr->array = (test **)realloc(arr->array, alloc_size);
	if(arr->array == NULL){
		printf("Error: (re)allocation error!\n");
		exit(1);
	}
	
	arr->array[arr->count++] = element;
	printf("=-----------------= (allocated: %d)\n", alloc_size);
}

int main(int argc, char** argv){

array arr;

arr.array = NULL;
arr.count = 0;

int i = 0;

char message[] = "Hello, my pointer friend!";

for(i=0;i<strlen(message);i++){
	test* element = (test*)malloc(sizeof(test));
	element->chr = message[i];
	add_element(&arr,element);
}

printf("And message is\n");


for(i=0;i<arr.count;i++){
	test element = *arr.array[i];
	printf("%c",element.chr);
	
}

printf("\n");

return 0;
}
 

cDLEON

Онанист РНРСlub
Спасибо.
Правда я ещё вчера решил эту задачу)) Правда без массива...На ссылках...
 

berkut

Новичок
cDLEON
не, ну как маленький. решил - пости решение. мне то не надо, я в ц тока звёздочки считаю, а *кому-то пригодиться
 

kode

never knows best
Автор оригинала: cDLEON
Спасибо.
Правда я ещё вчера решил эту задачу)) Правда без массива...На ссылках...
Если ты вчитывался в код то мог увидеть что там тоже всё на ссылках.
 

cDLEON

Онанист РНРСlub
Пожалста :D
PHP:
sd_pool *
sd_pool_alloc() {
	char *test=malloc(sizeof(sd_pool));
	return (sd_pool *)test;
}
sd_pool *
sd_create_new_pool_element(sd_pool *main) {
	sd_pool *new=sd_pool_alloc();
	if(new==NULL) {
		return NULL;
	}
	new->status=0;
	new->socket=0;
	if(!main) {
		new->start=new;
		return new;
	}
	main->next=new;
	new->prev=main;
	return new;
}
 
Сверху