Newsgroup: it.comp.lang.c
Titolo: Strutture, funzioni e puntatori

data la seguente struttura:
typedef struct
 {
  float x;
  float y;
 } Punto;
1. dichiara un array di 5 punti di nome pentagono;
2. dichiara una procedura che dato l'indirizzo di una variabile dello stesso
tipo di pentagono
    permette all'utente di inserire i valori delle coordinate dei punti;
----------------------------------------------------------------------------
-----------------
io ho iniziato cosě:
void inserisci_pentagono(Punto *p1);
int main(void)
{
    Punto pentagono[4];
    Punto *p1;
    p1 = &pentagono[0];
    inserisci_pentagono(p1);
    getchar();
}
void inserisci_pentagono(Punto *p1)
{
     printf("Inserisci x1: ");
     scanf("%f2", &p1->x);
     printf("Inserisci y1: ");
     scanf("%f2", &p1->y);
}
Il problema nasce ora che devo accedere a pentagono[1], per inserire i
secondi punti.
Ho provato anche con un cliclo dove al posto di 1 c'era i (pentagono[i]), ma
nulla da fare.
Grazie delle risposte.
Ciao
Morpheus

Se vuoi implementare una funzione e passare un puntatore ti basta fare 
cosi':
void stampa_punto(Punto *p1)
{
      printf("x: %f",&p1->x);
      printf("y1: %f",&p1->y);
}
e la richiami in questo modo:
for(i=0; i<=4; i++)
stampa_punto(&pentagono[i]);
Cmq se ci fai caso il tuo main non prende tutti e 5 i punti di un pentagono.
Potresti farlo cosi':
for(i=0; i<=4; i++)
inserisci_pentagono(&pentagono[i]);
PS:
l'array di strutture devi dichiararlo di 5 se vuoi memorizzare i puti di 
un esagono:
int main(void)
{
     Punto pentagono[5];
4 sono gli indici che puoi utilizzare su quel vettore.

 4 sono gli indici che puoi utilizzare su quel vettore.
Perchè sono 4 ?
1) pentagono[0];
2) pentagono[1];
3) pentagono[2];
4) pentagono[3];
5) pentagono[4];
Ciao e grazie
Morpheus

 secondi punti.
A parte l'uso delle scanf() che è sempre da evitare, dovresti usare:
for (i=0; i<5; i++)
  inserisci_pentagono(&pentagono[i]);
E comunque io definirei un tipo pentagono e alla funzione
inserisci_pentagono passerei, appunto, un pentagono:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
    double x;
    double y;    
} punto_t, *ppunto_t;
typedef punto_t pentagono_t[5];
void insert_punto(ppunto_t p)
{
     char xs[16], ys[16];
     printf("x: "); fgets(xs, sizeof xs, stdin);
     printf("y: "); fgets(ys, sizeof ys, stdin);
     p->x=atof(xs);
     p->y=atof(ys);
}
void write_punto(punto_t p)
{
     printf("(x:%5.2f;%5.2f)", p.x, p.y);
}
void insert_pentagono(pentagono_t p)
{
     int i;
     printf("pentagono:\n");
     for (i=0; i<5; i++) {
        printf("p(%d) = \n", i);
        insert_punto(&p[i]);
     }
}
void write_pentagono(pentagono_t p)
{
     int i;
     printf("pentagono = {");
     for (i=0; i<5; i++) {
        write_punto(p[i]);
        if (i<4) printf(";");
     }
     printf("}\n");
}
int main()
{
    pentagono_t p;
 
    insert_pentagono(&p);
    write_pentagono(p);
    return 0;
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 typedef punto_t pentagono_t[5];
Io scriverei:
struct pentagono {
        punto_t v[5];
};
cosi` si delega al compilatore parte della responsabilita` di non
passare argomenti sballati alla funzione.
Luca
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

 };
Era la mia prima scelta ;-)



Anch'io avevo provato con un ciclo:
int main(void)
{
    int i;
    Punto pentagono[4];
    for(i=0;i<5;i++)
    {
     Punto *p[i];
     p[i] = &pentagono[i];
     inserisci_pentagono(p);
    }
    getchar();
}
Ma mi riporta il solito errore di windows ( si è verificato un
errore.....vuoi inviare o no).
Grazie della spiegazione Andrea.
Ciao e buon lavoro.
Morpheus

      Punto *p[i];
