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

    [C/C++] una cosa un po tricky

    il seguente codice compila con un compilatore c ma non con uno c++

    codice:
    #include <stdio.h>
    
    int m,n;
    int f(int a[m][n]){
    	printf("values = %d - %d\n",m,n);
    }
    
    int main(){
    	int i,j;
    	m = 5; n = 4;
    	int b[m][n];
    	for (i = 0; i< m;i++) 
    		for(j=0;j<n;j++)
    			b[i][j] = i*j; /* assegna questo valore tanto per inizializzare*/
    
    	f(b);
    }
    usando Dev-C++ se lo compilo in un progetto C va bene, se il progetto è C++ mi dice:

    " variable-size type declared outside of any function "
    "cannot convert `int (*)[((unsigned int)((int)n))]' to `int (*)[2]' for argument `1' to `int f(int (*)[2])' "

    inoltre il programma nonostante compili, non è corretto:
    la dichiarazione int b[m][n] è una dichiarazione a tempo di compilazione con valori
    che vengono definiti solo al momento dell'esecuzione. infatti con m = n = 1000
    va in seg fault.

    ma veniamo alla domanda:
    Il problema è che ho una funziona già scritta in C che prende come argomento una matrice
    e non so come fare perche la dimensione della matrice non è definibile a tempo di
    compilazione. Mi sembra che le matrici siano intrattabili a meno di non definire le dimensioni a tempo di compil. (es: int a[10][10]) oppure a meno di ricorrere ad un unico array
    ed accdervi con a[(numero_riga * numero_totale_di_colone)+numero di colonna],
    cosa che la funzione di cui sopra non fa.

    qualcuno ha qualche consiglio utile?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Suggerisco l'uso di titoli più significativi per le prossime discussioni, che diano un'idea del contenuto o del problema centrale.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    In generale, sia in C che in C++, la dichiarazione delle dimensioni di un array tramite variabili definite solo a run-time non è definita dallo standard ISO ed è supportata solo da alcuni compilatori; il metodo corretto per implementare un array di dimensioni variabili è di usare la malloc (in C) o new (in C++).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    In generale, sia in C che in C++, la dichiarazione delle dimensioni di un array tramite variabili definite solo a run-time non è definita dallo standard ISO ed è supportata solo da alcuni compilatori; il metodo corretto per implementare un array di dimensioni variabili è di usare la malloc (in C) o new (in C++).
    sono daccordissimo,
    ma sia con malloc che con new è possibile dichiarare solo vettori,
    che poi possono essere pensati come matrici se faccio ad esempio a[(i*ncol) + j],
    ma non vanno bene da passare ad una funzione che mi chiede un 'a[][]' come argomento.
    e quindi non c'è niente da fare.
    Sbaglio?

  5. #5
    Originariamente inviato da Mr.Bloom
    sono daccordissimo,
    ma sia con malloc che con new è possibile dichiarare solo vettori
    Non è vero. Con malloc ottieni un puntatore a della memoria allocata (di cui puoi effettuare il casting in qualunque modo) e con new ottieni un effetto simile, ma ottieni un puntatore già tipizzato come preferisci.
    ma non vanno bene da passare ad una funzione che mi chiede un 'a[][]' come argomento.
    e quindi non c'è niente da fare.
    Per il compilatore 'int a[][]' è semplicemente un 'int *', non gliene importa nulla delle dimensioni dell'array. Certamente il discorso cambia se definisci la lunghezza di una delle due dimensioni al momento della compilazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.