PDA

Visualizza la versione completa : [C] Vettori in funzione


playbasfa
29-11-2007, 13:56
Ciao a tutti ragazzi, intanto complimenti per il forum!!!
Ho un dubbio colossale, spero che qualcuno riesca ad aiutarmi.
Sto studiando C; sono arrivato a un punto in cui mi trovo ad analizzare un programma che trovo nel libro ma non riesco a capire una cosa; ecco il sorgente intanto:


#include <stdio.h>
#define MAXLINE 1000

int getline(char s[], int uu)

{
int c,i;
for (i=0; i<uu-1 && (c=getchar()) != EOF && c!= '\n'; ++i)
s[i] = c;
if (c == '\n')
{
s[i] = c;
++i;
}
s[i]='\0';
return i;
}

void copy (char to[], char from [])

{
int i;
i=0;
while ((to [i] = from[i]) != '\0')
++i;
}

main ()
{
int len;
int max;
char line [MAXLINE];
char longest [MAXLINE];

max=0;
while ((len = getline(line, MAXLINE)) >0)
if (len > max)
{
max=len;
copy(longest, line);
}
if (max >0)
printf ("%s", longest);
return 0;

A quanto ho capito io il return i della funzione getline restituisce un valore che viene attribuito a line; queso valore successivamente tramite la funzione copy verrà attributo a longest, successivamente a venir stampato sarà longest, che sarà il vettore intero. Di conseguenza il return i ha restituito l'intero vettore.
A quanto poi ho capio io c'è una grandissima differenza tra line (che come appunto detto è il vettore restitutio da return i) e len cui si attribusice il valore della funzione getline. La mia domanda è quest valore assegnato a getline ((len=getline(line,MAXLINE)) è diverso dal valore restituito da return i?
Io credo poprio di si, e penso questo perchè succesivamente viene fatto un paragone con max che è 0. Ma come puo' venir fatto un paragone se len fosse vettore?? Cio' mi porta quindi a dire che il valore restiutito da line (ovvero quello di return i) è diversissimo dal valore risultante dalla funzione getline.
GRAzie in anticipo a hiunque mi voglia aiutare.

LeleFT
29-11-2007, 14:07
Ciao e benvenuto nel forum.
Ti invito a leggere il regolamento e a postare le prossime discussioni includendo il linguaggio di programmazione nel titolo (è obbligatorio e aiuta chi legge le discussioni), a non utilizzare epiteti (come Aiuto, Help, ecc) e ad utilizzare i tag [ CODE ] (basta cliccare il pulsantino [#] quando scrivi il messaggio) per postare il codice.

Correggo il titolo e sistemo.


Ciao. :ciauz:

playbasfa
29-11-2007, 14:39
Ok grazie e scusa

MItaly
29-11-2007, 16:12
Originariamente inviato da playbasfa
A quanto ho capito io il return i della funzione getline restituisce un valore che viene attribuito a line; queso valore successivamente tramite la funzione copy verrà attributo a longest,

Non capisco tutto quello che segue a questa affermazione, comunque getline restituisce il numero di caratteri acquisiti, infatti il tipo restituito è un intero. Ti commento il codice:

#include <stdio.h>
#define MAXLINE 1000
/*
getline: Acquisisce una stringa da tastiera
Parametri:
s: puntatore al buffer in cui memorizzare i caratteri
uu: numero massimo di caratteri da acquisire
Valore restituito: numero di caratteri acquisiti
*/
int getline(char s[], int uu)
{
int c,i;
for (i=0; i<uu-1 && (c=getchar()) != EOF && c!= '\n'; ++i)
s[/b]] = c;
if (c == '\n')
{
s[i] = c;
++i;
}
s[i]='\0';
return i;
}
/*
copy: copia il contenuto di una stringa in un'altra stringa
Parametri:
to: stringa di destinazione
from: stringa di origine
Valore restituito: nessuno
*/
void copy (char to[], char from [])
{
int i;
i=0;
while ((to[i] = from[i]) != '\0')
++i;
}
/*
main: entrypoint dell'applicazione
Acquisisce una serie di stringhe da tastiera fino a quando l'utente non inserisce una
stringa vuota e mostra la stringa più lunga inserita
*/
main ()
{
int len; /* lunghezza della stringa appena acquisita da tastiera */
int max; /* lunghezza della stringa più lunga finora inserita (quindi lunghezza di [i]longest)
char line [MAXLINE]; /* stringa appena acquisita da tastiera */
char longest [MAXLINE]; /* stringa più lunga finora inserita */
max=0; /* inizializza max */
/* Ciclo ripetuto finché l'utente non preme Invio senza inserire caratteri (nel qual caso la funzione getline restituisce 0 e il ciclo termina)
In questa istruzione avvengono diverse cose:
1. viene acquisita una stringa da tastiera, memorizzandola nell'array di caratteri line;
2. il valore restituito da getline (ossia la lunghezza della stringa acquisita) viene memorizzato in len, che quindi ora conterrà la lunghezza di line;
3. il valore di len viene confrontato con 0: se è maggiore di 0 il ciclo che segue viene eseguito.
*/
while ((len = getline(line, MAXLINE)) >0)
{
/* se la lunghezza della stringa acquisita è maggiore di quella della stringa fino ad ora più lunga... */
if (len > max)
{
/* ... memorizza in max il valore di len, ossia la nuova lunghezza di longest, dal momento che ... */
max=len;
/* ... in longest ora viene copiata la stringa appena acquisita. */
copy(longest, line);
}
}
/* al termine del ciclo se sono state inserite parole visualizza la più lunga */
if (max >0)
printf ("%s", longest);
return 0;
}
.

playbasfa
29-11-2007, 19:21
Ciao, grazie per la risposta. Hai ragione forse è poco chiaro quello che ho scritto, ma proprio perchè la mia domanda è un po' contorta;
Cmq implicitamente tra le tue righe è contnuta la risposta e propriamente qui:
1. viene acquisita una stringa da tastiera, memorizzandola nell'array di caratteri line;
2. il valore restituito da getline (ossia la lunghezza della stringa acquisita) viene memorizzato in len, che quindi ora conterrà la lunghezza di line;
Quello che mi preme sapere è infatti: esiste una differenza (sono sicuro che ci sia, ma voglio capire in che termini) tra line, ovvero il termine della funziona, che dalla tua risposta deduco sia un array di carattere, e cio' che viene restituito da getline, che è un un numero.
Non so se sono stato u po' piu' chiaro.


P.s. apro una parentesi che magari non c'entra, ma mi chiedo perchè finora, tutte le volte che ho visto funzioni del tipo getline, non si precisa che in verità getline, non è niente; o meglio noi attribuiamo a getline una funzione. Motivo per cui la funzione che opera in nel modo in cui sta operando getline in questo momento sarebbe potuta essere chiamata benissimo anche "carciofo" ad. es. Chiusa la parentesi.

oregon
29-11-2007, 20:28
Originariamente inviato da playbasfa
Quello che mi preme sapere è infatti: esiste una differenza (sono sicuro che ci sia, ma voglio capire in che termini) tra line, ovvero il termine della funziona, che dalla tua risposta deduco sia un array di carattere, e cio' che viene restituito da getline, che è un un numero.
Non so se sono stato u po' piu' chiaro.

No ... non lo sei stato ...

Comunque ... line e' un array di caratteri e getline restituisce un valore numerico che non e' altro che il numero di caratteri validi nell'array ... non c'e' una "differenza" ma una relazione tra le due cose ...



P.s. apro una parentesi che magari non c'entra, ma mi chiedo perchè finora, tutte le volte che ho visto funzioni del tipo getline, non si precisa che in verità getline, non è niente; o meglio noi attribuiamo a getline una funzione. Motivo per cui la funzione che opera in nel modo in cui sta operando getline in questo momento sarebbe potuta essere chiamata benissimo anche "carciofo" ad. es. Chiusa la parentesi.

Ma che vuoi dire? :confused: :confused: :confused:

MacApp
30-11-2007, 03:26
Originariamente inviato da playbasfa
P.s. apro una parentesi che magari non c'entra, ma mi chiedo perchè finora, tutte le volte che ho visto funzioni del tipo getline, non si precisa che in verità getline, non è niente; o meglio noi attribuiamo a getline una funzione. Motivo per cui la funzione che opera in nel modo in cui sta operando getline in questo momento sarebbe potuta essere chiamata benissimo anche "carciofo" ad. es. Chiusa la parentesi.
Il compilatore non sa cosa significhi "getline" e neppure "carciofo". Ma sa bene ciò che fanno le funzioni che lo sviluppatore ha deciso di nominare arbitrariamente "getline" o "carciofo".
Gli esseri umani, astrazione di sviluppatori/programmatori, invece in tali casi ritengono più significativo l'arbitrario identificatore "getline" piuttosto che "carciofo".
E non è detto che, per noi esseri umani, "getline" sia il miglior identificatore per quella funzione.
Io ad esempio, sempre arbitrariamente, l'avrei nominato in un altro modo: come minimo "GetLine", "getLine" o "get_line", o (perché no?) "CiapaSuLaRiga"
;-)

nusi
30-11-2007, 12:20
Ciao anche se sono nuovo di questo forum provo a risponderti se ho capito bene il tuo dubbio :confused:.

A quanto ho capito io il return i della funzione getline restituisce un valore che viene attribuito a line
Nella funzione main il valore di ritorno della funzione getline vine assegnato alla variabile intera len che servirà per conoscere il numero di caratteri letti e quindi memorizzati all'interno del vattore line. Successivamente nel vettore longest viene copiato il contenuto del vettore line.
Se conosci altri linguaggi ti chiederai coma mai è necessario in C ritornare in maniera esplicita il numero di elementi scritti nel vettore line: questo perchè in i vettori o array non sono dei tipi primitivi in C ma vengono visti semplicemente come delle locazioni di memoria consecutive indirizzabili mediante un puntatore e leggibili mediante una tecnica che prende il nome di aritmetica dei puntatori.
Nota che in C è possibile ritornare da una funzione solamente un tipo primitivo alla volta che in questo caso è un intero (il numero di caratteri acquisiti) come puoi vedere dall'intestazione della funzione

int getline(char s[], int uu){
ser la funzione fosse ritornata un vettore di caratteri avremmo avuto la seguente intestazione

(char*) getline(char s[], int uu){
ma non saremmo stati in grado di conoscere il numero di caratteri acquisiti.

playbasfa
30-11-2007, 14:11
Quello che volevo sottolineare è la differenza tra il valore restituito dalla funzionr che viene attribuito a len, che è chiaramente un nmero, ovvero l'indirizzo dell'ultima cella in cui è stato scritto (per capirci se la parola è ciao, len=4) e proprio ciao che viene attribuito a line.
La mia domanda è come fa ciao ad essere attribuito a line?
Grazie.


P.s.
ser la funzione fosse ritornata un vettore di caratteri avremmo avuto la seguente intestazione
codice:

(char*) getline(char s[], int uu){


ma non saremmo stati in grado di conoscere il numero di caratteri acquisiti.

Ho provato ma funziona lo stesso

oregon
30-11-2007, 14:23
Originariamente inviato da playbasfa
... che è chiaramente un nmero, ovvero l'indirizzo dell'ultima cella in cui è stato scritto ...

No ... "ovvero" ... no ... un numero e' un numero, non e' un indirizzo.

Il numero di cui parli (4) e' semplicemente il numero di caratteri restituiti, NON e' l'indirizzo dell'ultima cella ... non facciamo confusione.


La mia domanda è come fa ciao ad essere attribuito a line?

Questa domanda presuppone il fatto che tu non sappia cosa e' line, ovvero che tu non conosca le caratteristiche di un vettore di char. Se, al contrario, sai cosa e' un vettore di char, allora capisci subito che ogni singolo carattere della parola 'c' 'i' 'a' 'o' viene assegnato al singolo elemento del vettore ...



ser la funzione fosse ritornata un vettore di caratteri avremmo avuto la seguente intestazione
codice:

(char*) getline(char s[], int uu){


ma non saremmo stati in grado di conoscere il numero di caratteri acquisiti.

Ho provato ma funziona lo stesso

Ma che vuoi dire?

Non dovresti fare prove "a caso" senza sapere cosa stai facendo ...

Loading