Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c++] problema con assegnazione

    Salve, ho scritto una funzione che dovrebbe prendere in input una stringa e dare in output un array di stringhe contenenti ognuna una parola della stringa data. Ho scritto dovrebbe perche il programma compila ma poi dice segmentation fault.

    con il debugger ho localizzato il probema: il programma si blocca quando tento di assegnare un valore a out cioè:

    Codice PHP:
    char** parolizza(charfrase)
    {
        
    char** out = (char**) malloc(sizeof(char)*(strlen(frase)+1));
        
    int cont 0;
        
    int a 0;
        for (
    int i 0frase[i] != '\0'i++)
        {
            if (
    frase[i] == ' ' || frase[i] == '\n')
            {
                if (
    == 0) continue;            
                
    out[cont][a] = '\0';     //     <- QUI 
                
    cont++;
                
    0;
            }        
            else
            {    
                
    out[cont][a] = frase[i];   //   <- QUI
                
    a++;
            }
        }
        
    cont++;
        
    out[cont][0] = '\0';      // <- E QUI
        
    return out;

    un grazie di cuore a chiunque sappia dirmi perchè si blocca.... sto usando debian etch e g++...

    edit: i punti di domanda che ci sono nel codice sono degli \0

  2. #2
    forse il problema è dovuto al fatto che malloc assegna un tot di memoria,
    ma non è divisa in qualcosa tipo out[0][], out[1][], out[2][] ecc...


  3. #3

    Re: [c++] problema con assegnazione

    Originariamente inviato da Infernal
    Salve, ho scritto una funzione che dovrebbe prendere in input una stringa e dare in output un array di stringhe contenenti ognuna una parola della stringa data.
    siccome parliamo di c++ sarebbe meglio che tu utilizzassi la classe string che ti permette una manipolazione più agevole. Inoltre dovresti allocare la memoria con il costrutto new.

    Comunque seguendo il tuo frammento di codice affronterei il problema in questa maniera.
    1 - calcoli il numero di parole nella tua frase (questo lo puoi fare contando gli spazi o i \n o i \t, ci sono funzioni che controllano proprio se una carettere è spazio, \n o \t.
    Attenzione che se vuoi utilizzare il ciclo for che hai riportato
    for (int i = 0; frase[i] != ''; i++)
    devi correggerlo in
    codice:
     for (int i = 0; frase[i] != '\0'; i++)
    sempre che frase sia un puntatore non nullo altrimenti anche questa versione non funziona.

    2 - allochi out come puntatore di puntatore a stringa, come hai fatto e gli dai come memoria il numero delle parole trovate
    3 - Ripeti il ciclo e trovi le stringhe una per una. Per ogni stringa devi allocare la memoria per contenerne una copia
    out [num_della_stringa] = (char *) malloc ( lunghezza della stringa n-essima + 1);
    Copi la stringa nella nuova memoria ricordandoti di terminare con \0 ( puoi usare la strncpy ).

    dovrebbe essere tutto
    ciao
    sergio

  4. #4
    ho capito... adesso lo faccio..... una cosa: provando a seguire il consiglio di gp.maraldo sono incappato in una cosa che mi sembra strana... praticamente, allocando memoria con malloc il valore di i (il contatore del for) cambia drasticamente.... (da quello che so penso che la malloc sia andata a scrivere anche su i....) ma se i è già allocata, come può la malloc scriverci sopra?
    altra cosa (se hai tempo di spiegarmi) come viene deciso dove salvare le variabili in ram?

    grazie mille di tutto

  5. #5
    è il sistema operativo che rende disponibile la memoria, lo fa a blocchi. L'unica possibilità che hai è di suggerire di memorizzare una variabile in uno dei registri della cpu, ma è solo un suggerimento al compilatore, che può non tenerne conto.
    E' impossibile che malloc ti dia disponibile della memoria già allocata, probabilmente sei tu che scrivi oltre la memoria.
    Posta il codice che hai scritto.

  6. #6
    ormai l'ho sovrascritto con la tua versione.... =) cmq fa lo stesso... grazie di tutto!

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.