|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
[C] porting windows-mac
Questo di seguito è il codice di un programma da me realizzato che su windows funziona, ma su mac no.
Cosa devo aggiustare per portarlo su Mac? Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEM 100 // Numero massimo di contatti
#define NCHAR 21 // Numero di caratteri per l'erray
// Definizione della struttura
typedef struct {
char nome[NCHAR];
char cognome[NCHAR];
char telefono[NCHAR];
char citta[NCHAR];
} account;
// Variabili globali
account rubrica[ELEM];
int num_account = 0;
// Prototipi delle funzioni
void InsContatto (char nom[], char cogn[], char tel[], char cit[]);
void ModContatto (char nom[], char cogn[]);
void Cancella (char nom[], char cogn[]);
void Visualizza (char nom[], char cogn[]);
int main()
{ //OPEN main
int scelta; /* per inserire la scelta del menu' */
char n[NCHAR]; /* per inserire il nome */
char m[NCHAR]; /* per inserire il cognome */
char c[NCHAR]; /* per inserire la citta' */
char t[NCHAR]; /* per inserire il numero di telefono */
for (;scelta!= 0;)
{ //OPEN for
printf ("Rubrica V 1.0\n\n");
printf ("\t\t INDEX\n");
printf ("\t***************************\n");
printf ("\t* 1 - Inserisci Contatto *\n");
printf ("\t* 2 - Modifica Contatto *\n");
printf ("\t* 3 - Cancella Contatto *\n");
printf ("\t* 4 - Visualizza Contatto *\n");
printf ("\t* *\n");
printf ("\t* 0 - Esci dal programma *\n");
printf ("\t***************************\n\n");
printf ("Digita: ");
scanf ("%d", &scelta);
switch (scelta)
{ //OPEN switch
case 0: // Exit
break;
case 1: // Inserisci contatto
printf ("\nNome: ");
fflush (stdin);
gets (n);
printf ("Cognome: ");
fflush (stdin);
gets (m);
printf ("Telefono: ");
fflush (stdin);
gets (t);
printf ("Citta': ");
fflush (stdin);
gets (c);
printf ("\n");
InsContatto(n,m,t,c);
break;
case 2: // Modifica Contatto
printf ("\nNome: ");
fflush (stdin);
gets (n);
printf ("Cognome: ");
fflush (stdin);
gets (m);
ModContatto (n,m);
break;
case 3: // Cancella
printf ("\nNome: ");
fflush (stdin);
gets (n);
printf ("Cognome: ");
fflush (stdin);
gets (m);
Cancella (n,m);
break;
case 4: // Visualizza
printf ("\nNome: ");
fflush (stdin);
gets (n);
printf ("Cognome: ");
fflush (stdin);
gets (m);
Visualizza (n,m);
break;
} //CLOSED switch
} //CLOSED for
return 0;
} //CLOSED main
// Definizione delle funzioni
void InsContatto (char nom[], char cogn[], char tel[], char cit[])
{ //OPEN InsContatto
int i;
if (num_account == ELEM)
{ //OPEN if
printf ("Hai raggiunto il limite massimo di contatti\n\n");
return;
} //CLOSED if
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
{ //OPEN if
printf ("Nome e Cognome utente esistono in memoria\n\n");
return;
} //CLOSED if
} //CLOSED for
strcpy (rubrica[num_account].nome,nom);
strcpy (rubrica[num_account].cognome,cogn);
strcpy (rubrica[num_account].telefono,tel);
strcpy (rubrica[num_account].citta,cit);
printf ("\nIl contatto e' stato inserito correttamente\n\n");
num_account++;
return;
} //CLOSED InsContatto
void ModContatto (char nom[], char cogn[])
{ //OPEN ModContatto
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
{ //OPEN if
printf ("Il contatto non esiste\n\n");
return;
} //CLOSED if
else
{ //OPEN else
printf("Nuovo Nome: ");
fflush (stdin);
gets (rubrica[i].nome);
printf("Nuovo Cognome: ");
fflush (stdin);
gets (rubrica[i].cognome);
printf("Nuovo Telefono: ");
fflush (stdin);
gets (rubrica[i].telefono);
printf("Nuova Citta': ");
fflush (stdin);
gets (rubrica[i].citta);
return;
} //CLOSED else
} //CLOSED for
} //CLOSED ModContatto
void Cancella (char nom[], char cogn[])
{ //OPEN cancella
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)!=0) && (strcmp (cogn,rubrica[i].cognome)!=0))
{ //OPEN if
printf ("Il contatto non esiste\n\n");
return;
} //CLOSED if
else
{ //OPEN else
rubrica[i].nome[0] ='\0';
rubrica[i].cognome[0] ='\0';
rubrica[i].telefono[0] ='\0';
rubrica[i].citta[0] ='\0';
printf ("\nContatto cancellato\n\n");
num_account--;
return;
} //CLOSED else
} //CLOSED for
} //CLOSED Cancella
void Visualizza (char nom[], char cogn[])
{ //OPEN Visualizza
int i;
for (i=0; i<=num_account; i++)
{ //OPEN for
if ((strcmp (nom,rubrica[i].nome)==0) && (strcmp (cogn,rubrica[i].cognome)==0))
{ //OPEN if
printf ("Il contatto scelto e': \n");
printf ("\n%s %s\n", rubrica[i].nome, rubrica[i].cognome);
printf ("%s\n%s\n\n", rubrica[i].telefono, rubrica[i].citta);
return;
} //CLOSED if
else
{ //OPEN else
printf ("Il contatto non esiste\n\n");
return;
} //CLOSED else
} //CLOSED for
} //CLOSED Visualizza
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Tutti i gets() sostituiscili con fgets(), tanto per cominciare. Fai conto che gets() non esista.
Poi, togli tutti i fflush(stdin), infine riprova. Se non risolve, spiegati meglio: in che senso "non funziona"? ciao
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
Mi spiego meglio. Quando avvio il programma dal mac la prima istruzione di ogni case, cioè il printf "nome" viene saltata e compare una cosa del genere a schermo nome: cognome: da qui in poi funziona regolarmente, ma ormai è andato via una cosa importante del programma.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
Questo è l'Hello World proposto in quella "guida", non propriamente conforme allo standard ANSI C: Codice:
#include <stdio.h>
main ()
{
printf("Hello World!");
}
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Inserisci sotto alla scanf e al posto di ogni fflush(stdin): while(getchar() != '\n'); Mi dai il link a questa guida ? |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2004
Città: Vicenza
Messaggi: 3832
|
Quote:
http://programmazione.html.it/guide/leggi/32/guida-c/ piuttosto se ne conosci una realizzata meglio me la suggeriresti? (preferirei materiale free)
__________________
PSN: raiden_it || Steam: id || |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ci sono alcune cose abbastanza inutili in quel codice: // Popolo la variabile daInserire printf (" NOME > "); scanf ("%s", nome); strcpy(daInserire.nome, nome); printf (" COGNOME > "); scanf ("%s", cognome); strcpy(daInserire.cognome, cognome); printf (" TELEFONO > "); scanf ("%s", telefono); strcpy(daInserire.telefono, telefono); printf (" EMAIL > "); scanf ("%s", email); strcpy(daInserire.email, email); printf (" SITOWEB > "); scanf ("%s", sitoweb); strcpy(daInserire.sitoweb, sitoweb); Che senso ha usare quelle variabili di appoggio ? Perché non leggere direttamente i membri della struttura ? Anzi, perché non scrivere direttamente le informazioni nel nodo allocato dinamicamente ? Ultima modifica di cionci : 13-01-2009 alle 11:02. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
L'istruzione scritta dopo la scanf risolve il problema del salto del printf "nome". Inserendo la stessa funzione prima di tutti i gets si attende un invio per far partire l'istruzione e questo rende il programma un pò troppo lento. Quindi l'ho levato e funziona comunque correttamente. Mi ero dimenticato una cosa invece. Su mac non mi fa dichiarare scelta come short int. Al momento del lancio del programma da terminale il programma parte già concluso.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Diciamo che quel ciclo fa la stessa funzione di fflush(stdin).
Comunque è strano, gets non dovrebbe prelevare lo '\n' dallo stdin...l'unica funzione di input che preleva lo '\n' è fgets. Edit: aspetta, lo devi inserire dopo gets, non prima Sostituisci SEMPRE gets e scanf("%s", xxx) con fgets. gets non permette di controllare che il numero di caratteri inseriti sia minore della dimensione dei buffer di lettura usati. http://www.cplusplus.com/reference/c...dio/fgets.html Ad esempio: char nome[50]; fgets(nome, 50, stdin); |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Assurdo
Codice:
int scelta; /* per inserire la scelta del menu' */ [cut] for (;scelta!= 0;) E' questo il motivo per cui ti esce, mah Inizializza scelta a 1: int scelta = 1; Per lo short, utilizza solo short: short scelta = 1; Ultima modifica di cionci : 13-01-2009 alle 11:20. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Cercavo il modo di contattare quelli di html.it per dirgli che la guida era inadeguata, ma non sono riuscito a sapere da dove sia possibile farlo
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
il while dopo fgets non cambia la cosa di prima. Sempre attende l'invio. E cmq così sembra funzionare correttamente l'inserimento da input.
Lo short pure risolto ^^ Ora però quando faccio visualizza non formatta più il testo come l'ho deciso io. Va a capo per la mia istruzione e poi di nuovo a capo. fgets magari non è compatibile con printf?! Per HTML.it prova a contattare l'amministratore del forum.
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il while lo devi usare con gets, ma non con fgets
fgets ripulisce già lo stdin (legge fino a '\n' compreso). fgets include lo \n all'interno della stringa. E' per quello che ti stampa strano. Scrivi una funzione: Codice:
int readString(char *buffer, int size)
{
fgets(buffer, size, stdin);
if(buffer[strlen(buffer)] - 1] == '\n')
{
//ho '\n' in fondo alla stringa, allora lo devo rimuovere
buffer[strlen(buffer)] - 1] = '\0';
return 0;
}
//ci sono ancora caratteri in stdin
return 1;
}
In questo programma, invece, se ci sono altri caratteri su stdin potresti tranquillamente svuotarlo: Codice:
void readString(char *buffer, int size)
{
fgets(buffer, size, stdin);
if(buffer[strlen(buffer)] - 1] == '\n')
{
//ho '\n' in fondo alla stringa, allora lo devo rimuovere
buffer[strlen(buffer)] - 1] = '\0';
}
else
{
while(getchar() != '\n');
}
}
Ultima modifica di cionci : 13-01-2009 alle 11:59. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Quote:
Invece visto che ci siamo ne chiedo un'altra. Per pulire lo schermo si usa system ("clear"); // per unix system ("cls"); // per windows Ma dove le vado a mettere nel programma per farmi visualizzare sempre il meno all'uscita dal break. Mi conviene fare un ciclo in cui schiacciando un tasto si pulisce?
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
|
#17 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Inserisci readString(nome, NCHAR); dove nel codice iniziale c'è gets Quote:
|
||
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Messina
Messaggi: 991
|
Ho semplicemente sbagliato a scrivere.
Vorrei visualizzare sempre solo il menù all'uscita dei vari case, quindi dopo il break intendendoci. Cioè si dovrebbe pulire lo schermo e rimanere sempre come prima cosa il menù. Le istruzioni per pulire lo schermo che ho trovato sono quelle, ma non riesco a cogliere la giusta posizione per ottenere ciò che io desidero. Per le funzioni al più presto faccio
__________________
PC/HTPC: Mac Mini 3,1 late 2009 | My Book Studio 2TB | LG M237WD monitor/tv | Logitech Z4 | Apple Magic Mouse | Apple Wireless Keyboard | Apple Remote Mobile: Samsung Galaxy Wonder i8150 cm9 |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Alla fine dello switch, prima della parentesi chiusa del for
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
O all'inizio, appena prima di stampare il menù.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:35.




















