CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - c_str(), które kiedyś działało

c_str(), które kiedyś działało

dział ogólny

c_str(), które kiedyś działało

Nowy postprzez mirekpl6 » piątek, 11 listopada 2016, 15:57

Witam.
Mam problem z c_str(). Kod mojego programu, był tworzony bodajże pod C++ Builder 2007. Program działał prawidłowo. Chce ten sam kod uruchomić na obecnie najnowszej wersji środowiska: C++Builder 10.1 Berlin.

Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop


#include "Unit3.h"
#include "Unit2.h"
#include <math.h>
#include <fstream.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;


Ta linijka:
1:
Kod: Zaznacz cały
MessageBox(Handle,("Twój wynik został zapisany do katalogu " + Label10->Caption).c_str(), "", MB_OK | MB_ICONINFORMATION);


Wyrzuca takie błędy:

[bcc32 Error] Unit3.cpp(144): E2034 Cannot convert 'wchar_t *' to 'const char *'
[bcc32 Error] Unit3.cpp(144): E2342 Type mismatch in parameter 'lpText' (wanted 'const char *', got 'wchar_t *')



Gdy to zakomentuję to mam problem z kodem(kompilator nie wyrzuca błędów,ale kod działa niepoprawnie):

2:
Te poniższe 2 linijki działają prawidłowo...,
Kod: Zaznacz cały

ofstream outfile;
outfile.open(("Wyniki\\"+Label10->Caption+"\\"+i+".txt").c_str());


...ale kolejne nie:
KOD cpp:     UKRYJ  
 
 outfile <<("Poziom trudności: "+Label12->Caption).c_str();
 outfile<<endl;
 outfile <<("Ilość poprawnych odpowiedzi w procentach: "+ Label4->Caption+" %").c_str();
 outfile<<endl;
 outfile <<("Ilość wykonanych działań: "+Label17->Caption).c_str() ;
 outfile<<endl;
 


Wynik powyższych linijek:

245acbc
245a15c
24eb214




Gdy w labelu jest liczba poradziłem sobie(obszedłem problem), korzystając z funkcji StrToInt, ale z napisem nie mogę sobie poradzić.


Bardzo proszę o pomoc. Kombinuje i kombinuje i nadal nie działa. Proszę o podanie kodu.
Avatar użytkownika
mirekpl6
Bladawiec
Bladawiec
 
Posty: 15
Dołączył(a): piątek, 11 listopada 2016, 13:53
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 8 Pro 64bit
Kompilator: C++Builder 10.1 Berlin
Gadu Gadu: 0
    Windows 7Chrome

Re: c_str(), które kiedyś działało

Nowy postprzez Cyfrowy Baron » piątek, 11 listopada 2016, 17:03

Musisz się przestawić na UnicodeString, gdyż ten typ jest typem domyślnym. Czyli przed każdym łańcuchem znaków dajesz L np:

KOD cpp:     UKRYJ  
MessageBox(Handle,(L"Twój wynik został zapisany do katalogu " + Label10->Caption).c_str(), L"", MB_OK | MB_ICONINFORMATION);


KOD cpp:     UKRYJ  
outfile.open( ( L"Wyniki\\" + Label3->Caption + L"\\" + (String)i + L".txt" ).c_str());
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: c_str(), które kiedyś działało

Nowy postprzez mirekpl6 » piątek, 11 listopada 2016, 17:35

Niestety poniższy kod generuje te same błędy co wcześniej

Kod: Zaznacz cały
MessageBox(Handle,(L"Twój wynik został zapisany do katalogu " + Label10->Caption).c_str(), L"", MB_OK | MB_ICONINFORMATION);


Po umieszczeniu po L spacji wyskakuje błąd:

[bcc32 Error] Unit3.cpp(159): E2451 Undefined symbol 'L'
[bcc32 Error] Unit3.cpp(159): E2293 ) expected



A ten kod kompiluje się,ale nie działa prawidłowo
Kod: Zaznacz cały
outfile.open( ( L"Wyniki\\" + Label3->Caption + L"\\" + (String)i + L".txt" ).c_str());
Avatar użytkownika
mirekpl6
Bladawiec
Bladawiec
 
Posty: 15
Dołączył(a): piątek, 11 listopada 2016, 13:53
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 8 Pro 64bit
Kompilator: C++Builder 10.1 Berlin
Gadu Gadu: 0
    Windows 7Chrome

Re: c_str(), które kiedyś działało

Nowy postprzez Cyfrowy Baron » piątek, 11 listopada 2016, 18:17

Najwyraźniej w C++Builder 10.1 Berlin jest trochę inaczej. Zamiast L użyj _T lub _TEXT, lub TEXT.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: c_str(), które kiedyś działało

Nowy postprzez mirekpl6 » piątek, 11 listopada 2016, 19:25

