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

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

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

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

Δημοσίευσηαπό migf1 » 01 Απρ 2012, 14:19

Δύσκολα μου βάζεις.

Πολλά & διάφορα μπορείς να φτιάξεις και με αυτά που έχεις διαβάσει μέχρι τώρα (αν και πιθανότατα δεν θα είναι efficient). Διάβασε καλύτερα και το 16ο κεφάλαιο, και μετά θεωρητικά θα είσαι σε θέση να φτιάξεις σχεδόν οτιδήποτε θελήσεις!

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

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

Δημοσίευσηαπό Ilias95 » 01 Απρ 2012, 14:21

Όχι, στο 17ο μιλάει για δυναμική διαχείριση.
Οκ, οπότε προχωράω κανονικά.

migf1 έγραψε:ΥΓ2. Για αρχεία έχει μιλήσει ή όχι ακόμα;

Τι εννοείς;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Απρ 2012, 14:27

Ilias95 έγραψε:
...
Τι εννοείς;

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

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

Δημοσίευσηαπό Ilias95 » 01 Απρ 2012, 14:32

migf1 έγραψε:
Ilias95 έγραψε:
...
Τι εννοείς;

Πως να διαχειρίζεσαι αρχεία (άνοιγμα, κλείσιμο, διάσχιση, δημιουργία, text/binary, κλπ)

Όχι, στο κεφάλαιο 22 είναι (από το 20 και μετά αναφέρεται στην std library).

Αλλά από κάποια στιγμή και μετά δεν θα τα πάω με τη σειρά.
Σκοπεύω να δω τα 16-19, 21, 22.1, 22.2, 24 και μετά θα ξεκινήσω κάποιο project.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Απρ 2012, 14:38

Να σου πω μια άσκηση που σκέφτηκα που μπορείς να την κάνεις και τώρα, άμα διαβάσεις απευθείας για τα αρχεία;
Έναν κλώνο του unix/linux tool wc

:)

ΥΓ. Είναι εύκολα τα αρχεία, τις μισές συναρτήσεις τις έχεις ήδη χρησιμοποιήσει για είσοδο/έξοδο (έτσι κι αλλιώς τα stdin & stdout αρχεία τα θεωρεί ή C, κι απλώς διαθέτει παραλλαγές των κανονικών συναρτήσεων για αρχεία... fprintf, fscanf, fputc, κλπ, κλπ)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 01 Απρ 2012, 15:17

Okay, let's give it a try. :)
Φαντάζομαι πρέπει να λειτουργεί κανονικά με τα command line arguments ε;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Απρ 2012, 15:19

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

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

Δημοσίευσηαπό Ilias95 » 01 Απρ 2012, 16:24

έγραψε: -c, --bytes
print the byte counts

Για να υπολογίσω τα bytes που περιέχει το αρχείο, είναι σωστό το παρακάτω;
Κώδικας: Επιλογή όλων
num_chars * sizeof(char) \\ όπου num_chars ο αριθμός των χαρακτήρων στο αρχείο
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 01 Απρ 2012, 17:28

Επίσης κάτι άλλο.
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MYFILE "/home/ilias/afile.txt"

bool open_file(FILE *fp, char filename[])
{
return ((fp = fopen(filename, "r")) == NULL) ? false : true;
}

int main(void)
{
FILE *file;

if (! open_file(file, MYFILE)) {
printf("%s can't be opened\n", MYFILE);
exit(EXIT_FAILURE);
}

fclose(file);

exit(EXIT_SUCCESS);
}

Το παραπάνω θα δώσει seg fault.
Αυτό συμβαίνει γιατί αν και η open_file() δουλεύει σωστά και επιστρέφει αν το αρχείο ανοίγει κανονικά ή όχι, τελικά ο pointer file στην main δεν δείχνει στο αρχείο που άνοιξε η fopen().
Πως μπορώ να διορθώσω το παραπάνω;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Απρ 2012, 17:59

Ilias95 έγραψε:
έγραψε: -c, --bytes
print the byte counts

Για να υπολογίσω τα bytes που περιέχει το αρχείο, είναι σωστό το παρακάτω;
Κώδικας: Επιλογή όλων
num_chars * sizeof(char) \\ όπου num_chars ο αριθμός των χαρακτήρων στο αρχείο

Ναι, σωστό είναι :)

Ilias95 έγραψε:Επίσης κάτι άλλο.
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MYFILE "/home/ilias/afile.txt"

bool open_file(FILE *fp, char filename[])
{
return ((fp = fopen(filename, "r")) == NULL) ? false : true;
}

int main(void)
{
FILE *file;

if (! open_file(file, MYFILE)) {
printf("%s can't be opened\n", MYFILE);
exit(EXIT_FAILURE);
}

fclose(file);

exit(EXIT_SUCCESS);
}

Το παραπάνω θα δώσει seg fault.
Αυτό συμβαίνει γιατί αν και η open_file() δουλεύει σωστά και επιστρέφει αν το αρχείο ανοίγει κανονικά ή όχι, τελικά ο pointer file στην main δεν δείχνει στο αρχείο που άνοιξε η fopen().
Πως μπορώ να διορθώσω το παραπάνω;

Για αρχή πρέπει να κάνεις συνήθεια να αρχικοποιείς σε NULL όλους τους δείκτες που δεν χρησιμοποιείς άμεσα (στο συγκεκριμένο παράδειγμα τον file).

Το βασικό πρόβλημα είναι αλλού όμως, είναι πως ο δείκτης file περνιέται by-value στην open_file() με αποτέλεσμα στη συνέχεια, στο fclose(file) να μην περιέχει την τιμή που του ανατέθηκε μέσα στην open_file().

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

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

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