Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 24 Ιουν 2012, 22:28

Παιδια εγω μπερδευτηκα. Καποιοι το κανουν [][] , αλλοι ** και αλλοι *argv[] . Θα ηθελα να πιστεψω οτι ειναι το ιδιο πραγμα αλλα αν int array[] τοτε δεν μπορω να κανω αριθμιτικη δεικτων, αρα δεν μπορει να θεωρηθει int *array . Αν καποιος το εχει ξεκαθαρισει στα σιγουρα ας διαφωτισει λιγο το θεμα .
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 00:03

Σημασία έχει ο ορισμός και όχι η δήλωση. Οπότε αν ο ορισμός υποδεικνύει char ** για το 2ο όρισμα της main() η αριθμητική δεικτών είναι εφικτή (αυτό νομίζω ισχύει, απλώς δεν ειμαι 100% σίγουρος και ψιλοβαριέμαι τώρα να το τεατάρω σε πρόγραμμα).

Αν ήταν ορισμένο ως στατικός πίνακας θα έπρεπε να δηλώνουμε και το πλάτος του στη δήλωση της main() ... κάτι που φυσικά δεν κάνουμε.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 25 Ιουν 2012, 09:37

Μπορει να μην γινεται ξεκαθαρο απο το παραπανω μηνυμα μου αλλα κι εγω στον ορισμο κολλαω . Στον τροπο με τον οποιο το οριζει ο τυπας στο παραδειγμα που παραθετει ο stamatiou. Δεν το οριζει ως **argv διοτι οπως σωστα αναφερεις , δεν θα υπηρχε προβλημα με αριθμιτικη δεικτων, αλλα ως *argv[] .
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 10:29

g1wrg0s έγραψε:Μπορει να μην γινεται ξεκαθαρο απο το παραπανω μηνυμα μου αλλα κι εγω στον ορισμο κολλαω . Στον τροπο με τον οποιο το οριζει ο τυπας στο παραδειγμα που παραθετει ο stamatiou. Δεν το οριζει ως **argv διοτι οπως σωστα αναφερεις , δεν θα υπηρχε προβλημα με αριθμιτικη δεικτων, αλλα ως *argv[] .


Εννοούσα τον ορισμό του στη c-runtime βιβλιοθήκη. Όταν είναι ορισμένο ως char ** τότε μπορεί μετά να δηλωθεί στις συναρτήσεις είτε έτσι, είτε ως char *[] είτε ως char [][].
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 10:47

Λοιπόν, έκανα μόλις ένα γρήγορο τεστ και φαίνεται πως ισχύει ότι έχω γράψει, λογικά είναι ορισμένο ως char **.

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

/*********************************************//**
*
*************************************************
*/
int main( int argc, char **argv )
{
while ( *argv )
puts( *(argv++) );

exit( 0 );
}


Έξοδος (σε Windows) ...

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

> gcc aaa.c -o aaa.exe

> aaa 1 2 3 4 5
aaa
1
2
3
4
5

>


EDIT:

Όπως και να το δηλώσετε στη λίστα παραμέτρων της main() δουλέυει κανονικά (επειδή ο αρχικός ορισμός του είναι λογικά char **).
Τελευταία επεξεργασία από migf1 και 25 Ιουν 2012, 11:10, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 10:59

Και μιας και το αναφέραμε, θυμηθείτε πως ακόμα και στατικά ορισμένους πίνακες αν τους περάσουμε ως όρισμα σε συνάρτηση τότε μπορούμε να κάνουμε αριθμητική δεικτών πάνω τους...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

/*********************************************//**
*
*************************************************
*/
void foo( const int array[] )
{
while ( -1 != *array )
printf( "%d\n", *array++ );

return;
}

/*********************************************//**
*
*************************************************
*/
int main( void )
{
int array[] = { 1, 10, 100, 1000, -1 };

#if 1 // this works fine
foo( array );

#else // this does not compile (or if it compiles it gives seg-fault)
while ( -1 != *array )
printf( "%d\n", *array++ );
#endif

exit( 0 );
}

Αντικατατήστε το #if 1 με #if 0 για να δείτε πως όταν το επιχειρούμε απευθείας, δεν δουλεύει.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 25 Ιουν 2012, 11:24

Και η foo ενα στατικο δεν δημιουργει κανοντας κοπια στα στοιχεια του πινακα της main; Οποτε γιατι να επιτρεπεται αριθμιτικη δεικτων;
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 11:41

g1wrg0s έγραψε:Και η foo ενα στατικο δεν δημιουργει κανοντας κοπια στα στοιχεια του πινακα της main; Οποτε γιατι να επιτρεπεται αριθμιτικη δεικτων;

Όχι, όπως σε όλες τις συναρτήσεις έτσι και στη foo() ο compiler μετατρέπει οποιονδήποτε στατικό 1-διάστατο πίνακα υπάρχει στη λίστα παραμέτρων σε δείκτη. Όταν είναι 2-διάστατος στατικός πίνακας, τοτε πρέπει να ξέρει και το πλάτος του.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό g1wrg0s » 25 Ιουν 2012, 11:49

Δηλαδη foo(int array[]) ειναι ακριβως το ιδιο με το foo(int *array);
Για 2D : foo(int array[][2]) ειναι ακριβως το ιδιο με το foo(int **array);
Spoiler: show
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Πρώτα βήματα ┃ Αγγλικών: Πρώτα βήματα
2 Ubuntu 12.10 quantal 3.10.20-031020-generic 32bit (el_GR.UTF-8, Unity ubuntu), Windows 8
3 Intel Core i5-3230M CPU @ 2.60GHz ‖ RAM 7923 MiB ‖ Acer VA50_HC_CR - Acer Aspire V3-571G
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915} ⋮ nVidia Device [10de:0fe1] {}
5 eth0: Broadcom NetLink BCM57785 Gigabit Ethernet PCIe [14e4:16b5] (rev 10) ⋮ wlan0: Atheros Inc. AR9462 Wireless Network Adapter [168c:0034] (rev 01)
g1wrg0s
punkTUX
punkTUX
 
Δημοσιεύσεις: 196
Εγγραφή: 26 Μάιος 2012, 10:29
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Ιουν 2012, 11:59

g1wrg0s έγραψε:Δηλαδη foo(int array[]) ειναι ακριβως το ιδιο με το foo(int *array);
Για 2D : foo(int array[][2]) ειναι ακριβως το ιδιο με το foo(int **array);

To 1o ναι, το 2ο όχι.

Για το 2ο ισχύει σχεδόν το ανάποδο, δλδ το ορισμένο int ** μπορεί να δηλωθεί αργότερα ως int [][] ή ως int *[]... αλλά το ορισμένο int [x][2] μπορεί αργότερα να δηλώθεί είτε ως int [χ][2] ε'ιτε ως int [][2] είτε ως int *[2] (δηλαδή πρέπει το πλάτος του να δηλώνεται πάντα)

Όταν βρεις λίγο χρόνο, ρίξε μια ματιά από αυτό εδώ το ποστ και κατώ (για 1-2 σελίδες): http://www.insomnia.gr/topic/437533-%CE ... e__st__230.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι