Dzień dobry
Czy istnieje jakiś wygodny sposób, do użycia w miejsce +
, by połączyć tablice charów? a
jest nazwą pliku, jest typu char*
Image1 -> Picture -> LoadFromFile (a + ".bmp");
Dzień dobry
Czy istnieje jakiś wygodny sposób, do użycia w miejsce +
, by połączyć tablice charów? a
jest nazwą pliku, jest typu char*
Image1 -> Picture -> LoadFromFile (a + ".bmp");
a co to jest a
?
Jeśli a
jest typu std::string
lub AnsiString
(to mi wygląda na C++Builder), to dodawanie do tego typu literału powinno działać od ręki.
MarekR22 napisał(a):
a co to jest
a
?
Jeślia
jest typustd::string
lubAnsiString
(to mi wygląda na C++Builder), to dodawanie do tego typu literału, powinno działać od ręki.
Brzydko mi sformatowało, a
jest typu char*
Jak a
jest typu char*
to ma to wyszskie przypadłości z C .
Jako, że to jest wskaźnik, to operacje dodawania jedynie przesuwają wskaźnik. Nie ma przeładowania operatora dodawania, który tworzyłby nowy napis z dodawania dwóch wskaźników.
Prawdopodobnie potrzebujesz:
Image1 -> Picture -> LoadFromFile (AnsiString(a) + ".bmp");
Ale co to za biblioteka jest w ogóle?
Bo jeśli to jest https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.Classes.TStrings.LoadFromFile to tam nie ma char*
tylko System.UnicodeString
. A on ma metode +
https://docwiki.embarcadero.com/Libraries/Alexandria/en/System.UnicodeString_Methods
Więc poprawne pytanie powinno brzmieć jak przekonwertować char*
na System.UnicodeString
.
zkorseita napisał(a):
MarekR22 napisał(a):
a co to jest
a
?
Jeślia
jest typustd::string
lubAnsiString
(to mi wygląda na C++Builder), to dodawanie do tego typu literału, powinno działać od ręki.Brzydko mi sformatowało,
a
jest typuchar*
No to już wiesz, żeby nie planować takich zmiennych w takich kontekstach.
Jesli jakiś guru C uczy że to jest szybkie, to skutki takiej decyzji "nadrabiają" wszelkie oszczędności
MarekR22 napisał(a):
Prawdopodobnie potrzebujesz:
Image1 -> Picture -> LoadFromFile (AnsiString(a) + ".bmp");
Sposób jest ze wszech miar ok, ale jest ratowaniem źle zaplanowanego kodu zewnętrznego
BTW wszystkie sposoby ślizgają się po automatycznych kontruktorach, operatorach kopiujacych / konwertujacych, które MIAŁY być ułatwieniem
johnny_Be_good napisał(a):
nawet przez myśl Ci nie przeszło, że sam możesz stworzyć takie rozwiązanie?
Pokaż rozwiąznie problemu w C, bo tylko to jest religijnie poprawne, które
a) nie mnoży bytów ponad konieczną potrzebę
b) nie wymaga dyscypliny np zwalniania (udokumentowania / czytania i przestrzegania dokumentacji)
c) nie wycieka, nie przejeżdża buforów na dowolnie złośliwych danych
d) będzie jak OP pyta - wygodne
System::UnicodeString concat(System::UnicodeString a, System::UnicodeString b){
return a+b;
}
Image1 -> Picture -> LoadFromFile (concat(a, ".bmp"));
lizme napisał(a):
System::UnicodeString concat(System::UnicodeString a, System::UnicodeString b){ return a+b; } Image1 -> Picture -> LoadFromFile (concat(a, ".bmp"));
w zasadzie identyczne jak rzutowanie @MarekR22 , bo mniej czy bardziej jawne rzutowanie na obiektowy XxxxString jest istotą.
A wprowadzenie funkcji, która będzie używa raz - dla mnie jest minusem (brzytwa Ockhama)
Mamy problem (źle dobrany typ zmiennej) to przyjmujemy na klatę jawnie, a nie zamiatamy pod dy... niejawne konwersje
AnyKtokolwiek napisał(a):
A wprowadzenie funkcji, która będzie używa raz - dla mnie jest minusem (brzytwa Ockhama)
Chociaż na C++ się nie znam to dla mnie podstawą jest żeby funkcje były czytelne i często krótkie. Największa zmora dla mnie to jak podzielić długą funkcję na logiczne całości. Jeśli można rzutowanie i łączenie wyciągnąć do osobnej funkcji to mnie się to podoba
Co do zasady tak, czytelniejsze jest jawne niż niejawne rzutowanie; ale są od tej zasady wyjątki wprowadzające szum informacyjny. Nie widzę, przykładowo, potrzeby jawnego rzutowania stałych intów na uinty; albo właśnie literałów znakowych na odpowiedni typ stringa. Od tego, znowu, wyjątek, jeśli żonglujemy różnymi rodzajami intów, albo różnymi rodzajami stringów, w krótkim fragmencie kodu. — Althorion 43 minuty temu
W każdym normalnym języku zgoda ...
Tu mamy nieszczesne C++ które już w standardzie ma 3-4 typy kompatybilne z napisem (świadomie nie używam mglistego słowa string) a w dialekcie z wysp Hulla-Gulla coś koło ośmiu dziesięciu (?) *)
Jeszcze pod dywanem ukrywa się sposób kodowania
Więc w C++ uważam wersję @MarekR22 za najlepszą (najlepiej sprzątającą problem)
z wyrazami mojego głebokiego szacunku dla Komitetu Standardyzacyjnego, pozdrawiam
ps. BTW w normalnym języku i sam problem pierwotny by się nie pojawił.
*)
pod warunkiem, że nie dogramy ... np parsera XML ze swoim stringiem ...
zkorseita napisał(a):
Dzień dobry
Czy istnieje jakiś wygodny sposób, do użycia w miejsce+
, by połączyć tablice charów?a
jest nazwą pliku, jest typuchar*
Image1 -> Picture -> LoadFromFile (a + ".bmp");
Wystarczy, że dasz:
strcat(a, ".bmp");
Image1->Picture->LoadFromFile(a);
nawet nic tam nie musisz rzutować w LoadFromFile.
adolf napisał(a):
zkorseita napisał(a):
Dzień dobry
Czy istnieje jakiś wygodny sposób, do użycia w miejsce+
, by połączyć tablice charów?a
jest nazwą pliku, jest typuchar*
Image1 -> Picture -> LoadFromFile (a + ".bmp");
Wystarczy, że dasz:
strcat(a, ".bmp"); Image1->Picture->LoadFromFile(a);
nawet nic tam nie musisz rzutować w LoadFromFile.
Brakowało mi podobnej wypowiedzi. Ten wątek nie byłby kompletny, pełny. Szczerze, to trochę czekałem.
W tym momencie twój ekspres do kawy daje kawę do końca zbiornika, Airbus spada, konto bankowe się oczyszcza a sonda kosmiczna idzie tam gdzie RFS Moskwa.
Niemal na pewno przejechałeś bufor i rozjechałes inne struktury w pamięci.
Pożyczone za Anyktokolwiek: Bo C to najlepszy język, każdy uczeń ci to powie