Δημοσιεύτηκε: 17 Μαρ 2012, 15:28
από Ilias95
Λοιπόν τον παραπάνω κώδικα τον βρήκα απ' το βιβλίο του King. (σελ. 269)

migf1 έγραψε:Το p σε αυτή την περίπτωση είναι πίνακας από δείκτες ακεραίων (array of integer pointers). Δηλαδή το κάθε στοιχείο του p είναι: (int *). Επί της ουσίας το κάθε στοιχείο του p έχει τη δυναμική να δείχνει σε έναν πίνακα από int, που στο συγκεκριμένο παράδειγμα (με το loop) είναι μια σειρά (γραμμή) του a.

Τώρα με μπέρδεψες εντελώς. :D

Ο King λέει:
King έγραψε:I' ve declared p o be a pointer to an array of length NUM_COLS whose elements are integers. The parenthesis around *p in (*p)[NUM_COLS] are required; without them, the compiler ould treat p as an array of pointers instead of a pointer an array.

Άλλο πράγμα δεν λες εσύ και άλλο δεν λέει ο King; Η ξέχασα τα Αγγλικά που ήξερα; :problem:

migf1 έγραψε: Πρέπει όμως νομίζω να το ορίσεις με NUM_ROWS αντί για NUM_COLS...

Αν κάνω τον πίνακα 4x3, έτσι όπως είναι πάλι θα δουλέψει:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

#define NUM_ROWS 4
#define NUM_COLS 3

int main( void )
{
int a[NUM_ROWS][NUM_COLS] = {{1, 2, 3}, {4, 5, 6}, {7, 12, 14}, {23, 43, 54}};
int (*p)[NUM_COLS], i = 1, *x;

for (p = &a[0]; p < &a[NUM_ROWS]; p++)
(*p)[i] = 0;

// print array
for (x = a[0]; x <= &a[NUM_ROWS-1][NUM_COLS-1]; x++)
printf("%d ", *x);

return 0;
}

Αν όμως αλλάξω το (*p)[NUM_COLS] σε (*p)[NUM_ROWS]:
Κώδικας: Επιλογή όλων
gcc -W -Wextra -Wall -std=c99 -o "pun" "pun.c"
pun.c: In function ‘main’:
pun.c:11:12: προειδοποίηση: assignment from incompatible pointer type [enabled by default]
pun.c:11:23: προειδοποίηση: comparison of distinct pointer types lacks a cast [enabled by default]

Και αυτό που θα εκτυπωθεί τελικά δεν θα είναι σωστό.

migf1 έγραψε:ΥΓ. Επίσης, στο print-loop, πρέπει να είναι: for ( x = &a[0]; ...

Έτσι όπως είναι τώρα δουλεύει κανονικά.
Αν το κάνω "for ( x = &a[0]; ..." πάλι θα εκτυπωθεί το σωστό αποτέλεσμα όμως θα πάρω κατά το compile:
Κώδικας: Επιλογή όλων
pun.c:15:12: προειδοποίηση: assignment from incompatible pointer type [enabled by default]

Γιατί αυτό;

Ευχαριστώ.
ΥΓ. Δεν είδα ακόμα το τελευταίο σου post.