CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Długość kodu edytora

Długość kodu edytora

dział ogólny

Długość kodu edytora

Nowy postprzez oneiro » sobota, 26 października 2013, 13:21

Witam,

Problem występuje od dawna - czy BCB6 ma jakieś ograniczenia na długość pliku z kodem?
Po przekroczeniu 4021 linijki kodu wciskając [CTRL]+[SAPCE] mam taki oto komunikat:

---------------------------
Error
---------------------------
Unable to invoke Code Completion due to errors in source code
---------------------------
OK
---------------------------

Dodam, że plik Unit1.cpp ma 8131 linijek i całość kompiluje się bez problemu. Nie mogę tylko korzystać z podpowiedzi :/
Nawet wpisując jakąś prosty kod typu "int a;" wywala mi ten błąd na 4022 linijce i więcej.

Pozdrawiam, Krzysiek
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez Cyfrowy Baron » sobota, 26 października 2013, 17:16

Coś sobie przypominam, że w której starszej wersji - być może BCB6 - też miałem ten problem, ale wgranie ostatniego patche rozwiązało ten problem. Było to jednak tak dawno, że już dokładnie nie pamiętam. To jest bardzo stare środowisko, powinieneś pomyśleć o nowszym.
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: Długość kodu edytora

Nowy postprzez oneiro » sobota, 26 października 2013, 23:13

Widzisz, nie udaje mi się przenieść z BCB6->XE2. Np. w pliku TypyPod.h mam stary kod:
KOD cpp:     UKRYJ  
class KomunikatBorlandC : KomunikatAbstrakcyjny
{
 public :
  void WypiszKomunikat(const char* komunikat,const char* zrodloKomunikatu)
  {
        Application->MessageBox(komunikat, zrodloKomunikatu,MB_OK);    // <<= TU WYWALA BLAD
  }
};


A z tego taki błąd:

[BCC32 Error] TypyPod.h(414): E2034 Cannot convert 'const char *' to 'const wchar_t *'
Full parser context
Unit1.cpp(10): #include TypyPod.cpp
TypyPod.cpp(6): #include TypyPod.h
TypyPod.h(409): class KomunikatBorlandC
TypyPod.h(416): decision to instantiate: void KomunikatBorlandC::WypiszKomunikat(const char *,const char *)
--- Resetting parser context for instantiation...
TypyPod.h(413): parsing: void KomunikatBorlandC::WypiszKomunikat(const char *,const char *)


Mapowanie nie działa z char na w_char w opcjach.
Jak zmienię kod (dodam c_str() lub w_str() ) to błąd znika, ale pojawia się nowy, a tego nie wiem jak obejść...

KOD cpp:     UKRYJ  
        Application->MessageBox(komunikat.c_str(), zrodloKomunikatu.c_str(),MB_OK);
 


To z mam wówczas błąd:
[BCC32 Error] TypyPod.h(414): E2294 Structure required on left side of . or .*
Full parser context
Unit1.cpp(10): #include TypyPod.cpp
TypyPod.cpp(6): #include TypyPod.h
TypyPod.h(409): class KomunikatBorlandC
TypyPod.h(416): decision to instantiate: void KomunikatBorlandC::WypiszKomunikat(const char *,const char *)
--- Resetting parser context for instantiation...
TypyPod.h(413): parsing: void KomunikatBorlandC::WypiszKomunikat(const char *,const char *)



Także zostaje przy starej działającej wersji....
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez polymorphism » niedziela, 27 października 2013, 10:42

To z mam wówczas błąd:

[BCC32 Error] TypyPod.h(414): E2294 Structure required on left side of . or .*


A czy wskaźnik const char* posiada metodę c_str?

Mapowanie nie działa z char na w_char w opcjach.

Działałoby, gdybyś napisał taki kod:
KOD cpp:     UKRYJ  
void WypiszKomunikat(const System::PChar* komunikat,const System::PChar* zrodloKomunikatu)
{
        Application->MessageBox(komunikat, zrodloKomunikatu, MB_OK);    
}


// i wywołanie
foo.WypiszKomunikat(TEXT("text"), TEXT("caption"));
 

Wracając do c_str, tak możesz to zrobić:
KOD cpp:     UKRYJ  
Application->MessageBox(String(komunikat).c_str(), String(zrodloKomunikatu).c_str(), MB_OK);

Aczkolwiek lepiej aplikację pisać od razu w unikodzie, unikniesz wielu konwersji powodujących narzut pamięciowy/wydajnościowy.
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 XPFirefox

Re: Długość kodu edytora

Nowy postprzez Cyfrowy Baron » niedziela, 27 października 2013, 10:48

W nowszych środowiskach począwszy chyba od C++Builder XE, domyślnym typem danych jest UnicodeString i wchar_t, do tego dochodzą kwestie mapowania albo na char, albo wchar_t. Nie wszystkie funkcje dostępne w bibliotekach używają UnicodeString, część wciąż działa na AnsiString i char.

Tutaj masz opis mapowania: http://programowanie.cal.pl/forum/viewtopic.php?f=16&t=1098#p7401

Z początku jest problem z przestawieniem się na UnicodeString, ale jak to już opanujesz to jest łatwiej niż z AnsiString.

Dla przykładu kod, który podałeś przy mapowaniu na wchar_t wyglądał by tak:

KOD cpp:     UKRYJ  
class KomunikatBorlandC : KomunikatAbstrakcyjny
{
 public :
  void WypiszKomunikat(const wchar_t* komunikat, const wchar_t* zrodloKomunikatu)
  {
        Application->MessageBox( komunikat, zrodloKomunikatu, MB_OK);    // <<= TU WYWALA BLAD
  }
};


Wywołanie funkcji WypiszKomunikat wyglądałoby zaś tak:

KOD cpp:     UKRYJ  
WypiszKomunikat( L"komunikat", L"etykieta" );


lub tak:

KOD cpp:     UKRYJ  
 String uMsgK = "komunikat";
 String uMsgE = "etykieta";

 TestMsg( uMsgK.c_str(), uMsgE.c_str() );


lub nawet tak:

KOD cpp:     UKRYJ  
 wchar_t *uMsgK = L"komunikat";
 wchar_t *uMsgE = L"etykieta";

 TestMsg( uMsgK, uMsgE );


można też tak:

KOD cpp:     UKRYJ  
 wchar_t uMsgK[255];
 wchar_t uMsgE[20];

 swprintf( uMsgK, L"%s", L"komunikat");
 swprintf(uMsgE, L"%s", L"etykieta");

 TestMsg( uMsgK, uMsgE );
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: Długość kodu edytora

Nowy postprzez oneiro » niedziela, 27 października 2013, 11:59

Dzięki, wydaje się, że przeszło, ale za to kolejne, może tutaj też pomożecie...

Plik Macierz.h
KOD cpp:     UKRYJ  
//Wzorzec do wstępnej inicjacji wektora dynamicznego o zadanym wymiarze N+1
template <class  Typ >
void InicjacjaWektora(vector<Typ>& X, int N)
{
  if (X.empty()) for (int i=0; i<=N; i++) X.push_back();   //<<== 117 wiersz
   else
     {
       int k=X.size()-1;
       if (k>=N )
           {
             for (int i=k; i>N; i--) X.pop_back();
           }
       else
        {
          for (int i=k+1; i<=N; i++) X.push_back();  //<<== 127 wiersz
        }
     }
}

...


//Definicja macierzy na bazie kontenera sekwencyjnego vector
typedef vector<vector<AnsiString> > TMacierzeStringK ;   //<<== wiersz 343



[BCC32 Error] Macierze.h(117): E2193 Too few parameters in call to 'vector<int,allocator<int> >::push_back(const int &)'
Full parser context
Unit1.cpp(13): #include Macierze.h
Macierze.h(343): decision to instantiate: void void InicjacjaWektora<int>(vector<int,allocator<int> > &,int)
--- Resetting parser context for instantiation...
Unit1.cpp(13): #include Macierze.h
Macierze.h(116): parsing: void void InicjacjaWektora<int>(vector<int,allocator<int> > &,int)

[BCC32 Error] Macierze.h(127): E2193 Too few parameters in call to 'vector<int,allocator<int> >::push_back(const int &)'
Full parser context
Unit1.cpp(13): #include Macierze.h
Macierze.h(343): decision to instantiate: void void InicjacjaWektora<int>(vector<int,allocator<int> > &,int)
--- Resetting parser context for instantiation...
Unit1.cpp(13): #include Macierze.h
Macierze.h(116): parsing: void void InicjacjaWektora<int>(vector<int,allocator<int> > &,int)

Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez Cyfrowy Baron » niedziela, 27 października 2013, 12:13

Nie widzę błędu. U mnie ten kod przeszedł bez najmniejszego błędu.
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: Długość kodu edytora

Nowy postprzez Cyfrowy Baron » niedziela, 27 października 2013, 12:18

Jaką masz dokładnie wersję środowiska? Jakie poprawki?
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: Długość kodu edytora

Nowy postprzez polymorphism » niedziela, 27 października 2013, 12:26

Błąd jest. oneiro, czytasz w ogóle treść błędów, które kompilator Ci wyrzuca? Przecież masz tam jasno napisane, że z parametrem push_back jest coś nie tak. Tym czymś jest to, że nie ma bezparametrowej wersji ten metody (czytać dokumentację!), ergo: musisz podać jakąś wartość. Następna rzecz. Zamiast ustawiać rozmiar wektora pętlą i push_back, użyj metody vector::resize (znowu dokumentacja się kłania). To samo przy zmniejszaniu...
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 XPFirefox

Re: Długość kodu edytora

Nowy postprzez oneiro » niedziela, 27 października 2013, 12:59

Delphi XE2 and C++Builde XE2 Update 3

Widzisz, korzystam z gotowych bibliotek, nie zaglądałem do środka (gdyż nie było takiej potrzeby). Nigdy z wektorów nie korzystałem, a widzę, że to taki rodzaj dynamicznej tablicy - korzystając z okazji - co jest lepszym rozwiązaniem, tablica dynamiczna czy wektor, ale jakie są główne różnice, bo na pierwszy rzut oka są bardzo podobne w działaniu. No poza dynamiczną zmianą rozmiaru jeśli jakieś dane już są w środku na korzyść wektora.

Wracając do tematu, poprawcie mnie jeśli się mylę - skoro wcześniej (w wersji BCB6) działało, to wektor powiększał się o losową wartość (dodawał na końcu wektora nową wartość), więc teraz mogę wpisać np. 0 i też powinno być dobrze tak?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez polymorphism » niedziela, 27 października 2013, 13:43

Wartości losowej na pewno tam nie dodawał, tylko domyślne Typ(). A działało zapewne dlatego, że w implementacji vectora parametr push_back ma przypisaną wartość domyślną. Nie wiem, co na to standard C++, ale jest to raczej błąd w implementacji.

(...) teraz mogę wpisać np. 0 i też powinno być dobrze tak?

Użyj metod, o których pisałem, to będzie najrozsądniejsze rozwiązanie.

p.s. jest jeszcze metoda erase, jak byś chciał usuwać ze środka kolekcji.


(...) co jest lepszym rozwiązaniem, tablica dynamiczna czy wektor, ale jakie są główne różnice, bo na pierwszy rzut oka są bardzo podobne w działaniu.

Ha, bo vector to po prostu obiektowa wersja tablicy dynamicznej. Główną różnicą jest to, że nie musisz ręcznie zarządzać pamięcią, co nie dość że jest wygodne, to jeszcze chroni przed wyciekami pamięci. Do tego wszystkiego masz jeszcze zestaw metod, które ułatwiają zarządzanie kolekcją. Generalnie w C++ nie używamy "gołych" tablic dynamicznych, chyba że są jakieś wymogi narzucone z zewnątrz.
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 XPFirefox

Re: Długość kodu edytora

Nowy postprzez oneiro » niedziela, 27 października 2013, 14:42

Twierdzisz, że hipotetycznie wartością domyślnie dodawaną było Typ() - nie rozumiem, możesz rozwiać i podpowiedź, gdzie tą wartość mogę znaleźć.

Ciągnę temat dalej:
KOD cpp:     UKRYJ  
      for (unsigned i=0; i<Form1->StringGrid3->RowCount-1; i++)
        {
        Ini->WriteInteger("PARAMETERS","Opt_Sign_L_"+IntToStr(i),Param.tab_opt_sign_L[i]);
        Ini->WriteInteger("PARAMETERS","Opt_Sign_P_"+IntToStr(i),Param.tab_opt_sign_P[i]);
        Ini->WriteFloat("PARAMETERS","Opt_LValue_"+IntToStr(i),Param.tab_opt_LValue[i]);
        Ini->WriteFloat("PARAMETERS","Opt_PValue_"+IntToStr(i),Param.tab_opt_PValue[i]);
        //Ini->WriteFloat("PARAMETERS","Opt_Current_"+IntToStr(i),Param.tab_opt_Current[i]);
        Ini->WriteFloat("PARAMETERS","Opt_Step_"+IntToStr(i),Param.tab_opt_step[i]);
        Ini->WriteInteger("PARAMETERS","Opt_Amount_"+IntToStr(i),Param.tab_opt_amount[i]);
        }