^^^^^^^^^^^^^^^^^^^
che cos'è questo mostro ? non serve a nulla. 


 
Credo che tu abbia le idee un po' confuse sugli array. Per dichiarare un
array di 5 elementi devi mettere 5 come dimensione. Poi gli elementi sono
numerati da 0 a 4:
int a[5];   // array di 5 interi i cui elementi sono a[0],...,a[4]
ciao domenico


Ma scusa pentagono[4] non è;
1) pentagono[0];
2) pentagono[1];
3) pentagono[2];
4) pentagono[3];
5) pentagono[4];
Comincio ad essere un pò confuso.
Ciao
Morpheus

 5) pentagono[4];
No. e' un array di 4 elementi che saranno numerati 0,1,2,3.
In generale:
int Pippo[XXXX];
dichiara un array di XXXX elementi. Questi elementi, come
e' consuetudine in C saranno numerati a partire dallo 0,
e quindi saranno Pippo[0], Pippo[1],....,Pippo[XXXX - 1]
(Questa e' una cosa fondamentale da sapere!)
ciao,
g.

 5) pentagono[4];
No. pentagono[4] č penatgono[0],...,pentagono[3]
ciao domenico

 Serve a dimostrare la tua superiorita` :-(
Taci, coglione.


 >
Avete pienamente ragione, scusate ma ho risposto senza collegare il cervello
alle mani.
Grazie della pazienza.
Ciao.
Morpheus

 Ma scusa pentagono[4] non è;
<snip>
No.
Una cosa è la quantità, una cosa è la numerazione.
Ciò che scrivi tra parentesi durante la dichiarazione di una array è la
quantità di elementi.  Ciò che scrivi tra parentesi durante l'utilizzo
dell'array è l'indice di ogni elemento.  
Dichiarare:
int a[4]; 
significa dire: "a è un array di 4 interi".
Scrivere a[0] significa ottenere l'elemento con indice 0, ovvero il primo.
La numerazione inizia da 0, quindi l'ultimo indice è 4-1=3.
L'array a contiene 4 elementi indicizzati da 0 a 3.


 pentagono[4], ma ho pensato male o no ?
Si. In C un array a[D] ha D posti:
    a[0] a[1] a[2] a[3] .... a[D-1]
Il "posto" a[D] si trova fuori del array. La dimensione "D"  è il
*numero* dei posti  0.1,2,3,..,D-1
-- 
Horst

 alle mani.
In realtà, dal mio punto di vista, una confusione del genere è
giustificabile.
Altri linguaggi (vedi il Pascal) hanno un approccio migliore, infatti la
sintassi di una dichiarazione è diversa da quella di utilizzo e ti
consente di specificare gli indici di partenza e fine.  In Pascal, puoi
scrivere:
var 
  a: array [1..4] of Integer;
Più chiaro di così si muore ;-)


 Più chiaro di così si muore ;-)
In realtà in Pascal è chiarissimo, come hai detto tu, ma il problema è che
fino ad oggi ho sempre ragionato così a[5] --> 5 posti da 0-4,  non sò
perchè in sti 2 giorni sono così fuso.
Meno male che siete pazienti, se no mi avreste già mandato a quel paese da
mò !!!
Grazie ancora.
Ciao a tutti
Morpheus

 
Tacero` quando smetterai di insultare.


 Tacero` quando smetterai di insultare.
Fai bene a non scrivere cazzate di seguito ai miei messaggi, perché
altrimenti ti copro di merda fino ai capelli.


 
Da te me lo aspetto, piu` che merda un presuntuoso come te non sa fare.
Tacero` quando smetterai di insultare.


 Tacero` quando smetterai di insultare.
Forse non te ne sei accorto, ma io, del "coglione", lo dico solo a te.
Forse dovresti cominciare a chiederti il perché, imbecille.
Evita di provocare e la gente non ti insulterà, deficiente che non sei
altro.


 
Tacero` quando smetterai di insultare.
