Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Dichiarare delle matrici (prog C)

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

0
voti

[1] Dichiarare delle matrici (prog C)

Messaggioda Foto Utentetecfil » 5 ago 2013, 18:44

Ciao a tutti!

Ho creato scritto questo semplice programma in C che acquisisce una serie di numeri e li stampa in matrice:
Codice: Seleziona tutto
#include <stdio.h>
//Definisco dimensione matrice
#define DIM1 3
#define DIM2 3
int main () {
    int matrice[DIM1][DIM2];
    int i=0,j=0;
   
    //Inserisco i numeri che compongono la matrice   
    printf("Inserisci i numeri della matrice:\n");
    for(i=0; i<DIM1; i++) {
        for(j=0; j<DIM2; j++) {
            printf("==> ");
            scanf("%d", &matrice[i][j]);
            }
    }

    //Stampa matrice
    for(i=0; i<DIM1; i++) {
        for(j=0; j<DIM2; j++) {
            printf("%d ",matrice[i][j]);
        }
        printf("\n");
    }
    return 0;
}


Le dimensioni della matrice sono definite attraverso la funzione
Codice: Seleziona tutto
#define DIM


Fin qui tutto a posto, il programma funziona correttamente. Allora ho pensato di modificarlo facendo decidere all'utente di quante righe e quante colonne è formata la matrice. Con uno
Codice: Seleziona tutto
scanf
l'utente decide il numero di righe e di colonne, inserisce poi tutti i numeri, ma a questo punto il programma al posto di stamparmi la matrice corretta, mi stampa solamente gli ultimi due valori che ho immesso.
Codice: Seleziona tutto
#include <stdio.h>
int main () {
    int  righe=0, colonne=0;
    int matrice[righe][colonne];
    int i=0,j=0;
   
    printf("Numero di righe: ");
    scanf("%d", &righe);
    printf("Numero di colonne: ");
    scanf("%d", &colonne);
       
    printf("Inserisci i numeri della matrice:\n");
    for(i=0; i<righe; i++) {
        for(j=0; j<colonne; j++) {
            printf("==> ");
            scanf("%d", &matrice[i][j]);
            }
    }

    //Stampa matrice
    for(i=0; i<righe; i++) {
        for(j=0; j<colonne; j++) {
            printf("%d",matrice[i][j]);
        }
        printf("\n");
    }
    return 0;
}


Non riesco a capire dove sbaglio, il codice "in teoria" dovrebbe essere identico, solo che ho aggiunto la possibilità di decidere le righe e le colonne!

Grazie
Ciaoo :)
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

0
voti

[2] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentesimo85 » 5 ago 2013, 19:10

Una domanda.

Con quale compilatore e su quale sistema operativo lavori?

Ad ogni modo se non ricordo male non mi sembra corretto dichiarare una matrice di 0 righe e 0 colonne e successivamente fare un po' quello che vuoi.

Dovresti allocare la memoria.

Altro problema a cui potresti venire incontro è il buffer di input "sporco".

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

3
voti

[3] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto UtenteTardoFreak » 5 ago 2013, 19:17

Guarda che hai dichiarato una matrice di zero righe e zero colonne!
Anche assegnando un valore diverso alle due variabili non succede niente, sempre zero per zero restano. :mrgreen:
Inoltre le matrici non si possono allocare (deciderne la dimensione, per intenderci) durante l' esecuzione del programma
Dovresti invece allocare delle variabili dinamicamente con le funzioni malloc o calloc.

P.S.: le matrici si dichiarano (non si creano), i programmi si scrivono (non si creano). Siamo in un forum tecnico ed utilizziamo i termini corretti.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[4] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentesimo85 » 5 ago 2013, 19:33

Oltre alle funzioni malloc e calloc, e perché no aggiungiamo anche la realloc, bisogna lavorare con i puntatatori fin da subito e non usare subito gli array.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[5] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentetecfil » 5 ago 2013, 20:53

Ciao!

Grazie per le risposte! Provo con i puntatori e poi vi faccio sapere :D in effetti mi sono dimenticato di utilizzare le funzioni malloc!

Grazie
Ciaoo!
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

0
voti

[6] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto UtenteTardoFreak » 5 ago 2013, 23:03

simo85 ha scritto:Oltre alle funzioni malloc e calloc, e perché no aggiungiamo anche la realloc ...

A questo punto, per non far torto a nessuno, mettiamoci anche la free. :mrgreen:
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[7] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentesimo85 » 6 ago 2013, 0:13

:ok:
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[8] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentetecfil » 7 ago 2013, 16:14

Ciao!

Ho provato a rifare l'esercizio con la funzione malloc ma non ci sono riuscito :cry:.

Io devo prima dichiarare il puntatore e poi con la malloc dichiarare la grandezza del vettore? In questo caso non riesco a capire come far definire la grandezza della matrice direttamente all'utente.

Grazie :-)
Ciaoo!
Il colmo per un elettricista? Essere isolato :D
Avatar utente
Foto Utentetecfil
327 1 5 6
Stabilizzato
Stabilizzato
 
Messaggi: 440
Iscritto il: 2 lug 2013, 21:41

3
voti

[9] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentesimo85 » 7 ago 2013, 16:18

Ciao Foto Utentetecfil, visto che sto scrivendo un programma in C in cui la funzione main prende in input dei valori dalla linea di comando, ho pensato al tuo esercizio in cui volevi dare un valore al numero di righe e colonne subito all'esecuzione del programma, così ho scritto un piccolo esempio illustrativo che spero possa esserti utile.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>

int main(int argc, char *argv[])
{
   if(argc != 3)
   {
      printf("\nusage: %s ROWS COLS\n\n", basename(argv[0]));
      exit(1);
   }
   else
   {
      int rows = atoi(argv[1]) + 1, cols = atoi(argv[2]) + 1;
      int matrix[rows][cols];
      int ir = 0, ic = 0;

      for(ir = 0; ir < rows; ir++)
      {
         for(ic = 0; ic < cols; ic++)
            matrix[ir][ic] = ir * ic;
      }

      for(ir = 1; ir < rows; ir++)
      {
         for(ic = 1; ic < cols; ic++)
            printf("[%.2d]", matrix[ir][ic]);
      
         printf("\n");
      }
      
      exit(0);
   }
}


PS: vedo che mi hai anticipato. Posta il codice..

O_/
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

3
voti

[10] Re: Dichiarare delle matrici (prog C)

Messaggioda Foto Utentesimo85 » 7 ago 2013, 16:27

tecfil ha scritto:Io devo prima dichiarare il puntatore e poi con la malloc dichiarare la grandezza del vettore?


Si. Dichiari il puntatore e successivamente con la malloc decidi tu quanti byte di memoria allocare.
Visto che hai difficoltà con la malloc ti posto un semplice esempio in cui vengono allocati 7 byte di memoria.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

void main(void)
{
   char *pointer = NULL;
   pointer = (char*) malloc (sizeof(char) * 7);

   free(pointer);
   exit(0);
}


Se c'è qualcosa che non capisci chiedi pure.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti