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

Εrror in C++


georginos1989

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

Δημοσ.

Thanks φιλε Από τα αποτελέσματα που εχεις αυτό ήθελα...

 

Owlman ξέρω τι κανει το προγραμμα...

Βρίσκει τα μερικα αθροισματα ενος πίνακα με 2 διαφορετικους τροπους .. Ο ενας τροπος ειναι η sum1... Τον αλλο τροπο θα τον διορθωσω τωρα...

 

---------- Προσθήκη στις 16:39 ---------- Προηγούμενο μήνυμα στις 16:35 ----------

 

Ρε συ το λαθος ηταν ότι με την malloc δεν μηδενίζονταν οι πινακες οπότε μετά έπρεπε να τους μηδενίσω?

  • Απαντ. 44
  • Δημ.
  • Τελ. απάντηση
Δημοσ.
Thanks φιλε Από τα αποτελέσματα που εχεις αυτό ήθελα...[..]Ρε συ το λαθος ηταν ότι με την malloc δεν μηδενίζονταν οι πινακες οπότε μετά έπρεπε να τους μηδενίσω?

 

Το ουσιαστικό σφάλμα ήταν καταρχήν στα ορίσματα που περνούσε η main στην sum1 (p, s => s, p) και στο γεγονός ότι το "int sum;" εντός της sum1 έμενε uninitialized (αντί για "int sum = 0;") οπότε είχε κάποια τυχαία τιμή. Όσον αφορά τα malloc, προσωπικά (συνήθεια) όταν δεσμεύω πίνακες (αν και δεν γράφω πια πολύ C) προτιμώ την calloc διότι παράλληλα μηδενίζει τις τιμές τους (αντί των malloc & memset). Τέλος, το ίδιο συμβαίνει και με τα δυο τελικά free - ουσιαστικά δεν χρειάζονται καθώς τα σύγχρονα λειτουργικά αποδεσμεύουν με την έξοδο του process όλη την δεσμευμένη μνήμη αλλά επειδή έρχομαι από παλαιότερα Λ.Σ. (που δεν κάνανε τέτοια πράματα :-D) είναι μια (ακόμη) συνήθεια να αποδεσμεύω στην έξοδο ότι δεσμεύω.

Δημοσ.
Thanks φιλε Από τα αποτελέσματα που εχεις αυτό ήθελα...[..]Ρε συ το λαθος ηταν ότι με την malloc δεν μηδενίζονταν οι πινακες οπότε μετά έπρεπε να τους μηδενίσω?

 

Το ουσιαστικό σφάλμα ήταν καταρχήν στα ορίσματα που περνούσε η main στην sum1 (p, s => s, p) και στο γεγονός ότι το "int sum;" εντός της sum1 έμενε uninitialized (αντί για "int sum = 0;") οπότε είχε κάποια τυχαία τιμή. Όσον αφορά τα malloc, προσωπικά (συνήθεια) όταν δεσμεύω πίνακες (αν και δεν γράφω πια πολύ C) προτιμώ την calloc διότι παράλληλα μηδενίζει τις τιμές τους (αντί των malloc & memset). Τέλος, το ίδιο συμβαίνει και με τα δυο τελικά free - ουσιαστικά δεν χρειάζονται καθώς τα σύγχρονα λειτουργικά αποδεσμεύουν με την έξοδο του process όλη την δεσμευμένη μνήμη αλλά επειδή έρχομαι από παλαιότερα Λ.Σ. (που δεν κάνανε τέτοια πράματα :-D) είναι μια (ακόμη) συνήθεια να αποδεσμεύω στην έξοδο ότι δεσμεύω.

Δημοσ.

Ναι καλά λες.. Ποοο τι βλακεια εκανα παλι... χαχαχαχαχα

 

Υπάρχει καποιος τροπος να μετράω τον αριθμο των πραξεων που γίνονται?

Ή να βάλω εναν μετρητη να μετράει?

Δημοσ.

Ναι καλά λες.. Ποοο τι βλακεια εκανα παλι... χαχαχαχαχα

 

Υπάρχει καποιος τροπος να μετράω τον αριθμο των πραξεων που γίνονται?

Ή να βάλω εναν μετρητη να μετράει?

Δημοσ.
Ναι καλά λες.. Ποοο τι βλακεια εκανα παλι... χαχαχαχαχα

 

Υπάρχει καποιος τροπος να μετράω τον αριθμο των πραξεων που γίνονται?

Ή να βάλω εναν μετρητη να μετράει?

 

Αν κατάλαβα τι θες, μπορείς να προβάλεις το size καθώς ουσιαστικά κάνεις τόσες size προσθέσεις στο sum1 for.

Δημοσ.
Ναι καλά λες.. Ποοο τι βλακεια εκανα παλι... χαχαχαχαχα

 

Υπάρχει καποιος τροπος να μετράω τον αριθμο των πραξεων που γίνονται?

Ή να βάλω εναν μετρητη να μετράει?

 

Αν κατάλαβα τι θες, μπορείς να προβάλεις το size καθώς ουσιαστικά κάνεις τόσες size προσθέσεις στο sum1 for.

Δημοσ.
Ναι σωστό αυτό αλλά λογικά θα το θέλει με κάποιο τροπο....

 

Μπορείς να το κάνεις με πολλούς τρόπους, ο πιο απλός είναι να επιστρέφει η ρουτίνα το size (αφού πρέπει να επιστρέφει τον αριθμό των πράξεων η ίδια..) ως:

>
int sum1 (int *p1, int *s1, int size)
{
int sum = 0; /* Init. sum to zero */

for(int i=0;i<size;i++)
{
	sum=sum+p1[i];
	*(s1+i)=sum;
}
for (int i=0;i<size;i++)
	printf("%d \n", s1[i]);

return size;
}

 

ή αν σώνει και καλά πρέπει να μετράς τις πράξεις με κάποιον ξεχωριστό counter (πχ. calcnt) ως:

 

>
int sum1 (int *p1, int *s1, int size)
{
int sum = 0, calcnt = 0; /* Init. sum to zero */

for(int i=0;i<size;i++)
{
	sum=sum+p1[i];
	*(s1+i)=sum;
	calcnt++;
}
for (int i=0;i<size;i++)
	printf("%d \n", s1[i]);

return calcnt;
}

 

:-)

Δημοσ.
Ναι σωστό αυτό αλλά λογικά θα το θέλει με κάποιο τροπο....

 

Μπορείς να το κάνεις με πολλούς τρόπους, ο πιο απλός είναι να επιστρέφει η ρουτίνα το size (αφού πρέπει να επιστρέφει τον αριθμό των πράξεων η ίδια..) ως:

>
int sum1 (int *p1, int *s1, int size)
{
int sum = 0; /* Init. sum to zero */

for(int i=0;i<size;i++)
{
	sum=sum+p1[i];
	*(s1+i)=sum;
}
for (int i=0;i<size;i++)
	printf("%d \n", s1[i]);

return size;
}

 

ή αν σώνει και καλά πρέπει να μετράς τις πράξεις με κάποιον ξεχωριστό counter (πχ. calcnt) ως:

 

>
int sum1 (int *p1, int *s1, int size)
{
int sum = 0, calcnt = 0; /* Init. sum to zero */

for(int i=0;i<size;i++)
{
	sum=sum+p1[i];
	*(s1+i)=sum;
	calcnt++;
}
for (int i=0;i<size;i++)
	printf("%d \n", s1[i]);

return calcnt;
}

 

:-)

Δημοσ.

Ναι καταλαβα...

και ενα τελευταιο.. δεν μπορω να βρω τον χρονο εκτελεσης... χρησιμοποιω την time() αλλά βγάζει 0 συνεχεια..

Πχ στον παρακατω κωδικα

 

 

Δεν ξερω τι κανω λαθος

Δημοσ.

Ναι καταλαβα...

και ενα τελευταιο.. δεν μπορω να βρω τον χρονο εκτελεσης... χρησιμοποιω την time() αλλά βγάζει 0 συνεχεια..

Πχ στον παρακατω κωδικα

 

 

Δεν ξερω τι κανω λαθος

code.txt

Δημοσ.

Ειναι παρα πολυ μικρος ο χρονος εκτελεσης

Δοκιμασε αυτη εδω τη κλαση που εκανα παλια

>#include <time.h>
#define CDFUNC __fastcall 
#define MAX_EXCCOUNT 0xffffffff
#define MID_EXCCOUNT 0x00ffffff
#define LOW_EXCCOUNT 0x0000ffff
class CodeTimer
{
clock_t start, end;
long ms;
float sec;
void _calc()
{
	ms = (end-start);
	sec= ms/1000;
}
public:
CodeTimer(void)
{
	
}
~CodeTimer(void){}
void Start(void (CDFUNC *pFunc)(void),unsigned int exccount)
{
	Start();
	for(unsigned int i=0; i<exccount;i++)
		pFunc();
	Stop();
}
void Start(void)
{
	start =clock();
}
void Stop(void)
{
	end = clock();
	_calc();
}
void Release(void)
{
	end=0;
	start=0;
	ms=0;
	sec=0;
}
long GetMilliSeconds(void)
{
	return ms;
}
float GetSeconds(void)
{
	return sec;
}
};

Δημοσ.

Ειναι παρα πολυ μικρος ο χρονος εκτελεσης

Δοκιμασε αυτη εδω τη κλαση που εκανα παλια

>#include <time.h>
#define CDFUNC __fastcall 
#define MAX_EXCCOUNT 0xffffffff
#define MID_EXCCOUNT 0x00ffffff
#define LOW_EXCCOUNT 0x0000ffff
class CodeTimer
{
clock_t start, end;
long ms;
float sec;
void _calc()
{
	ms = (end-start);
	sec= ms/1000;
}
public:
CodeTimer(void)
{
	
}
~CodeTimer(void){}
void Start(void (CDFUNC *pFunc)(void),unsigned int exccount)
{
	Start();
	for(unsigned int i=0; i<exccount;i++)
		pFunc();
	Stop();
}
void Start(void)
{
	start =clock();
}
void Stop(void)
{
	end = clock();
	_calc();
}
void Release(void)
{
	end=0;
	start=0;
	ms=0;
	sec=0;
}
long GetMilliSeconds(void)
{
	return ms;
}
float GetSeconds(void)
{
	return sec;
}
};

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

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

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