2013-03-30 2 views
1
#include<stdio.h> 
using namespace std; 
void fun(int** a){} 
int main() 
{ 
    int n; 
    scanf("%d",&n); 
    int a[n][n]; 
    fun(a); 
    return 0; 
} 

obtenir cette erreur en C++, mais il fonctionne bien en C mais travaillant pour typecasted à (void *) d'un , puis la conversion en groupement = (int **) a:C++ accédant erreur double matrice de travail en c

test_.cpp:9:8: error: cannot convert 
    ‘int (*)[(((unsigned int)(((int)n) + -0x00000000000000001)) + 1)]’ 
to ‘int**’ for argument ‘1’ to ‘void fun(int**)’ 
tried to pass a[][size] but size is not known 
+0

puis comment passer un [n] [n] à la fonction si n est pris à partir de l'utilisateur – rsaisankalp

Répondre

1

Il y a quelques problèmes avec votre code. L'un est en C, l'autre en C++.

Le problème C:
Même en C, votre tableau multidimensionnel int a[n][n] ne convertit pas à un int**. Il y a une énorme différence entre les tableaux multidimensionnels déchiquetés (ou dentelés) et les tableaux multidimensionnels contigus. tableaux haillons sont déclarés et attribués comme

  • int ** jagged_array
    Un tableau en dents de scie déclaré dans ce style peut évidemment être passé comme argument int** à une fonction; il n'y a pas de conversion impliqué. Avec ce type de tableau, le programmeur doit allouer (et éventuellement libérer) du stockage pour un tableau de pointeurs int* à chacune des rangées du tableau et doit également allouer (et éventuellement libérer) du stockage pour chacune des rangées du tableau.

  • int * jagged_array[size_spec].
    Un tableau irrégulier déclaré dans ce style peut également être passé comme argument int** à une fonction en raison de la manière dont les tableaux se dégradent en pointeurs dans C (et C++). Avec ce type de tableau, le programmeur doit allouer (et éventuellement libérer) du stockage pour chacune des rangées du tableau.

Notez que dans les deux formes, il y a une place explicite en mémoire pour les int* pointeurs qui pointent vers les éléments Zeroth des lignes du tableau. Ce n'est pas le cas avec les tableaux multidimensionnels. Un pointeur vers une ligne dans un tableau multidimensionnel est calculé, non stocké. Un tableau multidimensionnel déclaré int a[n][n] ne peut pas se désintégrer en int**. Il se désintègre plutôt en int*[n]. En C, une fonction qui reçoit un tableau multidimensionnel de longueur variable tel que votre int a[n][n] doit être déclarée <return_type> fund (int n, int vla[n][n]). (L'argument tableau peut également être spécifié comme vla[][n]; la dimension externe n'est pas nécessaire.)


Le C++ problème:
Vous utilisez des tableaux de longueur variable. C++ ne supporte pas ce concept C99. Ce concept n'existait pas en C avec la version originale 1998 de C++. La norme C++ 2003 était une révision mineure de la norme C++ de 1998, de sorte qu'elle ne passait pas à C99. Les auteurs du plus récent standard C++, C++ 11, ont explicitement rejeté le support de ces tableaux de longueur variable C99. Vous ne pouvez pas utiliser de tableaux de longueur variable en C++, du moins pas de façon portative.

3

Les doubles tableaux ne sont PAS convertis en doubles pointeurs.

une double rangée Pass à votre fonction comme ceci:

void fun(int arr[][5]); 

Maintenant, il fonctionnera.

1

Lorsque T[N][N] se désintègre, il devient T*[N] pour lequel il n'y a pas de conversion viable lors du passage dans le tableau.

+0

je pense fun (void * p) int ** a = (int **) p fonctionne bien dans ce cas – rsaisankalp

1

Vous devez spécifier la deuxième taille de dimension lors du passage de tableau 2D aux fonctions. Sinon, les compilateurs ne peuvent pas faire d'adressage sur les éléments du tableau 2D sans connaître la taille de la deuxième dimension. Utilisez

f(a[][5]) 
+0

si a [n] [n] où n est pris de l'utilisateur a est passé car sa taille n'est pas connue autre que typecasting à (void *) existe-t-il une méthode pour passer des tableaux doubles dont la taille est définie par l'utilisateur – rsaisankalp

+0

mais comment se fait le code fonctionne bien dans c pouvez-vous éloignez mécanisme dans c – rsaisankalp