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

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

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

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

Δημοσίευσηαπό migf1 » 19 Ιουν 2012, 12:34

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

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

Δημοσίευσηαπό stamatiou » 21 Ιουν 2012, 21:00

Οκ, τελικά δενείναι και τόσο δύσκολη. :D
Τώρα όμως στο K&R έχει κάτι που βλέπω για πρώτη φορά. Δηλώνει το πρώτυπο μιας συνάρτησης μέσα στη main! Γιατί να το κάνει αυτό;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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

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

Δημοσίευσηαπό stamatiou » 24 Ιουν 2012, 13:38

Π.χ. στην qsort: http://ideone.com/Jxc9B
Επίσης είναι πολύ διαφορετική από όσες έχω δει στο internet :/ Π.χ. εδώ http://rosettacode.org/wiki/Sorting_algorithms/Quicksort#C μοιάζει πολύ πιο απλή και δεν έχει ούτε καν swap. Στου K&R στις γραμμές 8 και 16 τι τις θέλει τις swap(v, left, (left + right) / 2) και swap(v, left, last);
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Βασικά υπάρχουν πολλές υλοποιήσεις για quick-sort. Τα 2 links που δίνεις κάνουν σχεδόν ίδια υλοποίηση, με βασικότερη διαφορά πως στο 1ο λινκ το swapping είναι ξεχωριστή συνάρτηση, ενώ στο 2ο λινκ το κάνει απευθείας ...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
int t = *l;
*l++ = *r;
*r-- = t;

...


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

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

Δημοσίευσηαπό stamatiou » 24 Ιουν 2012, 16:15

migf1 έγραψε:Βασικά υπάρχουν πολλές υλοποιήσεις για quick-sort. Τα 2 links που δίνεις κάνουν σχεδόν ίδια υλοποίηση, με βασικότερη διαφορά πως στο 1ο λινκ το swapping είναι ξεχωριστή συνάρτηση, ενώ στο 2ο λινκ το κάνει απευθείας ...

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
int t = *l;
*l++ = *r;
*r-- = t;

...


EDIT: Όσο για το πρότυπο, εφόσον δεν σκοπεύει να χρησιμοποιήσει την swap() πουθενά αλλού, την δηλώνει μέσα στην qsort()

Τώρα που το ξανακοίταξα πιστέυω το κατάλβα.
Τώρα όμως, αφού δεν επιτρέπεται να κάνουμε pointer arithmetic με arrays (πχ. απαγορεύται αυτό int array[10]; array++), τότε εδώ πέρα τι κάνει αυτός με array με δείκτες;
http://ideone.com/gY1SX
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό g1wrg0s » 24 Ιουν 2012, 17:12

To char *argv[] ειναι το ιδιο με το char **argv;
Γνωριζω οτι περιπου το ιδιο αναπαριστουν αλλα εαν δεν ειναι ΑΚΡΙΒΩΣ το ιδιο για τη γλωσσα και τους κανονες της τοτε ο stamatiou εχει μια απορια που τωρα εχω κι εγω, μιας και σε ενα ονομα στατικου πινακα ο τελεστης ++ απαγορευεται.
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιουν 2012, 17:20

g1wrg0s έγραψε:To char *argv[] ειναι το ιδιο με το char **argv;
Γνωριζω οτι περιπου το ιδιο αναπαριστουν αλλα εαν δεν ειναι ΑΚΡΙΒΩΣ το ιδιο για τη γλωσσα και τους κανονες της τοτε ο stamatiou εχει μια απορια που τωρα εχω κι εγω, μιας και σε ενα ονομα στατικου πινακα ο τελεστης ++ απαγορευεται.

Απ' ότι έχω καταλάβει, το *argv[] είναι πίνακας που για elements έχει poitners, άρα για κάθε στήλη του πίνακα (το δεύτερο []) πρέπει να γίνεται χειροκίνητα allocation, ενώ ο διπλός πίνακας (argv[][]) το δεύτερο [] έχει fixed μέγεθος. Αλλά σύμφωνα με τους κανόνες, αν περνούσαμε το argv ως διπλό πίνακα δεν θα έπρεπε να προσδιορίσουμε το δεύτερο [];
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 24 Ιουν 2012, 19:11

g1wrg0s έγραψε:μιας και σε ενα ονομα στατικου πινακα ο τελεστης ++ απαγορευεται.

Τσέκαρε αυτό: http://www.seebs.net/c/knr.html
Τελικά μάλλον υπάρχει εξαίρεση για το argv;
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

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

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

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