C: segmentation fault κατα την δηλωση pointer

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό Garrus » 24 Ιούλ 2011, 16:46

Κώδικας: Επιλογή όλων
typedef struct node{
int val[3][3];
struct node* next;
}node;


main:
Κώδικας: Επιλογή όλων
printf("STart\n");
node * board;
printf("AdfddSD");


terminal:
Κώδικας: Επιλογή όλων
$ ./b
STart
Segmentation fault


Οπως βλεπετε απο τις printf, κρασαρει κατα τη δηλωση του ποιντερ..frickin why?
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό roman » 24 Ιούλ 2011, 16:51

Σε εμένα δεν βγάζει Segmentation fault. Κάνε paste το πρόγραμμα ολόκληρο.
No LSB modules are available.
roman
punkTUX
punkTUX
 
Δημοσιεύσεις: 178
Εγγραφή: 11 Φεβ 2009, 15:09
Τοποθεσία: Θεσσαλονίκη
IRC: rwmanos
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό Garrus » 24 Ιούλ 2011, 17:11

Okay.Το πρωτο ειναι το βασικο .c αρχειο, το δευτερο included.Η περιγραφη συναρτησεων,δομων κλπ ειναι στο included.

.c
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include "bfs8.h"

int main(){
printf("STart\n");
node * board;

printf("AdfddSD");
board = newnode();

printf("Noded");
init_board(board);
pboard(board);

queue * open;
open=newq();

enq_succ(open,board);
}



the included .h
Κώδικας: Επιλογή όλων
#include <stdio.h>

#include <stdlib.h>



typedef struct node{
int val[3][3];
struct node* next;
}node;


typedef struct queue{
int len;
node *head;
node * tail;
}queue;



int RandomInteger(int l,int h){
int k;
double d;

d=(double)rand() / ((double) RAND_MAX +1);
k=(int) (d * (h-l+1));
return (l+k);

}


node * newnode(){
printf("ASD");
node * n;

int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
n->val[i][j] = 0;
}
}
n->next=NULL;
return n;
}

void copynode(node *src,node *trgt){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
trgt->val[i][j]=src->val[i][j];
}
}

}
//list functions

int isempty(queue * Q){
return(Q->head==NULL);
}

void enqueue(queue *Q,node *n){
if(isempty(Q)){
Q->head=n;
Q->tail=n;
}
else{
Q->tail->next=n;
Q->tail=n;
}
Q->len++;
}

node* dequeue(queue *Q){
if(isempty(Q)){
printf("Can't dequeue, queue is empty\n");
return NULL;
}

node * p;
p=Q->head;
Q->head=p->next;
Q->len--;
return p;
}


void printQ(queue * Q){
node *index;
index=Q->head;
while(index!=NULL){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",index->val[i][j]);
}
printf("\n");
}

}
printf("\n");

}


void init_board(node * n ){
int i,j;
int skip=0;
int k;
int s[]={0,1,2,3,4,5,6,7,8};
for(i=0;i<3;i++){
for(j=0;j<3;j++){

if(skip<2) skip=RandomInteger(0,1);
if(skip==1){
skip++;
n->val[i][j] = 0;
}
else{
k=RandomInteger(1,8);
while(s[k]==0) k=RandomInteger(1,8);
n->val[i][j]=s[k];
s[k]=0;
}
}
}
}

queue * newq(){
queue * q;
q->head=NULL;
q->tail=NULL;
q->len=0;
}

void pboard(node * n){
int i,j;

for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%d ",n->val[j][i]);

}
printf("\n");
}

}


int withinlimits(int a,int b){
return ((a<3)&&(a>=0)&&(b<3)&&(b>=0));
}


void enq_succ(queue *Q,node * n){
int i,j,x,y;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(n->val[i][j]==0) {
x=i;
y=j;
i=3;
j=i;

}
}

}

//sequentially check for left,right,up,down

if(withinlimits(x-1,y)){
node * p;
copynode(n,p);
int tmp;
tmp=p->val[x][y];
p->val[x][y]=p->val[x-1][y];
p->val[x-1][y]=tmp;
enqueue(Q,p);
}


if(withinlimits(x+1,y)){
node * p;
copynode(n,p);
int tmp;
tmp=p->val[x][y];
p->val[x][y]=p->val[x+1][y];
p->val[x+1][y]=tmp;
enqueue(Q,p);
}

if(withinlimits(x,y-1)){
node * p;
copynode(n,p);
int tmp;
tmp=p->val[x][y];
p->val[x][y]=p->val[x][y-1];
p->val[x][y-1]=tmp;
enqueue(Q,p);
}


if(withinlimits(x,y+1)){
node * p;
copynode(n,p);
int tmp;
tmp=p->val[x][y];
p->val[x][y]=p->val[x][y+1];
p->val[x][y+1]=tmp;
enqueue(Q,p);
}


}
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 17:18

Με πρώτη ματιά διπλο-ορίζεις πρόσθετους τύπους (όπως π.χ. τον node) κι επίσης ακολουθείς εσφαλμένη προσέγγιση συμπερίληψης του ενός αρχείου μέσα στο άλλο.

Πάω να κάνω καφεδάκι και να δω τον κώδικά σου με περισσότερη προσοχή.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό Garrus » 24 Ιούλ 2011, 17:25

Που ορισα το node δευτερη φορα;

Ως προς την συμπεριληψη, βλεπω οτι εκανα include την stdio 2 φορες απανωτα.

Βαζοντας τον ορισμο της node στο .c , και ενω την επανεφερα στο .h και εκανα ξανα compile, τωρα δουλευει κανονικα.
:?:
ο,τι να ναι..
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 17:34

Όπα, άκυρο... έχεις δίκιο... μια φορά το ορίζεις! σορρυ!

Λοιπόν, το 1ο που βλέπω τώρα είναι το...
Κώδικας: Επιλογή όλων

board = newnode();

που έχεις στην main(), η οποία newnode() πάει και βάζει τιμές στο τοπικό node *n, χωρίς να το έχεις κάνει πρώτα malloc() ή calloc()... αυτό σου δίνει το Seg-Fault.

Πέρα όμως από αυτό, η newnode() επιστρέφει τη διεύθυνση της τοπικής μεταβλητή node *n (return n), η οποία όμως ως τοπική μεταβλητή που είναι διαγράφεται από τη γλώσσα μόλις τερματίσει η συνάρτηση newnode().

Παρακάτω δεν έχω δει ακόμα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό Garrus » 24 Ιούλ 2011, 17:38

Σωστος! Θενκς.
[ κανω τα ιδια λαθη ξανα,και ξανα, και ξανα] :(
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό pc_magas » 24 Ιούλ 2011, 18:02

Πρώτον ένα Header file αρχίζει με:
Κώδικας: Επιλογή όλων

#ifndef STA8ERA
#define STA8ERA
//δηλώσεις κώδικα
#endif

Το παραπάνω το κάνουμε έτσι ώστε όταν κάνουμε πολλά includes σε διάφορα αρχεία κώδικα να γίνεται μια φορά include. Όπου σταθερά βάζεις ένα μοναδικό όνομα.

Ακόμαστο header file βάζουμε ΜΟΝΟ ΔΗΛΩΣΕΙΣ καθολικών μεταβλητών, typedefs , struct, union και συναρτήσεων. Κώδικας μπαίνει σε ξεχωρίστά αρχεία .c όπου μπορούν να μην έχουν main. Και η main να είναι σε ξεχωριστό αρχείο .c

Πχ. Έστω έχουμε τα εξής αρχεία: Header.h Header.c Main.c
Στο Header.h έχουμε
Κώδικας: Επιλογή όλων

#ifndef HEADER
#define HEADER
#include<stdio.h>
void printsomething();
#endif


Στο Header.c έχουμε
Κώδικας: Επιλογή όλων

#include"Header.h"
void printsomething()
{
printf("Hello this is a sample header\n");
}

Στο main.c έχουμε
Κώδικας: Επιλογή όλων

#include"Header.h"
#include<stdio.h> //μπορεί να παραληφθεί σε αυτό το παράδειγμα
int main()
{
printsomething();
}


Μετά ανοίγιες τερματικό
Πρώτα πηγαίνεις στο φάκελο όπου έχεις όλα τα αρχεία .c και .h όπου έχεις κάνει
Κώδικας: Επιλογή όλων

cd <path αρχείων>


Και κάνεις το compile:
Κώδικας: Επιλογή όλων

gcc -o Headerexample Header.c Main.c
My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2599
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 18:22

Garrus έγραψε:Σωστος! Θενκς.
[ κανω τα ιδια λαθη ξανα,και ξανα, και ξανα] :(


Παρακαλώ! :)

Η αλήθεια είναι πως δεν μπορώ με τίποτα να συνηθίσω το στυλ γραφής σου ώστε να παρακολουθήσω τον κώδικά σου... αχρείαστα συμπτυγμένος και με ορσμούς μεταβλητών αχρείαστα διάσπαρτους σε διάφορα σημεία του κώδικα.

Τον έφτιαξα στο στυλ που γράφω εγώ, χωρίς όμως να τον ελέγξω αλγοριθμικά (αν και πήρε το μάτι μου... διάφορα :p)

Σου έφτιαξα και τον σωστό τρόπο που πρέπει να κάνεις #include (που λίγο-πολύ είναι ότι σου έγραψε ο φίλος pc-magas).

Οπότε...

QUEUE.H
Κώδικας: Επιλογή όλων

#ifndef QUEUE_H
#define QUEUE_H

typedef struct node{
int val[3][3];
struct node* next;
}node;

typedef struct queue{
int len;
node *head;
node *tail;
}queue;

extern int RandomInteger(int l, int h);
extern node *newnode( void );
extern void copynode(node *src, node *trgt);
extern int isempty(queue *Q);
extern void enqueue(queue *Q, node *n)
extern node *dequeue(queue *Q);
extern void printQ(queue * Q);
extern void init_board(node *n);
extern queue *newq( void );
extern void pboard(node *n);
extern int withinlimits(int a, int b);
extern void enq_succ(queue *Q, node *n);

#endif


QUEUE.C
Κώδικας: Επιλογή όλων

#include <stdio.h>
#include <stdlib.h>

#ifndef QUEUE_H
#include "queue.h"
#endif

// --------------------------------------------------------------------------------
int RandomInteger(int l,int h)
{
int k;
double d;

d = (double)rand() / ((double) RAND_MAX +1);
k = (int) (d * (h-l+1));

return (l+k);
}

// --------------------------------------------------------------------------------
node *newnode( void )
{
printf("ASD");
node *n;

int i,j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
n->val[i][j] = 0;
n->next = NULL;

return n;
}

// --------------------------------------------------------------------------------
void copynode(node *src, node *trgt)
{
int i,j;
for (i=0; i < 3; i++)
for(j=0; j < 3 ;j++)
trgt->val[i][j] = src->val[i][j];

return;
}

//list functions

// --------------------------------------------------------------------------------
int isempty(queue *Q)
{
return Q->head == NULL;
}

// --------------------------------------------------------------------------------
void enqueue(queue *Q, node *n)
{
if ( isempty(Q) ) {
Q->head = n;
Q->tail = n;
}
else{
Q->tail->next=n;
Q->tail=n;
}
Q->len++;

return;
}

// --------------------------------------------------------------------------------
node *dequeue(queue *Q)
{
if ( isempty(Q) ) {
printf("Can't dequeue, queue is empty\n");
return NULL;
}

node *p;
p = Q->head;
Q->head = p->next;
Q->len--;

return p;
}

// --------------------------------------------------------------------------------
void printQ(queue * Q)
{
node *index;
index = Q->head;

while ( index != NULL )
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",index->val[i][j]);
printf("\n");
}
}
printf("\n");

return;
}


// --------------------------------------------------------------------------------
void init_board(node *n)
{
int i,j;
int skip=0;
int k;
int s[] = {0,1,2,3,4,5,6,7,8};

for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (skip < 2)
skip = RandomInteger(0,1);
if (skip == 1){
skip++;
n->val[i][j] = 0;
}
else{
k = RandomInteger(1,8);
while ( s[k] == 0 )
k=RandomInteger(1,8);
n->val[i][j] = s[k];
s[k] = 0;
}
}
}
}

// --------------------------------------------------------------------------------
queue *newq( void )
{
queue *q;
q->head = NULL;
q->tail = NULL;
q->len = 0;
}

// --------------------------------------------------------------------------------
void pboard(node *n)
{
int i,j;

for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
printf("%d ",n->val[j][i]);
printf("\n");
}

return;
}

// --------------------------------------------------------------------------------
int withinlimits(int a, int b)
{
return ( a < 3 && a >= 0 && b < 3 && b >= 0 );
}


// --------------------------------------------------------------------------------
void enq_succ(queue *Q, node *n)
{
int i,j,x,y;
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (n->val[i][j] == 0) {
x=i;
y=j;
i=3;
j=i;
}
}

}

//sequentially check for left,right,up,down

if ( withinlimits(x-1,y) )
{
node *p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x-1][y];
p->val[x-1][y] = tmp;
enqueue(Q,p);
}


if ( withinlimits(x+1,y) )
{
node * p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x+1][y];
p->val[x+1][y] = tmp;
enqueue(Q,p);
}

if ( withinlimits(x,y-1) )
{
node * p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x][y-1];
p->val[x][y-1] = tmp;
enqueue(Q,p);
}


if ( withinlimits(x,y+1) )
{
node *p;
copynode(n,p);
int tmp;
tmp = p->val[x][y];
p->val[x][y] = p->val[x][y+1];
p->val[x][y+1] = tmp;
enqueue(Q,p);
}

return;
}


MAIN.C
Κώδικας: Επιλογή όλων

#include<stdio.h>

#ifndef QUEUE_H
#include "queue.h"
#endif

int main( void )
{

printf("STart\n");
node *board;

printf("AdfddSD");
board = newnode();

printf("Noded");
init_board( board );
pboard( board );

queue *open;
open = newq();

enq_succ(open, board);

return 0;
}


Compilation με gcc...
Κώδικας: Επιλογή όλων
gcc -Wall main.c queue.c -o myprogram
ακόμα καλύτερα φτιάξε ένα makefile!

Αλλιώς, αν είσαι σε κάποιο αυτοματοποιημένο Windows IDE, βάζεις τα αρχεία: queue.h, queue.c και main.c στο ίδιο project.

Καλό θα ήταν επίσης, συναρτήσεις που δεν έχουν να κάνουν αποκλειστικά με διαχείριση λιστών (όπως π.χ. η RandomInteger() και η withinlimits() ) να φύγουν από το queue.c (και να διαγραφούν τα πρότυπά τους από το queue.h) και να μπουν στο main.c

Και btw, στις void συναρτήσεις βάζε ένα σκέτο: return; πριν της τερματίσεις, όπως επίσης βάζε void ανάμεσα σττις παρενθέσεις όταν ορίζεις συναρτήσεις που δεν παίρνουν ορίσματα (στα έχω φτιάξει αυτά στον παραπάνω κώδικα).

Α, έχεις και τη συνάρτηση newq( void ); που την έχεις ορίσει επιστρέφει δείκτη σε queue: queue *, αλλά μέσα στο σώμα της δεν έχεις κανένα return.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: C: segmentation fault κατα την δηλωση pointer

Δημοσίευσηαπό Garrus » 24 Ιούλ 2011, 19:37

Ευχαριστω πολυ παιδες!
Τζιζους migf1, δεν χρειαζοταν/ζητησα να ξαναγραψεις ολο τον κωδικα μου... ελπιζω να το εκανες ευχαριστα/για να περασει η ωρα.

Ερωτησεις:

-Γιατι προτιμαται η δομη σε main.c , header.c , header.h?
Νομιζα οτι τα .h ειναι γενικα τα "συμπληρωματικα" ως προς το .c που περιεχει την main σου.

έγραψε:στις void συναρτήσεις βάζε ένα σκέτο: return; πριν της τερματίσεις, όπως επίσης βάζε void ανάμεσα σττις παρενθέσεις όταν ορίζεις συναρτήσεις που δεν παίρνουν ορίσματα (στα έχω φτιάξει αυτά στον παραπάνω κώδικα).

Γιατι ομως;
1 Γνώσεις Linux: Ελπίζω τουλ. μέτρια ┃ Προγραμματισμού: Καλή ┃ Αγγλικών: Very best englands
2 Ubuntu 15.10 wily 64bit (en_US.UTF-8),
3 Intel Core i5-3210M CPU @ 2.50GHz ‖ RAM 3843 MiB ‖ SAMSUNG ELECTRONICS CO., LTD. NP350E5C-S03GR [...]
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] (rev 09) ⋮ [AMD/ATI] Thames [Radeon HD 7500M/7600M Series] [1002:6840] (rev ff)
5 enp2s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 09) ⋮ wlp3s0: Qualcomm Atheros AR9485 Wireless Network Adapter [168c:0032] (rev 01)
Garrus
punkTUX
punkTUX
 
Δημοσιεύσεις: 179
Εγγραφή: 26 Ιαν 2011, 03:23
Εκτύπωση

Επόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι