PDA

View Full Version : [C] Non stampa niente


Manugal
14-11-2005, 18:03
Ciao

Molto spesso quando mi capita di fare programmi in C non stampa niente. Da quali fattori può dipendere?

Ad esempio ora ho scritto questo programma che permette di fondere due array ordinati in un altro array mantenendo sempre l'ordine (una sorta di mergesort).



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

int *fusione(int [], int [], int, int);
void stamparray(int []);

int main(void){

int len1,len2,i=0,j=0;

printf("Inserisci lunghezza del primo vettore: ");
scanf("%d", &len1);

int *t=(int *) malloc(sizeof(int)*len1);

for( ; i<len1; ++i)
scanf("%d", &t[i]);

printf("Inserisci lunghezza del secondo vettore: ");
scanf("%d", &len2);

int *s=(int *) malloc(sizeof(int)*len2);

for( ; j<len2; ++j)
scanf("%d", &s[j]);

printf("%s", fusione(t,s,len1,len2));
return 0;
}

int *fusione(int t[], int s[], int l1, int l2){

int *result=(int*) malloc(sizeof(int)*(l1+l2));
int i=0,j=0,k=0;

while(i<l1 && j<l2)
if(t[i]<=s[j])
result[k++]=t[i++];
else
result[k++]=s[j++];
while(i<l1)
result[k++]=t[i++];
while(j<l2)
result[k++]=s[j++];

return result;
}



Non capisco perché non stampa niente.. :cry: Da che dipende? Grazie

Manugal
14-11-2005, 18:45
Ho trovato l'errore... :) Non si usa %s per stampare un vettore di interi. Quindi ho creato una nuova variabile puntatore, gli ho assegnato il valore della funzione e poi con un ciclo gli ho fatto stampare tutti i valori. Grazie lo stesso ;)

cos1950
14-11-2005, 19:11
Ho trovato l'errore... :) Non si usa %s per stampare un vettore di interi. Quindi ho creato una nuova variabile puntatore, gli ho assegnato il valore della funzione e poi con un ciclo gli ho fatto stampare tutti i valori. Grazie lo stesso ;)


Certo... il %s si usa per le stringhe (o meglio array di caratteri).
La printf stampa tutto l'array di caratteri perchè l'array di caratteri termina col terminatore nullo ('\0') in C... quindi la printf è stata naturalmente implementata in grado di stampare tutto l'array perchè va avanti finchè non trova il terminatore nullo che la fa smettere (e non viene stampato).
L'array di interi invece non ha terminatore e quindi la printf non è stata implementata per stampare l'array di interi passatole... cioè è in grado di stampare un intero alla volta:

printf("%d ", intero[i]);

se si vuole stampare un array di interi bisogna farlo "a mano", con un ciclo condizionato che cicla finchè non viene raggiunta la fine dell'array:

.....

int *t, i, int_array_len, *array_int;


......

scanf("%d", &int_array_len);

array_int = (int *) malloc(int_array_len*sizeof(int));

.....

t = array_int;

for (i=0; i < int_array_len; i++) scanf("%d", array_int++);

.....

array_int = t;

for (i=0; i < int_array_len; i++) printf("%d ", *array_int++);

......

Così davrebbe funzionare, usando cioè i puntatori ad interi.
Ciao

cos1950
14-11-2005, 19:22
Azz... che compilatore usi? Io sono rimasto ai compilatori C classico (in modalità testo) che non consentivano di dichiarare variabili inframmezzatamente alle istruzioni... altri tempi...

Manugal
14-11-2005, 19:45
Ora si usano (credo) prettamente compilatori conformi allo standard ANSI C.