Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Ho scritto questo piccolo programmino ma vi sono degli errori che non riesco ad interpretare!
il file punto.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h>#include <stdlib.h> /*definizione dell'oggetto punto, rapresentante un punto bidimensionale *in un sistema di coordinate cartesiane x=ascisse, y=ordinate.*/ typedef struct punto { int x; int y; } pun; /*cnf confronta 2 punti, restituisce livello logico alto *se il punto "a" coincide con il punto "b", livello *logico baso se non coincidono.*/ typedef enum boolean{FALSE = 0, TRUE = 1}boolean; /*definizione del tipo booleano*/ boolean cnf(pun *a, pun *b) { boolean ris; if(a->x == b->x && a->y == b->y) return ris=TRUE; else return ris=FALSE; } /*stmp stampa a video un punto di coordinate x,y*/ #define gotoxy(x,y) printf("%c[%d;%df",0x1B,y,x) /*macro posizionamento carrello*/ void stmp(pun p) { gotoxy(p.x,p.y); printf("·"); }
|
il file provapunto.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include "punto.c" int main(void){ pun p1,p2; p1.x=5; p1.y=5; p2.x=8; p2.y=8; if( FALSE == cnf(&p1,&p2)) printf("i due punti sono diversi"); else printf("i due punti sono uguali"); stmp(p1); stmp(p2); return 0; }
|
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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
Non si includono i sorgenti .c
Elimina quella linea
#include "punto.c"
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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!
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Ora mi trovo in una situazione del tipo:
main.c
Codice sorgente - presumibilmente C++ |
#include "punto.h" int main(void){ pun point; char car = (int)"·"; /*overflow ; '·'(int)=249>127 ; char=1byte=8bit ; 2^8=256 ; signed 256/2=128 ; zero 127*/ point.x=5; point.y=8; stmp(&point, &car); }
|
punto.h
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> typedef struct punto { int x; int y; } pun; #define gotoxy(x,y) printf("%c[%d;%df",0x1B,y,x) /*macro posizionamento carrello*/ void stmp(pun *p, char *c) { gotoxy(p->x,p->y); printf("%c ", *c); 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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
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" ?
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.
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.
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 ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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.
|
|