[BCC32 Error] Unit1.cpp(3721): E2015 Ambiguity between '_fastcall System::Sysutils::IntToStr(int) at d:\program files\embarcadero\rad studio\9.0\include\windows\rtl\System.SysUtils.hpp:2363' and '_fastcall System::Sysutils::IntToStr(__int64) at d:\program files\embarcadero\rad studio\9.0\include\windows\rtl\System.SysUtils.hpp:2364'
Full parser context
Unit1.cpp(3617): parsing: bool _fastcall zapisz_plik(int,bool)



Niejednoznaczność ?? Nie ogarniam tego, tyczy się wszystich IntToStr w tej pętli. Jeśli w pętli zmienię z unsigned na int to działa - mogę prosić o wytłumaczenie, dlaczego tak się dzieje?
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez polymorphism » niedziela, 27 października 2013, 14:58

Twierdzisz, że hipotetycznie wartością domyślnie dodawaną było Typ() - nie rozumiem, możesz rozwiać i podpowiedź, gdzie tą wartość mogę znaleźć.

KOD cpp:     UKRYJ  
template <class  Typ > void InicjacjaWektora(vector<Typ>& X, int N)
{
        if (X.empty()) for (int i=0; i<=N; i++) X.push_back( Typ() );
        ...

Choć jeszcze raz powtórzę: ustalanie w ten sposób wielkości wektora jest idiotyczne, od tego masz inne metody.

mogę prosić o wytłumaczenie, dlaczego tak się dzieje?

Być może chodzi o to, że i jest unsigned, a obie funkcje oczekują wartości ze znakiem, i być może stąd kompilator ma dylemat. Niech i będzie typu int.
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 XPFirefox

Re: Długość kodu edytora

Nowy postprzez oneiro » niedziela, 27 października 2013, 16:16

Ok, chyba rozumiem, dzięki.

w takim razie chyba ostania prośba:
KOD cpp:     UKRYJ  
char *zmienna[13][20]={{"A"},{"xcg"},{"zcg"},{"Ixx"},{"Izz"},{"Ixz"},{"thetap"},{"I11"},{"I22"},{"J"},{"Xs"},{"Ys"},{"Cw"}};
MessageBox(NULL, "Zmienna nie istnieje!",*zmienna[i], MB_OK);



[BCC32 Error] Unit1.cpp(5631): E2034 Cannot convert 'char const[39]' to 'const wchar_t *'
Full parser context
Unit1.cpp(5587): parsing: void _fastcall TForm1::CUFSM3Click(TObject *)



[BCC32 Error] Unit1.cpp(5631): E2342 Type mismatch in parameter 'lpText' (wanted 'const wchar_t *', got 'const char *')
Full parser context
Unit1.cpp(5587): parsing: void _fastcall TForm1::CUFSM3Click(TObject *)



Zgodnie z radą Barona daję przez cudzysłowami L i to przechodzi. Gorzej ze wskaźnikiem - próbowałem już wszystkich metod (o których przeczyłem) i nie mogę tego przeskoczyć....
Avatar użytkownika
oneiro
Homos antropiczny
Homos antropiczny
 
Posty: 96
Dołączył(a): niedziela, 17 czerwca 2012, 23:19
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: brak systemu
Kompilator: C++ Builder v6
Gadu Gadu: 0
    Windows XPChrome

Re: Długość kodu edytora

Nowy postprzez Cyfrowy Baron » niedziela, 27 października 2013, 16:50

Potrzebujesz C++Builder XE2 z poprawką Update 4. Wcześniejsze wersje nie eliminują wszystkich błędów.

polymorphism napisał(a):Tym czymś jest to, że nie ma bezparametrowej wersji ten metody (czytać dokumentację!),


W dokumentacji tak właśnie pisze, ale u mnie program kompiluje się zarówno z parametrem jak i bez parametru i to niezależnie czy użyję biblioteki vector.h z zasobów środowiska, czy biblioteki boost.

oneiro napisał(a):w takim razie chyba ostania prośba:


Myślałem, że już załapałeś. Funkcja MessageBox oczekuje jako drugiego i trzeciego parametru wartości typu wchar_t, a ty przekazujesz tam typ char, więc trzeba dokona konwersji za pomocą znaku L

KOD cpp:     UKRYJ  
 MessageBox( NULL, L"Zmienna nie istnieje!", L"etykieta", MB_OK);



Nie wiem czym jest *zmienna[i], więc wstawiłem tam tekst.

U ciebie prawdopodobnie tak:


KOD cpp:     UKRYJ  
 MessageBox( NULL, L"Zmienna nie istnieje!", *zmienna[i].c_str(), MB_OK);
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

Następna strona

  • 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 1 gość

cron