Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Matrici dinamiche in C

Hybrid View

  1. #1
    Grazie . Lavorando sempre con i puntatori se faccio, ad esempio:
    codice:
     for(i=0; i<righe; i++){
            for(j=1; j<colonne; j++){
                if(una certa condizione) *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
                else *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
            }
        }
    Mi dà l'errore: "error: lvalue required as increment operand" (analogo per l'altro)?
    Ultima modifica di MItaly; 30-11-2015 a 02:46

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Quote Originariamente inviata da piergiuseppe24 Visualizza il messaggio
    Grazie . Lavorando sempre con i puntatori se faccio, ad esempio:

    for(i=0; i<righe; i++){
    for(j=1; j<colonne; j++){
    if(una certa condizione) *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
    else *(matrix+colonne*i+j)=*(matrix+colonne*i+(j-1))++;
    }
    }
    Mi dà l'errore: "error: lvalue required as increment operand" (analogo per l'altro)?
    codice:
    (*(matrix+colonne*i+(j-1)))++;
    lascio a te capire perché.

    Quote Originariamente inviata da oregon
    Scusa ma hai letto il codice che ti ho indicato? L'espressione che usi è sbagliata ... leggi quella corretta.
    diventa corretta se gestisce la matrice come un array monodimensionale, quindi usando un puntatore singolo. E' un modo alternativo (più con finalità didattiche che altro) di gestione delle matrici n-dimensionali.
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    diventa corretta se
    Certo, d'accordo con te. Quello che intendo è che lui è partito da un doppio puntatore che punta ad un vettore di puntatori.

    Dato che vuole seguire questa strada, avevo suggerito il codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Perché però, se ad esempio riempio la matrice in questo modo:
    codice:
    for(i=0; i<righe; i++){
            for(j=1; j<colonne; j++){
                (*(matrix+colonne*i+j))=(*(matrix+colonne*i+(j-1)))++;
            }
        }
    E poi la stampo
    ...
    codice:
    for(i=0; i<righe; i++){
            for(j=0; j<colonne; j++){
                printf("%d ", (*(matrix+colonne*i+j)));
            }
            printf("\n");
        }
    mi stampa sul terminale:
    1 1 1 1 1 1 1 1 1 0
    1 1 1 1 1 1 1 1 1 0
    ?

  5. #5
    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
    Perché però[
    Devi indicare quale codice hai usato per l'allocazione altrimenti si fa confusione tra i vari metodi ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E soprattutto, ipotizzando che tu stia usando il metodo del puntatore singolo, che output ti attendi?
    every day above ground is a good one

  7. #7
    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

  8. #8
    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.

  9. #9
    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?

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.