freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [9 Μηνύματα]      Bookmarks Tags: μετρητής Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
prokopios


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 16 Νοε 2009 12:43    Θέμα: Δεν αυξάνεται ο μετρητής μου... Απάντηση με παράθεση  Mark this post and the followings unread

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

Ευχαριστώ


κώδικας:

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

typedef struct account account ;
struct account
{
   char name[15] ;
   char last[15] ;
   int id2 ;
   int amount ;
};

int id = 0;


int create_account(account* accounts, int id,char name[],char surname[], int initial_sum)
{
         account* ac = accounts + id ;
         strcpy(ac->name,name);
          strcpy(ac->last,surname);
          ac->amount = initial_sum;
      id=id+1;
      ac->id2 = id;
         return 1 ;

}

main(int argc, char *argv[])
{

   account accounts[300] ;
   char name[15];
   char surname[15];
   int initial_sum;
   int i;

   while(1)   
   {
      printf("Press 1 or 0 to exit : ");
      scanf("%d",&i);

      switch(i){
                  
         case 1:
                                   printf("name surname id :");
                               scanf("%s %s %d",name,surname,&initial_sum);
create_account(accounts,id,name,surname,initial_sum);
               printf("id = %d\n", accounts[0].id2);
               printf("name = %s  %s\n", accounts[0].name,accounts[0].last);
               printf("amount %d\n\n",accounts[0].amount);
               break;
         case 0:   exit(0);         
               
         }
   }
}

_________________
ΑΥΤΑ!!!
virxen75


Μέλος από: 18 Φεβ 2009
Μηνύματα: 256+
Περιοχή: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ
View users profile
ΜήνυμαΣτις: 16 Νοε 2009 13:35    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

κώδικας:

//alagi  αντι int id--->int id1
int create_account(account* accounts, int id1,char name[],char surname[], int initial_sum)
{
         account* ac = accounts + id1 ;//alagi
         strcpy(ac->name,name);
          strcpy(ac->last,surname);
          ac->amount = initial_sum;
      id++;//alagi
      ac->id2 = id;//alagi
         return 1 ;

}



και επίσης
κώδικας:

case 1:
                                   printf("name surname id :");
                               scanf("%s %s %d",name,surname,&initial_sum);


να γίνει
κώδικας:

case 1:
                                   printf("name surname amount :");
                               scanf("%s %s %d",name,surname,&initial_sum);
prokopios


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 16 Νοε 2009 13:57    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

κώδικας:

int id1=0;

int create_account(account* accounts, int id1,char name[],char surname[], int initial_sum)
{
     int id=0;
         account* ac = accounts + id1 ;
         strcpy(ac->name,name);
          strcpy(ac->last,surname);
          ac->amount = initial_sum;
      id++;
      ac->id2 = id;
         return 1 ;

}


κώδικας:

create_account(accounts,id1,name,surname,initial_sum);

Δοκίμασα και μου κάνει πάλι το ίδιο.

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

_________________
ΑΥΤΑ!!!
prokopios


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 16 Νοε 2009 19:33    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Κατάλαβε κανείς τι φταίει ??

_________________
ΑΥΤΑ!!!
alex599


Μέλος από: 17 Δεκ 2008
Βοηθήματα: 3
Μηνύματα: 66

Περιοχή: Πάτρα
View users profile Send email to user
ΜήνυμαΣτις: 16 Νοε 2009 22:05    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Προτείνω να κάτσεις να διαβάσεις τι παίζει με την εμβέλεια μεταβλητών και προσπάθησε να το λύσεις.

_________________
while(!dead()) ++knowledge;
virxen75


Μέλος από: 18 Φεβ 2009
Μηνύματα: 256+
Περιοχή: ΗΡΑΚΛΕΙΟ ΚΡΗΤΗΣ
View users profile
ΜήνυμαΣτις: 16 Νοε 2009 22:09    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 17 Φεβ 2006
Μηνύματα: 155

View users profile
ΜήνυμαΣτις: 16 Νοε 2009 22:36    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

_________________
ΑΥΤΑ!!!
locoman


Μέλος από: 15 Νοε 2009
Μηνύματα: 3

View users profile
ΜήνυμαΣτις: 17 Νοε 2009 07:42    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

locoman
dva_dev
Script Master

Μέλος από: 16 Σεπ 2005
Μηνύματα: 256+

View users profile Visit posters website
blog deviantART facebook linkedin 
ΜήνυμαΣτις: 17 Νοε 2009 11:46    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

Σημείωσε ότι όταν έχεις ένα βρόχο που θα εκτελεστεί τουλάχιστον μία φορά είναι λάθος να χρησιμοποιείς 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() {
    char string[50];
    //γεμίζουμε το string με κάποιο κείμενο
    return string;
}


Αν μπορείς να αποφύγεις 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
{
   char name[15];
   char last[15];
   int id2;
   int amount;
};

//int id = 0;

//int create_account(account* accounts, int id,char name[],char surname[], int initial_sum)
int create_account(account* accounts, int* id, char name[],char surname[], int initial_sum)
{
   account* ac = accounts + id;
   strcpy(ac->name,name);
   strcpy(ac->last,surname);
   ac->amount = initial_sum;
   //id=id+1;
   (*id)=(*id)+1;
   //ac->id2 = id;
   ac->id2 = (*id);
   return 1;
}

//main(int argc, char *argv[])
int main(int argc, char *argv[])
{
   account accounts[300];
   char name[15];
   char surname[15];
   int initial_sum;
   int i;
   //
   int id = 0;

   //while(1)
   do
   {
      printf("Press 1 or 0 to exit : ");
      scanf("%d",&i);

      //switch(i){
      //case 1:
      if ( i==1 )
      {
         printf("name surname id :");
         scanf("%s %s %d",name,surname,&initial_sum);
         //create_account(accounts,id,name,surname,initial_sum);
         create_account(accounts,&id,name,surname,initial_sum);
         printf("id = %d\n", accounts[0].id2);
         printf("name = %s  %s\n", accounts[0].name,accounts[0].last);
         printf("amount %d\n\n",accounts[0].amount);
      //   break;
      //case 0:
      //   exit(0);
      }
   //}
   } while (i!=0)
//}
   return 0;
}



Φίλε kaveιirious μπορείς να εξηγήσεις λίγο τι εννοείς "να κόψουμε το big man στη μεταβλητή για να σταματήσει να μεγαλώνει η τιμή της...";
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [9 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 03 Δεκ 2016 23:50 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos