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

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

βοηθεια για επιτροφη πινακα απο συναρτηση σε γλωσσα C


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


Μέλος από: 11 Απρ 2006
Μηνύματα: 8
Περιοχή: rodos
View users profile Send email to user
ΜήνυμαΣτις: 14 Αυγ 2008 02:35    Θέμα: βοηθεια για επιτροφη πινακα απο συναρτηση σε γλωσσα C Απάντηση με παράθεση  Mark this post and the followings unread

Λοιπον γεια και χαρα σε ολους τους φιλους του freestuff

Ειμαι παλικαρακι ανω των 35 και καλιο αργα παρα ποτε μετα απο πολλα χρονια ενασχολησης μου με τους υπολογιστες αποφασισα να μαθω C για να μπορεσω να ασχοληθω εκτενεστερα με το linux

Το επιπεδο μου αυτην την στιγμη οσο αφορα τον προγραμματισμο ειναι στους pointer kai stis συναρτησεις,αλλα πολυ φρεσκος ακομα.

Και ιδου η απορια μου.Μεχρι στιγμης ηξερα να επιστρεφω μια τιμη απο μια συναρτηση στην main.Τωρα ομως θελω να επιστρεψω εναν ολοκληρο πινακα,δηλαδη παραπανω απο μια τιμη

Μπορω να το κανω στην απλουστερη του μορφη και θα παραθεσω και τον κωδικα μου παρακατω απλα θα θελα να μου επησιμανετε και αλλους τροπους



#include <stdio.h>

void epistrofi_pinaka(int B[])
{
int i;
int C[5];

for(i = 0; i <= 4; i++)
{
C[i] = B[i]++; //apothikevo s enan pinaka tis times tou pinaka A afksanomenes kata 1
}
}



int main()
{
int A[] = {1,2,3,4,5}; // arxikopoio enan pinaka me times 1 2 3 4 5
int i;

epistrofi_pinaka(A); // kalo tin sinartisi


for(i = 0; i <= 4; i++)
{

printf("%i\n",A[i]); //kai emfanizo ta apotelesmata tou pinaka A afksanomena kata 1
}


}


ευχαριστω για οποια βοηθεια.
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 14 Αυγ 2008 02:50    Θέμα: Re: βοηθεια για επιτροφη πινακα απο συναρτηση σε γλωσσα C Απάντηση με παράθεση  Mark this post and the followings unread

Μπορείς να επιστέψεις διάνυσμα (δηλ με την έννοια του pointer, άρα έναν δείκτη σε μια φυσική διεύθυνση) από συνάρτηση, δηλαδή η συνάρτησή σου θα έχει πρωτότυπο κάτι σαν int * somefunc(args...), και γενικά void * somefunc(args...). Όμως αυτό απαιτεί να δεσμεύσεις μνήμη από το λειτουργικό δυναμικά, με χρήση {m,k, re}alloc(*), κάτι που είναι μια νορμάλ διαδικασία όταν έχεις να κάνεις με δείκτες - pointers. Επίσης, αν θέλεις να επιστρέψεις ολόκληρο πίνακα σαν δείκτη, μερικές φορές μπορείς να περάσεις κανονικά ένα στατικό πινακα είτε σαν όρισμα είτε σαν όρισμα στο return.

Δηλαδή: αν έχεις δηλώσει κάπου int something[10] = {1, 2, 3, ..., 10}; και έχεις μια συνάρτηση void dosomething(int *ptr); μπορείς να καλέσεις αυτήν με dosomething(something);. Κάνε σαφές στο μυαλό σου ότι αυτά είναι ταυτόσημα κατά μια έννοια, εφόσον αναφέρονται σε διευθύνσεις.

Επίσης πρέπει να μάθεις που να χρησιμοποιείς pointers και που όχι. Το ότι ξέρεις καλά pointers δε σημαίνει ότι πρέπει να τους κοτσάρεις παντού. Υπάρχουν πολλά coding standards, αλλά το επικρατέστερο είναι να περνάς pointer όταν θές πέρασμα δι αναφοράς (by reference) δηλαδή ότι αλλάξει μέσα στη συνάρτηση υπάρχει και μετά την κλήση. Κάτι που δεν συμβαίνει με απλές μεταβλητές καθώς είτε τις αλλάξεις είτε τις αφήσεις άθικτες μέσα στο σώμα της συνάρτησης παραμένουν όπως ήταν πριν την κλήση μόλις χαθεί το scope της συνάρτησης. Το πέρασμα απλών μεταβλητών λέγεται δια τιμής (by value) και συνήθως χρησιμεύει απλά για να περάσεις μια πληροφορία που είναι συνήθως χρήσιμη για το σώμα της συνάρτησης. Επίσης, μια που θα Linux-άρεις σε λίγο, θα δείς σε πολλά έργα κώδικα ένα άλλο πρότυπο: συγκεκριμένα το by value πέρασμα γίνεται με pointer με τη διαφορά ότι βάζεις και ένα const προσδιορισμό πριν τον τύπο του δείκτη. πχ void do(const int *seed);

Θα αλλάξω το παράδειγμά σου ώστε να επιστρέφεις με return ολόκληρο διάνυσμα που το δεσμεύεις δυναμικά, και το επιστρέφεις σαν έναν "αφηρημένο" δείκτη void (όπως πχ int, char κτλ) αντί να αλλάζεις την τιμή από μια void συνάρτηση.

κώδικας:

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

#define DIE(x) { printf("Error: %s\n", x); exit(1); }

// epistrefei panta 10 akeraious
void *retVector(const int *param) {
    int *numbers;
    int i;
   
    if(!param) return((void *)NULL);

    numbers = (int *)malloc(10 * sizeof(int));
    if(!numbers) {
          DIE("not enough memory");
    }

    for(i = 0; i < 9; i++)
      numbers[i] = i;

    *(numbers + 9) = *param;

    return((void *)numbers);
}

int main() {
   int *l;
   int i, param;
   
   param = 10;
   l = (int *)retVector((int *)&param);
   if(!l) {
      DIE("die die hard!");
   }   

   for(i = 0; i < 10; i++)
      printf("%d] number %d: %d\n", i, i, *(l + i));
   
   if(l) free(l);
   
   return 0;
}


Μια δυνατή εκδοχή του κώδικά σου αλλά με δυναμική δέσμευση και που συνδιάζεις μαζί πολλές άλλες μικρολεπτομέρειες με τους δείκτες.

Με gcc 3.4.6 στον σέρβερ ενός πελάτη έτρεξε κανονικά και έκανα compile με -Ο2 -pedantic -Wall χωρίς κανένα warning.

Θα δεις έξοδο:

κώδικας:

stressgr@stress.gr [~]# ./test
0] number 0: 0
1] number 1: 1
2] number 2: 2
3] number 3: 3
4] number 4: 4
5] number 5: 5
6] number 6: 6
7] number 7: 7
8] number 8: 8
9] number 9: 10

Last edited by soteres2002 on 14 Αυγ 2008 03:19, edited 2 times in total
ianni


Μέλος από: 11 Απρ 2006
Μηνύματα: 8
Περιοχή: rodos
View users profile Send email to user
ΜήνυμαΣτις: 14 Αυγ 2008 03:11    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

α φιλε soteres κατ αρχην ευχαριστω για την απαντηση.Απλα απ οτι καταλαβα πρεπει να μαθω να χρισοιμοποιω την malloc e?

πολυ ομορφα,σ ευχαριστω και παλι
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 14 Αυγ 2008 03:22    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Ναι αν θές να δουλεύεις με return πρέπει αναγκαστικά να χρησιμοποιήσεις malloc (αν θες να επιστρέψεις διάνυσμα), διότι άν έχεις τοπικά ένα στατικό διάνυσμα μέσα στην συνάρτηση, μετά την κλήση χάνονται όλες οι τοπικά δεσμευόμενες διευθύνσεις που έχουν περιορισμένη διάρκεια ζωής μόνο δηλαδή μέχρι πριν επιστρέψει η συνάρτηση, οπότε η δυναμική δέσμευση είναι ένας τρόπος να δεσμεύεις χώρο τον οποίον μπορούν να τον μεταχειριστούν άλλα κομμάτια κώδικα μετά την κλήση της συνάρτησης, και να τον ελευθερώσουν αν χρειαστεί. Όπως και στο παράδειγμά μου δλδ.

Επίσης, τσέκαρε και τα structs. Μπορείς να συγκεντρώσεις πληροφορία σε αυτές μέσα σε μια μεταβλητή και να επιστρέφεις απο συναρτήσεις κτλ κτλ.

Φίλε δούλεψε στριφνά παραδείγματα και προσπάθησε να μάθεις και να μιμηθείς το στύλ. Έτσι θα κάνεις καλό kick start σε αυτήν την γλώσσα. Με το να λύνεις απλά προβλήματα δεν θα λύνεις αυθόρμητα τα δικά σου σοβαρότερα προγραμματιστικά προβλήματα τόσο εύκολα. Πάρε κώδικα από μεγάλα projects και προσπάθησε να καταλάβεις παθητικά τι παίζει, αυτό διότι τα εγχειρίδια όσο καλογραμμένα και να είναι έχουν στην πραγματικότητα απλές αναφορές και δεν λένε πώς να χρησιμοποιήσεις τη γλώσσα στην πράξη και σου προσφέρουν μόνο γνώση και 0.1% εμπειρία. Λίγοι είναι αυτοί που φιλοσοφούν όταν γράφουν σε C μεγάλα projects, και είναι δύσκολο να το κάνεις γιατί χτίζεις από μηδενική βάση και πρέπει να χτήσεις κατάλληλα την εφαρμογή. Αν το θες θα γίνεις πολύ καλός C programmer στη συνέχεια, με συνεχόμενη προσπάθεια (όπως οι περισσότεροι κάθε μέρα), αν και σκοπός είναι να έχεις πολύπλευρη γνώση γύρω από τα συστήματα, αρχές σχεδίασης, κτλ και όχι targeted γνώση!
ianni


Μέλος από: 11 Απρ 2006
Μηνύματα: 8
Περιοχή: rodos
View users profile Send email to user
ΜήνυμαΣτις: 14 Αυγ 2008 12:42    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

να σαι καλα φιλε μου,ησουν κατατοπιστικοτατος,σ ευχαριστω πολυ
Erevis


Μέλος από: 12 Ιουν 2008
Μηνύματα: 56
Περιοχή: Χαλάνδρι
View users profile
ΜήνυμαΣτις: 19 Σεπ 2008 14:25    Θέμα: Re: βοηθεια για επιτροφη πινακα απο συναρτηση σε γλωσσα C Απάντηση με παράθεση  Mark this post and the followings unread

ianni ανέφερε:

C[i] = B[i]++; //apothikevo s enan pinaka tis times tou pinaka A afksanomenes kata 1


Άσχετο με το γενικό πνεύμα του post αλλά μικρή διόρθωση γιατί λογικά θα το ξαναχρησιμοποιήσεις μελλοντικά,

έχω την εντύπωση πως λόγω της πρωτεραιότητας των τελεστών πρώτα χαταχωρείται ο Β[i] στο C[i] και μετά αυξάνεται κατά 1, οπότε καλύερα να το γράψεις:

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


Σχετικά θέματα
 Θέματα   Απ/σεις   Αποστολέας   Τελευταίο μήνυμα 
δεικτης λιστας σε συναρτηση 1 poniroz 22 Μαη 2016 13:41
gvre Εμφάνιση τελευταίου μηνύματος
Συνδεση πινακα με λιστα στην c++ 9 pol2005 06 Μαη 2015 20:39
pol2005 Εμφάνιση τελευταίου μηνύματος
 
Τώρα είναι 24 Μαρ 2017 17: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