Programme en C++ : affichage curieux

riadusse -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
voici mon programme de simulation de processus selon la méthode SJF
j ai pas compris pourquoi l affichage est très très bizarre voici mon programme en c++ merci de votre aide d avence
ta=temp d arriver
texe=temp esecution
t[] tableau initiale
aff[]tableau d affichage

#include<stdio.h>
#include<stdlib.h>
typedef struct{int ta;int texe;char nom[5];}processus;
int main()
{
processus t[100];
processus aff[100];
processus x,y;
int n,aux,i,j,z,indmin,s,e;

printf("donner le nembre de processus\n");
scanf("%i",&n);
for(i=0;i<n;i++)
{

printf("donner le nom du processus n\n");
scanf("%s",&t[i].nom);
printf("donner le temp d arriver du processus n\n");
scanf("%i",&t[i].ta);
printf("donner le temp d execution du processus n\n");
scanf("%i",&t[i].texe);
}
/*trie selon temp d arriver*/
for(i=0;i<n-1;i++)

{
indmin=i;
for(j=i+1;j<n;j++)
{
if(t[j].texe<t[indmin].texe)
{
indmin=j;

}
}
x=t[i];
t[i]=t[indmin];
t[indmin]=x;

}

/ma methode sjf*/
z=0;
e=1;
while(e==1)
{
e=0;
for(i=0;i<=n;i++)
{

if((t[i].ta<=s)&&(t[i].ta!=999))
{

aff[z]=t[i];
s=0;
s=s+aff[z].texe;
z++;
t[i].ta=999;
e=1;
}

}
}
for(i=0;i<n;i++)
{
printf("%i\n",&s);
}

system("pause");

}
Configuration: Windows Vista
Firefox 3.0.3

2 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Tu affiches l'adresse mémoire au lieu des valeurs.

    for(i=0;i<n;i++)
    {
    printf("%i\n",s); // faut enlever& devant le s.
    } 
    
    0
    1. riadusse
       
      mais le probleme si je fais ca ca ne marche pas non plus
      for(i=0;i<n;i++)
      {
      printf("%s",aff[i].nom);//affichage du tableau final
      }
      0
      1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > riadusse
         
        aff[z]=t[i];
        Cette instruction ne permet pas de copier toute la structure. Pour copier une structure, faut copier champ par champ.
        Ou tout simplement, tu te sers de la structure t pour afficher le nom.
        printf("%s",t[i].nom);//affichage du tableau final

        Et enfin pour : scanf("%s",&t[i].nom); //il ne faut pas mettre &.
        Ce qui donne : scanf("%s",t[i].nom);

        Cdlt
        0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 942
     
    En fait je pense qu'il faut que tu fasses bien la distinction entre un pointeur (une adresse) et un caractère.

    En C une fonction ne peut pas modifier un paramètre (pour être plus exacte, le paramètre manipulé par la fonction est une recopie). Ainsi :
    #include <stdio.h>
    
    void f(int x){
      ++x;
    }
    
    int main(){
      int x = 69;
      f(x);
      printf("x = %d\n",x); // affiche 69 !
      return 0;
    }

    Pour s'en sortir il faut passer l'adresse de x (qui sera recopiée, mais qui pointera bien vers x) :
    void f(int *x){
      ++(*x);
    }
    
    int main(){
      int x = 69;
      f(&x);
      printf("x = %d\n",x); // affiche 70
      return 0;
    }

    Pour scanf c'est la même chose, c'est pour ca que quand tu veux lire un entier tu écris :
    scanf("%d",&x);

    Pour une chaîne de caractère s (ie un char * ou un char [ ]), on manipule déjà un pointeur. On a donc pas besoin de prendre l'adresse de s, car c'est déjà une adresse.

    Si on revient à ton programme, le champ nom est un pointeur. Donc pas besoin de & pour le scanf.
    scanf("%s",t[i].nom); 

    Bonne chance
    0