Cosa si intende per tipo status?

Jazz_lover
cos'è un tipo status in un programma in c?
c'è un esercizio che mi richiede di definire un tipo status i cui possibili valori sono ERROR e OK

Risposte
anonymous_be1147
E' un "qualcosa", tipo un valore numerico, che ti serve per segnalare lo stato di un'operazione, ad esempio, se si è conclusa con successo (OK) o se si è verificato un errore (ERROR).

Esempio:

     if ( /* condizione vera */)
          return OK;
     else
          return ERROR;


In questo caso potresti assegnare a OK il valore 0 e a ERROR il valore 1. Serve anche per rendere più chiaro/leggibile il codice, per questo in genere si usano delle #define.

Jazz_lover
"anonymous_be1147":
E' un "qualcosa", tipo un valore numerico, che ti serve per segnalare lo stato di un'operazione, ad esempio, se si è conclusa con successo (OK) o se si è verificato un errore (ERROR).

Esempio:

     if ( /* condizione vera */)
          return OK;
     else
          return ERROR;


In questo caso potresti assegnare a OK il valore 0 e a ERROR il valore 1. Serve anche per rendere più chiaro/leggibile il codice, per questo in genere si usano delle #define.


e come si inizializza un tipo status???
te lo chiedo perchè ho da fare una funzione del tipo
"status cutString"

kanon4
Puoi provare così:

typedef enum status
{
OK=0,
ERROR
}status;

status func();

int main()
{
status var;

}

Ciao

Jazz_lover
ah! quindi devo fare una struttura?

kanon4
Se ho capito bene il problema si.
Non mi vengono in mente altre possibilità.

Jazz_lover
il problema è:

data una riga di testo devo fare una funzione status Cutstring(char s[], int n) che mantiene tutti i caratteri di indice minore di n.
La funzione restituisce OK se l'operazione ha effetto, ERROR se non è eseguibile (n<0).
il problema è quello status cutstring

Jazz_lover
nessuno mi sa rispondere?

kanon4
Prova a utilizzare la struttura come dicevo nel post precedente.

Ciao

dazuco
Ti basta definire, secondo me, due macro ed una ridefinizione del tipo int:

#define ERROR 0;
#define OK 1;
typedef int STATUS;

Poi definisci la funzione con un ritorno STATUS al quale assegni ERROR oppure OK.
Ad esempio

STATUS stat = -1; //inizializzazione

stat = Cutstring (....);
if (stat == ERROR)
......
if (stat == OK)
......

Il prototipo della funzione Cutstring deve avere STATUS come ritorno
dz

Jazz_lover
mi da dei problemi la chiamata a funzione!

cosa sbaglio???


#include
#include
#define N 30
#define ERROR 0
#define OK 1

typedef int status;

int readline(char s[])
{
int i;
i=0;
printf("scrivi una riga di testo: ");
while(s[i-1]!='\n')
{
s=getchar();
i++;
}
return i-1;
}



