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

C ενωση δυο μεταβλητών


aisixtir

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

Δημοσ.

και ποιός είναι ο ορισμός του "καθαρού" και της "ταρζανιάς":-) ;

 

...ειδικά όταν η αρχιτεκτονική των σημερινών υπολογιστών δεν επιβάλει ιδιαίτερους (ουσιαστικούς) περιορισμούς που ήταν απαραίτητοι πριν 15 ή 20 χρόνια οπότε είμαι έτοιμος να διαπραγματευτώ μεταξύ ενός ευανάγνωστου κώδικα και ενδεχομένως λίγο πιο αργού ή λίγο μεγαλύτερου εκτελέσιμου

ο parsifal έθεσε το θέμα των "μικρών συστημάτων" όπου εκεί η απλότητα δεν είναι πάντα επιλογή.

πχ: αν δουλεύεις για ένα project σε ένα εργοστάσιο που παράγει τηλεκοντρόλ και χρειαστεί να κάνεις κάτι τέτοιο, υπάρχουν οι επιλογές:

α) μικροελενκτης με 0,5ευρω και αποτελεσματικός κωδικας που απαιτεί περισσότερο χρόνο σκέψης/προετοιμασίας απο σενα

β) μικροελενκτης με 0,9 ευρω με δυνατοτητα sprintf ή log (και την επιπλέον μνήμη που απαιτείται)

Τι απο τα δυο πιστεύεις θα εκτιμούσαν οι μέτοχοι του εργοστασίου σε σχέση με τον υπάρχοντα ανταγωνισμό;

 

Φυσικά για τους σημέρινους υπολογιστές (αλλα και τους δεκαπενταετίας) δεν υπάρχει λόγος για οτιδήποτε πιο πολύπλοκο απο το sprintf/atoi :mrgreen:

  • Απαντ. 31
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

και ποιός είναι ο ορισμός του "καθαρού" και της "ταρζανιάς" ;

 

Νομίζω ότι έχεις ήδη απαντήσει αφ’ εαυτού, αλλά δεν πειράζει καθώς πρόκειται για microcontrollers οπότε συγχωρείσαι :-)

 

ο parsifal έθεσε το θέμα των "μικρών συστημάτων" όπου εκεί η απλότητα δεν είναι πάντα επιλογή.

 

Και εγώ έθεσα το ζήτημα επί της βάσης του σχολίου:

Νομίζω πως είναι πιο ευκολοχώνευτος τρόπος από κάποιον που είναι αρχάριος στη C.

 

Που μου έδωσε έτσι την ευκαιρία να αναπτύξω την άποψη μου επί της αξίας της απλότητας, οπότε τα υπόλοιπα που αναπτύσσεις αν και εύστοχα, είναι μάλλον irrelevant.:mrgreen:

 

Γενικά είμαστε από δυο διαφορετικούς κόσμους, εσύ στα embedded systems (από όσο φαίνεται - οπότε συνηθισμένος στις πατέντες) εγώ στις εμπορικές εφαρμογές (ταχύτητα & αποτελεσματικότητα) οπότε «διάσταση απόψεων» και προγραμματιστικού στυλ :-D

 

Όπως και να έχει, καλή συνέχεια.

 

Υ.Γ.

Αν θες να το συζητήσουμε περαιτέρω, pm.

Δημοσ.

Γενικά είμαστε από δυο διαφορετικούς κόσμους, εσύ στα embedded systems (από όσο φαίνεται - οπότε συνηθισμένος στις πατέντες) ...

μπά, παίζω και στα δύο ταμπλό (υποθέτω ότι το ένα έχει επηρεάσει και το άλλο ;) ). Πάντως σοβαρά δεν μου φάνηκε κανένας τρόπος ταρζανιά. Μου άρεσε και το log βέβαια. Φυσικά θεωρώ το sprintf πιο απλό.

 

@Engenios: το int είναι προσημασμένος ακέραιος, το unsigned (ή unsigned int) είναι μη προσημασμένος ακέραιος (δηλαδη ίδιος αριθμός bytes αλλά διαφορετικός τρόπος απεικόνησης για τους αρνητικούς αριθμούς (στους θετικούς είναι πανομοιότοιποι και στα bit τους).

Δημοσ.

Στην περίπτωση της sprintf/atoi το buffer πρέπει να είναι τόσο μεγάλο όσο 2 integers της μηχανής (σε δεκαδική αναπαράσταση) +1 byte για το '\0'.

 

Το παραπάνω είναι 1) δύσκολο να το υπολογίσεις και 2) σαφέστατα πιο επηρρεπές σε λάθη από την λύση με log. Ακόμα προτιμάτε την sprintf;

Δημοσ.
όπως προείπα, η strcat() σου κάνει μια χαρά την δουλειά σου...

Για του λόγου το αληθές,

 

56055539.jpg

 

Όχι ακριβώς, αν βάλεις ένα πολύ μεγάλο integer μαζί με έναν άλλο δεν θα δουλέψει, πρέπει να γνωρίζεις πόσα ψηφία είναι ο κάθε integer για να δημιουργήσεις ένα string με βάση τους αριθμούς αυτούς δυναμικά και όχι στατικά με 10 bytes αυθαίρετα. Επίσης η gets δεν είναι καλή συνάρτηση να την αποφεύγεις αν είναι δυνατόν. Δοκίμασε fgets ή ακόμα και scanf με προσοχή το πόσα πράγματα διαβάζεις.

Δημοσ.

"ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι."

 

Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string...

Δημοσ.
"ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι."

 

Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string...

 

>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define snprintf _snprintf

/* Calculate number of digits in a number. */

unsigned int CalculateDigitNumber(unsigned int N)
{
unsigned int Cnt = 0;
do
{
	Cnt++;
	if(!(N/=10))
		break;
}while(1);
/* Return. */
return Cnt;
}

/* Create the concatenation of two numbers. */

int IntConcat(unsigned int X, unsigned int Y)
{
int nValue = 0;
unsigned int ConcatNumber;
unsigned int TotalLen = CalculateDigitNumber(X) + CalculateDigitNumber(Y);
char *IntConc = (char*)calloc(TotalLen+1, sizeof(char));
if(!IntConc)
{
	perror("CALLOC:");
	return -1;
}
else
{
	if((nValue = snprintf(IntConc,TotalLen+1, "%u%u", X,Y)) != TotalLen)
	{
		perror("SNPRINTF");
		free(IntConc);
		return -1;
	}
	else
	{
		if(sscanf(IntConc, "%u", &ConcatNumber) != 1)
		{
			perror("SSCANF");
			free(IntConc);
			return -1;
		}
		/* Return the number. */
		free(IntConc);
		return ConcatNumber;
	}
}
}

/* Main Code. */

int main(int argc, char *argv[])
{
printf("Result=%u\n", IntConcat(123,456));
printf("Hit enter to continue...\n");
getchar();
return 0;
}

 

Μην το κάνουμε θέμα...

 

Εκτυπωμένα αποτελέσματα:

 

Result=123456

Hit enter to continue...

Δημοσ.
"ψάχνω να βρω στην C έναν τρόπο να ενώσω δυο μεταβλητές τύπου int σε μια τρίτη τύπου int παλι."

 

Εσύ έδωσες έναν τρόπο να ενώσεις δυο strings ως string...

 

Ωπ, σόρρυ δεν το πρόσεξα !

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...