Forum Heroes' Chronicles
http://forum.heroeschronicles.nainwak.org/phpbb3/

Un petit problème de programmation.
http://forum.heroeschronicles.nainwak.org/phpbb3/viewtopic.php?f=8&t=19337
Page 1 sur 1

Auteur:  Arkaïn [ Lun 10 Mars, 2008 17:55 ]
Sujet du message:  Un petit problème de programmation.

Peut-etre certains d'entre vous pourront m'aider :)

J'ai réaliser un petit code tout bète :

-------------------------------------------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

void copie(long tableauOriginal[], long tableauCopie[], long tailleTableau);

int main()
{
long tableauOriginal[4], i=0, tableauCopie[4];
static long j=0;

tableauOriginal[0] = 10;
tableauOriginal[1] = 11;
tableauOriginal[2] = 13;
tableauOriginal[3] = 14;

tableauCopie[0] = 0;
tableauCopie[1] = 0;
tableauCopie[2] = 0;
tableauCopie[3] = 0;

copie( tableauOriginal, tableauCopie, 4);

for (i=0; i<4; i++)
printf("%ld", tableauCopie[i]);

return 0;
}

void copie(long tableauOriginal[], long tableauCopie[], long tailleTableau)
{
for(j=0; j<tailleTableau; j++)
tableauCopie[j]=tableauOriginal[j];
}

-------------------------------------------------------------------------------------------------------------

Voila, il est donc composé de deux fonction, la fonction main, et la fonction copie. Dans la fonction copie, j'utilise la variable "j", que j'ai définie dans la fonction main. Je sais bien qu'une variable disparait a la fin de la fonction, mais le "static" ne devrais pas résoudre ce problème en rendant la variable j ( devenue globale ) accessible a toutes les fonctions du fichier ??

Apparement non, puisque j'ai cette erreur :

ligne 31 : error : 'j' undeclared ( first use in this fonction)
ligne 31 : error : ( each undeclared identifier is reported only once
ligne 31 : error : for each fonction it appears in )

J'aurais aimer savoir pourquoi.

Peut-etre que je me trompe dans l'utilisation du "static"...

Merci de votre aide :)

Auteur:  trosken [ Lun 10 Mars, 2008 18:01 ]
Sujet du message: 

Et pourquoi tu declare pas ta variable j dans la fonction copie ?

C'est plus propre de toute façon .

Auteur:  Arkaïn [ Lun 10 Mars, 2008 18:04 ]
Sujet du message: 

Ouais ouais, j'y ai pensé, je peut aussi la déclarer au tout début de mon code après les directives de préprocesseur, mais c'était juste pour savoir pourquoi ca buggait...

Auteur:  [KO] Kyo [ Lun 10 Mars, 2008 18:54 ]
Sujet du message: 

Pour l'utilisation du static il faut que tu déclares ta variable en dehors de toutes fonctions

Auteur:  Arkaïn [ Lun 10 Mars, 2008 19:15 ]
Sujet du message: 

Ah bon ?

Pourtant, lorsque je déclare la varialbe en dehors des fonctions, je ne met spas de static, et ca marche très bien !

Le static serait inutile ?

Auteur:  [KO] Kyo [ Lun 10 Mars, 2008 20:28 ]
Sujet du message: 

Il me semble que le static n'est utile que lorque tu utilises des classes: alors il sert à rendre une variable ou une fonction totalement indépendante des instances crées de ta classe.
En gros il permet au lieu d'avoir une valeur d'une variable pour chacune des instances de ta classe d'avoir une unique valeur (modifiable) pour toutes les instances de la classe (ce qui peut être utile si tu dois compter le nombre d'instance de ta classe ou encore utiliser un getSingleton() ).

Exemple:
Code:
class maClasse
{
static public int maVariableStatic = 0;

public int maVariable2 = 0;
}

void main()
{
maClasse instance1();
maClasse instance2();

instance1.maVariable2 = 5;
instance1.maVariableStatic = 10;

/* dans ce cas:
instance2.maVariable2 == 0
mais
instance2.maVariableStatic == 10;*/

Auteur:  Arkaïn [ Lun 10 Mars, 2008 21:30 ]
Sujet du message: 

Okay merci beaucoup :)

Auteur:  DA [ Lun 10 Mars, 2008 22:05 ]
Sujet du message: 

voilà, le j servait à rien puisque tu avais un "i" dans le main ...
A noter que ça sert à rien d'initialiser i à 0.
Code:
#include <stdio.h>
#include <stdlib.h>

void copie(long tableauOriginal[], long tableauCopie[], long tailleTableau){
   int j;
   for(j=0; j<tailleTableau; j++)
   tableauCopie[j]=tableauOriginal[j];
}

int main(){
   long tableauOriginal[4], i=0, tableauCopie[4];

   tableauOriginal[0] = 10;
   tableauOriginal[1] = 11;
   tableauOriginal[2] = 13;
   tableauOriginal[3] = 14;

   tableauCopie[0] = 0;
   tableauCopie[1] = 0;
   tableauCopie[2] = 0;
   tableauCopie[3] = 0;

   copie( tableauOriginal, tableauCopie, 4);

   for (i=0; i<4; i++)printf("%ld \n", tableauCopie[i]);
    system("pause");
    return 0;
}


Néanmoins, si tu veux utiliser un j commun pour tes boucles for:

Code:
#include <stdio.h>
#include <stdlib.h>

int j;
   
void copie(long tableauOriginal[], long tableauCopie[], long tailleTableau){
   for(j=0; j<tailleTableau; j++)
   tableauCopie[j]=tableauOriginal[j];
}

int main(){
   long tableauOriginal[4], tableauCopie[4];

   tableauOriginal[0] = 10;
   tableauOriginal[1] = 11;
   tableauOriginal[2] = 13;
   tableauOriginal[3] = 14;

   tableauCopie[0] = 0;
   tableauCopie[1] = 0;
   tableauCopie[2] = 0;
   tableauCopie[3] = 0;

   copie( tableauOriginal, tableauCopie, 4);

   for (j=0; j<4; j++)printf("%ld \n", tableauCopie[j]);
    system("pause");
    return 0;
}


enfin

Code:
#include <stdio.h>
#include <stdlib.h>

int j; // globale au cas où...
   
void copie(long tableauOriginal[], long tableauCopie[]){
   for(j=0; j<sizeof(tableauOriginal); j++){           
       tableauCopie[j]=tableauOriginal[j];
       printf("%ld \n", tableauCopie[j]);
     }   
}

int main(){
   long tableauOriginal[4]={10,11,13,14}, tableauCopie[4];
   copie(tableauOriginal, tableauCopie);
    system("pause");
    return 0;
}

Auteur:  chatissimus [ Lun 10 Mars, 2008 22:35 ]
Sujet du message: 

sinon pour la réponse sur le static cela permet de donner à une variable locale une durée de vie permanente

(là ca sert a rien dans le main vu que la fin du main donne normalement la fin du programme)

mais par exemple si t'as une fonction
Code:
int func()
{
static int Val_perm=0;
return Val_perm++;
}


si t'appelle 4 fois cette fonction elle va retourner 0, 1,2,3

la valeur de la variable locale n'est pas réinitialisé entre chaque appel à la fonction.

Auteur:  Arkaïn [ Mar 11 Mars, 2008 8:25 ]
Sujet du message: 

Okay merci j'y vois un peu plus clair :p

C'était assez brouillon dans ma tête.

Bon plus qu'a m'entrainer maintenant.

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/