Δεν αυξάνεται ο μετρητής μου...

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από prokopios » 16 Νοέμ 2009 12:43

Γεια σας,
μπορεί κάποιος να με βοηθήσει με το παρακάτω πρόβλημα.
Θέλω να δημιουργώ λογαριασμούς και κάθε φορά να αυξάνεται το id κατά ένα.
Κάνω την άυξηση εντός της συνάρτησης αλλά δε κάνει τίποτα. Ξέρει κανείς τι συμβαίνει ?

Ευχαριστώ

Κώδικας: Επιλογή όλων

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

typedef struct account account ;
struct account
&#123;
   char name&#91;15&#93; ;
   char last&#91;15&#93; ;
   int id2 ;
   int amount ;
&#125;;

int id = 0;


int create_account&#40;account* accounts, int id,char name&#91;&#93;,char surname&#91;&#93;, int initial_sum&#41;
&#123;
   		account* ac = accounts + id ;
   		strcpy&#40;ac->name,name&#41;;
    		strcpy&#40;ac->last,surname&#41;;
    		ac->amount = initial_sum;
		id=id+1;
		ac->id2 = id;
   		return 1 ;

&#125;

main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;

	account accounts&#91;300&#93; ;
	char name&#91;15&#93;; 
	char surname&#91;15&#93;;
	int initial_sum;
	int i;

	while&#40;1&#41;	
	&#123;
		printf&#40;"Press 1 or 0 to exit &#58; "&#41;;
		scanf&#40;"%d",&i&#41;;

		switch&#40;i&#41;&#123;
						
			case 1&#58; 
                                   printf&#40;"name surname id &#58;"&#41;;
 	                           scanf&#40;"%s %s %d",name,surname,&initial_sum&#41;;
create_account&#40;accounts,id,name,surname,initial_sum&#41;;
					printf&#40;"id = %d\n", accounts&#91;0&#93;.id2&#41;;
					printf&#40;"name = %s  %s\n", accounts&#91;0&#93;.name,accounts&#91;0&#93;.last&#41;;
					printf&#40;"amount %d\n\n",accounts&#91;0&#93;.amount&#41;;
					break;
			case 0&#58;	exit&#40;0&#41;;			
					
			&#125;
	&#125;
&#125;
ΑΥΤΑ!!!

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από virxen75 » 16 Νοέμ 2009 13:35

καλύπτεις την global μεταβλητή με μια τοπική
αναφέρεσε στην τοπική id και όχι στην global

Κώδικας: Επιλογή όλων

//alagi  αντι int id--->int id1
int create_account&#40;account* accounts, int id1,char name&#91;&#93;,char surname&#91;&#93;, int initial_sum&#41;
&#123;
         account* ac = accounts + id1 ;//alagi
         strcpy&#40;ac->name,name&#41;;
          strcpy&#40;ac->last,surname&#41;;
          ac->amount = initial_sum;
      id++;//alagi
      ac->id2 = id;//alagi
         return 1 ;

&#125;

και επίσης

Κώδικας: Επιλογή όλων

case 1&#58;
                                   printf&#40;"name surname id &#58;"&#41;;
                               scanf&#40;"%s %s %d",name,surname,&initial_sum&#41;; 
να γίνει

Κώδικας: Επιλογή όλων

case 1&#58;
                                   printf&#40;"name surname amount &#58;"&#41;;
                               scanf&#40;"%s %s %d",name,surname,&initial_sum&#41;; 

prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από prokopios » 16 Νοέμ 2009 13:57

Έτσι, αν κατάλαβα καλά ?

Κώδικας: Επιλογή όλων

int id1=0;

int create_account&#40;account* accounts, int id1,char name&#91;&#93;,char surname&#91;&#93;, int initial_sum&#41;
&#123;
     int id=0;
         account* ac = accounts + id1 ;
         strcpy&#40;ac->name,name&#41;;
          strcpy&#40;ac->last,surname&#41;;
          ac->amount = initial_sum;
      id++;
      ac->id2 = id;
         return 1 ;

&#125;

Κώδικας: Επιλογή όλων

create_account&#40;accounts,id1,name,surname,initial_sum&#41;; 
Δοκίμασα και μου κάνει πάλι το ίδιο.

Ναι amount και όχι id , το έγραψα εκ παραδρομής.
ΑΥΤΑ!!!

prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από prokopios » 16 Νοέμ 2009 19:33

Κατάλαβε κανείς τι φταίει ??
ΑΥΤΑ!!!

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από alex599 » 16 Νοέμ 2009 22:05

γιατί περνάς ως παράμετρο στη συνάρτηση μια δημόσια μεταβλητή? Η δημόσια μεταβλητή είναι ήδη γνωστή.

Προτείνω να κάτσεις να διαβάσεις τι παίζει με την εμβέλεια μεταβλητών και προσπάθησε να το λύσεις.
while(!dead()) ++knowledge;

Άβαταρ μέλους
virxen75
Δημοσιεύσεις: 493
Εγγραφή: 18 Φεβ 2009 00:17
Τοποθεσία: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από virxen75 » 16 Νοέμ 2009 22:09

int create_account(account* accounts, int id1,char name[],char surname[], int initial_sum)
{
int id=0; <----αφαίρεσε αυτό γιατί?δες την σημείωση

σημείωση:

global μεταβλητές είναι οι μεταβλητές που ορίζονται πριν το int main()
όλες οι συναρτήσεις μπορούν να έχουν πρόσβαση σε αυτές με το ίδιο όνομα.

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

όταν έχεις μία global όπως εδώ --->

int id=0;
int main(){

......
}

και ορίσεις σε μία συνάρτηση μία μεταβλητή τοπική με το ίδιο όνομα με την global
π.χ.
int create_account(account* accounts, int id1,char name[],char surname[], int initial_sum)
{
int id=0;<-τοπική
id=id+1;<------αναφέρεται στην τοπική με το ίδιο όνομα και όχι στην global

prokopios
Δημοσιεύσεις: 155
Εγγραφή: 17 Φεβ 2006 15:47

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από prokopios » 16 Νοέμ 2009 22:36

Ευχαριστώ πολύ.

Υ.Γ. : ξέρω τι είναι μια global μεταβλητή. απλά ναι μεν ο μετρητής αυξανόταν κανονικά αλλά μετά δεν εμφανιζόταν τίποτα. Γι'αυτό το έβαλα σαν δεύτερο όρισμα της create_account να στέλνει πάντα 0.
ΑΥΤΑ!!!

locoman
Δημοσιεύσεις: 3
Εγγραφή: 15 Νοέμ 2009 17:04

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από locoman » 17 Νοέμ 2009 07:42

μία ιδέα είναι κόψουμε το big man στη μεταβλητή ....
... για να σταματήσει να μεγαλώνει η τιμή της...

locoman

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Δεν αυξάνεται ο μετρητής μου...

Δημοσίευση από dva_dev » 17 Νοέμ 2009 11:46

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

Σημείωσε ότι όταν έχεις ένα βρόχο που θα εκτελεστεί τουλάχιστον μία φορά είναι λάθος να χρησιμοποιείς while loop, το σωστό είναι repeat until ή σε C διάλεκτο do...while.
Επίσης αν έχεις λίγες τιμές (<3) να ελέγξεις, η δεν απλοποιείται ο κώδικας, καλύτερα να χρησιμοποιείς if παρά switch case.
H main επιστρέφει κάτι. Ο compiler ξέρει τί, εσύ ξέρεις; Επέστρεφε το.

Στις functions (τουλάχιστον στην αρχή) να αποφεύγεις να βγαίνεις από 50 διαφορετικά σημεία με 50 διαφορετικούς τρόπους. Προσπάθησε να βγαίνεις από 1 σημείο (κατά προτίμηση στο τέλος της function).

Ποτέ μην επιστρέφεις μεταβλητές που "ζουν" μόνο μέσα σε μια function. Το να επιστρέφεις κάποιον pointer που δείχνει σε local μεταβλητή που έχει δημιουργηθεί μέσα σε μια function, δεν ξέρεις πότε θα σου δημιουργήσει πρόβλημα. Γενικά να θεωρείς ότι με το που βγαίνεις από τη function, όσες local μεταβλητές είχαν δηλωθεί εκεί, πλέον δεν υπάρχουν και ότι περιεχόμενο είχαν οι θέσεις μνήμης που καταλάμβαναν, πλέον έχουν γεμίσει σκουπίδια και δεν μπορείς να τις αξιοποιήσεις.
Το παρακάτω είναι μέγα λάθος.

Κώδικας: Επιλογή όλων

char* foo&#40;&#41; &#123;
    char string&#91;50&#93;;
    //γεμίζουμε το string με κάποιο κείμενο
    return string;
&#125;
Αν μπορείς να αποφύγεις global μεταβλητές, δεν υπάρχει λόγος να μην το κάνεις.
Για να επιστρέψεις ένα αποτέλεσμα από μια function μπορείς να το κάνεις με δύο τρόπους: α) Να το επιστρέψεις σαν return value, β) να το επιστρέψεις μέσω κάποιας output παράμετρο.
Νομίζω ότι έχεις επιλέξει να κάνεις το β). Στη c++ μπορείς να χρησιμοποιήσεις είτε pointers είτε references, αλλά στη c έχεις μόνο pointers. Ρίξε λίγο διάβασμα στο τι κάνουν οι output παράμετροι, πως δηλώνονται, και όσο διάβασμα μπορεί να αντέξει ο οργανισμός σου για τους pointers.