Dzięki za rady, ale nie działają :(

Trzeba załączyć jakąś bibliotekę itd?

Może jest inny sposób,dłuższy,ale działający?
Avatar użytkownika
mirekpl6
Bladawiec
Bladawiec
 
Posty: 15
Dołączył(a): piątek, 11 listopada 2016, 13:53
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 8 Pro 64bit
Kompilator: C++Builder 10.1 Berlin
Gadu Gadu: 0
    Windows 7Chrome

Re: c_str(), które kiedyś działało

Nowy postprzez polymorphism » piątek, 11 listopada 2016, 19:55

Najwyraźniej w C++Builder 10.1 Berlin jest trochę inaczej.

Nie no, to L to część języka C++, więc musi działać wszędzie tam, gdzie mowa o C++.

@mirekpl6, w treści błędu jest mowa o niemożności konwersji z wchar_t* na char*, więc pewnie chodzi o to, że c_str zwraca unikod, a MessageBox oczekuje starego ANSI/ASCII/char*/whatever. Spróbuj z unikodową wersją MessageBox:
KOD cpp:     UKRYJ  
MessageBoxW(Handle, (L"Twój wynik został zapisany do katalogu " + Label10->Caption).c_str(), L"", MB_OK | MB_ICONINFORMATION);


Swoją drogą powinieneś używać VCL-owską implementację MessageBox, wtedy nie miałbyś takich problemów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: c_str(), które kiedyś działało

Nowy postprzez Cyfrowy Baron » piątek, 11 listopada 2016, 21:44

Odnośnie tego co napisał polymorphism, to domyślnie wszystkie funkcje począwszy od wersji XE oczekują argumentów typu Unicode, więc dodawanie tego W nie jest konieczne.

polymorphism napisał(a):
Swoją drogą powinieneś używać VCL-owską implementację MessageBox, wtedy nie miałbyś takich problemów.


To nie rozwiąże problemu całkowicie, gdyż to co u mnie działa, u niego już nie.




Jedno ważne pytanie: czy ty otworzyłeś jakiś projekt stworzony w starszej wersji środowiska w nowym, czy też stworzyłeś nowy projekt od podstaw w nowym środowisku?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: c_str(), które kiedyś działało

Nowy postprzez mirekpl6 » sobota, 12 listopada 2016, 18:43

Problem rozwiązany :)

@Cyfrowy Baronie, tak jak pisałem w pierwszym poście tego wątku: otworzyłem projekt stworzony w starszej wersji środowiska w nowym.
Wspomniałeś o UnicodeString co doprowadziło mnie do AnsiString. Dzięki.

@polymorphism MessageBoxW nie sprawdzałem czy działa, bo wpadłem na pomysł z poniższym kodem.

O to kod,który napisałem, a który działa:

Kod: Zaznacz cały
AnsiString a;


Kod: Zaznacz cały

outfile <<("Poziom trudności: ");
a= AnsiString (Label12->Caption);
outfile <<a


a z MessageBox:

Kod: Zaznacz cały
a=AnsiString(Label10->Caption);
MessageBox(Handle,("Twój wynik został zapisany do katalogu " + a).c_str(), "", MB_OK | MB_ICONINFORMATION);
Avatar użytkownika
mirekpl6
Bladawiec
Bladawiec
 
Posty: 15
Dołączył(a): piątek, 11 listopada 2016, 13:53
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 8 Pro 64bit
Kompilator: C++Builder 10.1 Berlin
Gadu Gadu: 0
    Windows 7Chrome

Re: c_str(), które kiedyś działało

Nowy postprzez Cyfrowy Baron » sobota, 12 listopada 2016, 21:22

Problem związany jest z tym, że stary projekt działający w oparciu o AnsiString zaimportowałeś do nowego środowiska, gdzie głównym typem jest UnicodeString. Występują różnice w pliku projektu np. Project1.cpp:

Starsza wersja środowiska ma:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                Application->Initialize();
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
        catch (...)
        {
                try
                {
                        throw Exception("");
                }
                catch (Exception &exception)
                {
                        Application->ShowException(&exception);
                }
        }
        return 0;
}
//---------------------------------------------------------------------------


zwróć uwagę na WinMain i LPSTR.

Nowa wersja wygląda tak:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
        try
        {
                Application->Initialize();
                Application->MainFormOnTaskBar = true;
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
        catch (...)
        {
                try
                {
                        throw Exception("");
                }
                catch (Exception &exception)
                {
                        Application->ShowException(&exception);
                }
        }
        return 0;
}
//---------------------------------------------------------------------------


Zwróć uwagę na _tWinMain, #include <tchar.h> i LPTSTR.

Jeżeli projekt nie jest nadmiernie rozbudowany, to wystarczy dokonać tych drobnych korekt w pliku projektu, żeby go przestawić na Unicode.

Najlepiej jest jednak przepisać cały projekt i używać nowego typu. Ja kiedyś przenosiłem projekt modyfikując pliki projektu. Zajęło mi to wiele godzin ale się udało.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: c_str(), które kiedyś działało

Nowy postprzez mirekpl6 » niedziela, 13 listopada 2016, 23:32

Dokonałem zmian w pliku projektu i niestety nadal,gdy nie użyje AnsiString,występują problemy,te co w moim pierwszym poście tego wątku. Nie pomaga dodanie L lub _T lub _TEXT lub TEXT.
Avatar użytkownika
mirekpl6
Bladawiec
Bladawiec
 
Posty: 15
Dołączył(a): piątek, 11 listopada 2016, 13:53
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows 8 Pro 64bit
Kompilator: C++Builder 10.1 Berlin
Gadu Gadu: 0
    Windows 7Chrome

Re: c_str(), które kiedyś działało

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 listopada 2016, 10:37

Stwórz nowy projekt w nowym środowisku. Umieść na nim button i Label1, utwórz zdarzenie OnClick dla Buton1, wprowadź w nim ten kod:

KOD cpp:     UKRYJ  
MessageBox(Handle,(L"Twój wynik został zapisany do katalogu " + Label1->Caption).c_str(), L"", MB_OK | MB_ICONINFORMATION);


Powinien zadziałać. Jeżeli nie zadziała, powinieneś przejrzeć przykładowe projekty dołączone do środowiska, by sprawdzić jak to zostało tam rozwiązane.

Prawdopodobnie są różnice w pliku projektu. Ja podałem przykład dla starszej wersji środowiska niż twoje.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości

cron