Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    C Matrice da alloca dinamicamente e da ritornare

    Ragazzi dove sbaglio??
    Sicuramente sbaglio o nel ritorno o nell'inizializzazione del main ma non riesco a capire che errore di sintassi c'è.
    Il programma(molto semplice) ve l'ho commentato cosi vediamo anche se oltre alla sintassi c'è da rivedere la logica.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int** allocMatrix( void );
    
    int main(void) {
    
    	//metto dentro al puntatore matrix l'indirizzo a matrix che mi ritorna
    	int *matrix = allocMatrix
    
    	return 0;
    }
    
    int** allocMatrix( void ) {
    	printf("Inserire lato matrice quadrata: ");
    	int l;
    	scanf("%d", &l);
    	/* dichiaro un puntatore che contiene l'indirizzo ad un array lungo l*l */
    	int *matrix = malloc(sizeof(int)*(l*l));
    	for(int i = 0; i < l*l; i++)
    		matrix[i] = 33;
    	/* ritorno quello che c'è dentro alla variabile puntatore matrix ovvero, l'indirizzo dell'array l*l */
    	return matrix;
    }
    3@tre ~
    $ gcc -Wall -std=c99 -o a.exe a.c
    a.c: In function ‘main’:
    a.c:9:16: warning: initialization from incompatible pointer type
    a.c:11:2: error: expected ‘,’ or ‘;’ before ‘return’
    a.c:9:7: warning: unused variable ‘matrix’
    a.c: In function ‘allocMatrix’:
    a.c:23:2: warning: return from incompatible pointer type
    Le specifiche dell'esercizio sono:
    Gli elementi della matrice ritornata si devono poter accedere tramite la sintassi delle parentesi quadre

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: C Matrice da alloca dinamicamente e da ritornare

    Originariamente inviato da VYCanisMajoris
    Ragazzi dove sbaglio??
    codice:
    	//metto dentro al puntatore matrix l'indirizzo a matrix che mi ritorna
    	int **matrix = allocMatrix() /* qui? */
    
    	return 0;
    }
    Che poi non ho capito se devi ritornare un doppio puntatore (matrice?) o solo un array.
    Nel primo caso è proprio sbagliata la funzione allocMatrix()
    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.

  3. #3
    Hai ragione scusami per la poca chiarezza, mi spiego meglio subito
    Il da farsi è questo:
    Obiettivo del programma:
    creare una matrice inizializzata tutta a 33 di lato x scelto dall'utente.
    Step che ho pensato:
    Nella funzione allocMatrix dichiaro una matrice e la alloco dinamicamente in base all'x inserita dall'utente. Ritorno questa matrice al main.
    Ora il modo in cui ritornarla presumo che debba tornare il puntatore alla matrice, poichè la matrice stessa non può essere ritornata.
    Dal main "accolgo" quanto ritornato(l'indirizzo in memoria della matrice) in una variabile appropriata, che sarà un puntatore alla matrice.

    Originariamente inviato da shodan
    Che poi non ho capito se devi ritornare un doppio puntatore (matrice?) o solo un array.
    Nel primo caso è proprio sbagliata la funzione allocMatrix()
    Corregendo quello che mi ha segnalato mi esce fuori questo messaggio di errore:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    int** allocMatrix( void );
    
    int main(void) {
    
    	//metto dentro al puntatore matrix l'indirizzo a matrix che mi ritorna
    	int **matrix = allocMatrix();
    
    	return 0;
    }
    
    int** allocMatrix( void ) {
    	printf("Inserire lato matrice quadrata: ");
    	int l;
    	scanf("%d", &l);
    	/* dichiaro un puntatore che contiene l'indirizzo ad un array lungo l*l */
    	int *matrix = malloc(sizeof(int)*(l*l));
    	for(int i = 0; i < l*l; i++)
    		matrix[i] = 33;
    	/* ritorno quello che c'è dentro alla variabile puntatore matrix ovvero, l'indirizzo dell'array l*l */
    	return matrix;
    }
    a.c: In function ‘allocMatrix’:
    a.c:23:2: warning: return from incompatible pointer type
    Questo è quanto, spero di essermi spiegato ora

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ok, detto questo (tutto chiaro) ... tu sai come si alloca dinamicamente una matrice?

    Perché hai scritto quel codice?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    No, non so farlo, non pensavo ci fosse una tecnica precisa, io pensavo ce si facesse allocando come se fosse un array dritto n*n elementi

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh ... lo puoi fare, ma avrai un vettore ... quindi non ci capisce perché hai previsto un puntatore doppio ...

    Leggi questo thread

    http://forum.html.it/forum/showthrea...zione+dinamica
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Ok ho letto.
    Quindi dovrei fare cosi, per allocare una matrice di int dinamica
    codice:
    matrix = malloc(sizeof(int*)*n);
    for (i = 0; i < n; i++) 
         matrix[i]= malloc(sizeof(int)*n);
    Faccio un pochino fatica a capirlo...
    Mi sembra un array di puntatori a int, e ogni casella dell'array di puntatori punta a un array che guarda caso è lungo n come tutti gli altri, perchè appunto è una matrice quadrata. E' corretto?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per maggiore chiarezza

    codice:
    matrix = (int **)malloc(sizeof(int*)*n);
    for (i = 0; i < n; i++) 
         matrix[i]= (int *)malloc(sizeof(int)*n);
    Faccio un pochino fatica a capirlo...
    Beh ... forse la prima volta ...

    Mi sembra ...
    Corretto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Si in effetti mi sono ricordato che conosco gli array di stringhe e quindi il tutto è ritornato familiare
    Ti ringrazio molto!!! Ora termino l'esercizio(che in realtà era un altro) quello che ho scritto qui è solo un estratto per semplificarci le cose e riposto se ho bisogno!!!

  10. #10
    Guarda in merito al tuo primo posto, ti spiego gli errori:

    dopo int *matrix = allocMatrix ci devi mettere il punto e virgola.

    La funzione allocMatrix la dichiari come doppio puntatore a int mentre ritorni un puntatore a int.


    Quanto al problema, in teoria è possibile creare una matrice quadrata di ordine n come un array unidimensionale di lunghezza n*n (è lo stesso metodo usato per memorizzare un array bidimensionale sullo stack, invece che sull'heap).
    Basta fare come hai fatto tu e poi per accedere all'elemento usare la formula:

    elemento = i * nc+j

    dove i è la riga e j è la colonna, mentre nc sarebbe la dimensione dell'array (ne basta una).

    Ma come ti ha suggerito oregon, è meglio utilizzare l'altro metodo, più veloce.

    Se ti può interessare, ho creato un programma (è in c++, cambia solo qualcosina di I/O e la malloc che è stata sostituita da new) per calcolare il determinante di una matrice di qualsiasi ordine:
    http://newbufferedwriter.blogspot.co...te-di-una.html

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.