-
ΜΗΝΥΜΑΤΑ FORUM
54 -
ΜΕΛΟΣ
-
ΤΕΛ. ΕΠΙΣΚΕΨΗ
Πληροφορίες προφίλ
-
Φύλο
Δεν το μαρτυρώ
Πρόσφατες Επισκέψεις
523 προβολές προφίλ
_Gikoskos_'s Achievements
-
Τι είδους εφαρμογή θες να φτιάξεις; Αν πρόκειται για single page app που πχ μπορεί να έχει κομμάτια μέσα στην σελίδα τα οποία ανανεώνονται δυναμικά (websockets, fetch, components κτλ), μπορεί να βοηθηθείς από την επίδοση της react. Προσωπικά έχω βρει πως η react βοηθάει πάρα πολύ στον γρήγορο σχεδιασμό δυναμικών site που έχουν αρκετό όγκο περιεχομένου (πχ news site). Σε πιο απλά site όμως (πχ προσωπικό blog), ακόμα και δυναμικά να είναι, μπορεί να φας χτύπημα απο το overhead της βιβλιοθήκης.
-
Υλοποίηση δυαδικού σηματοφόρου μόνο με mutex, αναγκαστικά θα είναι με ενεργή αναμονή. Θα χρησιμοποιηθεί μόνο ένα mutex για τον αμοιβαίο αποκλεισμό του μετρητή. Άρα εδώ φαίνεται ότι έχεις λάθος στην υλοποίηση. Δεν χρειάζεσαι ούτε 2 mutex ούτε trylock. Χονδρικά ο ψευδοκώδικας για τα up/down πρέπει να είναι έτσι: struct binsem { int cnt; mutex mtx; }; down(binsem *bsem){ while (1) { lock(bsem->mtx); if (bsem->cnt > 0) { bsem->cnt--; unlock(bsem->mtx); break; } unlock(bsem->mtx); } } up(binsem *bsem){ lock(bsem->mtx); if (bsem->cnt <= 0) { bsem->cnt++; } unlock(bsem->mtx); }
-
Πρόβλημα με χρήση πόρων σε πρόγραμμα σε winapi με το gcc
_Gikoskos_ απάντησε σε θέμα του cvb~ στο Προγραμματισμός
Κοιταξα λιγο το τουτοριαλ να δω τι εστι αλλα και αυτος το ιδιο λεει εδω Περα απο αυτο το resource script σου δεν γινεται compile πουθενα. Να ξυσει τις μασχαλες του ο λινκερ για να το βρει; Τρεξε κατι τετοιο windres resource.rc resource.o gcc menu_one.c resource.o -o menu_one.exe -mwindows αλλα βλεπεις πως αν τα resources γινουν αρκετα, λογω πολυπλοκοτητας δεν συμφερει να το κανεις χειροκινητα. Καλυτερα Makefile απο τωρα (αφου χρησιμοποιεις GCC toolchain) για να το συνηθισεις. Εξαλλου και το βιζουαλ στουδιο εχει δικα του Makefiles βασισμενα στο GNU Μake, απλα ειναι πιο περιορισμενα σε λειτουργικοτητα. στο γιτχαμπ εχω αρκετα winAPI προτζεκτς που εχω στησει με αυτο το toolchain -
Πρόβλημα με χρήση πόρων σε πρόγραμμα σε winapi με το gcc
_Gikoskos_ απάντησε σε θέμα του cvb~ στο Προγραμματισμός
Δεν εχω χρησιμοποιησει tdm-gcc αλλα για να κανεις compile resource αρχεια (.rc) πρεπει να ειναι παρον ενας resource compiler. Στο mingw-w64 που εχω χρησιμοποιησει πχ υπαρχει το windres (το visual studio αντιστοιχα εχει το RC). Οταν περασεις το .rc απο το windres και σου παραγει ενα αντικειμενικο αρχειο (.ο), το κανεις διασυνδεση με τον υπολοιπο σου κωδικα C/C++ κανονικα με τον gcc. Με αλλα λογια δειξε το Makefile/τις εντολες που χρησιμοποιεις για να κανεις compile το προγραμμα, για να δω τι παιζει wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON)); κατι ακυρο αλλα τα GetModuleHandle(NULL) calls μεσα στην main() ειναι περιττα γτ σου επιστρεφουν στην ουσια το hInstance που το εχεις ηδη ορισμενο wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON)); -
Απ'οτι φαινεται γινεται https://github.com/kristian/system-hook αλλα απαιτει γνωσεις JNI που σημαινει πως παλι πρεπει να γραψεις low-level κωδικα για καθε διαφορετικο λειτουργικο (δηλαδη ο keylogger θα ειναι γραμμενος σε C ή C++) και φανταζομαι πως ετσι χανεται και το κυριο feature της Java που ειναι να εκτελειται σε καθε λειτουργικο συστημα (δεδομενου οτι εχεις εγκατεστημενο το JVM). Σε C/C++ ειναι ευκολο να γραψεις keylogger για Windows, καθως το WinAPI παρεχει ενσωματωμενη ηδη τετοια λειτουργια που σου δινει τη δυνατοτητα να εχεις λειτουργικο keylogger με λιγες γραμμες κωδικα με lowlevel keyboard hook. Σε linux υποθετω πως μπορεις να σκαρφιστεις κατι μεσω του X server/client, αλλα δεν ειμαι σιγουρος για το ποσο λειτουργικο ή ευκολο ειναι να υλοποιησεις ολοκληρωμενο keylogger.
-
Είναι κάπως επικίνδυνο να συγκρίνεις δείκτες και πίνακες. Σε πολλές περιπτώσεις ο πίνακας θυμίζει δείκτη (array indexing), και σε κάποιες μετατρέπεται σε δείκτη (όταν περνάει σαν παράμετρος πχ) αλλά είναι διαφορετικοί τύποι δεδομένων, και σημαίνουν διαφορετικά πράματα. Ο δείκτης περιέχει την τιμή μιας θέσης μνήμης, και ο πίνακας είναι απλά μία σειρά από αντικείμενα (στην C ο όρος αντικείμενο δεν έχει την ίδια σημασία με μία OOP γλώσσα). Στην περίπτωσή σου, αν γράψεις κάτι τέτοιο για παράδειγμα: int (*p)[5]; int **z; ..... z = p; ή p = z; δεν θα δουλέψει, γιατί το **z και το (*p)[5] είναι διαφορετικοί τύποι δεδομένων. Όπως επίσης και το "int array[5];" μαζί με το "int *ptr;" είναι διαφορετικοί τύποι δεδομένων. Στο c-faq έχει ολόκληρη κατηγορία μόνο για αυτές τις "παρεξηγήσεις" μεταξύ πινάκων και δεικτών http://c-faq.com/.xx/aryptr/ αξίζει να το ρίξετε μια ματιά.
-
Απενεργοποίηση UAC για συγκεκριμένο πρόγραμμα
_Gikoskos_ απάντησε σε θέμα του Skydiver80 στο Προγραμματισμός
Αν θες να προσπερασεις τον ελεγχο του UAC για το προγραμμα σου, υπαρχει λυση προγραμματιστικα γιατι οι περισσοτερες εκδοσεις των Windows εχουν ενα πολυ γνωστο backdoor πανω σε αυτο το πραμα. Δες εδω περισσοτερες λεπτομερειες https://github.com/hfiref0x/UACME. Υπαρχουν και εργαλεια που χρησιμοποιουν κωδικα απο το παραπανω, για να σε βοηθησουν να επιλεξεις συγκεκριμενες εφαρμογες στις οποιες θελεις να μην δουλευει το UAC, αλλα δεν μπορεσα να βρω κανενα open-source. Γνωμη μου ειναι, αν δεν βρεις κατι που να ειναι open-source, να μην δοκιμασεις να τρεξεις αλλα εργαλεια που υποστηριζουν οτι κανουν αυτο το πραμα. Περα απ'αυτο, ο πιο στανταρ τροπος για να κανεις το προγραμμα να τρεχει στο startup ειναι να βαλεις entry του path του εκτελεσιμου σου, στο κλειδι "Software\Microsoft\Windows\CurrentVersion\Run" στην registry, για τον συγκεκριμενο χρηστη. Αυτο μπορεις να το κανεις ειτε χειροκινητα, ειτε προγραμματιστικα. Αν το κανεις προγραμματιστικα, δες εδω που εχω γραψει ενα μικρο function γι'αυτο ακριβως το πραμα. -
Dr. Memory υποχρεωτικό αν προγραμματίζεις C/C++ σε Windows (υπαρχει και για linux, αλλα εκει ειναι καλυτερο συνδυασμός valgrind + strace κατα την γνωμη μου). Κανει memory checking, και αν εχεις κανει compile με debugging συμβολα παιρνεις και γραμμες κωδικα στις οποιες εντοπιστηκε το σφαλμα. Text mode interface for Git ενα πολυ χρησιμο front-end για το Git στην γραμμη εντολων (χρησιμοποιει ncurses). Ενας ενδιαφερον οδηγος στα C++ templates Γρήγορος αλγοριθμος hashing (μη κρυπτογραφικος) με πολυ καλο ευρος (τον εχω δοκιμασει εκτενως), σε περιπτωση που θελετε να κανετε δικα σας hashtables καπου libuv Ασύγχρονο Ι/Ο με πολλα καλουδια Ενα τελευταιο απο τα αγαπημενα μου, το οποιο μπορει να μην ειναι και τοσο χρησιμο πλεον, αλλα εχει ιστορικη σημασια: Unix history repo Συντηρείται απο τον καθηγητη Διομήδη Σπινέλλη, ο οποιος εχει και αλλα ενδιαφεροντα προτζεκτς στο github του, αν θελει κανεις να κοιταξει.
-
Ωραίο αλλα δεν εχει τη δικη μου βιβλιοθηκη :'(
-
Εχεις απολυτο δικιο, με συγχωρεις, το εγραψα πολυ βιαστικα γτ ειχα διαλεξη. Τα διορθωσα και τα δυο στο original post.
-
Ετσι ειναι το jump table σε assembly https://godbolt.org/g/JPpnCI Η αντιστοιχη εκδοχη του ημιθεου μαζι με checks (γιατι στην ουσια το switch/case θα μετρησει ολες τις περιπτωσεις, ενω ετσι οπως το εγραψε ο ημιθεος δεν υπολογιζονται ολες οι περιπτωσεις, αρα οι κωδικες που συγκρινες ειναι εντελως διαφορετικοι) θα γινει ετσι https://godbolt.org/g/t6TJFn Γενικα για να πιεσεις τον compiler να κανει fully optimized jump tables, θα πρεπει να γραψεις τις συναρτησεις οπως το εγραψα παραπανω. O optimizer του compiler μια χαρα μπορει να καταλαβει το switch/case και να το μετατρεψει σε jump table. Αν δεις και στο αρχικο μου ποστ τι εγραψα: Αυτο που υλοποιησε ο hmitheos ειναι καθαρα jump table στην C. Οχι σε assembly. Αυτο ειναι optimization μονο σε higher level C και οχι σε assembly. Τα optimizations που κανουμε σε υψηλο επιπεδο, δεν σημαινει πως μεταφραζονται παντα σε optimizations στο χαμηλο. Πολλες φορες ο προγραμματιστης δεν μπορει να καταλαβει πως ακριβως λειτουργει η μηχανη. Τωρα το πιο optimization ειναι πιο γρηγορο ή οχι, ειναι αντικειμενο ακαδημαϊκης μελετης. Κατα την γνωμη μου, και τα δυο ειναι εξισου σωστα. Καποιος μπορει να πει πως το switch/case ειναι πιο ευαναγνωστο και καποιος αλλος μπορει να πει πως το C jump table ειναι πιο γρηγορο να το γραψεις (και επισης το τελικο εκτελεσιμο εχει μονο ενα call instruction, και ως συνεπεια ειναι λιγοτερα bytes απο το switch/case). Εδιτ: ειχα λαθος στους προηγουμενους κωδικες που ποσταρα. Thanks στον defacer που το παρατηρησε
-
Εχεις δικιο σε αυτο, ειναι καπως αργο το payoff της C. Κατι που σιγουρα θα βοηθησει αρκετα (γενικα βοηθαει αν θες να μαθεις οποιαδηποτε γλωσσα, οχι μονο την C) ειναι να θεσεις εναν συγκεκριμενο στοχο. Μια εφαρμογη που θελεις να φτιαξεις με την γλωσσα, κατι που θες να δημιουργησεις απο το 0 τελος παντων. Δεν χρειαζεται να ειναι κατι περιπλοκο για αρχη. Θα μπορουσε να ειναι sudoku solver, AI για τριλιζα, command line σκακι, chatting μεταξυ δυο διαφορετικων διεργασιων, φιδακι, διερμηνεας (το αγαπημενο μου, προσωπικα), απλος text editor για το command line, pong, tetris κτλ κτλ Γενικα αν εχεις κατι που χρειαζεσαι εσυ να φτιαξεις, κατι που δεν σε αφηνει να κοιμασαι τα βραδια, κατι που θες να κατσεις και να γραψεις για να το βγαλεις απο μεσα σου. Αυτο ειχε βοηθησει τουλαχιστον εμενα οταν τα μαθαινα, αλλα ειμαι σιγουρος πως η ιδια λογικη θα βοηθησει και πολλους αλλους. Το οτι θα εβλεπα εδω jump tables στην C, ποτε δεν θα το περιμενα μπραβο σου Καποιες παρατηρησεις και απο την δικη μου εμπειρια. Αρχικα, κατα πασα πιθανοτητα ο compiler θα μετατρεψει ακομα και το switch/case στον παραπανω κωδικα σε jump table (απο -O2 και πανω συνηθως αλλα αυτο ειναι αναλογως του compiler), δηλαδη δεν χρειαζεται να κατσεις να κανεις hardcode το jump table σου (premature optimization is the root of all evil κτλ κτλ). Επισης δεν ειναι απαραιτητο να εχεις ελεγχους για να μην ξεπερασεις το μεγεθος του πινακα σε περιπτωση που ο χρηστης δωσει κακο input (αγνοωντας τους ελεγχους της scanf εννοειται). Απλα μπορεις να γραψεις αυτο: fpt[(t - 1)%6](w); και ετσι, καθε input που δινει ο χρηστης ειναι εγκυρο. Αν το t ειναι προσημασμενος ακεραιος βεβαια θα πρεπει να λαβεις υποψη και περιπτωσεις οπου το t ειναι αρνητικος. Κατι τετοιο, πιστευω, μπορει να τις πιασει ολες: fpt[( ( (t - 1)%6 ) + 6 ) % 6](w); (σημειωση πως αν θες πχ το index [-3] να σε παει στην θεση [3], τοτε αν δινει εισοδους ο χρηστης απο 1 εως 6 δεν γινεται αυτο με τον παραπανω κωδικα. Θα πρεπει να ειναι ετσι δηλαδη fpt[( ( t % 6 ) + 6 ) % 6](w); οπου το t ειναι απο -5 εως 5, και οποιαδηποτε αλλη τιμη απλα σε βγαζει στην θεση που ειναι t modulo 6) Αυτο βεβαια ειναι αν θες να εκτελεις μια function απο το jump table σου, ειτε δωσει σωστο input ο χρηστης ειτε οχι. Αν θες να μην εκτελεις κανενα function σε περιπτωση bad input μαλλον δεν το γλιτωνεις το if/else (μπορει να γινεται και αν εχεις ενα stub function μεσα στον πινακα, που δεν κανει απολυτως τιποτα και απλα το καλεις οταν δεν θες να γινει κατι, αλλα δεν το εχω πολυσκεφτει)
-
Μιλάς πολύ αφηρημένα και χωρίς κώδικα είναι πολύ δύσκολο να βγάλω νόημα από αυτά που λες. Ωστόσο κάποια πράματα. Αρχικά, το bubblesort δεν είναι καθόλου καλή επιλογή σαν αλγόριθμος για να το χρησιμοποιήσεις οπουδήποτε. Η μόνη του χρήση είναι στα σχολεία ώστε να καταλαβαίνουν τα παιδιά το πρόβλημα της ταξινόμησης, και στην αλγοριθμική ανάλυση ως παράδειγμα χείριστης περίπτωσης αλγορίθμου ταξινόμησης (μην πει κανείς για bogosort). Αν θες να κάνεις sort λίστα με strings, κατά την γνώμη μου ένας πολύ δυνατός αλγόριθμος είναι το radix sort καθώς έχει σχεδιαστεί για να κάνει sorting ακριβώς τέτοιου τύπου δεδομένα (έχει δύο εκδοχές, την LSD και MSD, αλλά και οι δύο παράγουν το ίδιο αποτέλεσμα στο τέλος). Επίσης εδώ ελπίζω να κάνεις πλάκα γιατί το A&&B με το B&&A (και το C&&D με το D&&C) είναι το ίδιο πράμα.
-
Σε Windows και σε Linux δοκιμασμενο με GCC βγάζει 3 bytes (7 + 7 + 7 + 1 + 2 για το padding). Εννοειται πως τετοιος κωδικας ειναι φαρσα και δεν εχει κανενα απολυτως νοημα να υπαρχει, απλα ηθελα να δειξω οτι γινεται. Συνηθως ειναι πιο αργη η αναγνωση θεσεων μνημης που δεν εχουν υποστει το καταλληλο alignment, οπως το κανει αυτοματα ο compiler.
-
MFW #include <stdio.h> struct __attribute__((packed)) __attribute__((gcc_struct)) financial_data_type { unsigned char a : 7; unsigned char b : 7; unsigned char c : 7; unsigned char nul : 1; }; int main(void) { struct financial_data_type economy = {.a = 'o', .b = 'n', .c = 'e', .nul = '\0'}; char str[4]; printf("%u\n", sizeof economy); str[0] = (char)economy.a; str[1] = (char)economy.b; str[2] = (char)economy.c; str[3] = (char)economy.nul; printf("%s\n", str); return 0; } (gcc only) χαχαχ μ' αρεσε αυτο. Petition να αλλαξεις το user σου απο imitheos σε theos