Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[C] S'éxecute mal avec GCC, mais pas avec MINGW (Résolu)
View unanswered posts
View posts from last 24 hours

Goto page Previous  1, 2  
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
YetiBarBar
Guru
Guru


Joined: 23 Dec 2005
Posts: 490

PostPosted: Sat Feb 09, 2008 9:18 pm    Post subject: Reply with quote

Sans rentrer dans des détails trop fastidieux, je vois au moins 2 raisons à utviliser #define au lieu de const int :

- définir un const int va te bouffer quelques octets de plus sur la taille de ton programme (à vrai dire,e sur un PC, on s'en fout un peu mais le C ne sert pas que sous nos machines ...)

- ça va surement te paraitre choquant mais : const int p ne défini pas une valeur constante (contrairement au #define pour lequyel le remplacement est fait par le pré-processeur!!!), un moyen de t'en convaincre :

Code:
int main(int argc, char **argc)
{
const int a = 10;
int b = &a;
*b=20;
printf("%d\n",a);
return 0;
}
Back to top
View user's profile Send private message
guilc
Bodhisattva
Bodhisattva


Joined: 15 Nov 2003
Posts: 3326
Location: Paris - France

PostPosted: Sun Feb 10, 2008 11:47 am    Post subject: Reply with quote

Tiens au fait.
Une petite lecture instructive sur le pourquoi c'est mal de mettre des tableaux sur la pile, et pourquoi c'est dangereux de déborder de ces tableaux, ayant pour conséquence d'altérer le contenu de la pile là ou il ne faut surtout pas toucher :
http://fr.wikipedia.org/wiki/Dépassement_de_tampon

Et niveau de la taille de la pile, ça va dépendre des architectures ainsi que des systèmes d'exploitation et des version de libc
Ainsi, sur du OpenBSD, ça sera du 64Ko, sur du Solaris8 => 2Mo, sous linux avec une glibc 2.2Pthreads => 2Mo, avec une glibc 2.6NPTL => 8Mo, sur de l'embarqué, ça tourne souvent autour de 4k (par exemple sur du motorolla 68000)
_________________
Merci de respecter les règles du forum.

Mon site perso : https://www.xwing.info
Mon PORTDIR_OVERLAY : https://gentoo.xwing.info ou layman -a xwing
Back to top
View user's profile Send private message
matlerouge
n00b
n00b


Joined: 29 Aug 2004
Posts: 68

PostPosted: Sun Feb 10, 2008 6:41 pm    Post subject: Reply with quote

YetiBarBar wrote:

Code:
int main(int argc, char **argc)
{
const int a = 10;
int *b = &a;
*b=20;
printf("%d\n",a);
return 0;
}


Ca a pas l'aire trop légal comme code, il y a une erreur (pas de conversion int* vers const int*). Si on force le cast :
Code:
int *b = (int*)&a;

La ca compile par contre erreur à l'édition de lien (il doit pas trouver de référence à 'a', sûrement par ce que le compilo remplace directement le 'a' par 10 dans le code.)

[/code]
Back to top
View user's profile Send private message
YetiBarBar
Guru
Guru


Joined: 23 Dec 2005
Posts: 490

PostPosted: Sun Feb 10, 2008 7:36 pm    Post subject: Reply with quote

Autant pour moi : la première ligne n'est pas :
Code:
int main(int argc, char **argc)
mais
Code:
int main(int argc, char **argv)


Sinon je peux t'assurer que ce code compile parfaitement chez moi (modulo un warning vu que gcc se rend quand même compte qu'il y a quelque chose de potentiellement louche), j'utilise gcc-4.2.2 et la glibc-2.7-r1 mais c'est un bout de code que j'ai déjà croisé à maintes reprises pour illustrer le phénomène.

Après, j'accorde que l'exemple est hyper tiré par les cheveux (le but étant juste d'illustrer que le mot clé const, en C, signifie "je n'utiliserai jamais l'identifiant de la variable que je déclare pour la modifier). C'est ce qui fait la force du C : on peut faire (pesque) tout et surtout n'iporte quoi. (faut vraiment être tordu pour chercher à modifier un truc qu'on a défini constant ...)
Back to top
View user's profile Send private message
matlerouge
n00b
n00b


Joined: 29 Aug 2004
Posts: 68

PostPosted: Sun Feb 10, 2008 9:02 pm    Post subject: Reply with quote

J'avais corrigé le code mais compilé dans un .cpp ! Donc en c++ ça passe pas dans gcc.

Et effectivement dans un .c, seulement un warning et ça passe !

Mais attention, en compilant en -00 ca affiche le "20", mais si tu compile en -03 la ça ca prend pas en compte l'affectation par le pointeur et ça affiche le 10.
Back to top
View user's profile Send private message
YetiBarBar
Guru
Guru


Joined: 23 Dec 2005
Posts: 490

PostPosted: Mon Feb 11, 2008 2:10 pm    Post subject: Reply with quote

Rien qu'en -O1, ça marche plus !!

Et là, on commence à toucher au problème des comportements inattendus chez les ricers ... et au pourquoi certains ebuilds filtrent les CFLAGS ! Mais on s'éloigne vraiment du sujet (... le pauvre, on lui a pourri son topic)
Back to top
View user's profile Send private message
Animatrix
Guru
Guru


Joined: 13 May 2006
Posts: 480
Location: France - Gard (30)

PostPosted: Mon Feb 11, 2008 7:35 pm    Post subject: Reply with quote

YetiBarBar wrote:
Rien qu'en -O1, ça marche plus !!

Et là, on commence à toucher au problème des comportements inattendus chez les ricers ... et au pourquoi certains ebuilds filtrent les CFLAGS ! Mais on s'éloigne vraiment du sujet (... le pauvre, on lui a pourri son topic)
Mais non, comme ca j'apprend les subtilités de la programmation :)
Back to top
View user's profile Send private message
Animatrix
Guru
Guru


Joined: 13 May 2006
Posts: 480
Location: France - Gard (30)

PostPosted: Sun Feb 24, 2008 10:01 am    Post subject: Reply with quote

Salut à tous !!

C'est à nouveau pour un problème en C.
En fait, j'aimerais utiliser un tableau de mots (strings), sauf qu'en C il n'existe que des tableaux de caractères (de manière native).
J'ai entendu qu'un char *tableau[] pouvait réaliser ce que je voulais.

Sauf que si je fais un :

Code:
*tableau = "hello";

dans tableau[0] ira le mot hello.
Mais comment faire pour mettre dans tableau[1] ?


Sinon, est-ce qu'un tableau multi-dimensionnel peut-être envisageable ?

Merci à tous !
Back to top
View user's profile Send private message
kwenspc
Advocate
Advocate


Joined: 21 Sep 2003
Posts: 4954

PostPosted: Sun Feb 24, 2008 11:44 am    Post subject: Reply with quote

Animatrix wrote:

Sinon, est-ce qu'un tableau multi-dimensionnel peut-être envisageable ?

Eh eh oui c'est possible, heureusement.
Par exemple ton char *tableau est mono-dimension, et tableau[0] ne contient pas "hello" mais 'h', et tableau [1] 'e' et ainsi de suite. (pour être précis: tableau[0] est l'adresse où se situe la donnée 'h')
Tout dépend du besoin, mais ici il te faut un tableau 2 dimensions.

Mais faut vraiment que tu lises ou bouquin ou un bon tuto parce que les "j'ai entendu dire que" non ^^
Par exemple, ton char *tableau[] c'est pareil qu'un char **tableau, avec tout ce que ça suppose: ce sont que des pointeurs, si non initialisés au départ ça veut aussi dire: gérer dynamiquement l'allocation mémoire etc... Si tu comprends pas bien les principes de pointeurs et autres tu vas direct aller dans les segfault, et t'auras une grosse impression de frustration parce que tu ne progresseras pas. En C y a pas de secret: si tu comprends les pointeurs, tu comprends tout. (ou presque)

Il te faut maîtriser les mots clés "*" et "&" et leur contexte d'utilisation, ainsi que les fonctions de bases malloc, calloc, realloc, free. (leurs man pages sont pas trop mal)

Comme livre j'ai ça sinon:
"Le langage C" de Delannoy (éditions Eyrolles, collection Best-of) par exemple (~20 euros), ça parait indigeste comme bouquin mais en fait c'est concis et complet.
"Programmation Système en C sous Linux" de C. Blaess aussi, une référence. même éditeur mais plus cher.

Après il y a peut-être de bons tutos sur (j'ai pas trop regardé): http://c.developpez.com/cours/

Pour la manipulation des pointeurs ce que je donne à mes étudiants pour que ça rentre c'est: refaites une mini-libc (memset, strstr, etc...). Ils en ont bavés mais à la fin ils ne me faisaient plus les erreurs basiques que tout débutant fait (de toute façon).
Et pour bien renforcer tout ça je leur filais ça à faire: http://www-128.ibm.com/developerworks/linux/library/wa-memmng/

Gardes bien ça en tête: la maîtrise des pointeurs, et donc de la mémoire, te feras passer dans un monde différent :)
Je ne réponds pas à ta question première, désolé, mais une bonne connaissance du principe des pointeurs et de la mémoire y répondra.
_________________
membre officieux du SAV Ati GEntoo


Last edited by kwenspc on Sun Feb 24, 2008 11:45 am; edited 1 time in total
Back to top
View user's profile Send private message
Desintegr
l33t
l33t


Joined: 25 Mar 2004
Posts: 863
Location: France - Orléans

PostPosted: Sun Feb 24, 2008 11:44 am    Post subject: Reply with quote

Peut-être ça :
Code:
#include <stdio.h>

int main() {
      char* tableau[3];
      int i;

      tableau[0] = "hello1";
      tableau[1] = "hello2";
      tableau[2] = "hello3";

      for(i=0; i<3; i++)
         printf("%s\n", tableau[i]);

      return 0;
}

_________________
Gentoo ~AMD64
Hoc Volo, Sic Jubeo !
Mon wiki : http://desintegr.free.fr
Back to top
View user's profile Send private message
Animatrix
Guru
Guru


Joined: 13 May 2006
Posts: 480
Location: France - Gard (30)

PostPosted: Sun Feb 24, 2008 12:25 pm    Post subject: Reply with quote

Merci Desintegr, c'est ce que je cherchais.
Par contre, j'aimerais utiliser strcat, stcpy...., c'est-à-dire les outils de string.h.
Seulement je tombe à chaque fois sur un joli segfault.

Code:
strcpy(tableau[0], "Salut !\0");


kwenspc : j'ai déjà le livre pour C++ des éditions Eyrolles.
Mais je vais regarder sur les cours en ligne.
Back to top
View user's profile Send private message
kwenspc
Advocate
Advocate


Joined: 21 Sep 2003
Posts: 4954

PostPosted: Sun Feb 24, 2008 12:28 pm    Post subject: Reply with quote

Animatrix wrote:

Seulement je tombe à chaque fois sur un joli segfault.

cqfd :wink:
Étudies bien les pointeurs et la gestion de la mémoire, et après tu comprendras pourquoi tu as ce genre d'erreur.
_________________
membre officieux du SAV Ati GEntoo
Back to top
View user's profile Send private message
YetiBarBar
Guru
Guru


Joined: 23 Dec 2005
Posts: 490

PostPosted: Sun Feb 24, 2008 1:12 pm    Post subject: Reply with quote

Animatrix wrote:
Merci Desintegr, c'est ce que je cherchais.
Par contre, j'aimerais utiliser strcat, stcpy...., c'est-à-dire les outils de string.h.
Seulement je tombe à chaque fois sur un joli segfault.

Code:
strcpy(tableau[0], "Salut !\0");


kwenspc : j'ai déjà le livre pour C++ des éditions Eyrolles.
Mais je vais regarder sur les cours en ligne.


Evidemment !

Pour le coup je plussoie kwenspc, surtout que tu as déjà expérimenté le "piège" :

Quand tu fais :
Code:
tableau[0]="hello0";
, tu associe à tableau[0] l'adresse mémoire de la chaine statique "hello0"

Pour faire ce que tu veux faire, il faudrait (étudies les pointeurs correctement avant d'expérimentr, sinon tu vas galerer) :
Code:
tableau[0] = (char *) malloc(sizeof(char) * TAILLEMAXDEMACHAINE);
strcpy(tableau[0], "Salut !\0");
/* A ne pas oublier quand tu n'as plus besoin de la chaine de caractère */
free(tableau[0]);


Pour en remettre une couche, si tu ne prends pas le temps de bien comprendre tout ce qui se passe dans ce petit bout de code, tu vas au devant de grosses galère et de "pourquoi ça marche pas?" à répétitions
Back to top
View user's profile Send private message
Animatrix
Guru
Guru


Joined: 13 May 2006
Posts: 480
Location: France - Gard (30)

PostPosted: Sun Feb 24, 2008 1:15 pm    Post subject: Reply with quote

Un strcpy doit être de la forme :

Code:
char *strcpy (char *dest, const char *src);

Donc char *dest, avec tab[0], c'est bon.
Cela viendrait donc de la source ?


Sinon, je dois faire un TP où le but est de récupérer les mots sur une page.
A l'heure actuelle, j'arrive à récupérer tous les mots, en éliminant les espaces, chiffres, caractères spéciaux....

Mais le problème est que le résultat obtenu est simplement une liste de tous les mots qu'il a trouvé.
Or, il se peut qu'il y ai des doublons, est-ce que l'idée du tableau de mots (strings) est une bonne idée, pour corriger ce soucis ?
Back to top
View user's profile Send private message
guilc
Bodhisattva
Bodhisattva


Joined: 15 Nov 2003
Posts: 3326
Location: Paris - France

PostPosted: Sun Feb 24, 2008 1:23 pm    Post subject: Reply with quote

Animatrix wrote:
Un strcpy doit être de la forme :

Code:
char *strcpy (char *dest, const char *src);

Donc char *dest, avec tab[0], c'est bon.
Cela viendrait donc de la source ?

Non, le segfault ne vient pas de la source.
Le segfault vient du fait que tu copies la chaîne à une adresse où la mémoire n'est pas allouée, ce qui est interdit.
avant de faire ton strcpy, il FAUT allouer l'espace mémoire, comme te l'a montré YetiBarBar. (Et ne pas oublier de libérer la mémoire une fois que tu n'utilises plus la chaine)

il faut VRAIMENT que tu te documentes sur les pointeurs et les allocations mémoire en C, sinon c'est clair que tu vas être complètement largué ;)
Le C est un langage dit de "bas niveau" : entre autre, il ne fait aucune allocation mémoire pour toi, tu dois tout faire de manière explicite. A l'opposé d'un langage de haut niveau qui va allouer la mémoire dont il a besoin de manière transparente, et la libérer automatiquement quand elle n'est plus nécessaire, souvent via un garbage collector (C++ dans une certaine mesure, avec les fonctions de la STL par exemple), ou des langages comme Java, C# ou les langages de script...
En contre-partie, les aspects bas niveau du C lui permettent d'accéder plus profondément au système, en laissant au programmeur la libre utilisation de l'adressage mémoire et des appels système...
_________________
Merci de respecter les règles du forum.

Mon site perso : https://www.xwing.info
Mon PORTDIR_OVERLAY : https://gentoo.xwing.info ou layman -a xwing
Back to top
View user's profile Send private message
matlerouge
n00b
n00b


Joined: 29 Aug 2004
Posts: 68

PostPosted: Sun Feb 24, 2008 2:28 pm    Post subject: Reply with quote

Animatrix wrote:

Mais le problème est que le résultat obtenu est simplement une liste de tous les mots qu'il a trouvé.
Or, il se peut qu'il y ai des doublons, est-ce que l'idée du tableau de mots (strings) est une bonne idée, pour corriger ce soucis ?


Oui c'est bien comme ca, par contre à chaque fois pour voir si le mot existe c'est en O(n) (n taille du tableau)

Moi je prendrait une liste, et je ferait en sorte qu'elle soit toujours triée. Comme ca si tu as un nouveau mot, tu fait une recherche dans ta liste (donc comme c'est trié c'est du log(n) la recherche), et si le mot n'existe pas tu l'insert à la bonne place dans la liste. Chose que tu peux pas faire avec un tableau à part en bricollant avec des realloc... Tu pourras comme ca voir comment on fait une liste chainée en C c'est pas mal je pense après avoir bien compris les pointeurs :)

Apres y'a la table de hash aussi mais bon..
Back to top
View user's profile Send private message
Animatrix
Guru
Guru


Joined: 13 May 2006
Posts: 480
Location: France - Gard (30)

PostPosted: Sun Feb 24, 2008 9:40 pm    Post subject: Reply with quote

J'ai donc résolu le problème avec un tableau bi-dimensionnel.

J'ai une autre question qui peut paraître bête mais sur laquelle je plante (encore une fois, certes) :

Code:
if (tableau[k][0] == motCour().tab[1] && tableau[k][1] == motCour().tab[2] && tableau[k][2] == motCour().tab[3] && ...... && tableau[k][50] == motCour().tab[51])

Savez-vous comment coder ca ?

Merci
Back to top
View user's profile Send private message
YetiBarBar
Guru
Guru


Joined: 23 Dec 2005
Posts: 490

PostPosted: Sun Feb 24, 2008 10:13 pm    Post subject: Reply with quote

Si motCour().tab est un tableau, je verrai bien quelquechose du genre :

Code:
#include <string.h>
if(strncmp(tableau[k], motCour().tab + 1, 50) == 0){instruction};


Pour savoir ce que fais strncmp, cf man 3 strncmp

(J'ai balancé un peu vite les pointeurs vers les chaînes, je te laisse un peu patauger plus ou moins volontairement : il est tard (pour moi) et tu as encore besoin de bosser les relations entre tableaux, pointeurs et notations)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum