PDA

Visualizza la versione completa : [C] Allocazione dinamica matrice


gaten
04-04-2012, 20:00
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

void creamatrice(float **M, int COLUMNS, int ROWS);
void StampMatrix(float **M, int COLUMNS, int ROWS);
void InserisciDaTastiera(char *stringa, int Max);

main()
{
float **M;
char *str;
char c;
int COLUMNS, ROWS;

printf("Inserisci il numero di righe:\n");
InserisciDaTastiera(str, 100);
ROWS=atoi(str);
printf("NUM RIGHE: %d\n", ROWS);

printf("Inserisci il numero di colonne:\n");
InserisciDaTastiera(str, 100);
COLUMNS=atoi(str);
printf("NUM COLONNE: %d\n", COLUMNS);

creamatrice(M, COLUMNS, ROWS);
StampMatrix(M, COLUMNS, ROWS);

system("PAUSE");

}

void creamatrice(float **M, int COLUMNS, int ROWS){

int i, j, k;

M = (float**)calloc(ROWS,sizeof(float*));

for (i=0; i<ROWS; i++)
M[i] = (float*)calloc(COLUMNS,sizeof(float));

for (k=0; k<ROWS; k++)
{
for (j=0; j<COLUMNS; j++)
{
// (float)rand()/(float)30
M[i][j]=1.5;
}
}
}

/*==========================================
* Function per stampare una matrice
*========================================*/
void StampMatrix(float **M, int COLUMNS, int ROWS)
{
int i, j;

for ( i=0; i < ROWS; i++ )
{
printf("%d", i);
for ( j=0; j < COLUMNS; j++ )
{
printf(" | ", M[i][j]);
}
}
}

/* =============================================
** Function per leggere una stringa di caratteri
** da tastiera
** ---------------------------------------------*/
void InserisciDaTastiera(char *stringa, int Max)
{
int i;

fgets(stringa, Max, stdin);

for ( i=0; stringa[i] < 0 || stringa[i] > 31; i++);
stringa[i]=0;

fflush(stdin);
}


Quando eseguo il programma si blocca ma non capisco il perchè!

Grazie anticipatamente

oregon
04-04-2012, 20:21
Tu passi ed utilizzi un puntatore str senza allocare lo spazio necessario per usarlo nella fgets.

gaten
04-04-2012, 21:02
Ho risolto così:




#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <time.h>

void creamatrice(float **M, int COLUMNS, int ROWS);
void StampMatrix(float **M, int COLUMNS, int ROWS);
void InserisciDaTastiera(char *stringa, int Max);
float RandomFloat();

main()
{
float **M;
char *col, *row;
char c;
int COLUMNS, ROWS, i;

printf("Inserisci il numero di righe:\n");
scanf("%d", &ROWS);
printf("NUM RIGHE: %d\n", ROWS);

printf("Inserisci il numero di colonne:\n");
scanf("%d", &COLUMNS);
printf("NUM COLONNE: %d\n", COLUMNS);

M = (float**)calloc(ROWS,sizeof(float*));

for (i=0; i<ROWS; i++)
M[i] = (float*)calloc(COLUMNS,sizeof(float));

creamatrice(M, COLUMNS, ROWS);
StampMatrix(M, COLUMNS, ROWS);

system("PAUSE");

}

void creamatrice(float **M, int COLUMNS, int ROWS){

int j, k;

for (k=0; k<ROWS; k++)
{
for (j=0; j<COLUMNS; j++)
{
M[k][j]=RandomFloat();
}
}
}

/*==========================================
* Function per stampare una matrice
*========================================*/
void StampMatrix(float **M, int COLUMNS, int ROWS)
{
int i, j;

for ( i=0; i < ROWS; i++ )
{
printf("%d", i);
for ( j=0; j < COLUMNS; j++ )
{
printf(" | %f", M[i][j]);
}
}
}

/* =============================================
** Function per leggere una stringa di caratteri
** da tastiera
** ---------------------------------------------*/
void InserisciDaTastiera(char *stringa, int Max)
{
int i;

fgets(stringa, Max, stdin);

for ( i=0; stringa[i] < 0 || stringa[i] > 31; i++);
stringa[i]=0;

fflush(stdin);
}

float RandomFloat()
{
float num = (float)(rand()%30) + (float)rand() / (float)RAND_MAX;
return num;
}


Anche se vorrei sostituire gli scanf, come posso fare?

oregon
04-04-2012, 21:06
Ad esempio con la fgets e una atoi ...

Loading