Avatar
phageweb
Člen
Avatar
phageweb:

ahoj,

potrebuju poradit jak vytvorit dalsi funkci.

Mam funkce pro buffer( zapis wbuf(struct *structura1) a dalsi).
V deklaraci buffer jako pole structura1[5].
Chci pracovat absolutne ne pres alakovani pameti.

Jak se da funkce wbuf rozsirit/prede­lat/zapsat, aby se v ni dala pouzit jina struktura a nemusela se menit nazev funcke, pouzit wbuf(pro strukturu2).

Snad se to da pochopit.

 
Odpovědět 3.10.2014 6:48
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Jedná se o C++ nebo o C? V C++ bys jednoduše přetížil danou metodu aby přijímala více parametrů. V čistém C přetížení neexistuje, takže musíš vytvořit jinou metodu s jiným názvem.

Nahoru Odpovědět 3.10.2014 7:37
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
phageweb
Člen
Avatar
phageweb:

praveze c,
pouzivam to docela casto a prijde me divne prepisovat vsechny funkce a nevytvorit to nejak elegantneji (protoze toho prepisovani je pak hodne a kdyz se udela mala zmena, nekolikrat kopirovat kod mi neprijde spravne)

 
Nahoru Odpovědět 3.10.2014 7:59
Avatar
coells
Redaktor
Avatar
Odpovídá na phageweb
coells:
wbuf(void *data, size_t size);
 
Nahoru Odpovědět 3.10.2014 9:39
Avatar
vitamin
Člen
Avatar
Odpovídá na phageweb
vitamin:

mozes pouzit _Generic:

#include <stdio.h>
#include <assert.h>

typedef struct{}S1;
typedef struct{}S2;

void wbuff_S1(S1* x){puts("wbuff_S1\n");}
void wbuff_S2(S2* x){puts("wbuff_S2\n");}

#define wbuff(x) _Generic( (x), \
        S1*: wbuff_S1(x),\
        S2*: wbuff_S2(x),\
        default:printf("Error\n")\
)


int main(void){
        S1 s1;
        S2 s2;

        wbuff(&s1);
        wbuff(&s2);
        wbuff(1);
}

Treba mat kompilator podporujuci C11

 
Nahoru Odpovědět 3.10.2014 9:39
Avatar
phageweb
Člen
Avatar
Odpovídá na coells
phageweb:

typedef struct{}S1;
typedef struct{}S2;

void wbuf (pointer_zaca­tek_pole *z,zacatek_struct *s, int delka_struct){
//vlozeni na spravne misto

}

int main(void){
S1 s1_pole[5];
S2 s2_pole[5];

S1 s1;
S2 s2;

wbuf(&s1_pole[0],&s1,si­zeof(s1));
wbuf(&s2_pole[0],&s2,si­zeof(s2));

}

slo by to takto? co se ma napsat misto pointer_zacatek_po­le?

 
Nahoru Odpovědět 3.10.2014 10:49
Avatar
coells
Redaktor
Avatar
Odpovídá na phageweb
coells:

Co přesně chceš udělat? Ten pseudokód, co používáš, je velice matoucí. Napiš to buď v C nebo slovy popiš, co dělá funkce wbuf.

 
Nahoru Odpovědět 3.10.2014 11:01
Avatar
phageweb
Člen
Avatar
Odpovídá na coells
phageweb:

maji to byt kruhove buffery, ktere ukladaji ruzne struktury

Zapisuju na urcitem miste (wbuf) do bufru, na jinem miste vycitam strukturu(rbuf) a zpracovavam

 
Nahoru Odpovědět 3.10.2014 11:08
Avatar
phageweb
Člen
Avatar
Odpovídá na phageweb
phageweb:

pardon, se mi sem nechtene povedlo dat jakousi fajvku,

ty struktury jsou typove zvlast, kazdy buffer je pro urcity typ struktrury

 
Nahoru Odpovědět 3.10.2014 11:32
Avatar
coells
Redaktor
Avatar
Odpovídá na phageweb
coells:
typedef struct
{
    int i;
} S1;

typedef struct
{
    double d;
} S2;

void wbuf(void *buffer, int *index, int *count, size_t buf_size, const void *structure, size_t str_size)
{
    int i = (*index + *count) % buf_size;
    memcpy(buffer + i * str_size, structure, str_size);
    (*count)++;
}

int main(int argc, const char * argv[])
{
    S1 s1_pole[5];
    int s1_index = 0, s1_count = 0;

    S2 s2_pole[5];
    int s2_index = 0, s2_count = 0;

    S1 s1 = { 1 };
    S2 s2 = { 2.2 };

    const size_t s1_size = sizeof(s1_pole) / sizeof(S1);
    const size_t s2_size = sizeof(s2_pole) / sizeof(S2);

    wbuf(s1_pole, &s1_index, &s1_count, s1_size, &s1, sizeof(S1));
    wbuf(s2_pole, &s2_index, &s2_count, s2_size, &s2, sizeof(S2));

    wbuf(s1_pole, &s1_index, &s1_count, s1_size, &s1, sizeof(S1));
    wbuf(s2_pole, &s2_index, &s2_count, s2_size, &s2, sizeof(S2));
}
 
Nahoru Odpovědět 3.10.2014 11:46
Avatar
phageweb
Člen
Avatar
Odpovídá na coells
phageweb:

diky, tak vyzkousim projdu... divim se, ze jsem podobnou konstrukci nikde nenasel, neprijde mi to to tak nepouzivane...jeste jednou diky moc

 
Nahoru Odpovědět 3.10.2014 15:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.