status cutString(char s[];int n)
{
int j;

printf("\nla stringa diventa:");
j=0;
while(j {
printf("%c", s[j]);
j++;
}

if(n>=0)
{
return 1;
}
else
{
return 0;
}

}

main()
{
char s[N];
int Lung,n;


status cut=-1;

Lung=readline(s);
printf("\nIl numero dei caratteri letti e' %d\n", Lung);


printf("inserisci un intero n: ");
scanf("%d", &n);



cut=cutString(s,n);
if(cut==ERROR)
{
printf("ERROR");
}
if(cut==OK)
{
printf("OK\n");
}



system("PAUSE");
return 0;
}

anonymous_be1147
Ci sono alcune imprecisioni: mancano i prototipi delle due funzioni e gli elenchi dei loro argomenti vanno separati da una virgola.
A parte questo, il malfunzionamento potrebbe essere dovuto al fatto che non contrassegni la fine della stringa immessa ad esempio con un carattere di '\0'.

Jazz_lover
"anonymous_be1147":
Ci sono alcune imprecisioni: mancano i prototipi delle due funzioni e gli elenchi dei loro argomenti vanno separati da una virgola.
A parte questo, il malfunzionamento potrebbe essere dovuto al fatto che non contrassegni la fine della stringa immessa ad esempio con un carattere di '\0'.


ok risolto! erano gli argomenti che non erano separati da virgola!
se dovessi inserire un'altra stringa in che modo posso fare?

anonymous_be1147
Puoi usare un ciclo for, oppure un while, magari facendo terminare l'immissione da un INVIO, così:

while ((Lung = readline(s)) > 0) {

     /* istruzioni */
}


Probabilmente dovrai aggiungere una (void)getchar() per "mangiare" il carattere d'INVIO presente in input dopo la richiesta del numero intero.
Comunque, secondo me, dovresti usare un terminatore di stringa ed effettuare un controllo sull'input, come detto...

Jazz_lover
ho provato a scrivere un'altra stringa ma se metto il ciclo utilizzato per la prima, non mi fa scrivere nulla :roll:
intendo queste

int i;
i=0;
printf("scrivi una riga di testo: ");
while(s[i-1]!='\n')
{
s=getchar();
i++;
}

Jazz_lover
possibile che con lo stesso procedimento usando getchar, mi dia dei problemi?

anonymous_be1147
Non ho ben capito qual è il problema che ti dà, comunque intendevo una cosa del tipo::

#include <stdio.h>
#include <stdlib.h>

#define N 30
#define ERROR 0
#define OK 1

typedef int	status;

int		readline   (char s[]);

status		cutString(char s[], int n);

int
readline(char s[])
{
	int		i;
	i = 0;
	printf("scrivi una riga di testo: ");

	do {
		s[i] = getchar();
		i++;
	} while (s[i - 1] != '\n');

	s[i] = '\0';

	return i - 1;

}



status
cutString(char s[], int n)
{
	int		j;

	printf("\nla stringa diventa: ");
	j = 0;
	while (j < n && s[j] != '\0') {
		printf("%c", s[j]);
		j++;
	}


	printf("\n");

	if (n >= 0) {
		return OK;
	} else {
		return ERROR;
	}
}

int
main(void)
{
	char		s[N];
	int		Lung, n;


	status		cut = -1;

	while ((Lung = readline(s)) > 0) {
		printf("\nIl numero dei caratteri letti e' %d\n", Lung);


		printf("inserisci un intero n: ");
		scanf("%d", &n);

		/* rimuove il carattere di INVIO */
		(void)getchar();

		cut = cutString(s, n);
		if (cut == ERROR) {
			printf("ERROR\n");
		}
		if (cut == OK) {
			printf("OK\n");
		}
	}

	system("PAUSE");

	return 0;
}

Funziona senz'altro su sistemi Linux e similari, non ho provato in Windows, ma le eventuali modifiche da fare dovrebbero essere minime.

Jazz_lover
sisi questo l'ho fatto per la stringa s
ma ora devo definire e leggere un'altra stringa t....e ho problemi nel farlo :shock:
in poche parole ho riproposto il ciclo della funzione redline ma in questo caso leggo la seconda stringa
il problema è che il ciclo non finisce mai

la scrivo!

int length(char t[])
{
int k;

printf("scrivi la riga di testo della seconda stringa: ");

k=0;

while(t[k-1]!='\n')
{

scanf("%s", &t[k]);
k++;
}

anonymous_be1147
Manca una graffa di chiusura?
Comunque, mi pare che ci siano innanzitutto due imprecisioni:

    [*:3mc956h1] se k=0 allora t[k-1] è t[-1], il che può non essere una cosa bella :-D[/*:m:3mc956h1]
    [*:3mc956h1] nella scanf() forse volevi mettere come specifica di formato %c[/*:m:3mc956h1][/list:u:3mc956h1]
    A parte questo, è possibile che entri in un ciclo infinito perché la stringa passata t[] non termina con \n. Ribadisco quindi che forse è meglio nella readline() aggiungere un terminatore (es. \0) e soprattutto leggere soltanto N -1 caratteri.

Jazz_lover
"anonymous_be1147":
Manca una graffa di chiusura?
Comunque, mi pare che ci siano innanzitutto due imprecisioni:

    [*:22yn65sc] se k=0 allora t[k-1] è t[-1], il che può non essere una cosa bella :-D[/*:m:22yn65sc]
    [*:22yn65sc] nella scanf() forse volevi mettere come specifica di formato %c[/*:m:22yn65sc][/list:u:22yn65sc]
    A parte questo, è possibile che entri in un ciclo infinito perché la stringa passata t[] non termina con \n. Ribadisco quindi che forse è meglio nella readline() aggiungere un terminatore (es. \0) e soprattutto leggere soltanto N -1 caratteri.


ho fatto quelle correzioni, ma ora invece non mi fa scrivere nulla...devo riuscire a finirlo! :cry:

anonymous_be1147
Se puoi posta l'intero listato o mandamelo tramite PM, perché è difficile scoprire dov'è il bug senza vedere il sorgente. ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.