Je reçois tous les zéros dans global_array_of_file2.idea consiste à obtenir les valeurs mises à jour de File1.c
========================file1.c=========================== #include <stdio.h> #include <string.h> int global_array_of_file1[10]; void func1(int a1,int b) { int array1_of_func1[10] = {0}; int a; array1_of_func1[5] = 23; array1_of_func1[6] = 34; memcpy(global_array_of_file1,array1_of_func1,10*sizeof(int)); for (a = 0; a < 9; a++) { printf("from func_1 : global_array = %d \n " , global_array_of_file1[a]); } } void init_pointer(int *tmp) { tmp = global_array_of_file1; } ~ ==========================file2.c====================== #include<stdio.h> #include "file1.h" int global_array_of_file2[10] = {0}; int main() { int i; init_pointer(global_array_of_file2); func1(3,4); for(i = 0; i < 9 ; i++) { printf("global_array_of_file2 = %d \n" , global_array_of_file2[i]); } return 0; } ========================file1.h=========================== void init_pointer(int *tmp); void func1(int a,int b);
3 Réponses :
Le memcpy est faux. Vous ne copiez que 10 octets. P>
Un intégrateur est généralement de 4 octets long (32 bits), vous ne copiez donc que des pièces de la matrice, à savoir les dix premiers octets, vous copiez ainsi uniquement l'INT avec index 0,1,2 et la moitié de 4. p>
Vous devez copier 10 * Tailleof (int) P>
Oui, parce que ce code n'est pas un programme de travail. Mais cette membopie ne fait pas ce qu'il pense que cela le fait, donc je l'ai signalé.
OK, je pense que cela peut être corrigé facilement en faisant ci-dessous: p>
déclarer extern int int global_array_of_file1 [10] dans File1.c P>
Définir int global_array_of_file1 [10] = {0}; dans File2.c P>
Je n'ai même pas besoin d'initialiser le pointeur de File2.c (pas besoin d'appeler init_pointer) et plus RAM sera aussi enregistré :)! P>
Il y a deux problèmes ici:
premier numéro est: p>
Le code pour init_pointer ne fait rien: p> comme la variable TMP est un Copie de la variable d'entrée (appelée valeur), il ne fait rien.
Pour que cela fonctionne correctement, cela devrait être quelque chose comme ceci: p> Toutefois, car le global_array_of_file2 est déclaré comme une matrice, il s'agit en réalité d'un pointeur statique qui ne peut pas être changé. Impossible de modifier sa valeur à l'aide de l'énoncé comme ** TMP = global_array_of_file1. P> Il est possible de le faire fonctionner, vous devez appeler memcpy dans la méthode du pointeur init:
Comme ceci: p> Le deuxième problème est que le code à l'adresse principale, appelez d'abord l'init_pointer (qui ne fait rien), alors il appelle "Func1" qui initialise le tableau. L'ordre est le contraire. Premier appel à Func1 pour définir la matrice avec les valeurs appropriées, appelez la méthode init_array pour copier ces informations à Global Array 2.
Donc, au lieu de p> il doit être p> C'est tout si vous voulez avoir une copie Si vous le souhaitez, vous pouvez avoir le tableau même partagé entre fichiers forte>, pour le faire: p> au fichier1 .h déclarer le tableau comme externe: p> alors vous pouvez simplement l'utiliser à fichier2.c, qui incluent le fichier1.h p> p>
Ouais, approche externe que j'ai beaucoup aimé!
Nulle part dans le code que vous avez donné, il y a un point sur lequel vous mettez à jour (ou même référence)
global_array_of_file2 code>, à l'exception de l'appel à:
init_global_array_of_file_2 (global_array_of_file2) code> et vous 't nous a montré le code de cette fonction. Alors, où attendez-vous que la mise à jour se produise?
Son intérieur: // continue à appeler Func1 () à intervalle régulier et obtenez les valeurs mises à jour de Array1_of_func1 que j'ai essayé de mettre à jour en transmettant un pointeur dans File1.c, puis mettant à jour ce pointeur. Mise à jour du corps Func2 ()
Pourquoi votre taille est-elle une fois 10 et l'autre fois 5?
Je répète mon point précédent! Montrez-nous du code sur lequel vous pense i> b>
global_array_of_file2 code> est mis à jour - ou nous ne pouvons pas vraiment aider.
Les fonctions ont besoin de types de retour. C'est bizarre que vous ayez négligé d'inclure des types de retour, même si vous parlez d'appeler
Func1 () code> pour obtenir des données.
Est-ce trop pour vous demander de montrer votre code réel i>? Ce que vous avez ci-dessus, n'est-ce pas parce que cela ne compilerait jamais. Voyons un exemple qui compile réellement pour que nous puissions en parler dans des termes concrets.
Donnez-moi un peu de temps, je collerai bientôt. Je dois supprimer un code hérité.
mis à jour le code compilable.