logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 17-01-2013 09:05:14

kaiser88
Membre
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686
(G)UI : Gnome 2.30.2
Inscription : 02-11-2012

probleme C

Bonjour j'ai écrit ce petit programme C de tri croissant :

/* Procédure tri de tableau */

#include<stdio.h>          
 
  void tricroissant(int t[], int taille)
  {
         int i,j,min ;
         
       for(i=0; i<=taille; i++){
             for(j=i+1; j<=taille; j++){
               if(t[j]< t[i]){
                 min=t[j];
                  t[j]=t[i];
                    t[i]=min;
                }
              }
            }
           
       
}
 
  main()
  {    int size;
       printf("saisir la taille du tableau : \n");
             scanf("%d",&size);
              int tab[size];
              int k;
         
         printf("Entrer les valeurs du tableau \n");
          for(k=0; k<=size -1; k++){
            printf("entrer la valeur %d \n",k);
              scanf("%d",tab[k]);
                }
             tricroissant(tab, size);
              for(k=0; k<=size -1; k++){
                  printf("tri %d \n", tab[k]);
                    }
  }
                           


Le programme apres avoir saisi les deux premières valeurs du tableau m'affiche

Erreur de segmentation

.

Il y aussi ce code qui écrit à l'envers les éléments d'un tableau dans un autre tableau voici le code :

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

void invers(int tab[],int inv[], int sz)
{
   int i=0;
   
   for (i=sz-1; i>=0 ; i--){
        inv[sz-1-i]=tab[i];
          }
}

int main()
{
     int i=0;
       int l=5 ;
        int v=5;
    int G[l]={0, 2, 4, 6, 8};
     int H[l]={0};
    invers(G, H , l);
     for(i=0 ; i<=l-1 ; i++){
       printf("%d \n",H[i]);
       }
}


à la fin de la compilation l'ordinateur m'affiche des warnings et error :


fonctab.c: In function ‘main’:
fonctab.c:18: error: variable-sized object may not be initialized
fonctab.c:18: warning: excess elements in array initializer
fonctab.c:18: warning: (near initialization for ‘G’)
fonctab.c:18: warning: excess elements in array initializer
fonctab.c:18: warning: (near initialization for ‘G’)
fonctab.c:18: warning: excess elements in array initializer
fonctab.c:18: warning: (near initialization for ‘G’)
fonctab.c:18: warning: excess elements in array initializer
fonctab.c:18: warning: (near initialization for ‘G’)
fonctab.c:18: warning: excess elements in array initializer
fonctab.c:18: warning: (near initialization for ‘G’)
fonctab.c:19: error: variable-sized object may not be initialized
fonctab.c:19: warning: excess elements in array initializer
fonctab.c:19: warning: (near initialization for ‘H’)

 


et pourtant l'exécution se passe bien.

Pourriez-vous m'eclairer sur ces phénomenes.
Une autre question, le compilateur C de debian est-il C99 ou C89 ?

Dernière modification par kaiser88 (17-01-2013 09:09:56)

Hors ligne

#2 17-01-2013 09:26:26

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : probleme C

Yo,

Il y  un problème d'indices dans ta fonction de tri :

for(i=0; i<=taille; i++)


C'est « taille-1 » et non pas « taille ».

Idem ici :

for(j=i+1; j<=taille; j++)



De manière générale, les erreurs de segmentation surviennent quand tu utilises un pointeur (un tableau par exemple) pour écrire à un endroit de la mémoire où tu ne devrais pas.

             scanf("%d",&size);
              int tab[size];


Ici, avant d'allouer le tableau, tu devrais faire un test sur « size ». Il doit être strictement positif.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 17-01-2013 09:59:28

kaiser88
Membre
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686
(G)UI : Gnome 2.30.2
Inscription : 02-11-2012

Re : probleme C

captnfab a écrit :



             scanf("%d",&size);
              int tab[size];


Ici, avant d'allouer le tableau, tu devrais faire un test sur « size ». Il doit être strictement positif.



J'ai toujours le meme problème !!!!

Hors ligne

#4 17-01-2013 10:16:46

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : probleme C

C'est parce qu'il reste des erreurs…

L'erreur en question est ici :

scanf("%d",tab[k]);



Ce que tu veux c'est :

scanf("%d",&(tab[k]));



Pour voir ces erreurs, compile avec

gcc -Wall



Pour compiler en C99 (en affichant les erreurs) :

gcc -Wall -std=c99


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#5 17-01-2013 13:37:23

kaiser88
Membre
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686
(G)UI : Gnome 2.30.2
Inscription : 02-11-2012

Re : probleme C

Merci pour le premier programme, pour le second voit-tu pourquoi y-a-t-il des warnings et des errors et que le programme s'execute parfaitement bien.

Hors ligne

#6 17-01-2013 13:42:10

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : probleme C

Pour le second programme, il te faut lire les messages d'erreur.

« Un objet de taille variable ne peut pas être initialisé. »

Tu ne peux pas déclarer un tableau de « l » et dire l'initialiser avec un tableau de 5 éléments.

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#7 17-01-2013 18:39:27

kaiser88
Membre
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686
(G)UI : Gnome 2.30.2
Inscription : 02-11-2012

Re : probleme C

Mais pourtant le C99 reconnait cette façon de déclarer des tableaux avec des variables et puis l'exécution se déroule normalement j'obtiens le tableau inversé !!!!!

Hors ligne

#8 18-01-2013 08:46:00

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : probleme C

En C99, tu peux faire

int tableau[taillevariable];

ou

int tableau[TAILLEFIXE] = { elt0, elt1, elt2, …, eltTAILLEFIXE-1 }

mais pas

int tableau[taillevariable] = { elt0, elt1, elt2, …, eltTAILLEFIXE-1 }

ça serait de toute façon extrêmement laid, puisque d'un côté de l'égalité la taille est fixe, et de l'autre elle est variable.

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

Pied de page des forums