Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Επισκέπτης
Δημοσ. (επεξεργασμένο)
3 ώρες πριν, PC_MAGAS είπε

Η τελική μεταγλωτισμένη εφαρμογή θα έχει μεγάλο μέγεθος.

Στο θέμα της τελικής εφαρμογής έχω μια απορία... Όταν γράφω κώδικα χρησιμοποιώ κάποια εξωτερικά αρχεία .txt, όταν λοιπόν ολοκληρωθεί ο κώδικας, το τελικό εκτελέσιμο έχει ανάγκη από την ύπαρξη των αρχείων αυτών (δηλαδή των .txt), για να λειτουργήσει, ή είναι πλέον αυτόνομο πρόγραμμα.; ... Δοκίμασα να διαγράψω προσωρινά τα αρχεία αυτά και να κάνω εκτέλεση, φαίνεται να λειτουργεί κανονικά, αλλά θα ήθελα και μια γνώμη... 😀

 

3 ώρες πριν, PC_MAGAS είπε

Γι αυτό ποιο συνετό είναι να έχεις το κατάλληλο μέγεθος βιβλιοθηκών με τις ενέργειες που θες.

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

--Υπάρχει τρόπος να τυπώσω στην C ειδικά σύμβολα.; Πχ το ανάποδο Α = «για κάθε», τομή συνόλων κλπ.;

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

 

 

 

Καταγραφή.PNG

Επεξ/σία από Επισκέπτης
Δημοσ.

Φίλε @tony_dim_2018:

  1. Για εμφάνιση θες μια βιβλιοθήκη για GUI όπως Qt/Qml, Gtk κλπ κλπ
  2. Τα .txt αρχεία θα είναι αρχεία με αρχικά δεδομένα τα οποία το πρόγραμμα θα τα διαβάζει;
  3. Εάν τα αρχεία κειμένου είναι κώδικας τότε είναι αχρείαστα για την τελική εφαρμογή που θα διανεμηθεί.

Οι βιβλιοθήκες είναι μεταγλωττισμένος κώδικας άρα είναι αρχεία κειμένου με κατάληξη .c τα οποία τα μεταγλώττισε ο compiler. Μπορεί εφόσον μεταγλωττιστούν να συνδεθούν με το κατάλληλο πρόγραμμα/functionality (linker). Άρα μπορείς να τα μεταγλωττίσεις αυτούσια και μετά να τα συνδέσεις με την υπόλοιπη εφαρμογή, σε μεγαλύτερα project θες ένα εργαλείο όπως το make προκειμένου μέσω αρχείων να ορίζεις την διαδρομή των αλλεπάλληλων μεταγλωττίσεων που χρειάζεται, σε GNU/Linux το αναλαμβάνει το εργαλείο make έσω κάποιου κατάλληλου αρχείου ρυθμίσεων (που ονομάζετε Makefile).

Γενικά μια εφαρμογή που διανέμετε αποτελείτε από τα εξής αρχεία:

  • Αρχεία εκτελέσιμου κώδικα (δηλαδή ότι πάραξε ο compiler εφόσον πέρασε τα αρχεία κώδικα ένα χεράκι) εν ολίγοις εφαρμογή + μεταγλωττισμένες βιβλίοθήκες
  • Αρχεία ρυθμίσεων τα οποία μπορούν να δημιουργούνται κατά την πρώτη εκτέλεση.
  • Αρχεία εικόνων/ήχων κλπ κλπ (aka assets)

Τα οποία θα πρέπει να διανέμονται.

 

Ακόμη δε μπορείς να κάνεις το κομμάτι του GUI σε javascript html και μέσω electron και bindings να συνδέσεις την εφαρμογή σου με κώδικα C.

 

Επισκέπτης
Δημοσ.
1 ώρα πριν, PC_MAGAS είπε

Τα .txt αρχεία θα είναι αρχεία με αρχικά δεδομένα τα οποία το πρόγραμμα θα τα διαβάζει;

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

1 ώρα πριν, PC_MAGAS είπε

Οι βιβλιοθήκες είναι μεταγλωττισμένος κώδικας άρα είναι αρχεία κειμένου με κατάληξη .c τα οποία τα μεταγλώττισε ο compiler. Μπορεί εφόσον μεταγλωττιστούν να συνδεθούν με το κατάλληλο πρόγραμμα/functionality (linker). Άρα μπορείς να τα μεταγλωττίσεις αυτούσια και μετά να τα συνδέσεις με την υπόλοιπη εφαρμογή, σε μεγαλύτερα project θες ένα εργαλείο όπως το make προκειμένου μέσω αρχείων να ορίζεις την διαδρομή των αλλεπάλληλων μεταγλωττίσεων που χρειάζεται, σε GNU/Linux το αναλαμβάνει το εργαλείο make έσω κάποιου κατάλληλου αρχείου ρυθμίσεων (που ονομάζετε Makefile).

Δεν κατάφερα να μάθω την σύνδεση των αρχείων όπως προβλέπεται για την γλώσσα C, κι έτσι προς το παρόν χρησιμοποιώ τα αρχεία .txt που τα βρήκα σε μαθήματα για την C++ κι απλώς τα δοκίμασα και στην C. Μέσα σ' αυτά καταθέτω τακτοποιημένα (όχι χύμα), και σε ξεχωριστά αρχεία, μεταβλητές, σταθερές, συναρτήσεις, κείμενα και σχόλια που χρησιμοποιώ συχνά όπως «δώσε ένα αριθμό και enter», είτε «το αποτέλεσμα είναι %d, x», κλπ. Σε περίπτωση που θέλω να κάνω αλλαγές μέσα σ' αυτά τα αρχεία, δοκιμάζω πρώτα τον κώδικα σ' ένα πρόχειρο πρόγραμμα και αν λειτουργεί σωστά τον μεταφέρω στο .txt, ως συνάρτηση πλέον. Αποθηκεύω και ανοίγω τον κώδικα του προγράμματος για να κάνω compile. Αν όλα πάνε καλά σ' αυτή τη φάση, η συνέχεια είναι γνωστή. Και τέλος, έχω συνδέσει χειροκίνητα να το πω έτσι, όλα τα αρχεία σε ένα .txt, που είναι Πχ το 'Γενικό.txt' και περιέχει μόνο τα σχετικά include 'όνομα_αρχείου.txt', κι έτσι καλώ μόνο το 'Γενικό.txt' στα πρόγραμμα, με... ένα include. Από εδώ και κάτω δημιουργήθηκε η απορία της αρχικής μου ανάρτησης. Όλα αυτά βέβαια στα πλαίσια του χόμπι αυτής της περιόδου. Μια άλλη φορά ίσως πράξω διαφορετικά, έτσι για ν' αλλάξω παραστάσεις στην καθημερινότητα μου.

Τα υπόλοιπα θέματα που έδωσες, τ' αποθήκευσα και θα τα ψάξω εν καιρώ.

Σ' ευχαριστώ! 😀

Δημοσ. (επεξεργασμένο)
3 ώρες πριν, tony_dim_2018 είπε

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

Εννοώ αρχεία ρυθμίσεων όπως πχ. Το αρχείο /etc/apache2/sites-available/somesite.txt που ρυθμίζεις τα virtual hosts στον apache

 

3 ώρες πριν, tony_dim_2018 είπε

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

Εάν χρησιμοποιείς GNU/Linux η Unix-based σύστημα, ρίξε μια ματιά σε ένα project μου και το πως το σπάω σε βιβλιοθήκες: https://github.com/pc-magas/burmester-desmedt/blob/master/Makefile

Εάν δεις κάνω compile τις βιβλιοθήκες μου μέσω gcc με τις παραμέτρους -c η οποία παράγει ενδιάμεσο αρχείο αντί για εκτελέσιμο και -o για να ορίσεις το output αρχείο. Έτσι με αυτεςπαράγεις στατικές βιβλιοθήκες με κατάληξη .o . Μετά όλες αυτές τις παίρνω μαζί με τον κώδικα της εφαρμογής σαν να κάνω compile πολλαπλά αρχεία.

Περισσότερες πληροφορίες δες στο https://stackoverflow.com/a/2734727

Όσο αφορά τις βιβλιοθήκες υπάρχουν δυναμικές και στατικές, να πω την αλήθεια ξέρω ότι υπάρχουν διαφορές αλλά δεν εντρύφησα να τις μάθω λόγο ενασχόλησης με άλλες τεχνολογίες. Παρόλα αυτά οι δυναμικές βιβλιοθήκες που διανέμονται ανεξάρτητα είναι δυναμικές και στον gcc συνδέονται με το -l flag.

Επεξ/σία από PC_MAGAS
Επισκέπτης
Δημοσ.
22 λεπτά πριν, PC_MAGAS είπε

Εάν χρησιμοποιείς GNU/Linux η Unix-based σύστημα, ρίξε μια ματιά σε ένα project μου και το πως το σπάω σε βιβλιοθήκες

Το μόνο που μπορώ να πω, είναι ότι ο κώδικας μοιάζει με καλλιτεχνική δημιουργία, σαν πίνακας ζωγραφικής. Τα υπόλοιπα δεν τα γνωρίζω ακόμα...

Τα σημειώνω πάντως, και σ' ευχαριστώ!

 

Δημοσ.

Κοιτα, γενικα ειναι απλα πραματα, απλα εχει δυσκολο learn curve. Δεν βρισκω μια εξηγηση που ειχα κανει για declaration definition 😕

 

Τεσπα, φαντασου οτη η C δεν ειναι C αλλα C1 C2 C3.

Η c1 λεγεται preprocessor και δουλυει με οτι αρχιζει με #

πχ το #include <foo.h> κανει copy paste εκει που ειναι το #include το περιεχομενο του foo.h , αυτο τιποτα αλλο, δεν "βαζει" καποια βιβλιοθηκη οπως φανταζεσαι, απλα κανει copy paste.

 

Η c2 λεγεται compiler, αυτη παιρνει ολα τα αρχει c (αφου περασουν απο την c1) , και μετατρεπει το καθενα σε γλωσσα μηχανης. Προσεξε το καθε c αρχειο θα μετατραπει σε ξεχωριστο "αρχειο γλωσσας μηχανης". Αυτα τα αρχεια ονομαζονται objects ( *.obj, *.o ) ισως τα δεις να τα λενε και modules ή units

 

Η c3 λεγεται linker. Αυτη παιρνει ολα τα objects και τα ενωνει σε ενα executable.

 

 

Δημοσ.
Στις 14/3/2019 στις 11:43 ΜΜ, tony_dim_2018 είπε

Γιατί να γράφουμε συνέχεια include στην C όταν μπορούμε να έχουμε μόνο ένα;

 

Από την άλλη μεριά, είναι σωστό να έχουμε μόνο ένα;

 

Εσείς τι γνώμη έχετε;

 

Γειά και απο μένα

Δεν υπάρχει κανένα λόγος εφόσον χρειάζεται 1 header να κάνεις include 10 ή 50 ή 100 ή τα περίπου 300 που έχει η basic εγκατάσταση του mingw.

Εφόσον το κάνεις κάντο σωστά. Χρησιμοποίησε δηλαδή code guard, φαντάζομαι δεν χρησιμοποιείς ή κάνω λάθος?

Αν χρειαστείς static linking θα έχεις πρόβλημα μεγέθους.😉

Επισκέπτης
Δημοσ.
15 ώρες πριν, παπι είπε

Κοιτα, γενικα ειναι απλα πραματα

Σ' ευχαριστώ παπι

 

12 ώρες πριν, k33theod είπε

Γειά και απο μένα

Καλώς τον, υγεία και χαρά!

12 ώρες πριν, k33theod είπε

Δεν υπάρχει κανένα λόγος εφόσον χρειάζεται 1 header να κάνεις include 10 ή 50 ή 100 ή τα περίπου 300 που έχει η basic εγκατάσταση του mingw.

Ναι, έχεις δίκιο!

13 ώρες πριν, k33theod είπε

Εφόσον το κάνεις κάντο σωστά. Χρησιμοποίησε δηλαδή code guard, φαντάζομαι δεν χρησιμοποιείς ή κάνω λάθος?

Δεν ξέρω, τι είναι αυτό.;

Σ' ευχαριστώ k33theod

 

Υ.Γ.:

--Χαιρετισμούς στον 6χρονο μικρό συνάδελφο!  😀

--Υγεία να έχουμε, κι όλα τ' άλλα θα γίνουν....

 

Δημοσ.

Sorry η σωστή ονομασία είναι include guard.https://en.wikipedia.org/wiki/Include_guard

Όταν κάνεις include ένα header file o preprossesor παίρνει το περιεχόμενο του και το βάζει στο αρχείο πηγαίου κώδικα. Όταν δημιουργείς header files για να αποφύγεις διπλό incude του ίδιου αρχείου χρησιμοποιείς include guard. Δες πως είναι π.χ το stdio.h και κάπως έτσι είναι όλα τα headers στο φάκελλο include του compiler που χρησιμοποιείς

#ifndef _STDIO_H

#define _STDIO_H


/* All the headers include this file.
 */
#include <_mingw.h>


#define L_tmpnam (16)

#define _IOFBF		0x0000	/* full buffered */
#define _IOLBF		0x0040	/* line buffered */
#define _IONBF		0x0004	/* not buffered */

#define _IOMYBUF	0x0008	/* stdio malloc()'d buffer */
#define _IOEOF		0x0010	/* EOF reached on read */
#define _IOERR		0x0020	/* I/O error from system */
#define _IOSTRG 	0x0040	/* Strange or no file descriptor */
#ifdef _POSIX_SOURCE
# define _IOAPPEND	0x0200
#endif

/* The buffer size as used by setbuf such that it is equivalent to
 * (void) setvbuf(fileSetBuffer, caBuffer, _IOFBF, BUFSIZ).
 */
#define BUFSIZ		   512

/* Constants for nOrigin indicating the position relative to which fseek
 * sets the file position.  Defined unconditionally since ISO and POSIX
 * say they are defined here.
 */
#define SEEK_SET	     0
#define SEEK_CUR	     1
#define SEEK_END	     2

#endif	/* _STDIO_H */

To έχω ξελαφρώσει λίγο για να μην σε μπερδεύει. Αυτό που πρέπει να σου μείνει είναι το

#ifndef _STDIO_H

 
#define _STDIO_H
 bla bla

#endif	/* _STDIO_H */

έτσι και εσύ στο ola.h πρέπειε να βάλεις ένα ifndef define endif

Επισκέπτης
Δημοσ.
Στις 22/3/2019 στις 9:05 ΠΜ, Bspus είπε

Πχ εχεις εναν ακεραιο για ηλικια, αντι να τον πεις age τον λες var_int_age

Αυτός ο τρόπος ονοματοδοσίας μ' αρέσει πολύ! Όχι όμως για τις μεταβλητές, αλλά για την τακτοποίηση ενός συνόλου αρχείων μέσα στο φάκελο εργασίας... 😀

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...