Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - struct punto e sue funzioni
Forum - C/C++ - struct punto e sue funzioni

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 11:57
Domenica, 19/02/2012
Ho scritto questo piccolo programmino ma vi sono degli errori che non riesco ad interpretare!

il file punto.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>#include <stdlib.h>
  2.  
  3. /*definizione dell'oggetto punto, rapresentante un punto bidimensionale
  4. *in un sistema di coordinate cartesiane x=ascisse, y=ordinate.*/
  5. typedef struct punto { int x; int y; } pun;
  6.  
  7.  
  8. /*cnf confronta 2 punti, restituisce livello logico alto
  9. *se il punto "a" coincide con il punto "b", livello
  10. *logico baso se non coincidono.*/
  11. typedef enum boolean{FALSE = 0, TRUE = 1}boolean;    /*definizione del tipo booleano*/
  12. boolean cnf(pun *a, pun *b)
  13. {
  14.     boolean ris;
  15.     if(a->x == b->x && a->y == b->y) return ris=TRUE;
  16.     else return ris=FALSE;    
  17. }
  18.  
  19.  
  20. /*stmp stampa a video un punto di coordinate x,y*/
  21. #define gotoxy(x,y) printf("%c[%d;%df",0x1B,y,x)    /*macro posizionamento carrello*/
  22. void stmp(pun p)
  23. {
  24.     gotoxy(p.x,p.y);
  25.     printf("·");
  26. }



il file provapunto.c
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "punto.c"
  4.  
  5. int main(void){
  6.  
  7. pun p1,p2;
  8.  
  9.     p1.x=5;
  10.     p1.y=5;
  11.     p2.x=8;
  12.     p2.y=8;
  13.  
  14.     if( FALSE == cnf(&p1,&p2)) printf("i due punti sono diversi");
  15.     else printf("i due punti sono uguali");
  16.  
  17.     stmp(p1);
  18.     stmp(p2);
  19.  
  20.     return 0;
  21. }



messaggio d'errore
PC:~/Documenti/C$ cc punto.c provapunto.c -o
provapunto/tmp/ccqE7Phn.o: In function `cnf':
provapunto.c:(.text+0x0): multiple definition of `cnf'
/tmp/ccVqwJMu.o:punto.c:(.text+0x0): first defined here
/tmp/ccqE7Phn.o: In function `stmp':
provapunto.c:(.text+0x3c): multiple definition of `stmp'
/tmp/ccVqwJMu.o:punto.c:(.text+0x3c): first defined here
collect2: ld returned 1 exit status

Ultima modifica effettuata da Dante.cpp il 19/02/2012 alle 11:59
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:48
Domenica, 19/02/2012
Non si includono i sorgenti .c

Elimina quella linea

#include "punto.c"


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 20:32
Domenica, 19/02/2012
ho risolto facendolo diventare un header punto.h, se ben ho capito il problema, il compilatore si trovava davanti due volte lo stesso codice, una volta per il linkagio e uno per l'inclusione!

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:44
Domenica, 19/02/2012
Sì ... ma non devi farlo diventare un .h

Devi creare un progetto e aggiungere i due file .c


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 1:40
Lunedì, 20/02/2012
Ora mi trovo in una situazione del tipo:
main.c
Codice sorgente - presumibilmente C++

  1. #include "punto.h"
  2. int main(void){
  3. pun point;
  4. char car = (int)"·";        /*overflow ; '·'(int)=249>127 ; char=1byte=8bit ; 2^8=256 ; signed 256/2=128 ;                                                                                  zero 127*/
  5. point.x=5;
  6. point.y=8;
  7. stmp(&point, &car);
  8. }



punto.h
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct punto { int x; int y; } pun;
  4. #define gotoxy(x,y) printf("%c[%d;%df",0x1B,y,x)        /*macro posizionamento carrello*/
  5. void stmp(pun *p, char *c)
  6. {
  7.         gotoxy(p->x,p->y);
  8.         printf("%c ", *c);
  9.         printf("\n");



compilazione:
$ cc main.c -o main      ;tutto liscio;

$ ./main
anziché esserci il carattere '·', v'è, '>';

se come da mia analisi; il problema è l'overflow aritmetico che nasce dal voler mettere il carattere '·', in un contenitore incapace di contenerlo; come posso risolvere ? Altrimenti qual'è il problema?  

Ultima modifica effettuata da Dante.cpp il 20/02/2012 alle 1:48
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:06
Lunedì, 20/02/2012
No, l'overflow non c'entra nulla (e non esiste). Il problema è che devi scrivere

char car = '·';

con i singoli apici non con le virgolette.

E potrebbe non bastare perché il carattere visualizzato in console dipende dal "code page". Quindi, ti suggerisco di scrivere, ad esempio

char car = 0xb8;

e modificare quel 0xb8 finché non trovi il carattere che ti interessa.

Infine, insisto sul fatto che utilizzi male gli include. Se ti interessa saperlo, in C non si scrive codice all'interno dei file include, ma solamente dichiarazioni di tipi, funzioni ...

Il codice si scrive solo in file .c che vanno compilati tutti insieme indicandolo nella linea di comando.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 12:37
Lunedì, 20/02/2012
Capisco, quindi li header definiti dal programmatore sono stati introdotti con il c++, provvederò. Tornando al problema del char se utilizzo i due apici singoli '' il compilatore mi d'ha errore, inoltre il cast (int), m'è stato richiesto da un avvertimento in compilazione, il warn diceva che se non forzavo l'assegnazione avrebbe restituito un puntatore ad intero, o qualcosa del genere.
Il numero hex 0xb8 in decimale è 184, posso sapere perché assegnare tale valore?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:17
Lunedì, 20/02/2012
Testo quotato

Postato originariamente da Dante.cpp:

Capisco, quindi li header definiti dal programmatore sono stati introdotti con il c++, provvederò.



Non ho capito cosa intendi con questa frase. Il C++ non c'entra nulla.

Che intendi con "Gli header definiti dal programmatore" ?

Testo quotato

Tornando al problema del char se utilizzo i due apici singoli '' il compilatore mi d'ha errore



Dante ... "d'ha" non esiste in nessuna lingua, ti prego, un minimo di attenzione all'italiano ... il verbo è dare, non avere ... dà

Quale errore ti dà? Scrivi il messaggio completo.

Testo quotato

inoltre il cast (int), m'è stato richiesto da un avvertimento in compilazione, il warn diceva che se non forzavo l'assegnazione avrebbe restituito un puntatore ad intero, o qualcosa del genere.



Non andare a caso ... le virgolette doppie sono sbagliate. Se utilizzi un modo sbagliato in partenza, non fare caso ai messaggi che avrai ...

Devi usare i singoli apici.

Testo quotato

Il numero hex 0xb8 in decimale è 184, posso sapere perché assegnare tale valore?



Era un esempio!

Ti ho detto che il codice ASCII del carattere che vuoi tu, dato che la visualizzazione dipende dalle impostazioni di sistema, la puoi trovare *provando* dei valori - ad esempio - come ti ho mostrato.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 14:28
Lunedì, 20/02/2012
ok, per header definiti dal programmatore intendo i file .h che non appartengono alle librerie standard. Sono dislessico perdonatemi se commetto qualche errore che sfugge al correttore, comunque farò più attenzione. Ora lavoro un po sulle info che mi hai dato per cercar di risolvere.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo