begin process at 2010 02 10 10:49:03
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

Autre

 > 

Problème : Liste en Memoire partagée


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème : Liste en Memoire partagée

jeudi 25 décembre 2008 à 18:48:07 | Problème : Liste en Memoire partagée

6miK

Bonjour à tous et joyeux noel
Voici mon probleme: j'ai une liste chainée qui servira à contenir des entiers qui seront le nom des fichiers à imprimer
Je dois donc faire un spooler mais je bloque sur le partage de ma liste chainée.
Je voudrais juste savoir comment faire pour que mon pere et mon fils modifie et accède à la meme liste.
Pas besoin de me parler de semaphore et d'exclusion mutuel, c'est juste la mise en partage qui m'importe.
Alors voici mon code allégé sans sémaphore etc:

int main ()
{
int mem;
int err;
sll_s *liste = NULL;
int val;
 
/* creation du segment ( N case ) */
mem = shmget(IPC_PRIVATE, 10*sizeof(sll_s*), IPC_CREAT | 0666);
 
/* attachement */
/* surement une erreur si dessous */
liste = shmat(mem, NULL, 0);
liste = sll_new();

/* producteur -> ajoute les noms des fichiers a la liste */
if(fork() > 0){
sll_insert (liste, 18346);
}else{
sll_first(liste);
val = sll_data (liste);
/* forcement j'obtiens rien, il considere ma liste vide */
printf("on recupere bien : %i\n", val);
}
 

returnEXIT_SUCCESS;
}

Merci d'avance ;)
jeudi 25 décembre 2008 à 19:24:37 | Re : Problème : Liste en Memoire partagée

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Contrôle toujours la valeur renvoyée par une fonction quand tu n'es pas sûr qu'elle fonctionne.

Tu utilises shmget dans le processus père quand il est encore seul. Ca te renvoie un int. Bon.

Après, tu demande la mappage. Il va te le faire dans le processus père.

Puis tu fork. Le fils va contenir une copie de la mémoire du père... Mais le mappage va-t-il être recopier ? Je ne penses pas. Au mieux il te copiera la mémoire sans la considérer partagée.

Donc je serais à ta place, j'appellerais bien shmget avant le fork. Par contre, j'appellerais deux fois shmat, une dans le père et une dans le fils. Mais les deux en utilisant le même mem qui lui est recopié correctement dans le fils.

Par contre...
	liste = shmat(mem, NULL, 0);
liste = sll_new();

Je comprends pas ce que tu essaies de faire ici : la première valeur affectée à liste est perdue lors de la deuxième affectation. Et l'emplacement de ta liste est donnée par shmat.

C'est liste qu'il faut initialisé, ou plus précisément la zone mémoire allouée par liste, qui est la zone partagée entre tes processus.

Si tu fais par exemple un malloc dans sll_new(), la mémoire n'est allouée que dans un processus, et n'est pas accessible dans le deuxième...

Je verrais plutôt quelque chose comme ça :

liste = shmat(mem, NULL, 0);
sll_new(liste);
jeudi 25 décembre 2008 à 19:59:56 | Re : Problème : Liste en Memoire partagée

6miK

Merci pour ta réponse rapide.

voila ma méthode sll_new();
sll_s *sll_new (void)
{
   sll_s *p_sll = malloc (sizeof *p_sll);

   if (p_sll)
   {
      item_s *p_l = malloc (sizeof *p_l);

      if (p_l)
      {
         p_l->data = 0;
         p_l->next = NULL;

         p_sll->p_start = p_l;
         p_sll->list = NULL;
      }
      else
      {
         fprintf (stderr, "Memoire insufisante\n");
         exit (EXIT_FAILURE);
      }
   }
   else
   {
      fprintf (stderr, "Memoire insufisante\n");
      exit (EXIT_FAILURE);
   }
   return p_sll;
}
jeudi 25 décembre 2008 à 20:22:05 | Re : Problème : Liste en Memoire partagée

6miK

Bon voila ce que je viens de bidouiller sans succés:

Avant le fork

   /* creation du segment ( N case ) */
   mem = shmget(IPC_PRIVATE, sizeof(sll_s*), IPC_CREAT | 0666);
   
Dans le fork
le pere:
                liste = shmat(mem, NULL, 0);   
                sll_new2(liste);
                sll_insert (liste, 18346);
                sll_insert (liste, 18347);
               shmdt(liste);
le fils
             liste = shmat(mem, NULL, 0);           
            sll_first(liste);
            val = sll_data (liste);
            printf("on recupere bien : %i\n", val);   
      shmdt(liste);

Le fils bloque au moment de recuperer la premiere valeur avec le sll_first

Donc j'ai modifié ici le sll_new en sll_new2 de la maniere suivant:

void *sll_new2 (sll_s *p_sll)
{
      item_s *p_l = malloc (sizeof *p_l);

      if (p_l)
      {
         p_l->data = 0;
         p_l->next = NULL;

         p_sll->p_start = p_l;
         p_sll->list = NULL;
      }
      else
      {
         fprintf (stderr, "Memoire insufisante\n");
         exit (EXIT_FAILURE);
      }
}
jeudi 25 décembre 2008 à 22:53:41 | Re : Problème : Liste en Memoire partagée

rt15

Membre Club Administrateur CodeS-SourceS
Breum, comment dire... Ca y est je vais encore écrire un roman.

Dans un PC, il y a (souvent) de la RAM, un ou plusieurs disques durs... Sans compter les caches sur les disques et dans le processeurs... Bref, de la mémoire, il y en a un peu partout, avec des capacités et des temps d'accès différents.

Le système d'exploitation, le processeur, les équipements... Ils proposent une version tout à fait virtualisé de cette mémoire. Ton processus peut adresser 4Go octets. Un pointeur fait en effet 4 octets, 32 bits -> adressage de 0 à 2^32 - 1 = 4294967295 octets.

Sur ces 4Go adressable, tenter de lire des adresses au hasard te fera aboutir à des erreurs type segmentation fault sous Linux, violation d'accès sous Windows... C'est la même chose. Tu demande une adresse virtuelle qui ne correspond pas à un emplacement mémoire physique réel. Ton processus plante lamentablement.

Cette mémoire virtuelle permet de gérer la mémoire paginée, c'est à dire de la RAM simulée sur le dur. Elle permet aussi de donner l'impression aux processus qu'ils sont seuls en mémoire. Les processus ne partagent pas de mémoire. Si l'adresse 12 est valide dans un processus, elle n'est pas forcément valide dans un autre. Et si elle l'est, elle ne contiendra probablement pas la même chose, car physiquement, ce n'est pas le même endroit physique qui est derrière.

La mémoire est gérée par page (Généralement de 4Ko). La page est l'unité de mappage la mémoire virtuelle et la mémoire physique. Ainsi, si l'adresse 12 est valide dans un processus, c'est tout la plage 0 -> 4095 qui est valide, même si on en a pas demandé autant. Le système d'exploitation fournit donc des pages au processus.

A qu'elles occasions le système d'exploitation va-t-il fournir des pages ?

1) Au lancement d'un processus, celui-ci peut s'arranger pour que le chargeur du système d'exploitation réserve de la mémoire, pour les variables statiques non initialisées notamment. Et le .exe ou l'exécutable Linux va être lui même chargé en mémoire : donc il va être stocké dans des pages.
2) Lorsque le processus fait un new, un malloc... Derrière ces allocations, il y a un tas. C'est une structure de données complexe qui va essayer d'économiser la consommation de pages tout en permettant de rendre si possible ces pages au système quand on appelle delete. Forcément, comme plusieurs malloc peuvent renvoyer des pointeurs dans la même page, la page va pouvoir être libérée quand le dernier pointeur dans cette page sera libéré.
3) La pile. Elle contient surtout les paramètres passés au fonctions et les variables locales. La pile est stockée dans des pages virtuellement contiguës. Une pile est associée à un thread. Donc il peut y avoir plusieurs piles dans un processus.

Le bilan de tout ça est : quand tu fais un malloc, le pointeur renvoyé l'est sur une zone mémoire virtuelle qui ne correspond à rien dans le processus d'à côté. C'est comme si dans matrix il y avait plusieurs matrices : les gens connecté à la matrice x ne pourrait jamais rencontré les gens connectés à la matrice y.

Sauf si un pont existait entre les deux matrices. Ce pont c'est shmget qui va te le donner. Mais si tu ne l'exploite pas correctement, il ne va jamais marcher ! Si tu y mets un pointeur sur une zone mémoire alloué par malloc, ce pointeur sera disponible dans tes deux processus, mais cela ne rendra pas l'adresse pointée valide dans l'autre processus. Sauf hasard, ce pointeur ne correspondra pas à une page valide. Ce qui nous fait... Une erreur de segmentation.

Tu veux allouer de la mémoire pour un processus, tu appelles malloc.
Tu veux allouer de la mémoire pour plusieurs processus, tu appelles shmget.

p_sll->p_start = p_l; c'est bien beau, mais si p_l est alloué avec malloc, il n'est valable que dans un processus.

Autre remarque : si tu as deux threads qui accèdent à la même mémoire (Ce que tu as ici vu que tu as deux processus accédant à une mémoire partagée) en même temps, il peut en résulter un grand n'importe quoi. C'est comme si deux personnes essayent de boire dans le même verre en même temps. Il faut donc que tu assure la synchronisation d'une manière ou d'une autre (Message entre le père et le fils...).
jeudi 25 décembre 2008 à 23:45:02 | Re : Problème : Liste en Memoire partagée

6miK

une nouvelle fois merci pour cette roman-réponse ;)
Sur le principe je comprend le systeme et tu m'as meme eclairci sur certains points.
Pour ce qui est de la synchronisation, j'ai volontairement copié qu'une partie de mon code dans le but d'etre plus clair sur ma requete. Naturellement j'ai mis en place des sémaphores pour l'exclusion mutuel à la liste partagée.

Donc ci j'ai bien compris, ce qui coince c'est la creation de ma liste qui utilise a la fois des malloc (donc seulement pour le pere) et des shmget.
En gros je partage bien la memoire de la liste mais pas la mémoire des elements qu'elle contient (comme item_s). C'est bien ca ?

Le fils accede a la bonne liste mais se perd dans les elements qu'elle contient puisque le pointeur l'emmene sur une page vide (sauf hazard)

Es ce que j'ai compris ? et comment faire pour partager toute ma liste ?
vendredi 26 décembre 2008 à 14:29:27 | Re : Problème : Liste en Memoire partagée

rt15

Membre Club Administrateur CodeS-SourceS

Tu as bien compris je pense.

Bon par contre, mettre en pratique sur une autre liste chaînée, c'est une autre histoire... J'ai essayé en travaillant avec shmat comme avec malloc, et c'est tendu. Je ne sais pas pourquoi la boucle while du fils ne boucle pas. Et il y a forcément un problème du fait des deux appels à shmdt : si la mémoire n'était pas mappé dans le parent, l'appel à shmdt dans le fils provoque la destruction de la mémoire partagé. Je ne peux alors plus parcourir ma liste dans le père...

Je crois qu'il faudrait plutôt demander une seule zone de mémoire partagée et la découper. Ce serait aussi probablement plus performant. Par contre, il faut se froisser les muscles des doigts pour faire un truc un peu souple. Genre allouer une autre portion de mémoire partagée si la première est pleine, gérer une liste chaînée des espaces libres pour améliorer les perfs...


/* Accès aux fonctions non ansi sous gcc */
#undef __STRICT_ANSI__
/* Accès aux fonctions systèmes sous HP-UX */
#define _INCLUDE_POSIX_SOURCE
#define _INCLUDE_XOPEN_SOURCE

#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "sys/ipc.h"
#include "sys/shm.h"
#include "unistd.h"
#include "string.h"
#include "errno.h"

/* La clé ne doit pas être déjà utilisée par un autre processus du système */
#define ROOT_KEY 12
#define NO_NEXT_ID -1

int bChild;

typedef struct _CELL
{
  int nVal;     /* Dans le cas du root, contient la prochaine clé libre       */
  int nNextId;  /* Id de la prochaine cellule, ou NO_NEXT_ID                  */
  struct _CELL* lpNextInFather;  /* Cellule suivante dans le père             */
  struct _CELL* lpNextInChild;   /* Cellule suivante dans le fils             */
}
CELL;

int PrintLastError()
{
  perror(strerror(errno));
  return errno;
}

void sll_init(CELL* lpRoot)
{
  lpRoot->nVal = ROOT_KEY + 1;
  lpRoot->nNextId = NO_NEXT_ID;
}

CELL* sll_next(CELL* lpCell)
{
  CELL* lpResult;

  /* Dernière cellule ? */
  if (lpCell->nNextId != NO_NEXT_ID)
  {
    lpResult = NULL;
    goto the_end;
  }
 
  /* Récupération du pointeur sur le suivant */
  if (bChild)
    lpResult = lpCell->lpNextInChild;
  else
    lpResult = lpCell->lpNextInFather;

  /* Si le pointeur est à NULL, il faut mapper l'id */
  if (lpResult == NULL)
  {
    lpResult = shmat(lpCell->nNextId, NULL, 0);
    if ((int)(long)lpResult == -1)
      exit(PrintLastError());
  }

the_end:
  return lpResult;
}

void ssl_free(CELL* lpRoot)
{
  CELL* lpCurrent;
  CELL* lpNext;

  lpCurrent = lpRoot;
  lpNext = sll_next(lpCurrent);
  do
  {
    lpNext = sll_next(lpCurrent);
    shmdt(lpCurrent);
    lpCurrent = lpNext;
  }
  while (lpCurrent != NULL);
}

CELL* ssl_insertAfter(CELL* lpRoot, CELL* lpCell)
{
  int nCellId;      /* Id de la cellule créée                                 */
  CELL* lpResult;

  /* Allocation de la cellule */
  nCellId = shmget(lpRoot->nVal, sizeof(CELL), IPC_CREAT | IPC_EXCL | 0666);
  if (nCellId == -1)
    exit(PrintLastError());

  /* Mappage de la cellule */
  lpResult = shmat(nCellId, NULL, 0);
  if ((int)(long)lpResult == -1)
    exit(PrintLastError());

  /* On fait pointer la nouvelle cellule sur la suivante */
  *lpResult = *lpCell;

  /* On fait pointer la cellule précédente sur la nouvelle cellule */
  lpCell->nNextId = nCellId;
  if (bChild)
    lpCell->lpNextInChild = lpResult;
  else
    lpCell->lpNextInFather = lpResult;

  /* On signal que la clé est prise */
  lpRoot->nVal++;

  return lpResult;
}

CELL* GetRoot(int nRootId)
{
  CELL* lpResult;

  lpResult = shmat(nRootId, NULL, 0);
  if ((int)(long)lpResult == -1)
    exit(PrintLastError());

  return lpResult;
}

int ChildMain(int nRootId)
{
  CELL* lpRoot;            /* Racine de la liste chaînée                      */
  CELL* lpCurrent;         /* Cellule courante                                */
  int nVal;                /* Valeur de la cellule entrée par l'utilisateur   */

  bChild = 1;
  lpRoot = GetRoot(nRootId);

  printf("Je suis le processus fils pid=%d\n", getpid());

  /* Initialisation de la racine */
  sll_init(lpRoot);

  scanf("%d", &nVal);
  while (nVal != 0)
  {
    lpCurrent = ssl_insertAfter(lpRoot, lpCurrent);
    lpCurrent->nVal = nVal;
    scanf("%d", &nVal);
  }

  ssl_free(lpRoot);

  return 0;
}

int FatherMain(int nChildPid, int nRootId)
{
  CELL* lpRoot;   /* Pointeur sur la racine de la liste chaînée               */
  int result;

  result = 0;
  bChild = 0;
  lpRoot = GetRoot(nRootId);

  printf("Je suis le père pid=%d et j'ai créé un fils pid=%d\n",
         getpid(), nChildPid);

  /* Attente de la fin du fils */
  if (waitpid(nChildPid, NULL, 0) != -1)
  {
    printf("fin\n");
  }
  else
    result = PrintLastError();

  ssl_free(lpRoot);

  return result;
}

int main(int argc, char **argv)
{
  int nPid;            /* Récupération du retour de fork                      */
  int nRootId;         /* Id de la mémoire partagée de la racine              */
  int result;

  result = 0;

  /* Allocation de la racine */
  nRootId = shmget(ROOT_KEY, sizeof(CELL), IPC_CREAT | IPC_EXCL | 0666);
  if (nRootId == -1)
  {
    result = PrintLastError();
    goto the_end;
  }

  /* Création du fils */
  nPid = fork();
  if (nPid == -1)
    result = PrintLastError();
  else if (nPid == 0)
    result = ChildMain(nRootId);
  else
    result = FatherMain(nPid, nRootId);

the_end:
  return result;
}

vendredi 26 décembre 2008 à 16:48:39 | Re : Problème : Liste en Memoire partagée

rt15

Membre Club Administrateur CodeS-SourceS

Mon cast (int)(long) ci-dessus n'était pas une bonne idée : en 64 bits, je pouvais tomber sur des pointeurs valides avec les 32 bits de poids faible équivalents à -1.

Je ne libérais pas convenablement ma mémoire partagée : il faut appeler shmctl avec IPC_RMID pour que la libération se fasse.

Voilà une version qui fonctionne (En même temps, je reste sur des opérations simples sur la liste chaînée : insertion en fin et parcourt). Elle découpe la mémoire partagée en blocs qui sont ensuites alloués à la liste chaînée.


/* Accès aux fonctions non ansi sous gcc */
#undef __STRICT_ANSI__
/* Accès aux fonctions systèmes sous HP-UX */
#define _INCLUDE_POSIX_SOURCE
#define _INCLUDE_XOPEN_SOURCE

#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "sys/ipc.h"
#include "sys/shm.h"
#include "unistd.h"
#include "string.h"
#include "errno.h"

/* La clé ne doit pas être déjà utilisée par un autre processus du système */
#define SHM_KEY 32
#define MAX_LIST_SIZE 20
#define NO_MORE_CELL -1

#ifdef _LP64
#define POINTER_TO_INT long
#else
#define POINTER_TO_INT int
#endif /* _LP64 */

typedef struct _CELL
{
  int nVal;     /* Dans le cas du root, contient la prochaine clé libre       */
  int nNext;    /* Id de la prochaine cellule, ou NO_NEXT_ID                  */
}
CELL;

/* Le champ cell doit rester le premier de cette structure pour que l'adresse
de la cellule corresponde à l'adresse du bloc. */
typedef struct _CELL_BLOCK
{
  CELL cell;
  int bUsed;
}
CELL_BLOCK;

int PrintLastError()
{
  perror(strerror(errno));
  return errno;
}

int AllocMemory(CELL_BLOCK* lpShM)
{
  int nI;

  /* On parcourt la mémoire à la recherche d'un bloc non utilisé */
  for (nI = 0; nI < sizeof(CELL_BLOCK) * MAX_LIST_SIZE; nI++)
  {
    if (! lpShM[nI].bUsed)
      break;
  }

  /* Vérification que l'on est pas arrivé au bout de la mémoire */
  if (nI != sizeof(CELL_BLOCK) * MAX_LIST_SIZE)
    lpShM[nI].bUsed = 1;
  else
    nI = 0;

  return nI;
}

void FreeMemory(CELL* lpBlock)
{
  ((CELL_BLOCK*)lpBlock)->bUsed = 0;
}

CELL_BLOCK* MapMemory(int nShMId)
{
  CELL_BLOCK* lpResult;

  printf("%d map la mémoire\n", getpid());
  lpResult = shmat(nShMId, NULL, 0);
  if ((POINTER_TO_INT)lpResult == -1)
    exit(PrintLastError());

  return lpResult;
}

void InitMemory(CELL_BLOCK* lpShM)
{
  /* On met la mémoire à zéro pour la définir comme non utilisée */
  memset(lpShM, 0, sizeof(CELL_BLOCK) * MAX_LIST_SIZE);
}

void UnMapMemory(CELL_BLOCK* lpShM)
{
  printf("%d démap la mémoire\n", getpid());
  if (shmdt(lpShM) == -1)
    PrintLastError();
}

CELL* InsertAfter(CELL_BLOCK* lpShM, CELL* lpCurrent, int nVal)
{
  int nNew;           /* Indice du bloc alloué dans la mémoire                */
  CELL* lpResult;

  nNew = AllocMemory(lpShM);
  if (nNew == 0)
  {
    UnMapMemory(lpShM);
    exit(ENOMEM);
  }

  lpResult = (CELL*)&lpShM[nNew];

  lpResult->nVal = nVal;
  lpResult->nNext = lpCurrent->nNext;
  lpCurrent->nNext= nNew;

  return lpResult;
}

CELL* GetNext(CELL_BLOCK* lpShM, CELL* lpCurrent)
{
  CELL* lpResult;

  if (lpCurrent->nNext != NO_MORE_CELL)
    lpResult = &lpShM[lpCurrent->nNext].cell;
  else
    lpResult = NULL;
  return lpResult;
}

int ChildMain(int nShMId)
{
  CELL_BLOCK* lpShM;       /* Pointeur sur la mémoire partagée                */
  CELL* lpCurrent;         /* Pointeur sur la cellule courante                */
  int nVal;                /* Valeur de la cellule entrée par l'utilisateur   */

  lpShM = MapMemory(nShMId);

  printf("Je suis le processus fils pid=%d\n", getpid());

  InitMemory(lpShM);

  /* Initialisation de la racine comme première case */
  lpShM->bUsed = 1;
  lpShM->cell.nNext = NO_MORE_CELL;

  lpCurrent = &lpShM->cell;

  scanf("%d", &nVal);
  while (nVal != 0)
  {
    lpCurrent = InsertAfter(lpShM, lpCurrent, nVal);
    scanf("%d", &nVal);
  }

  UnMapMemory(lpShM);

  return 0;
}

int FatherMain(int nChildPid, int nShMId)
{
  CELL_BLOCK* lpShM;   /* Pointeur sur la mémoire partagée                    */
  CELL* lpCurrent;     /* Pointeur sur la cellule courante                    */
  int status;          /* Valeur de retour du processus fils                  */

  int result;

  result = 0;
  lpShM = MapMemory(nShMId);

  printf("Je suis le père pid=%d et j'ai créé un fils pid=%d\n",
         getpid(), nChildPid);

  /* Attente de la fin du fils */
  if (waitpid(nChildPid, &status, 0) != -1)
  {
    /* Vérification que le processus fils s'est terminé normalement */
    if (WIFEXITED(status) && (! WEXITSTATUS(status)))
    {
      printf("Fin normale du fils\n");
      lpCurrent = GetNext(lpShM, &lpShM->cell);
      while (lpCurrent != NULL)
      {
        printf("%d\n", lpCurrent->nVal);
        lpCurrent = GetNext(lpShM, lpCurrent);
      }
    }
    else
      printf("Fils terminé avec erreurs\n");
  }
  else
    result = PrintLastError();
 
  /* Demande de libérer la mémoire lors du dernier démappage */
  shmctl(nShMId, IPC_RMID, NULL);

  UnMapMemory(lpShM);

  return result;
}

int main(int argc, char **argv)
{
  int nPid;            /* Récupération du retour de fork                      */
  int nShMId;          /* Id de la mémoire partagée                            */
  int result;

  result = 0;

  /* Allocation de la racine */
  nShMId = shmget(SHM_KEY, sizeof(CELL_BLOCK) * MAX_LIST_SIZE,
                  IPC_CREAT | IPC_EXCL | 0666);
  if (nShMId == -1)
  {
    result = PrintLastError();
    goto the_end;
  }

  /* Création du fils */
  nPid = fork();
  if (nPid == -1)
    result = PrintLastError();
  else if (nPid == 0)
    result = ChildMain(nShMId);
  else
    result = FatherMain(nPid, nShMId);

the_end:
  return result;
}

samedi 27 décembre 2008 à 09:56:38 | Re : Problème : Liste en Memoire partagée

6miK

Un grand merci a toi. Ca m'aide bcp à comprendre et je pense pouvoir m'en sortir avec tout ca ! Encore merci et bonnes fêtes


Cette discussion est classée dans : int, liste, val, mem, sll


Répondre à ce message

Sujets en rapport avec ce message

conversion decimal en binaire sans connaitre la taille du nombre [ par kobee12 ] Est ce que quelqu'un pourrait m'aider. Voici un algo qui convertit un nombre biaire en decimal : bin_digits est defini avec une taille de 10. Or j'aim réception données d'un serveur [ par surfeurnet ] Voila j'ai crée un fonction qui se connecte à un serveur dont l'ip et le port sont précisés en argument, mais je ne reçoit pas ou je n'arrive pas à li Problem avec des pointeur mais je c'est pourquoi ! [ par WaFFel ] bha et bien jai fait un petit code qui sert a rien c'etais juste pour utiliser des pointeur mais jai un problem et ne ne sais pas pourquoi sa bogueCOD [C++]Problème de pointeur ou de liste chainee [ par Arkko ] Bonjour... J'essaye de convertir une liste chainée du site en une liste chainée demandant comme parametre un new par exemple ajouter(new Test);Cela f REcuperer des donnée d'un fichier binaire vers une tableau de hachage [ par whiteknight ] Slt j'ai des problemes avec ma fonction load qui me permet de recuperer les données d'un fichier binaire et de les transférer vers un tableau de hacha C++ switch [ par blastmanu ] Bonjour tt le monde!Et oui j'ai encore une question je voudrais savoir si il est possible de declarer une variable a l'interieur d'une boucle switchpa Passage par adresse d'un tableau de structures. [ par alekine ] Bonjour, j'ai un problème pour passer par adresse un tableau de structures. Voilà mon code:#include #define L_MAX 2struct point //la structure d'un p j'ai un probleme en c++ avec les liste chainé [ par walidos09 ] /*l'ennoncé de mon projet :on désire concevoir par l'approche objet, une application pour simulerle fonctionnement du noyau du systéme le fonctionneme URGENT : transposer du C en Caml [ par torgal79 ] Salut Voila mon probleme. On m'a filé un prog en c et j'y connais rien a ce langage. Et mon boulot est de le transposer en caml et c'est super urgent. [C] Pointeur int comme paramètre dans une function qui ne marche pas [ par nitrique ] Bonjour à tous,J'ai retourné les pointeurs dans tous les sens mais rien n'y fait.J'aimerais modifier la valeur d'une variable int à l'interieur d'une


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,980 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales