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

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

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

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

Δημοσίευσηαπό Ilias95 » 03 Φεβ 2012, 21:34

migf1 έγραψε:Ηλία, η Python ως interpreted γλώσσα λειτουργεί εξ' ορισμού μέσα σε ελεγχόμενο περιβάλλον: τον interpreter της (η Java στο virtual machine της, κλπ). Η C λειτουργεί απευθείας πάνω στο λειτουργικό της πλατφόρμας, οπότε είναι ελάχιστα (έως μηδενικά) αυτά που μπορείς να θεωρήσεις αυτονόητα... εκτός αν την τρέχεις σε κάποιο πιο high-level περιβάλλον, όπως είναι για παράδειγμα οι C interpreters που κυκλοφορούν.

Οπότε να ένας ακόμα πολύ καλός λόγος να χρησιμοποιείς interpreted γλώσσες όπου δεν χρειάζεται η αποδοτικότητα των compiled. :D

Και ακόμα μια απορία που γεννάτε απ' το παραπάνω. Αφού δεν μπορείς να θεωρήσεις τίποτα αυτονόητο, ελέγχεις τα πάντα; Και όταν το αποτέλεσμα δεν είναι το επιθυμητό τι ακριβώς κάνεις; Τερματίζεις το πρόγραμμα;
Τελευταία επεξεργασία από Ilias95 και 03 Φεβ 2012, 21:41, έχει επεξεργασθεί 1 φορά/ες συνολικά
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:36

Μια που είπα για C interpreters, τον Ch τον ξέρει κανείς; http://drdobbs.com/cpp/184402054 :)

Είναι αυτό που έγραφα σε παλαιότερα ποστς πως οι high-level γλώσσες είναι σε πολύ μεγάλο βαθμό συγκρίσιμες με τη χρήση C + βιβλιοθήκες ;) Το συγκεκριμένο βέβαια προσθέτει και run-time περιβάλλον, οπότε γίνεται τελείως συγκρίσιμο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:40

Ilias95 έγραψε:
Οπότε να ένας ακόμα πολύ καλός λόγο να χρησιμοποιείς interpreted γλώσσες όπου δεν χρειάζεται η αποδοτικότητα των compiled. :D

Όπως και το αντίθετο για να ΜΗΝ τις χρησιμοποιείς :P

Όπως έχουμε πει πολλές φορές, καμία γλώσσα δεν είναι καλή παντού ;)

έγραψε:
Και ακόμα μια απορία που γεννάτε απ' το παραπάνω. Αφού δεν μπορείς να θεωρήσεις τίποτα αυτονόητο, ελέγχεις τα πάντα; Και όταν το αποτέλεσμα δεν είναι το επιθυμητό τι ακριβώς κάνεις; Τερματίζεις το πρόγραμμα;

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

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

Δημοσίευσηαπό Ilias95 » 03 Φεβ 2012, 21:46

migf1 έγραψε:
Ilias95 έγραψε: Και ακόμα μια απορία που γεννάτε απ' το παραπάνω. Αφού δεν μπορείς να θεωρήσεις τίποτα αυτονόητο, ελέγχεις τα πάντα; Και όταν το αποτέλεσμα δεν είναι το επιθυμητό τι ακριβώς κάνεις; Τερματίζεις το πρόγραμμα;

Έχεις την απόλυτη ελευθερία να κάνεις ότι θέλεις... είναι καθαρά στο χέρι σου... η ουσία είναι πως σου παρέχεται η δυνατότητα (να λοιπόν ένας ακόμα πάρα πολύ καλός λόγος να χρησιμοποιείς compiled γλώσσες, όταν θέλεις να έχεις τον απόλυτο έλεγχο :lol:)

Δεν μπορώ να πω ότι μου φαίνεται και τόσο μεγάλο πλεονέκτημα να έχεις τέτοια αβεβαιότητα. :P
Όπως και να 'χει ευχαριστώ για τις πληροφορίες! :)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 21:57

Ilias95 έγραψε:Δεν μπορώ να πω ότι μου φαίνεται και τόσο μεγάλο πλεονέκτημα να έχεις τέτοια αβεβαιότητα. :P
Όπως και να 'χει ευχαριστώ για τις πληροφορίες! :)

Το ένα είναι μεγάλο πλεονέκτημα όταν χρειάζεσαι απόλυτο έλεγχο & ταχύτητα, το άλλο είναι μεγάλο πλεονέκτημα όταν χρειάζεσαι να βγάλεις μεγάλο όγκο δουλειάς σε μικρό χρονικό διάστημα.

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

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

Δημοσίευσηαπό migf1 » 03 Φεβ 2012, 22:15

migf1 έγραψε:
Αν βρω χρόνο θα ποστάρω αργότερα κώδικα με ένα τυπικό interface για απλή διαχείριση δομών ArrInt ;)

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

Βασικά έφτιαξα συναρτήσεις μονάχα για: αρχικοποίηση, αλλαγή μεγέθους, γέμισμα με τυχαίες τιμές (για να μην τις περνάω με το χέρι :lol:), εναλλαγή (swap), τύπωμα περιεχομένων (πλήθος στοιχείων και τιμές στοιχείων) και καθαρισμό (cleanup). Η main() είναι ουσιαστικά δείγμα χρήσης του μίνι αυτού interface.

Βαριέμαι τώρα να το ανεβάσω στο ideone, οπότε το βάζω εδώ (ελπίζω να μη χαλάσει πολύ τα tabs). Αποτελεί πολύ καλό αντικείμενο μελέτης για όποιον ενδιαφέρεται, μιας και δεν χρησιμοποιεί τίποτα ιδιαίτερα προχωρημένο. Ενδιαφέρον έχει κι ο κώδικας της arrint_printf() που δείχνει πως φτιάχνονται συναρτήσεις εκτύπωσης αγνώστου πλήθους παραμέτρων :)

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>

typedef enum { FALSE=0, TRUE } Bool;
typedef unsigned int uint;

typedef struct ArrInt {
uint len;
int *data;
} ArrInt;

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

/* -------------------------------------------------------
* Initialize ArrInt data for len elements.
* -------------------------------------------------------
*/
Bool arrint_init( ArrInt *arrint, const uint len )
{
if ( !arrint )
return FALSE;

if ( NULL == (arrint->data = calloc(len, sizeof(int))) )
return FALSE;

arrint->len = len;
return TRUE;
}

/* -------------------------------------------------------
* Resize ArrInt data to newlen elements.
* cleanextra decides whether extra-elements will be 0'ed or left with garbage values.
* -------------------------------------------------------
*/
Bool arrint_resize( ArrInt *arrint, const uint newlen, const Bool cleanextra )
{
int *try = NULL;

if ( !arrint || newlen < 1 )
return FALSE;

if ( arrint->len == newlen)
return TRUE;

if ( NULL == (try = realloc(arrint->data, newlen * sizeof(int))) )
return FALSE;

if ( newlen > arrint->len && cleanextra )
memset( &try[ arrint->len ],
0,
(newlen - arrint->len) * sizeof(int)
);

arrint->len = newlen;
arrint->data = try;

return TRUE;
}

/* -------------------------------------------------------
* Fill ArrInt data with random values.
* -------------------------------------------------------
*/
Bool arrint_fill_randomly( ArrInt *arrint )
{
uint i = 0;

if ( !arrint )
return FALSE;

for (i=0; i < arrint->len; i++ )
arrint->data[i] = (rand() % arrint->len) * 10;

return TRUE;
}

/* -------------------------------------------------------
* Swap two ArrInt structures
* -------------------------------------------------------
*/
Bool arrint_swap( ArrInt *arrint1, ArrInt *arrint2 )
{
ArrInt temp;
size_t size = sizeof(ArrInt);

if ( !arrint1 || !arrint2 )
return FALSE;

memcpy( &temp, arrint1, size );
memcpy( arrint1, arrint2, size );
memcpy( arrint2, &temp, size );

return TRUE;
}

/* -------------------------------------------------------
* Print contents of an ArrInt structure.
* -------------------------------------------------------
*/
void arrint_printf( const ArrInt *arrint, const char *fmttext, ... )
{
uint i = 0;

if ( !arrint || arrint->len < 1 )
return;

if ( fmttext ) {
va_list args;

va_start( args, fmttext );
vprintf( fmttext, args );
va_end( args );
}

for (i=0; i < arrint->len; i++)
printf( "%d ", arrint->data[i] );
putchar('\n');

return;
}

/* -------------------------------------------------------
* Cleanup an ArrInt structure.
* -------------------------------------------------------
*/
void arrint_cleanup( ArrInt *arrint )
{
if ( !arrint )
return;

if ( arrint->data ) {
free( arrint->data );
arrint->data = NULL;
}
arrint->len = 0;
return;
}

/* -------------------------------------------------------
*
* -------------------------------------------------------
*/
int main( void )
{
ArrInt arr1, arr2; /* two ArrInt structures */

srand( time(NULL) );

/* init arr1 for 10 elems & arr2 for 15 elems */
if ( !arrint_init( &arr1, 10 ) )
goto exit_failure;
if ( !arrint_init( &arr2, 15 ) )
goto exit_failure;

/* fill randomly arr1 & arr2 */
puts( "\nBEFORE ----------------------" );
arrint_fill_randomly( &arr1 );
arrint_fill_randomly( &arr2 );

/* print arr1 & arr2 elements */
arrint_printf( &arr1, "\narr1 (%d elems):\n", arr1.len );
arrint_printf( &arr2, "\narr2 (%d elems):\n", arr2.len );

arrint_swap( &arr1, &arr2 );

puts( "\nAFTER -----------------------" );
arrint_printf( &arr1, "\narr1 (%d elems):\n", arr1.len );
arrint_printf( &arr2, "\narr2 (%d elems):\n", arr2.len );

/* resize arr1 form 15 elems (after the swapping) to 20 elems */
if ( arrint_resize( &arr1, 20, TRUE ) )
arrint_printf( &arr1, "\nRESIZED arr1 (%d elems):\n", arr1.len );

/* cleanup & exit */
arrint_cleanup( &arr1 );
arrint_cleanup( &arr2 );

pressENTER();
exit( EXIT_SUCCESS );

exit_failure:

arrint_cleanup( &arr1 );
arrint_cleanup( &arr2 );

pressENTER();
exit( EXIT_FAILURE );
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 03 Φεβ 2012, 22:28

migf1 έγραψε:@starlight: δυστυχώς δεν μπορώ να παρακολουθήσω τις απορίες σου, κυρίως διότι επαναλαμβάνονται συνεχώς πάνω στα ίδια πράγματα, όσες φορές κι αν στα εξηγήσω (που το έχω κάνει ήδη περίπου... 200 φορές την κάθεμια :lol:).

O πίνακας είναι δείκτης, άρα το &πίνακας είναι δείκτης σε δείκτη.


Σε εναν κωδικα που εχω παραθεσει καλω μια συναρτηση που δουλευει σε διπλο δεικτη **p μονο με το p σαν ορισμα και οχι με το &p .
Εσυ εχεις πει πως θα πρεπει να ξερεις σε ποια θεση δειχνει ο δεικτης επειδη τον μετακινεις μεσα στην συναρτηση.... αυτο τι σημαινει δηλαδη?
Τι ακριβως μου εξηγησες 500 φορες δηλαδη σε αυτο ? :S Το καλοκαιρι θυμαμαι ειχες θεση γενικη οδηγια πως οταν οριζουμε μια συναρτηση με διπλους ** μεσα της θα παίζουμε με μονα * και θα την καλουμε με &. Αυτο ειχες πει. Οχι τιποτα αλλο μην με περασουν και για ηλιθιο οσοι διαβαζουν περα απο την πλακα που κανω και εδω μεσα και εχω πει πως δεν παρεξηγιεμαι. Πριν λιγο ειδα και ο ιδιος πως ο δεικτης δεν αλλαζει διευθυνση ακομη και αν τον μετακινεις....πχ εδω

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


int array[4]={1,2,3,-1};

p3=array;
while(*p3!=-1)
{
printf(" *p3=%d , p3=%p",*p3 , &p3);
printf(" p3= %p " , p3 );
p3++;
}


Μονο το p3 αλλαζει εδω.... και οχι το &p3 επομενως τι ακριβως εννοεις οταν λες οτι περναω την διευθυνση του δεικτη μεσα στη συναρτηση ωστε να ξερω που εχει μετακινηθει? αφου η διευθυνση αυτη μενει σταθερη.
Γνώσεις ⇛ 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++

Δημοσίευσηαπό Star_Light » 03 Φεβ 2012, 22:32

Περα απο αυτη την οδηγια δεν ειχες πει τιποτε αλλο. Και αυτη την οδηγια δεν μπορω να την παρω ετοιμη αν δεν ξερω τι ακριβως κανει πλεον.
Τωρα αν κουραζουν οι αποριες μου νταξει... κανενα προβλημα.
Γνώσεις ⇛ 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 » 03 Φεβ 2012, 22:45

Το πρόβλημα Κώστα είναι πως τα έχεις όλα μπερδεμένα στο μυαλό σου... τους κώδικες για τους οποίους εκφράζεις απορίες, τους δοκιμάζεις να δεις τι κάνουν ; Τους βάζεις στον gdb να παρακολουθήσεις τι τιμές παίρνουν οι μεταβλητές για τις οποίες ρωτάς (ή έστω να βάλεις δικά σου printf() )... για κάθε απορία που εκφράζεις κοιτάζεις πρώτα στις διαθέσιμες πηγές σου μήπως την εξηγεί εκεί;

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

Ο κώδικας χωρίς strict flags στο compilation, όχι μόνο γίνεται compile αλλά κάνει κιόλας αυτό που πρέπει να κάνει... εναλλάσσει δηλαδή τους 2 πίνακες. Άρα εξ΄ορισμού δουλεύει!

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

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

Δημοσίευσηαπό Star_Light » 03 Φεβ 2012, 23:21

Η αληθεια ειναι πως πρωτα τον εκανα compile στο μυαλο μου :D
δεν τον εβαλα σε μεταγλωτιστη οχι.

Anyway δεν εχεις αδικο σε αυτα που λες αλλα μιας και ειχαμε/ εχουμε φτιαξει μια καλη ομαδα εδω
εμπαινα να τα συζητησω με μεγαλυτερη συχνοτητα και αυθορμητισμο. Σε αλλα φορουμ που βλεπω
πως σου απαντανε απλα σε κατι και ή το καταλαβες ή οχι προφανως και δεν καθομαι να κανω τέτοιες ιστοριες.

Παντως για 4-5 μηνες ενασχολησης με την γλωσσα απο εκει που δεν ειχα την παραμικρη ιδεα το επιπεδο μου με ικανοποιει. Ειναι μια απαιτητικη γλωσσα
που δεν μαθαινεται ευκολα . Και πιστευω στο μελλον με καταλληλη υπομονη αν συνεχισω θα γινω παρα πολυ καλος. Αλλα αρκετα τρολάρισα
το θρεντ με τα δικα μου :D :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
Εκτύπωση

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

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