Skocz do zawartości
qreatyna

[ C / C ++ ] Borland Tmemo

Rekomendowane odpowiedzi

Cześć witam . Mam pytanie związane z komponentem TMemo

w Borlandzie . W trakcie pobierania tekstu do bufora znakowego zamazuję

pamięć. Niestety nie wiem dlaczego tak się dzieje . Podaję częśc kodu , który generuje błąd

 

 char * expression; [  bufor znakowy , 1024 bajty , przydzielenie pamieci funkcja                                   malloc , alokacja udana];     void getTextAndProcess( TMemo * field )      {           unsigned int len = strlen( expression );           for(unsigned int i = 0; i < len; i++)                expression[ i ] = ' ';           expression[ len ] = NULL;       //  funkcja ponize zamazuje pamiec , choc       //  rozmiar TMemo wynosci 1000 bajtow           field->GetTextBuf( expression  ,  field->GetTextLen() + 1 );         }    Co więc robię zle , nie  uczyłem się Borlanda natomiast  musze z tego komponentu    zrobic  wyswietlacz  , wybralem TMemo , gdyż wydawał mi sie odpowiendi.   Jezeli macie jakies pomysl to proszę o pomoc . Z góry dzięki - narazie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie znam sie na Borlandzie ale

char * expression;

To jest wskażnik do chara

odwolanie expression jest tu nie poprawne.(gdyż wskaznik nie jest tablicą)

jego wartością jest lidzba cheksadecymalna (adres komurki pamieci)

tak samo

strlen( expression );
da nie poprawny wynik(da dlugo).

Spróbuj

char * expression = &bufor;

i w pętli

for(...;...;...)
możesz inkrementować adres wskażnika przez

expression++;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

char * expression;

expression[ i ] = przecież to String

w ktorym miejscu to jest string ?

jakby to byl string to by wygladal tak:

 

string expression;

a nie tak jak ty to zrobiles ( o ile sam to robiles );

 

Tworzysz WSKAZNIK nie wiedzac co to jest ? doksztalc sie na ich temat a wtedy ewentualne problemy zglaszaj na forum.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To nie jest string tylko wskaznik do stringa...

jako takiego bledu nie widze w tym fragmencie co tu podales... sprawdz jedynie czy pointer expression wskazuje na to miejsce co oczekujesz.

 

i moze wytlumacz CO JEST ZLE ?

 

bo ani

Co więc robię zle , nie  uczyłem się Borlanda natomiast  musze z tego komponentu    zrobic  wyswietlacz  , wybralem TMemo , gdyż wydawał mi sie odpowiendi. 

Jezeli macie jakies pomysl to proszę o pomoc . Z góry dzięki - narazie. 

ani:

cześć witam . Mam pytanie związane z komponentem TMemo

w Borlandzie . W trakcie pobierania tekstu do bufora znakowego zamazuję

pamięć. Niestety nie wiem dlaczego tak się dzieje . Podaję częśc kodu , który generuje błąd

;

 

nie mowi nam w czym masz problem...

 

W trakcie pobierania tekstu do bufora znakowego zamazuję

pamięć. Niestety nie wiem dlaczego tak się dzieje .

... n/c

pewnie dlatego:

unsigned int len = strlen( expression );         for(unsigned int i = 0; i < len; i++)              expression[ i ] = ' ';         expression[ len ] = NULL;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ok dyskusjs zeszła na złe tory , więc wyprostuje kilka rzeczy .

Po pierwsze jeżeli chodzi o String to kod podany poniżej jest poprawny

 

  char * pStr = (char *)malloc( 10 ); //bla bla kod ktory zajumuje sie tym  -Stringiem-    unsigned int slen = strlen( pStr );     for(int i = 0; i < slen; i++)          pStr[i] = 'a';    pStr[ slen ] = NULL;

Dlaczego napisałem ze to jest String , bo dla mnie niewazne jest to czy jest to tablica znakow , wskaznik do char , czy tez do Stringa lub długi wskażnik do String

czy klasa String w C++ lub Javie bo operuje na tekscie , tylko w rózny sposób mam do niego dostep . Macie racje moje słowa mogly byc opacznie zrozumiane gdy napisalem

ze

 char * expression[ i ] //przeciez to String  
chodziło mi o to że operuje na tekscie , wyrażałem wątpliwosc co do słow Contrasta ktory napisal ze w wyniku operacji

 

strlen( expression );

otrzymam zły wynik , co oczywiscie jest stwierdzenim błędnym.

Równiez odwołanie

   expression[ i ] =  znak;  
jest prawidlowe , dlatego sie zdziwilem ze ww tym miejscu sugerujecie mi blad.

Tam na pewno go nie ma .

 

A jaki mam problem - jest napisany na poczatku postu - program zamazuje pamiec.

 

A robi to instrukcja GetTextBuf ( param ) , reszte kodu napisalem zeby nie bylo pytan dotyczacych banalow , lecz tego nie dalo sie jak widac uniknac.

 

Moje pytanie wiec brzmi , czy nie wiecie czemu funkcja BIBLIOTECZNA

GetTextBuf wywołuje błąd ochrony pamieci , czyli zamazuje pamiec .

 

Zeby nie bylo zadnych wattpliwosci kod pnizej wygeneruje ogolny blad ochony pamiec

 

 void getTextAndProcess( TMemo * field , ...)    {       field->GetTextBuf( expression ,  field->GetTextLen + 1 );    }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Panowie czy String w C++ jest tablicą Charów i można sie odwoływać do jego elementów poprzez indeksy?

 

Wydaje mi sie że nie.

 

Ja bym utwożył tak:

 

int lenth = ....;char[] bufor= new char[lenth];char * ptr = &bufor[0]; //wskazuje na pierwszy element bufora; for(int i = 0; i <lenth; i++){/*ptr = "";//wstawienie pustego znaku do bufor[i]ptr ++;//inkrementacja wskażnika;//jeśli bufor zajmuje jednolity przedział adresów w pamieci(jak to jest w c++?)}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Posłuchaj nie musze sie dokształcac ze wskaznikow .

 

Po pierwsze przeczytaj tytuł postu - pisze tam [ C / C++ ]

wszystkie odwołania w C , które tutaj zaprezentowałem są poprawne i nie

kłoć sie ze mną o to bo widze że jestes teoretykiem programowania a nie praktykiem

 

Pisesz że

Panowie czy String w C++ jest tablicą Charów i można sie odwoływać do jego elementów poprzez indeksy?

 

Wydaje mi sie że nie.

a potem pokazujesz fragment programu , który inkremenruje wskaznik który porusza się po ciągłym obszarze pamięci ( czyżby to nie była definicja tablicy ) , sam sie doucz wskaznikow

 

Dalej pokazujesz fragment kodu

  unsignet int size = field->GetTextLen();

expression=(char*) malloc ( size );

field->GetTextBuf( expression , size );

który według siebie jest lepszy od mojego

 

      field->GetTextBuf( expression ,  field->GetTextLen + 1 );

Niestety musze cie zmartwic , bo to jest dokładnie to samo :)

 

I ciągle nie ustosunkuwujesz sie do mojego pytania tylko uczepiłes się tego Stringa , co pozwala mi stwierdzic iż nie masz nic wiecej do powiedzenia

Dziękuje

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

probowales to chociaz ?

bo to nie jest dokladnie to samo...

 

GetTextBuf()

oczekuje 2 parametrow:

1 z nich bedacy tablica charow do ktorej zostanie skopiowana zawartosc bufora obiektu

2 dlugoscia jaka ma kopiowac

 

char * expression; jest wskaznikiem wskazujacym do pewnego miejsca w pamieci.

a ty chcesz tam wrzucic dowolnej dlugosci tablice charow.

 

Teraz pomysl i sie zastanow jakiej wielkosci obszar pamieci zajmuje twoj pointer *expression i czy w tym fragmencie zmiesci zawartosc bufora pola field. Niby skad program ma wiedziec ile pamieci ma przypisac wskaznikowi ? MUSISZ TO ZADEKLAROWAC poprzez malloc, ktore w moim przykladzie wystepuje, a w twoim nie.

 

Imho ty nawet tego nie sprobowales, ale odnosisz sie do mnie tonem jakbys wszystkie rozumy pozjadal. W takim razie powinienes sobie samemu poradzic. Ja probuje ci pomoc z wlasnej nie przymuszonej woli i nic z tego nie mam. Poswiecam ci moj cenny czas wiec TROCHE SZACUNKU.

 

"Posłuchaj nie musze sie dokształcac ze wskaznikow ."

Ja mimo wszystko twierdze ze musisz.

 

"Po pierwsze przeczytaj tytuł postu - pisze tam [ C / C++ ]

wszystkie odwołania w C , które tutaj zaprezentowałem są poprawne i nie

kłoć sie ze mną o to bo widze że jestes teoretykiem programowania a nie praktykiem"

1. przeczytalem. wlasnie dlatego tu wszedlem. wierz mi... pascala bym nie tknal

2. nie pisze tylko jest napisane

3. skoro sa poprawne to w czym masz problem ? uwazasz ze borland spierd**** robote tworzac swoj kompilator, a nie ty piszac swoj kod ?

4. mylisz sie... wszystko co umiem nauczylem sie sam piszac programy. i podchodze tak do kazdego jezyka zarowno c/c++/php jak ang czy niem. teoria sux... wazna jest praktyka.

 

"co pozwala mi stwierdzic iż nie masz nic wiecej do powiedzenia

Dziękuje"

Nie ma sprawy... tylko ten post w nadzieji ze ci jednak pomoze. Wiecej tutaj palca nie wloze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niestety muszę stwierdzić iz jestem człowiekiem bardzo cierpliwym , lecz wytrzymałem tylko dwa posty w których wytknąłes mi nieuctwo . Cytuję

 

Tworzysz WSKAZNIK nie wiedzac co to jest ? doksztalc sie na ich temat a wtedy ewentualne problemy zglaszaj na forum.

jak juz mowilem... doksztalc sie o wskaznikach !!!

Nie chcę się kłócić , lecz jezeli wytykasz mi nieuctwo , zamiast dokładnie przeczytać post

i odpowiedziec na niego jezeli znasz odpowiedz , to trochę mnie to zdenrwowało.

 

Na poczatku jest program , w którym pisze iz bufor został zaalokowany mallociem,

jego rozmiar jest scisle kontrolowany przez program i uwierz mi ze to nie wina tego wskaznika , wszystko jest kontrolowane przez system. Nie pisalem tu całego programu bo zajmuje 147 kilo , użyłem tylko Borlanda do tworzenia Gui ( zalezy mi na czasie )

i natknąłem się na problem , którego rozwiązanie chciałem tutaj znalezc.

Jeżeli poczułes się urażony to przepraszam.

 

 

GetTextBuf oczekuje 2 parametrow ,.Pierwszy to wskaznik do Stringa , drugi liczba

znakow do pobrania.

Wskaznik to Stringa jednak trzeba kopiowac , bo jest on pozniej nieuzyteczny( takie informacje są w pomocy ) i moze wywolac bład ochrony pamiec , lecz to TEZ NIE TEN PROBLEM . Nadal wystepuje załamanie programu w trakcie pracy.

Jestem otwarty na sugestie - moze GetTextBuf jest przestarzała funkcja ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mialem nic tu nie pisac wiecej ale az mnie krew zalewa...

[ciah ciah ciah! tu byla niezla wiazanka - deleted by: automatyczna kontrola mojej kultury]

zrob tak jak ci napisalem i wtedy napisz czy dziala czy nie.

Ty jestes jakis nienormalny. Oczekujesz pomocy, ale jak ktos wytyka ci blad to wmawiasz mu ze tam go nie ma bo jak to ladnie napisales : "jego rozmiar jest scisle kontrolowany przez program i uwierz mi ze to nie wina tego wskaznika".

 

"Na poczatku jest program , w którym pisze iz bufor został zaalokowany mallociem"

no wlasnie... na poczatku ! A na jaki rozmiar ? jestes pewien ze na taki sam co field->GetTextLen() ?

 

zrob wiec:

field->GetTextBuf( expression , strlen(expression) ); <-- ale w tym wypadku moze nie zostac skopiowana cala zawartosc bufora field. Nie bedzie jednak bledu ze kopiowany fragment bufora wychodzi poza obszar pamieci wskazywanej przez pointer.

 

"GetTextBuf oczekuje 2 parametrow ,.Pierwszy to wskaznik do Stringa"

SUPER !!! po prostu super... w takim razie zrob:

"string * expression"......... N/C stary. Sorry, ale jestes n00bem, albo pokaz mi gdzie jest napisane o tym wskazniku do stringa...

 

dobra moze nie n00b ale napewno ktos typu:

"Mam nowy komputer: P4 3.8 ghz, gf 6800u, 1gb ram, codegegen 250W. Wie ktos czemu mi sie zawiesza ? zmienialem juz procesor, ram i karte graficzna"

 

"zmien zasilacz !"

 

"Nie ! zasilacz jest dobry ! moj pentium II 300 mhz mial ten sam zasilacz i sie nie zawieszal !!! napewno to nie jest zasilacz"

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Napisaliście:

GetTextBuf()

oczekuje 2 parametrow:

1 z nich bedacy tablica charow do ktorej zostanie skopiowana zawartosc bufora obiektu

2 dlugoscia jaka ma kopiowac

Robiąc :

field->GetTextBuf( expression , size );

gdy size jest większe od expression zgłoszony

bedzie bład pamięci bo zapełni sie expression.

Zostanie podjęta pruba zapisania Size minus ilość elementów w expression znaków z bufora obiektu do pelnego juz bufora expression , co da bląd .

Ps a jakbyś mogl dodac do postu komunikat jaki wywala kompilator to tez by ulatwilo.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Contrast: przeciez caly czas o tym trabie... ale wydaje mi sie ze mowie do sciany...

nie jestem tylko pewien czy:

 

size=field->GetTextLen();

expression=(char*) malloc(size);

czy

size=field->GetTextLen() + 1;

expression=(char*) malloc(size);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wstałem o godzinie 8 rano i z przerwą na posiłki i rozprostowanie obolałych pleców

piszę program . Napotkany błąd naruszył moją delikatną aurę energii ,lecz twoja obecnosc na forum rozp .. ją na kawałki.

 

Odrobinka dobrej chęci z twojej strony zaoszczedziła by nam obu czas.

NIE CZYTASZ MOICH POSTÓW !!!

 

Wróć się odrobinkę do tyłu i zobaczysz iż sprawę alokacji bufora

załatwiłęm już na samym początku , specjalnie nie pisałem kodu z nią związanego

 

Jeżeli napisałem kod

 

 field->GetTextBuf( expression ,  field->GetTextLen() + 1 );  

a w poscie było napisane ze bufor zawiera 1024 bajty a field 1000 bajtow,

to oznacząło ze nie mogę przekroczyc rozmiaru ( przypatrz się programowi w 1 poscie )

Zauważ iż drugi parametr funckji GetTextBuf to field->GetTextLen() , czyli pobieramy rozmiar tekstu który jest aktualnie przetrzymywany przez bufor ( przy ograniczeniu field do 1000 bajtow field->GetTextLen() <= 1000 ) .

 

Sprawdzone , nie ma szans żeby było inaczej.

 

 

Aha i tak - WSKAŹNIK DO STRINGA

( i nie obchodzi mnie czy to jest char * expression , bo ten wskaźnik wskazuje na ciąg uszeregowanych bajtów o ściśle uregulowanym rozmiarze ).

 

Gdybym opierał się na twojej filozofii , wtedy przykładowy program

napisany ponizej mogłby mnie wprowadzic w błąd.

 

 struct  xMeshCoor    {       long double * myNameIsNoImportant;        char * bonesNames ;    };

I powiedz miu czy myNameIsNoImportant jest tablicą czy wskaźnikiem na int.

 

A może bonesNames jest wskaźnikeim na char , a może to String ? , a moze .....

 

A moze to nie ma znaczenia bo pytam sie o GetTextBuf

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

JAKIEJ KOMPILACJII !!!!!!!!!!!!!!!!!!!!!!!!!

 

LUDZIE - przecież mówięo błędzie ochrony pamięci która w czasie kompoilacji nie

występuje :)

 

Program załąmuje się w trakcie działania.

 

 

 

Program nie przektoczy strlen( expression ) bo

 

unsigned int len = strlen( expression );         for(unsigned int i = 0; i < len; i++)              expression[ i ] = ' ';         expression[ len ] = NULL;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

field->GetTextBuf( expression , field->GetTextLen() + 1 );

 

dla memo o wielkosci 1000 nie probuje przezucic przypadkiem przezucic 1001 znakow do expression ? przy czym 1001 znak buffora nie istnieje ?

 

niestety nie mam bcb zeby pokombinowac

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

unsigned int len = strlen( expression );

for(unsigned int i = 0; i < len; i++)

expression[ i ] = ' ';

expression[ len ] = NULL;

 

jest zbedne bo po prostu zawartosc i miejsce nulla jest ignorowane. niestety ale wskazniki znow sie klaniaja :)

 

ale zeby nie bylo ze sie czepiam tych wskaznikow. Przyznam sie ze nie znam bcb ale z tego co widze na google:

to zaczynam watpic czy TMemo obsluguje ->GetTextBuf.

 

sprobuj moze GetData albo Read ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Program ten to kalkulator który pobiera tekst z TMemo

dynamicznie . Zawiesza się np . po kilku wpisanych tekstach ,

ale nie dlatego ze został przekroczony limit bo wyrażenie

expression[ len ] = NULL;

zeruje String , więc to nie to.

 

Jeżeli udowodnisz mi ze ten kod co podałe powyżej nie zeruje Stringa

to moze to byc to , ale jak to zrobisz ????

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

unsigned int len = strlen( expression );

for(unsigned int i = 0; i < len; i++)

expression[ i ] = ' ';

expression[ len ] = NULL;

 

ale ja w tym sensu nie widze...

 

powiedzmy ze pointer wskazuje do obszaru pamieci gdzie przechowywane jest powiedzmy "abcd". strlen zwraca 4.

poszczegolne komorki pamieci wygladaja tak:

0 - a

1 - b

2 - c

3 - d

4 - \0

 

po tej petli:

 

0 - ' '

1 - ' '

2 - ' '

3 - ' '

 

a nastepnie po petli:

4 - \0 // chociaz i tak 4 wczesniej bylo rowne \0

 

sprawdz czy twoj problem nie pojawia sie w chwili gdy najpierw podasz krotszy lancuch danych a pozniej dluzszy.

 

skoro to sie wyklada w momencie przyjmowania danych to moze jednak sprobuj mallocem alokowac ponownie pamiec dla pointera ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

więc tak...

1. nie uzywać maloców.. po to jest w c++ new

2. nie uzywać tablic... :) po to są vectory vector <float> wektor_flołtów; (thx 4 DanieL :)) i tablice się chowają... (opis ma goglach)

3. w borlandzie jest takie narzędzie jak CODEGUARD - tryb emulowania aplikacji.. wychwyci najdrobniejszy błąd, wyciek pamięci, sięganie w obszar zabroniony, naruszanie pamięci i tym podobne (program działa dużo wolniej... ale dzieki temu opanowałem program symulacji sieci neuronowej.. a tam wskaźników mnustwo było...)

4. i jeszcze nie rozumiem po co Ci tam wskaźniki... jest typ AnsiString który doskonale ułatwia prace ze stringami i jest kompatybilny z więkoszścią komponentów... Tmemo ma chyba pole Lines->String (dokładniej AnsiString)..

 

W sumie to nie znam celu takiego działania.. skoro Tmemo ma odpowiednie metody umożliwiające wpsółprace z textem w nim widocznym...

 

aha.. bezpośrednie używanie wskaźników to taki przejaw akademickiej sztuki programowania.. powoli próbuje z niego uciec... NO MORE WSKAŹNIKÓW NA TABLICE! i inne tym podobne niepotrzebne śmieci...

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...