• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kompilator zgłasza błąd : id returned 1 exit status

Object Storage Arubacloud
0 głosów
691 wizyt
pytanie zadane 29 lipca 2019 w C i C++ przez DamianW Bywalec (2,080 p.)

Witam. Wiem ,że było poruszanych wiele tematów dotyczących tego błędu, ale mimo poszukiwań nie mogłem nigdzie znaleźć rozwiązania problemu. Podczas kompilacji tego krótkiego kodu  kompilator zgłasza taki błąd.

Build: Release in autolist (compiler: GNU GCC Compiler)
error: ld returned 1 exit status|
Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

Odinstalowywałem antywirusa, przeinstalowywałem środowisko CodeBlocks oraz zmieniałem ścieżkę folderu z projektem.

main.cpp

#include "autolist.h"

int main()
{
    return 0;//<-- main powinna zwracac 0
}

autolist.h

#include <iostream>

#ifndef AUTOLIST_H_INCLUDED
#define AUTOLIST_H_INCLUDED

int max_lvl = 5;
int max_size = 10000;

template <class T>
class Node{
typedef Node<T>* N;
private:
    T key;
    Node** next;
    int lvl;
    bool if_guard;

public:
    Node();// guardian
    Node(T& n_key); // other
private:
    int set_lvl();

};

template <class T>
class AutoList{
typedef Node<T>* N;
private:
    N guard;
    N bot;
    N crnt;
    int node_nmbr;

public:
    AutoList();
    void insrt_in(T& n_key);
    T rtrn_key(int& index);
    int srch(T& n_key);

private:
    bool if_max();
    N find_node(N node,N prev,T& n_key,int& lvl);
    void set_ally (N node);
};

#endif // AUTOLIST_H_INCLUDED

autolist.cpp (tylko jedna linijka)

#include "autolist.h"

Jednak , gdy usunę tą linijkę lub wstawię ją jako komentarz , to kod kompiluje się bez problemu. Usuwałem deklarację klasy jako szablonu, dalej to samo.

np, tak działa

// #include "autolist.h"

W czym rzecz ? Męczę się już drugi dzień i bardzo proszę o pomoc. Wielkie dzięki z góry

2 odpowiedzi

+2 głosów
odpowiedź 29 lipca 2019 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 29 lipca 2019 przez DamianW
 
Najlepsza

Powinieneś dostać błąd o podwójnej definicji zmiennych globalnych `max_lvl` i `max_size`. Jest to spowodowane kolizją symboli w przestrzeni globalnej w trakcie linkowania. Można to rozwiązać dopisując `static` przed definicjami zmiennych (które ogranicza widoczność jedynie do danego modułu kompilacji) lub stworzyć (i to bardziej preferowana opcja) pola statyczne klasy. Przy szablonach klasy ich definicja może przysporzyć na początku sporo problemów, więc podam ci gotowe rozwiązanie.

// Definicja klasy Node z deklaracją zmiennych statycznych powyżej!

template<class T> int Node<T>::max_lvl = 5;
template<class T> int Node<T>::max_size = 10000;
komentarz 29 lipca 2019 przez DamianW Bywalec (2,080 p.)
edycja 29 lipca 2019 przez DamianW

Dzięki wielkie, nakierowałeś mnie w dużym stopniu na rozwiązanie problemu. Przed typem int trzeba było podać słowo kluczowe const , wtedy problem znika.

Tak działa:

const int max_lvl = 5;
const int max_size = 10000;

Tak też:

static int max_lvl = 5;
static int max_size = 10000;

,ale wtedy dostaję dziwne warningi od kompilatora:

 Build: Release in autolist (compiler: GNU GCC Compiler)
...\autolist.h|6|warning: 'max_lvl' defined but not used [-Wunused-variable]|
...\autolist.h|7|warning: 'max_size' defined but not used [-Wunused-variable]|
...\autolist.h|6|warning: 'max_lvl' defined but not used [-Wunused-variable]|
...autolist.h|7|warning: 'max_size' defined but not used [-Wunused-variable]|
||=== Build finished: 0 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

Co dziwne ,że gdy dodam taką deklarację zmiennej globalnej :

int zmienna = 4;

w pliku main.cpp lub autolist.cpp to cały kod kompiluje się bez problemu .

Ale trochę dziwne ,że kompilator taki dziwny błąd zgłosił  w tym przypadku nie podając miejsca jego wystąpienia( w sumie mogłem debugera użyć :D). Mam pytanie co do słówka static . Czy sprawia ono , że pole danej klasy jest stałe przez działanie całego programu dla każdego obietku klasy ?

1
komentarz 29 lipca 2019 przez Patrycjerz Mędrzec (192,320 p.)
edycja 29 lipca 2019 przez Patrycjerz

Sposób z `const` działa, ponieważ wtedy zmienna jest domyślnie linkowana wewnętrznie, więc nie ma kolizji symboli pomiędzy różnymi modułami kompilacji.

Flaga kompilacji `-Wunused-variable` pokazuje ci nieużywane zmienne lokalne i statyczne (linkowane wewnętrznie), nie pokazuje natomiast braku użycia stałych statycznych. Dlatego zmienne z `static` generują błędy, natomiast z `const` już nie.

Użyty przez ciebie zapis

int zmienna = 4;

definiuje zmienną linkowaną zewnętrznie. Oznacza to, że flaga omówiona powyżej nie pokaże żadnego błędu.

Mam pytanie co do słówka static . Czy sprawia ono , że pole danej klasy jest stałe przez działanie całego programu dla każdego obietku klasy ?

Niezupełnie, gdyż w obrębie klasy słowo `static` tworzy zmienną statyczną (linkowaną wewnętrznie) w przestrzeni nazw klasy. Dlatego poza deklaracją w klasie wymagana jest oddzielna definicja poza ciałem klasy. Takie pole nie jest stałe, jedynie dostępne przez każdy obiekt, posiadając jeden egzemplarz na klasę. Może być stałą `const` lub zwykłą zmienną.

komentarz 1 sierpnia 2019 przez DamianW Bywalec (2,080 p.)
Dzięki wielkie
+1 głos
odpowiedź 29 lipca 2019 przez niezalogowany
przeniosłem do odpowiedzi bo jak będzie w komentarzach to będzie świecił na początku.

Nie wiem jaki masz problem,ale raczej #include <iostream> i wszystkie inne nałówki #include wstawia się po strażniku nagłówka(#ifndef #define ) po to on jest.

Być może poprawnie ale dla mnie to dziwnie wygląda Node<T>* (Node<T*> ?), ja praktycznie nie maiłem do czynienia z template więc tylko gdybam.

https://en.cppreference.com/w/cpp/language/template_parameters

"autolist.h", ale czy masz "autolist.cpp", bo nie wiem czy słusznie uważam że Node(); to tylko deklaracja? Definicja chyba wygląda tak Node(){};
komentarz 29 lipca 2019 przez DamianW Bywalec (2,080 p.)
Tak, w pliku nagłówkowym są tylko deklaracje pól i metod klas.

Podobne pytania

0 głosów
1 odpowiedź 1,724 wizyt
+1 głos
2 odpowiedzi 2,537 wizyt
pytanie zadane 3 listopada 2017 w C i C++ przez Kacalar Początkujący (270 p.)
0 głosów
1 odpowiedź 270 wizyt
pytanie zadane 2 listopada 2020 w C i C++ przez hihijsonel Obywatel (1,250 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...