Discussione chiusa
Visualizzazione dei risultati da 1 a 6 su 6

Passaggio a una funzione di array di stringhe

  1. #1
    Danie non  in linea Novello
    Post
    8
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve sto avendo problemi nel passaggio di un array di stringhe e nell'allocazione di esso..
    main.c
    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
    typedef struct abr * ABR;
    int creaArrayOrd(ABR t, char **A, int i);
    
    libreria.c
    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
    Post
    17,505
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    Cos non possibile provare.

    Dovresti dare tutto il codice compilabile e spiegare meglio i dati inseriti e il problema che hai avuto.
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    Danie non  in linea Novello
    Post
    8
    Like Inviati  
    0
    Like Ricevuti  
    0
    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
    //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
    //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
    #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
    Post
    17,505
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    In effetti dovrebbe essere

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

    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;
    }
    
    ℹ️ Leggi di pi su AntonioG ...

  5. #5
    MR. XX non  in linea Novello
    Post
    36
    Like Inviati  
    0
    Like Ricevuti  
    0
    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.

    // 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;
    	}
    }
    
    #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
    Post
    17,505
    Blogs
    5
    Like Inviati  
    6
    Like Ricevuti  
    35
    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.
    ℹ️ Leggi di pi su AntonioG ...

Discussione chiusa

Potrebbero interessarti anche ...

  1. Array di Stringhe
    Da Vittorio Esposito nel forum Java
    Risposte: 3
    Ultimo Post: 07-05-2015, 21:04
  2. Apertura maschera con passaggio di due stringhe
    Da Matteo_Taglia nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 27-01-2015, 10:33
  3. Passaggio array di controlli (come parametro) a funzione/sub
    Da spikexx84 nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 08-02-2011, 09:11
  4. [C/C++] Passaggio di array ad una funzione
    Da Diego Diego nel forum C/C++
    Risposte: 2
    Ultimo Post: 23-03-2005, 18:49
  5. Risposte: 7
    Ultimo Post: 29-01-2005, 18:05