Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    [C] Allocazione array multidimensionale

    Salve a tutti. Dal momento che in C la scrittura "v[][]" che rappresenta una matrice bidimensionale altro non è che un'astazione, vorrei sapere come vengono organizzati in realtà ( in una dimensione) gli elementi di v all'interno della memoria in modo da poterli trattare con i puntatori. Ho provato a stampare una matrice in questo modo :
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    main()
    {
        int i;
        char parole[3][10];                             //alloco 30 elementi in memoria
        for(i=0;i<3;i++)
        {
            printf("Inserire la %d parola\n",i+1);     //leggo le tre parole
            scanf("%s",parole[i]);
        }
        for(i=0;i<30;i++)                                 //stampo il carattere in ogni cella
        {
            printf("%c ", *(parole+i));
        }
    
    system("pause");
    }
    ...per capire l'ordine ma vengo fuori solo simboli che non hanno nulla a che fare con le parole, e non c'è traccia di nessuna delle parole digitate ( ) . Qualcuno mi potrebbe illuminare?

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Aspetto , che persone piu competenti ti diano chiarimenti degni di nota

    ma voglio diriti , che stai usando una matrice , in pratica un array di array !
    se scrivi nel codice parole[0] equivale a riferirsi al primo elemento che è un array di 30 caratteri .
    per stampare tutti i caratteri devi riferirti alla seconda dimensione
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    main()
    {
        int i,j;
        char parole[3][10];                             //alloco 30 elementi in memoria
        for(i=0;i<3;i++)
        {
            printf("Inserire la %d parola\n",i+1);     //leggo le tre parole
            scanf("%s",parole[i]);
        }
     for (j=0;j<3;j++) //cicla per tutte e tre gli indici della prima dimensione
    {
        for(i=0;i<30;i++)                                 //stampo il carattere in ogni cella
        {
            printf("%c ", parole[j][i]);
        }
    }
    system("pause");
    }
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    So come funziona utilizzando la notazione "v[NUMERORIGHE][NUMEROCOLONNE]" ma sono interessato a capire come vengono realmente salvati i dati in memoria, per righe o per colonne...

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    vedo che le tue curiosita sono altre , ma come vengono salvate in memoria non dovrebbe
    interessarti , se non a scopo didattico , e comunque non influisce sulla programmazione
    in c , che ha le sue regole , come sapere come viene salvato un float in memoria non cambia il modo come si usa .

    piccala correzzione
    la condizione nel for interno la cambierei cosi


    for(i=0;parole[j][i]!=0;i++) //stampo il carattere in ogni cella
    {
    printf("%c ", parole[j][i]);
    }
    Tecnologia

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Se ci fai caso io nella stampa ho utilizzato l'aritmetica dei puntatori. Per usare la forma "v[][]" non serve a nulla sapere la disposizione, ma con i puntatori si, altrimenti non sai come " saltare " le celle.....

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La visualizzazione è sbagliata ... se scrivi

    codice:
        for(i=0; i<30; i++)
        {
    		char *p=(char *)parole+i;
    		printf("%X %c\n", p, *p);
        }
    capisci come sono memorizzati i dati.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Originariamente inviato da oregon
    La visualizzazione è sbagliata ... se scrivi

    codice:
        for(i=0; i<30; i++)
        {
    		char *p=(char *)parole+i;
    		printf("%X %c\n", p, *p);
        }
    capisci come sono memorizzati i dati.
    In questo modo per ogni cella ne stampo l'indirizzo in esadecimale e il contenuto giusto?
    Perchè il passaggio per *p ? Non potevo stampare direttamente i due valori?
    Ultima cosa: nella mia visualizzazione io non ho fatto altro che stampare tutti i contenuti delle celle puntate, per quale motivo non mi ritrovo,oltre ai caratteri che vengono fuori quando una parola finisce prima dello spazio, proprio le lettere delle parole(nel caso in cui queste siano sistemate per colonne) o proprio le parole(se sono sistemate per righe)?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da slashino
    In questo modo per ogni cella ne stampo l'indirizzo in esadecimale e il contenuto giusto?
    Giusto

    Perchè il passaggio per *p ? Non potevo stampare direttamente i due valori?
    Semplicemente per non scrivere due volte il (char *)parole+i

    Ultima cosa: nella mia visualizzazione io non ho fatto altro che stampare tutti i contenuti delle celle puntate, per quale motivo non mi ritrovo,oltre ai caratteri che vengono fuori quando una parola finisce prima dello spazio, proprio le lettere delle parole(nel caso in cui queste siano sistemate per colonne) o proprio le parole(se sono sistemate per righe)?
    Spiega nuovamente perché non l'ho capita ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Originariamente inviato da slashino
    In questo modo per ogni cella ne stampo l'indirizzo in esadecimale e il contenuto giusto?
    Perchè il passaggio per *p ? Non potevo stampare direttamente i due valori?
    Ultima cosa: nella mia visualizzazione io non ho fatto altro che stampare tutti i contenuti delle celle puntate, per quale motivo non mi ritrovo,oltre ai caratteri che vengono fuori quando una parola finisce prima dello spazio, proprio le lettere delle parole(nel caso in cui queste siano sistemate per colonne) o proprio le parole(se sono sistemate per righe)?
    L'unico problema del tuo codice è che facendo
    codice:
            printf("%c ", *(parole+i));
    quel parole + i ritornava un puntatore non corretto a causa dell'operazione di somma, quindi basterebbe anche
    codice:
            printf("%c ", *((char*)parole+i));
    Comunque le matrici in memoria non sono rappresentate a righe e colonne ma semplicemente come array.
    Poi è il compilatore che conoscendone la lunghezza e larghezza fa automaticamente il calcolo della posizione quando usi l'operatore [].
    lolide
    Java Programmer

    Informati

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Spiega nuovamente perché non l'ho capita ...
    Intendo dire che per come ho stampato io la matrice, dovrei comunque "trovare traccia" nella stampa delle lettere delle parole, almeno. Anche se l'ordine in cui le stampo non mi fa venire fuori la parola, dovrei comunque trovare le lettere, anche se in ordine ( apparentemente ) sparso. Esempio: So che è memorizzata la parola "casa". Stampo come avevo scritto io all'inizio; anche se non mi trovo:
    c a s a (.....altri caratteri " superflui " ...)
    dovrei comunque ottenere qualcosa del genere:
    c ( ..caratteri superfui..) a ( ..caratteri superfui..) s ( ..caratteri superfui..) a ( ..caratteri superfui..)

    O no?

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 © 2024 vBulletin Solutions, Inc. All rights reserved.