n0wy Opublikowano 28 Kwietnia 2005 Zgłoś Opublikowano 28 Kwietnia 2005 zmienna *char, na ogół nie chcą mi odczytać poprawnych wartości z pola Edit (czasem się udaje) np. ma odczytać liczbę binarną np "111111", zazwyczaj jest "1111\x14". W innej natomiast zamiast "110" pojawia się "110vclshmem.cpp: GetBorMemPtrs failed". Czemu pojawiają się te śmieci? Da się coś z tym zrobić? :o Z góry dzięki za pomoc. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 28 Kwietnia 2005 Zgłoś Opublikowano 28 Kwietnia 2005 napisales: "np. ma odczytać liczbę binarną np "111111"," no to skoro ma... to niech odczytuje, nie ? Chyba nie sadzisz ze kompilator ma blad. To TY robisz jakis blad w swoim programie a my nie jestesmy wrozkami zeby wiedziec jaki. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
n0wy Opublikowano 28 Kwietnia 2005 Zgłoś Opublikowano 28 Kwietnia 2005 (edytowane) Sprawdzałem krokowo kilka razy i nie widzę żadnych błędów. Program jest dość długi i ciężko go wkleić, ale o to sam jego początek: void __fastcall TForm1::Button1Click(TObject *Sender) { Zamien.bin=Edit1->Text.c_str(); /*tu jest ten pierwszy opisany błąd, nieprawidłowo doczytuje wartość z pola Edit bin jest zadeklarowany tak : "char *bin;" */ if (ComboBox1->ItemIndex==1) { Zamien.Bin2Dec(Zamien.bin); Label2->Caption=Zamien.dec; ....itd... Edytowane 28 Kwietnia 2005 przez n0wy Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 28 Kwietnia 2005 Zgłoś Opublikowano 28 Kwietnia 2005 (edytowane) a allocujesz miejsce pod ten pointer ? cos typu: Zamien.bin=(char*) malloc (strlen(Edit1->Text.c_str()); poza tym nie przepisuje sie stringow za pomoca =, tylko strcpy(Zamien.bin, Edit1->Text.c_str()); tak wiec twoj kod wyglada tak: #include "stdlib.h"#include "string.h"void __fastcall TForm1::Button1Click(TObject *Sender){Zamien.bin=(char*) malloc (strlen(Edit1->Text.c_str()));strcpy(Zamien.bin, Edit1->Text.c_str());if (ComboBox1->ItemIndex==1){Zamien.Bin2Dec(Zamien.bin);Label2->Caption=Zamien.dec;....itd... Edytowane 28 Kwietnia 2005 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
n0wy Opublikowano 28 Kwietnia 2005 Zgłoś Opublikowano 28 Kwietnia 2005 Wielkie dzięki za pomoc! :-P dzis już nie mam czasu, jutro wprowadzę poprawki i dam znać jak działa Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Haze Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 Zamiast char użyj AnsiString, Luke ... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 albo poprostu zastosuj String w klasie , bo po bawić sie const char * ??? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 (edytowane) bo szybsze ? VCL i inne wynalazki sa straznie wolne. Pewien moj program w ktorym uzywalem vector <char *> dane; po przerobieniu na listy ( wlasny struct/class ) chodzil mi 3 razy szybciej ( wyszukiwanie ~6 sekund zamiast ~18 ). Jak to slusznie zostalo powiedziane: "in c you have to code your errors by yourself, c++ does it for you" i niby czemu uwazasz ze tam jest uzyte const char * ? Wtedy to to by zupelnie nie dzialalo :) Edytowane 29 Kwietnia 2005 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 Są wolniejsze ale też bezpieczniejsze (coś za coś)... (pozatym szablonowy string jest bardzo fajnym "typem" do napisów, no przynajmniej dla mnie :P) Wiesz, pisze const char* z przyzwyczajenia bo najczęściej tak robie (poprostu tak jest bezpieczniej jeśli wskaźnik "pokazuje na stały obiekt", żeby nic tam już nie trafiło przez przypadek) jeśli mi jest potrzebny wskaźnik pokazujący na jakiś napis itd... Znana jest też reguła że "na wskaźnikach wymięknąć każdy może, trochę lepiej lub trochę gorzej" :twisted: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
n0wy Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 ok pierwszy problem zażegnany ;] Wielkie dzięki Teraz poproszę jeszcze o pomoc z 2 Funkcja ma zamieniać liczbę binarną na ósemkową, na końcu tekst pojawiają się jakieś śmieci i program się wysypuje problem najwyraźniej związany jest z " tekst[j]=bin;". Wiecie jak to zastąpić? Z góry dzięki za pomoc void CZamien::Bin2Oct (void) { int dlugosc=strlen(bin)/3; if ((strlen(bin) % 3)==0) dlugosc--; unsigned int i,j=2; char *tekst=""; tekst=(char*) malloc (3); for (i=strlen(bin)-1;dlugosc>=0;i--) { tekst[j]=bin[i]; if ((j==0) || (((strlen(bin) % 3)!=0) && (dlugosc==0))) { itoa (Bin2Dec (tekst),tekst,10); oct[dlugosc]=tekst[0]; dlugosc--; tekst=NULL; if (((strlen(bin) % 3)!=0) && (dlugosc==0)) j=strlen(bin) % 3; else j=3; } j--; } } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 (edytowane) ja cie nie rozumiem... Ustawiasz pointer text=NULL, a potem probujesz cos zapisac do pamieci na ktora pointer (nie) wskazuje To wyglada tak ze: petla sobie dziala. W koncu warunek: if ((j==0) || (((strlen(bin) % 3)!=0) && (dlugosc==0))) zostaje spelniony. Wtedy to miedzy innymi tekst=NULL. Petla jednak sie nie konczy. tekst caly czas wskazuje na null, a ty probujesz cos przypisac do tekst[j] mozesz dac: if(tekst!=NULL) tekst[j]=bin; tylko ja nie wiem czy ten algorytm bedzie dzialal. Edytowane 29 Kwietnia 2005 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 29 Kwietnia 2005 Zgłoś Opublikowano 29 Kwietnia 2005 (edytowane) Ale mi sie nudzilo.... mam nadzieje ze sie przyda: napewno potrzebujesz: #include <stdlib.h>#include <string.h>#include <math.h>int bin2dec(char* bin){ int i,p=0,liczba=0; // kolejno, index, potega, liczba for(i=strlen(bin)-1; i>=0; --i) // lecimy od konca { liczba+=(bin[i]-48)*pow(2,p); // bin[i]-48 to zamiana char 'x' na int x ++p; } return liczba;} teraz masz 2 opcje :) 1 ( dluga ;p ) void CZamien::Bin2Oct (void){ char *tmpbin,*tmp; int i,j,dl,mod; int dlugosc=ceil((double)strlen(bin)/3); //jaka dlugosc bedzie miala liczba typu oct dl=strlen(bin); // dlugosc bin mod=3-(strlen(bin)%3); // ile brakuje do wielokrotnosci 3 if(mod==3)mod=0; // maly blad, ktory korygujemy;p tmpbin=(char*)malloc(dl+mod+1); // tutaj bedziemy przechowywac bin wzbogacone o brakujace 0 na poczatku for(i=0; i<mod; ++i) { tmpbin[i]='0'; // upychamy 0 na poczatek } for(i=0; i<dl; ++i) { tmpbin[i+mod]=bin[i]; // kopiujemy na bin do tmpbin za poczatkowymi zerami } tmpbin[i+mod]='\0'; // null na koniec stringa oct=(char*) malloc (dlugosc+1); // allocujemy pamiec dla liczby octalnej tmp=(char*) malloc (4); // tymczasowa zmienna przechowujaca po 3 kolejne cyfry liczby binarnej for(i=0; i<dlugosc; ++i) // dla kazdej cyfry liczby oct { for(j=0; j<3; ++j) { tmp[j]=tmpbin[i*3+j]; // kopiujemy 3 kolejne cyfry tmpbin do tmp } tmp[3]='\0'; // null na koniec stringa oct[i]=bin2dec(tmp)+48; // jako ze bin2dec zwraca nam w tym wypadku liczby od 0-7, przy zamianie z int na char mozemy uzyc +48 ( szybciej niz inne sposoby ) } oct[i]='\0'; // null na koniec stringa free(tmp); // juz nie potrzebujemy tmp free(tmpbin); // ani tmp bin} 2 (krotka): void CZamien::Bin2Oct (void){ int dlugosc=ceil((double)strlen(bin)/3); //jaka dlugosc bedzie miala liczba typu oct oct=(char*) malloc (dlugosc+1); // allocujemy pamiec dla liczby octalnej itoa(bin2dec(bin), oct, 8 );}:):):) edit: roznica: maxymalne wartosci po przerobieniu intow na longi maxymalna liczba 2 sposobu to: 18446744073709551615, natomiast 1 sposobu to binarna liczba 18446744073709551615-cyfrowa :). Tak jak jest aktualnie na intach sa oczywiscie mniejsze granice :) Nie testowalem szybkosci tych 2 rozwiazan. Napewno sposob 1 daloby sie lepiej zoptymalizowac, choc wcale nie jest powiedziane ze jest wolniejszy od 2, a moze nawet szybszy razor1: ale pointery sa bardzo fajne, mile, przyjemne :) zakochalem sie w nich od kiedy je zrozumialem :) A stalo sie to gdy pisalem swoja pierwsza liste... ( no coz... samouk jestem... zadnej dobrej ksiazki o c/c++ nie przeczytalem... msdn i cplusplus.com power ) Edytowane 29 Kwietnia 2005 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
n0wy Opublikowano 30 Kwietnia 2005 Zgłoś Opublikowano 30 Kwietnia 2005 wielkie dzięki za te kody ;] niedawno przesiadlem się z pascala i jak widać nie czuje się zbyt pewnie w builderze i c++ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...