2011-01-18 1 views
0

Pourquoi nous pouvons faire quelque chose commeC++ C2466 erreur

 for(int i = 0; i < destination->imageSize; i=i+3) 
     { 

      buffer[2] = destination->imageData[i]; 
      buffer[1] = destination->imageData[i+1]; 
      buffer[0] = destination->imageData[i+2]; 
      buffer+=3; 
     } 

mais nous ne pouvons pas faire

       char buffer[destination->imageSize]; 

Et comment une telle chose?

Désolé - Je suis tout à fait nouveau pour C++ ...

BTW: mon point est de créer une fonction qui renvoie un omble chevalier avec une image. Si j'utilise mem copy, comment puis-je supprimer la valeur retournée?

+1

en utilisant '' vecteur à la place? –

+0

Quelle est la question? Pourquoi vous ne pouvez pas allouer un tableau d'une taille déterminée lors de l'exécution? Comment? Avez-vous des problèmes avec la gestion manuelle de la mémoire? Quels problèmes? Autre chose? – delnan

Répondre

4

Je dois demander, pourquoi pensez-vous qu'ils sont liés? Si vous ne pouviez pas indexer un tableau en fonction de la variable d'exécution, il serait inutile de créer des tableaux. Déclarer une variable d'une taille régie par une variable d'exécution est entièrement différent et nécessite des changements fondamentaux dans la façon dont le compilateur gère la mémoire automatique.

Quelle est la raison pour laquelle vous ne pouvez pas le faire en C++. Cela peut changer, mais pour l'instant vous ne pouvez pas.

Si vous avez vraiment besoin d'un tableau de taille variable, vous devez allouer une dynamique. Vous pouvez le faire de la manière dure, f'd (char * buff = new char[size]...delete [] buff;), ou vous pouvez le faire de la manière facile, plus sûre (std::vector<char> buff(size)). Votre choix. Vous ne pouvez pas le construire "sur la pile" cependant.

+0

"Vous ne pouvez pas le construire" sur la pile "cependant." - vous le pouvez, mais alloca() n'est pas une fonction standard, bien qu'elle soit présente sur pratiquement toutes les plateformes. –

1
  1. Vous ne pouvez pas retourner une baie locale. Tout ce que vous retournerez devra être libéré par quelqu'un.

  2. La taille d'un tableau local doit être constante. Toujours. C'est parce qu'il n'y a pas de logique spéciale autour des tableaux en C++. Vous pouvez utiliser une collection d'objets de STL.

2

char buffer[destination->imageSize]; déclare une variable à compiler temps. A ce moment, la valeur de destination->imageSize n'est pas encore connue, c'est pourquoi cela ne fonctionne pas.

L'expression buffer[2] = destination->imageData[i]; (ou plutôt le tampon [2] de celui-ci) est évaluée lors de l'exécution.

1

Hmm. Avez-vous essayé de créer un pointeur ou une référence à destination-> imageSize et de le passer à la place pour l'index?

1

En utilisant std :: vecteur vous pouvez réaliser ce que vous désirez. Votre fonction peut être définie comme ceci:

void readImage(std::vector<char>& imageData, std::string& filename) 
{ 
    size_t imageSize = 0; 
    //read file and load imageSize 
    imageData.resize(imageSize); 
    // load image into imageData using such as you in your question 
    for(int i = 0; i < destination->imageSize; i=i+3) 
    { 

     buffer[2] = destination->imageData[i]; 
     buffer[1] = destination->imageData[i+1]; 
     buffer[0] = destination->imageData[i+2]; 
     buffer+=3; 
    } 
} 

Pour d'autres améliorations que vous pourriez revenir un bool qui indique la réussite ou l'échec.

En ce qui concerne la cause de C2466, je n'ai pas la réponse officielle, mais vous pouvez déclarer des tableaux avec des variables const ombles comme ceci: ne

const int imageSize = 4242; 
char imageData[imageSize]; // No C2466 error 
+0

... mais const int iom = destination-> imageSize; \t \t char buffer [iom]; est toujours C2466 – Rella

+0

@Kabumbus Oui parce que Noah Roberts indique que la valeur de iom dépend d'une valeur d'exécution. –