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

Visual Basic & C++ Compiler


Επισκέπτης

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

Δημοσ.

ειναι λιγο περιπλοκο...

 

το προγραμμα σε c++ ειναι ενας xtea encrypter-decrypter και lzo-packer/unpacker

 

οριστε ο κωδικας:

http://pastebin.com/zmApcd8w

 

...

 

Παίζει να είναι στο τοπ-10 του χειρότερα γραμμένου κώδικα που έχω δει στη ζωή μου !!!!!!!!!!!!

 

Αν κάποιος έχει το κουράγιο να κάτσει να βγάλει άκρη μέσα, τότε και η δική μου γνώμη είναι πως πρέπει να προσθέσει ένα ακόμα command-line option για τις καταλήξεις. Οπότε απλά θα διανέμεις τη νέα αυτή έκδοση με το πρόγραμμά σου αντί για ολόκληρο C++ toolchain.

Δημοσ.

Κλασικός κώδικας από μυημένο C προγραμματιστή για περιβάλλον με περιορισμένους πόρους (pc πριν 2 δεκαετίες ή embedded συσκευές).

Η ταχύτητα είναι #1 προτεραιότητα. 

 

Την main την έχει τροποποιήσει (γράψει) με c++ κάποιος άλλος 

 

 

Υπάρχει επίσης ένα .NET dll που το καλείς εύκολα από vb.net 

http://lzo-net.sourceforge.net/ 

Παντως τo .NET dll καλεί το native dll. Μισές δουλείες.

Δημοσ.

Κλασικός κώδικας από μυημένο C προγραμματιστή για περιβάλλον με περιορισμένους πόρους (pc πριν 2 δεκαετίες ή embedded συσκευές).

Η ταχύτητα είναι #1 προτεραιότητα.

 

Μάλλον εννοείς κλασσικός κώδικας αυτοδίδακτου σε C που μέχρι τότε προγραμμάτιζε σε assembly. Διότι δεν υπάρχει περίπτωση να έχει μυήσει σοβαρός επαγγελματίας ή/και ακαδημαϊκό ίδρυμα κάποιον σε C και να του έχει πει για παράδειγμα να κάνει τα loops με labels και goto. Ούτε σήμερα ούτε στα 80's (για τα 70's δεν μπορώ να πω με σιγουριά γιατί δεν ήμουν around :P).

 

Η μόνη περίπτωση που εγώ προσωπικά έχω συναντήσει ως αποδεκτή χρήση goto προς τα πίσω για παραγωγή loop, είναι π.χ,. για να κάνεις reset μετά από το interrupt ενός signal. Όπως π.χ. κάνουν σε Unix kernel (και σε Linux kernel νομίζω). Δηλαδή κάτι σαν το παρακάτω (βαριέμαι τώρα να το ψάξω για να δώσω ακριβή κώδικα, αλλά νομίζω θα γίνει κατανοητό)...

...
startover:
    if ( -1 == system_call() )
    {
        if (EINTR == errno )
            goto startover;
        ...
    }

Όχι φυσικά πως δεν υπάρχουν structured εναλλακτικές για την παραγωγή loop και για αυτή την περίπτωση, αλλά στην συγκεκριμένη περίπτωση από πολλούς θεωρείται πιο ευανάγνωστα λιτή η υλοποίηση με το goto (στο συγκεκριμένη περιλαμβάνεται και ο ότι η goto απέχει ελάχιστα από το label οπτικά.

 

Επίσης στην πολύ-πολύ πιο σπάνια περίπτωση να θέλεις να κάνεις reset μέσα από ένα nested loop, η χρήση της goto είναι sane επιλογή (κι ας απέχει οπτικά πολύ από το label) γιατί η break σπάει μόνο το τρέχον loop, οπότε πρέπει να περιπλέξεις σημαντικά τον κώδικα προκειμένου να σπάσεις υπό συνθήκες και τα πιο πάνω loops).

 

Την main την έχει τροποποιήσει (γράψει) με c++ κάποιος άλλος

 

Το είδα κι εγώ πως μόνο η main() είναι γραμμένη σε C++ (κυρίως για να διαχειριστεί files και strings από μια πολύ γρήγορη ματιά που έριξα), αλλά frankly εγώ τουλάχιστον δεν κάθομαι να βγάλω τα μάτια μου, ούτε για αυτή τη C που έχουν γράψει ούτε για αυτή την C++.

 

EDIT:

 

@hastounis:

 

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

Δημοσ.

@hastounis:

 

Λοιπόν, δοκίμασε αν σου δουλεύει αυτός ο κώδικας: http://pastebin.com/2AE60B9R

 

Tον έκανα prettify μαζί με κάτι μικρο-αλλαγές για να μη βγάζει warnings ο mingw g++ 4.7.0 (στις βασικές αλλαγές έχω βάλει σε σχόλια το "MIGF1" ... χρήσιμο για grep ή για Find | Find -> Next  στους editors). Αλλά δοκίμασε να δεις αν δουλεύει σωστά, γιατί π.χ. το crctable[] από const int που ήταν το έκανα const unisigned int.

 

Για το θέμα σου τώρα, έβαλα δυνατότητα για 2 ακόμα command-line arguments στο τέλος της γραμμής εντολών του προγράμματος. Αν υπάρχει 3ο argument και ξεκινάει με κεφαλαίο λατινικό άι I κι έχει κολλητά του μια κατάληξη, τότε την παίρνει ως IndexName. Αν υπάρχει 4ο argument και ξεκινάει με κεφαλαίο λατινικό ντι D κι έχει κολλητά του μια κατάληξη, τότε την παίρνει ως DataName.

 

Π.χ. αν δώσεις ...

xtealzo filename I.foo D.moo

τότε παίρνει τη ".foo" ως κατάληξη για τα index (αντί δηλαδή για την default ".eix") και την ".moo" ως κατάληξη για τα data (αντί δηλαδή για την default ".epk").

 

Αν λείπει από τη γραμμή εντολών του το I argument ή αν λείπει και το I argument και το D argument, τότε χρησιμοποιεί τις default καταλήξεις.

 

Αλλά επαναλαμβάνω δοκίμασέ το εξαντλητικά γιατί εγώ δεν την παλεύω άλλο με δαύτο (η προσθήκη των arguments δεν ήταν τίποτα, το αραίωμα το κώδικα ήταν που με τσάκισε).

 

ΥΓ. Άσχετο, κυκλοφορούν ελεύθερα πολύ πιο καθαρές και πιο δομημένες υλοποιήσεις για την LZO από ότι έχει αυτός.

Δημοσ.

Σε ευχαριστώ migf1 , θα προσπάθουσα να εκανα κατι αναλογο αλλα λογω ελλειψης χρονου και γνωσεων δεν μπορώ... αυτος ηταν και ο λογος που χρησιμοποιω τον παραπάνω κωδικα...

 

Γ. Άσχετο, κυκλοφορούν ελεύθερα πολύ πιο καθαρές και πιο δομημένες υλοποιήσεις για την LZO από ότι έχει αυτός.

ειχα βρει στην wikipedia για xtea decryption/encryption δινει των κωδικα σε C

http://en.wikipedia.org/wiki/XTEA

 

..  οπως επισης και για τo lzo...

 

ισως μωλις τελιωσω με της πανελλαδικες να ασχοληθω με c ή c++ ... τα μονα που ξερω τωρα ειναι αυτοδιδακτα pascal και VB 

Δημοσ.

 

 

Η μόνη περίπτωση που εγώ προσωπικά έχω συναντήσει ως αποδεκτή χρήση goto προς τα πίσω για παραγωγή loop, είναι π.χ,. για να κάνεις reset μετά από το interrupt ενός signal.

 

Μια συνηθισμένη χρήση της goto ακόμη και σημερα !!!!

Δεν ξέρω αν είναι καλύτερα με goto η χωρίς

int main()
{
	if(!WorkA())
		goto cleanup;

	if(!WorkB())
		goto cleanup;

	...

		return 0;
cleanup:
	    PerformCleanup();
		ShowError(...);
		return 1;
}

 

int main()
{
	if(!WorkA())
	{
		 PerformCleanup();
		 ShowError(...);
		 return 1;
	}

	if(!WorkB())
	{
		PerformCleanup();
		ShowError(...);
		 return 1;
	}

	...
		
	return 0;
}
Δημοσ.

@hastounis:

 

Οκ, με τα extra command-line arguments μπορείς να κάνεις τη δουλειά σου τώρα πιστεύω. Δηλαδή αντί να αλλάζεις τον πηγαίο κώδικα, απλώς θα καλείς το εκτελέσιμο περνώντας του τα κατάλληλα command-line arguments

 

@AlbNik:

 

Ναι, το συζητήσαμε πρόσφατα το συγκεκριμένο που δείχνεις: http://www.insomnia.gr/topic/481402-image-processing-c-program-for-hough-circle/page-3?do=findComment&comment=52274960

 

Αυτό βέβαια δεν παράγει loop, ούτε στέλνει προς τα πίσω την ροή του προγράμματος.

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

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

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

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

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

Σύνδεση

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

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