Przypisanie wskaźnika string char do char array możliwe?

0

Witam mam dość poważny problem piszę aplikację i dane z bazy postgresql mogę otrzymać jedynie w postaci char, jednak wysłać przez soket da się tylko char array. Wiadomo, że w można użyć strcpy i po sprawie ale co w przypadku jeśli dane są ogromne? Na przykład gdybyśmy mieli wysyłać jakiś duży obiekt, który ma ponad 1GB. Tutaj już widać że zaczynamy mieć problem.
Więc czy istnieje możliwość przypisania wskaźnika char
do char array i odczytu tego stringa za pomoca char array. Oczywiście w mojej kwestii pozostało by pilnowanie bym nie wyszedł poza długość, oraz bym nie nadpisywał elementów stringa. Czy jest możliwe takie zachowanie był bym bardzo wdzięczny za pomoc.

W skróconej formie można powiedzieć, że na odczycie danych po przypisaniu wskaźników by się skończyło. W jaki sposób mogę tego dokonać bez kopiowania znaków!?
char *x = "abc";
char y[4];
y=x;
printf("%c, %c, %c", y[0],y[1],y[2]);

0

To przypisanie jest błędne i bez sensu. Możesz zrobić tak:

char *x = "abc";
printf("%c, %c, %c", x[0],x[1],x[2]);

Ponieważ C/C++ traktuje tablice jak wskaźnik na pierwszy element tablicy (ale tablice != wskaźniki) więc kod *x jest równoważny x[0], a nawet *(i + 0), *(0 + i) i analogicznie kod 0[x] też jest poprawny.

0

strcpy()

0

Dobrze wiem, że takie przypisanie jest błędne. Jest również bez sensu gdy się nie zna powodu związanego z takim użyciem.
Jednak gdybym miał możliwość takiego przypisania bym mógł czytać z przykładowego obiektu y to zdecydowanie usprawnił bym działanie masowego servera, który aktualnie piszę.
Nie jestem jednak nawet pewien czy takie przypisanie dało by się w jakiś sposób napisać i tutaj właśnie po to zgłosiłem się po pomoc byście pomogli mi napisać takie przypisanie o ile jest ono możliwe. :) Dzięki wielkie jeśli komuś się uda.

0

Ale moje pytanie to po co skoro kompilator nie rozróżnia czy to jest tablica czy wskaźnik!

0

Hehe po co i po co bez sensu i nie bez sensu :P myślałem że to ja mam pytanie :D ale ok

Struct X
{
char a[10];
char b[20];
}

Struct Y
{
char a;
char b
;
}

Funkcja send w sys/socket wyśle strukturę X jako 30B a strukturę Y jako 8B
Więc aby wysłać Strukturę Y prawidłowo należało by ją rzutować na X i dopiero to wysłać czyli coś takiego:
Y y;
X x = (X)y;
i powinniśmy wysłać x
ale w moim przypadku takie coś nie działa bo o dziwo co mnie do teraz zastanawia
wskaznikA1=x.a;
wskaznikA2=y->a;
wskaznikA1 nie rowna sie wskaznikA2 ! nie mam pojęcia dlaczego tak się dzieje będę wdzieczny jeśli ktoś mi powie dlaczego.
Skoro te adresy się u mnie nie zgadzały no to pomyślałem że wystarczy że stworzę obiekt x i przypiszę adresy y.a i y.b do x->a i x->b i wyślę x
taka próba może i was wszystkich dziwić ale dla masowej aplikacji serverowej, która ma wysyłać dużą ilość sporych stringow takie zachowanie było by dużym usprawnieniem zamiast bez sensu spowalniać server niepotrzebnym kopiowaniem, pytanie jak można osiągnąć taki rezultat
przecież char *a i char a[] jest przechowywany w pamięci tak samo.

0

Socket przecież przyjmuje jako argument wielkość danej struktury jaką ma wysłać. Nie możesz tego policzyć i wpisać tam odpowiedniej wartości?

0

Mógłbyś rozwinąć to co masz na myśli bo nie wiem czy dobrze rozumiem?
Jeśli chodzi o liczenie to nawet nie musiał bym tego liczyć bo te stringi miały by zawsze tę samą długość.
Miał bym mieć dane w takiej postaci:
Struct Y
{
char a;
char b
;
}
i powiedzmy ze:
a ma 4B
b ma 10B

jak by to miało wyglądać przecież funkcja send wyśle tylko adresy tych wskazników wiec nie ma tutaj chyba nic do liczenia?

0

Nie nie nie!

X x;
Y y;
//skoro chcesz wysłać te napisy z tych struktur to najpierw je trzeba tam wrzucić:
strcpy(x.a, "xa");
strcpy(x.b, "xb");

y.a = new char[3];
y.b = new char[3];
strcpy(y.a, "xa");
strcpy(y.b, "xb");

//jak widać w przypadku struktury x całość jest w jednym ciągłym bloku pamięci,
//w przypadku struktury y w ciągłym bloku są tylko wskaźniki(na stosie), a same napisy mogą być wszędzie(na stercie).

//żeby wysłać x wystarczy coś w tym stylu:
send(&x, sizeof(x));

//ale żeby wysłać y już tak lekko nie ma:
send(y.a, strlen(y.a));
send(y.b, strlen(y.b));
//jeżeli już musisz to zrobić jednym wywołaniem send to bez kopiowania się nie obejdzie
unsigned char *buffor = new unsigned char[strlen(y.a) + strlen(y.b)];
memcpy(buffor, y.a, strlen(y.a));
memcpy(buffor + strlen(y.a), y.b, strlen(y.b));
send(buffor, strlen(y.a) + strlen(y.b));

//edit: jeżeli napisy zawsze są tej samej wielkości to użyj sposobu X, jak różnej długości to sposobu Y

0

Jak zaczynałem ten temat to chciałem wiedzieć czy możliwe jest takie przypisanie tych wskaźników i jeśli tak to w jaki sposób.
Takie przypisanie bym mógł wysłać taką strukturę za jednym sendem.
Jednak dochodzimy do tego, że takie coś czego chciałem dokonać nie uda się zrobić.
Dalej nie mogę wyjść z podziwu dlaczego nie mogę przypisać do char a[10] adresu char *a. przecież ich reprezentacja w pamięci jest (chyba?) taka sama...

To znaczy że wychodzi na to, że pozostaje mi albo do wywołać send'a tyle razy ile jest wskaźników albo kopiować te dane do char array...
Strasznie nie zadowala mnie takie rozwiązanie gdyby, ktoś wpadł jeszcze na jakieś rozwiązanie to był bym wdzięczny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0