Ο αρχικός κώδικας με μερικές ( ; ) αλλαγές

Κώδικας: Επιλογή όλων

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

typedef struct account account;
struct account
&#123;
	char name&#91;15&#93;;
	char last&#91;15&#93;;
	int id2;
	int amount;
&#125;;

//int id = 0;

//int create_account&#40;account* accounts, int id,char name&#91;&#93;,char surname&#91;&#93;, int initial_sum&#41;
int create_account&#40;account* accounts, int* id, char name&#91;&#93;,char surname&#91;&#93;, int initial_sum&#41;
&#123;
	account* ac = accounts + id;
	strcpy&#40;ac->name,name&#41;;
	strcpy&#40;ac->last,surname&#41;;
	ac->amount = initial_sum;
	//id=id+1;
	&#40;*id&#41;=&#40;*id&#41;+1;
	//ac->id2 = id;
	ac->id2 = &#40;*id&#41;;
	return 1;
&#125;

//main&#40;int argc, char *argv&#91;&#93;&#41;
int main&#40;int argc, char *argv&#91;&#93;&#41;
&#123;
	account accounts&#91;300&#93;;
	char name&#91;15&#93;;
	char surname&#91;15&#93;;
	int initial_sum;
	int i;
	//
	int id = 0;

	//while&#40;1&#41;
	do
	&#123;
		printf&#40;"Press 1 or 0 to exit &#58; "&#41;;
		scanf&#40;"%d",&i&#41;;

		//switch&#40;i&#41;&#123;
		//case 1&#58;
		if &#40; i==1 &#41;
		&#123;
			printf&#40;"name surname id &#58;"&#41;;
			scanf&#40;"%s %s %d",name,surname,&initial_sum&#41;;
			//create_account&#40;accounts,id,name,surname,initial_sum&#41;;
			create_account&#40;accounts,&id,name,surname,initial_sum&#41;;
			printf&#40;"id = %d\n", accounts&#91;0&#93;.id2&#41;;
			printf&#40;"name = %s  %s\n", accounts&#91;0&#93;.name,accounts&#91;0&#93;.last&#41;;
			printf&#40;"amount %d\n\n",accounts&#91;0&#93;.amount&#41;;
		//	break;
		//case 0&#58;
		//	exit&#40;0&#41;;
		&#125;
	//&#125;
	&#125; while &#40;i!=0&#41;
//&#125;
	return 0;
&#125;

Φίλε kaveιirious μπορείς να εξηγήσεις λίγο τι εννοείς "να κόψουμε το big man στη μεταβλητή για να σταματήσει να μεγαλώνει η τιμή της...";

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες