Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di vip
    Registrato dal
    Nov 2003
    Messaggi
    112

    [C] problema con calloc..

    ciao ho fatto un programma usando la funzione calloc per allocare la memoria per un puntatore a vettore di stringa... ecco una parte d codice dove s'intoppa, ovvero al popolamento

    Codice PHP:
    char pv[MAX];
    int i,n,k;
    printf("quanti elementi?= ");
    scanf("%i",&n);
    for(
    i=0;i<n;i++)
    {
      
    pv[i]=(char *) calloc(nsizeof(char));
      
    printf("inserire parola= ");
      
    gets(pv[i]);
    }
    /*poi il resto del prog*/ 
    e mi da errore qui.
    ovvero gli dico che voglio inserire 4 elementi, ma in realta me ne fa inserire 3
    questo è quello che stampa "inserisci parola= inserisci parola= _" e poi me la fa inserire.. ma perche la prima viene saltata? ciao e grazie a tutti
    "E d'un tratto capii che il pensare è per gli stupidi, mentre i cervelluti si affidano all'ispirazione.." (Arancia Meccanica)

  2. #2
    Da quello che ho capito ogni ciclo allochi ad ogni elemento un puntatore a n char inizializzati, probabilmente durante questa operazione vai a sovrascrivere qualche stringa già scritta.

    Io scriverei una cosa del genere:
    codice:
    for (int i=0;i<n; i++) {
      pv[i] = (*char) calloc(1, sizeof(char));
      ...
    }
    ...

  3. #3
    Utente di HTML.it L'avatar di vip
    Registrato dal
    Nov 2003
    Messaggi
    112
    è uguale... non cambia nulla
    "E d'un tratto capii che il pensare è per gli stupidi, mentre i cervelluti si affidano all'ispirazione.." (Arancia Meccanica)

  4. #4
    Infatti mi sono accorto di aver scritto una stupidaggine, prova con quello che ho scritto adesso.
    ...

  5. #5
    leggersi bene la documentazione delle funzioni che si utilizzano, non è mai tempo perso...

    nel primo caso "vip" alloca "n" caratteri (in cui "n" invece viene presentato come numero di elementi) per riga.
    Nel secondo "Caiodark" alloca un carattere per riga.

    La documentazione in mio possesso dice:
    void * calloc(size_t count, size_t size);
    The calloc() function contiguously allocates enough space for count
    objects that are size bytes of memory each and returns a pointer to the
    allocated memory. The allocated memory is filled with bytes of value
    zero. calloc() returns a NULL pointer if there is an error.
    da cui si intuisce che l'argomento "count" è il numero degli elementi di dimensione "size" da allocare.

  6. #6
    Utente di HTML.it L'avatar di vip
    Registrato dal
    Nov 2003
    Messaggi
    112
    forse non ho capito...
    "da cui si intuisce che l'argomento "count" è il numero degli elementi di dimensione "size" da allocare."
    n è il numero degli elementi.. o no?

    grazie
    "E d'un tratto capii che il pensare è per gli stupidi, mentre i cervelluti si affidano all'ispirazione.." (Arancia Meccanica)

  7. #7
    Originariamente inviato da vip
    forse non ho capito...
    "da cui si intuisce che l'argomento "count" è il numero degli elementi di dimensione "size" da allocare."
    n è il numero degli elementi.. o no?

    grazie
    I tuoi elemeni sono quelli che io chiamerei righe, i miei sono i caratteri d'ogni riga.
    Caratteri che tu ne allochi n per riga, "Caiodark" invece uno solo per riga.

    Io ne allocherei, giusto per andare sul sicuro, almeno 1024 per riga.

    Ad esempio:
    Codice PHP:
    /*
    * Compiled and tested by MacApp using:
    * i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    *
    * Compilation command, with no errors no warnings:
    * $ gcc -Wall -pedantic -ansi main.c
    *
    * Executed succesfully.
    *
    */

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

    #define kNumRow 100
    #define kMaxRowLength 1024

    int main (void){
        
    char aRowContainer [kNumRow];
        
    int i;
        
        
    /* alloco lo spazio per ogni riga */
        
    for (0kNumRow; ++i){
            
    /* alloco kMaxRowLength caratteri per riga */
            
    aRowContainer [i] = (char *) calloc (kMaxRowLengthsizeof (char));
        }
        
        
    /* in ogni riga scrivo qualcosa */
        
    for (0kNumRow; ++i){
            if (
    NULL != aRowContainer [i]){
                
    sprintf (aRowContainer [i], "Sono la riga %d;\n"1);
            }
        }
        
        
    /* visualizzo ogni riga */
        
    for (0kNumRow; ++i){
            if (
    NULL != aRowContainer [i]){
                
    printf (aRowContainer [i]);
            }
        }
        
        
    /* libero la memoria allocata per ogni riga */
        
    for (0kNumRow; ++i){
            if (
    NULL != aRowContainer [i]){
                
    free (aRowContainer [i]);
                
    aRowContainer [i] =  NULL;
            }
        }
        return 
    EXIT_SUCCESS;


  8. #8
    Utente di HTML.it L'avatar di vip
    Registrato dal
    Nov 2003
    Messaggi
    112
    aaaaa... ora ho capito quindi gli devo passare la quantità di caratteri che può contenere la riga.. quindi per ogni riga.. okkiappa ho capito, spieghi meglio del mio prof! ahhaah
    grazie mille XD
    ciao
    "E d'un tratto capii che il pensare è per gli stupidi, mentre i cervelluti si affidano all'ispirazione.." (Arancia Meccanica)

  9. #9
    Originariamente inviato da vip
    aaaaa... ora ho capito quindi gli devo passare la quantità di caratteri che può contenere la riga.. quindi per ogni riga.. okkiappa ho capito, spieghi meglio del mio prof! ahhaah
    grazie mille XD
    ciao
    e chi ti dice che io non sia il tuo prof? ;-)

    Dato che ci siamo ti lascio un pensiero per non dormire:

    le due seguenti:
    Codice PHP:
    char aRow = (char *) calloc (kMaxRowLengthsizeof (char)); 
    Codice PHP:
    char aRow = (char *) malloc (kMaxRowLength sizeof (char)); 
    al profano potrebbero sembrare equivalenti, ma invece NON lo sono.

    Sapresti spiegarmi perché?

    ;-)

    p.s tranquilllo non sono il tuo prof.

  10. #10
    Non svelo l'arcano problema.
    Piuttosto il problema sul ciclo era dovuto al fatto che al primo scanf lo standard input si tiene il tasto enter, quando fai il primo gets si legge l'enter e passa subito al secondo ciclo.
    ...

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 © 2024 vBulletin Solutions, Inc. All rights reserved.