GTA-Expert Forum: Esercizio C - GTA-Expert Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

Esercizio C

#1 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 07 ottobre 2013 - 17:15

premetto che non sapevo se metterla in questa sezione o in computer.Ho un esercizio che mi sta mandando in crisi, ovvero:
"date N stringhe ordinarle per dimensione in ordine crescente dopo aver scritto 'exit' per uscire dal programma"
ed ecco il codice:
#include <stdio.h>
#include <stdlib.h>

void elaborazione (char*parole,int*j,int*valore)
{
    valore[j]=strlen(parole[j]);
    printf("%d",valore[j]);
}
int main()
{
    int j=0, i=0;
    char parole[j][50];
    int valore[j][10];
    printf("Questo programma permette di ordinare delle parole in base alla lunghezza\n");
    do
    {
        printf("inserisci una parola, per terminare scrivere 'exit': ");
        gets (parole[j]);
        fflush(stdin);
        elaborazione(parole,j,valore);
        if(strcmp(parole[j],"exit")!=0)
        {
            j++;
        }
        /*
        printf("----->%s\n",parole[j]);
        printf("----->precedente: %s\n",parole[i]);
        i++;
        */
    } while(strcmp(parole[j],"exit")!=0);
}



ignorando la parte in commento" /*" e "*/" che sono un semplice controllo, mi sono bloccato alla procedura "elaborazione": in pratica ho creato un secondo array multidimensionale integer in modo che assuma i valori paralleli del primo array, in modo che successivamente dopo che l'utente avrà scritto "exit" potrò ordinare tutto tramite un bubble sort, ma al punto "strlen(parole[j])=valore[j];" non riesco ad andare oltre e mi esce l'errore "array subscript is not integer". Qualche consiglio?

Grazie!

Messaggio modificato da mattez il 07 ottobre 2013 - 17:24

0

#2 L'utente è offline   Lokrath 

  • Assassino
  • Gruppo: Moderatori
  • Messaggi: 4156
  • Iscritto il: 03/04/10
  • ID Social Club:Lokrath
  • GTA Preferito:GTA: TLaD

Inviato il 07 ottobre 2013 - 21:39

Ahimè, sono molto arrugginito e dovrei fare un bel ripasso ma, se j è un intero, e viene passato ad elaborazione come intero, perché la funzione lo dovrebbe ricevere come puntatore ad intero?
( ͡° ͜ʖ ͡°)
0

#3 L'utente è offline   _BassMonst3r_ 

  • Ladro
  • Gruppo: Utenti
  • Messaggi: 511
  • Iscritto il: 16/07/13
  • GTA Preferito:GTA: Vice City

Inviato il 07 ottobre 2013 - 22:26

I problemi possono essere diversi
Hai controllato se il valore che ti restituisce è un intero?
Hai controllato se l'array riceve correttamente tutti i dati?

Sei sicuro che stai leggendo dalla giusta dimensione?

http://www.tutorials...onal_arrays.htm

Messaggio modificato da _BassMonst3r_ il 07 ottobre 2013 - 22:42

0

#4 L'utente è offline   Wesser 

  • Sicario
  • Gruppo: Utenti
  • Messaggi: 1629
  • Iscritto il: 24/11/07
  • ID PSN:Wesser92
  • ID Social Club:Temutocle
  • Provenienza:Matera, Basilicata, Italia Meridionale, Europa Occidentale, Pianeta Terra, Sistema Solare, Via Lattea, Universo?
  • GTA Preferito:GTA: San Andreas

Inviato il 08 ottobre 2013 - 11:05

Tralasciando l'algoritmo (attualmente incompleto) opinabile che hai in mente, l'argomento j della procedura elaborazione dev'essere un intero, non un puntatore ad un intero. Non ti serve passare il suo riferimento se non svolgi nessuna operazione di ritorno, per cui hai bisogno di passare il valore dell'indice piuttosto che il suo puntatore (o riferimento o indirizzo di memoria). In definitiva, elimina l'asterisco.

Purtroppo, l'errore è un po' vario. Il compilatore che usi potrebbe permettere di utilizzare un puntatore come indice di un array, poiché un puntatore è pur sempre un valore. L'unico errore di sintassi che intravedo è l'utilizzo di valore come array unidimensionale (valore[ j ]) anziché bidimensionale (array[ j ][ i ]) come da dichiarazione e/o definizione (array[ j ][ 10 ]). Non vedo l'utilità di dichiararlo come array bidimensionale a differenza di parole, essendo un array di stringhe e quindi un array di un array di caratteri. Inoltre, evita di assegnare una variabile come indice di un array in fase di dichiarazione, perché secondo gli standard le dimensioni devono essere costanti maggiori di 0. Nel tuo codice, j mantiene un valore pari a 0 che non è valido per impostare una dimensione appropriata.

Messaggio modificato da Wesser il 08 ottobre 2013 - 12:50

Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
0

#5 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 08 ottobre 2013 - 17:10

Visualizza MessaggiWesser, il 08 ottobre 2013 - 12:05 ha detto:

Tralasciando l'algoritmo (attualmente incompleto) opinabile che hai in mente, l'argomento j della procedura elaborazione dev'essere un intero, non un puntatore ad un intero. Non ti serve passare il suo riferimento se non svolgi nessuna operazione di ritorno, per cui hai bisogno di passare il valore dell'indice piuttosto che il suo puntatore (o riferimento o indirizzo di memoria). In definitiva, elimina l'asterisco.

Purtroppo, l'errore è un po' vario. Il compilatore che usi potrebbe permettere di utilizzare un puntatore come indice di un array, poiché un puntatore è pur sempre un valore. L'unico errore di sintassi che intravedo è l'utilizzo di valore come array unidimensionale (valore[ j ]) anziché bidimensionale (array[ j ][ i ]) come da dichiarazione e/o definizione (array[ j ][ 10 ]). Non vedo l'utilità di dichiararlo come array bidimensionale a differenza di parole, essendo un array di stringhe e quindi un array di un array di caratteri. Inoltre, evita di assegnare una variabile come indice di un array in fase di dichiarazione, perché secondo gli standard le dimensioni devono essere costanti maggiori di 0. Nel tuo codice, j mantiene un valore pari a 0 che non è valido per impostare una dimensione appropriata.

Si, me ne sono accorto, sono un attimino arrugginito e ho fatto caso dopo che J lo passo come un puntatore. Sistemo e faccio sapere grazie del consiglio!

EDIT:
ho aggiornato e rivisto il codice e finalmente l'errore è scomparso, poi "valore" l'ho fatto diventare unidimensionale, visto che per quello che vorrei farci è inutile un bidimensionale. A questo punto avevo due strade: o fare un #define o creare una dimensione fissa. Per semplicità ho scelto la seconda strada. Purtroppo ora mi crasha (pincopallo ha smesso di funzionare ecc..) ma non riesco a venirne a capo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void elaborazione (char*parole,int j,int*valore)
{
    valore[j]=strlen(parole[j]);
    printf("%d",j);
    printf("%d",valore[j]);
}
int main()
{
    int j=0, i=0;
    char parole[100][50];
    int valore[100];
    printf("Questo programma permette di ordinare delle parole in base alla lunghezza\n");
    do
    {
        printf("inserisci una parola, per terminare scrivere 'exit': ");
        gets (parole[j]);
        fflush(stdin);
        elaborazione(parole,j,valore);
        if(strcmp(parole[j],"exit")!=0)
        {
            j++;
        }
        /*
        printf("----->%s\n",parole[j]);
        printf("----->precedente: %s\n",parole[i]);
        i++;
        */
    } while(strcmp(parole[j],"exit")!=0);
}



come compilatore uso Mingw abbinato a Codeblocks

Messaggio modificato da mattez il 08 ottobre 2013 - 17:31

0

#6 L'utente è offline   Wesser 

  • Sicario
  • Gruppo: Utenti
  • Messaggi: 1629
  • Iscritto il: 24/11/07
  • ID PSN:Wesser92
  • ID Social Club:Temutocle
  • Provenienza:Matera, Basilicata, Italia Meridionale, Europa Occidentale, Pianeta Terra, Sistema Solare, Via Lattea, Universo?
  • GTA Preferito:GTA: San Andreas

Inviato il 08 ottobre 2013 - 20:55

L'argomento parole della procedura elaborazione è dichiarato come puntatore ad una stringa, a noi invece interessa un puntatore ad un array di stringhe (o array di array di caratteri). Dovresti dichiararlo come char (*parole)[50] oppure char parole[][50].

#define è una direttiva preprocessore che assegna qualunque stringa (sia essa un codice o una costante) ad un'altra stringa, quindi qualunque valore specifichi rimarrà invariato durante la compilazione.

Non utilizzare fflush per le operazioni di input, si dovrebbe usufruirne esclusivamente per quelle di output (tipo dopo la scrittura di dati in un file). E' sconsigliato per giunta dagli standard perché può produrre un risultato indefinito.

stdlib.h non definisce alcuna delle funzioni chiamate nel programma, per cui è inutile includerlo.

Ti ho sistemato e ripulito il codice:

#include <stdio.h>
#include <string.h>

#define WORDS_MAX_AMOUNT	100
#define WORD_STRING_LENGTH	50

void elaborazione(char (*parole)[WORD_STRING_LENGTH], int i, int *valore) {
	valore[i] = strlen(parole[i]);
	printf("---> indice:     %d\n---> caratteri:  %d\n", i, valore[i]);
}

int main() {
	int i;
	char parole[WORDS_MAX_AMOUNT][WORD_STRING_LENGTH];
	int valore[WORDS_MAX_AMOUNT];

	i = 0;
	printf("Questo programma permette di ordinare delle parole in base alla loro lunghezza.\n");

	for(;;) {
		printf("Inserisci una parola, per terminare digitare 'exit': ");
		scanf("%s", parole[i]);

		if(!strcmp(parole[i],"exit")) {
			break;
		}

		elaborazione(parole, i, valore);
		/*printf("---> corrente:   %s\n", parole[i]);

		if(i > 0) {
			printf("---> precedente: %s\n", parole[i - 1]);
		}*/

		i++;
	}

	return 0;
}

Messaggio modificato da Wesser il 08 ottobre 2013 - 21:23

Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
0

#7 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 08 ottobre 2013 - 21:16

Visualizza MessaggiWesser, il 08 ottobre 2013 - 21:55 ha detto:

L'argomento parole della procedura elaborazione è dichiarato come puntatore ad una stringa, a noi invece interessa un puntatore ad un array di stringhe (o array di array di caratteri). Dovresti dichiararlo come char (*parole)[50] oppure char parole[][50].

#define è una direttiva preprocessore che assegna qualunque stringa (sia essa un codice o una costante) ad un'altra stringa, quindi qualunque valore specifichi rimarrà invariato durante la compilazione.

Non utilizzare fflush per le operazioni di input, si dovrebbe usufruirne esclusivamente per quelle di output (tipo dopo la scrittura di dati in un file). E' sconsigliato per giunta dagli standard perché può produrre un risultato indefinito.

stdlib.h non definisce alcuna delle funzioni chiamate nel programma, per cui è inutile includerlo.

Ti ho sistemato e ripulito il codice:

#include "stdafx.h"

#define WORDS_MAX_AMOUNT	100
#define WORD_STRING_LENGTH	50

void elaborazione(char (*parole)[WORD_STRING_LENGTH], int i, int *valore) {
	valore[i] = strlen(parole[i]);
	printf("---> indice: 	%d\n---> caratteri:  %d\n", i, valore[i]);
}

int main() {
	int i;
	char parole[WORDS_MAX_AMOUNT][WORD_STRING_LENGTH];
	int valore[WORDS_MAX_AMOUNT];

	i = 0;
	printf("Questo programma permette di ordinare delle parole in base alla loro lunghezza.\n");

	for(;;) {
		printf("Inserisci una parola, per terminare digitare 'exit': ");
		scanf("%s", parole[i]);

		if(!strcmp(parole[i],"exit")) {
			break;
		}

		elaborazione(parole, i, valore);
		/*printf("---> corrente:   %s\n", parole[i]);

		if(i > 0) {
			printf("---> precedente: %s\n", parole[i - 1]);
		}*/

		i++;
	}

	return 0;
}


grazie! Tengo a precisare che comunque le librerie indicate sono di default caricate dal compilatore e fflush ho dovuto inserirlo dopo un input per ovviare ad un bug noto che inpedirebbe la lettura di eventuali caratteri successivi. Domani cerco di terminare tutto.
0

#8 L'utente è offline   Lokrath 

  • Assassino
  • Gruppo: Moderatori
  • Messaggi: 4156
  • Iscritto il: 03/04/10
  • ID Social Club:Lokrath
  • GTA Preferito:GTA: TLaD

Inviato il 08 ottobre 2013 - 21:50

Se ricordo bene, l'fflush allo stdin lo farebbe per ovviare alla scorretta assimilazione del carattere "\n" all'introduzione di un/una carattere/stringa in shell.

Capitava anche a me. :ahsisi:
( ͡° ͜ʖ ͡°)
0

#9 L'utente è offline   mattez 

  • Cacciatore di taglie
  • Gruppo: Utenti
  • Messaggi: 1016
  • Iscritto il: 29/11/10
  • ID Social Club:Matt3z_it
  • Provenienza:Finale Ligure [SV]
  • GTA Preferito:GTA V

Inviato il 09 ottobre 2013 - 08:26

Visualizza MessaggiLokrath, il 08 ottobre 2013 - 22:50 ha detto:

Se ricordo bene, l'fflush allo stdin lo farebbe per ovviare alla scorretta assimilazione del carattere "\n" all'introduzione di un/una carattere/stringa in shell.

Capitava anche a me. :ahsisi:

Esattamente, mi avviene dopo lo scanf o al Gets, e per ovviare al problema non ho alternative
0

#10 L'utente è offline   Wesser 

  • Sicario
  • Gruppo: Utenti
  • Messaggi: 1629
  • Iscritto il: 24/11/07
  • ID PSN:Wesser92
  • ID Social Club:Temutocle
  • Provenienza:Matera, Basilicata, Italia Meridionale, Europa Occidentale, Pianeta Terra, Sistema Solare, Via Lattea, Universo?
  • GTA Preferito:GTA: San Andreas

Inviato il 09 ottobre 2013 - 13:08

fflush è stato ideato solo per le operazioni di output secondo gli standard, ciò non toglie che alcune librerie rendano il suo utilizzo sicuro anche per quelle di input, ma così facendo si rendono sia il codice sia il programma non portabili. Non ho mai sofferto di questo problema anche se ne sono a conoscenza. Dovrebbe capitare quando si mescolano le varie funzioni di input-output anche se teoricamente dovrebbero essere totalmente interscambiabili, oppure quando si inserisce un "ritorno a capo" nello scanf.
Notice: Undefined variable: Fabio in /home/gta-expert/index.php on line 206
0

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

1 utenti stanno leggendo questa discussione
0 utenti, 1 ospiti, 0 utenti anonimi