Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327

    Help Vettori In Fuznione. Dubbio Colossale.

    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:
    codice:
    #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.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    Ok grazie e scusa

  4. #4

    Re: Help Vettori In Fuznione. Dubbio Colossale.

    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:
    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[i] = 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 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;
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    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.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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"
    ;-)

  8. #8
    Ciao anche se sono nuovo di questo forum provo a risponderti se ho capito bene il tuo dubbio .
    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
    codice:
    int getline(char s[], int uu){
    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.
    www.mannucci.fi.it
    La mia pagina personale dove puoi trovare guide e articoli sulla programmazione.
    Campanellino la tua guida su internet

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    327
    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

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.