Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Witam
Czy ktoś orientuje sie jesli chodzi o limit dlugosci stringa w C++ na kompilatorze GNU GCC ?
Czy zaalokuje poprawnie stringi o dlugosci 100 000 znakow i wiecej ? Czy jest nieograniczony pamieciowo (tz. ograniczony tylko przydzielonym RAMem :D) I z tą pamiecia to jest tak ze kazdy znak 1Bajt + kilka Bajtów dla "obudowy stringa" ?
Offline
A ja Ci dam podpowiedz psychologiczna: pierwsze zadanie PA jest zawsze latwe ;-P A jak jest ze stringam to nie wiem. Latwo to obejsc. Zainteresuj sie dynamiczna alokacja pamieci.
Offline
char [] ="jakiś długi string";
Powinien zaalokować odpowiednią ilość pamięci, a ile tego będzie to pewnie zależy już od systemu i maszyny na której to ma działać.
Co do ilości bajtów, to przy deklaracji jak powyżej to będzie ilość znaków + 1 { ) znak końca linii równy zero.
Pozdrawiam
Offline
najłatwiej byłoby po prostu sprawdzić, i wrzucić do tego stringa ile wlezie (może przyda się poczytać w /usr/include/c++/(wersja)/{,bits/}).
jeśli klasa string okaże się niewystarczająca, można by napisać własną, zoptymalizowaną pod duże ilości tekstu.
stwórzmy jedną klasę, mystrchunk:
class mystrchunk { char stuff[1024]; mystrchunk* next; public: /* konstruktory, accessory, kopiowanie, i te inne bzdury */ }
oraz kolejną, mystr:
class mystr { vector<mystrchunk*> chunks; public: /* konstruktory, accessory, kopiowanie, i te inne bzdury */ }
chodzi o to, że bierzesz sobie takiego mystringa, każesz mu dorzucić np 5000 bajtów, i on sobie leci po liście stringchunków, i jak musi zaalokować jakieś bzdury to robi append(new mystrchunk(buf)) do chunks czy coś w tym stylu... no wiesz, taka tam prosta lista. implementacja tego czegoś jako ciekawe ćwiczenie ;]
a nad przechowywaniem długich stringów w char* bym się zastanowił, bo może bardzo łatwo dojść do przepełnienia bufora!
Offline
jeśli chcesz robić to poprzez operator new to ogranicza nas jedynie ilość posiadanej pamięcie RAM + ewentualnie SWAP
Offline
Miałem na myśli <string> da rade ?
Czy może lepiej na stworzeniu dynamicznie tablicy char operatorem new ? :D
Offline
Uwaga, bede sie wymadrzal ;-) A ze programowac nie umiem to tym bardziej trzeba uwazac :D
Moze sie troche przychrzaniam, ale moim zdaniem takie proste zadania lepiej optymalizowac na poziomie C. Jesli liczy sie czas wykonania to mozna w ten sposob troche zaoszczedzic. A zabawa z klasami to jak strzelanie z armaty do komary. Ale takie strzelanie tez jest ksztalcace. Chyba jestem troche zboczony. Ale to przez studia, wiec przymknijcie na to oko ;-)
A tak bardziej serio to ja od poczatku jestem za dynamiczna tablica char'ow. Ale wole to robic w C, bo uwazam, ze do prostych programow nalezy uzywac prostych (czyt. malo rozbudowanych) jezykow.
PS. dobrze strzelilem ze chodzi o zadanie z PA?
Offline
...
PS. dobrze strzelilem ze chodzi o zadanie z PA?...
Tak :) Wole się upewnić, dzięki za odpowiedzi ;)
Offline
no, to... skoro C...
#include <stdlib.h> int main (int argc, char* argv[]) { char* longstring; longstring = (char*) malloc (1024); longstring = "To jest bardzo dlugi przykladowy tekst. Zmiesi sie pod wskaznikiem longstring tak dlugo, dopoki nie przekroczy 1024 bajtow. Jezeli przekroczy, klapa. Efekt nieprzewidywalny... Gdy tekst nie bedzie juz nam potrzebny, nalezy uzyc funkji free(). uwaga, nie testowalem tego kodu. jak zwykle zadnej gwarancji."; free(longstring); exit (0); }
Takie coś? malloc() zaalokuje tyle bajtów pamięci, ile mu każesz. Wspomoże się swapem jeśli zabraknie ramu i zawiesi kompa jeśli skończy się ram, swap, i nie ustawisz ulimit. Zwróci wskaźnik do zaalokowanej pamięci, gdzie możesz trzymać co-ci-się-tylko-podoba, na którym to wskaźniku musisz potem użyć free() - inaczej zgubisz wskaźnik, pamięć nadal będzie zeżarta, będziesz miał wyciek pamięci, nikt cię nie będzie kochał, dziewczyna cię rzuci, szef wywali z roboty, starzy wydziedziczą, a prościej byłoby użyć C++ i auto_ptr.
Offline