Discussione chiusa
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Passaggio a una funzione di array di stringhe

  1. #1
    Danie non è in linea Novello
    Post
    8

    Passaggio a una funzione di array di stringhe

    Salve sto avendo problemi nel passaggio di un array di stringhe e nell'allocazione di esso..
    main.c
    codice:
    char **A; int a; ABR root=NULL;
    ...
    root=albero;
    a=creaArrayOrd(root,A,0);
    printf("Array creato.\n");
    printf("a=%d\n",a);
    for(i=0;i<a;i++) printf("A[%d]=%s\n",i,A[i]);
    albero è un abr scelto in altre parti del codice main
    libreria.h
    codice:
    typedef struct abr * ABR;
    int creaArrayOrd(ABR t, char **A, int i);
    libreria.c
    codice:
    typedef struct abr {
        char *str;
        struct abr *sx;
        struct abr *dx;
    }abr,*pabr;
    int creaArrayOrd(ABR t, char **A, int i)
    {
        if(t!=NULL)
        {
            i=creaArrayOrd(t->sx,A,i);
            if( i == 0) A=(char **)malloc(sizeof(char *)* (i+1) );
            else A=(char **)realloc(A,sizeof(char*)* (i+1) );
    
            A[i]=(char *)malloc(sizeof(char)*80);
    
            strcpy(A[i],t->str);
            printf("A[%d]=%s\n",i,A[i]);
    
    
        i++;
        i=creaArrayOrd(t->dx,A,i);
         }
    return i;
    }
    con il printf all'interno della funzione ho verificato che assegna i corretti campi dell'abr, ma chiaramente non me li ritorna correttamente, perchè sicuramente faccio errori nel passaggio dell'array alla funzione...

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,158
    Blogs
    5
    Così non è possibile provare.

    Dovresti dare tutto il codice compilabile e spiegare meglio i dati inseriti e il problema che hai avuto.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    Danie non è in linea Novello
    Post
    8
    hai ragione! Sorry!
    Il programma è molto lungo e complesso..
    ho scritto dei codici minimali per sintetizzare..
    Ora ti basta compilare per vedere l'errore..
    Praticamente l'esecuzione si blocca nella stampa dell'array.. Credo che mi sfugga proprio qualcosa che riguarda il passaggio ad una funzione di un array di stringhe..

    libreria.h
    codice:
    //libreria.h
    
    typedef struct abr * ABR;
    ABR abr_insert(ABR t, char *elem);
    char * leggi (void);
    void abr_stampa(ABR t);
    int creaArrayOrd(ABR t, char **A, int i);
    libreria.c
    codice:
    //libreria.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "libreria.h"
    
    typedef struct abr {
        char *str;
        struct abr *sx;
        struct abr *dx;
    }abr,*pabr;
    
    char * leggi (void) {
        char *s = (char *)malloc(80*sizeof(char));
        scanf ("%s",s);
        return s;
    }
    
    void abr_stampa(ABR t)
    {
         if (t!=NULL)
         {
            if (t->sx!=NULL) abr_stampa(t->sx);
    
            printf("%s\n",t->str);
    
            if(t->dx!=NULL) abr_stampa(t->dx);
            }
    
         else return;
    }
    
    ABR abr_insert(ABR t, char *elem) {
        if (t!=NULL) {
    
            if (strcmp(elem,t->str)<0)
                t->sx=abr_insert(t->sx,elem);
            else if (strcmp(elem,t->str)>0)
                t->dx=abr_insert(t->dx,elem);
    
            return t;
        }
    
        else {
            ABR nodo=(abr *)malloc(sizeof(abr));
            nodo->str=elem;
            nodo->sx=NULL;
            nodo->dx=NULL;
            return nodo;
        }
    }
    
    int creaArrayOrd(ABR t, char **A, int i)
    {
        if(t!=NULL)
        {
            i=creaArrayOrd(t->sx,A,i);
            if( i == 0) A=(char **)malloc(sizeof(char *)* (i+1) );
            else A=(char **)realloc(A,sizeof(char*)* (i+1) );
    
            A[i]=(char *)malloc(sizeof(char)*80);
    
            strcpy(A[i],t->str);
            printf("A[%d]=%s\n",i,A[i]);
    
    
        i++;
        i=creaArrayOrd(t->dx,A,i);
         }
    return i;
    }
    main.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include "libreria.h"
    
    int main(int argc, char *argv[])
    {
    
    char *stringa,**A; 
    int a,i,n=3; 
    ABR root=NULL;
    ABR albero=NULL;
    
    for (i=0;i<n;i++)
    {   
        printf("Inserisci stringa:");
        stringa=leggi();
        albero=abr_insert(albero,stringa);
    }
    printf("L'albero inserito:\n");
    abr_stampa(albero);
    
    root=albero;
    a=creaArrayOrd(root,A,0);
    printf("Array creato.\n");
    printf("a=%d\n",a);
    for(i=0;i<a;i++) printf("A[%d]=%s\n",i,A[i]);
    
    system("PAUSE");
    }

    mmm oltre al passaggio, credo che proprio la funzione sia sbagliata, ora ci rifletto anche un po' meglio... Comunque sicuramente c'è anche un errore nel passaggio dei parametri...

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,158
    Blogs
    5
    In effetti dovrebbe essere

    codice:
    char **A=NULL;
    codice:
    a=creaArrayOrd(root,&A,0);
    e

    codice:
    int creaArrayOrd(ABR t, char ***A, int i)
    {
        if(t!=NULL)
        {
    		i=creaArrayOrd(t->sx,A,i);
    
    		*A=(char **)realloc((*A), (i+1)*sizeof(char *));
    		(*A)[i]=(char *)malloc(80*sizeof(char));
    		strcpy((*A)[i], t->str);
    
    		i++;
    		i=creaArrayOrd(t->dx,A,i);
         }
    
    	return i;
    }
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  5. #5
    MR. XX non è in linea Novello
    Post
    36
    Buona sera

    io ho un problema simile e passando vari thread non trovo uno preesistente se non questo e uno chiuso

    ho una scanf_s per un array (la scanf normale sul mio pc non va[win 10 - visual studio]) di caratteri da leggere che però non va:
    il programma compila senza errori lancio il debug arriva fino alla lettura del carattere char per il vettore parola e si pianta quando dopo averlo inserito faccio invio.

    utilizza un file.h creato da me che allego.

    codice:
    // Crittografatore.cpp : Defines the entry point for the console application.
    // Crittografatore di parole con chiave
    
    // Creazione ed utilizzo file.h
    
    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "funz_critta.h"
    #define Lung_max 256
    
    void main()
    {
    	int ESERCIZIO;
    	char critta(char carattere_letto, int chiave); //chiamata a funzione
    	char parola[Lung_max]; //vettore parola
    	int i, num_chiave, len;
    
    	printf("\n ********************************************\n\n");
    	printf(" Programma di critto-grafia. \n");
    	printf(" Attraverso una chiave inseribile, critta parole singole. \n");
    	printf(" Per uscire inserire 0, per continuare 1. \n");
    	scanf_s("%d", &ESERCIZIO);
    
    	while (ESERCIZIO == 1)
    	{
    		printf(" Inserire il numero intero per la chiave. \n"); 
    		scanf_s("%d", &num_chiave);	//inserimento chiave
    
    		printf(" Inserire la parola, presa singolarmente da crittare (lung. max = 256). \n");
    		scanf_s("%s", &parola);	//inserimento parola
    
    		start1:
    		if (sizeof(parola) < Lung_max) //controllo lunghezza array parola
    		{
    			len = strlen(parola); //conteggio membri
    			for(i = 0; i < len; i = i++)
    			{
    				parola[i] = critta(parola[i] , num_chiave); //utilizzo della funzione per crittografia
    			}
    
    			printf(" La crittografia della parola inseritae': \n");
    			printf(" %s. \n", parola); //stapa della crittografia
    
    		}
    		else // reinserimento per reimmissione parola
    		{
    			printf(" Inserita parola troppo lunga. \n");
    			goto start1;
    		}
    
    		printf("\n ********************************************\n\n");
    	loop:
    		printf(" Inserire 0 per uscire, 1 per continuare. \n");
    		scanf_s(" %d", &ESERCIZIO);
    	}
    	if (ESERCIZIO == 0)
    	{
    		exit(0);
    	}
    	else
    	{
    		printf(" E' stato inserito un numero che non e' ne 0 ne 1. \n");
    		goto loop;
    	}
    }
    codice:
    #pragma once
    // File.h per file.cpp creato manualmente
    
    char critta(char carattere_letto, int chiave) 
    //identifico la structure dandole anche gli input dichiarandoli come variabile carattere e intero
    {
    	char risultato; //variabile output
    
    	risultato = carattere_letto + chiave; //critto con la chiave
    	return risultato;
    }
    spero almeno sta volta di aver azzeccato posto per pubblicare.

    In rete ho letto di usare getc o fgetc ma non la conosco e avrei bisogno se proprio dovessi usarla di capire la sua sintassi.

    grazie in anticipo.

    ps. vorrei cambiare il mio nome utente che quando ho fatto il profilo 5 anni fa mi sembrava sensato ora molto meno e non trovo l'impostazione per cambiarlo; questo è marginale.

  6. #6
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,158
    Blogs
    5
    No ... non si scrive in thread altrui e così vecchi, che non c'entra nulla con il tuo problema. (Ri)dai un'occhiata più attenta al regolamento.

    Usa un tuo nuovo thread per il tuo problema. Questo si chiude.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

Discussione chiusa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi