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

undefined reference to ' [...] '

Ostatnio zmodyfikowano 2016-03-30 19:39
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
undefined reference to ' [...] '
» 2016-03-28 19:01:39
Według mnie wszystko jest dobrze... tylko linker coś wywala:

||=== Build file: "no target" in "no project" (compiler: unknown) ===|
E:\CACHE\011\XOXOXO\main.o:main.cpp|| undefined reference to `bitcounter::belongs_to'|
E:\CACHE\011\XOXOXO\main.o:main.cpp|| undefined reference to `bitcounter::belongs_to'|
||error: ld returned 1 exit status|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|


C/C++
//zawiera zestaw 8iu binarnych licznikow z impulsem na osiagniecie 3ech.
class bitcounter
{
    //uzupelnienie o dane do ktorych lin pola naleza:
    constexpr static const BYTE ptr[ 33 ] = // C++ nie pozwala tworzyc wielowymiarowych
    { 3, 0, 3, 6, 2, 0, 4, 3, 0, 5, 7, // tablic o roznych dlugosciach per wymiar
        2, 1, 3, 4, 1, 4, 6, 7, 2, 1, 5, // format:
        3, 2, 3, 7, 2, 2, 4, 3, 2, 5, 6 }; // (dlugosc wymiaru), liczby z wymiaru, (dl wym), itd.
    constexpr static const BYTE * belongs_to[ 9 ] =
    { ptr + 0, ptr + 4, ptr + 7, // prawdziwa tablica
        ptr + 11, ptr + 14, ptr + 19, // tablica wskaznikow xd
        ptr + 22, ptr + 26, ptr + 29 }; //
   
    BYTE linie = 0; //byte //po zapelnieniu lini, jest ona sprawdzana
    WORD liczniki = 0xFFFF; // kazda linia ma wlasny licznik
   
    //inkrementacja licznika binarnego:
    inline void increment( BYTE );
   
public:
    BYTE update( BYTE ); //zwraca linie zapelnione (czyt. do sprawdzenia)
   
    //jakies wymysly na zwrocenie impulsow: xd
    //bool operator++(int){ return false};
    //typedef void (*func_ptr)(int);
    //func_ptr handler = NULL;
}; //

BYTE bitcounter::update( BYTE field ) // field w zakresie 1-9
{
    BYTE copy = linie;
    const BYTE * field_blelongs_to = belongs_to[ --field ];
    for( BYTE n = field_blelongs_to[ 0 ]; n; n-- )
         increment( belongs_to[ field ][ n ] );
   
    return copy ^ linie;
}

inline void bitcounter::increment( BYTE counter )
{
    /*asm
        (
            "MOVb %%al, %%dl ; "
            "SHLb %%al ;"
            "BTRw %1, %%al, ;"
            "JC end ;"
            "INCb %%al ;"
            "BTRw %1, %%al ;"
            "JC end ;"
            "BTS %%dl, %2"
            "end:"
            : "=al" (counter)
            : "r" (liczniki),
              "r" (linie)
        );*/ // nie obchodzi mnie to
    // zrobie to analogowo
   
    counter << 1;
    if( liczniki &( 1 << counter ) )
         liczniki &= ~WORD( 1 << counter ); // BTR
    else if( liczniki &( 1 <<( counter + 1 ) ) )
         liczniki &= ~WORD( 1 << counter ); // BTR
    else
         linie |= counter >> 1;
   
}
P-146649
michal11
» 2016-03-28 22:23:15
Za mało kodu, po błędzie wnioskuję, że w main chcesz ale odwołać do prywatnej zmiennej (belongs_to)
P-146669
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-03-28 22:53:40
W main.cpp nigdzie nie odwołuję się do
belongs_to, tylko w załączonym kodzie...
a błąd występuję podczas konsolidacji.
Myślę, że to przez jakieś optymalizacje
wykonane przez kompilator. :F
P-146672
mokrowski
» 2016-03-28 23:14:22
(żart) Jakby tak z całej tej zabawy wykluczyć ten "głupi kompilator". Od razu było by mniej błędów :-) (/żart)

A poważniej.. Popatrz do błędu. Kompilator jednak twierdzi że się odwołujesz :-/
P-146679
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-03-28 23:33:01
Kompilator jednak twierdzi że się odwołujesz :-/
Linker... to są błędy linkera...

Zamieniłem te wszystkie "dziwne" dane na globalne
i od razu przestał krzyczeć. Mi tam to nie zaszkodzi...
P-146680
Elaine
» 2016-03-29 09:28:24
Jeśli statyczna składowa klasy jest ODR-użyta, a nie posiada definicji, to zachowanie jest niezdefiniowane. Rozwiązanie: zdefiniować stałe:
C/C++
constexpr const BYTE bitcounter::ptr;
constexpr const BYTE * bitcounter::belongs_to;
P-146695
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-03-29 19:50:51
ODR-użyta
Co to znaczy?

a nie posiada definicji
To co napisałem to już jest definicją. Tak?

C/C++
constexpr static const BYTE ptr[ 33 ] =
{ 3, 0, 3, 6, 2, 0, 4, 3, 0, 5, 7,
    2, 1, 3, 4, 1, 4, 6, 7, 2, 1, 5,
    3, 2, 3, 7, 2, 2, 4, 3, 2, 5, 6 };
constexpr static const BYTE * belongs_to[ 9 ] =
{ ptr + 0, ptr + 4, ptr + 7,
    ptr + 11, ptr + 14, ptr + 19,
    ptr + 22, ptr + 26, ptr + 29 };

Rozwiązanie: zdefiniować stałe:
Ale one już są stałe. :O Stałe statyczne...
Może coś nie tak jest w tym że są właśnie statyczne?
P-146751
Elaine
» 2016-03-29 20:50:07
a nie posiada definicji
To co napisałem to już jest definicją. Tak?
Nie.

9.4.2/2:
The declaration of a static data member in its class definition is not a definition […]. The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition.
oraz 9.4.2/3:
A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. […] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.

Dlatego potrzebujesz takich definicji, jakie podałem wyżej.
P-146755
« 1 » 2
  Strona 1 z 2 Następna strona