0
votes

Comment retourner un tableau de la fonction A et ensuite la fonction B prend ce tableau

J'ai deux fonctions dans ma fonction principale.

J'ai essayé d'accomplir ce problème avec des pointeurs, mais comme débutant, il est très compliqué de travailler avec cela. P>

int main(){
  int *p;

  p = function_A();
  function_B(p);

  return 0; 
}

int function_A(){
  static int myArray[3];
  myArray[0] = 11;
  myArray[1] = 22;
  myArray[2] = 33;

  return myArray;
}

int function_B(int *myPointer){
  // Here I just want to print my array I've got from function_A() to the 
  // console

  printf("%d", *myPointer)
  return 0;
}


5 commentaires

Votre fonction_a retourne un int, pas un tableau INT.


Votre approche ne fonctionnera jamais, car vous devez également retourner la taille de la matrice.


Je ne sais pas si votre objectif est d'apprendre à utiliser un pointeur de fonction ou à simplement passez / modifier / Retour Un tableau.


Est-ce que la matrice de longueur connue et une longueur courte, comme 3 représentées dans la question?


@HYDE Oui, la longueur est connue dans ce cas.


4 Réponses :


2
votes

Il y a quelques problèmes que votre compilateur vous aura déjà dit. Premièrement, vous devez définir les fonctions avant de les appeler, ou au moins en avant, déclarez-les.

second, pour renvoyer un tableau, vous devez renvoyer un pointeur sur le premier élément de ce tableau, c'est-à-dire que le type de retour est int * code> et pas int code>. p>

troisième, comme Fredk a souligné, lorsque vous recevez juste un pointeur, vous n'avez aucune chance de déterminer le nombre d'éléments dans le tableau ça pointe de. Vous pouvez soit terminer la matrice avec une valeur spécifique, par ex. 0 code> ou vous devez renvoyer la taille de la matrice, aussi. p>

Voir les adaptations suivantes apportées à votre programme: P>

int* function_A(int *size){
    static int myArray[3];
    myArray[0] = 11;
    myArray[1] = 22;
    myArray[2] = 33;

    if (size) {
        *size = 3;
    }
    return myArray;
}

void function_B(int *myPointer, int size){
    for (int i=0; i<size; i++) {
        printf("%d\n", myPointer[i]);
    }
}

int main(){
    int *p;

    int size=0;
    p = function_A(&size);
    function_B(p,size);

    return 0;
}


1 commentaires

Merci!! Jamais pensé à la taille des pointeurs de pointer à



0
votes

Remarque: une référence à un tableau se dégrade à l'adresse du premier octet de la matrice.

Le code proposé suivant: p>

  1. compile parfaitement li>
  2. incorpore les commentaires à la question li>
  3. suppose que le programmeur connaît déjà la taille du tableau li>
  4. effectue la fonctionnalité souhaitée li>
  5. a annexé '\ n' à formater la chaîne d'appels vers printf () code> donc sortie sur des lignes distinctes li> ol>

    et maintenant, le code proposé: p> xxx pré>

    EURE du programme produit la sortie suivante: p>

    11
    22
    33
    


0 commentaires

0
votes

Disons que vous avez une fonction qui crée une maquette de int s: xxx

disons que tu as une fonction qui calcule la somme des entiers dans le déployer. Si nous ignorons les problèmes de débordement, cela pourrait ressembler à ceci: xxx

notez que taille de n'est pas une fonction, mais un mot clé de langage C. Son argument n'est examiné que pour sa taille. Ainsi, tailleof iarray [0] donne la taille de chaque élément dans iarray et est complètement sûr et valide même si iarray est indéfini ou null à ce moment. Vous voyez que les émissions d'idiome en C dans C; Apprenez à le lire comme "Taille du premier élément de iarray" , qui est identique à celui "taille de chaque élément de iarray" , car tous les éléments de la matrice de C ont exactement même taille.

dans votre principal () , vous pouvez les appeler ainsi: xxx

comme vous pouvez le voir, n'est vraiment pas grand chose à ça. Eh bien, vous devez vous familiariser avec la syntaxe du pointeur.

(la règle que j'aime souligner est que lorsque lorsque vous lisez des types de pointeur, lisez les spécificateurs de droite à gauche, délimité par * < / code> lire comme un pointeur sur . Ainsi, int * const a est "A est un const, un pointeur à int" , et const char ** b se lit comme "B est un pointeur sur un pointeur sur Const Char" .)


dans ce genre de Situations, une structure décrivant une matrice fait beaucoup plus de sens. Par exemple: xxx

L'idée est que vous pouvez déclarer une variable de iarray type tout comme vous le feriez toute autre variable; Mais vous initialisez également ceux à un tableau vide à l'aide du iarray_init macro. En d'autres termes, donc: xxx

avec cette initialisation, la structure est toujours initialisée à un état connu et nous n'avons pas besoin d'une fonction d'initialisation distincte. Nous n'avons vraiment besoin que de quelques fonctions d'assistance: xxx

le bit en ligne statique signifie que les fonctions ne sont visibles que dans cette unité de compilation et la Compiler est libre de mettre en œuvre la fonction directement sur le site d'appel. Fondamentalement, Statique Inline est utilisé pour les fonctions de type macro et les fonctions d'accesseur. Si vous mettez la structure dans un fichier d'en-tête (.h), vous mettez également les fonctions d'assistant STATIC ALLER .

La stratégie de croissance < / em> la partie n'est qu'un exemple. Si vous omettez la stratégie de croissance et réaffecter toujours à array-> num + plus éléments, votre code appellera realloc () très souvent, potentiellement pour chaque int annexé. Dans la plupart des cas, cela va souvent ralentir votre programme, car realloc () (ainsi que masloc () , calloc () ) est un peu lent. Pour éviter cela, nous préférons que la cavalise ou arrondir l'affectation un peu: pas trop pour perdre la mémoire allouée mais non utilisée, mais suffisamment pour conserver le programme global rapide et non sur trop de realloc () Appels.

une "bonne politique de croissance" est très utile de débattre et dépend vraiment de la tâche à accomplir. Ce qui précède devrait très bien fonctionner sur tous les systèmes d'exploitation actuels sur les machines de bureau, les ordinateurs portables et les tablettes, lorsque le programme n'a besoin que d'une poignée de ces tableaux.

(si un programme utilise de nombreux tableaux de ce type , il pourrait implémenter une fonction iarray_optimize () , qui réaffiche la matrice exactement au nombre d'éléments qu'il a. Chaque fois qu'un tableau est peu susceptible de changer de taille, appelera cette fonction garantira pas trop de mémoire est Assis inutilisé mais alloué dans les matrices.)

Regardons un exemple de fonction qui utilise ce qui précède. Dis, l'évident: Ajout d'un entier à la matrice: xxx

Un autre exemple de fonction serait celui qui trie le int s dans un tableau Valeur ascendant ou descendante: xxx

De nombreux nouveaux programmeurs ne réalisent pas que la bibliothèque C standard C a tifty et assez efficace QSort () Fonction pour les tableaux de tri; Tout ce dont il a besoin est une fonction de comparaison. Si le code est positif pour iarray_sort () , le tableau est trié par ordre croissant, le plus petit int d'abord; Si direction est négatif, puis en ordre décroissant, le plus grand int premier.

Un exemple simple principal () qui se lit Dans tous les int S de l'entrée standard, les trie et les imprime en ordre croissant (valeur croissante): xxx


0 commentaires

0
votes

Si la taille de la matrice est en effet 3 (ou une autre petite valeur fixe), vous pouvez simplement utiliser des structs comme des valeurs, comme: xxx


0 commentaires