Oppure

Loading
19/02/12 10:57
Dante.cpp
Ho scritto questo piccolo programmino ma vi sono degli errori che non riesco ad interpretare!

il file punto.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
#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 19/02/12 10:59
aaa
19/02/12 11:48
nessuno
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à.
19/02/12 19:32
Dante.cpp
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!
aaa
19/02/12 19:44
nessuno
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à.
20/02/12 0:40
Dante.cpp
Ora mi trovo in una situazione del tipo:
main.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
#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 20/02/12 0:48
aaa
20/02/12 9:06
nessuno
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à.
20/02/12 11:37
Dante.cpp
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?
aaa
20/02/12 12:17
nessuno
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à.