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

Odpowiedz Nowy wątek
2011-07-24 12:05
szymko
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]);

Pozostało 580 znaków

2011-07-24 12:30
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.

w C++ zapis 0[x] to raczej wymóg zgodności z C niż feature (i działa AFAIR tylko dla typów prostych). - msm 2011-07-24 12:36
Aye. Nie chciało mi się już tego pisać. - hauleth 2011-07-24 13:16

Pozostało 580 znaków

2011-07-24 16:21
0

strcpy()

"Wiadomo, że w można użyć strcpy i po sprawie" - Afish 2011-07-24 16:44

Pozostało 580 znaków

2011-07-24 17:20
szymko
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.

Dla pewności wklej prototypy funkcji, które służą do wymiany tych danych. - yet_another_bug 2011-07-24 17:50

Pozostało 580 znaków

2011-07-24 17:46
0

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

żeby było trudniej i by namieszać ludziom w głowach. potem się czyta, że "tablica to wskaźnik na jej pierwszy element" co jest nie tylko nieprawdą, ale i semantycznym nonsensem. - Azarien 2011-07-24 20:10
Nie moja wina, że czytać nie umieją. - hauleth 2011-07-24 20:12

Pozostało 580 znaków

2011-07-24 19:28
szymko
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.

Pozostało 580 znaków

2011-07-24 19:31
0

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

Pozostało 580 znaków

2011-07-24 19:41
szymko
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?

Pozostało 580 znaków

2011-07-24 19:43
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


edytowany 3x, ostatnio: byku_guzio, 2011-07-24 19:47

Pozostało 580 znaków

2011-07-24 20:00
szymko
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.

Pozostało 580 znaków

2011-07-24 20:05
szymko
0

No nie mogę przeboleć tego, że coś co mam już w pamięci jako char* muszę jeszcze raz kopiować do pamięci...
Po prostu nie chce mi się wierzyć aż że w takim języku jak c nie można odpowiednio podstawić tych wskaźników (oczywiście nie naruszając praw dostępu do stałej, a jedynie ją czytając...).
Dlaczego takie przypisanie nie miało by być możliwe to by oznaczało, że te typy jednak się od siebie różnią w jakimś znaczącym stopniu na niższych poziomach... :/

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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