tit prob en C

tit prob en C - C++ - Programmation

Marsh Posté le 02-03-2003 à 22:30:53    

bon, je me debrouille pas trop trop mal en cpp mais je découvre le c et ai deux questions:
 
je veux fair un passage de parametre à une fonction avec une valeur par defaut (je le fais exectement comme en C++ )
 
et gcc veut rien savoir : "parse error befor '=' token " ??
 
par exemple :
void fct (int i = 0){
     fprintf(stdout, "i = %d", i);
}
 
kelk'un aurai il un autre technik en c qui me donnerai le même resultat ke se que j'aurai en c++??
 
 
2) je cherche à assigner à un string un bout d'un autre dont les limite inferieur et supperieur sont defini par deux entiers par exemple (i et j), je m'attend évidement a fair ça :

Code :
  1. char S1[]={"123456789"};
  2. char S2[5];
  3. unsigned c=i;
  4. while(c<j){
  5. S2[c-i]=S1[c];
  6.         c++;
  7. }
  8. fprintf(stdout, "%s\n", S1);
  9. fprintf(stdout, "%s\n", S2);


et non!! pour S2 y m'affiche un string de 9 char??  :heink:  :??:  
 

Reply

Marsh Posté le 02-03-2003 à 22:30:53   

Reply

Marsh Posté le 02-03-2003 à 22:41:36    

pour le 2, si je le fait avec :
char* S2;
S2=malloc(5);
ça marche mais j'aimerai vraiment bien comprendre la difference!?

Reply

Marsh Posté le 02-03-2003 à 22:48:08    

Peak a écrit :

bon, je me debrouille pas trop trop mal en cpp mais je découvre le c et ai deux questions:
 
je veux fair un passage de parametre à une fonction avec une valeur par defaut (je le fais exectement comme en C++ )
 
et gcc veut rien savoir : "parse error befor '=' token " ??
 
par exemple :
void fct (int i = 0){
     fprintf(stdout, "i = %d", i);
}
 
kelk'un aurai il un autre technik en c qui me donnerai le même resultat ke se que j'aurai en c++??
 
 
2) je cherche à assigner à un string un bout d'un autre dont les limite inferieur et supperieur sont defini par deux entiers par exemple (i et j), je m'attend évidement a fair ça :

Code :
  1. char S1[]={"123456789"};
  2. char S2[5];
  3. unsigned c=i;
  4. while(c<j){
  5. S2[c-i]=S1[c];
  6.         c++;
  7. }
  8. fprintf(stdout, "%s\n", S1);
  9. fprintf(stdout, "%s\n", S2);


et non!! pour S2 y m'affiche un string de 9 char??  :heink:  :??:  
 
 


 
A quoi ca sert de mettre une valeur par defaut a ton parametre ?
 
Quoiqu'il arrive tu devras appeler ta fonction avec une valeur pour ce parametre, en C, donc je vois pas l'interet...

Reply

Marsh Posté le 02-03-2003 à 23:01:45    

j'ai repondu a ton HS sur fclc++. les valeurs par défaut n'existe pas en C++. le C et le C++ sont 2 langages différents. ca ne te viendrai pas à l'idée de demander à du HTML de faire les meme choses que du Java...alors arrete le mélange

Reply

Marsh Posté le 02-03-2003 à 23:02:08    

ici j'ai pris un exemple bidon pour être claire...
mais en vérité j'en ai super besoin!!
 
"Quoiqu'il arrive tu devras appeler ta fonction avec une valeur pour ce parametre, en C.."
 
mais si je met une valeur par default, je devrai pas être obligé de donner un param ?

Reply

Marsh Posté le 02-03-2003 à 23:03:55    

ben y pourrai m'arriver de vouloir fair un if en JAVA  :ange:  
 

Reply

Marsh Posté le 02-03-2003 à 23:04:22    

Peak a écrit :

ici j'ai pris un exemple bidon pour être claire...
mais en vérité j'en ai super besoin!!
 
"Quoiqu'il arrive tu devras appeler ta fonction avec une valeur pour ce parametre, en C.."
 
mais si je met une valeur par default, je devrai pas être obligé de donner un param ?  


 
Si, car sinon, il va chercher une fonction definie comme :
 
void tafonction(void)
 
Et comme il y en a pas, il va te retourner une erreur.
 
En C, le nombre deparamatres autant que le nom de la fonction definit la fonction.
 
Par exemple,  
 
void sum(int a, int b)
 
et  
 
void sum (int a, int b, int c)  
 
dont deux fonctions differentes.
 
Bref, spa possible, et c'est vraiment pas indispensable a un algorithme je pense... nan ? un if regle l'affaire...

Reply

Marsh Posté le 02-03-2003 à 23:06:56    

je me disait juste ke c'tai bizard de pas avoir prevu ça dans le C et ke certain avaient surtement trouvé une parade a ce problème... mais apparement je vais devoir me resigner... :(  

Reply

Marsh Posté le 02-03-2003 à 23:07:40    

tu te trompes: le C ne permet pas la surcharge. si tu veux resoudre, regarde du coté des macros.
 
je suis pas un pro des macros mais

Code :
  1. #define sum() sum(10)
  2. void sum(int i);

ca devrait marcher


Message édité par Taz le 02-03-2003 à 23:10:42
Reply

Marsh Posté le 02-03-2003 à 23:09:55    

vous avez raison je trouverai bien une solution;
merci!
:jap:  

Reply

Marsh Posté le 02-03-2003 à 23:09:55   

Reply

Marsh Posté le 02-03-2003 à 23:10:54    

edit grillaid

Reply

Marsh Posté le 02-03-2003 à 23:13:05    

j'ai jamais vraiment compris comment marchait les macros :sweat:  
je vais essayer de trouver un tit tutorial la dessus...
 
 
 
et pour l'autre kestion :  
y'a t-il une difference entre  char* S="123";    et  char S[]={"123"};  ??


Message édité par peak le 02-03-2003 à 23:14:59
Reply

Marsh Posté le 02-03-2003 à 23:13:46    

oui: l'un est valide, l'autre ne passe pas à la compilation
ben la macro marche po


Message édité par Taz le 02-03-2003 à 23:15:11
Reply

Marsh Posté le 02-03-2003 à 23:16:59    

chez moi y passe  :??:  
 
(gcc 3.2)

Reply

Marsh Posté le 02-03-2003 à 23:23:38    

ben ca devrait pas
 

Code :
  1. char *s="abc"; // est ok, s pointe vers une chaine statique et const
  2. char s2[]="abc";
  3. char s3[]={'a', 'b', 'c', '\0'};
  4. // sont equivalents


 
edit: le code que tu proposes fonctionne apparemment, mais je n'ai jamais vu rien de tel. étant donné que la synthaxe

Code :
  1. char s[]="litteral";

produit un resultat dont sur. et c'est plus court


Message édité par Taz le 02-03-2003 à 23:30:10
Reply

Marsh Posté le 02-03-2003 à 23:33:31    

k, je note ;)  
et entre char S[5]; et char* S; S=malloc(5); y'a-t-il un difference?


Message édité par peak le 02-03-2003 à 23:34:13
Reply

Marsh Posté le 02-03-2003 à 23:37:16    

oui et elle est énorme
 
char s[] définit un tableau ([] veut dire que le compilateur déduit lui meme le nombre d'élément). généralement c'est alloué dans la pile. char s[]="a" est equivalent a char s[]={'a', '\0'} ce qui veut dire que chaque char est initialisé.
 
char *s="dawa". ici s est un pointeur qui pointe vers une zone mémorie généralement statique et read-only. donc s[0]='c' fait tout péter
 
char *s=malloc(5) est une allocation dynamique généralement dans le tas. l'usage peut etre le meme qu'avec un tableau. ne pas oublier de faire un free lorsque pour libérer cet espace

Reply

Marsh Posté le 02-03-2003 à 23:41:05    

linpide!!
 
Merci à toi ++Taz  :)

Reply

Marsh Posté le 02-03-2003 à 23:42:00    

si tu as des doutes, hesites pas

Reply

Marsh Posté le 02-03-2003 à 23:48:25    

:jap:

Reply

Marsh Posté le 23-03-2003 à 02:32:49    

++Taz a écrit :

ben la macro marche po


Le nom de macro suivi d'une parenthèse ouvrante (même après un blanc) est l'appel de macro-fonction.
Pour feinter:

Code :
  1. #define sum() (sum)(10)
  2. void (sum)(int i); //déclaration protégée de la macro
  3. int main(void){
  4. sum(); //appel de macro
  5. (sum)(1); //appel de fonction

Bref, bof...
Les macros spabien, n'est-ce pas ? :D
 
 

Peak a écrit :

y'a t-il une difference entre  char* S="123";    et  char S[]={"123"};  ??


Code :
  1. char* S="123"; //incorrect mais actuellement compilable
  2. const char* S="123"; //bon pour le futur

"123" est une chaîne littérale constante allouée une seule fois comme un tableau global.
Par compatibilité avec le passé, const n'est pas (encore) obligatoire.
 

Code :
  1. char S[]={"123"}; //{} superflu
  2. char S[]="123"; //ok

La paire d'accolades englobantes est de trop.
Mais il semblerait que le C, et par compatibilité C++, acceptent une (et une seule) paire de trop pour l'initialisation de n'importe quel tableau.


Message édité par Musaran le 23-03-2003 à 02:35:00

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed