Δημοσιεύτηκε: 05 Απρ 2012, 11:19
stamatiou έγραψε:
Πήγα να κάνω μια υλοποίηση σε συνάρτηση αλλά κάποια χαζομάρα έχω κάνει με τους δείκτες:
- Κώδικας: Επιλογή όλων
#include <stdio.h>
int store_buffer(long int **buffer, long int n) {
FILE *input = fopen("operators.in","r");
int i;
for(i = 0; i < n; i++)
fscanf(input,"%ld",&(*buffer)[i]);
return 0;
}
int main(void) {
long int array[5],n;
FILE *input = fopen("operators.in","r");
fscanf(input,"%ld",&n);
store_buffer(&array,n);
for(n = 0; n < 5; n++)
printf("%ld",array[n]);
return 0;
}
Τι του λέω να κάνει και μου βγάζει ο compiler:
- Κώδικας: Επιλογή όλων
basic.c:15: warning: passing argument 1 of ‘store_buffer’ from incompatible pointer type
basic.c:3: note: expected ‘long int **’ but argument is of type ‘long int (*)[5]’
Το πρόβλημα εδώ είναι πως όταν ορίζεις έναν πίνακα στατικά (δηλαδή ορίζοντας εξαρχής το μέγιστο πλήθος στοιχείων του, το μέγιστο μήκος του, στη main()) δεν μπορείς μετά στις συναρτήσεις να δηλώνεις τη διεύθυνσή του ως διπλό δείκτη, θα πρέπει να την δηλώνεις ως δείκτη σε πίνακα.
Αυτό δείχνει κι ο compiler, πως η συνάρτηση περιμένει έναν ** αλλά της περνάς έναν (*)[5]. Άλλαξε τη δήλωση του ορίσματος από...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
int store_buffer(long int **buffer, long int n)...
σε...
- Μορφοποιημένος Κώδικας: Επιλογή όλων
-
int store_buffer(long int *buffer[5], long int n)...
και θα είσαι ok
ΥΓ. Τις παλιές μέρες, επί K&R μπορούσες να τα δηλώνεις και ως διπλούς δείκτες, από ANSI και μετά καταργήθηκε.