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

Jak wygodnie połączyć tablice znaków?
ZK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
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*

Kopiuj
Image1 -> Picture -> LoadFromFile (a + ".bmp");
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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.

ZK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
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*

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
Image1 -> Picture -> LoadFromFile (AnsiString(a) + ".bmp");
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5674
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.

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
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:

Kopiuj
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

LI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 38
1
Kopiuj
System::UnicodeString concat(System::UnicodeString a, System::UnicodeString b){
  return a+b;
}

Image1 -> Picture -> LoadFromFile (concat(a, ".bmp"));
AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0
lizme napisał(a):
Kopiuj
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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5674
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

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
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 ...

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 40
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*

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

Wystarczy, że dasz:

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

nawet nic tam nie musisz rzutować w LoadFromFile.

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
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*

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

Wystarczy, że dasz:

Kopiuj
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.