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

[Allegro] Visual C++, multiple definition, linker error

Ostatnio zmodyfikowano 2009-07-27 21:06
Autor Wiadomość
pompom
» 2009-07-22 13:53:51
IDE musi coś dodawać. Jakiego kompilatora używasz? GCC?
Btw:
C/C++
cObject::cObject() {
    string m_strName = "Object";
    int m_iPositionX = 0;
    int m_iPositionY = 0;
    BITMAP * m_bmImage = create_bitmap( 50, 50 );
    int m_iWidth = 50;
    int m_iHeight = 50;
}
Ustawiasz zmienne lokalne które znikają zaraz po wywołaniu konstruktora. Stąd te warningi.
Powinienieś raczej napisać:
C/C++
cObject::cObject()
    : m_strName( "Object" )
    , m_iPositionX( 0 )
    , m_iPositionY( 0 )
    , m_bmImage( create_bitmap( 50, 50 ) )
    , m_iWidth( 50 )
    , m_iHeight( 50 )
{ }
Btw - notacja węgierska to zło. Może i miała jakiś sens w C, ale w C++ nie ma żadnego - kod jest tylko brzydszy i mniej uniwersalny.
A konstruktor ustawiający składową b to np: "A(int b_) : b(b_) {}". W końcu używasz składowej częściej, niż argumentu konstruktora.
P-8706
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-22 18:43:49
@JCJ - Jaki dokładnie potrzebujesz screen? Tu masz linker: http://img43.imageshack.us/img43/1/screengwr.jpg
@pompon - Używam GNU GCC compiler, standardowy. Pierwszy raz się spotykam z takim zapisem. Notacja węgierska to te wszystkie standardy kodowania? Jeżeli tak to jak należy kodować? Masz może jakąś stronkę, która opisuje tą metodę:
C/C++
cObject::cObject()
    : m_strName( "Object" )
    , m_iPositionX( 0 )
    , m_iPositionY( 0 )
    , m_bmImage( create_bitmap( 50, 50 ) )
    , m_iWidth( 50 )
    , m_iHeight( 50 )
{ }
P-8715
pompom
» 2009-07-22 19:57:14
To jest tzw. lista inicjalizacyjna, w Twoim kodzie jest równoważna ustawianiu składowych w konstruktorze.
(Gdybyś usunął deklarację zmiennych lokalnych, czyli typy)
Zamiast "int a = cos" "a = cos". "int a" deklaruje zmienną lokalną dla bloku (w tym wypadku konstruktora) a "a" odnosi się do składowej klasy.
Stąd te warningi - bo składowych klasy w ogóle nie używasz.

Ogólnie lista inicjalizacyjna umożliwia ustawianie referencji, zmiennych const i wywoływanie konstruktorów superklas (czyli tych z których dziedziczysz) z parametrami, czego nie da się zrobić w kodzie konstruktora.
Jest też czytelniejsza, bo wyraźnie widać co ten konstruktor ustawia w klasie.

A co do błędów - ten code::blocks najwyraźniej robi z kodem dziwne rzeczy.

D:\projekty\inne\diablo\main.cpp||In function `int _mangled_main()':|
D:\projekty\inne\diablo\main.cpp|7|warning: control reaches end of non-void function|
Tego warningu nie powinno w ogóle być.

Ściągnij Visual C++ Express i używaj go...
P-8716
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-22 20:40:05
Mam ten program, ale on też jest jakiś dziki. Napisałem taki program:
C/C++
#include <string>
#include <ctime>

int main() {
    return 0;
}
logi:

1>------ Build started: Project: dfg, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\program files\microsoft visual studio 9.0\vc\include\stddef.h(6) : fatal error C1021: invalid preprocessor command 'include_next'
1>Build log was saved at "file://c:\Documents and Settings\User\Moje dokumenty\Visual Studio 2008\Projects\dfg\dfg\Debug\BuildLog.htm"
1>dfg - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
P-8719
pompom
» 2009-07-22 20:53:30
Wtf? Masz porządnie namieszane w systemie, a dokładniej w ścieżkach do plików include.
O ile się nie myle include_next to rozszerzenie gcc którego Visual nie wspiera.
Nie jest przypadkiem tak, że z jakiegoś powodu coś ci nadpisało (np. dev-cpp) pliki include visuala swoimi i teraz oba kompilatory używają tego samego katalogu?
Najszybciej będzie chyba zainstalować vs od nowa (jakieś 10 minut?).

Czy początek stddef.h wygląda tak?

/***
*stddef.h - definitions/declarations for common constants, types, variables
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       This file contains definitions and declarations for some commonly
*       used constants, types, and variables.
*       [ANSI]
*
*       [Public]
*
****/
Jeśli nie, to masz nadpisane.
Ewentualnie mogę skompresować cały katalog include i gdzieś wgrać, tylko sobie skopiujesz.
P-8721
steckel
Temat założony przez niniejszego użytkownika
» 2009-07-22 22:26:06
Rzeczywiście, prawdopodobnie podmieniłem pliki przy instalacji DirectX SDK.
Uruchomiłem instalator i wybrałem opcję naprawy. Teraz działa najprostszy program, lecz przy moim wysypują się błedy:
C/C++
1 >------Build started: Project: dfg, Configuration: Debug Win32------
1 > Compiling...
1 > class.cpp
1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\gfx.h( 275 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\rle.h( 34 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\font.h( 31 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\fix.h( 45 )
    : warning C4244
    : 'return'
    : conversion from 'double' to 'float'
    , possible loss of data 1 > d:\p rojekty\inne\diablo\class.cpp( 17 )
    : error C2664
    : 'load_bmp'
    : cannot convert parameter 1 from 'const char *' to 'char *' 1 > Conversion loses qualifiers 1 > main.cpp 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\gfx.h( 275 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\rle.h( 34 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\font.h( 31 )
    : warning C4200
    : nonstandard extension used
    : zero - sized array in struct / union 1 > Cannot generate copy - ctor or copy - assignment operator when UDT contains a zero - sized array 1 > c:\p rogram files\microsoft visual studio 9.0\vc\include\allegro\fix.h( 45 )
    : warning C4244
    : 'return'
    : conversion from 'double' to 'float'
    , possible loss of data 1 > d:\p rojekty\inne\diablo\class.cpp( 17 )
    : error C2664
    : 'load_bmp'
    : cannot convert parameter 1 from 'const char *' to 'char *' 1 > Conversion loses qualifiers 1 > Generating Code...1 > Build log was saved at "file://c:\Documents and Settings\User\Moje dokumenty\Visual Studio 2008\Projects\dfg\dfg\Debug\BuildLog.htm" 1 > dfg - 2 error( s )
    , 8 warning( s ) ========== Build
    : 0 succeeded
    , 1 failed
    , 0 up - to - date
    , 0 skipped ==========
P-8722
pompom
» 2009-07-23 03:43:47
http://www.allegro.cc/forums/thread/596774
Can anybody tell me what i'm doing wrong?
You're copying an install from a completely different compiler and expecting it to work.

Btw - czy cytowanie np "[quote="bum"]tekst[/quote]" jest tak trudne do zrobienia?
Dodatkowo zagnieżdzanie i code i quote...
Ogólnie to nie widzę powodu pisania całkiem nowego cmsa jak i niektórych rozwiazań (sortowanie tematów) ale jak kto chce...
P-8723
DejaVu
» 2009-07-23 11:37:41
[quote]ble[/quote]
Faktycznie :P tego znacznika nie dodałem. Jest jednak:
[cytat],[cite],[cytuj]
P-8726
1 2 « 3 » 4 5 6 7
Poprzednia strona Strona 3 z 7 Następna strona