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

[C] Wykrywanie systemu

Ostatnio zmodyfikowano 2015-06-19 17:39
Autor Wiadomość
Roofy5
Temat założony przez niniejszego użytkownika
[C] Wykrywanie systemu
» 2015-06-19 13:08:13
Chciałem napisać program, tworzący listę.
Aby tą listę wyświetlić i żeby program ładnie prezentował się w konsoli używam niektórych funkcji obsługujących konsolę np. system("CLS"), _sleep().
Nie jestem pewien czy podane funkcje zadziałają pod Linuxem (program tworzę na Windows, ale chciałbym żeby działał także pod Linuxem).

Wpadłem na pomysł żeby stworzyć coś w rodzaju strażnika na początku programu - chodzi mi o polecenia pre-procesora, które ustalą w jakim systemie program jest uruchomiony.

Myślałem o czymś takim:

C/C++
#ifdef LINUX
#define SYSTEM LINUX

#ifdef WINDOWS
#define SYSTEM WINDOWS

#endif

Do każdej funkcji dodałbym pole z enum i określał wartość SYSTEM - wtedy dostosowywałby działanie funkcji.

Nie wiem czy kod napisałem poprawnie, nie wiem także jak odczytać wersję systemu.

Pomożecie? :D
P-133779
pekfos
» 2015-06-19 13:34:05
Nie prościej użyć ncurses?
P-133780
Roofy5
Temat założony przez niniejszego użytkownika
» 2015-06-19 14:03:08
Mam już taki kod, który poprawnie wykrywa dany system - testowałem pod Win i pod Ubuntu:

C/C++
#ifdef __linux__
#define SYSTEM 0

#elif linux
#define SYSTEM 0

#elif __linux
#define SYSTEM 0

#elif _WIN32
#define SYSTEM 1

#elif _WIN64
#define SYSTEM 1

#endif

Mam jednak problem z samym programem. W Visualu napisałem strutkurę w ten sposób:

C/C++
struct node
{
    int klucz;
    node * next;
};

Niestety pod Linuxem wywala masę błędów, włącznie z tym że nie rozumie linijki node *next;

Pod Viusalem kompiluję to w C++ a pod linuxem w C

Może mi ktoś wytłumaczyć jak powinienem to zapisać tak aby w gcc kompilował porapwnie?

Czytałem trochę o taki sposobie:

C/C++
typedef struct node
{
    int klucz;
    node * next;
} node;

Czym to właściwie się różni??
Tak samo czy w C istnieje taki zapis??

C/C++
void inicjuj( int key, node *& root );
Chodzi mi o zapis *& - gcc wywala na tym błąd.
P-133782
Lora
» 2015-06-19 14:19:29
W C się deklaruje zmienną struktury w taki sposób:
C/C++
struct struktura
{
    //
};

int main()
{
    struct struktura obiekt;
}

Możesz użyc
typedef
, żeby to skrócić:
C/C++
struct struktura
{
    //
};

typedef struct struktura struktura;

int main()
{
    struktura obiekt;
}

To co zrobiłeś to jest to samo tylko używasz typedefa od razu przy definicji struktury:

C/C++
typedef struct node
{
    int klucz;
    struct node * next; // tylko tu jeszcze ma być struct, bo to jest jeszcze przed typedef
} node;

Co do 2 pytania - w C nie ma referencji.
P-133785
Roofy5
Temat założony przez niniejszego użytkownika
» 2015-06-19 14:51:21
"W C nie ma referencji"

Hm.. nie wiedziałem o tym xD Dzięki za informację - strukturę już poprawiłem, tylko teraz mam inny problem.
Skoro C nie obsługuje referencji, to jak mam zmienić mój kod:

C/C++
void inicjuj( int key, node *& root ) //W tym miejscu usunąłem znak & ale wtedy zmienna root nie zmienia się po zakończeniu funkcji
{
    if( root == NULL )
    {
        root =( node * ) malloc( sizeof( node ) );
        root->klucz = key;
        root->next = NULL;
        return;
    }
    else
    {
        printf( "\nLista jest juz stworzona!\n" );
        spij();
        return;
    }
}
P-133786
Lora
» 2015-06-19 15:08:31
Możesz przekazywać do funkcji wskaźnik do twojego roota, czyli wskaźnik do wskaźnika:
C/C++
void inicjuj( int key, node ** root )
{
   
    if(( * root ) == NULL )
    {
       
        ( * root ) =( node * ) malloc( sizeof( node ) );
        ( * root )->klucz = key;
        ( * root )->next = NULL;
        return;
    }
    else
    {
        printf( "\nLista jest juz stworzona!\n" );
        spij();
        return;
    }
}

int main()
{
   
    node * root = NULL;
    inicjuj( 1, & root );
}
P-133788
Roofy5
Temat założony przez niniejszego użytkownika
» 2015-06-19 15:35:49
Dzięki wielkie :D

Też myślałem o tym żeby zrobić to przez wskaźnik na wskaźnik ale zapomniałem o tych nawiasach
( * root )->klucz = key;
 Pisałem bez nawiasów i miałem błąd tzn.
* root->klucz = key;
Tak właściwie to czym to się różni - tam jest jakiś priorytet między * a = ??
P-133792
Lora
» 2015-06-19 15:42:17
->
 ma priorytet nad
*
. Czyli zapis
* root->klucz
 jest równoznaczny z
*( root->klucz )
.
P-133793
« 1 » 2
  Strona 1 z 2 Następna strona