[C] Struct (esercizio di base)
La consegna:
L’immagine che ha dimensioni contenute nella struct img viene scalata per avere le dimensioni contenute nella struct img_new. Il punto p apparteneva all’immagine originale e le sue coordinate devono essere scalate in modo da essere riportato nella nuova immagine. Le formule per determinare le nuove coordinare del punto sono le seguenti:
$x_(New) = x_(old) * ((w_(imgNew))/(w_(imgOld)))$
$y_(New) = y_(old) * ((h_(imgNew))/(h_(imgOld)))$
La funzione accetta come parametri un puntatore a una struct punto da scalare, un puntatore a una struct immagine contenente le dimensione dell'immagine originale e un altro puntatore a una struct immagine contenente le dimensioni della nuova immagine. La funzione deve aggiornare le coordinate del punto puntato dal primo parametro (arrotondando
all’intero più vicino, 0.5 per eccesso) e ritornare 0 in caso di successo. Se uno dei tre parametri è NULL o se il punto passato non fa parte dell’immagine originale, la funzione deve ritornare -1 e non modificare nulla.
Questo è il mio main.c
questo è il mio file.h:
questo è il mio file.c
credo di essere abbastanza sicuro che il codice sia giusto, però non fa quello che la consegna vuole. Non capisco per quale motivo. Qualcuno sa dove sbaglio?
L’immagine che ha dimensioni contenute nella struct img viene scalata per avere le dimensioni contenute nella struct img_new. Il punto p apparteneva all’immagine originale e le sue coordinate devono essere scalate in modo da essere riportato nella nuova immagine. Le formule per determinare le nuove coordinare del punto sono le seguenti:
$x_(New) = x_(old) * ((w_(imgNew))/(w_(imgOld)))$
$y_(New) = y_(old) * ((h_(imgNew))/(h_(imgOld)))$
La funzione accetta come parametri un puntatore a una struct punto da scalare, un puntatore a una struct immagine contenente le dimensione dell'immagine originale e un altro puntatore a una struct immagine contenente le dimensioni della nuova immagine. La funzione deve aggiornare le coordinate del punto puntato dal primo parametro (arrotondando
all’intero più vicino, 0.5 per eccesso) e ritornare 0 in caso di successo. Se uno dei tre parametri è NULL o se il punto passato non fa parte dell’immagine originale, la funzione deve ritornare -1 e non modificare nulla.
Questo è il mio main.c
#include "punto.h" int main(){ struct punto p = { 3, 4 }; struct immagine img = { 1, 2 }; struct immagine img_new = { 7, 8 }; int ris = scala_punto(&p, &img, &img_new); return 0; }
questo è il mio file.h:
#if !defined PUNTO_H #define PUNTO_H #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct immagine { size_t w, h; }; struct punto { size_t x, y; }; extern int scala_punto(struct punto *p, const struct immagine *img, const struct immagine *img_new); #endif
questo è il mio file.c
#include"punto.h" int scala_punto(struct punto *p, const struct immagine *img, const struct immagine *img_new){ if (p == NULL || img == NULL || img_new == NULL){ return -1; } struct punto ris; ris.x = p->x * ((img_new->w) / (img->w)); ris.y = p->y * ((img_new->h) / (img->h)); return 0; }
credo di essere abbastanza sicuro che il codice sia giusto, però non fa quello che la consegna vuole. Non capisco per quale motivo. Qualcuno sa dove sbaglio?
Risposte
Nel file .c non aggiorni il punto passato alla funzione, ma crei un nuovo punto chiamato ris di cui non rimane nessuna traccia una volta terminata la funzione.
Stando alla traccia inoltre non tieni conto né dell'arrotondamento né di controllare se il punto è interno all'img originale.
Stando alla traccia inoltre non tieni conto né dell'arrotondamento né di controllare se il punto è interno all'img originale.