Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18

Discussione: Matrici dinamiche in C

  1. #11
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main(void){
        int *pos = NULL, r=0, c=0, t=0;
        int i, j;
        printf("Inserisci il numero di colonne: ");
        scanf("%d", &c);
        printf("Inserisci il numero di righe: ");
        scanf("%d", &r);
        pos = (int *)calloc(r*c, sizeof(int));
        srand48(time(0));
        /***/
        for(i=0; i<r; i++){
          for(j=1; j<c; j++){
        if(((double)lrand48()/RAND_MAX)>0.5){
          (*(pos+c*i+j))=(*(pos+c*i+(j-1)))++;
        }
        else (*(pos+c*i+j))=(*(pos+c*i+(j-1)))--;
    
          }
        }
        /***/
        for(i=0; i<r; j++){
          for(j=0; j<c; i++){
        printf("%d ", (*(pos+c*i+j)));
          }
          printf("\n");
        }
    }

    Per r=2, c=10:
    -1 1 1 -1 1 1 -1 1 -1 0
    -1 -1 -1 -1 -1 -1 1 1 1 0
    Ciò che mi aspetto è, data la casualità, che gli elementi di questa matrice siano numeri interi, non necessariamente +-1.
    Inoltre mi stampa l'ultima colonna sistematicamente nulla, cosa che dovrebbe accadere alla prima.
    Ultima modifica di piergiuseppe24; 30-11-2015 a 20:32

  2. #12
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    data la casualità


    La calloc azzera gli elementi del vettore. E' la malloc (che avevi usato prima) che non inizializza i valori lasciandoli casuali.

    cosa che dovrebbe accadere alla prima


    Facci capire ... posto che tutti i valori siano a zero inizialmente, secondo te quale dovrebbe essere il risultato usando questa linea

    (*(pos+c*i+j))=(*(pos+c*i+(j-1)))++risultato usando questa linea.

    E infine, nelle ultime due for utilizzi i e aumenti j e poi utilizzi j e aumenti i ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #13
    Ti faccio l'esempio monodimensionale (il programma simula un certo tipo di moto in più dimensioni).
    Questo è quello che viene fatto di norma:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main(void){
        int pos = 0;
        int i, seed;
        seed=time(0);
        for(i=0; i<10; i++){
            if(((double)lrand48()/RAND_MAX)<0.5) pos += 1;
            else pos -= 1;
            printf("%d %d\n", i, pos);
        }
    }
    Il problema sorge quando passo agli array (analogo per più dimensioni):
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    int main(void){
        int pos[10] = {0};
        int i, seed;
        seed=time(0);
        for(i=1; i<10; i++){
            if(((double)lrand48()/RAND_MAX)<0.5) (*(pos+i)) = (*(pos+(i-1)))++;
            else (*(pos+i)) = (*(pos+(i-1)))--;
            printf("%d %d\n", i, pos[i]);
        }
    }
    Sono stato chiaro?

  4. #14
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quindi dovrebbe essere

    (*(pos+i)) = (*(pos+(i-1))) - 1;

    e

    (*(pos+i)) = (*(pos+(i-1))) + 1;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #15
    !
    Ma il fatto che dando valori molto elevati al numero di colonne (es. 100000) mi dia un errore di segmentazione a cosa è dovuto?

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    !
    Ma il fatto che dando valori molto elevati al numero di colonne (es. 100000) mi dia un errore di segmentazione a cosa è dovuto?
    Al fatto che nell'esempio che hai mostrato l'array viene allocato nello stack ed è troppo grande per lo spazio disponibile.

    Ma queste sono nozioni di C/C++ basilari, non hanno a che vedere con la questione in oggetto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #17
    Esiste un modo che mi consenta di aumentare il numero di colonne senza che avvenga tutto questo?

  8. #18
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Con l'allocazione dinamica, che è l'argomento con cui hai cominciato questo thread.

    Thread che mi pare anche esaurito ... penso che per altri problemi ne dovrai aprire un altro apposito.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.