Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13

    [c]allocazione dinamica per array bidim. e passaggio come parametro

    ciao a tutti
    ho un problema con un esercizio.
    Devo creare un array bidimensionale di tipo char dopo aver dato la dimensione in input.
    Poi tale array deve essere passato come argomento in una funzione.
    Il problema è il programma si chiude subito, non posso immettere nenche i parametri. Penso che il problema sia proprio nella creazione della matrice; dato che sono ancora agli inizi con il C mi affido alla vostra sapienza
    grazie

    questo è il codice
    codice:
    int main(){
        int k, n, r0, c0;
        char M[n][n], *a;
        printf("inserisci ordine matrice\n");
        scanf("%d",&n);
        printf("inserisci indice prima riga\n");
        scanf("%d",&r0);
        printf("inserisci indice prima colonna\n");
        scanf("%d",&c0);
        printf("inserisci ordine tappeto\n");
        scanf("%d",&k);
        a=malloc(n*n*sizeof(char));
        M[0][0]=*a;
        sierpinskiCarpet(n,M[n][n],r0,c0,k);
      system("PAUSE");
      return 0;	
                  }
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

  2. #2

    Re: [c]allocazione dinamica per array bidim. e passaggio come parametro

    Originariamente inviato da Fenzo
    ciao a tutti
    ho un problema con un esercizio.
    Devo creare un array bidimensionale di tipo char dopo aver dato la dimensione in input.
    Poi tale array deve essere passato come argomento in una funzione.
    Il problema è che dopo aver immesso tutti i parametri richiesti dal main, il programma si chiude, come se la funzione non venisse chiamata. Penso che il problema sia proprio nella creazione della matrice; dato che sono ancora agli inizi con il C mi affido alla vostra sapienza
    grazie

    questo è il codice
    codice:
    int main(){
        int k, n, r0, c0;
        char M[n][n], *a;
        printf("inserisci ordine matrice\n");
        scanf("%d",&n);
        printf("inserisci indice prima riga\n");
        scanf("%d",&r0);
        printf("inserisci indice prima colonna\n");
        scanf("%d",&c0);
        printf("inserisci ordine tappeto\n");
        scanf("%d",&k);
        a=malloc(n*n*sizeof(char));
        M[0][0]=*a;
        sierpinskiCarpet(n,M,r0,c0,k);
      system("PAUSE");
      return 0;	
                  }
    a=malloc(n*n*sizeof(char)); <--- WRONG

    prima allochi le righe
    poi con un for allochi le colonne

    con la tua soluzione hai semplicemente creato un array A di n*n "caselle"

    edit: in più non capisco la parte iniziale dove hai un
    char M[n][n] senza avere n inizializzata a nessun valore

    ma scusa il compilatore non ti restituisce nessun warning? Se no, per favore, cambialo

    e non capisco nemmeno il fatto che poi a M assegni "a"
    facendo un M[n][n] già allochi (allocazione automatica), non ha senso fare ciò che tu hai fatto.

    Dovresti prima creare un char** M;
    quindi fare l'allocazione dinamica come ti ho spiegato sopra

    a quel punto puoi accedere alle posizione di M come se fosse una matrice normale.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13

    Re: Re: [c]allocazione dinamica per array bidim. e passaggio come parametro

    Originariamente inviato da Celebron
    a=malloc(n*n*sizeof(char)); <--- WRONG

    prima allochi le righe
    poi con un for allochi le colonne

    con la tua soluzione hai semplicemente creato un array A di n*n "caselle"
    quindi se ho capito bene dovrei scrivere
    codice:
    a=malloc(n*sizeof(char));
    for (i=0,i<=n,i++)
         *(a+i)=malloc(n*sizeof(char))
    edit: in più non capisco la parte iniziale dove hai un
    char M[n][n] senza avere n inizializzata a nessun valore

    ma scusa il compilatore non ti restituisce nessun warning? Se no, per favore, cambialo

    e non capisco nemmeno il fatto che poi a M assegni "a"
    facendo un M[n][n] già allochi (allocazione automatica), non ha senso fare ciò che tu hai fatto.

    Dovresti prima creare un char** M;
    quindi fare l'allocazione dinamica come ti ho spiegato sopra

    a quel punto puoi accedere alle posizione di M come se fosse una matrice normale.
    per quanto riguarda il compilatore, uso devc++. Lo so che fa schifo ma sul computer che sto usando ora ho windows e non sono riuscito a trovare di meglio. E comunque (e la cosa mi preoccupa!) non mi da nessun warning.
    Il fatto è che questo è uno degli esercizi che ha assegnato il professore. Già non sono sicuro di poter usare l'allocazione dinamica e inoltre la funzione che devo fare deve avere come parametro M[n][n] non un puntatore.
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

  4. #4

    Re: Re: Re: [c]allocazione dinamica per array bidim. e passaggio come parametro

    Originariamente inviato da Fenzo
    quindi se ho capito bene dovrei scrivere
    codice:
    a=malloc(n*sizeof(char));
    for (i=0,i<=n,i++)
         *(a+i)=malloc(n*sizeof(char))


    per quanto riguarda il compilatore, uso devc++. Lo so che fa schifo ma sul computer che sto usando ora ho windows e non sono riuscito a trovare di meglio. E comunque (e la cosa mi preoccupa!) non mi da nessun warning.
    Il fatto è che questo è uno degli esercizi che ha assegnato il professore. Già non sono sicuro di poter usare l'allocazione dinamica e inoltre la funzione che devo fare deve avere come parametro M[n][n] non un puntatore.
    no, essendo a un char **, l'allocazione deve essere congrua con il tipo
    codice:
    a = (char**) malloc( n* sizeof(char*));
    for (i=0; i<n; i++) // <, non <=
         a[i]= (char*) malloc(n*sizeof(char));
    in ogni caso, quando passi una matrice a una funzione, nel prototipo della funzione scrivi:

    funzione(tipo_t** mat){
    //qua dentro poi può far riferimento con i metodi di accesso classico
    }

    Magari alla funzione passa anche gli indici max_riga e max_colonna, in modo che tu possa controllare in eventuali cicli di non andare outofbound

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13
    ok ho capito.
    comunque il prototipo della funzione che devo fare e questo
    codice:
    void sierpinskiCarpet(int n, char[n][n], r0, c0, k)
    il fatto è che ho chiesto al professore e ha detto che l'allocazione non serve.
    Ora mi viene la curiosità di capire come posso creare quell'array senza usare malloc...
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dovresti anche chiedergli a che standard C fa riferimento, se C89 o C99.
    Una dichiarazione simile (al di la che n non sia inizializzata) funziona solo in C99.
    codice:
        int k, n , r0, c0;
        char M[n ][n ], *a;
    ma non in C89 o in C++. In DEVC++ dovresti avere uno switch del compilatore per forzare l'uso tra i due standard.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    13
    il manuale che ha consigliato fa riferimento a ANSI C, quindi penso che il professore faccia riferimento a quello.

    Nel frattempo mi sto scaricando ubuntu, almeno avrò un compilatore decente.
    Ora un 'altra domanda: è possibile fare una cosa del genere
    codice:
    int main (){
    int n; 
    printf("inserisci ordine matrice\n");
    scanf("%d", &n);
    .
    .
    .
    char M[n][n];
    cioè dichiarò l'array dopo aver letto n?
    Inoltre, quando chiamo la funzione, dato che le dimensioni dell'array devono essere indicate, posso usare n oppure deve essere per forza un numero?
    ...liberation of the human mind and the dominion of religion; the liberation of the human body from the dominion of property; liberation from shackles and restraint of government. It stands for social order based on the free grouping of individuals... (E.G.)

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.