Skocz do zawartości
n0wy

[builder C++] Problem Z *char

Rekomendowane odpowiedzi

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez n0wy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez Nargil

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez Nargil

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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--;                }        }

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez Nargil

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez Nargil

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ę...