Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

64 bit - ok / 32 bit - not ok / problem z kompilacją.

Ostatnio zmodyfikowano 2023-02-25 19:57
Autor Wiadomość
befejak
Temat założony przez niniejszego użytkownika
64 bit - ok / 32 bit - not ok / problem z kompilacją.
» 2023-02-24 13:00:20
Witam, jakiś czas temu zapytałem o tworzenie programu do pisania tekstu w nim ( od zaplecza )
 i od jakiegoś czasu zajmuję się tym zagadnieniem.

Postanowiłem rozwijać swojego własnego "Stringa" na te potrzeby i kiedy kompiluję z GCC 64 bit
 nie mam żadnego problemu i żadnego errora na konsoli ( może poza jednym ale to mogę zignorować )

ale GCC 32 bit-owy kompilator odmawia skompilowania mówiąc że:
main.cpp|225|error: no matching function for call to 'qlString::qlString(qlString)'


qlString Test("abc"); <-- Bez problemu dla 32 i 64 bit

qlString StringsArray[] = {"Test","abc","a b c d e f g h","ehem"}; <-- 32 bit nie kompiluje

struct abcST{
 qlString Name;
 int a,b,c;
}qqTest={"SomeName",1,2,3}; <-- 32 bit nie kompiluje


Taka funkcja istnieje: * w Struct qlString
qlString( qlString &_String ){Exist=false;Length=0;Error=-1;qSet(_String.Char);}

i 64 bitowy kompilator ją widzi i używa bez problemu w tym samym czasie 32 jakby był "ślepy" dla tej funkcji.

Do kompilacji używam CodeBlocks z ich 32 bitowym GCC dostarczonym wraz z instalacją.
 64 bitowy GCC pobrałem z internetu.


Zastanawia mnie więc czy to 32 bitowy kompilator jest jakiś przestarzały,
 Czy może to ja robię coś źle a 64 bitowy kompilator jest na tyle sprytny by to poprawić po mnie?...
P-179988
DejaVu
» 2023-02-25 10:28:10
Zła definicja konstruktora:
C/C++
qlString( qlString & _String )

Dobra definicja konstruktora:
C/C++
qlString( const qlString & _String )
P-179993
befejak
Temat założony przez niniejszego użytkownika
» 2023-02-25 16:06:44
Hmm, faktycznie po dodaniu Const do konstruktora 32 bitowy kompilator teraz działa.
 Najwyraźniej to 64 bitowy poprawiał po mnie cały ten czas.

Ale pozwolę sobie jeszcze zapytać - Czemu?
 Bo prawdę mówiąc całkowicie nie rozumiem czemu "Const" jest wymagane w tym miejscu.

Inny error który oba kompilatory (32 i 64 bit) wyświetlają to:
|230|warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

Dodając "Const" do funkcji wszystkie problemy i errory poznikały,
 ale całkowicie nie rozumiem co to zmienia dodając const.


Jeśli dobrze rozumiem "Const" działa jak można powiedzieć "flaga - Read Only"?
 Czy ma też inne zastosowania?
P-179997
pekfos
» 2023-02-25 17:07:26
Wygląda na to że zmieniasz także wersję standardu C++.

ale GCC 32 bit-owy kompilator odmawia skompilowania mówiąc że:
main.cpp|225|error: no matching function for call to 'qlString::qlString(qlString)'
To jest niekompletny komunikat błędu, z GCC 4.X, lub starszego. Jaki rocznik ma ten twój 32-bitowy code blocks?
P-179998
befejak
Temat założony przez niniejszego użytkownika
» 2023-02-25 18:25:56
Prawdę mówiąc to nie pamiętam skąd pobrałem CodeBlocks,
 Wcześniej pisałem w Java i używałem Eclipse ale postanowiłem się przesiąść na C++.

Pobrałem z jakiegoś źródła jakie było podane w artykule który czytałem,
 Mało to może mówi ale "Data Modyfikacji" codeblock.exe -> 2016 rok ( więc zapewne z tego roku )

Kompilator 64 bitowy pobrałem ponad miesiąc temu ale również już nie pamiętam z jakiej strony.

Co prawda to wysłałem tylko jedną linię z błędu bo uznałem że jest tylko ta pierwsza ważna
 Tutaj jest reszta lini z "Błędem"

|231|error: no matching function for call to 'qlString::qlString(qlString)'|
|231|note: candidates are:|
|219|note: qlString::qlString(qlString&)|
|219|note:   no known conversion for argument 1 from 'qlString' to 'qlString&'|
|218|note: qlString::qlString(char*)|
|218|note:   no known conversion for argument 1 from 'qlString' to 'char*'|
|217|note: qlString::qlString()|
|217|note:   candidate expects 0 arguments, 1 provided|


Hmm... teraz muszę przyznać się do własnego błędu bo gdybym od początku przeczytał wszystkie linie błędu może bym sam coś wykombinował.

Zamieniłem konstruktor z argumentem qlString zamiast "&" użyłem "*" i skasowałem Const
qlString( qlString *_String ){Exist=false;Length=0;Error=-1;qSet(_String -> Char);}

Innymi słowy 32 bitowy kompilator kompiluje jeśli użyję "Const" lub "*" zamiast "&" ale nie mam pojęcia czemu.
 Prawdopodobnie źle zrozumiałem znaczenie "&" :/...

P-179999
pekfos
» 2023-02-25 19:57:46
Innymi słowy 32 bitowy kompilator kompiluje jeśli użyję "Const" lub "*" zamiast "&" ale nie mam pojęcia czemu.
Konstruktor qlString(qlString*) ma tu tak mało sensu, że efektywnie go skasowałeś. Teraz do kopiowania jest używany konstruktor kopiujący wygenerowany przez kompilator i pewnie nie robi tego czego oczekujesz.
P-180000
« 1 »
  Strona 1 z 1