Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [c] errore di Segmention fault.
Forum - C/C++ - [c] errore di Segmention fault.

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
tullio1995 (Normal User)
Rookie


Messaggi: 59
Iscritto: 20/03/2011

Segnala al moderatore
Postato alle 15:23
Domenica, 21/10/2012
Codice sorgente - presumibilmente C

  1. #include <stdio.h>
  2. int main() {
  3.         int rpm,cpm,rsm,csm;
  4.         printf("Inserisci le righe della prima matrice\n");
  5.         scanf("%d",&rpm);
  6.     printf("Inserisci le colonne della prima matrice\n");
  7.         scanf("%d",&cpm);
  8.         printf("Inserisci le righe della secondamatrice\n");
  9.         scanf("%d",&rsm);
  10.         printf("Inserisci le colonne della seconda matrice\n");
  11.         scanf("%d",&csm);
  12.         if (cpm!=rsm){
  13.                 printf("Il prodotto non si può fare!\n");
  14.         } else{
  15.         double pm[rpm][cpm],sm[rsm][csm];
  16.         int i,j;
  17.         for (i=0;i<rpm;i++){ //carica prima matrice
  18.                 for(j=0;j<cpm;j++){
  19.                 printf("(Prima matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
  20.                 scanf("%lf",&pm[i][j]);
  21.                 } //next i
  22.         } //next j
  23.         for (i=0;i<rsm;i++){ //carica seconda matrice
  24.                 for(j=0;j<csm;j++){
  25.                 printf("(Seconda matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
  26.                 scanf("%lf",&sm[i][j]);
  27.                 } //next i
  28.         } //next j
  29.         double mr[rpm][csm],mp[cpm],p;
  30.         int x,c;
  31.         x=0;
  32.         for (i=0;i<rpm;i++){
  33.                 p=0;
  34.                 for (j=0;j<csm;i++){
  35.                 mp[j]=pm[i][j]*sm[j][i];
  36.                 }
  37.                 for (c=0;i<cpm;c++){
  38.                         p=p+mp[c];
  39.                 }
  40.                 mr[i][x]=p;
  41.                 x++;
  42.         }
  43.         for (i=0;i<rpm;i++){
  44.                 for(j=0;j<csm;j++){
  45.                 printf("%lf ",mr[i][j]);
  46.         }
  47.         printf("\n");
  48. }
  49.         }  //else
  50.         return 0;
  51. }


questo codice "dovrebbe" calcolare il prodotto di due matrici, ma dopo la carica delle matrici, il programma esce con l'errore di segmention fault. come risolverlo?

PM Quote
Avatar
dmr (Normal User)
Pro


Messaggi: 141
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 16:10
Domenica, 21/10/2012
Non l'ho compilato però l'ho letto molto velocemente e ho visto che nella riga 34 c'è un ciclo infinito perchè non incrementi j.

Ultima modifica effettuata da dmr il 21/10/2012 alle 16:39
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 19:12
Domenica, 21/10/2012
per prima cosa non puoi dichiarare le matrici in questo modo:

Codice sorgente - presumibilmente C/C++

  1. double pm[rpm][cpm],sm[rsm][csm];



poiche le dimensioni rpm,cpm,rsm,csm non sono note al momento della compilazione, ma solo durante l'esecuzione percio' devi dichiararle dinamicamente

Codice sorgente - presumibilmente C/C++

  1. double *pm = (double*)malloc(sizeof(double)*rpm*cpm);
  2. double *sm = (double*)malloc(sizeof(double)*rsm*csm);



se non ti e' chiaro cosa fa questo codice, semplicemente allora uno spazio in memoria per ogni matrice abbastanza grande da contenere n-elementi (dove n e' il prodotto rpm*cpm quindi il numero di elementi della matrice, moltiplicato per il numero di byte che occupa in memoria un double: sizeof(double) )

percui il tuo codice diventa cosi:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.         int rpm,cpm,rsm,csm;
  6.  
  7.         printf("Inserisci le righe della prima matrice\n");
  8.         scanf("%d",&rpm);
  9.         printf("Inserisci le colonne della prima matrice\n");
  10.         scanf("%d",&cpm);
  11.  
  12.  
  13.         printf("Inserisci le righe della seconda matrice\n");
  14.         scanf("%d",&rsm);
  15.         printf("Inserisci le colonne della seconda matrice\n");
  16.         scanf("%d",&csm);
  17.  
  18.         if (cpm != rsm)
  19.         {
  20.                  printf("Il prodotto non si può fare!\n");
  21.         }
  22.         else
  23.        {
  24.         double *pm = (double*)malloc(sizeof(double)*rpm*cpm);
  25.         double *sm = (double*)malloc(sizeof(double)*rsm*csm);
  26.        
  27.         int i,j;
  28.  
  29.         for (i=0;i<rpm;i++)
  30.         { //carica prima matrice
  31.              for(j=0;j<cpm;j++)
  32.              {
  33.                 printf("(Prima matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
  34.                 scanf("%lf",&pm[i][j]);
  35.               } //next i
  36.         } //next j
  37.  
  38.         for (i=0;i<rsm;i++)
  39.         { //carica seconda matrice
  40.               for(j=0;j<csm;j++)
  41.              {
  42.                 printf("(Seconda matrice)Inserisci il valore della pos. %d,%d ",i+1,j+1);
  43.                 scanf("%lf",&sm[i][j]);
  44.               } //next i
  45.         } //next j
  46.  
  47.         double *mr = (double*)malloc(sizeof(double)*rpm*csm);
  48.         double *mp = (double*)malloc(sizeof(double)*cpm);
  49.         double p;
  50.  
  51.         int x,c;
  52.         x=0;
  53.         for (i=0;i<rpm;i++)
  54.        {
  55.                 p=0;
  56.                 for (j=0;j<csm;j++)
  57.                {
  58.                  mp[j]=pm[i][j]*sm[j][i];
  59.                }
  60.                 for (c=0;c<cpm;c++)
  61.                {
  62.                         p=p+mp[c];
  63.                 }
  64.                 mr[i][x]=p;
  65.                 x++;
  66.         }
  67.  
  68.         for (i=0;i<rpm;i++)
  69.        {
  70.                 for(j=0;j<csm;j++)
  71.                {
  72.                   printf("%lf ",mr[i][j]);
  73.                }
  74.         printf("\n");
  75.        }
  76.  
  77.         free(pm); //Libero la memoria allocata precedentemente
  78.         free(sm);
  79.         free(mr);
  80.         free(mp);
  81.         }  //else
  82.         return 0;
  83. }



non ho controllato l'algoritmo di moltiplicazione delle matrici, mi sono solo limitato a correggere gli errori che ti ho detto (inoltre la riga 34 e la riga 37 erano sbagliate perche' creavano dei cicli infiniti)
per lo meno ora non dovrebbe piu' andare in segmentation fault :k:

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:09
Domenica, 21/10/2012
Testo quotato

