Jak wygodnie połączyć tablice znaków?

0

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");
1

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.

0
MarekR22 napisał(a):

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.

Brzydko mi sformatowało, a jest typu char*

4

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");
1

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.

0
zkorseita napisał(a):
MarekR22 napisał(a):

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.

Brzydko mi sformatowało, a jest typu char*

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

1
System::UnicodeString concat(System::UnicodeString a, System::UnicodeString b){
  return a+b;
}

Image1 -> Picture -> LoadFromFile (concat(a, ".bmp"));
0
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

0
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

2

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

0
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 typu char*

Image1 -> Picture -> LoadFromFile (a + ".bmp");

Wystarczy, że dasz:

strcat(a, ".bmp");
Image1->Picture->LoadFromFile(a);

nawet nic tam nie musisz rzutować w LoadFromFile.

5
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 typu char*

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1