Τα πάντα για την C

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

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 26 Ιαν 2012, 01:21

Star_Light έγραψε:
...
Παντως ειναι πολυ πιο βελτιστο πιστευω να περνάς σαν παράμετρο μεσα σε μια συνάρτηση την επιλογη του χρηστη απο το να οριζεις μια switch και αναλογα την ετικέτα της να καλεις την καθε συναρτηση ξεχωριστα που υλοποιει ας πουμε καθε πραξη ξεχωριστα... θυμαμαι σε κατι υλοποιησεις παλαιοτερα στην σχολη αυτο ειχα κανει! Ο χείριστος!!!!!

Έτσι είναι πιο γρήγορο, μπορεί όμως να υπάρχουν περιπτώσεις που να εξυπηρετεί καλύτερα με ξεχωριστές συναρτήσεις. Δεν έχει δηλαδή λάθος και σωστό.

Σου έφτιαξα στα γρήγορα μια μικρή βιβλιοθήκη libop, που κάνει ότι πόσταρες κι εσύ αλλά με ξεχωριστές συναρτήσεις για κάθε ξεχωριστό τύπο δεδομένων και με καλύτερο error checking.

Σε γενικές γραμμές, όταν γράφεις βιβλιοθήκες πρέπει να είσαι πολύ πιο προσεκτικός και σφαιρικός στις υλοποιήσεις σου, γιατί οι βιβλιοθήκες μπορούν να χρησιμοποιηθούν σε πάρα πολλά πρότζεκτ. Επίσης, δεν είναι καλή ιδέα να βάζεις τις συναρτήσεις της βιβλιοθήκης να τυπώνουν μηνύματα. Αντίθετα, είναι καλή ιδέα να τις βάζεις να επιστρέφουν τιμές σφάλματος όταν κάτι πάει στραβά, τις οποίες τιμές επιστροφής μπορεί να τις τσεκάρει όποιος χρησιμοποιεί τη βιβλιοθήκη και να τυπώσει εκείνος ότι μήνυμα επιθυμεί.

Σε αυτό που σου έφτιαξα, η συνάρτηση που κάνει πράξεις σε int επιστρέφει INT_MIN αν κάτι πάει στραβά, εκείνη που κάνεις πράξεις σε long int επιστρέφει LONG_MIN αν κάτι πάει στραβά, εκείνη για float επιστρέφει FLT_MIN κι εκείνη για double επιστρέφει DBL_MIN.

Αυτές τις τιμές πρέπει να τις ελέγχει το δοκιμαστικό πρόγραμμα που έφτιαξα να χρησιμοποιεί την βιβλιοθήκη, για να δει αν υπήρξε κάποιο πρόβλημα όταν κάλεσε κάποια από τις παραπάνω συναρτήσεις.

Για να το κάνω λίγο πιο εύκολο να το θυμάται ο χρήστης της βιβλιοθήκης, τους ελέγχους αυτούς τους έφτιαξα σε 4 αντίστοιχα macros:

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

OP_INT_ISERROR(n)
OP_LONG_ISERROR(l)
OP_FLT_ISERROR(f)
OP_DBL_ISERROR(d)

μπορεί να χρησιμοποιεί απευθείας αυτά για να δει αν απέτυχε ή όχι η κλήση της αντίστοιχης συνάρτησης. Βασικά αυτά χρησιμοποιώ κι εγώ στο δοκιμαστικό προγραμματάκι test.c

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

/* FILE: libop.h */

#ifndef LIBOP_H /* Protect against multiple inclusions of this file */
#define LIBOP_H

/* LIBOP inclusions of standard header files */

#include <limits.h>
#include <float.h>
#include <math.h>

/* LIBOP Constants & Macros */

enum {
OP_ADD = '+',
OP_SUB = '-',
OP_MUL = '*',
OP_DIV = '/',
OP_MOD = '%',
};

#define OP_INT_ISERROR(n) ( (n) == INT_MIN )
#define OP_LONG_ISERROR(l) ( (l) == LONG_MIN )
#define OP_FLT_ISERROR(f) ( (f) == FLT_MIN )
#define OP_DBL_ISERROR(d) ( (d) == DBL_MIN )

#define OP_FLT_ZEROMARGIN 0.0000000000000001
#define OP_FLT_ISZERO(f) ( fabsf((f)) < OP_FLT_ZEROMARGIN )

#define OP_DBL_ZEROMARGIN 0.000000000000000000000000000001
#define OP_DBL_ISZERO(d) ( fabs((d)) < OP_DBL_ZEROMARGIN )


/* LIBOP Function Prototypes */

extern int opInt( const char op, const int x, const int y );
extern long int opLong( const char op, const long int x, const long int y );
extern float opFloat( const char op, const float x, const float y );
extern double opDouble( const char op, const double x, const double y );

#endif /* #ifndef LIBOP_H */


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

/* FILE: libop.c */

#include "libop.h "

/*********************************************************//**
*
************************************************************/
int opInt( const char op, const int x, const int y )
{
int ret = INT_MIN;

if ( op == OP_ADD )
ret = x + y;

else if ( op == OP_SUB )
ret = x - y;

else if ( op == OP_MUL )
ret = x * y;

else if ( op == OP_DIV )
ret = (y == 0) ? INT_MIN : x / y;

else if ( op == OP_MOD )
ret = (y == 0) ? INT_MIN : x % y;

return ret;
}

/*********************************************************//**
*
************************************************************/
long int opLong( const char op, const long x, const long y )
{
long int ret = LONG_MIN;

if ( op == OP_ADD )
ret = x + y;

else if ( op == OP_SUB )
ret = x - y;

else if ( op == OP_MUL )
ret = x * y;

else if ( op == OP_DIV )
ret = (y == 0) ? LONG_MIN : x / y;

else if ( op == OP_MOD )
ret = (y == 0) ? LONG_MIN : x % y;

return ret;
}

/*********************************************************//**
*
************************************************************/
float opFloat( const char op, const float x, const float y )
{
float ret = FLT_MIN;

if ( op == OP_ADD )
ret = x + y;

else if ( op == OP_SUB )
ret = x - y;

else if ( op == OP_MUL )
ret = x * y;

else if ( op == OP_DIV )
ret = OP_FLT_ISZERO(y) ? FLT_MIN : x / y;

else if ( op == OP_MOD )
ret = OP_FLT_ISZERO(y) ? FLT_MIN : fmodf(x,y);

return ret;
}

/*********************************************************//**
*
************************************************************/
double opDouble( const char op, const double x, const double y )
{
double ret = DBL_MIN;

if ( op == OP_ADD )
ret = x + y;

else if ( op == OP_SUB )
ret = x - y;

else if ( op == OP_MUL )
ret = x * y;

else if ( op == OP_DIV )
ret = OP_DBL_ISZERO(y) ? DBL_MIN : x / y;

else if ( op == OP_MOD )
ret = OP_DBL_ISZERO(y) ? DBL_MIN : fmod(x,y);

return ret;
}


Τα παραπάνω είναι τα της βιβλιοθήκης (btw, δες πως διαχειριζόμαστε ισότητες με το 0.0 όταν έχουμε floating ή double μεταβλητές). Για να πάρεις το .o αρχείο της κάνεις...

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

gcc -c libop.c


Κι εδώ το δοκιμαστικό πρόγραμμα (μου βγήκε λίγο μπερδεμένο, επειδή το έκανα βιαστικά... ευελπιστώ να βοηθήσιε πάντως).

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

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

#define MAXINPUT (255+1)

#define pressENTER() \
do{ \
char mYcHAr; \
printf( "press ENTER..." ); \
while ( (mYcHAr=getchar()) != '\n' && mYcHAr != EOF ) \
; \
}while(0)

/*********************************************************//**
*
************************************************************/
char menu1( void )
{
char input[ MAXINPUT ] = {'\0'};

puts( "\nSelect type of data" );
puts( "\ti for int\n\tl for long\n\tf for float\n\td for double\n\tx to exit");
printf( "> " );

if ( NULL == fgets( input, MAXINPUT, stdin ) ) {
fputs("*** fatal error, exiting the program...\n", stderr );
return 'x';
}

return *input;
}

/*********************************************************//**
*
************************************************************/
int menu2( char *input )
{
if ( !input ) {
fputs("*** internal error, exiting the program...\n", stderr );
return 0; /* false */
}

puts( "\nEnter operation & operands (leave spaces)" );
puts( "\t+ x y \t for adding x and y");
puts( "\t- x y \t for subtracting y from x");
puts( "\t* x y \t for multiplying x with y");
puts( "\t/ x y \t for dividing x by y");
puts( "\t% x y \t for the remainder of division x / y");
puts( "\tx \t to exit the program");
printf( "> " );

if ( NULL == fgets( input, MAXINPUT, stdin ) ) {
fputs("*** fatal error, exiting the program...\n", stderr );
return 0;
}

return 1; /* true */
}

/*********************************************************//**
*
************************************************************/
void do_int( const char *input )
{
char op = '\0';
int res, x, y;

if ( !input || !*input)
return;

sscanf( input, "%c %d %d", &op, &x, &y );
res = opInt( op, x, y );

if ( op == 'x' )
return;

if ( OP_INT_ISERROR(res) )
fputs( "*** an error occured, try again...\n", stderr );
else
printf("(int) result = %d\n", res );

pressENTER();

return;
}

/*********************************************************//**
*
************************************************************/
void do_long( const char *input )
{
char op = '\0';
long int res, x, y;

if ( !input || !*input)
return;

sscanf( input, "%c %ld %ld", &op, &x, &y );
res = opLong( op, x, y );

if ( op == 'x' )
return;

if ( OP_LONG_ISERROR(res) )
fputs( "*** an error occured, try again...\n", stderr );
else
printf("(long int) result = %ld\n", res );

pressENTER();

return;
}

/*********************************************************//**
*
************************************************************/
void do_float( const char *input )
{
char op = '\0';
float res, x, y;

if ( !input || !*input)
return;

sscanf( input, "%c %f %f", &op, &x, &y );
res = opFloat( op, x, y );

if ( op == 'x' )
return;

if ( OP_FLT_ISERROR(res) )
fputs( "*** an error occured, try again...\n", stderr );
else
printf("(float) result = %f\n", res );

pressENTER();

return;
}

/*********************************************************//**
*
************************************************************/
void do_double( const char *input )
{
char op = '\0';
double res, x, y;

if ( !input || !*input)
return;

sscanf( input, "%c %lf %lf", &op, &x, &y );
res = opDouble( op, x, y );

if ( op == 'x' )
return;

if ( OP_DBL_ISERROR(res) )
fputs( "*** an error occured, try again...\n", stderr );
else
printf("(double) result = %g\n", res );

pressENTER();

return;
}

/*********************************************************//**
*
************************************************************/
int main( void )
{
char c = '\0';
char input[ MAXINPUT ] = {'\0'};

do {
c = menu1();
if ( c == 'x' )
break;
} while ( c != 'i' && c != 'l' && c != 'f' && c != 'd');

if ( c == 'x')
exit( EXIT_SUCCESS );

while ( *input != 'x' && menu2(input) )
{
if ( c == 'i' )
do_int( input );

else if ( c == 'l' )
do_long( input );

else if ( c == 'f' )
do_float( input );

else if ( c == 'd' )
do_double( input );
}

exit( EXIT_SUCCESS );
}



στο οποίο προσθέτεις το .o της βιβλιοθήκης στη γραμμή εντολών του gcc...

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

gcc test.c libop.o -o test
./test
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Garrus » 26 Ιαν 2012, 02:58

Να ρωτησω για ενα segmentation fault που μου εχει σπασει τους νευρωνες;

Κώδικας: Επιλογή όλων
typedef struct neuron{
double y,s,delta,total_err;
double * w;

}neuron;

neuron **mlp;



αρχικοποιηση:
Κώδικας: Επιλογή όλων
void init(){
int i,j;


// we include every neuron's bias at as an extra neuron in the previous level
mlp = (neuron **) malloc(3 * sizeof(neuron *));
mlp[0] = (neuron*) malloc(D+1 * sizeof(neuron));
mlp[1] = (neuron*) malloc(H+1 * sizeof(neuron));
mlp[2] = (neuron*) malloc(K * sizeof(neuron));

// input level
mlp[0][D].y=1.0;
for(i=0;i<D+1;i++){

mlp[0][i].w= (double *) malloc(H*sizeof(double));
for(j=0;j<H;j++){
mlp[0][i].w[j] = RandomReal(-1.0,1.0);
}
}
// hidden level
mlp[0][H].y=1.0;
for(i=0;i<H+1;i++){

mlp[1][i].w = (double *) malloc(K*sizeof(double));
for(j=0;j<K;j++){
mlp[1][i].w[j] = RandomReal(-1.0,1.0);
}
}
// output level
for(i=0;i<K;i++){

mlp[2][i].w = NULL;


}

printf("End of mlp initialization\n");
return;
}




Και εδω ειναι το προβλημα:
Κώδικας: Επιλογή όλων
void backprop(double *t){
int i,j;
//calculate the utput errors
for(i=0;i<K;i++){
mlp[2][i].delta = output_prime(mlp[2][i].y)* (mlp[2][i].y - t[i]);
mlp[2][i].total_err+= mlp[2][i].delta;
}
printf("BP'd output lvl\n");

for(i=0;i<H+1;i++){
printf("Dealing with hidden neuron # %d\n",i);
mlp[1][i].total_err=0.0;
double sum=0.0;
// calc the incoming error from the output.Since network fully connected, include all the output.

for(j=0;j<K;j++) [color=#FF0000]sum += mlp[2][j].delta * (mlp[1][i].w[j]);[/color]
mlp[1][i].delta = sum * output_prime(mlp[1][i].y);
mlp[1][i].total_err +=mlp[1][i].delta;

}
printf("BP'd hidden lvl\n");
return;
}


Στην 2η επαναληψη του
for(i=0;i<H+1;i++){

Οταν παει στο εμφωλευμενο for, j=1, οταν παει να προσπελασει το mlp[1][i].w[j] χτυπαει segfault.
Γενικα, βλεπετε να αλλαζει καπου μεσα στην συναρτηση backprop το διανυσμα w?
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/C++

Δημοσίευσηαπό Star_Light » 26 Ιαν 2012, 09:43

Μεραααα!!!! Χθες την έπεσα νωρις γιατι ημουν πτωμα.

@migf1 έβαλα και αλλη μια συναρτηση χθες τελικα και ολα αυτα τα κολλησα μεσα
σε ενα mylib.a και έφτιαξα την βιβλιοθηκη τελικα! :D Οι οδηγιες σου ηταν περιφημες!
Και μ αρεσε που εβαλες μεσα και την περιπτωση με τις γωνιώδεις αγκυλες του .h που λεμε αναλογα
στον προεπεξεργαστη να κοιταξει στον τρέχοντα ή αλλον καταλογο για το αρχειο που θελουμε να γινει #include.

να μην βαζω συναρτησεις που να τυπωνουν πραγματα σε βιβλιοθηκες επειδη ο καθενας μπορει να θελει να
τυπωνει τις δικιες του????? :D
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 26 Ιαν 2012, 16:51

Star_Light έγραψε:
...
να μην βαζω συναρτησεις που να τυπωνουν πραγματα σε βιβλιοθηκες επειδη ο καθενας μπορει να θελει να
τυπωνει τις δικιες του????? :D

Ναι, έτσι συνηθίζεται (έτσι είναι και το σωστό). Δεν υπάρχει απολύτως κανένας λόγος να αναγκάζεις τον χρήστη της βιβλιοθήκης να βλέπει μηνύματα που δεν έχει ζητήσει ο ίδιος.

Αντίθετα, βάζοντας τις συναρτήσεις να σηματοδοτούν αστοχίες είτε με την τιμή επιστροφής τους, είτε με μια έξτρα παράμετρο (στην οποία θα περνάς ξεχωριστές πληροφορίες για κάθε ξεχωριστό σφάλμα που προκύπτει) είτε και τα 2 μαζί, δίνεις στον χρήστη της βιβλιοθήκης την ελευθερία να διαχειριστεί τα όποια σφάλματα προκύψουν σύμφωνα με τις ανάγκες του κάθε προτζεκ τους.

Αν θες ντε και καλά να τυπώνεις μηνύματα σφάλματος μέσα από τη βιβλιοθήκη, κάνε το μόνο αν κάποια σταθερά της βιβλιοθήκης σου πάρει την τιμή TRUE ή απλά οριστεί. Π.χ. μια σταθερά...
Κώδικας: Επιλογή όλων
#define VERBOSE

την οποία αν ο χρήστης την ορίσει με τιμή 1 τότε να τυπώνεις μηνύματα (αλλιώς όχι).

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 26 Ιαν 2012, 22:56

@migf1

ναι εχεις απολυτο δικιο. -.-

Δεν μπορεις να υποχρεωσεις τον αλλον να βλεπει μηνυματα που δεν εχει
ορισει ο ιδιος να βλεπει.
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό giannosfor » 27 Ιαν 2012, 05:04

migf1 έγραψε:Να κι ένα πολύ απλό παράδειγμα για σύνδεση σε μια mysql βάση και τύπωμα των πινάκων που περιέχει...

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

#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char *server = "localhost";
char *user = "root";
char *password = "";
char *database = "mysql";

conn = mysql_init(NULL);

/* Connect to database */
if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

/* send SQL query */
if (mysql_query(conn, "show tables")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

res = mysql_use_result(conn);
/* output table name */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s \n", row[0]);

/* close connection */
mysql_free_result(res);
mysql_close(conn);
}


Λίγο που το κοίταξα μου θυμίζει PHP.
1 Γνώσεις Linux: Καθόλου ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-58-generic 32bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.2.0-57-generic, Microsoft Windows XP Professional
3 Intel Core2 Duo CPU E4600 2.40GHz ‖ RAM 2012 MiB ‖ ASUS INC. P5Q - � P5Q
4 nVidia G94 [GeForce 9600 GT] [10de:0622] {nvidia}
5 eth0: Qualcomm Atheros AR8121/AR8113/AR8114 Gigabit or Fast Ethernet [1969:1026] (rev b0) ⋮ wlan0: 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Άβαταρ μέλους
giannosfor
punkTUX
punkTUX
 
Δημοσιεύσεις: 297
Εγγραφή: 24 Απρ 2011, 20:24
Τοποθεσία: Ηράκλειο
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 27 Ιαν 2012, 13:01

Ναι, βοηθάει και το ότι οι ονομασίες συναρτήσεων του mysql API θυμίζουν λίγο από PHP :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 28 Ιαν 2012, 01:29

Λοιπον υστερα απο συζητησεις και με τον φιλο μου τον migf1 αλλα και με προγραμματιστες απο ξενα δωματια συνομιλιων θα τσεκάρουμε λιγο το θεμα με τον buffer στην C! Εχω μπερδευτει λιγο η αληθεια ειναι επειδη νομιζα πως το προβλημα έγκειται σε συναρτησεις της C αλλα απο οτι φαινεται δεν ειναι ετσι τα πραγματα? ! δεν ξερω παρακατω παραθετω την συνομιλια μου και με ξενους προγραμματιστες και θα τα πουμε και εδω γιατι το θεμα ειναι παρα πολυ σημαντικο.





Οσοι πιστοι προσελθετε να το συζητησουμε! Η 2η εικονα ουσιαστικα ειναι η συνεχεια της 1ης.
Τελευταία επεξεργασία από ALdaperan και 28 Ιαν 2012, 19:17, έχει επεξεργασθεί 1 φορά/ες συνολικά
Αιτία: [ThumbnailPop] για τις εικόνες
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό migf1 » 28 Ιαν 2012, 11:18

Καλημέρα,

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

Re: Τα πάντα για την C/C++

Δημοσίευσηαπό Star_Light » 28 Ιαν 2012, 14:20

migf1 έγραψε:Καλημέρα,

ουσιαστικά σου είπαν αυτό που σας είχα πει κι εγώ παλιότερα: viewtopic.php?p=200385#p200385


Ε είσαι γάτος αγκύρας! :D

Και απο που θα διαβασω για το line buffering ? εχεις καμια καλη πηγη??? Οχι δυσνοητη
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

ΠροηγούμενηΕπόμενο

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