Postato originariamente da carlduke:

per prima cosa non puoi dichiarare le matrici in questo modo:

Codice sorgente - presumibilmente C/C++

  1. double pm[rpm][cpm],sm[rsm][csm];



poiche le dimensioni rpm,cpm,rsm,csm non sono note al momento della compilazione, ma solo durante l'esecuzione percio' devi dichiararle dinamicamente



Per essere precisi questo dipende dal compilatore... nello standard C99 gli array di lunghezza variabile sono possibili.

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html


Il mio blog: https://piero.dev
PM Quote
Avatar
tullio1995 (Normal User)
Rookie


Messaggi: 59
Iscritto: 20/03/2011

Segnala al moderatore
Postato alle 20:10
Domenica, 21/10/2012
Carl ora da una marea di errori : "error: subscripted value is neither array nor pointer nor vector"
Ecco i pnti dove da errore : (32,35) (41,35) (56,29) (56,38) (62,21) (70,28) e poi ci sono alcuni warning quando uso gli scanf

PM Quote
Avatar
tullio1995 (Normal User)
Rookie


Messaggi: 59
Iscritto: 20/03/2011

Segnala al moderatore
Postato alle 20:13
Domenica, 21/10/2012
Io uso geany su ubuntu per scrivere e compilare, credo faccia una specie di debug

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:13
Domenica, 21/10/2012
Poi qui:

Codice sorgente - presumibilmente C/C++

  1. int mp[cpm];
  2. //....
  3.  
  4. for (j=0;j<csm;i++){
  5.     mp[j]=pm[i][j]*sm[j][i];
  6. }



mp ha lunghezza cpm, ma poi iteri per csm... e incrementi i invece di j. :nono:


Il mio blog: https://piero.dev
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 20:20
Domenica, 21/10/2012
Testo quotato

Postato originariamente da tullio1995:

Carl ora da una marea di errori : "error: subscripted value is neither array nor pointer nor vector"
Ecco i pnti dove da errore : (32,35) (41,35) (56,29) (56,38) (62,21) (70,28) e poi ci sono alcuni warning quando uso gli scanf



beh si perche' dichiarando le matrici in quella maniera non hai piu' un vettore bidimensionale [righe][colonne], ma solamente un array [righe*colonne],
quindi o dichiari come vettore bidimensionale (ti consiglio sempre dinamicamente cosi' il tuo codice e' portabile su tutti i compilatori senza modifiche) oppure quando devi prelevare un elemento riga-colonna dalla matrice, vai a prelevare l'elemento corrispondente sull'array che e' dato da riga*numero_totale_righe + colonna;

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 20:21
Domenica, 21/10/2012
Testo quotato

Postato originariamente da pierotofy:

Poi qui:

Codice sorgente - presumibilmente C/C++

  1. int mp[cpm];
  2. //....
  3.  
  4. for (j=0;j<csm;i++){
  5.     mp[j]=pm[i][j]*sm[j][i];
  6. }



mp ha lunghezza cpm, ma poi iteri per csm... e incrementi i invece di j. :nono:



gia!! per evitare questi errori ti consiglio una nomenclatura delle variabili piu' autoesplicativa tipo anziche' pm o sm,  magari matrice1,matrice2,matriceRisulato ecc ecc :k:

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo